[TOC]
现在我们的bos中需要使用到crm的客户数据,需要调用crm的数据,下面我们就需要配置。
<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>
使用wsimport命令解析wsdl文件生成本地代码,只需要接口文件和实体类。导入到 bos-utils中
<!-- 注册crm客户端代理对象 -->
<jaxws:client id="crmClient"
serviceClass="com.qwm.bos.utils.ICustomerService"
address="http://localhost:8081/crm/service/customer"/>
需要在定区操作中,使用到这个服务,所以定义在 DecidedzoneAction中
@Controller
@Scope("prototype")
public class DecidedzoneAction extends BaseAction<Decidedzone>{
//注入crm代理对象
@Autowired
private ICustomerService proxy;
...........
}
页面:WEB-INF/pages/base/decidedzone.jsp
关联窗口如下
左边的代表不管理,右边代表管理,可以通过中间的箭头切换。
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>");
}
});
}
//注入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;
}
<script type="text/javascript">
$(function(){
//为左右移动添加点击事件
$("#toRight").click(function(){
$("#associationSelect").append($("#noassociationSelect option:selected"));
});
$("#toLeft").click(function(){
$("#noassociationSelect").append($("#associationSelect option:selected"));
});
});
</script>
这里面主要注意的是,我们只提交右侧的选中项,不提交左侧的选中项,因此在右侧的下拉框中右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();
});
提交的数据的图示
处理的是右侧提交上来的数据,那么存在这样一个问题:
提交的客户,可能已经绑定过了,也有可能没有绑定过,怎么处理了绑定过的?
这里我们处理的方式就是:执行两个更新语句,
第一个把指定的定区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中。
下载最新的 crm 中的webservice的客户端代码,导入到项目中,这里面客户的id使用属性驱动
如下
/**
* 调用远程crm服务,将客户管理到分区
* @return
*/
public String assigncustomerstodecidedzone(){
proxy.assigncustomerstodecidedzone(model.getId(),customerIds);
return LIST;
}