Browse Source

Merge branch 'dev/2024/0604/update-admin-Y' of feifan/mall-backend-admin into master

添加积分商城所需的参数
Yangzw 9 months ago
parent
commit
167d9cca4b
16 changed files with 611 additions and 529 deletions
  1. 5 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSpuSaveReqVO.java
  2. 4 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/dataobject/spu/ProductSpuDO.java
  3. 2 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/ErrorCodeConstants.java
  4. 3 1
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/delivery/DeliveryTypeEnum.java
  5. 8 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java
  6. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java
  7. 4 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java
  8. 5 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderDetailRespVO.java
  9. 9 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java
  10. 2 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/job/order/TradeOrderAutoCalcJob.java
  11. 6 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java
  12. 15 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java
  13. 537 524
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  14. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
  15. 0 1
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/admin/address/vo/AddressBaseVO.java
  16. 5 0
      sql/mysql/建空库SQL/11_20240607.sql

+ 5 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSpuSaveReqVO.java

@@ -105,4 +105,9 @@ public class ProductSpuSaveReqVO {
 
     @Schema(description = "商户id", example = "8240")
     private Long merchantId;
+
+    @Schema(description = "商品支付类别", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotNull(message = "商品支付类别不能为空")
+    private Integer spuPayType;
+
 }

+ 4 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/dataobject/spu/ProductSpuDO.java

@@ -187,5 +187,9 @@ public class ProductSpuDO extends BaseDO {
      */
     private Long merchantId;
 
+    /**
+     * 商品支付类别
+     */
+    private Integer spuPayType;
 
 }

+ 2 - 0
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/ErrorCodeConstants.java

@@ -35,6 +35,8 @@ public interface ErrorCodeConstants {
     ErrorCode ORDER_RECEIVE_FAIL_DELIVERY_TYPE_NOT_PICK_UP = new ErrorCode(1_011_000_030, "交易订单自提失败,收货方式不是【用户自提】");
     ErrorCode ORDER_UPDATE_ADDRESS_FAIL_STATUS_NOT_DELIVERED = new ErrorCode(1_011_000_031, "交易订单修改收货地址失败,原因:订单不是【待发货】状态");
     ErrorCode ORDER_CREATE_FAIL_EXIST_UNPAID = new ErrorCode(1_011_000_032, "交易订单创建失败,原因:存在未付款订单");
+    ErrorCode ORDER_DELIVERY_DETAILS_IS_NULL = new ErrorCode(1_011_000_033, "交易订单发货失败,请填写完整信息");
+
 
     // ========== After Sale 模块 1-011-000-100 ==========
     ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1_011_000_100, "售后单不存在");

+ 3 - 1
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/delivery/DeliveryTypeEnum.java

@@ -17,7 +17,9 @@ import java.util.HashMap;
 public enum DeliveryTypeEnum implements IntArrayValuable {
 
     EXPRESS(1, "快递发货"),
-    PICK_UP(2, "用户自提"),;
+    PICK_UP(2, "用户自提"),
+    VIRTUAL_PRODUCT(3,"虚拟商品收货")
+    ;
 
     public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DeliveryTypeEnum::getType).toArray();
 

+ 8 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java

@@ -105,7 +105,11 @@ public class TradeOrderController {
         List<TradeOrderItemDO> orderItems = tradeOrderQueryService.getOrderItemListByOrderId(
                 convertSet(pageResult.getList(), TradeOrderDO::getId));
         // 最终组合
-        return success(TradeOrderConvert.INSTANCE.convertPage(pageResult, orderItems, userMap));
+        PageResult<TradeOrderPageItemRespVO> data = TradeOrderConvert.INSTANCE.convertPage(pageResult, orderItems, userMap);
+        for (TradeOrderPageItemRespVO tradeOrderPageItemRespVO : data.getList()) {
+            tradeOrderPageItemRespVO.setSpuType(tradeOrderQueryService.getSpuType(orderItems));
+        }
+        return success(data);
     }
 
     @GetMapping("/summary")
@@ -142,7 +146,9 @@ public class TradeOrderController {
         MemberUserRespDTO brokerageUser = order.getBrokerageUserId() != null ?
                 memberUserApi.getUser(order.getBrokerageUserId()) : null;
         List<TradeOrderLogDO> orderLogs = tradeOrderLogService.getOrderLogListByOrderId(id);
-        return success(TradeOrderConvert.INSTANCE.convert(order, orderItems, orderLogs, user, brokerageUser));
+        TradeOrderDetailRespVO convert = TradeOrderConvert.INSTANCE.convert(order, orderItems, orderLogs, user, brokerageUser);
+        convert.setSpuType(tradeOrderQueryService.getSpuType(orderItems));
+        return success(convert);
     }
 
     @GetMapping("/get-express-track-list")

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java

@@ -150,4 +150,7 @@ public class TradeOrderBaseVO {
 
     @Schema(description = "店铺id", example = "20588")
     private Long shopId;
+
+    @Schema(description = "商品类型,只有购买的商品是虚拟商品的时候才会有返回")
+    private Integer spuType;
 }

+ 4 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java

@@ -16,12 +16,15 @@ public class TradeOrderDeliveryReqVO {
     private Long id;
 
     @Schema(description = "发货物流公司编号", example = "1")
-    @NotNull(message = "发货物流公司不能为空")
     private Long logisticsId;
 
     @Schema(description = "发货物流单号", example = "SF123456789")
     private String logisticsNo;
 
 
+    @Schema(description = "发货备注", example = "备注")
+    private String deliveryRemark;
 
+    @Schema(description = "发货信息附件", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String attachment;
 }

+ 5 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/vo/TradeOrderDetailRespVO.java

@@ -104,5 +104,10 @@ public class TradeOrderDetailRespVO extends TradeOrderBaseVO {
 
     }
 
+    @Schema(description = "发货备注", example = "备注")
+    private String deliveryRemark;
+
+    @Schema(description = "发货信息附件")
+    private String attachment;
 
 }

+ 9 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -343,4 +343,13 @@ public class TradeOrderDO extends BaseDO {
      * 物流签收时间
      */
     private LocalDateTime receivingTime;
+
+    /**
+     * 发货备注
+     */
+    private String deliveryRemark;
+    /**
+     * 发货信息附件
+     */
+    private String attachment;
 }

+ 2 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/job/order/TradeOrderAutoCalcJob.java

@@ -9,6 +9,7 @@ import cn.newfeifan.mall.module.distri.mq.message.order.OrderItemMessage;
 import cn.newfeifan.mall.module.trade.mq.producer.order.DistriOrderProducer;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
 import org.quartz.DisallowConcurrentExecution;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -23,6 +24,7 @@ import java.util.stream.Collectors;
  */
 @Component
 @DisallowConcurrentExecution
+@Lazy(false)
 public class TradeOrderAutoCalcJob implements JobHandler {
 
     @Resource

+ 6 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java

@@ -221,4 +221,10 @@ public interface TradeOrderQueryService {
 
     TradeOrderDO getOrderById(Long orderId);
 
+    /**
+     * 用来判断当前的这个订单中的商品是不是虚拟商品
+     * @param orderItems 订单项
+     * @return 0 是虚拟商品
+     */
+    Integer getSpuType(List<TradeOrderItemDO> orderItems);
 }

+ 15 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java

@@ -11,6 +11,8 @@ import cn.newfeifan.mall.module.member.api.user.MemberUserApi;
 import cn.newfeifan.mall.module.member.api.user.dto.MemberUserRespDTO;
 import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderPageItemRespVO;
 import cn.newfeifan.mall.module.product.api.sku.ProductSkuApi;
+import cn.newfeifan.mall.module.product.dal.dataobject.spu.ProductSpuDO;
+import cn.newfeifan.mall.module.product.service.spu.ProductSpuService;
 import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
 import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
 import cn.newfeifan.mall.module.trade.controller.admin.delivery.vo.expresstemplate.ShopBO;
@@ -88,6 +90,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
 
     @Resource
     private AdminUserMapper userMapper;
+    @Resource
+    private ProductSpuService productSpuService;
 
     // =================== Order ===================
 
@@ -282,6 +286,17 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
         );
     }
 
+    @Override
+    public Integer getSpuType(List<TradeOrderItemDO> orderItems) {
+        for (TradeOrderItemDO orderItem : orderItems) {
+            ProductSpuDO spu = productSpuService.getSpu(orderItem.getSpuId());
+            if(spu.getSpuType() == 0){
+                return 0;
+            }
+        }
+        return null;
+    }
+
     public static ShopBO getShopBO(StringRedisTemplate stringRedisTemplate, AdminUserMapper userMapper, Logger log) {
         Long loginUserId = getLoginUserId();
         String s = stringRedisTemplate.opsForValue().get("shop:" + loginUserId);

+ 537 - 524
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -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());
+    }
 
 }

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java

@@ -59,6 +59,9 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
             calculateByPickUp(param);
         } else if (DeliveryTypeEnum.EXPRESS.getType().equals(param.getDeliveryType())) {
             calculateExpress(param, result);
+        } else if (DeliveryTypeEnum.VIRTUAL_PRODUCT.getType().equals(param.getDeliveryType())) {
+            // 虚拟商品不需要计算运费
+            calculateByPickUp(param);
         }
     }
 

+ 0 - 1
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/admin/address/vo/AddressBaseVO.java

@@ -23,7 +23,6 @@ public class AddressBaseVO {
     private String mobile;
 
     @Schema(description = "地区编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "15716")
-    @NotNull(message = "地区编码不能为空")
     private Long areaId;
 
     @Schema(description = "收件详细地址", requiredMode = Schema.RequiredMode.REQUIRED)

+ 5 - 0
sql/mysql/建空库SQL/11_20240607.sql

@@ -0,0 +1,5 @@
+ALTER TABLE product_spu ADD COLUMN spu_pay_type INT(11) NOT NULL DEFAULT '1' COMMENT '商品支付类别';      --添加spu表的支付类别字段
+ALTER TABLE member_address MODIFY COLUMN area_id bigint(20) NULL COMMENT '地区编码';        --修改收件地址的地区编码字段为可空
+ALTER TABLE trade_order
+ADD COLUMN delivery_remark varchar(255) COLLATE utf8mb4_unicode_ci COMMENT '发货备注',
+ADD COLUMN attachment varchar(256) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '发货信息的附件';       --添加订单信息的发货备注和附件字段