Skip to content

Latest commit

 

History

History
283 lines (200 loc) · 7.45 KB

35.md

File metadata and controls

283 lines (200 loc) · 7.45 KB

[TOC]

BOS物流项目35———定区数据3_定区关联客户

一、在BOS项目中配置代理对象远程调用crm

现在我们的bos中需要使用到crm的客户数据,需要调用crm的数据,下面我们就需要配置。

1.1 在bos项目的pom.xml中引入cxf的依赖

		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>3.0.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>3.0.1</version>
		</dependency>

1.2 使用wsimport命令解析wsdl文件生成本地代码,只需要接口文件和实体类

使用wsimport命令解析wsdl文件生成本地代码,只需要接口文件和实体类。导入到 bos-utils中

1.3 在spring配置文件中注册crm客户端代理对象

    <!-- 注册crm客户端代理对象 -->
    <jaxws:client id="crmClient"
                  serviceClass="com.qwm.bos.utils.ICustomerService"
                  address="http://localhost:8081/crm/service/customer"/>

1.4 通过注解方式将代理对象注入给Action

需要在定区操作中,使用到这个服务,所以定义在 DecidedzoneAction中

@Controller
@Scope("prototype")
public class DecidedzoneAction extends BaseAction<Decidedzone>{
    
    //注入crm代理对象
    @Autowired
    private ICustomerService proxy;
    ...........
}        

二、调整定区关联客户页面

页面:WEB-INF/pages/base/decidedzone.jsp

关联窗口如下

左边的代表不管理,右边代表管理,可以通过中间的箭头切换。

2.1 修改定区页面中关联客户按钮绑定事件处理函数

	function doAssociations(){
		//获取当前数据表格所有选中的行,返回数组
		var rows = $("#grid").datagrid("getSelections");
		//判断如果只选中了一行,那么我们可以操作,如果选中了多行,提示只能选择一个区
		if(1!=rows.length){
			//弹出提示
			$.messager.alert("提示信息","请选择一个定区操作!","warning");
			return;
		}
		$('#customerWindow').window('open');
		//清空下拉项
		$("#noassociationSelect").empty();
		$("#associationSelect").empty();
		//发送ajax请求,请求定区Action,在定区Action中通过crm代理对象完成对于crm服务远程调用获取客户数据
		var url_1 = "decidedzoneAction_findListNotAssociation.action";
		$.post(url_1,function(data){
			//遍历json数组,把数据显示出来
			for(var i=0; i<data.length ; i++){
				console.info(data[i]);
//				var id = data[i].id;
				var name = data[i].name;
				var telephone = data[i].telephone;
				name = name + "(" + telephone + ")";
				//添加到未关联的下拉框中
				$("#noassociationSelect").append("<option>"+name+"</option>");
			}
		});

		//发送ajax请求,请求定区Action,在定区Action中通过crm代理对象完成对于crm服务远程调用获取客户数据
		var url_2 = "decidedzoneAction_findListHasAssociation.action";
		var decidedzoneId = rows[0].id;
		$.post(url_2,{"id":decidedzoneId},function(data){
			//遍历json数组,把数据显示出来
			for(var i=0; i<data.length ; i++){
				var id = data[i].id;
				var name = data[i].name;
				var telephone = data[i].telephone;
				name = name + "(" + telephone + ")";
				//添加到未关联的下拉框中
				$("#associationSelect").append("<option value='"+id+"'>"+name+"</option>");
			}
		});
	}

2.2 在定区Action中注入crm代理对象,并且提供方法远程调用crm服务

    //注入crm代理对象
    @Autowired
    private ICustomerService proxy;
    
        /**
     * 调用远程crm服务,获取未关联到定区的客户
     * @return
     */
    public String findListNotAssociation(){
        List<Customer> list = proxy.findListNotAssociation();
        java2Json(list,new String[]{});
        return NONE;
    }

    /**
     * 调用远程crm服务,获取已经关联到定区的客户
     * @return
     */
    public String findListHasAssociation(){
        String id = model.getId();
        List<Customer> list = proxy.findListHasAssociation(id);
        java2Json(list,new String[]{});
        return NONE;
    }

2.3 为关联客户窗口中左右移动两个按钮绑定事件

<script type="text/javascript">

	$(function(){
		//为左右移动添加点击事件
		$("#toRight").click(function(){
			$("#associationSelect").append($("#noassociationSelect option:selected"));
		});
		$("#toLeft").click(function(){
			$("#noassociationSelect").append($("#associationSelect option:selected"));
		});
	});
</script>	

2.4 为定区关联客户窗口中的“关联客户”按钮绑定事件

这里面主要注意的是,我们只提交右侧的选中项,不提交左侧的选中项,因此在右侧的下拉框中右name属性,而左侧是没有的。

其次,提交到后台的数据,需要用到定区的id,这样在这个方法中,需要把id添加到隐藏域中

		//为 关联客户 按钮绑定事件
		$("#associationBtn").click(function(){
			var rows = $("grid").datagrid("getSelections");
			var id = rows[0].id;
			//为隐藏域赋值,存放id
			$("input[name=id]").val(id);
			//提交的是右侧的下拉框中的选中项,我们需要提交所有项,这里需要右侧都为选中
			$("#associationSelect option").attr("selected","selected");
			//提交
			$("#customerForm").submit();
		});

提交的数据的图示


三、服务端处理

3.1 在crm服务端扩展定区关联客户方法

处理的是右侧提交上来的数据,那么存在这样一个问题:

提交的客户,可能已经绑定过了,也有可能没有绑定过,怎么处理了绑定过的?

这里我们处理的方式就是:执行两个更新语句,

第一个把指定的定区id设置为null

update t_customer set decidedzone_id = null where decidedzone_id = ?

第二个根据用户id设置定区id

update t_customer set decidedzone_id = ? where id = ?

所以我们需要添加的方法如下

    /**
     * 定区关联客户
     * @param decidedzoneid
     * @param customerIds
     */
    public void assigncustomerstodecidedzone(String decidedzoneid,List<Integer> customerIds){
        String sql = "update t_customer set decidedzone_id = null where decidedzone_id = ?";
        jdbcTemplate.update(sql,decidedzoneid);
        //判断,如果集合为空或者个个数为0,不进行操作
        if(customerIds==null || customerIds.size()<=0)
            return;
        //为用户设置定区
        sql = "update t_customer set decidedzone_id = ? where id = ?";
        for (Integer id : customerIds) {
            jdbcTemplate.update(sql,decidedzoneid,id);
        }
    }

写完上面的代码以后,重新发布服务,下载新的客户端代码到bos中。

3.2 在定区Action中提供关联客户方法

下载最新的 crm 中的webservice的客户端代码,导入到项目中,这里面客户的id使用属性驱动

如下

    /**
     * 调用远程crm服务,将客户管理到分区
     * @return
     */
    public String assigncustomerstodecidedzone(){
        proxy.assigncustomerstodecidedzone(model.getId(),customerIds);
        return LIST;
    }

3.3 测试


四、源码下载

https://github.com/wimingxxx/bos-parent