文档章节

logistics-6-decidedZone management

静水楼台
 静水楼台
发布于 2017/04/13 12:40
字数 2564
阅读 3
收藏 0

业务:
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 格式传输。仅在传输 条数据时速度尚可,通常情况下,它的耗时是 RMI 的 倍。

█ 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 {
	@Override
	public 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 {

	@Autowired
	private CustomerService customerService;

	@Test
	public void testFindNoAssociationCustomers() {
		List<Customer> customers = customerService.findNoAssociationCustomers();
		System.out.println(customers);
	}

	@Test
	public void testFindHasAssociationCustomers() {
		List<Customer> customers = customerService.findHasAssociationCustomers("DQ001");
		System.out.println(customers);
	}

	@Test
	public 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关联。

数据库中结果:

显然,关联成功了。定区与客户关联的功能也就实现了。


本文转载自:http://blog.csdn.net/javandroid/article/details/18660473

静水楼台
粉丝 0
博文 85
码字总数 2334
作品 0
杭州
程序员
私信 提问
OR/MS 领域期刊排名(2014)

OR MS Journal Ranking by SJR 1. Journal of Operations Management 2. Management Science 3. Omega 4. Operations Research 5. Transportation Research, Series B: Methodological 6. Co......

阿睦瓦
2015/02/21
438
0
给ecshop后台增加管理功能页面_无需整理

给ecshop后台增加管理功能页面 比如我们增加一个统计报表叫做 物流费用统计报表 放在后台“报表统计”栏目中 具体操作步骤: 第一步,我们要添加一个菜单到后台,然后设置语言项,最后设置权...

辣条拌鱼翅
2015/01/01
22
0
Windows Vb.net In The Logistics And Transportation

Windows Vb.net In The Logistics And Transportation Freewind @ Thoughtworks2016-09-0966 阅读 windowsvb Windows Visual Basic application development builds robust GUI application......

Freewind @ Thoughtworks
2016/09/09
0
0
2017中国供应链创新国际峰会

2017中国供应链创新国际峰会 “2017中国供应链创新国际峰会”将于2017年10月19日至20日于上海龙之梦酒店举行。本次会议由上海希为投资管理有限公司主办。 数字化供应链通过基本信息,使高质量...

ECV-International
2017/09/11
0
0
2017中国供应链创新国际峰会

2017中国供应链创新国际峰会 “2017中国供应链创新国际峰会”将于2017年10月19日至20日于上海龙之梦酒店举行。本次会议由上海希为投资管理有限公司主办。 数字化供应链通过基本信息,使高质量...

ECV-International
2017/09/11
7
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部