Commit 10f2dbc8cd7d6f5150b50fff32c3c3ed51aec3c3
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
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>() { |