客户下单业务模块:
一. 自动分单逻辑分析
1. 获取到寄件人和收件人的省市区信息
2. 第一种情况假如寄件人的地址和 CRM 地址库里面的地址完全匹配, 则分配快递员, 生成工单
3. 第二种情况只有定区的信息, 则根据定区来匹配快递员, 匹配快递员成功的话就进行分单, 生成工单
4. 第三种情况有分区关键字 (keyWords) 的信息, 则通过分区关键字, 找到分区, 关联上定区, 找到快递员, 进行分单, 生成工单
5. 第四种情况, 能匹配到分区辅助关键字 (AssistKeyWords) 信息, 则通过辅助关键字, 找到分区, 关联上定区找到快递员进行分单, 生成工单
6. 上述情况全部失败的话进入人工分单
二. 实现后台系统自动分单
1. 前段表格提交, 基于 webService 将数据传递到后台系统
2. 将 bos_domian 中 order 和 Area 实体类加上 @RootXmlElement (对象转换为 xml 格式) 注解, 不要忘记 maven install
3. 在 bos_manangement 添加 OrderService 发布 WebService, 并 applicaiontContext-webservice.xml
4. 完善 bos_fore 的 OrderAction 代码, 调用 WebService
5. 将寄件人下单地址 ,以 webService 方式,发送 CRM 地址库获取 对应客户关联 定区
6. 进行业务逻辑判断, 完成代码
- package cn.bos.service.take_delivery.impl;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.UUID;
- import javax.jms.JMSException;
- import javax.jms.MapMessage;
- import javax.jms.Message;
- import javax.jms.Session;
- import javax.ws.rs.core.MediaType;
- import org.apache.commons.lang3.RandomStringUtils;
- import org.apache.cxf.jaxrs.client.WebClient;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.jms.core.JmsTemplate;
- import org.springframework.jms.core.MessageCreator;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import cn.bos.constant.Constants;
- import cn.bos.dao.base.AreaRepository;
- import cn.bos.dao.base.FixedAreaRepository;
- import cn.bos.dao.take_delivery.OrderRepository;
- import cn.bos.dao.take_delivery.WorkBillRepository;
- import cn.bos.domain.base.Area;
- import cn.bos.domain.base.Courier;
- import cn.bos.domain.base.FixedArea;
- import cn.bos.domain.base.SubArea;
- import cn.bos.domain.take_delivery.Order;
- import cn.bos.domain.take_delivery.WorkBill;
- import cn.bos.service.take_delivery.OrderService;
- @Service
- @Transactional
- public class OrderServiceImpl implements OrderService {
- @Autowired
- private FixedAreaRepository fixedAreaRepository;
- @Autowired
- private OrderRepository orderRepository;
- @Autowired
- private AreaRepository areaRepository;
- @Autowired
- private WorkBillRepository workBillRepository;
- @Autowired
- @Qualifier("jmsQueueTemplate")
- private JmsTemplate jmsTemplate;
- @Override
- public void saveOrder(Order order) {
- order.setOrderNum(UUID.randomUUID().toString());// 设置订单号
- order.setOrderTime(new Date());// 设置下单时间
- order.setStatus("1");// 待取件
- // Area没有id是瞬时态 不能保存到数据库 要封装后才能添加
- // 1. 获取到寄件人和收件人的省市区信息
- // 寄件人 省市区
- Area area = order.getSendArea();
- Area persistArea = areaRepository.findByProvinceAndCityAndDistrict(
- area.getProvince(), area.getCity(), area.getDistrict());
- // 收件人 省市区
- Area recArea = order.getSendArea();
- Area persistRecArea = areaRepository.findByProvinceAndCityAndDistrict(
- recArea.getProvince(), recArea.getCity(),
- recArea.getDistrict());
- order.setSendArea(persistArea);
- order.setRecArea(persistRecArea);
- // 2.第一种情况假如寄件人的地址和CRM地址库里面的地址完全匹配,则分配快递员,生成工单
- // 自动分单逻辑,基于crm地址库完全匹配,获取定区,匹配快递员
- String fixedAreaId = WebClient
- .create(Constants.CRM_MANAGEMENT_URL
- + "/services/customerService/customer/findFixedAreaIdByAddress?address="
- + order.getSendAddress())
- .accept(MediaType.APPLICATION_JSON).get(String.class);
- // 3. 第二种情况只有定区的信息,则根据定区来匹配快递员,匹配快递员成功的话就进行分单,生成工单
- if (fixedAreaId != null) {
- // 如果有这个定区, 定区id不为空,根据这个id寻找到定区
- // 这个定区肯定关联了一个快递员
- FixedArea fixedArea = fixedAreaRepository.findOne(fixedAreaId);
- Courier courier = fixedArea.getCouriers().iterator().next();
- if (courier != null) {
- // 如果关联了快递员
- // 自动分单成功
- System.out.println("自动分单成功");
- saveOrder(order, courier);
- // 生成工单 发送短信
- generateWorkBill(order);
- return;
- }
- }
- // 4. 第三种情况有分区关键字(keyWords)的信息,则通过分区关键字,找到分区,关联上定区,找到快递员,进行分单,生成工单
- // 自动分单的逻辑,通过省市区,查询分区关键字,匹配地址,基于分区实现自动分单
- for (SubArea subArea : persistArea.getSubareas()) { // 拿到寄件人的分区地址
- // 当前客户的下单地址,是否包含分区关键字
- if (order.getSendAddress().contains(subArea.getKeyWords())) {
- // 包含的话,找到分区,找到定区,找到快递员
- Iterator<Courier> iterator = subArea.getFixedArea()
- .getCouriers().iterator();
- if (iterator.hasNext()) {
- Courier courier = iterator.next();
- if (courier != null) {
- // 自动分单成功
- System.out.println("自动分单成功");
- saveOrder(order, courier);
- // 生成工单 发送短信
- generateWorkBill(order);
- return;
- }
- }
- }
- }
- // 5.第四种情况,能匹配到分区辅助关键字(AssistKeyWords)信息,则通过辅助关键字,找到分区,关联上定区找到快递员进行分单,生成工单
- for (SubArea subArea : persistArea.getSubareas()) {
- // 当前客户的下单地址是否包含分区辅助关键字
- if (order.getSendAddress().contains(subArea.getAssistKeyWords())) {
- // 找到分区,找到定区,找到快递员
- Iterator<Courier> iterator = subArea.getFixedArea()
- .getCouriers().iterator();
- if (iterator.hasNext()) {
- Courier courier = iterator.next();
- if (courier != null) {
- // 自动分单成功
- System.out.println("自动分单成功");
- // 生成工单
- generateWorkBill(order);
- return;
- }
- }
- }
- }
- // 进入人工分单
- order.setOrderType("2");
- orderRepository.save(order);
- }
- private void generateWorkBill(final Order order) {
- // 生成工单
- WorkBill workBill = new WorkBill();
- workBill.setType("新");
- workBill.setPickstate("新单");
- workBill.setBuildtime(new Date());
- workBill.setRemark(order.getRemark());
- final String smsNumber = RandomStringUtils.randomNumeric(4);
- workBill.setSmsNumber(smsNumber); // 短信序号
- workBill.setOrder(order);
- workBill.setCourier(order.getCourier());
- workBillRepository.save(workBill);
- // 发送短信
- // 调用MQ服务,发送一条信息
- jmsTemplate.send("bos_sms", new MessageCreator() {
- @Override
- public Message createMessage(Session session) throws JMSException {
- MapMessage mapMessage = session.createMapMessage();
- mapMessage.setString("telephone",
- order.getCourier().getTelephone());
- mapMessage.setString("msg",
- "短信序号:" + smsNumber + ",取件地址:" + order.getSendAddress()
- + ",联系人:" + order.getSendName() + ",手机:"
- + order.getSendMobile() + ",快递员捎话:"
- + order.getSendMobileMsg());
- return mapMessage;
- }
- });
- // 修改工单状态
- workBill.setPickstate("已通知");
- }
- // 自动分单保存
- private void saveOrder(Order order, Courier courier) {
- // 将快递员关联到订单上
- order.setCourier(courier);
- // 设置自动分单
- order.setOrderType("1");
- // 保存订单
- orderRepository.save(order);
- }
- }
来源: http://blog.csdn.net/zhou_calm/article/details/78776160