Commit 5bfca56efa58d6132086350b205d8a33a6c83d74
1 parent
db7e47fa
fix:完善 TODO 提到的问题
Showing
6 changed files
with
141 additions
and
21 deletions
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 | } | ... | ... |