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官网:点击打开链接
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相关推荐
- 【北邮国院大三下】Logistics and Supply Chain Management 物流与供应链管理 Week2
北邮国院大三电商在读,随课程进行整理知识点.仅整理PPT中相对重要的知识点,内容驳杂并不做期末突击复习用.个人认为相对不重要的细小的知识点不列在其中.如有错误请指出.转载请注明出处,祝您学习愉快. 编 ...
- 【北邮国院大三下】Logistics and Supply Chain Management 物流与供应链管理 Week1
北邮国院大三电商在读,随课程进行整理知识点.仅整理PPT中相对重要的知识点,内容驳杂并不做期末突击复习用.个人认为相对不重要的细小的知识点不列在其中.如有错误请指出.转载请注明出处,祝您学习愉快. 编 ...
- SAP WM Interview Questions
1) What is Transfer Requirement? An instruction to move materials from a source storage bin to a ...
- SAP PM设备主记录
SAP PM设备主记录 设备被称为系统中独立维护的单个对象.设备可以安装在不同的功能位置.您可以根据技术系统的基于对象的结构在组织中创建单个设备. 功能位置上的设备的使用在一段时间内被记录.您始终为系 ...
- 计算机财务管理相关文献,财务管理外文参考文献(精选文献105个)
任何事物总是与一定的环境相联系.存在和发展的 ,财务管理也不例外.不同时期.不同国家.不同领域的财务管理之所以有不同的特征 ,都是因为影响财务管理的环境因素不尽相同.企业在许多方面同生物体一样 ,如果 ...
- 三方博弈matlab_小星星的读研日记之电商动态博弈知多少?
点击蓝字关注我们 大家好 大家好,我是小帅学长,20年成功上岸厦门大学物流工程与管理专业.我毕业于西南交通大学 物流工程专业. 在大学期间,为了提升对专业知识的运用,参加了不少竞赛和项目,例如srtp ...
- 物流是如何用计算机管理的,计算机信息管理在物流业的应用
摘要:在信息化社会,基于计算机技术的信息化管理技术对于提高物流业的管理效率.增强其信息获取能力和发布能力均是非常重要的.在物流管理中,充分发挥计算机技术的优势能够让物流业具备提供低成本.高安全.高可靠 ...
- IOT_WIFI/LORA/THREAD/ZIGBEE/NFC/RFID/EnOcean
文章目录 What is IoT? IoT Applications IoT Entities IoT Protocol layers Cellular IoT IoT Device and comp ...
- 烟草物流信息综合管理平台研究与应用——以H市卷烟厂烟草物流配送中心为例
烟草物流信息综合管理平台研究与应用 --以H市卷烟厂烟草物流配送中心 摘 要 自我国正式加入世界贸易组织(WTO)以来,我国卷烟与外国卷烟之间对零售终端市场的竞争日益激烈,中国烟草目前正面临前所未有的 ...
- 深度学习决策支持 时空预测_重工业的预测性维护和决策支持系统
深度学习决策支持 时空预测 Digital transformation is one of the top priorities for industrial companies. The larg ...
最新文章
- 解决javah生成c头文件时找不到android类库的问题
- 小猿圈python学习-注释
- Linux下修改Swap分区大小
- Abstract Factory抽象工厂模式
- 云计算机室局域网时通时断,为什么网上邻居时通时断?
- 同步电路出现异步清零可以吗_异步计数器 || 计数器的分类 ||异步二进制十进制|| 74290 8421 5421 || 数电...
- Java的Kafka:构建安全,可扩展的消息传递应用程序
- 前端学习(3196):虚拟dom和真实dom
- TestComplete自动化测试视频教程
- 游戏必要的清屏实现以及闪烁原因的详细解释
- 用Matlab筛选mirbase,一种基于miRBase数据库的植物有参的miRNA数据分析方法与流程...
- asp.net WebResource.axd请求报404错误
- msdn.itellyou.cn文件类型大小统计
- branch什么意思中文翻译_汽车ABS是个啥?它有什么作用?
- 《富爸爸,穷爸爸》这本书有何价值?
- PPT | 5G时代的视频云服务关键技术与实践
- Python的turtle模块画爱心箭(附源码)
- win10计算机休眠在哪里调,win10设置休眠时间怎么操作_win10如何更改电脑休眠时间...
- python 天气预报地图_实现地图天气预报的显示
- 全球与中国兽医计算机断层扫描 (CT) 扫描仪市场深度研究分析报告