logistics-6-decidedZone management
2019独角兽企业重金招聘Python工程师标准>>>
业务:
1.decidedZone management_添加decidedZone
2.decidedZone management_定区数据分页多条件查询
3.decidedZone关联客户功能实现
技术点:
远程访问技术:webservice、hessian
decidedZone:并非实际存在,只是业务上存在。一个派送人员可以管理多个分区,这多个分区就组成一个定区。
客户会关联定区,为业务受理、自动分单功能服务。
05:【Hessian远程访问技术入门】
该物流系统需要与CRM系统进行通讯,所以要用到远程访问技术常用的远程访问技术:
█RMI
RMI是 Java 首选远程调用协议,非常高效稳定,特别是在数据结构复杂,数据量大的情况下,与其他通讯协议的差距尤为明显。但不能跨语言。
█HttpInvoker
HttpInvoker使用 java 的序列化技术传输对象,与 RMI 在本质上是一致的。从效率上看,两者也相差无几, HttpInvoker 与 RMI 的传输时间基本持平。
█Hessian
Hessian在传输少量对象时,比RMI 还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较 RMI 要慢 20% 左右。但这只是在数据量特别大,数据结构很复杂的情况下才能体现出来,中等或少量数据时,Hessian并不比RMI慢。 Hessian 的好处是精简高效,可以跨语言使用,而且协议规范公开。
█Burlap
采用 xml 格式传输。仅在传输 1 条数据时速度尚可,通常情况下,它的耗时是 RMI 的 3 倍。
█ Web Service
效率低下是众所周知的,平均来看, Web Service 的通讯耗时是 RMI 的 10 倍。
webService参考博客:点击打开链接
通讯效率测试结果:
RMI > Httpinvoker >= Hessian >> Burlap >> Web service
这里使用Hessian实现。
理由:1.可以跨平台
2.效率比WebService高很多
hessian官网:点击打开链接
1.导入hessian.jar包
2.新建Dynamic web project工程
注意:一定要指定target runtime,如果不指定会没有servlet API支持。
2.5-----javaEE5(Apache Tomcat v6.0)
3.0-----javaEE6(Apache Tomcat v7.0)
3.编写hessian的服务端(接口和实现)
首先,提供服务接口
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "hello," + name;} } 最后,将接口发布为Hessian web 服务
<servlet><servlet-name>hello</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class><init-param><!-- Hessian服务 实现类 --><param-name>home-class</param-name><param-value>cn.itcast.service.impl.HelloServiceImpl</param-value></init-param><init-param><!-- Hessian 服务业务接口 --><param-name>home-api</param-name><param-value>cn.itcast.service.HelloService</param-value></init-param></servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping>
通过浏览器即可访问是否发布成功
4.编写hessian客户端
Hessian 客户端如果是相同语言开发,最简单方式,直接将服务器接口复制到客户端 。
如果不是相同语言, 客户端获得一个Map对象
06:【编写CRM提供CustomerService业务接口】
( CRM写的有点乱,也不完整,待完善) 说明:1.使用ssh框架开发的
2.使用自动建表。hibernate.cfg.xml文件配置如下:
4.封装了sessionFactoryUtils工具类,直接运行其中的main方法就进行建表了。
public class HibernateUtils {private static Configuration configuration;private static SessionFactory sessionFactory;static {configuration = new Configuration().configure();sessionFactory = configuration.buildSessionFactory();}public static Session openSession() {return sessionFactory.openSession();}public static void main(String[] args) {openSession();} }
CRM系统的实现
这里假设远程的CRM系统使用ssh实现。
CRM导入了一个javassist包:用来给hibernate做代理用(??????)
注意:schema和catalog的含义。
calatog表示的是数据库,针对mysql(mysql的表在数据库下),schema的是名称空间,针对oracle(oracle的表在命名空间下)。
参考:oracle的表空间概念
如果在这里不指定schema,则会在默认空间建表,会报如下的错误提示。
所以应该指定schema。
假设CRM系统的功能已经都实现。
现在要做的仅仅是提供供外部访问的接口。( 疑问:具体开发中到底是开发过程中就已经将接口提供好,还是最后再单独考虑接口问题?)
具体的步骤:
1.提供接口 在CRM系统中,提供一个service接口。
public class CustomerServiceImpl implements CustomerService {public List<Customer> findNoAssociationCustomers() {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();List<Customer> list = session.createQuery("from Customer where decidedZoneId is null").list();transaction.commit();session.close();return list;}public List<Customer> findHasAssociationCustomers(String decidedZoneId) {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();List<Customer> list = session.createQuery("from Customer where decidedZoneId = ?").setParameter(0, decidedZoneId).list();transaction.commit();session.close();return list;}public void assignCustomersToDecidedZone(String[] customerIds, String decidedZoneId) {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();if (customerIds != null) {for (String id : customerIds) {Customer customer = (Customer) session.get(Customer.class, id);customer.setDecidedZoneId(decidedZoneId);}}transaction.commit();session.close();} } 2.提供接口的实现类。
public class CustomerServiceImpl implements CustomerService {public List<Customer> findNoAssociationCustomers() {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();List<Customer> list = session.createQuery("from Customer where decidedZoneId is null").list();transaction.commit();session.close();return list;}public List<Customer> findHasAssociationCustomers(String decidedZoneId) {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();List<Customer> list = session.createQuery("from Customer where decidedZoneId = ?").setParameter(0, decidedZoneId).list();transaction.commit();session.close();return list;}public void assignCustomersToDecidedZone(String[] customerIds, String decidedZoneId) {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();if (customerIds != null) {for (String id : customerIds) {Customer customer = (Customer) session.get(Customer.class, id);customer.setDecidedZoneId(decidedZoneId);}}transaction.commit();session.close();} } 3.发布为hessian 服务。
在web.xml中配置servlet,发布服务。
<servlet><servlet-name>customerService</servlet-name><servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class><init-param><!-- Hessian服务 实现类 --><param-name>home-class</param-name><param-value>cn.itcast.crm.service.impl.CustomerServiceImpl</param-value></init-param><init-param><!-- Hessian 服务业务接口 --><param-name>home-api</param-name><param-value>cn.itcast.crm.service.CustomerService</param-value></init-param></servlet><servlet-mapping><servlet-name>customerService</servlet-name><url-pattern>/customerService</url-pattern></servlet-mapping>这样,我们就已经发布好了。接下来就可以运行CRM系统了。
我们同样使用maven的tomcat插件来启动。
使用命令:tomcat:run
注意:CRM和物流系统都使用tomcat:run启动,是否会端口冲突呢?
当然不会,因为我们配置的CRM启动使用的是9090端口。而物流系统使用的是tomcat的80端口。
最后,测试一下服务是否发布成功。
07:【编写BOS客户端基于junit远程接口调试】
对方写一个接口,我们写客户端调用时,先不写测试程序将系统调通,再进行开发,这样避免直接使用时出现问题。注意: 接口基于Hessian 传输对象,必须实现Serializable 接口,以实现网络传输。
测试之前先检测一下是否遗忘了这一点。
最简单的做法就是直接将服务接口拷贝到客户端。
除了拷贝CustomerService,还要拷贝它所依赖的Customer实体类。( 注意:这里并没有拷贝服务实现类)
同时拷贝以上两个,才能保持一致,不一致的话,会将对象解析为一个map( ?不太懂?)
然后,在客户端可以使用 HessianProxyFactory 对接口创建代理。(见官网:点击打开链接)
当然我们通常会 使用spring整合hessian。
参考spring的specification(part IV:integration部分,chapter 17)
参考本地文档:spring jar包的docs文件夹下的pdf
参考在线文档:
见官网: 点击打开链接
applicationContext.xml 配置hessian接口代理 客户端
接下来,进行接口调试。
测试代码
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class CustomerServiceTest {@Autowiredprivate CustomerService customerService;@Testpublic void testFindNoAssociationCustomers() {List<Customer> customers = customerService.findNoAssociationCustomers();System.out.println(customers);}@Testpublic void testFindHasAssociationCustomers() {List<Customer> customers = customerService.findHasAssociationCustomers("DQ001");System.out.println(customers);}@Testpublic void testAssignCustomersToDecidedZone() {customerService.assignCustomersToDecidedZone(new String[] { "1" }, "DQ002");} }测试结果
1.测试 testFindNoAssociationCustomers()
在数据库中手动插入几条模拟数据
控制台打印结果:
[Customer [id=2, name=李四, telephone=23456, address=北京朝阳, decidedZoneId=null]]
说明测试通过
2.测试testFindHasAssociationCustomers()
插入一条有定区的模拟数据(即定区已经关联了客户)
控制台打印结果:
[Customer [id=3, name=王五, telephone=55555, address=上海浦东, decidedZoneId=DQ001]]
说明测试通过。
3.测试testAssignCustomersToDecidedZone()
测试的是:对未关联定区的张三用户进行关联定区DQ002.
测试结果:关联成功
说明测试通过。
以上三个方法都测试成功,说明接口已经调试通过。
接下来就可以实现物流系统的定区关联客户功能了。
08:【定区关联客户功能实现】
关联客户按钮响应事件 选中第一行数据,点击关联客户,则出现关联客户窗口
左侧列表显示未关联客户列表,右侧列表显示已关联选中定区客户列表
从图中可以看到定区DQ001已与客户王五关联,而位于李四关联。
当然这些列表数据是在点击最上面的关联客户列表后,进行查询数据库后显示出来的。
点击响应事件代码:
function doAssociations(){// 获得选中数据行 var row = $('#grid').datagrid('getSelected');if(row == null){// 没有选中$.messager.alert('警告','关联客户前,必须选中一条定区数据 ','warning');return}$('#noassociationSelect').html('');$('#associationSelect').html('');// 加载 窗口中两个select 列表数据// 查询未关联$.post("${pageContext.request.contextPath}/decidedzone_findnoassociationCustomers.do" , function(data){$(data).each(function(){var option = $("<option value='"+this.id+"'>"+this.name+"("+this.address+")</option>");$('#noassociationSelect').append(option);});});// 查询已经关联$.post("${pageContext.request.contextPath}/decidedzone_findhasassociationCustomers.do" , {id: row.id},function(data){$(data).each(function(){var option = $("<option value='"+this.id+"'>"+this.name+"("+this.address+")</option>");$('#associationSelect').append(option);});});$('#customerWindow').window('open'); }
列表左右移动功能实现
// 左右移动 $('#toRight').click(function(){$('#associationSelect').append($('#noassociationSelect option:selected')); }); $('#toLeft').click(function(){$('#noassociationSelect').append($('#associationSelect option:selected')); });
关联客户
现在我们想把李四也与定区DQ001进行关联。
选中李四,然后将其添加到右侧的已关联列表中。点击关联客户按钮(下方)后,提交表单,通过在数据库将李四与定区DQ001关联。
数据库中结果:
显然,关联成功了。定区与客户关联的功能也就实现了。
转载于:https://my.oschina.net/javandroid/blog/878208
总结
以上是生活随笔为你收集整理的logistics-6-decidedZone management的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: css撑起父元素清除浮动的问题
- 下一篇: Qtopia-2.2.0 的配置和交叉编