java快递下单模块,Java开发快递物流项目(7)
客戶下單業務模塊:
一.自動分單邏輯分析
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年名爵6十周年纪念版的轮胎什么牌
- 下一篇: 小型轿车从和静县通过什么方式可以运到乌鲁