Commit 10f2dbc8cd7d6f5150b50fff32c3c3ed51aec3c3

Authored by YunaiV
1 parent b8d1d31d

trade: 增加创建售后订单的接口

Showing 19 changed files with 393 additions and 56 deletions
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
@@ -19,7 +19,19 @@ public interface ErrorCodeConstants { @@ -19,7 +19,19 @@ public interface ErrorCodeConstants {
19 ErrorCode ORDER_CREATE_SPU_NOT_FOUND = new ErrorCode(1011000005, "商品 SPU 不可售卖"); 19 ErrorCode ORDER_CREATE_SPU_NOT_FOUND = new ErrorCode(1011000005, "商品 SPU 不可售卖");
20 ErrorCode ORDER_CREATE_ADDRESS_NOT_FOUND = new ErrorCode(1011000006, "收货地址不存在"); 20 ErrorCode ORDER_CREATE_ADDRESS_NOT_FOUND = new ErrorCode(1011000006, "收货地址不存在");
21 21
  22 + ErrorCode ORDER_ITEM_NOT_FOUND = new ErrorCode(1011000010, "交易订单项不存在");
  23 + ErrorCode ORDER_NOT_FOUND = new ErrorCode(1011000010, "交易订单不存在");
  24 +
  25 + // ========== After Sale 模块 1-011-000-000 ==========
  26 + ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1011000100, "售后单不存在");
  27 + ErrorCode AFTER_SALE_CREATE_FAIL_REFUND_PRICE_ERROR = new ErrorCode(1011000101, "申请退款金额错误");
  28 + ErrorCode AFTER_SALE_CREATE_FAIL_ORDER_STATUS_CANCELED = new ErrorCode(1011000102, "订单已关闭,无法申请售后");
  29 + ErrorCode AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID = new ErrorCode(1011000103, "订单未支付,无法申请售后");
  30 + ErrorCode AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED = new ErrorCode(1011000104, "订单未发货,无法申请【退货退款】售后");
  31 + ErrorCode AFTER_SALE_CREATE_FAIL_ORDER_ITEM_APPLIED = new ErrorCode(1011000105, "订单项已申请售后,无法重复申请");
  32 +
22 // ========== Cart 模块 1-011-001-000 ========== 33 // ========== Cart 模块 1-011-001-000 ==========
23 - ErrorCode CARD_ITEM_NOT_FOUND = new ErrorCode(1001001000, "购物车项不存在"); 34 + ErrorCode CARD_ITEM_NOT_FOUND = new ErrorCode(1011002000, "购物车项不存在");
  35 +
24 36
25 } 37 }
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/TradeAfterSaleTypeEnum.java
1 package cn.iocoder.yudao.module.trade.enums.aftersale; 1 package cn.iocoder.yudao.module.trade.enums.aftersale;
2 2
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
3 import lombok.Getter; 4 import lombok.Getter;
4 import lombok.RequiredArgsConstructor; 5 import lombok.RequiredArgsConstructor;
5 6
  7 +import java.util.Arrays;
  8 +
6 /** 9 /**
7 * 交易售后 - 类型 10 * 交易售后 - 类型
8 * 11 *
@@ -10,11 +13,13 @@ import lombok.RequiredArgsConstructor; @@ -10,11 +13,13 @@ import lombok.RequiredArgsConstructor;
10 */ 13 */
11 @RequiredArgsConstructor 14 @RequiredArgsConstructor
12 @Getter 15 @Getter
13 -public enum TradeAfterSaleTypeEnum { 16 +public enum TradeAfterSaleTypeEnum implements IntArrayValuable {
14 17
15 REFUND(10, "退款"), 18 REFUND(10, "退款"),
16 RETURN_AND_REFUND(20, "退货退款"); 19 RETURN_AND_REFUND(20, "退货退款");
17 20
  21 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleTypeEnum::getType).toArray();
  22 +
18 /** 23 /**
19 * 状态值 24 * 状态值
20 */ 25 */
@@ -24,4 +29,9 @@ public enum TradeAfterSaleTypeEnum { @@ -24,4 +29,9 @@ public enum TradeAfterSaleTypeEnum {
24 */ 29 */
25 private final String name; 30 private final String name;
26 31
  32 + @Override
  33 + public int[] array() {
  34 + return ARRAYS;
  35 + }
  36 +
27 } 37 }
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderItemRefundStatusEnum.java renamed to yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderItemAfterSaleStatusEnum.java
1 package cn.iocoder.yudao.module.trade.enums.order; 1 package cn.iocoder.yudao.module.trade.enums.order;
2 2
  3 +import cn.hutool.core.util.ObjectUtil;
3 import lombok.Getter; 4 import lombok.Getter;
4 import lombok.RequiredArgsConstructor; 5 import lombok.RequiredArgsConstructor;
5 6
6 /** 7 /**
7 - * 交易订单项 - 退款状态 8 + * 交易订单项 - 售后状态
8 * 9 *
9 - * @author Sin 10 + * @author 芋道源码
10 */ 11 */
11 @RequiredArgsConstructor 12 @RequiredArgsConstructor
12 @Getter 13 @Getter
13 -public enum TradeOrderItemRefundStatusEnum { 14 +public enum TradeOrderItemAfterSaleStatusEnum {
14 15
15 - NONE(0, "未申请退款"),  
16 - APPLY(1, "申请退款"),  
17 - WAIT(2, "等待退款"),  
18 - SUCCESS(3, "退款成功"); 16 + NONE(0, "未申请"),
  17 + APPLY(1, "已申请"),
  18 + SUCCESS(2, "申请成功");
19 19
20 /** 20 /**
21 * 状态值 21 * 状态值
@@ -26,4 +26,17 @@ public enum TradeOrderItemRefundStatusEnum { @@ -26,4 +26,17 @@ public enum TradeOrderItemRefundStatusEnum {
26 */ 26 */
27 private final String name; 27 private final String name;
28 28
  29 + // TODO 芋艿:EXPIRED 已失效不允许申请售后
  30 + // TODO 芋艿:PART_AFTER_SALE 部分售后
  31 +
  32 + /**
  33 + * 判断指定状态,是否正处于【未申请】状态
  34 + *
  35 + * @param status 指定状态
  36 + * @return 是否
  37 + */
  38 + public static boolean isNone(Integer status) {
  39 + return ObjectUtil.equals(status, NONE.getStatus());
  40 + }
  41 +
29 } 42 }
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderStatusEnum.java
1 package cn.iocoder.yudao.module.trade.enums.order; 1 package cn.iocoder.yudao.module.trade.enums.order;
2 2
  3 +import cn.hutool.core.util.ObjectUtil;
  4 +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
3 import lombok.Getter; 5 import lombok.Getter;
4 import lombok.RequiredArgsConstructor; 6 import lombok.RequiredArgsConstructor;
5 7
@@ -12,11 +14,14 @@ import lombok.RequiredArgsConstructor; @@ -12,11 +14,14 @@ import lombok.RequiredArgsConstructor;
12 @Getter 14 @Getter
13 public enum TradeOrderStatusEnum { 15 public enum TradeOrderStatusEnum {
14 16
15 - WAITING_PAYMENT(0, "待付款"),  
16 - WAIT_SHIPMENT(1, "待发货"),  
17 - ALREADY_SHIPMENT(2, "待收货"),  
18 - COMPLETED(3, "已完成"),  
19 - CANCEL(4, "已关闭"); 17 + UNPAID(0, "未付款"),
  18 + PAID(10, "已付款"), // 例如说,拼团订单,支付后,需要拼团成功后,才会处于待发货
  19 + UNDELIVERED(20, "待发货"),
  20 + DELIVERED(30, "已发货"),
  21 + COMPLETED(40, "已完成"),
  22 + CANCELED(50, "已取消");
  23 +
  24 + // TODO 芋艿: TAKE("待核验"):虚拟订单需要核验商品
20 25
21 /** 26 /**
22 * 状态值 27 * 状态值
@@ -27,4 +32,35 @@ public enum TradeOrderStatusEnum { @@ -27,4 +32,35 @@ public enum TradeOrderStatusEnum {
27 */ 32 */
28 private final String name; 33 private final String name;
29 34
  35 + /**
  36 + * 判断指定状态,是否正处于【已取消】状态
  37 + *
  38 + * @param status 指定状态
  39 + * @return 是否
  40 + */
  41 + public static boolean isCanceled(Integer status) {
  42 + return ObjectUtil.equals(status, CANCELED.getStatus());
  43 + }
  44 +
  45 + /**
  46 + * 判断指定状态,是否有过【已付款】状态
  47 + *
  48 + * @param status 指定状态
  49 + * @return 是否
  50 + */
  51 + public static boolean havePaid(Integer status) {
  52 + return ObjectUtils.equalsAny(status, PAID.getStatus(), UNDELIVERED.getStatus(),
  53 + DELIVERED.getStatus(), COMPLETED.getStatus());
  54 + }
  55 +
  56 + /**
  57 + * 判断指定状态,是否有过【已发货】状态
  58 + *
  59 + * @param status 指定状态
  60 + * @return 是否
  61 + */
  62 + public static boolean haveDelivered(Integer status) {
  63 + return ObjectUtils.equalsAny(status, DELIVERED.getStatus(), COMPLETED.getStatus());
  64 + }
  65 +
30 } 66 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppAfterSaleController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.app.aftersale;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  5 +import cn.iocoder.yudao.module.trade.service.aftersale.TradeAfterSaleService;
  6 +import io.swagger.annotations.Api;
  7 +import io.swagger.annotations.ApiOperation;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.springframework.validation.annotation.Validated;
  10 +import org.springframework.web.bind.annotation.PostMapping;
  11 +import org.springframework.web.bind.annotation.RequestBody;
  12 +import org.springframework.web.bind.annotation.RequestMapping;
  13 +import org.springframework.web.bind.annotation.RestController;
  14 +
  15 +import javax.annotation.Resource;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  18 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  19 +
  20 +@Api(tags = "用户 App - 交易售后")
  21 +@RestController
  22 +@RequestMapping("/trade/after-sale")
  23 +@Validated
  24 +@Slf4j
  25 +public class AppAfterSaleController {
  26 +
  27 + @Resource
  28 + private TradeAfterSaleService afterSaleService;
  29 +
  30 + @PostMapping(value = "/create")
  31 + @ApiOperation(value = "申请售后")
  32 + private CommonResult<Long> createAfterSale(@RequestBody AppAfterSaleCreateReqVO createReqVO) {
  33 + return success(afterSaleService.createAfterSale(getLoginUserId(), createReqVO));
  34 + }
  35 +
  36 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.app.aftersale.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;
  5 +import io.swagger.annotations.ApiModel;
  6 +import io.swagger.annotations.ApiModelProperty;
  7 +import lombok.Data;
  8 +
  9 +import javax.validation.constraints.Min;
  10 +import javax.validation.constraints.NotNull;
  11 +import java.util.List;
  12 +
  13 +@ApiModel("用户 App - 交易售后创建 Request VO")
  14 +@Data
  15 +public class AppAfterSaleCreateReqVO {
  16 +
  17 + @ApiModelProperty(name = "订单项编号", required = true, example = "1024")
  18 + @NotNull(message = "订单项编号不能为空")
  19 + private Long orderItemId;
  20 +
  21 + @ApiModelProperty(name = "退款金额", required = true, example = "100", notes = "单位:分")
  22 + @NotNull(message = "退款金额不能为空")
  23 + @Min(value = 1, message = "退款金额必须大于 0")
  24 + private Integer applyPrice;
  25 +
  26 + @ApiModelProperty(name = "申请原因", required = true, example = "1", notes = "使用数据字典枚举,对应 trade_refund_apply_reason 类型")
  27 + @NotNull(message = "申请原因不能为空")
  28 + private Integer applyReason;
  29 +
  30 + @ApiModelProperty(name = "补充描述", example = "商品质量不好")
  31 + private String applyDescription;
  32 +
  33 + @ApiModelProperty(name = "补充凭证图片", example = "https://www.iocoder.cn/1.png, https://www.iocoder.cn/2.png")
  34 + private List<String> applyPicUrls;
  35 +
  36 + @ApiModelProperty(name = "售后类型", required = true, example = "1", notes = "对应 TradeAfterSaleTypeEnum 枚举")
  37 + @NotNull(message = "售后类型不能为空")
  38 + @InEnum(value = TradeAfterSaleTypeEnum.class, message = "售后类型必须是 {value}")
  39 + private Integer type;
  40 +
  41 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
@@ -13,22 +13,22 @@ import cn.iocoder.yudao.module.trade.service.order.TradeOrderService; @@ -13,22 +13,22 @@ import cn.iocoder.yudao.module.trade.service.order.TradeOrderService;
13 import io.swagger.annotations.Api; 13 import io.swagger.annotations.Api;
14 import io.swagger.annotations.ApiImplicitParam; 14 import io.swagger.annotations.ApiImplicitParam;
15 import io.swagger.annotations.ApiOperation; 15 import io.swagger.annotations.ApiOperation;
16 -import lombok.RequiredArgsConstructor;  
17 import lombok.extern.slf4j.Slf4j; 16 import lombok.extern.slf4j.Slf4j;
18 import org.springframework.validation.annotation.Validated; 17 import org.springframework.validation.annotation.Validated;
19 import org.springframework.web.bind.annotation.*; 18 import org.springframework.web.bind.annotation.*;
20 19
  20 +import javax.annotation.Resource;
21 import javax.servlet.http.HttpServletRequest; 21 import javax.servlet.http.HttpServletRequest;
22 22
23 @Api(tags = "用户 App - 交易订单") 23 @Api(tags = "用户 App - 交易订单")
24 @RestController 24 @RestController
25 @RequestMapping("/trade/order") 25 @RequestMapping("/trade/order")
26 -@RequiredArgsConstructor // TODO @LeeYan9: 先统一使用 @Resource 注入哈; 项目只有三层, 依赖注入会存在, 所以使用 @Resource; 也因此, 最好全局保持一致  
27 @Validated 26 @Validated
28 @Slf4j 27 @Slf4j
29 public class AppTradeOrderController { 28 public class AppTradeOrderController {
30 29
31 - private final TradeOrderService tradeOrderService; 30 + @Resource
  31 + private TradeOrderService tradeOrderService;
32 32
33 @GetMapping("/get-create-info") 33 @GetMapping("/get-create-info")
34 @ApiOperation("基于商品,确认创建订单") 34 @ApiOperation("基于商品,确认创建订单")
@@ -47,7 +47,7 @@ public class AppTradeOrderController { @@ -47,7 +47,7 @@ public class AppTradeOrderController {
47 Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); 47 Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
48 String clientIp = ServletUtil.getClientIP(servletRequest); 48 String clientIp = ServletUtil.getClientIP(servletRequest);
49 // 创建交易订单,预支付记录 49 // 创建交易订单,预支付记录
50 - Long orderId = tradeOrderService.createTradeOrder(loginUserId, clientIp, createReqVO); 50 + Long orderId = tradeOrderService.createOrder(loginUserId, clientIp, createReqVO);
51 return CommonResult.success(orderId); 51 return CommonResult.success(orderId);
52 } 52 }
53 53
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/refund/TradeRefundController.java deleted
1 -package cn.iocoder.yudao.module.trade.controller.app.refund;  
2 -  
3 -public class TradeRefundController {  
4 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/TradeAfterSaleConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.convert.aftersale;
  2 +
  3 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  4 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;
  5 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  6 +import org.mapstruct.Mapper;
  7 +import org.mapstruct.Mapping;
  8 +import org.mapstruct.Mappings;
  9 +import org.mapstruct.factory.Mappers;
  10 +
  11 +@Mapper
  12 +public interface TradeAfterSaleConvert {
  13 +
  14 + TradeAfterSaleConvert INSTANCE = Mappers.getMapper(TradeAfterSaleConvert.class);
  15 +
  16 + @Mappings({
  17 + @Mapping(target = "id", ignore = true),
  18 + @Mapping(target = "createTime", ignore = true),
  19 + @Mapping(target = "updateTime", ignore = true),
  20 + @Mapping(target = "creator", ignore = true),
  21 + @Mapping(target = "updater", ignore = true),
  22 + })
  23 + TradeAfterSaleDO convert(AppAfterSaleCreateReqVO createReqVO, TradeOrderItemDO tradeOrderItem);
  24 +
  25 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO; @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO;
11 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; 11 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
12 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 12 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
13 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 13 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
14 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemRefundStatusEnum; 14 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
15 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 15 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
16 import org.mapstruct.Mapper; 16 import org.mapstruct.Mapper;
17 import org.mapstruct.Mapping; 17 import org.mapstruct.Mapping;
@@ -55,7 +55,7 @@ public interface TradeOrderConvert { @@ -55,7 +55,7 @@ public interface TradeOrderConvert {
55 TradeOrderItemDO tradeOrderItemDO = convert(orderItem, skuMap.get(orderItem.getSkuId())); 55 TradeOrderItemDO tradeOrderItemDO = convert(orderItem, skuMap.get(orderItem.getSkuId()));
56 tradeOrderItemDO.setOrderId(tradeOrderDO.getId()); 56 tradeOrderItemDO.setOrderId(tradeOrderDO.getId());
57 tradeOrderItemDO.setUserId(tradeOrderDO.getUserId()); 57 tradeOrderItemDO.setUserId(tradeOrderDO.getUserId());
58 - tradeOrderItemDO.setRefundStatus(TradeOrderItemRefundStatusEnum.NONE.getStatus()).setRefundTotal(0); // 退款信息 58 + tradeOrderItemDO.setAfterSaleStatus(TradeOrderItemAfterSaleStatusEnum.NONE.getStatus()); // 退款信息
59 // tradeOrderItemDO.setCommented(false); 59 // tradeOrderItemDO.setCommented(false);
60 return tradeOrderItemDO; 60 return tradeOrderItemDO;
61 }); 61 });
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleDO.java
@@ -27,7 +27,7 @@ import java.util.List; @@ -27,7 +27,7 @@ import java.util.List;
27 public class TradeAfterSaleDO extends BaseDO { 27 public class TradeAfterSaleDO extends BaseDO {
28 28
29 /** 29 /**
30 - * 售后编号,主键自增n 30 + * 售后编号,主键自增
31 */ 31 */
32 private Long id; 32 private Long id;
33 /** 33 /**
@@ -56,8 +56,10 @@ public class TradeAfterSaleDO extends BaseDO { @@ -56,8 +56,10 @@ public class TradeAfterSaleDO extends BaseDO {
56 private Long userId; 56 private Long userId;
57 /** 57 /**
58 * 申请原因 58 * 申请原因
  59 + *
  60 + * 使用数据字典枚举,对应 trade_refund_apply_reason 类型
59 */ 61 */
60 - private String applyReason; 62 + private Integer applyReason;
61 /** 63 /**
62 * 补充描述 64 * 补充描述
63 */ 65 */
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.order; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.order;
2 2
3 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 3 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemRefundStatusEnum; 5 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
6 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableField;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
8 import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; 8 import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
@@ -132,26 +132,17 @@ public class TradeOrderItemDO extends BaseDO { @@ -132,26 +132,17 @@ public class TradeOrderItemDO extends BaseDO {
132 132
133 // ========== 营销基本信息 ========== 133 // ========== 营销基本信息 ==========
134 134
  135 + // TODO 芋艿:在捉摸一下
  136 +
135 // ========== 退款基本信息 ========== 137 // ========== 退款基本信息 ==========
136 /** 138 /**
137 - * 退款状态 TODO 139 + * 退款状态
  140 + *
  141 + * 枚举 {@link TradeOrderItemAfterSaleStatusEnum}
138 * 142 *
139 - * 枚举 {@link TradeOrderItemRefundStatusEnum}  
140 - */  
141 - private Integer refundStatus; // TODO 芋艿:可以考虑去查  
142 - // 如上字段,举个例子:  
143 - // 假设购买三个,即 stock = 3 。  
144 - // originPrice = 15  
145 - // 使用限时折扣(单品优惠)8 折,buyPrice = 12  
146 - // 开始算总的价格  
147 - // buyTotal = buyPrice * stock = 12 * 3 = 36  
148 - // discountTotal ,假设有满减送(分组优惠)满 20 减 10 ,并且使用优惠劵满 1.01 减 1 ,则 discountTotal = 10 + 1 = 11  
149 - // presentTotal = buyTotal - discountTotal = 24 - 11 = 13  
150 - // 最终 presentPrice = presentTotal / stock = 13 / 3 = 4.33  
151 - /**  
152 - * 退款总金额,单位:分 TODO  
153 - */  
154 - private Integer refundTotal; 143 + * @see cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO
  144 + */
  145 + private Integer afterSaleStatus;
155 146
156 /** 147 /**
157 * 商品属性 148 * 商品属性
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/TradeAfterSaleMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.dal.mysql.aftersale;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;
  5 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  6 +import org.apache.ibatis.annotations.Mapper;
  7 +
  8 +@Mapper
  9 +public interface TradeAfterSaleMapper extends BaseMapperX<TradeAfterSaleDO> {
  10 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/orderitem/TradeOrderItemMapper.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java
1 -package cn.iocoder.yudao.module.trade.dal.mysql.orderitem; 1 +package cn.iocoder.yudao.module.trade.dal.mysql.order;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.aftersale;
  2 +
  3 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  4 +
  5 +/**
  6 + * 交易售后 Service 接口
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface TradeAfterSaleService {
  11 +
  12 + /**
  13 + * 创建交易售后
  14 + * <p>
  15 + * 一般是用户发起售后请求
  16 + *
  17 + * @param userId 用户编号
  18 + * @param createReqVO 交易售后 Request 信息
  19 + * @return 交易售后编号
  20 + */
  21 + Long createAfterSale(Long userId, AppAfterSaleCreateReqVO createReqVO);
  22 +
  23 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.aftersale;
  2 +
  3 +import cn.hutool.core.util.RandomUtil;
  4 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  5 +import cn.iocoder.yudao.module.trade.convert.aftersale.TradeAfterSaleConvert;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  8 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  9 +import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper;
  10 +import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;
  11 +import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;
  12 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
  13 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
  14 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderService;
  15 +import org.springframework.stereotype.Service;
  16 +import org.springframework.validation.annotation.Validated;
  17 +
  18 +import javax.annotation.Resource;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  21 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
  22 +
  23 +/**
  24 + * 交易售后 Service 实现类
  25 + *
  26 + * @author 芋道源码
  27 + */
  28 +@Service
  29 +@Validated
  30 +public class TradeAfterSaleServiceImpl implements TradeAfterSaleService {
  31 +
  32 + @Resource
  33 + private TradeOrderService tradeOrderService;
  34 +
  35 + @Resource
  36 + private TradeAfterSaleMapper tradeAfterSaleMapper;
  37 +
  38 + @Override
  39 + public Long createAfterSale(Long userId, AppAfterSaleCreateReqVO createReqVO) {
  40 + // 第一步,前置校验
  41 + TradeOrderItemDO tradeOrderItem = validateOrderItemApplicable(userId, createReqVO);
  42 +
  43 + // 第二步,存储交易售后
  44 + TradeAfterSaleDO afterSale = createAfterSale(createReqVO, tradeOrderItem);
  45 + return afterSale.getId();
  46 + }
  47 +
  48 + private TradeOrderItemDO validateOrderItemApplicable(Long userId, AppAfterSaleCreateReqVO createReqVO) {
  49 + // 校验订单项存在
  50 + TradeOrderItemDO orderItem = tradeOrderService.getOrderItem(userId, createReqVO.getOrderItemId());
  51 + if (orderItem == null) {
  52 + throw exception(ORDER_ITEM_NOT_FOUND);
  53 + }
  54 +
  55 + // 已申请售后,不允许再发起售后申请
  56 + if (!TradeOrderItemAfterSaleStatusEnum.isNone(orderItem.getAfterSaleStatus())) {
  57 + throw exception(AFTER_SALE_CREATE_FAIL_ORDER_ITEM_APPLIED);
  58 + }
  59 + // TODO 芋艿:超过一定时间,不允许售后
  60 +
  61 + // 申请的退款金额,不能超过商品的价格
  62 + if (createReqVO.getApplyPrice() > orderItem.getOrderDividePrice()) {
  63 + throw exception(AFTER_SALE_CREATE_FAIL_REFUND_PRICE_ERROR);
  64 + }
  65 +
  66 + // 校验订单存在
  67 + TradeOrderDO order = tradeOrderService.getOrder(userId, orderItem.getOrderId());
  68 + if (order == null) {
  69 + throw exception(ORDER_NOT_FOUND);
  70 + }
  71 + // 已取消,无法发起售后
  72 + if (TradeOrderStatusEnum.isCanceled(order.getStatus())) {
  73 + throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_CANCELED);
  74 + }
  75 + // 未支付,无法发起售后
  76 + if (!TradeOrderStatusEnum.havePaid(order.getStatus())) {
  77 + throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID);
  78 + }
  79 + // 如果是【退货退款】的情况,需要额外校验是否发货
  80 + if (createReqVO.getType().equals(TradeAfterSaleTypeEnum.RETURN_AND_REFUND.getType())
  81 + && !TradeOrderStatusEnum.haveDelivered(order.getStatus())) {
  82 + throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED);
  83 + }
  84 + return orderItem;
  85 + }
  86 +
  87 + private TradeAfterSaleDO createAfterSale(AppAfterSaleCreateReqVO createReqVO,
  88 + TradeOrderItemDO tradeOrderItem) {
  89 + // 创建售后单
  90 + TradeAfterSaleDO afterSale = TradeAfterSaleConvert.INSTANCE.convert(createReqVO, tradeOrderItem);
  91 + afterSale.setNo(RandomUtil.randomString(10)); // TODO 芋艿:优化 no 生成逻辑
  92 + afterSale.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus());
  93 + // TODO 退还积分
  94 + tradeAfterSaleMapper.insert(afterSale);
  95 +
  96 + // 更新交易订单项的售后状态 TODO
  97 +
  98 + // 发送售后消息
  99 + return afterSale;
  100 + }
  101 +
  102 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderService.java
1 package cn.iocoder.yudao.module.trade.service.order; 1 package cn.iocoder.yudao.module.trade.service.order;
2 2
3 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; 3 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
  4 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  5 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
4 6
5 /** 7 /**
6 * 交易订单 Service 接口 8 * 交易订单 Service 接口
@@ -13,11 +15,29 @@ public interface TradeOrderService { @@ -13,11 +15,29 @@ public interface TradeOrderService {
13 /** 15 /**
14 * 创建交易订单 16 * 创建交易订单
15 * 17 *
16 - * @param loginUserId 登录用户 18 + * @param userId 登录用户
17 * @param userIp 用户 IP 地址 19 * @param userIp 用户 IP 地址
18 * @param createReqVO 创建交易订单请求模型 20 * @param createReqVO 创建交易订单请求模型
19 * @return 交易订单的编号 21 * @return 交易订单的编号
20 */ 22 */
21 - Long createTradeOrder(Long loginUserId, String userIp, AppTradeOrderCreateReqVO createReqVO); 23 + Long createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO);
  24 +
  25 + /**
  26 + * 获得指定用户,指定的交易订单项
  27 + *
  28 + * @param userId 用户编号
  29 + * @param itemId 交易订单项编号
  30 + * @return 交易订单项
  31 + */
  32 + TradeOrderItemDO getOrderItem(Long userId, Long itemId);
  33 +
  34 + /**
  35 + * 获得指定用户,指定的交易订单
  36 + *
  37 + * @param userId 用户编号
  38 + * @param orderId 交易订单编号
  39 + * @return 交易订单
  40 + */
  41 + TradeOrderDO getOrder(Long userId, Long orderId);
22 42
23 } 43 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
@@ -25,7 +25,7 @@ import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; @@ -25,7 +25,7 @@ import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
25 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 25 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
26 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 26 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
27 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; 27 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
28 -import cn.iocoder.yudao.module.trade.dal.mysql.orderitem.TradeOrderItemMapper; 28 +import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
29 import cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants; 29 import cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants;
30 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; 30 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
31 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 31 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
@@ -77,7 +77,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { @@ -77,7 +77,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
77 77
78 @Override 78 @Override
79 @Transactional(rollbackFor = Exception.class) 79 @Transactional(rollbackFor = Exception.class)
80 - public Long createTradeOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) { 80 + public Long createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) {
81 // 商品 SKU 检查:可售状态、库存 81 // 商品 SKU 检查:可售状态、库存
82 List<ProductSkuRespDTO> skus = validateSkuSaleable(createReqVO.getItems()); 82 List<ProductSkuRespDTO> skus = validateSkuSaleable(createReqVO.getItems());
83 // 商品 SPU 检查:可售状态 83 // 商品 SPU 检查:可售状态
@@ -99,6 +99,26 @@ public class TradeOrderServiceImpl implements TradeOrderService { @@ -99,6 +99,26 @@ public class TradeOrderServiceImpl implements TradeOrderService {
99 return tradeOrderDO.getId(); 99 return tradeOrderDO.getId();
100 } 100 }
101 101
  102 + @Override
  103 + public TradeOrderItemDO getOrderItem(Long userId, Long itemId) {
  104 + TradeOrderItemDO orderItem = tradeOrderItemMapper.selectById(itemId);
  105 + if (orderItem != null
  106 + && ObjectUtil.notEqual(orderItem.getUserId(), userId)) {
  107 + return null;
  108 + }
  109 + return orderItem;
  110 + }
  111 +
  112 + @Override
  113 + public TradeOrderDO getOrder(Long userId, Long orderId) {
  114 + TradeOrderDO order = tradeOrderMapper.selectById(orderId);
  115 + if (order != null
  116 + && ObjectUtil.notEqual(order.getUserId(), userId)) {
  117 + return null;
  118 + }
  119 + return order;
  120 + }
  121 +
102 /** 122 /**
103 * 校验商品 SKU 是否可出售 123 * 校验商品 SKU 是否可出售
104 * 124 *
@@ -167,7 +187,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { @@ -167,7 +187,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
167 PriceCalculateRespDTO.Order order, AddressRespDTO address) { 187 PriceCalculateRespDTO.Order order, AddressRespDTO address) {
168 TradeOrderDO tradeOrderDO = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, order, address); 188 TradeOrderDO tradeOrderDO = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, order, address);
169 tradeOrderDO.setNo(IdUtil.getSnowflakeNextId() + ""); // TODO @LeeYan9: 思考下, 怎么生成好点哈; 这个是会展示给用户的; 189 tradeOrderDO.setNo(IdUtil.getSnowflakeNextId() + ""); // TODO @LeeYan9: 思考下, 怎么生成好点哈; 这个是会展示给用户的;
170 - tradeOrderDO.setStatus(TradeOrderStatusEnum.WAITING_PAYMENT.getStatus()); 190 + tradeOrderDO.setStatus(TradeOrderStatusEnum.UNPAID.getStatus());
171 tradeOrderDO.setType(TradeOrderTypeEnum.NORMAL.getType()); 191 tradeOrderDO.setType(TradeOrderTypeEnum.NORMAL.getType());
172 tradeOrderDO.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); 192 tradeOrderDO.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
173 tradeOrderDO.setProductCount(getSumValue(order.getItems(), PriceCalculateRespDTO.OrderItem::getCount, Integer::sum)); 193 tradeOrderDO.setProductCount(getSumValue(order.getItems(), PriceCalculateRespDTO.OrderItem::getCount, Integer::sum));
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
@@ -19,8 +19,8 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreate @@ -19,8 +19,8 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreate
19 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 19 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
20 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 20 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
21 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; 21 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
22 -import cn.iocoder.yudao.module.trade.dal.mysql.orderitem.TradeOrderItemMapper;  
23 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemRefundStatusEnum; 22 +import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
  23 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
24 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; 24 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
25 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 25 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
26 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; 26 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
@@ -145,7 +145,7 @@ class TradeOrderServiceTest extends BaseDbUnitTest { @@ -145,7 +145,7 @@ class TradeOrderServiceTest extends BaseDbUnitTest {
145 }))).thenReturn(1000L); 145 }))).thenReturn(1000L);
146 146
147 // 调用方法 147 // 调用方法
148 - Long tradeOrderId = tradeOrderService.createTradeOrder(userId, userIp, reqVO); 148 + Long tradeOrderId = tradeOrderService.createOrder(userId, userIp, reqVO);
149 // 断言 TradeOrderDO 订单 149 // 断言 TradeOrderDO 订单
150 List<TradeOrderDO> tradeOrderDOs = tradeOrderMapper.selectList(); 150 List<TradeOrderDO> tradeOrderDOs = tradeOrderMapper.selectList();
151 assertEquals(tradeOrderDOs.size(), 1); 151 assertEquals(tradeOrderDOs.size(), 1);
@@ -156,7 +156,7 @@ class TradeOrderServiceTest extends BaseDbUnitTest { @@ -156,7 +156,7 @@ class TradeOrderServiceTest extends BaseDbUnitTest {
156 assertEquals(tradeOrderDO.getTerminal(), TerminalEnum.H5.getTerminal()); 156 assertEquals(tradeOrderDO.getTerminal(), TerminalEnum.H5.getTerminal());
157 assertEquals(tradeOrderDO.getUserId(), userId); 157 assertEquals(tradeOrderDO.getUserId(), userId);
158 assertEquals(tradeOrderDO.getUserIp(), userIp); 158 assertEquals(tradeOrderDO.getUserIp(), userIp);
159 - assertEquals(tradeOrderDO.getStatus(), TradeOrderStatusEnum.WAITING_PAYMENT.getStatus()); 159 + assertEquals(tradeOrderDO.getStatus(), TradeOrderStatusEnum.UNPAID.getStatus());
160 assertEquals(tradeOrderDO.getProductCount(), 7); 160 assertEquals(tradeOrderDO.getProductCount(), 7);
161 assertNull(tradeOrderDO.getFinishTime()); 161 assertNull(tradeOrderDO.getFinishTime());
162 assertNull(tradeOrderDO.getCancelTime()); 162 assertNull(tradeOrderDO.getCancelTime());
@@ -207,7 +207,7 @@ class TradeOrderServiceTest extends BaseDbUnitTest { @@ -207,7 +207,7 @@ class TradeOrderServiceTest extends BaseDbUnitTest {
207 assertEquals(tradeOrderItemDO01.getPayPrice(), 130); 207 assertEquals(tradeOrderItemDO01.getPayPrice(), 130);
208 assertEquals(tradeOrderItemDO01.getOrderPartPrice(), 7); 208 assertEquals(tradeOrderItemDO01.getOrderPartPrice(), 7);
209 assertEquals(tradeOrderItemDO01.getOrderDividePrice(), 35); 209 assertEquals(tradeOrderItemDO01.getOrderDividePrice(), 35);
210 - assertEquals(tradeOrderItemDO01.getRefundStatus(), TradeOrderItemRefundStatusEnum.NONE.getStatus()); 210 + assertEquals(tradeOrderItemDO01.getAfterSaleStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus());
211 assertEquals(tradeOrderItemDO01.getRefundTotal(), 0); 211 assertEquals(tradeOrderItemDO01.getRefundTotal(), 0);
212 // 断言 TradeOrderItemDO 订单(第 2 个) 212 // 断言 TradeOrderItemDO 订单(第 2 个)
213 TradeOrderItemDO tradeOrderItemDO02 = tradeOrderItemDOs.get(1); 213 TradeOrderItemDO tradeOrderItemDO02 = tradeOrderItemDOs.get(1);
@@ -228,7 +228,7 @@ class TradeOrderServiceTest extends BaseDbUnitTest { @@ -228,7 +228,7 @@ class TradeOrderServiceTest extends BaseDbUnitTest {
228 assertEquals(tradeOrderItemDO02.getPayPrice(), 40); 228 assertEquals(tradeOrderItemDO02.getPayPrice(), 40);
229 assertEquals(tradeOrderItemDO02.getOrderPartPrice(), 15); 229 assertEquals(tradeOrderItemDO02.getOrderPartPrice(), 15);
230 assertEquals(tradeOrderItemDO02.getOrderDividePrice(), 25); 230 assertEquals(tradeOrderItemDO02.getOrderDividePrice(), 25);
231 - assertEquals(tradeOrderItemDO02.getRefundStatus(), TradeOrderItemRefundStatusEnum.NONE.getStatus()); 231 + assertEquals(tradeOrderItemDO02.getAfterSaleStatus(), TradeOrderItemAfterSaleStatusEnum.NONE.getStatus());
232 assertEquals(tradeOrderItemDO02.getRefundTotal(), 0); 232 assertEquals(tradeOrderItemDO02.getRefundTotal(), 0);
233 // 校验调用 233 // 校验调用
234 verify(productSkuApi).updateSkuStock(argThat(new ArgumentMatcher<ProductSkuUpdateStockReqDTO>() { 234 verify(productSkuApi).updateSkuStock(argThat(new ArgumentMatcher<ProductSkuUpdateStockReqDTO>() {