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官网:点击打开链接

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的服务端(接口和实现)
首先,提供服务接口

/*** 业务接口* * @author lp* */
public interface HelloService {/*** 业务方法* * @param name* @return*/public String sayHello(String name);
}

然后,提供服务接口的实现类

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对象

//使用 HessianProxyFactory 对接口创建代理 就可以了
HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
HelloService proxy = (HelloService) hessianProxyFactory.create(HelloService.class, "http://localhost:9090/hessianserver/hello");
System.out.println(proxy.sayHello("kitty!"));

06:【编写CRM提供CustomerService业务接口】

( CRM写的有点乱,也不完整,待完善) 说明:
1.使用ssh框架开发的

2.使用自动建表。hibernate.cfg.xml文件配置如下:

<hibernate-configuration> <!-- JDBC基本连接参数 --><session-factory> <!-- 理解为连接池 --><property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property><property name="hibernate.connection.username">bj0825</property><property name="hibernate.connection.password">bj0825</property><!-- 配置方言 --><property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 常见其它配置 --><property name="hibernate.show_sql">true</property> <!-- 控制台上打印SQL --><property name="hibernate.format_sql">true</property> <!-- 控制台输出时,对SQL语句格式化 --><!-- 测试环境 create/ create-drop 正式环境 update validate --><property name="hibernate.hbm2ddl.auto">update</property> <!-- 自动建表 --><property name="hibernate.connection.autocommit">true</property><!-- 使用c3p0连接池 -->
<!--         <property name="hibernate.connection.provider_class"> -->
<!--             org.hibernate.connection.C3P0ConnectionProvider -->
<!--         </property> --><!-- 在核心配置文件中 引用 mapping 映射文件 --><mapping class="cn.itcast.crm.domain.Customer"/> </session-factory>
</hibernate-configuration>

3. 使用注解方式开发,不用写.hbm文件

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做代理用(??????)

<dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.11.0.GA</version>
</dependency>

注意: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接口代理 客户端

<!-- 配置 Hessian 客户端 -->
<bean id="customerService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"><property name="serviceUrl" value="http://localhost:9090/mavencrm/customerService"/><property name="serviceInterface" value="cn.itcast.crm.service.CustomerService" />
</bean>

接下来,进行接口调试。

测试代码

@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相关推荐

  1. 【北邮国院大三下】Logistics and Supply Chain Management 物流与供应链管理 Week2

    北邮国院大三电商在读,随课程进行整理知识点.仅整理PPT中相对重要的知识点,内容驳杂并不做期末突击复习用.个人认为相对不重要的细小的知识点不列在其中.如有错误请指出.转载请注明出处,祝您学习愉快. 编 ...

  2. 【北邮国院大三下】Logistics and Supply Chain Management 物流与供应链管理 Week1

    北邮国院大三电商在读,随课程进行整理知识点.仅整理PPT中相对重要的知识点,内容驳杂并不做期末突击复习用.个人认为相对不重要的细小的知识点不列在其中.如有错误请指出.转载请注明出处,祝您学习愉快. 编 ...

  3. SAP WM Interview Questions

    1) What is Transfer Requirement?     An instruction to move materials from a source storage bin to a ...

  4. SAP PM设备主记录

    SAP PM设备主记录 设备被称为系统中独立维护的单个对象.设备可以安装在不同的功能位置.您可以根据技术系统的基于对象的结构在组织中创建单个设备. 功能位置上的设备的使用在一段时间内被记录.您始终为系 ...

  5. 计算机财务管理相关文献,财务管理外文参考文献(精选文献105个)

    任何事物总是与一定的环境相联系.存在和发展的 ,财务管理也不例外.不同时期.不同国家.不同领域的财务管理之所以有不同的特征 ,都是因为影响财务管理的环境因素不尽相同.企业在许多方面同生物体一样 ,如果 ...

  6. 三方博弈matlab_小星星的读研日记之电商动态博弈知多少?

    点击蓝字关注我们 大家好 大家好,我是小帅学长,20年成功上岸厦门大学物流工程与管理专业.我毕业于西南交通大学 物流工程专业. 在大学期间,为了提升对专业知识的运用,参加了不少竞赛和项目,例如srtp ...

  7. 物流是如何用计算机管理的,计算机信息管理在物流业的应用

    摘要:在信息化社会,基于计算机技术的信息化管理技术对于提高物流业的管理效率.增强其信息获取能力和发布能力均是非常重要的.在物流管理中,充分发挥计算机技术的优势能够让物流业具备提供低成本.高安全.高可靠 ...

  8. IOT_WIFI/LORA/THREAD/ZIGBEE/NFC/RFID/EnOcean

    文章目录 What is IoT? IoT Applications IoT Entities IoT Protocol layers Cellular IoT IoT Device and comp ...

  9. 烟草物流信息综合管理平台研究与应用——以H市卷烟厂烟草物流配送中心为例

    烟草物流信息综合管理平台研究与应用 --以H市卷烟厂烟草物流配送中心 摘 要 自我国正式加入世界贸易组织(WTO)以来,我国卷烟与外国卷烟之间对零售终端市场的竞争日益激烈,中国烟草目前正面临前所未有的 ...

  10. 深度学习决策支持 时空预测_重工业的预测性维护和决策支持系统

    深度学习决策支持 时空预测 Digital transformation is one of the top priorities for industrial companies. The larg ...

最新文章

  1. 解决javah生成c头文件时找不到android类库的问题
  2. 小猿圈python学习-注释
  3. Linux下修改Swap分区大小
  4. Abstract Factory抽象工厂模式
  5. 云计算机室局域网时通时断,为什么网上邻居时通时断?
  6. 同步电路出现异步清零可以吗_异步计数器 || 计数器的分类 ||异步二进制十进制|| 74290 8421 5421 || 数电...
  7. Java的Kafka:构建安全,可扩展的消息传递应用程序
  8. 前端学习(3196):虚拟dom和真实dom
  9. TestComplete自动化测试视频教程
  10. 游戏必要的清屏实现以及闪烁原因的详细解释
  11. 用Matlab筛选mirbase,一种基于miRBase数据库的植物有参的miRNA数据分析方法与流程...
  12. asp.net WebResource.axd请求报404错误
  13. msdn.itellyou.cn文件类型大小统计
  14. branch什么意思中文翻译_汽车ABS是个啥?它有什么作用?
  15. 《富爸爸,穷爸爸》这本书有何价值?
  16. PPT | 5G时代的视频云服务关键技术与实践
  17. Python的turtle模块画爱心箭(附源码)
  18. win10计算机休眠在哪里调,win10设置休眠时间怎么操作_win10如何更改电脑休眠时间...
  19. python 天气预报地图_实现地图天气预报的显示
  20. 全球与中国兽医计算机断层扫描 (CT) 扫描仪市场深度研究分析报告

热门文章

  1. 【在还原SQL Server数据库时发生对于服务器“XXX”操作系统错误】很实用的解决方案...
  2. 目录:SpringBoot学习目录
  3. python获取代码行号
  4. 条码扫描枪----针对MS3391扫码器的工作原理
  5. 201521123070 《JAVA程序设计》第2周学习总结
  6. jquery学习之重要知识点
  7. .NET 4.6的RyuJIT编译器中又发现两个严重的Bug
  8. Ollydbg 中断方法浅探
  9. 8086汇编学习笔记9-中断
  10. Javascript 强制类型转换函数