|  | @@ -221,6 +221,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          } else if (Objects.equals(createReqVO.getDeliveryType(), DeliveryTypeEnum.PICK_UP.getType())) {
 | 
	
		
			
				|  |  |              order.setReceiverName(createReqVO.getReceiverName()).setReceiverMobile(createReqVO.getReceiverMobile());
 | 
	
		
			
				|  |  |              order.setPickUpVerifyCode(RandomUtil.randomNumbers(8)); // 随机一个核销码,长度为 8 位
 | 
	
		
			
				|  |  | +        } else if (Objects.equals(createReqVO.getDeliveryType(), DeliveryTypeEnum.VIRTUAL_PRODUCT.getType())) {
 | 
	
		
			
				|  |  | +            MemberAddressRespDTO address = addressApi.getAddress(createReqVO.getAddressId(), userId);
 | 
	
		
			
				|  |  | +            order.setReceiverName(createReqVO.getReceiverName()).setReceiverMobile(createReqVO.getReceiverMobile())
 | 
	
		
			
				|  |  | +                    .setReceiverDetailAddress(address.getDetailAddress());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return order;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -356,12 +360,19 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |      @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |      @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_DELIVERY)
 | 
	
		
			
				|  |  |      public void deliveryOrder(TradeOrderDeliveryReqVO deliveryReqVO) {
 | 
	
		
			
				|  |  | +        //校验发货信息不能都为空
 | 
	
		
			
				|  |  | +        if(deliveryReqVO.getLogisticsNo() == null && deliveryReqVO.getDeliveryRemark() == null){
 | 
	
		
			
				|  |  | +            throw exception(ORDER_DELIVERY_DETAILS_IS_NULL);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // 1.1 校验并获得交易订单(可发货)
 | 
	
		
			
				|  |  |          TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId());
 | 
	
		
			
				|  |  |          order.setLogisticsId(deliveryReqVO.getLogisticsId());
 | 
	
		
			
				|  |  |          order.setLogisticsNo(deliveryReqVO.getLogisticsNo());
 | 
	
		
			
				|  |  | +        order.setAttachment(deliveryReqVO.getAttachment());
 | 
	
		
			
				|  |  | +        order.setDeliveryRemark(deliveryReqVO.getDeliveryRemark());
 | 
	
		
			
				|  |  |          // 1.2 校验 deliveryType 是否为快递,是快递才可以发货
 | 
	
		
			
				|  |  | -        if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType())) {
 | 
	
		
			
				|  |  | +        if (ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.EXPRESS.getType()) || ObjectUtil.notEqual(order.getDeliveryType(), DeliveryTypeEnum.VIRTUAL_PRODUCT.getType())) {
 | 
	
		
			
				|  |  |              throw exception(ORDER_DELIVERY_FAIL_DELIVERY_TYPE_NOT_EXPRESS);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -369,7 +380,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          TradeOrderDO updateOrderObj = new TradeOrderDO();
 | 
	
		
			
				|  |  |          // 2.1 快递发货
 | 
	
		
			
				|  |  |          DeliveryExpressDO express = null;
 | 
	
		
			
				|  |  | -        if (ObjectUtil.notEqual(deliveryReqVO.getLogisticsId(), TradeOrderDO.LOGISTICS_ID_NULL)) {
 | 
	
		
			
				|  |  | +        if (ObjectUtil.notEqual(deliveryReqVO.getLogisticsId(), TradeOrderDO.LOGISTICS_ID_NULL) && deliveryReqVO.getLogisticsId() != null) {
 | 
	
		
			
				|  |  |              express = deliveryExpressService.validateDeliveryExpress(deliveryReqVO.getLogisticsId());
 | 
	
		
			
				|  |  |              updateOrderObj.setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo());
 | 
	
		
			
				|  |  |          } else {
 | 
	
	
		
			
				|  | @@ -379,7 +390,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  |              //发送订单订阅
 | 
	
		
			
				|  |  | -            testSubscribe(order);
 | 
	
		
			
				|  |  | +            if (deliveryReqVO.getLogisticsId() != null && deliveryReqVO.getLogisticsNo() != null) {
 | 
	
		
			
				|  |  | +                testSubscribe(order);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          } catch (Exception e) {
 | 
	
		
			
				|  |  |              throw new RuntimeException(e);
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -409,616 +422,616 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          params.add(LocalDateTime.now().format(formatter));
 | 
	
		
			
				|  |  |          params.add(tradeOrderItemMapper.getSupNameByOrderId(order.getId()));
 | 
	
		
			
				|  |  |          wcChatMessageUtils.sendWcChatMessage(order.getUserId(), WcChatMessageTemplateIdEnum.ORDER_DELIVERY2.getTemplateId(),
 | 
	
		
			
				|  |  | -                params, null,order.getUserId(), order.getId());
 | 
	
		
			
				|  |  | +                params, null, order.getUserId(), order.getId());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 订阅物流信息
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param order 交易订单对象,包含物流信息和接收人手机号
 | 
	
		
			
				|  |  | - * @throws Exception 抛出异常,可能由于外部服务调用失败等原因
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -private void testSubscribe(TradeOrderDO order) throws Exception {
 | 
	
		
			
				|  |  | -    // 根据物流ID获取配送信息
 | 
	
		
			
				|  |  | -    DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(order.getLogisticsId());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 设置订阅参数,包括回调URL和手机号
 | 
	
		
			
				|  |  | -    SubscribeParameters subscribeParameters = new SubscribeParameters();
 | 
	
		
			
				|  |  | -    subscribeParameters.setCallbackurl("http://47.107.28.221:8002/admin-api/trade/order/callBackUrl?orderId=" + order.getId());
 | 
	
		
			
				|  |  | -    subscribeParameters.setPhone(order.getReceiverMobile());
 | 
	
		
			
				|  |  | -    //添加盐
 | 
	
		
			
				|  |  | -    subscribeParameters.setSalt(order.getLogisticsNo());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 创建订阅参数实例,并设置相关公司代码、物流单号和密钥
 | 
	
		
			
				|  |  | -    SubscribeParam subscribeParam = new SubscribeParam();
 | 
	
		
			
				|  |  | -    subscribeParam.setParameters(subscribeParameters);
 | 
	
		
			
				|  |  | -    subscribeParam.setCompany(deliveryExpress.getCode());
 | 
	
		
			
				|  |  | -    subscribeParam.setNumber(order.getLogisticsNo());
 | 
	
		
			
				|  |  | -    subscribeParam.setKey(key);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 构建订阅请求对象,设置请求模式和参数
 | 
	
		
			
				|  |  | -    SubscribeReq subscribeReq = new SubscribeReq();
 | 
	
		
			
				|  |  | -    subscribeReq.setSchema(ApiInfoConstant.SUBSCRIBE_SCHEMA);
 | 
	
		
			
				|  |  | -    subscribeReq.setParam(new Gson().toJson(subscribeParam));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 调用订阅服务,并打印执行结果
 | 
	
		
			
				|  |  | -    IBaseClient subscribe = new Subscribe();
 | 
	
		
			
				|  |  | -    HttpResult execute = subscribe.execute(subscribeReq);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Gson gson = new Gson();
 | 
	
		
			
				|  |  | -    JsonObject jsonObject = gson.fromJson(execute.getBody(), JsonObject.class);
 | 
	
		
			
				|  |  | -    boolean result = jsonObject.get("result").getAsBoolean();
 | 
	
		
			
				|  |  | -    String returnCode = jsonObject.get("returnCode").getAsString();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (result && returnCode.equals("200")) {
 | 
	
		
			
				|  |  | -        log.info("订单号:{}:订阅成功", order.getNo());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.SUBSCRIBE.getStatus());
 | 
	
		
			
				|  |  | -    } else if (returnCode.equals("600") || returnCode.equals("601")) {
 | 
	
		
			
				|  |  | -        throw exception(NOT_SUFFICIENT_FUNDS);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -        log.info("订单号:{}:订阅失败原因:{}",order.getNo(),jsonObject);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.abnormal.getStatus());
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(order);
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 订阅物流信息
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param order 交易订单对象,包含物流信息和接收人手机号
 | 
	
		
			
				|  |  | +     * @throws Exception 抛出异常,可能由于外部服务调用失败等原因
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private void testSubscribe(TradeOrderDO order) throws Exception {
 | 
	
		
			
				|  |  | +        // 根据物流ID获取配送信息
 | 
	
		
			
				|  |  | +        DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(order.getLogisticsId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 设置订阅参数,包括回调URL和手机号
 | 
	
		
			
				|  |  | +        SubscribeParameters subscribeParameters = new SubscribeParameters();
 | 
	
		
			
				|  |  | +        subscribeParameters.setCallbackurl("http://47.107.28.221:8002/admin-api/trade/order/callBackUrl?orderId=" + order.getId());
 | 
	
		
			
				|  |  | +        subscribeParameters.setPhone(order.getReceiverMobile());
 | 
	
		
			
				|  |  | +        //添加盐
 | 
	
		
			
				|  |  | +        subscribeParameters.setSalt(order.getLogisticsNo());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 创建订阅参数实例,并设置相关公司代码、物流单号和密钥
 | 
	
		
			
				|  |  | +        SubscribeParam subscribeParam = new SubscribeParam();
 | 
	
		
			
				|  |  | +        subscribeParam.setParameters(subscribeParameters);
 | 
	
		
			
				|  |  | +        subscribeParam.setCompany(deliveryExpress.getCode());
 | 
	
		
			
				|  |  | +        subscribeParam.setNumber(order.getLogisticsNo());
 | 
	
		
			
				|  |  | +        subscribeParam.setKey(key);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 构建订阅请求对象,设置请求模式和参数
 | 
	
		
			
				|  |  | +        SubscribeReq subscribeReq = new SubscribeReq();
 | 
	
		
			
				|  |  | +        subscribeReq.setSchema(ApiInfoConstant.SUBSCRIBE_SCHEMA);
 | 
	
		
			
				|  |  | +        subscribeReq.setParam(new Gson().toJson(subscribeParam));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 调用订阅服务,并打印执行结果
 | 
	
		
			
				|  |  | +        IBaseClient subscribe = new Subscribe();
 | 
	
		
			
				|  |  | +        HttpResult execute = subscribe.execute(subscribeReq);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Gson gson = new Gson();
 | 
	
		
			
				|  |  | +        JsonObject jsonObject = gson.fromJson(execute.getBody(), JsonObject.class);
 | 
	
		
			
				|  |  | +        boolean result = jsonObject.get("result").getAsBoolean();
 | 
	
		
			
				|  |  | +        String returnCode = jsonObject.get("returnCode").getAsString();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (result && returnCode.equals("200")) {
 | 
	
		
			
				|  |  | +            log.info("订单号:{}:订阅成功", order.getNo());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.SUBSCRIBE.getStatus());
 | 
	
		
			
				|  |  | +        } else if (returnCode.equals("600") || returnCode.equals("601")) {
 | 
	
		
			
				|  |  | +            throw exception(NOT_SUFFICIENT_FUNDS);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            log.info("订单号:{}:订阅失败原因:{}", order.getNo(), jsonObject);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +            order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.abnormal.getStatus());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(order);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 校验交易订单满足被发货的条件
 | 
	
		
			
				|  |  | - * <p>
 | 
	
		
			
				|  |  | - * 1. 交易订单未发货
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param id 交易订单编号
 | 
	
		
			
				|  |  | - * @return 交易订单
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -private TradeOrderDO validateOrderDeliverable(Long id) {
 | 
	
		
			
				|  |  | -    TradeOrderDO order = validateOrderExists(id);
 | 
	
		
			
				|  |  | -    // 1. 校验订单是否未发货
 | 
	
		
			
				|  |  | -    if (ObjectUtil.notEqual(TradeOrderRefundStatusEnum.NONE.getStatus(), order.getRefundStatus())) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 执行 TradeOrderHandler 前置处理
 | 
	
		
			
				|  |  | -    tradeOrderHandlers.forEach(handler -> handler.beforeDeliveryOrder(order));
 | 
	
		
			
				|  |  | -    return order;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 校验交易订单满足被发货的条件
 | 
	
		
			
				|  |  | +     * <p>
 | 
	
		
			
				|  |  | +     * 1. 交易订单未发货
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param id 交易订单编号
 | 
	
		
			
				|  |  | +     * @return 交易订单
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private TradeOrderDO validateOrderDeliverable(Long id) {
 | 
	
		
			
				|  |  | +        TradeOrderDO order = validateOrderExists(id);
 | 
	
		
			
				|  |  | +        // 1. 校验订单是否未发货
 | 
	
		
			
				|  |  | +        if (ObjectUtil.notEqual(TradeOrderRefundStatusEnum.NONE.getStatus(), order.getRefundStatus())) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@NotNull
 | 
	
		
			
				|  |  | -private TradeOrderDO validateOrderExists(Long id) {
 | 
	
		
			
				|  |  | -    // 校验订单是否存在
 | 
	
		
			
				|  |  | -    TradeOrderDO order = tradeOrderMapper.selectById(id);
 | 
	
		
			
				|  |  | -    if (order == null) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        // 2. 执行 TradeOrderHandler 前置处理
 | 
	
		
			
				|  |  | +        tradeOrderHandlers.forEach(handler -> handler.beforeDeliveryOrder(order));
 | 
	
		
			
				|  |  | +        return order;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    return order;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_RECEIVE)
 | 
	
		
			
				|  |  | -public void receiveOrderByMember(Long userId, Long id) {
 | 
	
		
			
				|  |  | -    // 校验并获得交易订单(可收货)
 | 
	
		
			
				|  |  | -    TradeOrderDO order = validateOrderReceivable(userId, id);
 | 
	
		
			
				|  |  | +    @NotNull
 | 
	
		
			
				|  |  | +    private TradeOrderDO validateOrderExists(Long id) {
 | 
	
		
			
				|  |  | +        // 校验订单是否存在
 | 
	
		
			
				|  |  | +        TradeOrderDO order = tradeOrderMapper.selectById(id);
 | 
	
		
			
				|  |  | +        if (order == null) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return order;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 收货订单
 | 
	
		
			
				|  |  | -    receiveOrder0(order);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_RECEIVE)
 | 
	
		
			
				|  |  | +    public void receiveOrderByMember(Long userId, Long id) {
 | 
	
		
			
				|  |  | +        // 校验并获得交易订单(可收货)
 | 
	
		
			
				|  |  | +        TradeOrderDO order = validateOrderReceivable(userId, id);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -public int receiveOrderBySystem() {
 | 
	
		
			
				|  |  | -    // 1. 查询过期的待支付订单
 | 
	
		
			
				|  |  | -    LocalDateTime expireTime = minusTime(tradeOrderProperties.getReceiveExpireTime());
 | 
	
		
			
				|  |  | -    List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndDeliveryTimeLt(
 | 
	
		
			
				|  |  | -            TradeOrderStatusEnum.DELIVERED.getStatus(), expireTime);
 | 
	
		
			
				|  |  | -    if (CollUtil.isEmpty(orders)) {
 | 
	
		
			
				|  |  | -        return 0;
 | 
	
		
			
				|  |  | +        // 收货订单
 | 
	
		
			
				|  |  | +        receiveOrder0(order);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 遍历执行,逐个取消
 | 
	
		
			
				|  |  | -    int count = 0;
 | 
	
		
			
				|  |  | -    for (TradeOrderDO order : orders) {
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            getSelf().receiveOrderBySystem(order);
 | 
	
		
			
				|  |  | -            count++;
 | 
	
		
			
				|  |  | -        } catch (Throwable e) {
 | 
	
		
			
				|  |  | -            log.error("[receiveOrderBySystem][order({}) 自动收货订单异常]", order.getId(), e);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public int receiveOrderBySystem() {
 | 
	
		
			
				|  |  | +        // 1. 查询过期的待支付订单
 | 
	
		
			
				|  |  | +        LocalDateTime expireTime = minusTime(tradeOrderProperties.getReceiveExpireTime());
 | 
	
		
			
				|  |  | +        List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndDeliveryTimeLt(
 | 
	
		
			
				|  |  | +                TradeOrderStatusEnum.DELIVERED.getStatus(), expireTime);
 | 
	
		
			
				|  |  | +        if (CollUtil.isEmpty(orders)) {
 | 
	
		
			
				|  |  | +            return 0;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return count;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 自动收货单个订单
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param order 订单
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_RECEIVE)
 | 
	
		
			
				|  |  | -public void receiveOrderBySystem(TradeOrderDO order) {
 | 
	
		
			
				|  |  | -    receiveOrder0(order);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +        // 2. 遍历执行,逐个取消
 | 
	
		
			
				|  |  | +        int count = 0;
 | 
	
		
			
				|  |  | +        for (TradeOrderDO order : orders) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                getSelf().receiveOrderBySystem(order);
 | 
	
		
			
				|  |  | +                count++;
 | 
	
		
			
				|  |  | +            } catch (Throwable e) {
 | 
	
		
			
				|  |  | +                log.error("[receiveOrderBySystem][order({}) 自动收货订单异常]", order.getId(), e);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return count;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 收货订单的核心实现
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param order 订单
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -private void receiveOrder0(TradeOrderDO order) {
 | 
	
		
			
				|  |  | -    // 更新 TradeOrderDO 状态为已完成
 | 
	
		
			
				|  |  | -    int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(),
 | 
	
		
			
				|  |  | -            new TradeOrderDO().setStatus(TradeOrderStatusEnum.COMPLETED.getStatus()).setReceiveTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  | -    if (updateCount == 0) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED);
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 自动收货单个订单
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param order 订单
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_RECEIVE)
 | 
	
		
			
				|  |  | +    public void receiveOrderBySystem(TradeOrderDO order) {
 | 
	
		
			
				|  |  | +        receiveOrder0(order);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 插入订单日志
 | 
	
		
			
				|  |  | -    TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.COMPLETED.getStatus());
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 收货订单的核心实现
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param order 订单
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private void receiveOrder0(TradeOrderDO order) {
 | 
	
		
			
				|  |  | +        // 更新 TradeOrderDO 状态为已完成
 | 
	
		
			
				|  |  | +        int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(),
 | 
	
		
			
				|  |  | +                new TradeOrderDO().setStatus(TradeOrderStatusEnum.COMPLETED.getStatus()).setReceiveTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  | +        if (updateCount == 0) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 校验交易订单满足可售货的条件
 | 
	
		
			
				|  |  | - * <p>
 | 
	
		
			
				|  |  | - * 1. 交易订单待收货
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param userId 用户编号
 | 
	
		
			
				|  |  | - * @param id     交易订单编号
 | 
	
		
			
				|  |  | - * @return 交易订单
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -private TradeOrderDO validateOrderReceivable(Long userId, Long id) {
 | 
	
		
			
				|  |  | -    // 校验订单是否存在
 | 
	
		
			
				|  |  | -    TradeOrderDO order = tradeOrderMapper.selectByIdAndUserId(id, userId);
 | 
	
		
			
				|  |  | -    if (order == null) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    // 校验订单是否是待收货状态
 | 
	
		
			
				|  |  | -    if (!TradeOrderStatusEnum.isDelivered(order.getStatus())) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED);
 | 
	
		
			
				|  |  | +        // 插入订单日志
 | 
	
		
			
				|  |  | +        TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.COMPLETED.getStatus());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    return order;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_CANCEL)
 | 
	
		
			
				|  |  | -public void cancelOrderByMember(Long userId, Long id) {
 | 
	
		
			
				|  |  | -    // 1.1 校验存在
 | 
	
		
			
				|  |  | -    TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(id, userId);
 | 
	
		
			
				|  |  | -    if (order == null) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    // 1.2 校验状态
 | 
	
		
			
				|  |  | -    if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.UNPAID.getStatus())) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID);
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 校验交易订单满足可售货的条件
 | 
	
		
			
				|  |  | +     * <p>
 | 
	
		
			
				|  |  | +     * 1. 交易订单待收货
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param userId 用户编号
 | 
	
		
			
				|  |  | +     * @param id     交易订单编号
 | 
	
		
			
				|  |  | +     * @return 交易订单
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private TradeOrderDO validateOrderReceivable(Long userId, Long id) {
 | 
	
		
			
				|  |  | +        // 校验订单是否存在
 | 
	
		
			
				|  |  | +        TradeOrderDO order = tradeOrderMapper.selectByIdAndUserId(id, userId);
 | 
	
		
			
				|  |  | +        if (order == null) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 校验订单是否是待收货状态
 | 
	
		
			
				|  |  | +        if (!TradeOrderStatusEnum.isDelivered(order.getStatus())) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_RECEIVE_FAIL_STATUS_NOT_DELIVERED);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return order;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 取消订单
 | 
	
		
			
				|  |  | -    cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_CANCEL)
 | 
	
		
			
				|  |  | +    public void cancelOrderByMember(Long userId, Long id) {
 | 
	
		
			
				|  |  | +        // 1.1 校验存在
 | 
	
		
			
				|  |  | +        TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(id, userId);
 | 
	
		
			
				|  |  | +        if (order == null) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 1.2 校验状态
 | 
	
		
			
				|  |  | +        if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.UNPAID.getStatus())) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -public int cancelOrderBySystem() {
 | 
	
		
			
				|  |  | -    // 1. 查询过期的待支付订单
 | 
	
		
			
				|  |  | -    LocalDateTime expireTime = minusTime(tradeOrderProperties.getPayExpireTime());
 | 
	
		
			
				|  |  | -    List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndCreateTimeLt(
 | 
	
		
			
				|  |  | -            TradeOrderStatusEnum.UNPAID.getStatus(), expireTime);
 | 
	
		
			
				|  |  | -    if (CollUtil.isEmpty(orders)) {
 | 
	
		
			
				|  |  | -        return 0;
 | 
	
		
			
				|  |  | +        // 2. 取消订单
 | 
	
		
			
				|  |  | +        cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 遍历执行,逐个取消
 | 
	
		
			
				|  |  | -    int count = 0;
 | 
	
		
			
				|  |  | -    for (TradeOrderDO order : orders) {
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            getSelf().cancelOrderBySystem(order);
 | 
	
		
			
				|  |  | -            count++;
 | 
	
		
			
				|  |  | -        } catch (Throwable e) {
 | 
	
		
			
				|  |  | -            log.error("[cancelOrderBySystem][order({}) 过期订单异常]", order.getId(), e);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public int cancelOrderBySystem() {
 | 
	
		
			
				|  |  | +        // 1. 查询过期的待支付订单
 | 
	
		
			
				|  |  | +        LocalDateTime expireTime = minusTime(tradeOrderProperties.getPayExpireTime());
 | 
	
		
			
				|  |  | +        List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndCreateTimeLt(
 | 
	
		
			
				|  |  | +                TradeOrderStatusEnum.UNPAID.getStatus(), expireTime);
 | 
	
		
			
				|  |  | +        if (CollUtil.isEmpty(orders)) {
 | 
	
		
			
				|  |  | +            return 0;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return count;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 自动取消单个订单
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param order 订单
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_CANCEL)
 | 
	
		
			
				|  |  | -public void cancelOrderBySystem(TradeOrderDO order) {
 | 
	
		
			
				|  |  | -    cancelOrder0(order, TradeOrderCancelTypeEnum.PAY_TIMEOUT);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +        // 2. 遍历执行,逐个取消
 | 
	
		
			
				|  |  | +        int count = 0;
 | 
	
		
			
				|  |  | +        for (TradeOrderDO order : orders) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                getSelf().cancelOrderBySystem(order);
 | 
	
		
			
				|  |  | +                count++;
 | 
	
		
			
				|  |  | +            } catch (Throwable e) {
 | 
	
		
			
				|  |  | +                log.error("[cancelOrderBySystem][order({}) 过期订单异常]", order.getId(), e);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return count;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 取消订单的核心实现
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param order      订单
 | 
	
		
			
				|  |  | - * @param cancelType 取消类型
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -private void cancelOrder0(TradeOrderDO order, TradeOrderCancelTypeEnum cancelType) {
 | 
	
		
			
				|  |  | -    // 1. 更新 TradeOrderDO 状态为已取消
 | 
	
		
			
				|  |  | -    int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(),
 | 
	
		
			
				|  |  | -            new TradeOrderDO().setStatus(TradeOrderStatusEnum.CANCELED.getStatus())
 | 
	
		
			
				|  |  | -                    .setCancelType(cancelType.getType()).setCancelTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  | -    if (updateCount == 0) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID);
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 自动取消单个订单
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param order 订单
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_CANCEL)
 | 
	
		
			
				|  |  | +    public void cancelOrderBySystem(TradeOrderDO order) {
 | 
	
		
			
				|  |  | +        cancelOrder0(order, TradeOrderCancelTypeEnum.PAY_TIMEOUT);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 执行 TradeOrderHandler 的后置处理
 | 
	
		
			
				|  |  | -    List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
	
		
			
				|  |  | -    tradeOrderHandlers.forEach(handler -> handler.afterCancelOrder(order, orderItems));
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 取消订单的核心实现
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param order      订单
 | 
	
		
			
				|  |  | +     * @param cancelType 取消类型
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private void cancelOrder0(TradeOrderDO order, TradeOrderCancelTypeEnum cancelType) {
 | 
	
		
			
				|  |  | +        // 1. 更新 TradeOrderDO 状态为已取消
 | 
	
		
			
				|  |  | +        int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(),
 | 
	
		
			
				|  |  | +                new TradeOrderDO().setStatus(TradeOrderStatusEnum.CANCELED.getStatus())
 | 
	
		
			
				|  |  | +                        .setCancelType(cancelType.getType()).setCancelTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  | +        if (updateCount == 0) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 3. 增加订单日志
 | 
	
		
			
				|  |  | -    TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus());
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +        // 2. 执行 TradeOrderHandler 的后置处理
 | 
	
		
			
				|  |  | +        List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
	
		
			
				|  |  | +        tradeOrderHandlers.forEach(handler -> handler.afterCancelOrder(order, orderItems));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 如果金额全部被退款,则取消订单
 | 
	
		
			
				|  |  | - * 如果还有未被退款的金额,则无需取消订单
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param order       订单
 | 
	
		
			
				|  |  | - * @param refundPrice 退款金额
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_CANCEL_AFTER_SALE)
 | 
	
		
			
				|  |  | -public void cancelOrderByAfterSale(TradeOrderDO order, Integer refundPrice) {
 | 
	
		
			
				|  |  | -    // 1. 更新订单
 | 
	
		
			
				|  |  | -    if (refundPrice < order.getPayPrice()) {
 | 
	
		
			
				|  |  | -        return;
 | 
	
		
			
				|  |  | +        // 3. 增加订单日志
 | 
	
		
			
				|  |  | +        TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
 | 
	
		
			
				|  |  | -            .setStatus(TradeOrderStatusEnum.CANCELED.getStatus())
 | 
	
		
			
				|  |  | -            .setCancelType(TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE.getType()).setCancelTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 执行 TradeOrderHandler 的后置处理
 | 
	
		
			
				|  |  | -    List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
	
		
			
				|  |  | -    tradeOrderHandlers.forEach(handler -> handler.afterCancelOrder(order, orderItems));
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 如果金额全部被退款,则取消订单
 | 
	
		
			
				|  |  | +     * 如果还有未被退款的金额,则无需取消订单
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param order       订单
 | 
	
		
			
				|  |  | +     * @param refundPrice 退款金额
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_CANCEL_AFTER_SALE)
 | 
	
		
			
				|  |  | +    public void cancelOrderByAfterSale(TradeOrderDO order, Integer refundPrice) {
 | 
	
		
			
				|  |  | +        // 1. 更新订单
 | 
	
		
			
				|  |  | +        if (refundPrice < order.getPayPrice()) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
 | 
	
		
			
				|  |  | +                .setStatus(TradeOrderStatusEnum.CANCELED.getStatus())
 | 
	
		
			
				|  |  | +                .setCancelType(TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE.getType()).setCancelTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_DELETE)
 | 
	
		
			
				|  |  | -public void deleteOrder(Long userId, Long id) {
 | 
	
		
			
				|  |  | -    // 1.1 校验存在
 | 
	
		
			
				|  |  | -    TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(id, userId);
 | 
	
		
			
				|  |  | -    if (order == null) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        // 2. 执行 TradeOrderHandler 的后置处理
 | 
	
		
			
				|  |  | +        List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
	
		
			
				|  |  | +        tradeOrderHandlers.forEach(handler -> handler.afterCancelOrder(order, orderItems));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    // 1.2 校验状态
 | 
	
		
			
				|  |  | -    if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus())) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_DELETE_FAIL_STATUS_NOT_CANCEL);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    // 2. 删除订单
 | 
	
		
			
				|  |  | -    tradeOrderMapper.deleteById(id);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 3. 记录日志
 | 
	
		
			
				|  |  | -    TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_DELETE)
 | 
	
		
			
				|  |  | +    public void deleteOrder(Long userId, Long id) {
 | 
	
		
			
				|  |  | +        // 1.1 校验存在
 | 
	
		
			
				|  |  | +        TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(id, userId);
 | 
	
		
			
				|  |  | +        if (order == null) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 1.2 校验状态
 | 
	
		
			
				|  |  | +        if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus())) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_DELETE_FAIL_STATUS_NOT_CANCEL);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 2. 删除订单
 | 
	
		
			
				|  |  | +        tradeOrderMapper.deleteById(id);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -public void updateOrderRemark(TradeOrderRemarkReqVO reqVO) {
 | 
	
		
			
				|  |  | -    // 校验并获得交易订单
 | 
	
		
			
				|  |  | -    validateOrderExists(reqVO.getId());
 | 
	
		
			
				|  |  | +        // 3. 记录日志
 | 
	
		
			
				|  |  | +        TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 更新
 | 
	
		
			
				|  |  | -    TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(reqVO);
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(order);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void updateOrderRemark(TradeOrderRemarkReqVO reqVO) {
 | 
	
		
			
				|  |  | +        // 校验并获得交易订单
 | 
	
		
			
				|  |  | +        validateOrderExists(reqVO.getId());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_UPDATE_PRICE)
 | 
	
		
			
				|  |  | -public void updateOrderPrice(TradeOrderUpdatePriceReqVO reqVO) {
 | 
	
		
			
				|  |  | -    // 1.1 校验交易订单
 | 
	
		
			
				|  |  | -    TradeOrderDO order = validateOrderExists(reqVO.getId());
 | 
	
		
			
				|  |  | -    if (order.getPayStatus()) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_UPDATE_PRICE_FAIL_PAID);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    // 1.2 校验调价金额是否变化
 | 
	
		
			
				|  |  | -    if (order.getAdjustPrice() > 0) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_UPDATE_PRICE_FAIL_ALREADY);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    // 1.3 支付价格不能为 0
 | 
	
		
			
				|  |  | -    int newPayPrice = order.getPayPrice() + order.getAdjustPrice();
 | 
	
		
			
				|  |  | -    if (newPayPrice <= 0) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_UPDATE_PRICE_FAIL_PRICE_ERROR);
 | 
	
		
			
				|  |  | +        // 更新
 | 
	
		
			
				|  |  | +        TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(reqVO);
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(order);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 更新订单
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
 | 
	
		
			
				|  |  | -            .setAdjustPrice(reqVO.getAdjustPrice()).setPayPrice(newPayPrice));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 3. 更新 TradeOrderItem,需要做 adjustPrice 的分摊
 | 
	
		
			
				|  |  | -    List<TradeOrderItemDO> orderOrderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
	
		
			
				|  |  | -    List<Integer> dividePrices = TradePriceCalculatorHelper.dividePrice2(orderOrderItems, newPayPrice);
 | 
	
		
			
				|  |  | -    List<TradeOrderItemDO> updateItems = new ArrayList<>();
 | 
	
		
			
				|  |  | -    for (int i = 0; i < orderOrderItems.size(); i++) {
 | 
	
		
			
				|  |  | -        TradeOrderItemDO item = orderOrderItems.get(i);
 | 
	
		
			
				|  |  | -        updateItems.add(new TradeOrderItemDO().setId(item.getId()).setAdjustPrice(dividePrices.get(i))
 | 
	
		
			
				|  |  | -                .setPayPrice(item.getPayPrice() + dividePrices.get(i)));
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    tradeOrderItemMapper.updateBatch(updateItems);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_UPDATE_PRICE)
 | 
	
		
			
				|  |  | +    public void updateOrderPrice(TradeOrderUpdatePriceReqVO reqVO) {
 | 
	
		
			
				|  |  | +        // 1.1 校验交易订单
 | 
	
		
			
				|  |  | +        TradeOrderDO order = validateOrderExists(reqVO.getId());
 | 
	
		
			
				|  |  | +        if (order.getPayStatus()) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_UPDATE_PRICE_FAIL_PAID);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 1.2 校验调价金额是否变化
 | 
	
		
			
				|  |  | +        if (order.getAdjustPrice() > 0) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_UPDATE_PRICE_FAIL_ALREADY);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 1.3 支付价格不能为 0
 | 
	
		
			
				|  |  | +        int newPayPrice = order.getPayPrice() + order.getAdjustPrice();
 | 
	
		
			
				|  |  | +        if (newPayPrice <= 0) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_UPDATE_PRICE_FAIL_PRICE_ERROR);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 4. 更新支付订单
 | 
	
		
			
				|  |  | -    payOrderApi.updatePayOrderPrice(order.getPayOrderId(), newPayPrice);
 | 
	
		
			
				|  |  | +        // 2. 更新订单
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
 | 
	
		
			
				|  |  | +                .setAdjustPrice(reqVO.getAdjustPrice()).setPayPrice(newPayPrice));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 3. 更新 TradeOrderItem,需要做 adjustPrice 的分摊
 | 
	
		
			
				|  |  | +        List<TradeOrderItemDO> orderOrderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
	
		
			
				|  |  | +        List<Integer> dividePrices = TradePriceCalculatorHelper.dividePrice2(orderOrderItems, newPayPrice);
 | 
	
		
			
				|  |  | +        List<TradeOrderItemDO> updateItems = new ArrayList<>();
 | 
	
		
			
				|  |  | +        for (int i = 0; i < orderOrderItems.size(); i++) {
 | 
	
		
			
				|  |  | +            TradeOrderItemDO item = orderOrderItems.get(i);
 | 
	
		
			
				|  |  | +            updateItems.add(new TradeOrderItemDO().setId(item.getId()).setAdjustPrice(dividePrices.get(i))
 | 
	
		
			
				|  |  | +                    .setPayPrice(item.getPayPrice() + dividePrices.get(i)));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        tradeOrderItemMapper.updateBatch(updateItems);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 5. 记录订单日志
 | 
	
		
			
				|  |  | -    TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus(),
 | 
	
		
			
				|  |  | -            MapUtil.<String, Object>builder().put("oldPayPrice", MoneyUtils.fenToYuanStr(order.getPayPrice()))
 | 
	
		
			
				|  |  | -                    .put("newPayPrice", MoneyUtils.fenToYuanStr(newPayPrice)).build());
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +        // 4. 更新支付订单
 | 
	
		
			
				|  |  | +        payOrderApi.updatePayOrderPrice(order.getPayOrderId(), newPayPrice);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_UPDATE_ADDRESS)
 | 
	
		
			
				|  |  | -public void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO) {
 | 
	
		
			
				|  |  | -    // 校验交易订单
 | 
	
		
			
				|  |  | -    TradeOrderDO order = validateOrderExists(reqVO.getId());
 | 
	
		
			
				|  |  | -    // 只有待发货状态,才可以修改订单收货地址;
 | 
	
		
			
				|  |  | -    if (!TradeOrderStatusEnum.isUndelivered(order.getStatus())) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_UPDATE_ADDRESS_FAIL_STATUS_NOT_DELIVERED);
 | 
	
		
			
				|  |  | +        // 5. 记录订单日志
 | 
	
		
			
				|  |  | +        TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus(),
 | 
	
		
			
				|  |  | +                MapUtil.<String, Object>builder().put("oldPayPrice", MoneyUtils.fenToYuanStr(order.getPayPrice()))
 | 
	
		
			
				|  |  | +                        .put("newPayPrice", MoneyUtils.fenToYuanStr(newPayPrice)).build());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 更新
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(TradeOrderConvert.INSTANCE.convert(reqVO));
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_UPDATE_ADDRESS)
 | 
	
		
			
				|  |  | +    public void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO) {
 | 
	
		
			
				|  |  | +        // 校验交易订单
 | 
	
		
			
				|  |  | +        TradeOrderDO order = validateOrderExists(reqVO.getId());
 | 
	
		
			
				|  |  | +        // 只有待发货状态,才可以修改订单收货地址;
 | 
	
		
			
				|  |  | +        if (!TradeOrderStatusEnum.isUndelivered(order.getStatus())) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_UPDATE_ADDRESS_FAIL_STATUS_NOT_DELIVERED);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 记录订单日志
 | 
	
		
			
				|  |  | -    TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +        // 更新
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(TradeOrderConvert.INSTANCE.convert(reqVO));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_PICK_UP_RECEIVE)
 | 
	
		
			
				|  |  | -public void pickUpOrderByAdmin(Long id) {
 | 
	
		
			
				|  |  | -    getSelf().pickUpOrder(tradeOrderMapper.selectById(id));
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +        // 记录订单日志
 | 
	
		
			
				|  |  | +        TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_PICK_UP_RECEIVE)
 | 
	
		
			
				|  |  | -public void pickUpOrderByAdmin(String pickUpVerifyCode) {
 | 
	
		
			
				|  |  | -    getSelf().pickUpOrder(tradeOrderMapper.selectOneByPickUpVerifyCode(pickUpVerifyCode));
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_PICK_UP_RECEIVE)
 | 
	
		
			
				|  |  | +    public void pickUpOrderByAdmin(Long id) {
 | 
	
		
			
				|  |  | +        getSelf().pickUpOrder(tradeOrderMapper.selectById(id));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -public TradeOrderDO getByPickUpVerifyCode(String pickUpVerifyCode) {
 | 
	
		
			
				|  |  | -    return tradeOrderMapper.selectOneByPickUpVerifyCode(pickUpVerifyCode);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ADMIN_PICK_UP_RECEIVE)
 | 
	
		
			
				|  |  | +    public void pickUpOrderByAdmin(String pickUpVerifyCode) {
 | 
	
		
			
				|  |  | +        getSelf().pickUpOrder(tradeOrderMapper.selectOneByPickUpVerifyCode(pickUpVerifyCode));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -public void pickUpOrder(TradeOrderDO order) {
 | 
	
		
			
				|  |  | -    if (order == null) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public TradeOrderDO getByPickUpVerifyCode(String pickUpVerifyCode) {
 | 
	
		
			
				|  |  | +        return tradeOrderMapper.selectOneByPickUpVerifyCode(pickUpVerifyCode);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if (ObjUtil.notEqual(DeliveryTypeEnum.PICK_UP.getType(), order.getDeliveryType())) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_RECEIVE_FAIL_DELIVERY_TYPE_NOT_PICK_UP);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void pickUpOrder(TradeOrderDO order) {
 | 
	
		
			
				|  |  | +        if (order == null) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (ObjUtil.notEqual(DeliveryTypeEnum.PICK_UP.getType(), order.getDeliveryType())) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_RECEIVE_FAIL_DELIVERY_TYPE_NOT_PICK_UP);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        receiveOrder0(order);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    receiveOrder0(order);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // =================== Order Item ===================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -public void updateOrderItemWhenAfterSaleCreate(Long id, Long afterSaleId) {
 | 
	
		
			
				|  |  | -    // 更新订单项
 | 
	
		
			
				|  |  | -    updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.NONE.getStatus(),
 | 
	
		
			
				|  |  | -            TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), afterSaleId);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -public void updateOrderItemWhenAfterSaleSuccess(Long id, Integer refundPrice) {
 | 
	
		
			
				|  |  | -    // 1.1 更新订单项
 | 
	
		
			
				|  |  | -    updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(),
 | 
	
		
			
				|  |  | -            TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus(), null);
 | 
	
		
			
				|  |  | -    // 1.2 执行 TradeOrderHandler 的后置处理
 | 
	
		
			
				|  |  | -    TradeOrderItemDO orderItem = tradeOrderItemMapper.selectById(id);
 | 
	
		
			
				|  |  | -    TradeOrderDO order = tradeOrderMapper.selectById(orderItem.getOrderId());
 | 
	
		
			
				|  |  | -    tradeOrderHandlers.forEach(handler -> handler.afterCancelOrderItem(order, orderItem));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 2.1 更新订单的退款金额、积分
 | 
	
		
			
				|  |  | -    Integer orderRefundPrice = order.getRefundPrice() + refundPrice;
 | 
	
		
			
				|  |  | -    Integer orderRefundPoint = order.getRefundPoint() + orderItem.getUsePoint();
 | 
	
		
			
				|  |  | -    Integer refundStatus = isAllOrderItemAfterSaleSuccess(order.getId()) ?
 | 
	
		
			
				|  |  | -            TradeOrderRefundStatusEnum.ALL.getStatus() // 如果都售后成功,则需要取消订单
 | 
	
		
			
				|  |  | -            : TradeOrderRefundStatusEnum.PART.getStatus();
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
 | 
	
		
			
				|  |  | -            .setRefundStatus(refundStatus)
 | 
	
		
			
				|  |  | -            .setRefundPrice(orderRefundPrice).setRefundPoint(orderRefundPoint));
 | 
	
		
			
				|  |  | -    // 2.2 如果全部退款,则进行取消订单
 | 
	
		
			
				|  |  | -    getSelf().cancelOrderByAfterSale(order, orderRefundPrice);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -public void updateOrderItemWhenAfterSaleCancel(Long id) {
 | 
	
		
			
				|  |  | -    // 更新订单项
 | 
	
		
			
				|  |  | -    updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(),
 | 
	
		
			
				|  |  | -            TradeOrderItemAfterSaleStatusEnum.NONE.getStatus(), null);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void updateOrderItemWhenAfterSaleCreate(Long id, Long afterSaleId) {
 | 
	
		
			
				|  |  | +        // 更新订单项
 | 
	
		
			
				|  |  | +        updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.NONE.getStatus(),
 | 
	
		
			
				|  |  | +                TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), afterSaleId);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -private void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus,
 | 
	
		
			
				|  |  | -                                            Long afterSaleId) {
 | 
	
		
			
				|  |  | -    // 更新订单项
 | 
	
		
			
				|  |  | -    int updateCount = tradeOrderItemMapper.updateAfterSaleStatus(id, oldAfterSaleStatus, newAfterSaleStatus, afterSaleId);
 | 
	
		
			
				|  |  | -    if (updateCount <= 0) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_ITEM_UPDATE_AFTER_SALE_STATUS_FAIL);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void updateOrderItemWhenAfterSaleSuccess(Long id, Integer refundPrice) {
 | 
	
		
			
				|  |  | +        // 1.1 更新订单项
 | 
	
		
			
				|  |  | +        updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(),
 | 
	
		
			
				|  |  | +                TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus(), null);
 | 
	
		
			
				|  |  | +        // 1.2 执行 TradeOrderHandler 的后置处理
 | 
	
		
			
				|  |  | +        TradeOrderItemDO orderItem = tradeOrderItemMapper.selectById(id);
 | 
	
		
			
				|  |  | +        TradeOrderDO order = tradeOrderMapper.selectById(orderItem.getOrderId());
 | 
	
		
			
				|  |  | +        tradeOrderHandlers.forEach(handler -> handler.afterCancelOrderItem(order, orderItem));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 2.1 更新订单的退款金额、积分
 | 
	
		
			
				|  |  | +        Integer orderRefundPrice = order.getRefundPrice() + refundPrice;
 | 
	
		
			
				|  |  | +        Integer orderRefundPoint = order.getRefundPoint() + orderItem.getUsePoint();
 | 
	
		
			
				|  |  | +        Integer refundStatus = isAllOrderItemAfterSaleSuccess(order.getId()) ?
 | 
	
		
			
				|  |  | +                TradeOrderRefundStatusEnum.ALL.getStatus() // 如果都售后成功,则需要取消订单
 | 
	
		
			
				|  |  | +                : TradeOrderRefundStatusEnum.PART.getStatus();
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId())
 | 
	
		
			
				|  |  | +                .setRefundStatus(refundStatus)
 | 
	
		
			
				|  |  | +                .setRefundPrice(orderRefundPrice).setRefundPoint(orderRefundPoint));
 | 
	
		
			
				|  |  | +        // 2.2 如果全部退款,则进行取消订单
 | 
	
		
			
				|  |  | +        getSelf().cancelOrderByAfterSale(order, orderRefundPrice);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void updateOrderItemWhenAfterSaleCancel(Long id) {
 | 
	
		
			
				|  |  | +        // 更新订单项
 | 
	
		
			
				|  |  | +        updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(),
 | 
	
		
			
				|  |  | +                TradeOrderItemAfterSaleStatusEnum.NONE.getStatus(), null);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 判断指定订单的所有订单项,是不是都售后成功
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param id 订单编号
 | 
	
		
			
				|  |  | - * @return 是否都售后成功
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -private boolean isAllOrderItemAfterSaleSuccess(Long id) {
 | 
	
		
			
				|  |  | -    List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
 | 
	
		
			
				|  |  | -    return orderItems.stream().allMatch(orderItem -> Objects.equals(orderItem.getAfterSaleStatus(),
 | 
	
		
			
				|  |  | -            TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus()));
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    private void updateOrderItemAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus,
 | 
	
		
			
				|  |  | +                                                Long afterSaleId) {
 | 
	
		
			
				|  |  | +        // 更新订单项
 | 
	
		
			
				|  |  | +        int updateCount = tradeOrderItemMapper.updateAfterSaleStatus(id, oldAfterSaleStatus, newAfterSaleStatus, afterSaleId);
 | 
	
		
			
				|  |  | +        if (updateCount <= 0) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_ITEM_UPDATE_AFTER_SALE_STATUS_FAIL);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_COMMENT)
 | 
	
		
			
				|  |  | -public Long createOrderItemCommentByMember(Long userId, AppTradeOrderItemCommentCreateReqVO createReqVO) {
 | 
	
		
			
				|  |  | -    // 1.1 先通过订单项 ID,查询订单项是否存在
 | 
	
		
			
				|  |  | -    TradeOrderItemDO orderItem = tradeOrderItemMapper.selectByIdAndUserId(createReqVO.getOrderItemId(), userId);
 | 
	
		
			
				|  |  | -    if (orderItem == null) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_ITEM_NOT_FOUND);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    // 1.2 校验订单相关状态
 | 
	
		
			
				|  |  | -    TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderItem.getOrderId(), userId);
 | 
	
		
			
				|  |  | -    if (order == null) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.COMPLETED.getStatus())) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_COMMENT_FAIL_STATUS_NOT_COMPLETED);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 判断指定订单的所有订单项,是不是都售后成功
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param id 订单编号
 | 
	
		
			
				|  |  | +     * @return 是否都售后成功
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private boolean isAllOrderItemAfterSaleSuccess(Long id) {
 | 
	
		
			
				|  |  | +        List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
 | 
	
		
			
				|  |  | +        return orderItems.stream().allMatch(orderItem -> Objects.equals(orderItem.getAfterSaleStatus(),
 | 
	
		
			
				|  |  | +                TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus()));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if (ObjectUtil.notEqual(order.getCommentStatus(), Boolean.FALSE)) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_COMMENT_STATUS_NOT_FALSE);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_COMMENT)
 | 
	
		
			
				|  |  | +    public Long createOrderItemCommentByMember(Long userId, AppTradeOrderItemCommentCreateReqVO createReqVO) {
 | 
	
		
			
				|  |  | +        // 1.1 先通过订单项 ID,查询订单项是否存在
 | 
	
		
			
				|  |  | +        TradeOrderItemDO orderItem = tradeOrderItemMapper.selectByIdAndUserId(createReqVO.getOrderItemId(), userId);
 | 
	
		
			
				|  |  | +        if (orderItem == null) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_ITEM_NOT_FOUND);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 1.2 校验订单相关状态
 | 
	
		
			
				|  |  | +        TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderItem.getOrderId(), userId);
 | 
	
		
			
				|  |  | +        if (order == null) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (ObjectUtil.notEqual(order.getStatus(), TradeOrderStatusEnum.COMPLETED.getStatus())) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_COMMENT_FAIL_STATUS_NOT_COMPLETED);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (ObjectUtil.notEqual(order.getCommentStatus(), Boolean.FALSE)) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_COMMENT_STATUS_NOT_FALSE);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 2. 创建评价
 | 
	
		
			
				|  |  | +        Long commentId = createOrderItemComment0(orderItem, createReqVO);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 3. 如果订单项都评论了,则更新订单评价状态
 | 
	
		
			
				|  |  | +        List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
	
		
			
				|  |  | +        if (!anyMatch(orderItems, item -> Objects.equals(item.getCommentStatus(), Boolean.FALSE))) {
 | 
	
		
			
				|  |  | +            tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setCommentStatus(Boolean.TRUE)
 | 
	
		
			
				|  |  | +                    .setFinishTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  | +            // 增加订单日志。注意:只有在所有订单项都评价后,才会增加
 | 
	
		
			
				|  |  | +            TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return commentId;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 创建评价
 | 
	
		
			
				|  |  | -    Long commentId = createOrderItemComment0(orderItem, createReqVO);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public int createOrderItemCommentBySystem() {
 | 
	
		
			
				|  |  | +        // 1. 查询过期的待支付订单
 | 
	
		
			
				|  |  | +        LocalDateTime expireTime = minusTime(tradeOrderProperties.getCommentExpireTime());
 | 
	
		
			
				|  |  | +        List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndReceiveTimeLt(
 | 
	
		
			
				|  |  | +                TradeOrderStatusEnum.COMPLETED.getStatus(), expireTime, false);
 | 
	
		
			
				|  |  | +        if (CollUtil.isEmpty(orders)) {
 | 
	
		
			
				|  |  | +            return 0;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 3. 如果订单项都评论了,则更新订单评价状态
 | 
	
		
			
				|  |  | -    List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
	
		
			
				|  |  | -    if (!anyMatch(orderItems, item -> Objects.equals(item.getCommentStatus(), Boolean.FALSE))) {
 | 
	
		
			
				|  |  | -        tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setCommentStatus(Boolean.TRUE)
 | 
	
		
			
				|  |  | -                .setFinishTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  | -        // 增加订单日志。注意:只有在所有订单项都评价后,才会增加
 | 
	
		
			
				|  |  | -        TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
 | 
	
		
			
				|  |  | +        // 2. 遍历执行,逐个取消
 | 
	
		
			
				|  |  | +        int count = 0;
 | 
	
		
			
				|  |  | +        for (TradeOrderDO order : orders) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                getSelf().createOrderItemCommentBySystemBySystem(order);
 | 
	
		
			
				|  |  | +                count++;
 | 
	
		
			
				|  |  | +            } catch (Throwable e) {
 | 
	
		
			
				|  |  | +                log.error("[createOrderItemCommentBySystem][order({}) 过期订单异常]", order.getId(), e);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return count;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    return commentId;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -public int createOrderItemCommentBySystem() {
 | 
	
		
			
				|  |  | -    // 1. 查询过期的待支付订单
 | 
	
		
			
				|  |  | -    LocalDateTime expireTime = minusTime(tradeOrderProperties.getCommentExpireTime());
 | 
	
		
			
				|  |  | -    List<TradeOrderDO> orders = tradeOrderMapper.selectListByStatusAndReceiveTimeLt(
 | 
	
		
			
				|  |  | -            TradeOrderStatusEnum.COMPLETED.getStatus(), expireTime, false);
 | 
	
		
			
				|  |  | -    if (CollUtil.isEmpty(orders)) {
 | 
	
		
			
				|  |  | -        return 0;
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId) {
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(
 | 
	
		
			
				|  |  | +                new TradeOrderDO().setId(orderId).setCombinationActivityId(activityId)
 | 
	
		
			
				|  |  | +                        .setCombinationRecordId(combinationRecordId).setCombinationHeadId(headId));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 遍历执行,逐个取消
 | 
	
		
			
				|  |  | -    int count = 0;
 | 
	
		
			
				|  |  | -    for (TradeOrderDO order : orders) {
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            getSelf().createOrderItemCommentBySystemBySystem(order);
 | 
	
		
			
				|  |  | -            count++;
 | 
	
		
			
				|  |  | -        } catch (Throwable e) {
 | 
	
		
			
				|  |  | -            log.error("[createOrderItemCommentBySystem][order({}) 过期订单异常]", order.getId(), e);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void cancelPaidOrder(Long userId, Long orderId) {
 | 
	
		
			
				|  |  | +        // TODO 非繁人:这里实现要优化下;
 | 
	
		
			
				|  |  | +        TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId);
 | 
	
		
			
				|  |  | +        if (order == null) {
 | 
	
		
			
				|  |  | +            throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    return count;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -public void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId) {
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(
 | 
	
		
			
				|  |  | -            new TradeOrderDO().setId(orderId).setCombinationActivityId(activityId)
 | 
	
		
			
				|  |  | -                    .setCombinationRecordId(combinationRecordId).setCombinationHeadId(headId));
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 保存订单的签收时间
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param com 快递公司编码
 | 
	
		
			
				|  |  | +     * @param nu  单号
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void updateOrder(String com, String nu, LocalDateTime time) {
 | 
	
		
			
				|  |  | +        DeliveryExpressDO deliveryExpressDO = deliveryExpressService.selectByCode(com);
 | 
	
		
			
				|  |  | +        TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
 | 
	
		
			
				|  |  | +                .eq(TradeOrderDO::getLogisticsNo, nu)
 | 
	
		
			
				|  |  | +                .eq(TradeOrderDO::getLogisticsId, deliveryExpressDO.getId())
 | 
	
		
			
				|  |  | +                .isNull(TradeOrderDO::getReceivingTime)
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +        if (tradeOrderDO == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        tradeOrderDO.setReceivingTime(time);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -public void cancelPaidOrder(Long userId, Long orderId) {
 | 
	
		
			
				|  |  | -    // TODO 非繁人:这里实现要优化下;
 | 
	
		
			
				|  |  | -    TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId);
 | 
	
		
			
				|  |  | -    if (order == null) {
 | 
	
		
			
				|  |  | -        throw exception(ORDER_NOT_FOUND);
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(tradeOrderDO);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    cancelOrder0(order, TradeOrderCancelTypeEnum.MEMBER_CANCEL);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 保存订单的签收时间
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param com 快递公司编码
 | 
	
		
			
				|  |  | - * @param nu  单号
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -public void updateOrder(String com, String nu, LocalDateTime time) {
 | 
	
		
			
				|  |  | -    DeliveryExpressDO deliveryExpressDO = deliveryExpressService.selectByCode(com);
 | 
	
		
			
				|  |  | -    TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
 | 
	
		
			
				|  |  | -            .eq(TradeOrderDO::getLogisticsNo, nu)
 | 
	
		
			
				|  |  | -            .eq(TradeOrderDO::getLogisticsId, deliveryExpressDO.getId())
 | 
	
		
			
				|  |  | -            .isNull(TradeOrderDO::getReceivingTime)
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -    if (tradeOrderDO == null) {
 | 
	
		
			
				|  |  | -        return;
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void updateOrderById(TradeOrderDO order) {
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(order);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    tradeOrderDO.setReceivingTime(time);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(tradeOrderDO);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 创建单个订单的评论
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param order 订单
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_COMMENT)
 | 
	
		
			
				|  |  | +    public void createOrderItemCommentBySystemBySystem(TradeOrderDO order) {
 | 
	
		
			
				|  |  | +        // 1. 查询未评论的订单项
 | 
	
		
			
				|  |  | +        List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderIdAndCommentStatus(
 | 
	
		
			
				|  |  | +                order.getId(), Boolean.FALSE);
 | 
	
		
			
				|  |  | +        if (CollUtil.isEmpty(orderItems)) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@Override
 | 
	
		
			
				|  |  | -public void updateOrderById(TradeOrderDO order) {
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(order);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +        // 2. 逐个评论
 | 
	
		
			
				|  |  | +        for (TradeOrderItemDO orderItem : orderItems) {
 | 
	
		
			
				|  |  | +            // 2.1 创建评价
 | 
	
		
			
				|  |  | +            AppTradeOrderItemCommentCreateReqVO commentCreateReqVO = new AppTradeOrderItemCommentCreateReqVO()
 | 
	
		
			
				|  |  | +                    .setOrderItemId(orderItem.getId()).setAnonymous(false).setContent("")
 | 
	
		
			
				|  |  | +                    .setBenefitScores(5).setDescriptionScores(5);
 | 
	
		
			
				|  |  | +            createOrderItemComment0(orderItem, commentCreateReqVO);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 创建单个订单的评论
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param order 订单
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_COMMENT)
 | 
	
		
			
				|  |  | -public void createOrderItemCommentBySystemBySystem(TradeOrderDO order) {
 | 
	
		
			
				|  |  | -    // 1. 查询未评论的订单项
 | 
	
		
			
				|  |  | -    List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderIdAndCommentStatus(
 | 
	
		
			
				|  |  | -            order.getId(), Boolean.FALSE);
 | 
	
		
			
				|  |  | -    if (CollUtil.isEmpty(orderItems)) {
 | 
	
		
			
				|  |  | -        return;
 | 
	
		
			
				|  |  | +            // 2.2 更新订单项评价状态
 | 
	
		
			
				|  |  | +            tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 3. 所有订单项都评论了,则更新订单评价状态
 | 
	
		
			
				|  |  | +        tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setCommentStatus(Boolean.TRUE)
 | 
	
		
			
				|  |  | +                .setFinishTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  | +        // 增加订单日志。注意:只有在所有订单项都评价后,才会增加
 | 
	
		
			
				|  |  | +        TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 2. 逐个评论
 | 
	
		
			
				|  |  | -    for (TradeOrderItemDO orderItem : orderItems) {
 | 
	
		
			
				|  |  | -        // 2.1 创建评价
 | 
	
		
			
				|  |  | -        AppTradeOrderItemCommentCreateReqVO commentCreateReqVO = new AppTradeOrderItemCommentCreateReqVO()
 | 
	
		
			
				|  |  | -                .setOrderItemId(orderItem.getId()).setAnonymous(false).setContent("")
 | 
	
		
			
				|  |  | -                .setBenefitScores(5).setDescriptionScores(5);
 | 
	
		
			
				|  |  | -        createOrderItemComment0(orderItem, commentCreateReqVO);
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 创建订单项的评论的核心实现
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param orderItem   订单项
 | 
	
		
			
				|  |  | +     * @param createReqVO 评论内容
 | 
	
		
			
				|  |  | +     * @return 评论编号
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private Long createOrderItemComment0(TradeOrderItemDO orderItem, AppTradeOrderItemCommentCreateReqVO createReqVO) {
 | 
	
		
			
				|  |  | +        // 1. 创建评价
 | 
	
		
			
				|  |  | +        ProductCommentCreateReqDTO productCommentCreateReqDTO = TradeOrderConvert.INSTANCE.convert04(createReqVO, orderItem);
 | 
	
		
			
				|  |  | +        Long commentId = productCommentApi.createComment(productCommentCreateReqDTO);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        // 2.2 更新订单项评价状态
 | 
	
		
			
				|  |  | +        // 2. 更新订单项评价状态
 | 
	
		
			
				|  |  |          tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE));
 | 
	
		
			
				|  |  | +        return commentId;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // 3. 所有订单项都评论了,则更新订单评价状态
 | 
	
		
			
				|  |  | -    tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setCommentStatus(Boolean.TRUE)
 | 
	
		
			
				|  |  | -            .setFinishTime(LocalDateTime.now()));
 | 
	
		
			
				|  |  | -    // 增加订单日志。注意:只有在所有订单项都评价后,才会增加
 | 
	
		
			
				|  |  | -    TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), order.getStatus());
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 创建订单项的评论的核心实现
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @param orderItem   订单项
 | 
	
		
			
				|  |  | - * @param createReqVO 评论内容
 | 
	
		
			
				|  |  | - * @return 评论编号
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -private Long createOrderItemComment0(TradeOrderItemDO orderItem, AppTradeOrderItemCommentCreateReqVO createReqVO) {
 | 
	
		
			
				|  |  | -    // 1. 创建评价
 | 
	
		
			
				|  |  | -    ProductCommentCreateReqDTO productCommentCreateReqDTO = TradeOrderConvert.INSTANCE.convert04(createReqVO, orderItem);
 | 
	
		
			
				|  |  | -    Long commentId = productCommentApi.createComment(productCommentCreateReqDTO);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 2. 更新订单项评价状态
 | 
	
		
			
				|  |  | -    tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE));
 | 
	
		
			
				|  |  | -    return commentId;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  // =================== 营销相关的操作 ===================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * 获得自身的代理对象,解决 AOP 生效问题
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @return 自己
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -private TradeOrderUpdateServiceImpl getSelf() {
 | 
	
		
			
				|  |  | -    return SpringUtil.getBean(getClass());
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 获得自身的代理对象,解决 AOP 生效问题
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @return 自己
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private TradeOrderUpdateServiceImpl getSelf() {
 | 
	
		
			
				|  |  | +        return SpringUtil.getBean(getClass());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |