029 定区关联客户功能 - bos

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

1.使用命令wsimport命令解析wsdl文件生成本地源代码

wsimport -s . -p com.hao.crm.service http://localhost:8080/CRM/service/customer?wsdl

2.复制CustomerService和Customer类对象啊到bos项目中

3.引入cxf的依赖(已经在porm.xml中引过)

4.在Spring配置文件中注册crm客户端的代理对象

<!-- 注册CRM客户端代理对象 -->
<jaxws:client id="customerService" serviceClass="com.hao.crm.service.CustomerService"
address="http://localhost:8080/CRM/service/customer?wsdl"></jaxws:client>

6.在UserAction中注入代理对象,添加断点测试CustomerService是否注入成功(可以在login方法中),最后删除刚刚添加的代码

二、完善crm的Service

1.在CRM的CustomerService接口中扩展查询未关联定区的客户和查询已关联定区的客户的方法

@WebService
public interface CustomerService {

/**
* 查询所有客户
* @return
*/
List<Customer> list();

/**
* 查询未关联定区的客户
* @return
*/
List<Customer> listNotAssociation();

/**
* 查询已关联定区的客户
* @param decidedzoneId 定区id
* @return
*/
List<Customer> listHasAssociation(String decidedzoneId);
}

2.在CustomerServiceImpl中实现扩展的方法,并使用静态内部类重构CustomerServiceImpl

@Transactional(isolation=Isolation.REPEATABLE_READ, readOnly=false)
public class CustomerServiceImpl implements CustomerService{

@Override
public List<Customer> list() {
String sql = "select * from t_customer";
List<Customer> customerList = jdbcTemplate.query(sql, new CustomerRowMapper());
return customerList;
}

@Override
public List<Customer> listNotAssociation() {
String sql = "select * from t_customer where decidedzone_id is null";
List<Customer> customerList = jdbcTemplate.query(sql, new CustomerRowMapper());
return customerList;
}

@Override
public List<Customer> listHasAssociation(String decidedzoneId) {
String sql = "select * from t_customer where decidedzone_id =?";
List<Customer> customerList = jdbcTemplate.query(sql, new CustomerRowMapper(), decidedzoneId);
return customerList;
}

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

private static class CustomerRowMapper implements RowMapper<Customer>{

@Override
public Customer mapRow(ResultSet rs, int arg1) throws SQLException {
//根据字段名称从结果集中获取对应的值
int id = rs.getInt("id");
String name = rs.getString("name");
String station = rs.getString("station");
String telephone = rs.getString("telephone");
String address = rs.getString("address");
String decidedzoneId = rs.getString("decidedzone_id");
Customer c = new Customer(id, name, station, telephone, address, decidedzoneId);
return c;
}
}
}

3.注意服务端代码更改后,客户端要重新获取新的服务类

三、调整定区关联客户的页面以及数据的查询

1.必须且只选择一个定区时,点击关联客才有效

2.为DecidedzoneAction注入CustomerService代理对象

//注入代理的CustomerService
@Autowired
private CustomerService customerServiceProxy;

3.编写Decidedzone.listNotAssociation和listHasAssociation方法

/**
* 调用远程服务crm查询未关联定区的用户
* @return
*/
public String listNotAssociation(){
//调用代理对象执行请求获取客户数据
List<Customer> customerList = customerServiceProxy.listNotAssociation();
list2JsonAndWriteResponse(customerList);
return NONE;
}

/**
* 调用远程服务crm查询已关联定区的用户
* @return
*/
public String listHasAssociation(){
String id = model.getId();
List<Customer> customerList = customerServiceProxy.listHasAssociation(id);
list2JsonAndWriteResponse(customerList);
return NONE;
}

4.注意这个时候我把BaseAction中的list2JsonAndWriteResponse和objec2JsonAndWriteResponse的第二个参数类型改成了可变参数类型,这样更加灵活

5.在页面响应函数中填充数据,最终关联客户按钮的响应函数实现如下:

function doAssociations(){
//获取当前数据表格所有选中的行,返回数组
var rows = $("#grid").datagrid("getSelections");
if(rows.length != 1){
//弹出提示
$.messager.alert("提示信息", "请选择一个定区进行操作", "warning");
}else{
//清理数据
$("#noassociationSelect").empty();
$("#associationSelect").empty();
//选中了一个定区,可以弹出窗口
$(‘#customerWindow‘).window(‘open‘);
//发送ajax请求请求定区管理的Action,在定区Action中通过crm代理对象完成对于crm服务远程调用
var url_1 = "decidedzoneAction_listNotAssociation.action";
$.ajax({
"url":url_1,
"dataType":"json",
"type":"get",
"success":function(respData, textStatus, xmlHttp){
//遍历json数组
for(var i = 0; i < respData.length; ++i){
var id = respData[i].id;
var name = respData[i].name;
var telephone = respData[i].telephone;
name = name+"("+telephone+")";
$("#noassociationSelect").append("<option value=‘"+id+"‘>"+name+"</option>");
}
},
"error":function(xmlHttp, textStatus, exception){
alert(textStatus);
}
});

var decidedzoneId = rows[0].id;
//发送ajax请求请求定区管理的Action,在定区Action中通过crm代理对象完成对于crm服务远程调用
var url_2 = "decidedzoneAction_listHasAssociation.action";
$.ajax({
"url":url_2,
"data":{"id":decidedzoneId},
"dataType":"json",
"type":"get",
"success":function(respData, textStatus, xmlHttp){
//遍历json数组
for(var i = 0; i < respData.length; ++i){
var id = respData[i].id;
var name = respData[i].name;
var telephone = respData[i].telephone;
name = name+"("+telephone+")";
$("#associationSelect").append("<option value=‘"+id+"‘>"+name+"</option>");
}
},
"error":function(xmlHttp, textStatus, exception){
alert(textStatus);
}
});
}
}

6.为左右移动按钮添加响应函数

$(function(){
$("#toRight").click(function(){
$("#associationSelect").append($("#noassociationSelect option:selected"));
});
$("#toLeft").click(function(){
$("#noassociationSelect").append($("#associationSelect option:selected"));
});
});

7.为关联客户的提交按钮绑定事件,提交关联客户请求

$(function(){
//为关联客户按钮绑定事件
$("#associationBtn").click(function(){
//为隐藏域(存放定区id)赋值
var rows = $("#grid").datagrid("getSelections");
var id = rows[0].id;
$("input[name=id]").val(id);

//选中右侧的所有表单项
$("#associationSelect option").prop("selected", "selected");
console.log($("#customerForm").serialize());
$("#customerForm").submit();
});
});

四、定区关联客户的服务端实现

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

/**
* 定区关联客户
* @param decidedzoneId
* @param customerIds
*/
void assigncustomerstodecidedzone(String decidedzoneId, Integer[] customerIds);

2.扩展方法的实现

@Override
public void assigncustomerstodecidedzone(String decidedzoneId,
Integer[] customerIds) {
//清空该定区的所有关联
String sql = "update t_customer set decidedzone_id = null where decidedzone_id = ?";
jdbcTemplate.update(sql, decidedzoneId);
//客户重新关联定区

if(customerIds != null && customerIds.length > 0){
StringBuilder sb = new StringBuilder("update t_customer set decidedzone_id = ? where id in(");
for (Integer id : customerIds) {
sb.append(id).append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
jdbcTemplate.update(sb.toString(), decidedzoneId);
}
}

3.重新生成客户端调用代码,复制新的类到bos项目

4.编写DecidedzoneAction.assigncustomerstodecidedzone

/**
* 远程调用CRM服务,将客户关联到定区
* @return
*/
public String assigncustomerstodecidedzone(){
customerServiceProxy.assigncustomerstodecidedzone(model.getId(), customerIds);
return NONE;
}

时间: 2024-08-03 03:17:25

029 定区关联客户功能 - bos的相关文章

框架 day51 BOS项目练习(定区添加及查询,Hessian入门,基于hessian实现定区关联客户功能)

BOS项目笔记第5天 1.    定区添加功能 什么是定区?定区将客户信息.取派员.分区信息关联到一起,为自动分单提供数据. 1.1   在下拉框中展示取派员数据 第一步:修改combobox的url地址,访问StaffAction的listajax方法,查询取派员数据 第二步:在StaffAction中提供方法 /** * ajax查询未作废的员工 * @return */ public String findByWorking(){ List<Staff> list=staffServic

BOS中定区关联客户

1. 首先发布crm服务 第一步:创建动态的web项目crm,导入hessian的jar 第二步:创建一个crm数据库和t_customer表 第三步:在crm项目的web.xml中配置spring的DispatcherServlet <servlet> <servlet-name>remoting</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet&

项目一:第七天 CRM 和bos系统实现定区关联客户,关联快递员. 通过CXF框架实现

定区关联客户 需求:为了快递方便客户下订单(发快递),派快递员上门取件.  所以说需要让定区关联客户(知道客户属于哪个定区),定区跟快递员关系:多对多.知道让哪个快递员上门取件. 将CRM系统中,客户表中逻辑外键c_fixed_area_id 设置为定区ID 实现步骤: 第一步:在服务端CRM系统扩展方法(CXF服务端) ***注意服务端扩展新增方法后需要自测 第二步:在客户端BOS中调用CRM中查询客户方法-展示客户记录 ***判断选中定区记录数 ***发送ajax请求获取客户记录 ***将返

定区关联快递员 定区关联收派时间

定区关联客户 准备工作 配置applicationContext.xml 服务端 <Bean 配置service接口> <jaxws:server id="不重复" address="/customer"> 引入Bean 1.在CRM系统查询所有客户  通过黑窗口 发布服务生成代码. 2.在bos系统配置导入生成的接口.java文件 配置applicationContext.xml 客户端. <jaxws:client id  serv

bos 第5天(定区的添加、定区的分页查询、hessian远程调用实现获取客户信息)

BOS项目笔记 第5天 今天内容安排: 1.添加定区功能 2.定区分页查询 3.hessian入门----远程调用技术 4.基于hessian实现定区关联客户 1. 添加定区 定区可以将取派员.分区.客户信息关联到一起. 页面:WEB-INF/pages/base/decidedzone.jsp 第一步:使用下拉框展示取派员数据,修改combobox的URL地址,发送请求 第二步:在StaffAction中提供listajax方法,查询没有作废的取派员,返回json数据 第三步:在StaffSe

业务受理需求 客户下单 根据前台页面所选的省市区 关联定区去生成订单

1 业务受理需求 注要:通过客户提交信息自动找到快递员上门取件.   1.客户通过打电话,网络(前台系统)提交物流委托信息(寄件人地址,电话)到后台管理系统,后台管理系统会将客户物流委托信息保存到数据库中,这个物流委托信息称为:订单 Order   2.后台管理保存完订单数据后,系统根据取件地址自动匹配到快递员,系统会给快递员产生取件任务,系统会给快递员发送一条短信..这个取件任务称为:工单 WorkBill.   3.快递员根据短信中取件信息上门取件,快递员会给客户提供纸质单据(快递单),填写

030 查看定区中关联的分区数据 - bos

一.页面修改 1.为datagrid每一行的双击事件绑定响应函数,在$("#grid").datagrid({})的json参数中执行 // 收派标准数据表格 $('#grid').datagrid( { iconCls : 'icon-forward', fit : true, border : true, rownumbers : true, striped : true, pageList: [30,50,100], pagination : true, toolbar : to

024 定区分页查询 - bos

1.修改请求定区数据的URL url : "decidedzoneAction_pageQuery.action", 2.修改Decidedzone.hbm.xml,立即加载关联的Staff <many-to-one name="staff" class="com.hao.bos.entity.Staff" fetch="select" lazy="false"> <column name

两行代码搞定MFC清屏功能

MFC清除屏幕功能 不少人在使用MFC显示图像都遇到过解决清除屏幕的问题,网上有不少解决方案,但是这些方案都不是很简单,最近本文也遇到了同样的问题,因此对MFC的显示原理进行了深入的研究,找到了最简单的解决方案: (1)获取控件的句柄 (2)调用showWidnow(FALSE). (3)调用showWindow(TRUE); 两句简单的代码轻松搞定MFC清除屏幕功能! 代码如下: void CClearScreenMFCDlg::OnBnClickedLoadImage() { // TODO