Commit 7c9bae688175029bd134c27b8bb29d0fed05086e

Authored by shaofan
1 parent 31517b8c

Refactor routing and message handling logic in `TransportOrderServiceImpl` and `…

…PickupDispatchTaskServiceImpl`, add notification/message generation for courier tasks, and cleanup redundant exception handling in Redis publish logic.
sl-express-ms-transport-info-service/src/main/java/com/sl/transport/info/service/impl/TransportInfoServiceImpl.java
... ... @@ -38,7 +38,7 @@ public class TransportInfoServiceImpl implements TransportInfoService {
38 38 * @return 运输信息数据
39 39 */
40 40 @Override
41   - @CachePut(value = "transport-info",key = "#p0")
  41 + @CachePut(value = "transport-info", key = "#p0")
42 42 public TransportInfoEntity saveOrUpdate(String transportOrderId, TransportInfoDetail infoDetail) {
43 43 // 根据运单ID查询
44 44 Query query = Query.query(Criteria.where("transportOrderId").is(transportOrderId));
... ... @@ -62,11 +62,7 @@ public class TransportInfoServiceImpl implements TransportInfoService {
62 62  
63 63 // 清除缓存中的数据
64 64 // transportInfoCache.invalidate(transportOrderId);
65   - try {
66   - stringRedisTemplate.convertAndSend(RedisConfig.CHANNEL_TOPIC, transportOrderId);
67   - } catch (Exception e) {
68   - log.error("失败", e);
69   - }
  65 + stringRedisTemplate.convertAndSend(RedisConfig.CHANNEL_TOPIC, transportOrderId);
70 66  
71 67 return mongoTemplate.save(transportInfoEntity);
72 68 }
... ...
sl-express-ms-work-service/src/main/java/com/sl/ms/work/mq/CourierMQListener.java
... ... @@ -81,6 +81,7 @@ public class CourierMQListener {
81 81 for (PickupDispatchTaskEntity pickupDispatchTaskEntity : list) {
82 82 if (pickupDispatchTaskEntity.getStatus() == PickupDispatchTaskStatus.NEW) {
83 83 // 消息重复消息
  84 + return;
84 85 }
85 86 }
86 87  
... ...
sl-express-ms-work-service/src/main/java/com/sl/ms/work/service/impl/PickupDispatchTaskServiceImpl.java
... ... @@ -6,14 +6,24 @@ import cn.hutool.core.convert.Convert;
6 6 import cn.hutool.core.date.DateTime;
7 7 import cn.hutool.core.date.DateUtil;
8 8 import cn.hutool.core.date.LocalDateTimeUtil;
  9 +import cn.hutool.core.text.CharSequenceUtil;
9 10 import cn.hutool.core.util.ObjectUtil;
10   -import com.baomidou.mybatisplus.core.conditions.Wrapper;
11 11 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
12 12 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
13 13 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
14 14 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
15 15 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  16 +import com.itheima.auth.sdk.dto.UserDTO;
  17 +import com.sl.ms.base.api.common.AreaFeign;
  18 +import com.sl.ms.base.api.common.AuthFeign;
  19 +import com.sl.ms.base.api.common.MQFeign;
  20 +import com.sl.ms.base.api.common.MessageFeign;
  21 +import com.sl.ms.base.domain.base.MessageAddDTO;
  22 +import com.sl.ms.base.domain.constants.MessageConstants;
  23 +import com.sl.ms.base.domain.enums.MessageBussinessTypeEnum;
  24 +import com.sl.ms.base.domain.enums.MessageContentTypeEnum;
16 25 import com.sl.ms.oms.api.OrderFeign;
  26 +import com.sl.ms.oms.dto.OrderDTO;
17 27 import com.sl.ms.oms.enums.OrderStatus;
18 28 import com.sl.ms.work.domain.dto.CourierTaskCountDTO;
19 29 import com.sl.ms.work.domain.dto.PickupDispatchTaskDTO;
... ... @@ -22,13 +32,16 @@ import com.sl.ms.work.domain.dto.response.PickupDispatchTaskStatisticsDTO;
22 32 import com.sl.ms.work.domain.enums.WorkExceptionEnum;
23 33 import com.sl.ms.work.domain.enums.pickupDispatchtask.*;
24 34 import com.sl.ms.work.entity.PickupDispatchTaskEntity;
  35 +import com.sl.ms.work.entity.TransportOrderEntity;
25 36 import com.sl.ms.work.mapper.TaskPickupDispatchMapper;
26 37 import com.sl.ms.work.service.PickupDispatchTaskService;
27 38 import com.sl.ms.work.service.TransportOrderService;
  39 +import com.sl.transport.common.constant.Constants;
28 40 import com.sl.transport.common.exception.SLException;
29 41 import com.sl.transport.common.util.BeanUtil;
30 42 import com.sl.transport.common.util.PageResponse;
31 43 import com.sl.transport.common.vo.OrderMsg;
  44 +import com.sl.transport.common.vo.TransportInfoMsg;
32 45 import org.springframework.beans.factory.annotation.Autowired;
33 46 import org.springframework.stereotype.Service;
34 47 import org.springframework.transaction.annotation.Transactional;
... ... @@ -48,8 +61,20 @@ public class PickupDispatchTaskServiceImpl extends ServiceImpl<TaskPickupDispatc
48 61 private TransportOrderService transportOrderService;
49 62  
50 63 @Autowired
  64 + private AreaFeign areaFeign;
  65 +
  66 + @Autowired
51 67 private OrderFeign orderFeign;
52 68  
  69 + @Autowired
  70 + private MessageFeign messageFeign;
  71 +
  72 + @Autowired
  73 + private AuthFeign authFeign;
  74 +
  75 + @Autowired
  76 + private MQFeign mqFeign;
  77 +
53 78 /**
54 79 * 更新取派件状态,不允许 NEW 状态
55 80 *
... ... @@ -192,6 +217,11 @@ public class PickupDispatchTaskServiceImpl extends ServiceImpl<TaskPickupDispatc
192 217 boolean result = super.save(taskPickupDispatch);
193 218  
194 219 if (result) {
  220 + // TODO 同步快递员任务到es
  221 + // this.syncCourierTask2Es(taskPickupDispatch);
  222 +
  223 + //生成运单跟踪消息和快递员端取件/派件消息通知
  224 + this.generateMsg(taskPickupDispatch);
195 225  
196 226 return taskPickupDispatch;
197 227 }
... ... @@ -199,6 +229,79 @@ public class PickupDispatchTaskServiceImpl extends ServiceImpl<TaskPickupDispatc
199 229 }
200 230  
201 231 /**
  232 + * 生成运单跟踪消息和快递员端取件/派件消息通知
  233 + *
  234 + * @param taskPickupDispatch 取派件任务
  235 + */
  236 + private void generateMsg(PickupDispatchTaskEntity taskPickupDispatch) {
  237 + OrderDTO orderDTO = orderFeign.findById(taskPickupDispatch.getOrderId());
  238 + //分配给快递员的取派件任务需要发送消息
  239 + if (ObjectUtil.isNotEmpty(taskPickupDispatch.getCourierId())) {
  240 + String title;
  241 + String content;
  242 + Integer contentType;
  243 + String address;
  244 + if (ObjectUtil.equal(taskPickupDispatch.getTaskType(), PickupDispatchTaskType.DISPATCH)) {
  245 + //派件任务需要发送运单跟踪消息
  246 + this.sendTransportInfoMsg(taskPickupDispatch);
  247 +
  248 + //派件任务需要生成派件相关通知消息
  249 + //组装消息内容
  250 + address = areaFeign.get(orderDTO.getReceiverProvinceId()).getName()
  251 + + areaFeign.get(orderDTO.getReceiverCityId()).getName()
  252 + + areaFeign.get(orderDTO.getReceiverCountyId()).getName()
  253 + + orderDTO.getSenderAddress();
  254 + content = CharSequenceUtil.format("地址:{},收件人:{},电话:{}", address, orderDTO.getReceiverName(), orderDTO.getReceiverPhone());
  255 +
  256 + title = MessageConstants.MessageTitle.DISPATCH;
  257 + contentType = MessageContentTypeEnum.COURIER_DISPATCH.getCode();
  258 + } else {
  259 + //取件任务需要生成取件相关通知消息
  260 + //组装消息内容
  261 + address = areaFeign.get(orderDTO.getSenderProvinceId()).getName()
  262 + + areaFeign.get(orderDTO.getSenderCityId()).getName()
  263 + + areaFeign.get(orderDTO.getSenderCountyId()).getName()
  264 + + orderDTO.getSenderAddress();
  265 + content = CharSequenceUtil.format("地址:{},寄件人:{},电话:{}", address, orderDTO.getSenderName(), orderDTO.getSenderPhone());
  266 +
  267 + title = MessageConstants.MessageTitle.PICKUP;
  268 + contentType = MessageContentTypeEnum.COURIER_PICKUP.getCode();
  269 + }
  270 + MessageAddDTO messageAddDTO = MessageAddDTO.builder()
  271 + .title(title)
  272 + .content(content)
  273 + .bussinessType(MessageBussinessTypeEnum.COURIER.getCode())
  274 + .userId(taskPickupDispatch.getCourierId())
  275 + .contentType(contentType)
  276 + .relevantId(taskPickupDispatch.getId())
  277 + .build();
  278 + messageFeign.add(messageAddDTO);
  279 + }
  280 + }
  281 +
  282 +
  283 + /**
  284 + * 发送派件相关运单跟踪消息
  285 + *
  286 + * @param taskPickupDispatch 取派件任务
  287 + */
  288 + private void sendTransportInfoMsg(PickupDispatchTaskEntity taskPickupDispatch) {
  289 + UserDTO userDTO = authFeign.getByUserId(taskPickupDispatch.getCourierId());
  290 + TransportOrderEntity transportOrderEntity = transportOrderService.findByOrderId(taskPickupDispatch.getOrderId());
  291 + String info = CharSequenceUtil.format("您的快递正在派送途中,派件人【{},电话 {}】", userDTO.getName(), userDTO.getMobile());
  292 +
  293 + //构建消息实体类
  294 + String transportInfoMsg = TransportInfoMsg.builder()
  295 + .transportOrderId(transportOrderEntity.getId())
  296 + .status("派送中")
  297 + .info(info)
  298 + .created(DateUtil.current())
  299 + .build().toJson();
  300 + this.mqFeign.sendMsg(Constants.MQ.Exchanges.TRANSPORT_INFO, Constants.MQ.RoutingKeys.TRANSPORT_INFO_APPEND, transportInfoMsg);
  301 + }
  302 +
  303 +
  304 + /**
202 305 * 分页查询取派件任务
203 306 *
204 307 * @param dto 查询条件
... ...
sl-express-ms-work-service/src/main/java/com/sl/ms/work/service/impl/TransportOrderServiceImpl.java
... ... @@ -116,12 +116,16 @@ public class TransportOrderServiceImpl extends
116 116 Long sendAgentId = Convert.toLong(orderLocationDTO.getSendAgentId());
117 117 // 终点网点ID
118 118 Long receiveAgentId = Convert.toLong(orderLocationDTO.getReceiveAgentId());
  119 + // 寄件人城市id
  120 + Long senderCityId = detailByOrderId.getOrderDTO().getSenderCityId();
  121 + // 收件人城市id
  122 + Long receiverCityId = detailByOrderId.getOrderDTO().getReceiverCityId();
119 123  
120 124 // 默认参与调度
121 125 boolean isDispatch = true;
122 126 TransportLineNodeDTO transportLineNodeDTO = null;
123   - if (ObjectUtil.equal(sendAgentId, receiveAgentId)) {
124   -// 起点终点是同一个网点,不需要规划路线,直接发消息生成派件任务即可
  127 + if (ObjectUtil.equal(senderCityId, receiverCityId)) {
  128 +// 起点终点是同一个网点,不需要规划路线,直接发消息生成派件任务即可。ps:现在修改为起点终点是同一城市
125 129 isDispatch = false;
126 130 } else {
127 131 // 根据起点机构规划运输路线
... ... @@ -166,31 +170,29 @@ public class TransportOrderServiceImpl extends
166 170  
167 171 boolean result = super.save(transportOrder);
168 172 if (result) {
169   - if (result) {
170   - if (isDispatch) {
171   -// 发送消息到调度中心,进行调度
172   - sendTransportOrderMsgToDispatch(transportOrder);
173   - } else {
174   - // 不需要调度 发送消息更新订单状态
175   - this.sendUpdateStatusMsg(ListUtil.toList(transportOrder.getId()), TransportOrderStatus.ARRIVED_END);
176   - //不需要调度,发送消息生成派件任务
177   - this.sendDispatchTaskMsgToDispatch(transportOrder);
178   - }
  173 + if (isDispatch) {
  174 + //发送消息到调度中心,进行调度
  175 + sendTransportOrderMsgToDispatch(transportOrder);
  176 + } else {
  177 + // 不需要调度 发送消息更新订单状态
  178 + this.sendUpdateStatusMsg(ListUtil.toList(transportOrder.getId()), TransportOrderStatus.ARRIVED_END);
  179 + //不需要调度,发送消息生成派件任务
  180 + this.sendDispatchTaskMsgToDispatch(transportOrder);
  181 + }
179 182  
180   -// 发消息通知其他系统,运单已经生成
181   - String msg = TransportOrderMsg.builder()
182   - .id(transportOrder.getId())
183   - .orderId(transportOrder.getOrderId())
184   - .created(DateUtil.current())
185   - .build().toJson();
  183 + // 发消息通知其他系统,运单已经生成
  184 + String msg = TransportOrderMsg.builder()
  185 + .id(transportOrder.getId())
  186 + .orderId(transportOrder.getOrderId())
  187 + .created(DateUtil.current())
  188 + .build().toJson();
186 189  
187   - mqFeign.sendMsg(Constants.MQ.Exchanges.TRANSPORT_ORDER_DELAYED,
188   - Constants.MQ.RoutingKeys.TRANSPORT_ORDER_CREATE,
189   - msg,
190   - Constants.MQ.NORMAL_DELAY);
  190 + mqFeign.sendMsg(Constants.MQ.Exchanges.TRANSPORT_ORDER_DELAYED,
  191 + Constants.MQ.RoutingKeys.TRANSPORT_ORDER_CREATE,
  192 + msg,
  193 + Constants.MQ.NORMAL_DELAY);
191 194  
192   - return transportOrder;
193   - }
  195 + return transportOrder;
194 196 }
195 197 throw new SLException(WorkExceptionEnum.TRANSPORT_ORDER_SAVE_ERROR);
196 198 }
... ... @@ -570,7 +572,7 @@ public class TransportOrderServiceImpl extends
570 572 // 批量更新运单
571 573 return updateBatchById(transportOrderList);
572 574 }
573   -
  575 +
574 576 /**
575 577 * 统计各个状态的数量
576 578 *
... ...