Commit 5bfca56efa58d6132086350b205d8a33a6c83d74

Authored by puhui999
1 parent db7e47fa

fix:完善 TODO 提到的问题

yudao-module-mall/yudao-module-trade-biz/pom.xml
... ... @@ -23,7 +23,6 @@
23 23 <artifactId>yudao-module-trade-api</artifactId>
24 24 <version>${revision}</version>
25 25 </dependency>
26   -
27 26 <dependency>
28 27 <groupId>cn.iocoder.boot</groupId>
29 28 <artifactId>yudao-module-product-api</artifactId>
... ... @@ -44,6 +43,11 @@
44 43 <artifactId>yudao-module-member-api</artifactId>
45 44 <version>${revision}</version>
46 45 </dependency>
  46 + <dependency>
  47 + <groupId>cn.iocoder.boot</groupId>
  48 + <artifactId>yudao-module-system-api</artifactId>
  49 + <version>${revision}</version>
  50 + </dependency>
47 51  
48 52 <!-- 业务组件 -->
49 53 <dependency>
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
... ... @@ -6,7 +6,9 @@ import cn.hutool.core.util.IdUtil;
6 6 import cn.hutool.core.util.ObjectUtil;
7 7 import cn.hutool.core.util.StrUtil;
8 8 import cn.iocoder.yudao.framework.common.core.KeyValue;
  9 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
9 10 import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
  11 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
10 12 import cn.iocoder.yudao.framework.common.pojo.PageResult;
11 13 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
12 14 import cn.iocoder.yudao.module.member.api.address.AddressApi;
... ... @@ -21,6 +23,11 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
21 23 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
22 24 import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi;
23 25 import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO;
  26 +import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
  27 +import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
  28 +import cn.iocoder.yudao.module.system.api.notify.dto.NotifyTemplateReqDTO;
  29 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  30 +import cn.iocoder.yudao.module.system.enums.notify.NotifyTemplateTypeEnum;
24 31 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
25 32 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
26 33 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
... ... @@ -29,6 +36,7 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettle
29 36 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO;
30 37 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
31 38 import cn.iocoder.yudao.module.trade.dal.dataobject.cart.TradeCartDO;
  39 +import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
32 40 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
33 41 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
34 42 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
... ... @@ -38,6 +46,7 @@ import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
38 46 import cn.iocoder.yudao.module.trade.enums.order.*;
39 47 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
40 48 import cn.iocoder.yudao.module.trade.service.cart.TradeCartService;
  49 +import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
41 50 import cn.iocoder.yudao.module.trade.service.price.TradePriceService;
42 51 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
43 52 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
... ... @@ -74,6 +83,8 @@ public class TradeOrderServiceImpl implements TradeOrderService {
74 83 private TradeCartService tradeCartService;
75 84 @Resource
76 85 private TradePriceService tradePriceService;
  86 + @Resource
  87 + private DeliveryExpressService deliveryExpressService;
77 88  
78 89 @Resource
79 90 private ProductSkuApi productSkuApi;
... ... @@ -85,7 +96,10 @@ public class TradeOrderServiceImpl implements TradeOrderService {
85 96 private CouponApi couponApi;
86 97 @Resource
87 98 private MemberUserApi memberUserApi;
88   -
  99 + @Resource
  100 + private AdminUserApi adminUserApi;
  101 + @Resource
  102 + private NotifyMessageSendApi notifyMessageSendApi;
89 103 @Resource
90 104 private TradeOrderProperties tradeOrderProperties;
91 105  
... ... @@ -123,7 +137,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
123 137 /**
124 138 * 计算订单价格
125 139 *
126   - * @param userId 用户编号
  140 + * @param userId 用户编号
127 141 * @param settlementReqVO 结算信息
128 142 * @return 订单价格
129 143 */
... ... @@ -162,7 +176,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
162 176 /**
163 177 * 校验收件地址是否存在
164 178 *
165   - * @param userId 用户编号
  179 + * @param userId 用户编号
166 180 * @param addressId 收件地址编号
167 181 * @return 收件地址
168 182 */
... ... @@ -181,7 +195,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
181 195 order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus());
182 196 order.setType(TradeOrderTypeEnum.NORMAL.getType());
183 197 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
184   - order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
  198 + order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
185 199 order.setTerminal(TerminalEnum.H5.getTerminal()); // todo 数据来源?
186 200 // 支付信息
187 201 order.setAdjustPrice(0).setPayed(false);
... ... @@ -201,12 +215,12 @@ public class TradeOrderServiceImpl implements TradeOrderService {
201 215  
202 216 /**
203 217 * 执行创建完创建完订单后的逻辑
204   - *
  218 + * <p>
205 219 * 例如说:优惠劵的扣减、积分的扣减、支付单的创建等等
206 220 *
207   - * @param userId 用户编号
208   - * @param createReqVO 创建订单请求
209   - * @param tradeOrderDO 交易订单
  221 + * @param userId 用户编号
  222 + * @param createReqVO 创建订单请求
  223 + * @param tradeOrderDO 交易订单
210 224 * @param calculateRespBO 订单价格计算结果
211 225 */
212 226 private void afterCreateTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO,
... ... @@ -265,11 +279,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
265 279  
266 280 /**
267 281 * 校验交易订单满足被支付的条件
268   - *
  282 + * <p>
269 283 * 1. 交易订单未支付
270 284 * 2. 支付单已支付
271 285 *
272   - * @param id 交易订单编号
  286 + * @param id 交易订单编号
273 287 * @param payOrderId 支付订单编号
274 288 * @return 交易订单
275 289 */
... ... @@ -324,8 +338,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
324 338 public void deliveryOrder(Long userId, TradeOrderDeliveryReqVO deliveryReqVO) {
325 339 // 校验并获得交易订单(可发货)
326 340 TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId());
327   -
328   - // TODO 芋艿:logisticsId 校验存在
  341 + // TODO 芋艿:logisticsId 校验存在 发货物流公司 fix
  342 + DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(deliveryReqVO.getLogisticsId());
  343 + if (deliveryExpress == null) {
  344 + throw exception(DELIVERY_EXPRESS_NOT_EXISTS);
  345 + }
329 346  
330 347 // 更新 TradeOrderDO 状态为已发货,等待收货
331 348 int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(),
... ... @@ -338,8 +355,32 @@ public class TradeOrderServiceImpl implements TradeOrderService {
338 355  
339 356 // TODO 芋艿:发送订单变化的消息
340 357  
341   - // TODO 芋艿:发送站内信
342   -
  358 + // TODO 芋艿:发送站内信 fix
  359 + // 1、获取模版编码为 order_delivery 的模版,判断是否存在 存在放回 true
  360 + if (!notifyMessageSendApi.validateNotifyTemplate("order_delivery")) {
  361 + // 1、1 站内信模版不存在则创建模版
  362 + NotifyTemplateReqDTO templateReqDTO = new NotifyTemplateReqDTO();
  363 + templateReqDTO.setName("订单发货通知模版");
  364 + templateReqDTO.setCode("order_delivery");
  365 + templateReqDTO.setType(NotifyTemplateTypeEnum.NOTIFICATION_MESSAGE.getType()); // 系统消息
  366 + // 获取操作用户
  367 + // AdminUserRespDTO user = adminUserApi.getUser(userId);
  368 + // templateReqDTO.setNickname(user.getNickname());
  369 + templateReqDTO.setNickname(UserTypeEnum.ADMIN.getName());
  370 + templateReqDTO.setContent("订单:{orderId}{msg}");
  371 + templateReqDTO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  372 + notifyMessageSendApi.createNotifyTemplate(templateReqDTO);
  373 + }
  374 + // 2、构造消息
  375 + Map<String, Object> msgMap = new HashMap<>();
  376 + msgMap.put("orderId", deliveryReqVO.getId());
  377 + msgMap.put("msg", TradeOrderStatusEnum.DELIVERED.getStatus());
  378 + // 2、发送站内信
  379 + notifyMessageSendApi.sendSingleMessageToAdmin(
  380 + new NotifySendSingleToUserReqDTO()
  381 + .setUserId(userId)
  382 + .setTemplateCode("order_delivery")
  383 + .setTemplateParams(msgMap));
343 384 // TODO 芋艿:OrderLog
344 385  
345 386 // TODO 设计:like:是否要单独一个 delivery 发货单表???
... ... @@ -349,7 +390,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
349 390  
350 391 /**
351 392 * 校验交易订单满足被发货的条件
352   - *
  393 + * <p>
353 394 * 1. 交易订单未发货
354 395 *
355 396 * @param id 交易订单编号
... ... @@ -363,7 +404,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
363 404 }
364 405 // 校验订单是否是待发货状态
365 406 if (!TradeOrderStatusEnum.isUndelivered(order.getStatus())
366   - || ObjectUtil.notEqual(order.getDeliveryStatus(), TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus())) {
  407 + || ObjectUtil.notEqual(order.getDeliveryStatus(), TradeOrderDeliveryStatusEnum.UNDELIVERED.getStatus())) {
367 408 throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED);
368 409 }
369 410 return order;
... ... @@ -397,11 +438,11 @@ public class TradeOrderServiceImpl implements TradeOrderService {
397 438  
398 439 /**
399 440 * 校验交易订单满足可售货的条件
400   - *
  441 + * <p>
401 442 * 1. 交易订单待收货
402 443 *
403 444 * @param userId 用户编号
404   - * @param id 交易订单编号
  445 + * @param id 交易订单编号
405 446 * @return 交易订单
406 447 */
407 448 private TradeOrderDO validateOrderReceivable(Long userId, Long id) {
... ... @@ -476,7 +517,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
476 517 public void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus, Integer refundPrice) {
477 518 // 如果退款成功,则 refundPrice 非空
478 519 if (Objects.equals(newAfterSaleStatus, TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())
479   - && refundPrice == null) {
  520 + && refundPrice == null) {
480 521 throw new IllegalArgumentException(StrUtil.format("id({}) 退款成功,退款金额不能为空", id));
481 522 }
482 523  
... ...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/notify/NotifyMessageSendApi.java
1 1 package cn.iocoder.yudao.module.system.api.notify;
2 2  
3 3 import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
  4 +import cn.iocoder.yudao.module.system.api.notify.dto.NotifyTemplateReqDTO;
4 5  
5 6 import javax.validation.Valid;
6 7  
... ... @@ -27,4 +28,8 @@ public interface NotifyMessageSendApi {
27 28 */
28 29 Long sendSingleMessageToMember(@Valid NotifySendSingleToUserReqDTO reqDTO);
29 30  
  31 +
  32 + boolean validateNotifyTemplate(String orderDelivery);
  33 +
  34 + void createNotifyTemplate(NotifyTemplateReqDTO templateReqDTO);
30 35 }
... ...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/notify/dto/NotifyTemplateReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.api.notify.dto;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import lombok.Data;
  6 +
  7 +import javax.validation.constraints.NotEmpty;
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +@Data
  11 +public class NotifyTemplateReqDTO {
  12 +
  13 + @NotEmpty(message = "模版名称不能为空")
  14 + private String name;
  15 +
  16 + @NotNull(message = "模版编码不能为空")
  17 + private String code;
  18 +
  19 + @NotNull(message = "模版类型不能为空")
  20 + private Integer type;
  21 +
  22 + @NotEmpty(message = "发送人名称不能为空")
  23 + private String nickname;
  24 +
  25 + @NotEmpty(message = "模版内容不能为空")
  26 + private String content;
  27 +
  28 + @NotNull(message = "状态不能为空")
  29 + @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}")
  30 + private Integer status;
  31 +
  32 + private String remark;
  33 +
  34 +}
... ...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/notify/NotifyTemplateTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.enums.notify;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 通知模板类型枚举
  8 + *
  9 + * @author HUIHUI
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +public enum NotifyTemplateTypeEnum {
  14 +
  15 + /**
  16 + * 系统消息
  17 + */
  18 + SYSTEM_MESSAGE(2),
  19 + /**
  20 + * 通知消息
  21 + */
  22 + NOTIFICATION_MESSAGE(1);
  23 +
  24 + private final Integer type;
  25 +
  26 +}
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/notify/NotifyMessageSendApiImpl.java
1 1 package cn.iocoder.yudao.module.system.api.notify;
2 2  
3 3 import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
4   -import cn.iocoder.yudao.module.system.service.notify.NotifyMessageService;
  4 +import cn.iocoder.yudao.module.system.api.notify.dto.NotifyTemplateReqDTO;
5 5 import cn.iocoder.yudao.module.system.service.notify.NotifySendService;
6 6 import org.springframework.stereotype.Service;
7 7  
... ... @@ -30,4 +30,14 @@ public class NotifyMessageSendApiImpl implements NotifyMessageSendApi {
30 30 reqDTO.getTemplateCode(), reqDTO.getTemplateParams());
31 31 }
32 32  
  33 + @Override
  34 + public boolean validateNotifyTemplate(String orderDelivery) {
  35 + return false;
  36 + }
  37 +
  38 + @Override
  39 + public void createNotifyTemplate(NotifyTemplateReqDTO templateReqDTO) {
  40 +
  41 + }
  42 +
33 43 }
... ...