客户下单业务模块:

一.自动分单逻辑分析

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)相关推荐

  1. java 前台商品展示模块_SSH框架网上商城项目第10战之搭建商品类基本模块

    前面我们完成了与商品类别相关的业务逻辑,接下来我们开始做具体商品部分. 1. 数据库建表并映射Model首先我们在数据库中新建一张表,然后使用逆向工程将表映射成Model类,表如下: /*====== ...

  2. 比价寄快递CPS小程序开发

    比价寄快递CPS小程序开发 核心功能:根据地址比对价格:下单最低四元起:运费补差价:分销合伙人模式:售后工单. 特别注意:快递下单接口为易达快递平台,费用需要向易达平台充值zui低200元,无其他费用 ...

  3. Java开发快递物流项目(6)

    前端系统(AngularJS ).用户注册  短信平台.Redis .MQ 一.前端AngularJS 1)ng-app 在任何元素上使用,代表 angular 应用作用域 ng-controller ...

  4. Java开发快递物流项目(3)

    基础设置模块一: 1.  收派标准模块 a.  根据实体类生成对应的表,在父工程中配置相应的pom文件 b.  applicationContext.xml中做好相应的配置,注解开发不要忘记包扫描,事 ...

  5. 快递鸟Java开发快递查询api接口调用源码

    快递鸟是专业的第三方物流数据服务商,国家高新技术企业,已先后完成四轮融资,一直专注于企业级物流API技术研发和打通物流各节点信息服务,致力于成为全球最大的物流信息枢纽中心,为零售电商企业级提供标准的物 ...

  6. 基于java的快递物流查询系统_毕业论文-快递管理基于java的物流快递管理系统设计.doc...

    毕业论文-快递管理基于java的物流快递管理系统设计 快递管理系统 毕业设计论文 题 目 快递管理系统 姓 名 王敏雪 所 属 系 数学与计算机科学 专 业 计算机科学与技术 班 级 07级计科三班 ...

  7. Java如何接入快递鸟单号查询接口物流API

    Java怎么写物流接口,怎么接入物流接口,如何根据单号查询物流跟踪的详细信息 需求 根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递Api接口,实现自动查询的功能 demo实例 本人自己 ...

  8. 快递管理系统 java_快递管理基于java物流快递管理系统设计.doc

    快递管理基于java物流快递管理系统设计 快递管理系统 毕业设计论文 题 目 快递管理系统 姓 名 王敏雪 所 属 系 数学与计算机科学 专 业 计算机科学与技术 班 级 07级计科三班 指导教师 张 ...

  9. java基本微信小程序的快递代收派送系统 uniapp小程序

    随着时代的发展,人们生活的节奏越来越快,但是快递已经成为人们生活中的一个重要组成部分,基本每个人都会收发快递,如果这些事情全部都到快递站点进行处理,是很浪费时间和精力的一件事情.为了能够让快递代收和派 ...

最新文章

  1. 二阶系统阶跃响应实验_自控原理二阶系统阶跃响应及性能分析实验报告
  2. TCP/IP详解--第十一章
  3. java1.6 linux_linux java1.6 安装
  4. C#中格式化小数位数为指定位数的工具类
  5. 安装elasticsearch-analysis-ik中文分词器
  6. 【c语言】棋盘游戏--三子棋
  7. 使用docker搭建wordpress网站
  8. Product of Three Numbers(CF-1294C)
  9. Guava链式风格Ordering比较器实例
  10. 医生们团结一致,以增加对优质健康信息的访问
  11. Php.ini文件位置在哪里 Php.ini文件找不到
  12. java学习 - 函数
  13. Linux入门及安装教程
  14. MATLAB实现高斯-克吕格投影反算
  15. FCM算法与K-means 算法
  16. Quant量化面试题 数学 逻辑题 过河、生日、烧绳、称重
  17. 非因解读 | RPPA功能蛋白组学与单细胞测序的“双向奔赴”,携手探究黑色素瘤免疫/靶向顺序联合治疗机制
  18. 推荐一本书:清华出版的《Modbus软件开发实战指南》
  19. 使用Cytoscape-BiNGO 对非模式生物做go富集
  20. 2021年Java常见面试题,实战篇

热门文章

  1. python基础--面向对象之多态
  2. JavaScript实现求最大公约数 (GCD)的算法(附完整源码)
  3. OpenCASCADE绘制测试线束:数据交换命令之STEP 命令
  4. boost::sort模块实现spreadsort 字符串排序示例
  5. boost::polygon模块实现多边形间隔相关的测试程序
  6. 使用 Boost.MPI 的 split() 操作对通信器的示例
  7. boost::hana::detail::any_of用法的测试程序
  8. boost::maximum_weighted_matching用法的测试程序
  9. boost::geometry::box_view用法的测试程序
  10. boost::geometry::strategy::distance::thomas用法的测试程序