业务受理需求分析
客户通过打电话方式进行物流委托,物流公司的客服人员需要将委托信息录入到BOS系统中,这个录入的信息称为业务通知单。
当客服人员将业务通知单信息录入到系统后,系统会根据客户的住址自动匹配到一个取派员,并为这个取派员产生一个任务,这个任务就称为工单。
取派员收到取货任务后,会到客户住址取货,取派员会让客户填写纸质的单子(寄件人信息、收件人信息等),取派员将货物取回物流公司网点后,需要将纸质单子上的信息录入到BOS系统中,录入的信息称为工作单。
注意:通过pdm生成的数据表的外键要手动添加才行
qp_noticebill业务通知单:有两个外键,一个是user_id,一个是staff_id 对应多个工单
qp_workbill工单:有两个外键,一个是staff_id,一个是noticebill_id
qp_workordermanage工作单:没有外键
在实体类里面定义常量便于后期维护
/**
* 业务通知单
*/
public class Noticebill implements java.io.Serializable {
private String id;
private User user;
private Staff staff;
private String customerId;
private String customerName;
private String delegater;
private String telephone;
private String pickaddress;
private String arrivecity;
private String product;
private Date pickdate;
private Integer num;
private Double weight;
private String volume;
private String remark;
private String ordertype;//分单类型:自动分单、人工分单
private Set workbills = new HashSet(0);
public static final String ORDERTYPE_AUTO = "自动分单";
public static final String ORDERTYPE_MAN = "人工分单";
}
/**
* 工单
*/
public class Workbill implements java.io.Serializable {
private String id;
private Noticebill noticebill;
private Staff staff;
private String type;//工单类型:新、追、改、销
private String pickstate;//取件状态:未取件、取件中、已取件
private Timestamp buildtime;
private Integer attachbilltimes;
private String remark;
public static final String TYPE_1 = "新单";
public static final String TYPE_2 = "追单";
public static final String TYPE_3 = "改单";
public static final String TYPE_4 = "销单";
public static final String PICKSTATE_NO = "未取件";
public static final String PICKSTATE_RUNNING = "取件中";
public static final String PICKSTATE_YES = "已取件";
}
/**
* 工作单
*/
public class Workordermanage implements java.io.Serializable {
private String id;
private String arrivecity;
private String product;
private Integer num;
private Double weight;
private String floadreqr;
private String prodtimelimit;
private String prodtype;
private String sendername;
private String senderphone;
private String senderaddr;
private String receivername;
private String receiverphone;
private String receiveraddr;
private Integer feeitemnum;
private Double actlweit;
private String vol;
private String managerCheck;
private Date updatetime;
}
业务受理自动分单
在crm服务中扩展方法
根据客户的手机号查询客户信息(当输入客户的手机号后,光标离开,失去焦点,客户信息就要回显出来)
根据客户的取件地址查询定区id(知道定区id那么就知道是哪个取派员负责的)
第一步:为手机号输入框绑定离焦事件
<td>来电号码:</td>
<td><input type="text" class="easyui-validatebox" name="telephone" id="telephone"
required="true" /></td>
<script>
$(function(){
$("#telephone").blur(function(){
var telephone=$("#telephone").val();
var url="noticebillAction_findCustomerByTelephone.action";
$.post(url,{"telephone":telephone},function(data){
if(data != null){
//查询到了客户信息,可以进行页面回显
var customerId = data.id;
var customerName = data.name;
var address = data.address;
var pickaddress = data.address;
$("#customerId").val(customerId);
$("#customerName").val(customerName);
$("#delegater").val(customerName);
$("#pickaddress").val(pickaddress);
}else{
//没有查询到客户信息,不能进行页面回显
$("#customerId").val("");
$("#customerName").val("");
$("#delegater").val("");
$("#pickaddress").val("");
}
},"json");
});
});
</script>
第二步:创建NoticebillAction,注入crm代理对象,提供方法根据手机号查询客户信息,返回json(注意:配置struts.xml)
@Controller
@Scope("prototype")
/**
* 业务通知单
*/
public class NoticebillAction extends BaseAction<Noticebill> {
@Autowired
private CustomerService proxy;
/**
* 远程调用crm服务,根据手机号查询用户信息
*/
public String findCustomerByTelephone(){
String telephone=model.getTelephone();
Customer customer = proxy.findCustomerByTelephone(telephone);
this.java2Json(customer, new String[]{});
return NONE;
}
}
将页面的非空校验去掉(只有来电号码和取件地址需要非空校验,别的都去掉)
第三步:为页面中“新单”按钮绑定事件
在NoticebillAction中提供方法实现业务受理自动分单
@Service
@Transactional
public class NoticebillServiceImpl implements INoticebillService {
@Autowired
private INoticebillDao noticebillDao;
@Autowired
private CustomerService proxy;
@Autowired
private IDecidedzoneDao decidedzoneDao;
@Autowired
private IWorkbillDao workbillDao;
/**
* 保存业务通知单,并尝试自动分单
* 业务通知单先保存,然后在修改
* 工单就是保存
*/
public void save(Noticebill model) {
User user = BOSUtils.getUser();
model.setUser(user);//设置当前登录用户
noticebillDao.save(model);
//获取客户的取件地址
String pickaddress = model.getPickaddress();
//远程调用crm服务,根据取件地址查询定区id
String decidedzoneId = proxy.getDecidedzoneIdByAddress(pickaddress);
if(decidedzoneId != null){
//查询到了定区id,可以完成自动分单
Decidedzone decidedzone = decidedzoneDao.findById(decidedzoneId);
Staff staff = decidedzone.getStaff();
model.setStaff(staff);//业务通知单关联取派员对象
//设置分单类型为:自动分单
model.setOrdertype(Noticebill.ORDERTYPE_AUTO);
//为取派员产生一个工单
Workbill workbill = new Workbill();
workbill.setAttachbilltimes(0);//追单次数
workbill.setBuildtime(new Timestamp(System.currentTimeMillis()));//创建时间,当前系统时间
workbill.setNoticebill(model);//工单关联页面通知单
workbill.setPickstate(Workbill.PICKSTATE_NO);//取件状态
workbill.setRemark(model.getRemark());//备注信息
workbill.setStaff(staff);//工单关联取派员
workbill.setType(Workbill.TYPE_1);//工单类型
workbillDao.save(workbill);
//调用短信平台,发送短信
}else{
//没有查询到定区id,不能完成自动分单
model.setOrdertype(Noticebill.ORDERTYPE_MAN);
}
}
}
new Timestamp(System.currentTimeMillis())
因为workbill的字段类型是timestamp,
和Date的区别就是精确到了时分秒
不能完成自动分单
不考虑crm系统中手机号码不存在那种情况(需要去crm中插入一条数据)
手机号码还是在crm中,但是这个手机号没有关联到定区(以后有空来实现这个功能)
最终效果就是,像业务通知单插入一条数据,并且分单类型为人工分单,没有像工单表插入数据
如果是人工分单,接下来程序如何处理,通过人工调度来完成此功能(页面显示的是没有完成自动分单的业务通知单的数据)
datagrid编辑功能使用方式
数据表格编辑功能是以列为单位。
通过数据表格中的列属性定区具体那一列具有编辑功能:
numberbox:输入的数字
datebox:日期
开始编辑:
结束编辑:
插入一行数据:
删除一行:
获得指定行对象的索引
数据表格提供的用于监听结束编辑事件:
可以编辑的代码
后端开发,结束以后做什么事
发送一个ajax请求,将data提交服务器,修改服务器即可。
将页面调整为选中哪一行,就操作哪一行的增删改查
注意:点击删除的时候,不触发onAfterEdit方法,因此需要在删除里面在发送一个ajax请求
添加:
修改:
删除:
基于数据表格编辑功能实现工作单快速录入
如何实现非空校验:
写对应的Action service dao
@Controller
@Scope("prototype")
public class WorkordermanageAction extends BaseAction<Workordermanage> {
@Autowired
private IWorkordermanageService workordermanageService;
//这里写try{}catch(){}原因是工作单号有可能输入相同,就会保存失败
public String add() throws IOException{
String f="1";
try {
workordermanageService.save(model);
} catch (Exception e) {
f="0";
}
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
ServletActionContext.getResponse().getWriter().print(f);
return NONE;
}
}