Java开发快递物流项目(7)
来源:互联网 发布:linux c 创建文件 编辑:程序博客网 时间:2024/06/14 08:49
客户下单业务模块:
一.自动分单逻辑分析
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@Transactionalpublic class OrderServiceImpl implements OrderService {@Autowiredprivate FixedAreaRepository fixedAreaRepository;@Autowiredprivate OrderRepository orderRepository;@Autowiredprivate AreaRepository areaRepository;@Autowiredprivate WorkBillRepository workBillRepository;@Autowired@Qualifier("jmsQueueTemplate")private JmsTemplate jmsTemplate;@Overridepublic 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() {@Overridepublic 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);}}
阅读全文
0 0
- Java开发快递物流项目(7)
- Java开发快递物流项目(1)
- Java开发快递物流项目(2)
- Java开发快递物流项目(3)
- Java开发快递物流项目(4)
- Java开发快递物流项目(5)
- Java开发快递物流项目(6)
- 中国快递“CSN项目+物流宝+快递100”…
- [安卓开发] 快递物流信息布局
- 快递鸟物流查询接口开发
- NiceTrack.cn快递物流跟踪系统接口说明(JAVA版本)
- JAVA 调用中通快递查询物流轨迹接口
- 快递物流助手
- 快递物流查询
- 快递物流时间轴
- 快递物流第三方接口
- 物流和快递的区别
- Anddroid 物流查询快递查询
- leetcode 504. Base 7
- selenium + c#做自动化时遇到的问题
- 40 Three.js线性几何体材质THREE.LineDashedMaterial
- 手机窗体上悬浮显示
- opencv实现自己训练的Adaboost(Haar-like)检测识别库
- Java开发快递物流项目(7)
- TensorFlow的android移植
- TCP和UDP
- 编程教学虎书:实践最佳平滑路径与参考code,demobase
- 除了LINUX,我们真的有可选的第二开源操作系统吗?
- 无法运行"Hi3516CV-DEMB-uboot-DDR...-BUS_266M.xsl"宏。可能是因为该宏在此工作簿中不可用,或者所有的宏都被禁用。
- 初识Python
- 顺序表栈的基本操作
- sftp服务器下载文件至本地电脑