概述
客户下单业务模块:
一.自动分单逻辑分析
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())) {
// 包含的话,找到分区,找到定区,找到快递员
Iteratoriterator = 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())) {
// 找到分区,找到定区,找到快递员
Iteratoriterator = 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);
}
}
最后
以上就是清新饼干为你收集整理的java快递下单模块,Java开发快递物流项目(7)的全部内容,希望文章能够帮你解决java快递下单模块,Java开发快递物流项目(7)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复