Commit 53bd1b9ec170aa793277f46e7e181212dedcd601

Authored by YunaiV
1 parent cf41347c

trade:订单评论超时时,自动评论

yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java
... ... @@ -23,6 +23,10 @@ public class LocalDateTimeUtils {
23 23 return LocalDateTime.now().plus(duration);
24 24 }
25 25  
  26 + public static LocalDateTime minusTime(Duration duration) {
  27 + return LocalDateTime.now().minus(duration);
  28 + }
  29 +
26 30 public static boolean beforeNow(LocalDateTime date) {
27 31 return date.isBefore(LocalDateTime.now());
28 32 }
... ...
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderOperateTypeEnum.java
... ... @@ -18,6 +18,7 @@ public enum TradeOrderOperateTypeEnum {
18 18 MEMBER_RECEIVE(30, "用户已收货"),
19 19 SYSTEM_RECEIVE(31, "到期未收货,系统自动确认收货"),
20 20 MEMBER_COMMENT(33, "用户评价"),
  21 + SYSTEM_COMMENT(34, "到期未评价,系统自动评价"),
21 22 MEMBER_CANCEL(40, "取消订单"),
22 23 SYSTEM_CANCEL(41, "到期未支付,系统自动取消订单"),
23 24 // 42 预留:管理员取消订单
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
... ... @@ -173,7 +173,7 @@ public class AppTradeOrderController {
173 173 @PostMapping("/item/create-comment")
174 174 @Operation(summary = "创建交易订单项的评价")
175 175 public CommonResult<Long> createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) {
176   - return success(tradeOrderUpdateService.createOrderItemComment(getLoginUserId(), createReqVO));
  176 + return success(tradeOrderUpdateService.createOrderItemCommentByMember(getLoginUserId(), createReqVO));
177 177 }
178 178  
179 179 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java
... ... @@ -38,4 +38,10 @@ public interface TradeOrderItemMapper extends BaseMapperX&lt;TradeOrderItemDO&gt; {
38 38 .eq(TradeOrderItemDO::getUserId, loginUserId));
39 39 }
40 40  
  41 + default List<TradeOrderItemDO> selectListByOrderIdAndCommentStatus(Long orderId, Boolean commentStatus) {
  42 + return selectList(new LambdaQueryWrapperX<TradeOrderItemDO>()
  43 + .eq(TradeOrderItemDO::getOrderId, orderId)
  44 + .eq(TradeOrderItemDO::getCommentStatus, commentStatus));
  45 + }
  46 +
41 47 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
... ... @@ -73,4 +73,12 @@ public interface TradeOrderMapper extends BaseMapperX&lt;TradeOrderDO&gt; {
73 73 .lt(TradeOrderDO::getDeliveryTime, deliveryTime));
74 74 }
75 75  
  76 + default List<TradeOrderDO> selectListByStatusAndReceiveTimeLt(Integer status, LocalDateTime receive,
  77 + Boolean commentStatus) {
  78 + return selectList(new LambdaUpdateWrapper<TradeOrderDO>()
  79 + .eq(TradeOrderDO::getStatus, status)
  80 + .lt(TradeOrderDO::getReceiveTime, receive)
  81 + .eq(TradeOrderDO::getCommentStatus, commentStatus));
  82 + }
  83 +
76 84 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderProperties.java
... ... @@ -36,4 +36,10 @@ public class TradeOrderProperties {
36 36 @NotNull(message = "收货超时时间不能为空")
37 37 private Duration receiveExpireTime;
38 38  
  39 + /**
  40 + * 评论超时时间
  41 + */
  42 + @NotNull(message = "评论超时时间不能为空")
  43 + private Duration commentExpireTime;
  44 +
39 45 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/job/order/TradeOrderAutoCommentJob.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.job.order;
  2 +
  3 +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
  4 +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
  5 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
  6 +import org.springframework.stereotype.Component;
  7 +
  8 +import javax.annotation.Resource;
  9 +
  10 +/**
  11 + * 交易订单的自动评论 Job
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Component
  16 +@TenantJob
  17 +public class TradeOrderAutoCommentJob implements JobHandler {
  18 +
  19 + @Resource
  20 + private TradeOrderUpdateService tradeOrderUpdateService;
  21 +
  22 + @Override
  23 + public String execute(String param) {
  24 + int count = tradeOrderUpdateService.createOrderItemCommentBySystem();
  25 + return String.format("评论订单 %s 个", count);
  26 + }
  27 +
  28 +}
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java
... ... @@ -139,12 +139,19 @@ public interface TradeOrderUpdateService {
139 139 Long afterSaleId, Integer refundPrice);
140 140  
141 141 /**
142   - * 创建订单项的评论
  142 + * 【会员】创建订单项的评论
143 143 *
144 144 * @param userId 用户编号
145 145 * @param createReqVO 创建请求
146 146 * @return 得到评价 id
147 147 */
148   - Long createOrderItemComment(Long userId, AppTradeOrderItemCommentCreateReqVO createReqVO);
  148 + Long createOrderItemCommentByMember(Long userId, AppTradeOrderItemCommentCreateReqVO createReqVO);
  149 +
  150 + /**
  151 + * 【系统】创建订单项的评论
  152 + *
  153 + * @return 被评论的订单数
  154 + */
  155 + int createOrderItemCommentBySystem();
149 156  
150 157 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
... ... @@ -77,7 +77,7 @@ import java.util.Set;
77 77  
78 78 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
79 79 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
80   -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
  80 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.minusTime;
81 81 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
82 82  
83 83 /**
... ... @@ -499,7 +499,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
499 499 @Override
500 500 public int receiveOrderBySystem() {
501 501 // 1. 查询过期的待支付订单
502   - LocalDateTime expireTime = addTime(tradeOrderProperties.getReceiveExpireTime());
  502 + LocalDateTime expireTime = minusTime(tradeOrderProperties.getReceiveExpireTime());
503 503 List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndDeliveryTimeLt(
504 504 TradeOrderStatusEnum.DELIVERED.getStatus(), expireTime);
505 505 if (CollUtil.isEmpty(orders)) {
... ... @@ -513,7 +513,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
513 513 getSelf().receiveOrderBySystem(order);
514 514 count ++;
515 515 } catch (Throwable e) {
516   - log.error("[autoReceiveOrder][order({}) 自动收货订单异常]", order.getId(), e);
  516 + log.error("[receiveOrderBySystem][order({}) 自动收货订单异常]", order.getId(), e);
517 517 }
518 518 }
519 519 return count;
... ... @@ -590,7 +590,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
590 590 @Override
591 591 public int cancelOrderBySystem() {
592 592 // 1. 查询过期的待支付订单
593   - LocalDateTime expireTime = addTime(tradeOrderProperties.getPayExpireTime());
  593 + LocalDateTime expireTime = minusTime(tradeOrderProperties.getPayExpireTime());
594 594 List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndCreateTimeLt(
595 595 TradeOrderStatusEnum.UNPAID.getStatus(), expireTime);
596 596 if (CollUtil.isEmpty(orders)) {
... ... @@ -604,7 +604,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
604 604 getSelf().cancelOrderBySystem(order);
605 605 count ++;
606 606 } catch (Throwable e) {
607   - log.error("[autoCancelOrder][order({}) 过期订单异常]", order.getId(), e);
  607 + log.error("[cancelOrderBySystem][order({}) 过期订单异常]", order.getId(), e);
608 608 }
609 609 }
610 610 return count;
... ... @@ -726,7 +726,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
726 726 }
727 727 tradeOrderItemMapper.updateBatch(updateItems);
728 728  
729   -
730 729 // 6、更新支付订单
731 730 payOrderApi.updatePayOrderPrice(order.getPayOrderId(), update.getPayPrice());
732 731 }
... ... @@ -835,16 +834,29 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
835 834 }
836 835 }
837 836  
  837 +
  838 + /**
  839 + * 判断指定订单的所有订单项,是不是都售后成功
  840 + *
  841 + * @param id 订单编号
  842 + * @return 是否都售后成功
  843 + */
  844 + private boolean isAllOrderItemAfterSaleSuccess(Long id) {
  845 + List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
  846 + return orderItems.stream().allMatch(orderItem -> Objects.equals(orderItem.getAfterSaleStatus(),
  847 + TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus()));
  848 + }
  849 +
838 850 @Override
839 851 @Transactional(rollbackFor = Exception.class)
840 852 @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_COMMENT)
841   - public Long createOrderItemComment(Long userId, AppTradeOrderItemCommentCreateReqVO createReqVO) {
842   - // 先通过订单项 ID,查询订单项是否存在
  853 + public Long createOrderItemCommentByMember(Long userId, AppTradeOrderItemCommentCreateReqVO createReqVO) {
  854 + // 1.1 先通过订单项 ID,查询订单项是否存在
843 855 TradeOrderItemDO orderItem = tradeOrderItemMapper.selectByIdAndUserId(createReqVO.getOrderItemId(), userId);
844 856 if (orderItem == null) {
845 857 throw exception(ORDER_ITEM_NOT_FOUND);
846 858 }
847   - // 校验订单相关状态
  859 + // 1.2 校验订单相关状态
848 860 TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderItem.getOrderId(), userId);
849 861 if (order == null) {
850 862 throw exception(ORDER_NOT_FOUND);
... ... @@ -856,31 +868,91 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
856 868 throw exception(ORDER_COMMENT_STATUS_NOT_FALSE);
857 869 }
858 870  
859   - // 1. 创建评价
860   - ProductCommentCreateReqDTO productCommentCreateReqDTO = TradeOrderConvert.INSTANCE.convert04(createReqVO, orderItem);
861   - Long comment = productCommentApi.createComment(productCommentCreateReqDTO);
  871 + // 2. 创建评价
  872 + Long commentId = createOrderItemComment0(orderItem, createReqVO);
862 873  
863   - // 2. 更新订单项评价状态
864   - tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE));
  874 + // 3. 如果订单项都评论了,则更新订单评价状态
865 875 List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
866 876 if (!anyMatch(orderItems, item -> Objects.equals(item.getCommentStatus(), Boolean.FALSE))) {
867   - tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setCommentStatus(Boolean.TRUE));
868   - // 增加订单日志
  877 + tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setCommentStatus(Boolean.TRUE)
  878 + .setFinishTime(LocalDateTime.now()));
  879 + // 增加订单日志。注意:只有在所有订单项都评价后,才会增加
869 880 TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
870 881 }
871   - return comment;
  882 + return commentId;
  883 + }
  884 +
  885 + @Override
  886 + public int createOrderItemCommentBySystem() {
  887 + // 1. 查询过期的待支付订单
  888 + LocalDateTime expireTime = minusTime(tradeOrderProperties.getCommentExpireTime());
  889 + List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndReceiveTimeLt(
  890 + TradeOrderStatusEnum.COMPLETED.getStatus(), expireTime, false);
  891 + if (CollUtil.isEmpty(orders)) {
  892 + return 0;
  893 + }
  894 +
  895 + // 2. 遍历执行,逐个取消
  896 + int count = 0;
  897 + for (TradeOrderDO order : orders) {
  898 + try {
  899 + getSelf().createOrderItemCommentBySystemBySystem(order);
  900 + count ++;
  901 + } catch (Throwable e) {
  902 + log.error("[createOrderItemCommentBySystem][order({}) 过期订单异常]", order.getId(), e);
  903 + }
  904 + }
  905 + return count;
872 906 }
873 907  
874 908 /**
875   - * 判断指定订单的所有订单项,是不是都售后成功
  909 + * 创建单个订单的评论
876 910 *
877   - * @param id 订单编号
878   - * @return 是否都售后成功
  911 + * @param order 订单
879 912 */
880   - private boolean isAllOrderItemAfterSaleSuccess(Long id) {
881   - List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
882   - return orderItems.stream().allMatch(orderItem -> Objects.equals(orderItem.getAfterSaleStatus(),
883   - TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus()));
  913 + @Transactional(rollbackFor = Exception.class)
  914 + @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_COMMENT)
  915 + public void createOrderItemCommentBySystemBySystem(TradeOrderDO order) {
  916 + // 1. 查询未评论的订单项
  917 + List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderIdAndCommentStatus(order.getId(), Boolean.FALSE);
  918 + if (CollUtil.isEmpty(orderItems)) {
  919 + return;
  920 + }
  921 +
  922 + // 2. 逐个评论
  923 + for (TradeOrderItemDO orderItem : orderItems) {
  924 + // 2.1 创建评价
  925 + AppTradeOrderItemCommentCreateReqVO commentCreateReqVO = new AppTradeOrderItemCommentCreateReqVO()
  926 + .setOrderItemId(orderItem.getId()).setAnonymous(false).setContent("")
  927 + .setBenefitScores(5).setDescriptionScores(5);
  928 + createOrderItemComment0(orderItem, commentCreateReqVO);
  929 +
  930 + // 2.2 更新订单项评价状态
  931 + tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE));
  932 + }
  933 +
  934 + // 3. 所有订单项都评论了,则更新订单评价状态
  935 + tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setCommentStatus(Boolean.TRUE)
  936 + .setFinishTime(LocalDateTime.now()));
  937 + // 增加订单日志。注意:只有在所有订单项都评价后,才会增加
  938 + TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
  939 + }
  940 +
  941 + /**
  942 + * 创建订单项的评论的核心实现
  943 + *
  944 + * @param orderItem 订单项
  945 + * @param createReqVO 评论内容
  946 + * @return 评论编号
  947 + */
  948 + private Long createOrderItemComment0(TradeOrderItemDO orderItem, AppTradeOrderItemCommentCreateReqVO createReqVO) {
  949 + // 1. 创建评价
  950 + ProductCommentCreateReqDTO productCommentCreateReqDTO = TradeOrderConvert.INSTANCE.convert04(createReqVO, orderItem);
  951 + Long commentId = productCommentApi.createComment(productCommentCreateReqDTO);
  952 +
  953 + // 2. 更新订单项评价状态
  954 + tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE));
  955 + return commentId;
884 956 }
885 957  
886 958 // =================== 营销相关的操作 ===================
... ...
yudao-server/src/main/resources/application.yaml
... ... @@ -205,6 +205,7 @@ yudao:
205 205 app-id: 1 # 商户编号
206 206 pay-expire-time: 2h # 支付的过期时间
207 207 receive-expire-time: 14d # 收货的过期时间
  208 + comment-expire-time: 7d # 评论的过期时间
208 209 express:
209 210 client: kd_niao
210 211 kd-niao:
... ...