Commit 6f4c04d94491a1000d48e07fc7893def9d16ebad

Authored by YunaiV
1 parent 0c1f5c95

trade:完善退款详情

Showing 46 changed files with 577 additions and 619 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.common.util.spring; @@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.common.util.spring;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.map.MapUtil; 4 import cn.hutool.core.map.MapUtil;
5 import cn.hutool.core.util.ArrayUtil; 5 import cn.hutool.core.util.ArrayUtil;
6 -import org.aspectj.lang.JoinPoint;  
7 import org.aspectj.lang.ProceedingJoinPoint; 6 import org.aspectj.lang.ProceedingJoinPoint;
8 import org.aspectj.lang.reflect.MethodSignature; 7 import org.aspectj.lang.reflect.MethodSignature;
9 import org.springframework.core.DefaultParameterNameDiscoverer; 8 import org.springframework.core.DefaultParameterNameDiscoverer;
@@ -87,47 +86,4 @@ public class SpringExpressionUtils { @@ -87,47 +86,4 @@ public class SpringExpressionUtils {
87 return result; 86 return result;
88 } 87 }
89 88
90 - /**  
91 - * JoinPoint 切面 批量解析 EL 表达式,转换 jspl参数  
92 - *  
93 - * @param joinPoint 切面点  
94 - * @param info 返回值  
95 - * @param expressionStrings EL 表达式数组  
96 - * @return Map<String, Object> 结果  
97 - * @author 陈賝  
98 - * @since 2023/6/18 11:20  
99 - */  
100 - // TODO @chenchen: 这个方法,和 parseExpressions 比较接近,是不是可以合并下;  
101 - public static Map<String, Object> parseExpression(JoinPoint joinPoint, Object info, List<String> expressionStrings) {  
102 - // 如果为空,则不进行解析  
103 - if (CollUtil.isEmpty(expressionStrings)) {  
104 - return MapUtil.newHashMap();  
105 - }  
106 -  
107 - // 第一步,构建解析的上下文 EvaluationContext  
108 - // 通过 joinPoint 获取被注解方法  
109 - MethodSignature signature = (MethodSignature) joinPoint.getSignature();  
110 - Method method = signature.getMethod();  
111 - // 使用 spring 的 ParameterNameDiscoverer 获取方法形参名数组  
112 - String[] parameterNames = PARAMETER_NAME_DISCOVERER.getParameterNames(method);  
113 - // Spring 的表达式上下文对象  
114 - EvaluationContext context = new StandardEvaluationContext();  
115 - if (ArrayUtil.isNotEmpty(parameterNames)) {  
116 - //获取方法参数值  
117 - Object[] args = joinPoint.getArgs();  
118 - for (int i = 0; i < args.length; i++) {  
119 - // 替换 SP EL 里的变量值为实际值, 比如 #user --> user对象  
120 - context.setVariable(parameterNames[i], args[i]);  
121 - }  
122 - context.setVariable("info", info);  
123 - }  
124 - // 第二步,逐个参数解析  
125 - Map<String, Object> result = MapUtil.newHashMap(expressionStrings.size(), true);  
126 - expressionStrings.forEach(key -> {  
127 - Object value = EXPRESSION_PARSER.parseExpression(key).getValue(context);  
128 - result.put(key, value);  
129 - });  
130 - return result;  
131 - }  
132 -  
133 } 89 }
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/TradeAfterSaleStatusEnum.java renamed to yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleStatusEnum.java
@@ -18,7 +18,7 @@ import static cn.hutool.core.util.ArrayUtil.firstMatch; @@ -18,7 +18,7 @@ import static cn.hutool.core.util.ArrayUtil.firstMatch;
18 */ 18 */
19 @AllArgsConstructor 19 @AllArgsConstructor
20 @Getter 20 @Getter
21 -public enum TradeAfterSaleStatusEnum implements IntArrayValuable { 21 +public enum AfterSaleStatusEnum implements IntArrayValuable {
22 22
23 /** 23 /**
24 * 【申请售后】 24 * 【申请售后】
@@ -54,7 +54,7 @@ public enum TradeAfterSaleStatusEnum implements IntArrayValuable { @@ -54,7 +54,7 @@ public enum TradeAfterSaleStatusEnum implements IntArrayValuable {
54 SELLER_REFUSE(63,"卖家拒绝收货", "商家拒绝收货"), // 有赞的状态提示:商家拒绝收货,不同意退款 54 SELLER_REFUSE(63,"卖家拒绝收货", "商家拒绝收货"), // 有赞的状态提示:商家拒绝收货,不同意退款
55 ; 55 ;
56 56
57 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleStatusEnum::getStatus).toArray(); 57 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AfterSaleStatusEnum::getStatus).toArray();
58 58
59 /** 59 /**
60 * 进行中的售后状态 60 * 进行中的售后状态
@@ -88,7 +88,7 @@ public enum TradeAfterSaleStatusEnum implements IntArrayValuable { @@ -88,7 +88,7 @@ public enum TradeAfterSaleStatusEnum implements IntArrayValuable {
88 return ARRAYS; 88 return ARRAYS;
89 } 89 }
90 90
91 - public static TradeAfterSaleStatusEnum valueOf(Integer status) { 91 + public static AfterSaleStatusEnum valueOf(Integer status) {
92 return firstMatch(value -> value.getStatus().equals(status), values()); 92 return firstMatch(value -> value.getStatus().equals(status), values());
93 } 93 }
94 94
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/TradeAfterSaleTypeEnum.java renamed to yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleTypeEnum.java
@@ -13,12 +13,12 @@ import java.util.Arrays; @@ -13,12 +13,12 @@ import java.util.Arrays;
13 */ 13 */
14 @RequiredArgsConstructor 14 @RequiredArgsConstructor
15 @Getter 15 @Getter
16 -public enum TradeAfterSaleTypeEnum implements IntArrayValuable { 16 +public enum AfterSaleTypeEnum implements IntArrayValuable {
17 17
18 IN_SALE(10, "售中退款"), // 交易完成前买家申请退款 18 IN_SALE(10, "售中退款"), // 交易完成前买家申请退款
19 AFTER_SALE(20, "售后退款"); // 交易完成后买家申请退款 19 AFTER_SALE(20, "售后退款"); // 交易完成后买家申请退款
20 20
21 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleTypeEnum::getType).toArray(); 21 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AfterSaleTypeEnum::getType).toArray();
22 22
23 /** 23 /**
24 * 类型 24 * 类型
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/TradeAfterSaleWayEnum.java renamed to yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/aftersale/AfterSaleWayEnum.java
@@ -13,12 +13,12 @@ import java.util.Arrays; @@ -13,12 +13,12 @@ import java.util.Arrays;
13 */ 13 */
14 @RequiredArgsConstructor 14 @RequiredArgsConstructor
15 @Getter 15 @Getter
16 -public enum TradeAfterSaleWayEnum implements IntArrayValuable { 16 +public enum AfterSaleWayEnum implements IntArrayValuable {
17 17
18 REFUND(10, "仅退款"), 18 REFUND(10, "仅退款"),
19 RETURN_AND_REFUND(20, "退货退款"); 19 RETURN_AND_REFUND(20, "退货退款");
20 20
21 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeAfterSaleWayEnum::getWay).toArray(); 21 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AfterSaleWayEnum::getWay).toArray();
22 22
23 /** 23 /**
24 * 方式 24 * 方式
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/TradeAfterSaleController.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/AfterSaleController.java
@@ -8,13 +8,13 @@ import cn.iocoder.yudao.module.member.api.user.MemberUserApi; @@ -8,13 +8,13 @@ import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
8 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 8 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
9 import cn.iocoder.yudao.module.pay.api.notify.dto.PayRefundNotifyReqDTO; 9 import cn.iocoder.yudao.module.pay.api.notify.dto.PayRefundNotifyReqDTO;
10 import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.*; 10 import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.*;
11 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO;  
12 -import cn.iocoder.yudao.module.trade.convert.aftersale.TradeAfterSaleConvert;  
13 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; 11 +import cn.iocoder.yudao.module.trade.convert.aftersale.AfterSaleConvert;
  12 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
  13 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO;
14 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 14 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
15 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 15 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
16 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service.AfterSaleLogService;  
17 -import cn.iocoder.yudao.module.trade.service.aftersale.TradeAfterSaleService; 16 +import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleLogService;
  17 +import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleService;
18 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; 18 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
19 import io.swagger.v3.oas.annotations.Operation; 19 import io.swagger.v3.oas.annotations.Operation;
20 import io.swagger.v3.oas.annotations.Parameter; 20 import io.swagger.v3.oas.annotations.Parameter;
@@ -27,8 +27,6 @@ import org.springframework.web.bind.annotation.*; @@ -27,8 +27,6 @@ import org.springframework.web.bind.annotation.*;
27 import javax.annotation.Resource; 27 import javax.annotation.Resource;
28 import javax.annotation.security.PermitAll; 28 import javax.annotation.security.PermitAll;
29 import javax.validation.Valid; 29 import javax.validation.Valid;
30 -import java.time.LocalDateTime;  
31 -import java.util.ArrayList;  
32 import java.util.List; 30 import java.util.List;
33 import java.util.Map; 31 import java.util.Map;
34 32
@@ -42,10 +40,10 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @@ -42,10 +40,10 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
42 @RequestMapping("/trade/after-sale") 40 @RequestMapping("/trade/after-sale")
43 @Validated 41 @Validated
44 @Slf4j 42 @Slf4j
45 -public class TradeAfterSaleController { 43 +public class AfterSaleController {
46 44
47 @Resource 45 @Resource
48 - private TradeAfterSaleService afterSaleService; 46 + private AfterSaleService afterSaleService;
49 @Resource 47 @Resource
50 private TradeOrderQueryService tradeOrderQueryService; 48 private TradeOrderQueryService tradeOrderQueryService;
51 @Resource 49 @Resource
@@ -56,26 +54,26 @@ public class TradeAfterSaleController { @@ -56,26 +54,26 @@ public class TradeAfterSaleController {
56 @GetMapping("/page") 54 @GetMapping("/page")
57 @Operation(summary = "获得售后订单分页") 55 @Operation(summary = "获得售后订单分页")
58 @PreAuthorize("@ss.hasPermission('trade:after-sale:query')") 56 @PreAuthorize("@ss.hasPermission('trade:after-sale:query')")
59 - public CommonResult<PageResult<TradeAfterSaleRespPageItemVO>> getAfterSalePage(@Valid TradeAfterSalePageReqVO pageVO) { 57 + public CommonResult<PageResult<AfterSaleRespPageItemVO>> getAfterSalePage(@Valid AfterSalePageReqVO pageVO) {
60 // 查询售后 58 // 查询售后
61 - PageResult<TradeAfterSaleDO> pageResult = afterSaleService.getAfterSalePage(pageVO); 59 + PageResult<AfterSaleDO> pageResult = afterSaleService.getAfterSalePage(pageVO);
62 if (CollUtil.isEmpty(pageResult.getList())) { 60 if (CollUtil.isEmpty(pageResult.getList())) {
63 return success(PageResult.empty()); 61 return success(PageResult.empty());
64 } 62 }
65 63
66 // 查询会员 64 // 查询会员
67 Map<Long, MemberUserRespDTO> memberUsers = memberUserApi.getUserMap( 65 Map<Long, MemberUserRespDTO> memberUsers = memberUserApi.getUserMap(
68 - convertSet(pageResult.getList(), TradeAfterSaleDO::getUserId));  
69 - return success(TradeAfterSaleConvert.INSTANCE.convertPage(pageResult, memberUsers)); 66 + convertSet(pageResult.getList(), AfterSaleDO::getUserId));
  67 + return success(AfterSaleConvert.INSTANCE.convertPage(pageResult, memberUsers));
70 } 68 }
71 69
72 @GetMapping("/get-detail") 70 @GetMapping("/get-detail")
73 @Operation(summary = "获得售后订单详情") 71 @Operation(summary = "获得售后订单详情")
74 @Parameter(name = "id", description = "售后编号", required = true, example = "1") 72 @Parameter(name = "id", description = "售后编号", required = true, example = "1")
75 @PreAuthorize("@ss.hasPermission('trade:after-sale:query')") 73 @PreAuthorize("@ss.hasPermission('trade:after-sale:query')")
76 - public CommonResult<TradeAfterSaleDetailRespVO> getOrderDetail(@RequestParam("id") Long id) { 74 + public CommonResult<AfterSaleDetailRespVO> getOrderDetail(@RequestParam("id") Long id) {
77 // 查询订单 75 // 查询订单
78 - TradeAfterSaleDO afterSale = afterSaleService.getAfterSale(id); 76 + AfterSaleDO afterSale = afterSaleService.getAfterSale(id);
79 if (afterSale == null) { 77 if (afterSale == null) {
80 return success(null); 78 return success(null);
81 } 79 }
@@ -83,34 +81,11 @@ public class TradeAfterSaleController { @@ -83,34 +81,11 @@ public class TradeAfterSaleController {
83 // 查询订单 81 // 查询订单
84 TradeOrderDO order = tradeOrderQueryService.getOrder(afterSale.getOrderId()); 82 TradeOrderDO order = tradeOrderQueryService.getOrder(afterSale.getOrderId());
85 // 查询订单项 83 // 查询订单项
86 - List<TradeOrderItemDO> orderItems = tradeOrderQueryService.getOrderItemListByOrderId(id); 84 + TradeOrderItemDO orderItem = tradeOrderQueryService.getOrderItem(afterSale.getOrderItemId());
87 // 拼接数据 85 // 拼接数据
88 MemberUserRespDTO user = memberUserApi.getUser(afterSale.getUserId()); 86 MemberUserRespDTO user = memberUserApi.getUser(afterSale.getUserId());
89 - // 获取售后日志  
90 - List<TradeAfterSaleLogRespVO> logs = afterSaleLogService.getLog(afterSale.getId());  
91 - // TODO 方便测试看效果,review 后移除  
92 - if (logs == null) {  
93 - logs = new ArrayList<>();  
94 - }  
95 - for (int i = 1; i <= 6; i++) {  
96 - TradeAfterSaleLogRespVO respVO = new TradeAfterSaleLogRespVO();  
97 - respVO.setId((long) i);  
98 - respVO.setUserId((long) i);  
99 - respVO.setUserType(i % 2 == 0 ? 2 : 1);  
100 - // 模拟系统操作  
101 - if (i == 2) {  
102 - respVO.setUserType(3);  
103 - }  
104 - respVO.setAfterSaleId(id);  
105 - respVO.setOrderId((long) i);  
106 - respVO.setOrderItemId((long) i);  
107 - respVO.setBeforeStatus((i - 1) * 10);  
108 - respVO.setAfterStatus(i * 10);  
109 - respVO.setContent("66+6");  
110 - respVO.setCreateTime(LocalDateTime.now());  
111 - logs.add(respVO);  
112 - }  
113 - return success(TradeAfterSaleConvert.INSTANCE.convert(afterSale, order, orderItems, user, logs)); 87 + List<AfterSaleLogDO> logs = afterSaleLogService.getAfterSaleLogList(afterSale.getId());
  88 + return success(AfterSaleConvert.INSTANCE.convert(afterSale, order, orderItem, user, logs));
114 } 89 }
115 90
116 @PutMapping("/agree") 91 @PutMapping("/agree")
@@ -125,7 +100,7 @@ public class TradeAfterSaleController { @@ -125,7 +100,7 @@ public class TradeAfterSaleController {
125 @PutMapping("/disagree") 100 @PutMapping("/disagree")
126 @Operation(summary = "拒绝售后") 101 @Operation(summary = "拒绝售后")
127 @PreAuthorize("@ss.hasPermission('trade:after-sale:disagree')") 102 @PreAuthorize("@ss.hasPermission('trade:after-sale:disagree')")
128 - public CommonResult<Boolean> disagreeAfterSale(@RequestBody TradeAfterSaleDisagreeReqVO confirmReqVO) { 103 + public CommonResult<Boolean> disagreeAfterSale(@RequestBody AfterSaleDisagreeReqVO confirmReqVO) {
129 afterSaleService.disagreeAfterSale(getLoginUserId(), confirmReqVO); 104 afterSaleService.disagreeAfterSale(getLoginUserId(), confirmReqVO);
130 return success(true); 105 return success(true);
131 } 106 }
@@ -143,7 +118,7 @@ public class TradeAfterSaleController { @@ -143,7 +118,7 @@ public class TradeAfterSaleController {
143 @Operation(summary = "拒绝收货") 118 @Operation(summary = "拒绝收货")
144 @Parameter(name = "id", description = "售后编号", required = true, example = "1") 119 @Parameter(name = "id", description = "售后编号", required = true, example = "1")
145 @PreAuthorize("@ss.hasPermission('trade:after-sale:receive')") 120 @PreAuthorize("@ss.hasPermission('trade:after-sale:receive')")
146 - public CommonResult<Boolean> refuseAfterSale(TradeAfterSaleRefuseReqVO refuseReqVO) { 121 + public CommonResult<Boolean> refuseAfterSale(AfterSaleRefuseReqVO refuseReqVO) {
147 afterSaleService.refuseAfterSale(getLoginUserId(), refuseReqVO); 122 afterSaleService.refuseAfterSale(getLoginUserId(), refuseReqVO);
148 return success(true); 123 return success(true);
149 } 124 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/TradeAfterSaleBaseVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleBaseVO.java
@@ -15,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -15,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
15 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 15 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
16 */ 16 */
17 @Data 17 @Data
18 -public class TradeAfterSaleBaseVO { 18 +public class AfterSaleBaseVO {
19 19
20 @Schema(description = "售后流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "202211190847450020500077") 20 @Schema(description = "售后流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "202211190847450020500077")
21 @NotNull(message = "售后流水号不能为空") 21 @NotNull(message = "售后流水号不能为空")
@@ -53,7 +53,7 @@ public class TradeAfterSaleBaseVO { @@ -53,7 +53,7 @@ public class TradeAfterSaleBaseVO {
53 53
54 @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022111917190001") 54 @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022111917190001")
55 @NotNull(message = "订单流水号不能为空") 55 @NotNull(message = "订单流水号不能为空")
56 - private Long orderNo; 56 + private String orderNo;
57 57
58 @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "572") 58 @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "572")
59 @NotNull(message = "订单项编号不能为空") 59 @NotNull(message = "订单项编号不能为空")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDetailRespVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleDetailRespVO.java
1 package cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo; 1 package cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo;
2 2
3 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO; 3 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.AfterSaleLogRespVO;
4 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO; 4 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
5 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; 5 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
6 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderBaseVO; 6 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderBaseVO;
@@ -12,20 +12,21 @@ import java.util.List; @@ -12,20 +12,21 @@ import java.util.List;
12 12
13 @Schema(description = "管理后台 - 售后订单的详情 Response VO") 13 @Schema(description = "管理后台 - 售后订单的详情 Response VO")
14 @Data 14 @Data
15 -public class TradeAfterSaleDetailRespVO extends TradeAfterSaleBaseVO { 15 +public class AfterSaleDetailRespVO extends AfterSaleBaseVO {
16 16
17 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 17 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
18 private Long id; 18 private Long id;
19 19
20 - /**  
21 - * 订单项列表  
22 - */  
23 - private List<Item> items; 20 +
24 21
25 /** 22 /**
26 * 订单基本信息 23 * 订单基本信息
27 */ 24 */
28 private TradeOrderBaseVO order; 25 private TradeOrderBaseVO order;
  26 + /**
  27 + * 订单项列表
  28 + */
  29 + private OrderItem orderItem;
29 30
30 /** 31 /**
31 * 用户信息 32 * 用户信息
@@ -35,11 +36,11 @@ public class TradeAfterSaleDetailRespVO extends TradeAfterSaleBaseVO { @@ -35,11 +36,11 @@ public class TradeAfterSaleDetailRespVO extends TradeAfterSaleBaseVO {
35 /** 36 /**
36 * 售后日志 37 * 售后日志
37 */ 38 */
38 - private List<TradeAfterSaleLogRespVO> logs; 39 + private List<AfterSaleLogRespVO> logs;
39 40
40 @Schema(description = "管理后台 - 交易订单的详情的订单项目") 41 @Schema(description = "管理后台 - 交易订单的详情的订单项目")
41 @Data 42 @Data
42 - public static class Item extends TradeOrderItemBaseVO { 43 + public static class OrderItem extends TradeOrderItemBaseVO {
43 44
44 /** 45 /**
45 * 属性数组 46 * 属性数组
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/TradeAfterSaleDisagreeReqVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleDisagreeReqVO.java
@@ -8,7 +8,7 @@ import javax.validation.constraints.NotNull; @@ -8,7 +8,7 @@ import javax.validation.constraints.NotNull;
8 8
9 @Schema(description = "管理后台 - 交易售后拒绝 Request VO") 9 @Schema(description = "管理后台 - 交易售后拒绝 Request VO")
10 @Data 10 @Data
11 -public class TradeAfterSaleDisagreeReqVO { 11 +public class AfterSaleDisagreeReqVO {
12 12
13 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 13 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14 @NotNull(message = "售后编号不能为空") 14 @NotNull(message = "售后编号不能为空")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/TradeAfterSalePageReqVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSalePageReqVO.java
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo; @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.validation.InEnum; 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
5 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;  
6 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;  
7 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum; 5 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleStatusEnum;
  6 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleTypeEnum;
  7 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleWayEnum;
8 import io.swagger.v3.oas.annotations.media.Schema; 8 import io.swagger.v3.oas.annotations.media.Schema;
9 import lombok.Data; 9 import lombok.Data;
10 import lombok.EqualsAndHashCode; 10 import lombok.EqualsAndHashCode;
@@ -19,21 +19,21 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -19,21 +19,21 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
19 @Data 19 @Data
20 @EqualsAndHashCode(callSuper = true) 20 @EqualsAndHashCode(callSuper = true)
21 @ToString(callSuper = true) 21 @ToString(callSuper = true)
22 -public class TradeAfterSalePageReqVO extends PageParam { 22 +public class AfterSalePageReqVO extends PageParam {
23 23
24 @Schema(description = "售后流水号", example = "202211190847450020500077") 24 @Schema(description = "售后流水号", example = "202211190847450020500077")
25 private String no; 25 private String no;
26 26
27 @Schema(description = "售后状态", example = "10") 27 @Schema(description = "售后状态", example = "10")
28 - @InEnum(value = TradeAfterSaleStatusEnum.class, message = "售后状态必须是 {value}") 28 + @InEnum(value = AfterSaleStatusEnum.class, message = "售后状态必须是 {value}")
29 private Integer status; 29 private Integer status;
30 30
31 @Schema(description = "售后类型", example = "20") 31 @Schema(description = "售后类型", example = "20")
32 - @InEnum(value = TradeAfterSaleTypeEnum.class, message = "售后类型必须是 {value}") 32 + @InEnum(value = AfterSaleTypeEnum.class, message = "售后类型必须是 {value}")
33 private Integer type; 33 private Integer type;
34 34
35 @Schema(description = "售后方式", example = "10") 35 @Schema(description = "售后方式", example = "10")
36 - @InEnum(value = TradeAfterSaleWayEnum.class, message = "售后方式必须是 {value}") 36 + @InEnum(value = AfterSaleWayEnum.class, message = "售后方式必须是 {value}")
37 private Integer way; 37 private Integer way;
38 38
39 @Schema(description = "订单编号", example = "18078") 39 @Schema(description = "订单编号", example = "18078")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRefuseReqVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleRefuseReqVO.java
@@ -7,7 +7,7 @@ import javax.validation.constraints.NotNull; @@ -7,7 +7,7 @@ import javax.validation.constraints.NotNull;
7 7
8 @Schema(description = "管理后台 - 交易售后拒绝收货 Request VO") 8 @Schema(description = "管理后台 - 交易售后拒绝收货 Request VO")
9 @Data 9 @Data
10 -public class TradeAfterSaleRefuseReqVO { 10 +public class AfterSaleRefuseReqVO {
11 11
12 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 12 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 @NotNull(message = "售后编号不能为空") 13 @NotNull(message = "售后编号不能为空")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/TradeAfterSaleRespPageItemVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleRespPageItemVO.java
@@ -14,7 +14,7 @@ import java.util.List; @@ -14,7 +14,7 @@ import java.util.List;
14 @Data 14 @Data
15 @EqualsAndHashCode(callSuper = true) 15 @EqualsAndHashCode(callSuper = true)
16 @ToString(callSuper = true) 16 @ToString(callSuper = true)
17 -public class TradeAfterSaleRespPageItemVO extends TradeAfterSaleBaseVO { 17 +public class AfterSaleRespPageItemVO extends AfterSaleBaseVO {
18 18
19 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27630") 19 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27630")
20 private Long id; 20 private Long id;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/log/TradeAfterSaleLogRespVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/log/AfterSaleLogRespVO.java
@@ -8,7 +8,7 @@ import java.time.LocalDateTime; @@ -8,7 +8,7 @@ import java.time.LocalDateTime;
8 8
9 @Schema(description = "管理后台 - 交易售后日志 Response VO") 9 @Schema(description = "管理后台 - 交易售后日志 Response VO")
10 @Data 10 @Data
11 -public class TradeAfterSaleLogRespVO { 11 +public class AfterSaleLogRespVO {
12 12
13 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20669") 13 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20669")
14 private Long id; 14 private Long id;
@@ -25,14 +25,6 @@ public class TradeAfterSaleLogRespVO { @@ -25,14 +25,6 @@ public class TradeAfterSaleLogRespVO {
25 @NotNull(message = "售后编号不能为空") 25 @NotNull(message = "售后编号不能为空")
26 private Long afterSaleId; 26 private Long afterSaleId;
27 27
28 - @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25870")  
29 - @NotNull(message = "订单编号不能为空")  
30 - private Long orderId;  
31 -  
32 - @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23154")  
33 - @NotNull(message = "订单项编号不能为空")  
34 - private Long orderItemId;  
35 -  
36 @Schema(description = "售后状态(之前)", example = "2") 28 @Schema(description = "售后状态(之前)", example = "2")
37 private Integer beforeStatus; 29 private Integer beforeStatus;
38 30
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppTradeAfterSaleController.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppAfterSaleController.java
@@ -3,15 +3,11 @@ package cn.iocoder.yudao.module.trade.controller.app.aftersale; @@ -3,15 +3,11 @@ package cn.iocoder.yudao.module.trade.controller.app.aftersale;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageParam; 4 import cn.iocoder.yudao.framework.common.pojo.PageParam;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO;  
7 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleDeliveryReqVO;  
8 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleRespVO;  
9 -import cn.iocoder.yudao.module.trade.convert.aftersale.TradeAfterSaleConvert;  
10 -import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleOperateTypeEnum;  
11 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;  
12 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.annotations.AfterSaleLog;  
13 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.util.AfterSaleLogUtils;  
14 -import cn.iocoder.yudao.module.trade.service.aftersale.TradeAfterSaleService; 6 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO;
  8 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleRespVO;
  9 +import cn.iocoder.yudao.module.trade.convert.aftersale.AfterSaleConvert;
  10 +import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleService;
15 import io.swagger.v3.oas.annotations.Operation; 11 import io.swagger.v3.oas.annotations.Operation;
16 import io.swagger.v3.oas.annotations.Parameter; 12 import io.swagger.v3.oas.annotations.Parameter;
17 import io.swagger.v3.oas.annotations.tags.Tag; 13 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -29,23 +25,23 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @@ -29,23 +25,23 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
29 @RequestMapping("/trade/after-sale") 25 @RequestMapping("/trade/after-sale")
30 @Validated 26 @Validated
31 @Slf4j 27 @Slf4j
32 -public class AppTradeAfterSaleController { 28 +public class AppAfterSaleController {
33 29
34 @Resource 30 @Resource
35 - private TradeAfterSaleService afterSaleService; 31 + private AfterSaleService afterSaleService;
36 32
37 @GetMapping(value = "/page") 33 @GetMapping(value = "/page")
38 @Operation(summary = "获得售后分页") 34 @Operation(summary = "获得售后分页")
39 - public CommonResult<PageResult<AppTradeAfterSaleRespVO>> getAfterSalePage(PageParam pageParam) {  
40 - return success(TradeAfterSaleConvert.INSTANCE.convertPage02( 35 + public CommonResult<PageResult<AppAfterSaleRespVO>> getAfterSalePage(PageParam pageParam) {
  36 + return success(AfterSaleConvert.INSTANCE.convertPage02(
41 afterSaleService.getAfterSalePage(getLoginUserId(), pageParam))); 37 afterSaleService.getAfterSalePage(getLoginUserId(), pageParam)));
42 } 38 }
43 39
44 @GetMapping(value = "/get") 40 @GetMapping(value = "/get")
45 @Operation(summary = "获得售后订单") 41 @Operation(summary = "获得售后订单")
46 @Parameter(name = "id", description = "售后编号", required = true, example = "1") 42 @Parameter(name = "id", description = "售后编号", required = true, example = "1")
47 - public CommonResult<AppTradeAfterSaleRespVO> getAfterSale(@RequestParam("id") Long id) {  
48 - return success(TradeAfterSaleConvert.INSTANCE.convert(afterSaleService.getAfterSale(getLoginUserId(), id))); 43 + public CommonResult<AppAfterSaleRespVO> getAfterSale(@RequestParam("id") Long id) {
  44 + return success(AfterSaleConvert.INSTANCE.convert(afterSaleService.getAfterSale(getLoginUserId(), id)));
49 } 45 }
50 46
51 @GetMapping(value = "/get-applying-count") 47 @GetMapping(value = "/get-applying-count")
@@ -56,16 +52,13 @@ public class AppTradeAfterSaleController { @@ -56,16 +52,13 @@ public class AppTradeAfterSaleController {
56 52
57 @PostMapping(value = "/create") 53 @PostMapping(value = "/create")
58 @Operation(summary = "申请售后") 54 @Operation(summary = "申请售后")
59 - @AfterSaleLog(id = "#info.data", content = "'申请售后:售后编号['+#info.data+'],订单编号['+#createReqVO.orderItemId+'], '", operateType = AfterSaleOperateTypeEnum.MEMBER_CREATE)  
60 - public CommonResult<Long> createAfterSale(@RequestBody AppTradeAfterSaleCreateReqVO createReqVO) {  
61 - AfterSaleLogUtils.setBeforeStatus(0);  
62 - AfterSaleLogUtils.setAfterStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); 55 + public CommonResult<Long> createAfterSale(@RequestBody AppAfterSaleCreateReqVO createReqVO) {
63 return success(afterSaleService.createAfterSale(getLoginUserId(), createReqVO)); 56 return success(afterSaleService.createAfterSale(getLoginUserId(), createReqVO));
64 } 57 }
65 58
66 @PutMapping(value = "/delivery") 59 @PutMapping(value = "/delivery")
67 @Operation(summary = "退回货物") 60 @Operation(summary = "退回货物")
68 - public CommonResult<Boolean> deliveryAfterSale(@RequestBody AppTradeAfterSaleDeliveryReqVO deliveryReqVO) { 61 + public CommonResult<Boolean> deliveryAfterSale(@RequestBody AppAfterSaleDeliveryReqVO deliveryReqVO) {
69 afterSaleService.deliveryAfterSale(getLoginUserId(), deliveryReqVO); 62 afterSaleService.deliveryAfterSale(getLoginUserId(), deliveryReqVO);
70 return success(true); 63 return success(true);
71 } 64 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleCreateReqVO.java
1 package cn.iocoder.yudao.module.trade.controller.app.aftersale.vo; 1 package cn.iocoder.yudao.module.trade.controller.app.aftersale.vo;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum; 4 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleWayEnum;
5 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
6 import lombok.Data; 6 import lombok.Data;
7 7
@@ -11,7 +11,7 @@ import java.util.List; @@ -11,7 +11,7 @@ import java.util.List;
11 11
12 @Schema(description = "用户 App - 交易售后创建 Request VO") 12 @Schema(description = "用户 App - 交易售后创建 Request VO")
13 @Data 13 @Data
14 -public class AppTradeAfterSaleCreateReqVO { 14 +public class AppAfterSaleCreateReqVO {
15 15
16 @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 16 @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
17 @NotNull(message = "订单项编号不能为空") 17 @NotNull(message = "订单项编号不能为空")
@@ -19,7 +19,7 @@ public class AppTradeAfterSaleCreateReqVO { @@ -19,7 +19,7 @@ public class AppTradeAfterSaleCreateReqVO {
19 19
20 @Schema(description = "售后方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 20 @Schema(description = "售后方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
21 @NotNull(message = "售后方式不能为空") 21 @NotNull(message = "售后方式不能为空")
22 - @InEnum(value = TradeAfterSaleWayEnum.class, message = "售后方式必须是 {value}") 22 + @InEnum(value = AfterSaleWayEnum.class, message = "售后方式必须是 {value}")
23 private Integer way; 23 private Integer way;
24 24
25 @Schema(description = "退款金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") 25 @Schema(description = "退款金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleDeliveryReqVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleDeliveryReqVO.java
@@ -7,7 +7,7 @@ import javax.validation.constraints.NotNull; @@ -7,7 +7,7 @@ import javax.validation.constraints.NotNull;
7 7
8 @Schema(description = "用户 App - 交易售后退回货物 Request VO") 8 @Schema(description = "用户 App - 交易售后退回货物 Request VO")
9 @Data 9 @Data
10 -public class AppTradeAfterSaleDeliveryReqVO { 10 +public class AppAfterSaleDeliveryReqVO {
11 11
12 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 12 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 @NotNull(message = "售后编号不能为空") 13 @NotNull(message = "售后编号不能为空")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleRespVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleRespVO.java
@@ -9,7 +9,7 @@ import java.util.List; @@ -9,7 +9,7 @@ import java.util.List;
9 9
10 @Schema(description = "用户 App - 交易售后 Response VO") 10 @Schema(description = "用户 App - 交易售后 Response VO")
11 @Data 11 @Data
12 -public class AppTradeAfterSaleRespVO { 12 +public class AppAfterSaleRespVO {
13 13
14 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 14 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
15 private Long id; 15 private Long id;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/TradeAfterSaleConvert.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/AfterSaleConvert.java
@@ -4,16 +4,16 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -4,16 +4,16 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 4 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
5 import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO; 5 import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO;
6 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; 6 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
7 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleDetailRespVO;  
8 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleRespPageItemVO;  
9 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO; 7 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleDetailRespVO;
  8 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleRespPageItemVO;
  9 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.AfterSaleLogRespVO;
10 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO; 10 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
11 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; 11 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
12 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderBaseVO; 12 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderBaseVO;
13 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO;  
14 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleRespVO;  
15 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;  
16 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO; 13 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  14 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleRespVO;
  15 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
  16 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO;
17 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 17 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
18 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 18 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
19 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 19 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
@@ -26,9 +26,9 @@ import java.util.List; @@ -26,9 +26,9 @@ import java.util.List;
26 import java.util.Map; 26 import java.util.Map;
27 27
28 @Mapper 28 @Mapper
29 -public interface TradeAfterSaleConvert { 29 +public interface AfterSaleConvert {
30 30
31 - TradeAfterSaleConvert INSTANCE = Mappers.getMapper(TradeAfterSaleConvert.class); 31 + AfterSaleConvert INSTANCE = Mappers.getMapper(AfterSaleConvert.class);
32 32
33 @Mappings({ 33 @Mappings({
34 @Mapping(target = "id", ignore = true), 34 @Mapping(target = "id", ignore = true),
@@ -37,7 +37,7 @@ public interface TradeAfterSaleConvert { @@ -37,7 +37,7 @@ public interface TradeAfterSaleConvert {
37 @Mapping(target = "creator", ignore = true), 37 @Mapping(target = "creator", ignore = true),
38 @Mapping(target = "updater", ignore = true), 38 @Mapping(target = "updater", ignore = true),
39 }) 39 })
40 - TradeAfterSaleDO convert(AppTradeAfterSaleCreateReqVO createReqVO, TradeOrderItemDO tradeOrderItem); 40 + AfterSaleDO convert(AppAfterSaleCreateReqVO createReqVO, TradeOrderItemDO tradeOrderItem);
41 41
42 @Mappings({ 42 @Mappings({
43 @Mapping(source = "afterSale.orderId", target = "merchantOrderId"), 43 @Mapping(source = "afterSale.orderId", target = "merchantOrderId"),
@@ -45,16 +45,16 @@ public interface TradeAfterSaleConvert { @@ -45,16 +45,16 @@ public interface TradeAfterSaleConvert {
45 @Mapping(source = "afterSale.applyReason", target = "reason"), 45 @Mapping(source = "afterSale.applyReason", target = "reason"),
46 @Mapping(source = "afterSale.refundPrice", target = "price") 46 @Mapping(source = "afterSale.refundPrice", target = "price")
47 }) 47 })
48 - PayRefundCreateReqDTO convert(String userIp, TradeAfterSaleDO afterSale, 48 + PayRefundCreateReqDTO convert(String userIp, AfterSaleDO afterSale,
49 TradeOrderProperties orderProperties); 49 TradeOrderProperties orderProperties);
50 50
51 MemberUserRespVO convert(MemberUserRespDTO bean); 51 MemberUserRespVO convert(MemberUserRespDTO bean);
52 52
53 - PageResult<TradeAfterSaleRespPageItemVO> convertPage(PageResult<TradeAfterSaleDO> page); 53 + PageResult<AfterSaleRespPageItemVO> convertPage(PageResult<AfterSaleDO> page);
54 54
55 - default PageResult<TradeAfterSaleRespPageItemVO> convertPage(PageResult<TradeAfterSaleDO> pageResult,  
56 - Map<Long, MemberUserRespDTO> memberUsers) {  
57 - PageResult<TradeAfterSaleRespPageItemVO> voPageResult = convertPage(pageResult); 55 + default PageResult<AfterSaleRespPageItemVO> convertPage(PageResult<AfterSaleDO> pageResult,
  56 + Map<Long, MemberUserRespDTO> memberUsers) {
  57 + PageResult<AfterSaleRespPageItemVO> voPageResult = convertPage(pageResult);
58 // 处理会员 58 // 处理会员
59 voPageResult.getList().forEach(afterSale -> afterSale.setUser( 59 voPageResult.getList().forEach(afterSale -> afterSale.setUser(
60 convert(memberUsers.get(afterSale.getUserId())))); 60 convert(memberUsers.get(afterSale.getUserId()))));
@@ -63,27 +63,26 @@ public interface TradeAfterSaleConvert { @@ -63,27 +63,26 @@ public interface TradeAfterSaleConvert {
63 63
64 ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean); 64 ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean);
65 65
66 - AppTradeAfterSaleRespVO convert(TradeAfterSaleDO bean); 66 + AppAfterSaleRespVO convert(AfterSaleDO bean);
67 67
68 - PageResult<AppTradeAfterSaleRespVO> convertPage02(PageResult<TradeAfterSaleDO> page); 68 + PageResult<AppAfterSaleRespVO> convertPage02(PageResult<AfterSaleDO> page);
69 69
70 - List<TradeAfterSaleLogRespVO> convertList(List<TradeAfterSaleLogDO> list);  
71 -  
72 - default TradeAfterSaleDetailRespVO convert(TradeAfterSaleDO afterSale, TradeOrderDO order, List<TradeOrderItemDO> orderItems,  
73 - MemberUserRespDTO user, List<TradeAfterSaleLogRespVO> logs) {  
74 - TradeAfterSaleDetailRespVO respVO = convert(afterSale, orderItems); 70 + default AfterSaleDetailRespVO convert(AfterSaleDO afterSale, TradeOrderDO order, TradeOrderItemDO orderItem,
  71 + MemberUserRespDTO user, List<AfterSaleLogDO> logs) {
  72 + AfterSaleDetailRespVO respVO = convert02(afterSale);
75 // 处理用户信息 73 // 处理用户信息
76 respVO.setUser(convert(user)); 74 respVO.setUser(convert(user));
77 // 处理订单信息 75 // 处理订单信息
78 respVO.setOrder(convert(order)); 76 respVO.setOrder(convert(order));
  77 + respVO.setOrderItem(convert02(orderItem));
79 // 处理售后日志 78 // 处理售后日志
80 respVO.setLogs(convertList1(logs)); 79 respVO.setLogs(convertList1(logs));
81 return respVO; 80 return respVO;
82 } 81 }
83 82
84 - List<TradeAfterSaleLogRespVO> convertList1(List<TradeAfterSaleLogRespVO> list);  
85 - @Mapping(target = "id", source = "afterSale.id")  
86 - TradeAfterSaleDetailRespVO convert(TradeAfterSaleDO afterSale, List<TradeOrderItemDO> orderItems);  
87 - TradeOrderBaseVO convert(TradeOrderDO order); 83 + List<AfterSaleLogRespVO> convertList1(List<AfterSaleLogDO> list);
  84 + AfterSaleDetailRespVO convert02(AfterSaleDO bean);
  85 + AfterSaleDetailRespVO.OrderItem convert02(TradeOrderItemDO bean);
  86 + TradeOrderBaseVO convert(TradeOrderDO bean);
88 87
89 } 88 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/AfterSaleLogConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.convert.aftersale;
  2 +
  3 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO;
  4 +import cn.iocoder.yudao.module.trade.service.aftersale.bo.AfterSaleLogCreateReqBO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +@Mapper
  9 +public interface AfterSaleLogConvert {
  10 +
  11 + AfterSaleLogConvert INSTANCE = Mappers.getMapper(AfterSaleLogConvert.class);
  12 +
  13 + AfterSaleLogDO convert(AfterSaleLogCreateReqBO bean);
  14 +
  15 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderLogConvert.java
@@ -10,6 +10,6 @@ public interface TradeOrderLogConvert { @@ -10,6 +10,6 @@ public interface TradeOrderLogConvert {
10 10
11 TradeOrderLogConvert INSTANCE = Mappers.getMapper(TradeOrderLogConvert.class); 11 TradeOrderLogConvert INSTANCE = Mappers.getMapper(TradeOrderLogConvert.class);
12 12
13 - TradeOrderLogDO convert(TradeOrderLogCreateReqBO createReqBO); 13 + TradeOrderLogDO convert(TradeOrderLogCreateReqBO bean);
14 14
15 } 15 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleDO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/AfterSaleDO.java
@@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.aftersale; @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.aftersale;
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
6 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;  
7 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;  
8 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum; 6 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleStatusEnum;
  7 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleWayEnum;
9 import com.baomidou.mybatisplus.annotation.TableField; 9 import com.baomidou.mybatisplus.annotation.TableField;
10 import com.baomidou.mybatisplus.annotation.TableName; 10 import com.baomidou.mybatisplus.annotation.TableName;
11 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; 11 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
@@ -25,7 +25,7 @@ import java.util.List; @@ -25,7 +25,7 @@ import java.util.List;
25 @Data 25 @Data
26 @EqualsAndHashCode(callSuper = true) 26 @EqualsAndHashCode(callSuper = true)
27 @Accessors(chain = true) 27 @Accessors(chain = true)
28 -public class TradeAfterSaleDO extends BaseDO { 28 +public class AfterSaleDO extends BaseDO {
29 29
30 /** 30 /**
31 * 售后编号,主键自增 31 * 售后编号,主键自增
@@ -40,19 +40,19 @@ public class TradeAfterSaleDO extends BaseDO { @@ -40,19 +40,19 @@ public class TradeAfterSaleDO extends BaseDO {
40 /** 40 /**
41 * 退款状态 41 * 退款状态
42 * 42 *
43 - * 枚举 {@link TradeAfterSaleStatusEnum} 43 + * 枚举 {@link AfterSaleStatusEnum}
44 */ 44 */
45 private Integer status; 45 private Integer status;
46 /** 46 /**
47 * 售后方式 47 * 售后方式
48 * 48 *
49 - * 枚举 {@link TradeAfterSaleWayEnum} 49 + * 枚举 {@link AfterSaleWayEnum}
50 */ 50 */
51 private Integer way; 51 private Integer way;
52 /** 52 /**
53 * 售后类型 53 * 售后类型
54 * 54 *
55 - * 枚举 {@link TradeAfterSaleTypeEnum} 55 + * 枚举 {@link AfterSaleTypeEnum}
56 */ 56 */
57 private Integer type; 57 private Integer type;
58 /** 58 /**
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/TradeAfterSaleLogDO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/AfterSaleLogDO.java
@@ -11,8 +11,6 @@ import lombok.*; @@ -11,8 +11,6 @@ import lombok.*;
11 /** 11 /**
12 * 交易售后日志 DO 12 * 交易售后日志 DO
13 * 13 *
14 - * // TODO 可优化:参考淘宝或者有赞:1)增加 action 表示什么操作;2)content 记录每个操作的明细  
15 - *  
16 * @author 芋道源码 14 * @author 芋道源码
17 */ 15 */
18 @TableName("trade_after_sale_log") 16 @TableName("trade_after_sale_log")
@@ -23,7 +21,7 @@ import lombok.*; @@ -23,7 +21,7 @@ import lombok.*;
23 @Builder 21 @Builder
24 @NoArgsConstructor 22 @NoArgsConstructor
25 @AllArgsConstructor 23 @AllArgsConstructor
26 -public class TradeAfterSaleLogDO extends BaseDO { 24 +public class AfterSaleLogDO extends BaseDO {
27 25
28 /** 26 /**
29 * 编号 27 * 编号
@@ -43,19 +41,28 @@ public class TradeAfterSaleLogDO extends BaseDO { @@ -43,19 +41,28 @@ public class TradeAfterSaleLogDO extends BaseDO {
43 * 枚举 {@link UserTypeEnum} 41 * 枚举 {@link UserTypeEnum}
44 */ 42 */
45 private Integer userType; 43 private Integer userType;
  44 +
46 /** 45 /**
47 * 售后编号 46 * 售后编号
48 * 47 *
49 - * 关联 {@link TradeAfterSaleDO#getId()} 48 + * 关联 {@link AfterSaleDO#getId()}
50 */ 49 */
51 private Long afterSaleId; 50 private Long afterSaleId;
52 - // todo @CHENCHEN: 改成 Integer 哈;主要未来改文案,不好洗 log 存的字段; 51 + /**
  52 + * 操作前状态
  53 + */
  54 + private Integer beforeStatus;
  55 + /**
  56 + * 操作后状态
  57 + */
  58 + private Integer afterStatus;
  59 +
53 /** 60 /**
54 * 操作类型 61 * 操作类型
55 * 62 *
56 * 枚举 {@link AfterSaleOperateTypeEnum} 63 * 枚举 {@link AfterSaleOperateTypeEnum}
57 */ 64 */
58 - private String operateType; 65 + private Integer operateType;
59 /** 66 /**
60 * 操作明细 67 * 操作明细
61 */ 68 */
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.dal.dataobject.aftersale.TradeAfterSaleDO; 5 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
6 import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO; 6 import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO;
7 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; 7 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
8 import com.baomidou.mybatisplus.annotation.TableField; 8 import com.baomidou.mybatisplus.annotation.TableField;
@@ -166,7 +166,7 @@ public class TradeOrderItemDO extends BaseDO { @@ -166,7 +166,7 @@ public class TradeOrderItemDO extends BaseDO {
166 /** 166 /**
167 * 售后单编号 167 * 售后单编号
168 * 168 *
169 - * 关联 {@link TradeAfterSaleDO#getId()} 字段 169 + * 关联 {@link AfterSaleDO#getId()} 字段
170 */ 170 */
171 private Long afterSaleId; 171 private Long afterSaleId;
172 /** 172 /**
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/TradeAfterSaleLogMapper.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/AfterSaleLogMapper.java
1 package cn.iocoder.yudao.module.trade.dal.mysql.aftersale; 1 package cn.iocoder.yudao.module.trade.dal.mysql.aftersale;
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.aftersale.TradeAfterSaleLogDO; 4 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO;
5 import org.apache.ibatis.annotations.Mapper; 5 import org.apache.ibatis.annotations.Mapper;
6 6
  7 +import java.util.List;
  8 +
7 @Mapper 9 @Mapper
8 -public interface TradeAfterSaleLogMapper extends BaseMapperX<TradeAfterSaleLogDO> { 10 +public interface AfterSaleLogMapper extends BaseMapperX<AfterSaleLogDO> {
  11 +
  12 + default List<AfterSaleLogDO> selectListByAfterSaleId(Long afterSaleId) {
  13 + return selectList(AfterSaleLogDO::getAfterSaleId, afterSaleId);
  14 + }
  15 +
9 } 16 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/AfterSaleMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.dal.mysql.aftersale;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  6 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  7 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSalePageReqVO;
  8 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
  9 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  10 +import org.apache.ibatis.annotations.Mapper;
  11 +
  12 +import java.util.Collection;
  13 +
  14 +@Mapper
  15 +public interface AfterSaleMapper extends BaseMapperX<AfterSaleDO> {
  16 +
  17 + default PageResult<AfterSaleDO> selectPage(AfterSalePageReqVO reqVO) {
  18 + return selectPage(reqVO, new LambdaQueryWrapperX<AfterSaleDO>()
  19 + .likeIfPresent(AfterSaleDO::getNo, reqVO.getNo())
  20 + .eqIfPresent(AfterSaleDO::getStatus, reqVO.getStatus())
  21 + .eqIfPresent(AfterSaleDO::getType, reqVO.getType())
  22 + .eqIfPresent(AfterSaleDO::getWay, reqVO.getWay())
  23 + .likeIfPresent(AfterSaleDO::getOrderNo, reqVO.getOrderNo())
  24 + .likeIfPresent(AfterSaleDO::getSpuName, reqVO.getSpuName())
  25 + .betweenIfPresent(AfterSaleDO::getCreateTime, reqVO.getCreateTime())
  26 + .orderByDesc(AfterSaleDO::getId));
  27 + }
  28 +
  29 + default PageResult<AfterSaleDO> selectPage(Long userId, PageParam pageParam) {
  30 + return selectPage(pageParam, new LambdaQueryWrapperX<AfterSaleDO>()
  31 + .eqIfPresent(AfterSaleDO::getUserId, userId)
  32 + .orderByDesc(AfterSaleDO::getId));
  33 + }
  34 +
  35 + default int updateByIdAndStatus(Long id, Integer status, AfterSaleDO update) {
  36 + return update(update, new LambdaUpdateWrapper<AfterSaleDO>()
  37 + .eq(AfterSaleDO::getId, id).eq(AfterSaleDO::getStatus, status));
  38 + }
  39 +
  40 + default AfterSaleDO selectByIdAndUserId(Long id, Long userId) {
  41 + return selectOne(AfterSaleDO::getId, id,
  42 + AfterSaleDO::getUserId, userId);
  43 + }
  44 +
  45 + default Long selectCountByUserIdAndStatus(Long userId, Collection<Integer> statuses) {
  46 + return selectCount(new LambdaQueryWrapperX<AfterSaleDO>()
  47 + .eq(AfterSaleDO::getUserId, userId)
  48 + .in(AfterSaleDO::getStatus, statuses));
  49 + }
  50 +
  51 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/TradeAfterSaleMapper.java deleted
1 -package cn.iocoder.yudao.module.trade.dal.mysql.aftersale;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;  
6 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
7 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO;  
8 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;  
9 -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;  
10 -import org.apache.ibatis.annotations.Mapper;  
11 -  
12 -import java.util.Collection;  
13 -  
14 -@Mapper  
15 -public interface TradeAfterSaleMapper extends BaseMapperX<TradeAfterSaleDO> {  
16 -  
17 - default PageResult<TradeAfterSaleDO> selectPage(TradeAfterSalePageReqVO reqVO) {  
18 - return selectPage(reqVO, new LambdaQueryWrapperX<TradeAfterSaleDO>()  
19 - .likeIfPresent(TradeAfterSaleDO::getNo, reqVO.getNo())  
20 - .eqIfPresent(TradeAfterSaleDO::getStatus, reqVO.getStatus())  
21 - .eqIfPresent(TradeAfterSaleDO::getType, reqVO.getType())  
22 - .eqIfPresent(TradeAfterSaleDO::getWay, reqVO.getWay())  
23 - .likeIfPresent(TradeAfterSaleDO::getOrderNo, reqVO.getOrderNo())  
24 - .likeIfPresent(TradeAfterSaleDO::getSpuName, reqVO.getSpuName())  
25 - .betweenIfPresent(TradeAfterSaleDO::getCreateTime, reqVO.getCreateTime())  
26 - .orderByDesc(TradeAfterSaleDO::getId));  
27 - }  
28 -  
29 - default PageResult<TradeAfterSaleDO> selectPage(Long userId, PageParam pageParam) {  
30 - return selectPage(pageParam, new LambdaQueryWrapperX<TradeAfterSaleDO>()  
31 - .eqIfPresent(TradeAfterSaleDO::getUserId, userId)  
32 - .orderByDesc(TradeAfterSaleDO::getId));  
33 - }  
34 -  
35 - default int updateByIdAndStatus(Long id, Integer status, TradeAfterSaleDO update) {  
36 - return update(update, new LambdaUpdateWrapper<TradeAfterSaleDO>()  
37 - .eq(TradeAfterSaleDO::getId, id).eq(TradeAfterSaleDO::getStatus, status));  
38 - }  
39 -  
40 - default TradeAfterSaleDO selectByIdAndUserId(Long id, Long userId) {  
41 - return selectOne(TradeAfterSaleDO::getId, id,  
42 - TradeAfterSaleDO::getUserId, userId);  
43 - }  
44 -  
45 - default Long selectCountByUserIdAndStatus(Long userId, Collection<Integer> statuses) {  
46 - return selectCount(new LambdaQueryWrapperX<TradeAfterSaleDO>()  
47 - .eq(TradeAfterSaleDO::getUserId, userId)  
48 - .in(TradeAfterSaleDO::getStatus, statuses));  
49 - }  
50 -  
51 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/redis/RedisKeyConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.dal.redis;
  2 +
  3 +/**
  4 + * 交易 Redis Key 枚举类
  5 + *
  6 + * @author 芋道源码
  7 + */
  8 +public interface RedisKeyConstants {
  9 +
  10 + /**
  11 + * 交易序号的缓存
  12 + *
  13 + * KEY 格式:trade_no:{prefix}
  14 + * VALUE 数据格式:编号自增
  15 + */
  16 + String TRADE_NO = "trade_no:";
  17 +
  18 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/redis/no/TradeOrderNoRedisDAO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/redis/no/TradeNoRedisDAO.java
@@ -2,10 +2,12 @@ package cn.iocoder.yudao.module.trade.dal.redis.no; @@ -2,10 +2,12 @@ package cn.iocoder.yudao.module.trade.dal.redis.no;
2 2
3 import cn.hutool.core.date.DatePattern; 3 import cn.hutool.core.date.DatePattern;
4 import cn.hutool.core.date.DateUtil; 4 import cn.hutool.core.date.DateUtil;
  5 +import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants;
5 import org.springframework.data.redis.core.StringRedisTemplate; 6 import org.springframework.data.redis.core.StringRedisTemplate;
6 import org.springframework.stereotype.Repository; 7 import org.springframework.stereotype.Repository;
7 8
8 import javax.annotation.Resource; 9 import javax.annotation.Resource;
  10 +import java.time.Duration;
9 import java.time.LocalDateTime; 11 import java.time.LocalDateTime;
10 12
11 /** 13 /**
@@ -14,9 +16,11 @@ import java.time.LocalDateTime; @@ -14,9 +16,11 @@ import java.time.LocalDateTime;
14 * @author HUIHUI 16 * @author HUIHUI
15 */ 17 */
16 @Repository 18 @Repository
17 -public class TradeOrderNoRedisDAO { 19 +public class TradeNoRedisDAO {
18 20
19 - public static final String TRADE_ORDER_NO_PREFIX = "O"; 21 + public static final String TRADE_ORDER_NO_PREFIX = "o";
  22 +
  23 + public static final String AFTER_SALE_NO_PREFIX = "r";
20 24
21 @Resource 25 @Resource
22 private StringRedisTemplate stringRedisTemplate; 26 private StringRedisTemplate stringRedisTemplate;
@@ -28,8 +32,12 @@ public class TradeOrderNoRedisDAO { @@ -28,8 +32,12 @@ public class TradeOrderNoRedisDAO {
28 * @return 序号 32 * @return 序号
29 */ 33 */
30 public String generate(String prefix) { 34 public String generate(String prefix) {
  35 + // 递增序号
31 String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN); 36 String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN);
32 - Long no = stringRedisTemplate.opsForValue().increment(noPrefix); 37 + String key = RedisKeyConstants.TRADE_NO + noPrefix;
  38 + Long no = stringRedisTemplate.opsForValue().increment(key);
  39 + // 设置过期时间
  40 + stringRedisTemplate.expire(key, Duration.ofMinutes(1L));
33 return noPrefix + no; 41 return noPrefix + no;
34 } 42 }
35 43
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/config/AfterSaleLogConfiguration.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/config/AfterSaleLogConfiguration.java
1 -package cn.iocoder.yudao.module.trade.framework.aftersalelog.config; 1 +package cn.iocoder.yudao.module.trade.framework.aftersale.config;
2 2
3 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.aop.AfterSaleLogAspect; 3 +import cn.iocoder.yudao.module.trade.framework.aftersale.core.aop.AfterSaleLogAspect;
4 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.Bean;
5 import org.springframework.context.annotation.Configuration; 5 import org.springframework.context.annotation.Configuration;
6 6
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/annotations/AfterSaleLog.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/annotations/AfterSaleLog.java
1 -package cn.iocoder.yudao.module.trade.framework.aftersalelog.core.annotations; 1 +package cn.iocoder.yudao.module.trade.framework.aftersale.core.annotations;
2 2
3 import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleOperateTypeEnum; 3 import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleOperateTypeEnum;
  4 +import cn.iocoder.yudao.module.trade.framework.aftersale.core.aop.AfterSaleLogAspect;
4 5
5 import java.lang.annotation.*; 6 import java.lang.annotation.*;
6 7
@@ -11,7 +12,7 @@ import java.lang.annotation.*; @@ -11,7 +12,7 @@ import java.lang.annotation.*;
11 * 12 *
12 * @author 陈賝 13 * @author 陈賝
13 * @since 2023/6/8 17:04 14 * @since 2023/6/8 17:04
14 - * @see cn.iocoder.yudao.module.trade.framework.aftersalelog.core.aop.AfterSaleLogAspect 15 + * @see AfterSaleLogAspect
15 */ 16 */
16 @Target({ElementType.METHOD, ElementType.TYPE}) 17 @Target({ElementType.METHOD, ElementType.TYPE})
17 @Retention(RetentionPolicy.RUNTIME) 18 @Retention(RetentionPolicy.RUNTIME)
@@ -19,20 +20,8 @@ import java.lang.annotation.*; @@ -19,20 +20,8 @@ import java.lang.annotation.*;
19 public @interface AfterSaleLog { 20 public @interface AfterSaleLog {
20 21
21 /** 22 /**
22 - * 售后 ID  
23 - */  
24 - @Deprecated  
25 - String id() default "";  
26 -  
27 - /**  
28 * 操作类型 23 * 操作类型
29 */ 24 */
30 AfterSaleOperateTypeEnum operateType(); 25 AfterSaleOperateTypeEnum operateType();
31 26
32 - /**  
33 - * 日志内容  
34 - */  
35 - @Deprecated  
36 - String content() default "";  
37 -  
38 } 27 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/aop/AfterSaleLogAspect.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.aftersale.core.aop;
  2 +
  3 +import cn.hutool.core.util.ObjectUtil;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO;
  7 +import cn.iocoder.yudao.module.trade.framework.aftersale.core.annotations.AfterSaleLog;
  8 +import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleLogService;
  9 +import cn.iocoder.yudao.module.trade.service.aftersale.bo.AfterSaleLogCreateReqBO;
  10 +import lombok.extern.slf4j.Slf4j;
  11 +import org.aspectj.lang.JoinPoint;
  12 +import org.aspectj.lang.annotation.AfterReturning;
  13 +import org.aspectj.lang.annotation.Aspect;
  14 +
  15 +import javax.annotation.Resource;
  16 +import java.util.Map;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
  19 +import static java.util.Collections.emptyMap;
  20 +
  21 +/**
  22 + * 售后订单的操作记录的 AOP 切面
  23 + *
  24 + * @author 陈賝
  25 + * @since 2023/6/13 13:54
  26 + */
  27 +@Slf4j
  28 +@Aspect
  29 +public class AfterSaleLogAspect {
  30 +
  31 + /**
  32 + * 用户编号
  33 + *
  34 + * 目前的使用场景:支付回调时,需要强制设置下用户编号
  35 + */
  36 + private static final ThreadLocal<Long> USER_ID = new ThreadLocal<>();
  37 + /**
  38 + * 用户类型
  39 + */
  40 + private static final ThreadLocal<Integer> USER_TYPE = new ThreadLocal<>();
  41 + /**
  42 + * 订单编号
  43 + */
  44 + private static final ThreadLocal<Long> AFTER_SALE_ID = new ThreadLocal<>();
  45 + /**
  46 + * 操作前的状态
  47 + */
  48 + private static final ThreadLocal<Integer> BEFORE_STATUS = new ThreadLocal<>();
  49 + /**
  50 + * 操作后的状态
  51 + */
  52 + private static final ThreadLocal<Integer> AFTER_STATUS = new ThreadLocal<>();
  53 + /**
  54 + * 拓展参数 Map,用于格式化操作内容
  55 + */
  56 + private static final ThreadLocal<Map<String, Object>> EXTS = new ThreadLocal<>();
  57 +
  58 + @Resource
  59 + private AfterSaleLogService afterSaleLogService;
  60 +
  61 + @AfterReturning(pointcut = "@annotation(afterSaleLog)")
  62 + public void doAfterReturning(JoinPoint joinPoint, AfterSaleLog afterSaleLog) {
  63 + try {
  64 + // 1.1 操作用户
  65 + Integer userType = getUserType();
  66 + Long userId = getUserId();
  67 + // 1.2 售后信息
  68 + Long afterSaleId = AFTER_SALE_ID.get();
  69 + if (afterSaleId == null) { // 如果未设置,只有注解,说明不需要记录日志
  70 + return;
  71 + }
  72 + Integer beforeStatus = BEFORE_STATUS.get();
  73 + Integer afterStatus = AFTER_STATUS.get();
  74 + Map<String, Object> exts = ObjectUtil.defaultIfNull(EXTS.get(), emptyMap());
  75 + String content = StrUtil.format(afterSaleLog.operateType().getContent(), exts);
  76 +
  77 + // 2. 记录日志
  78 + AfterSaleLogCreateReqBO createBO = new AfterSaleLogCreateReqBO()
  79 + .setUserId(userId).setUserType(userType)
  80 + .setAfterSaleId(afterSaleId).setBeforeStatus(beforeStatus).setAfterStatus(afterStatus)
  81 + .setOperateType(afterSaleLog.operateType().getType()).setContent(content);
  82 + afterSaleLogService.createAfterSaleLog(createBO);
  83 + } catch (Exception exception) {
  84 + log.error("[doAfterReturning][afterSaleLog({}) 日志记录错误]", toJsonString(afterSaleLog), exception);
  85 + } finally {
  86 + clear();
  87 + }
  88 + }
  89 +
  90 + /**
  91 + * 获得用户类型
  92 + *
  93 + * 如果没有,则约定为 {@link TradeOrderLogDO#getUserType()} 系统
  94 + *
  95 + * @return 用户类型
  96 + */
  97 + private static Integer getUserType() {
  98 + return ObjectUtil.defaultIfNull(WebFrameworkUtils.getLoginUserType(), TradeOrderLogDO.USER_TYPE_SYSTEM);
  99 + }
  100 +
  101 + /**
  102 + * 获得用户编号
  103 + *
  104 + * 如果没有,则约定为 {@link TradeOrderLogDO#getUserId()} 系统
  105 + *
  106 + * @return 用户类型
  107 + */
  108 + private static Long getUserId() {
  109 + return ObjectUtil.defaultIfNull(WebFrameworkUtils.getLoginUserId(), TradeOrderLogDO.USER_ID_SYSTEM);
  110 + }
  111 +
  112 + public static void setAfterSale(Long id, Integer beforeStatus, Integer afterStatus, Map<String, Object> exts) {
  113 + AFTER_SALE_ID.set(id);
  114 + BEFORE_STATUS.set(beforeStatus);
  115 + AFTER_STATUS.set(afterStatus);
  116 + EXTS.set(exts);
  117 + }
  118 +
  119 + public static void setUserInfo(Long userId, Integer userType) {
  120 + USER_ID.set(userId);
  121 + USER_TYPE.set(userType);
  122 + }
  123 +
  124 + private static void clear() {
  125 + USER_ID.remove();
  126 + USER_TYPE.remove();
  127 + AFTER_SALE_ID.remove();
  128 + BEFORE_STATUS.remove();
  129 + AFTER_STATUS.remove();
  130 + EXTS.remove();
  131 + }
  132 +
  133 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/util/AfterSaleLogUtils.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/utils/AfterSaleLogUtils.java
1 -package cn.iocoder.yudao.module.trade.framework.aftersalelog.core.util; 1 +package cn.iocoder.yudao.module.trade.framework.aftersale.core.utils;
2 2
3 3
4 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.aop.AfterSaleLogAspect; 4 +import cn.iocoder.yudao.module.trade.framework.aftersale.core.aop.AfterSaleLogAspect;
5 5
6 import java.util.Map; 6 import java.util.Map;
7 7
@@ -13,21 +13,13 @@ import java.util.Map; @@ -13,21 +13,13 @@ import java.util.Map;
13 */ 13 */
14 public class AfterSaleLogUtils { 14 public class AfterSaleLogUtils {
15 15
16 - public static void setBeforeStatus(Integer status) {  
17 - AfterSaleLogAspect.setBeforeStatus(status);  
18 - }  
19 -  
20 - public static void setAfterStatus(Integer status) {  
21 - AfterSaleLogAspect.setAfterStatus(status);  
22 - }  
23 -  
24 public static void setAfterSaleInfo(Long id, Integer beforeStatus, Integer afterStatus) { 16 public static void setAfterSaleInfo(Long id, Integer beforeStatus, Integer afterStatus) {
25 setAfterSaleInfo(id, beforeStatus, afterStatus, null); 17 setAfterSaleInfo(id, beforeStatus, afterStatus, null);
26 } 18 }
27 19
28 public static void setAfterSaleInfo(Long id, Integer beforeStatus, Integer afterStatus, 20 public static void setAfterSaleInfo(Long id, Integer beforeStatus, Integer afterStatus,
29 Map<String, Object> exts) { 21 Map<String, Object> exts) {
30 - // TODO 待实现 22 + AfterSaleLogAspect.setAfterSale(id, beforeStatus, afterStatus, exts);
31 } 23 }
32 24
33 } 25 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/aop/AfterSaleLogAspect.java deleted
1 -package cn.iocoder.yudao.module.trade.framework.aftersalelog.core.aop;  
2 -  
3 -import cn.hutool.core.map.MapUtil;  
4 -import cn.hutool.core.util.ObjectUtil;  
5 -import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils;  
6 -import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;  
7 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.annotations.AfterSaleLog;  
8 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO;  
9 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service.AfterSaleLogService;  
10 -import com.google.common.collect.Maps;  
11 -import lombok.extern.slf4j.Slf4j;  
12 -import org.aspectj.lang.JoinPoint;  
13 -import org.aspectj.lang.annotation.AfterReturning;  
14 -import org.aspectj.lang.annotation.Aspect;  
15 -import org.aspectj.lang.reflect.MethodSignature;  
16 -  
17 -import javax.annotation.Resource;  
18 -import java.util.HashMap;  
19 -import java.util.Map;  
20 -  
21 -import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;  
22 -import static java.util.Arrays.asList;  
23 -  
24 -/**  
25 - * 记录售后日志的 AOP 切面  
26 - *  
27 - * @author 陈賝  
28 - * @since 2023/6/13 13:54  
29 - */  
30 -@Slf4j  
31 -@Aspect  
32 -public class AfterSaleLogAspect {  
33 -  
34 - @Resource  
35 - private AfterSaleLogService afterSaleLogService;  
36 - /**  
37 - * 售前状态  
38 - */  
39 - private static final ThreadLocal<Integer> BEFORE_STATUS = new ThreadLocal<>();  
40 - /**  
41 - * 售后状态  
42 - */  
43 - private static final ThreadLocal<Integer> AFTER_STATUS = new ThreadLocal<>();  
44 - /**  
45 - * 操作类型  
46 - */  
47 - private final static String OPERATE_TYPE = "operateType";  
48 - /**  
49 - * ID  
50 - */  
51 - private final static String ID = "id";  
52 - /**  
53 - * 操作明细  
54 - */  
55 - private final static String CONTENT = "content";  
56 -  
57 - /**  
58 - * 切面存入日志  
59 - */  
60 - @AfterReturning(pointcut = "@annotation(afterSaleLog)", returning = "info")  
61 - public void doAfterReturning(JoinPoint joinPoint, AfterSaleLog afterSaleLog, Object info) {  
62 - try {  
63 - // 日志对象拼接  
64 - Integer userType = WebFrameworkUtils.getLoginUserType();  
65 - Long id = WebFrameworkUtils.getLoginUserId();  
66 - Map<String, String> formatObj = spelFormat(joinPoint, info);  
67 - TradeAfterSaleLogCreateReqDTO dto = new TradeAfterSaleLogCreateReqDTO()  
68 - .setUserId(id)  
69 - .setUserType(userType)  
70 - .setAfterSaleId(MapUtil.getLong(formatObj, ID))  
71 - .setOperateType(MapUtil.getStr(formatObj, OPERATE_TYPE))  
72 - .setBeforeStatus(BEFORE_STATUS.get())  
73 - .setAfterStatus(AFTER_STATUS.get())  
74 - .setContent(MapUtil.getStr(formatObj, CONTENT));  
75 - // 异步存入数据库  
76 - afterSaleLogService.createLog(dto);  
77 - } catch (Exception exception) {  
78 - log.error("[doAfterReturning][afterSaleLog({}) 日志记录错误]", toJsonString(afterSaleLog), exception);  
79 - }finally {  
80 - clearThreadLocal();  
81 - }  
82 - }  
83 -  
84 - /**  
85 - * 获取描述信息  
86 - */  
87 - public static Map<String, String> spelFormat(JoinPoint joinPoint, Object info) {  
88 - MethodSignature signature = (MethodSignature) joinPoint.getSignature();  
89 - AfterSaleLog afterSaleLogPoint = signature.getMethod().getAnnotation(AfterSaleLog.class);  
90 - HashMap<String, String> result = Maps.newHashMapWithExpectedSize(2);  
91 - Map<String, Object> spelMap = SpringExpressionUtils.parseExpression(joinPoint, info,  
92 - asList(afterSaleLogPoint.id(), afterSaleLogPoint.content()));  
93 - // TODO @chenchen:是不是抽成 3 个方法好点;毕竟 map 太抽象了;;  
94 - // 售后ID  
95 - String id = MapUtil.getStr(spelMap, afterSaleLogPoint.id());  
96 - result.put(ID, id);  
97 - // 操作类型  
98 - String operateType = afterSaleLogPoint.operateType().getContent();  
99 - result.put(OPERATE_TYPE, operateType);  
100 - // 日志内容  
101 - String content = MapUtil.getStr(spelMap, afterSaleLogPoint.content());  
102 - if (ObjectUtil.isNotNull(afterSaleLogPoint.operateType())) {  
103 - content += operateType;  
104 - }  
105 - result.put(CONTENT, content);  
106 - return result;  
107 - }  
108 -  
109 - public static void setBeforeStatus(Integer beforestatus) {  
110 - BEFORE_STATUS.set(beforestatus);  
111 - }  
112 -  
113 - public static void setAfterStatus(Integer afterStatus) {  
114 - AFTER_STATUS.set(afterStatus);  
115 - }  
116 -  
117 - private static void clearThreadLocal() {  
118 - AFTER_STATUS.remove();  
119 - BEFORE_STATUS.remove();  
120 - }  
121 -  
122 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/annotations/TradeOrderLog.java
1 package cn.iocoder.yudao.module.trade.framework.order.core.annotations; 1 package cn.iocoder.yudao.module.trade.framework.order.core.annotations;
2 2
3 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderOperateTypeEnum; 3 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderOperateTypeEnum;
  4 +import cn.iocoder.yudao.module.trade.framework.order.core.aop.TradeOrderLogAspect;
4 5
5 import java.lang.annotation.Documented; 6 import java.lang.annotation.Documented;
6 import java.lang.annotation.Retention; 7 import java.lang.annotation.Retention;
@@ -15,6 +16,7 @@ import static java.lang.annotation.ElementType.METHOD; @@ -15,6 +16,7 @@ import static java.lang.annotation.ElementType.METHOD;
15 * 16 *
16 * @author 陈賝 17 * @author 陈賝
17 * @since 2023/7/6 15:37 18 * @since 2023/7/6 15:37
  19 + * @see TradeOrderLogAspect
18 */ 20 */
19 @Target({METHOD, ANNOTATION_TYPE}) 21 @Target({METHOD, ANNOTATION_TYPE})
20 @Retention(RetentionPolicy.RUNTIME) 22 @Retention(RetentionPolicy.RUNTIME)
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/aop/TradeOrderLogAspect.java
@@ -73,7 +73,7 @@ public class TradeOrderLogAspect { @@ -73,7 +73,7 @@ public class TradeOrderLogAspect {
73 Long userId = getUserId(); 73 Long userId = getUserId();
74 // 1.2 订单信息 74 // 1.2 订单信息
75 Long orderId = ORDER_ID.get(); 75 Long orderId = ORDER_ID.get();
76 - if (orderId == null) { // 如果未设置,只有注解,说明不需要记录订单日志 76 + if (orderId == null) { // 如果未设置,只有注解,说明不需要记录日志
77 return; 77 return;
78 } 78 }
79 Integer beforeStatus = BEFORE_STATUS.get(); 79 Integer beforeStatus = BEFORE_STATUS.get();
@@ -81,7 +81,7 @@ public class TradeOrderLogAspect { @@ -81,7 +81,7 @@ public class TradeOrderLogAspect {
81 Map<String, Object> exts = ObjectUtil.defaultIfNull(EXTS.get(), emptyMap()); 81 Map<String, Object> exts = ObjectUtil.defaultIfNull(EXTS.get(), emptyMap());
82 String content = StrUtil.format(orderLog.operateType().getContent(), exts); 82 String content = StrUtil.format(orderLog.operateType().getContent(), exts);
83 83
84 - // 2.1 记录日志 84 + // 2. 记录日志
85 TradeOrderLogCreateReqBO createBO = new TradeOrderLogCreateReqBO() 85 TradeOrderLogCreateReqBO createBO = new TradeOrderLogCreateReqBO()
86 .setUserId(userId).setUserType(userType) 86 .setUserId(userId).setUserType(userType)
87 .setOrderId(orderId).setBeforeStatus(beforeStatus).setAfterStatus(afterStatus) 87 .setOrderId(orderId).setBeforeStatus(beforeStatus).setAfterStatus(afterStatus)
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/service/AfterSaleLogService.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleLogService.java
1 -package cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service; 1 +package cn.iocoder.yudao.module.trade.service.aftersale;
2 2
3 3
4 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO;  
5 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO; 4 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO;
  5 +import cn.iocoder.yudao.module.trade.service.aftersale.bo.AfterSaleLogCreateReqBO;
6 6
7 import java.util.List; 7 import java.util.List;
8 8
@@ -17,11 +17,11 @@ public interface AfterSaleLogService { @@ -17,11 +17,11 @@ public interface AfterSaleLogService {
17 /** 17 /**
18 * 创建售后日志 18 * 创建售后日志
19 * 19 *
20 - * @param logDTO 日志记录 20 + * @param createReqBO 日志记录
21 * @author 陈賝 21 * @author 陈賝
22 * @since 2023/6/12 14:18 22 * @since 2023/6/12 14:18
23 */ 23 */
24 - void createLog(TradeAfterSaleLogCreateReqDTO logDTO); 24 + void createAfterSaleLog(AfterSaleLogCreateReqBO createReqBO);
25 25
26 /** 26 /**
27 * 获取售后日志 27 * 获取售后日志
@@ -29,6 +29,6 @@ public interface AfterSaleLogService { @@ -29,6 +29,6 @@ public interface AfterSaleLogService {
29 * @param afterSaleId 售后编号 29 * @param afterSaleId 售后编号
30 * @return 售后日志 30 * @return 售后日志
31 */ 31 */
32 - List<TradeAfterSaleLogRespVO> getLog(Long afterSaleId); 32 + List<AfterSaleLogDO> getAfterSaleLogList(Long afterSaleId);
33 33
34 } 34 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleLogServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.aftersale;
  2 +
  3 +import cn.iocoder.yudao.module.trade.convert.aftersale.AfterSaleLogConvert;
  4 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO;
  5 +import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.AfterSaleLogMapper;
  6 +import cn.iocoder.yudao.module.trade.service.aftersale.bo.AfterSaleLogCreateReqBO;
  7 +import org.springframework.stereotype.Service;
  8 +import org.springframework.validation.annotation.Validated;
  9 +
  10 +import javax.annotation.Resource;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 交易售后日志 Service 实现类
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@Service
  19 +@Validated
  20 +public class AfterSaleLogServiceImpl implements AfterSaleLogService {
  21 +
  22 + @Resource
  23 + private AfterSaleLogMapper afterSaleLogMapper;
  24 +
  25 + @Override
  26 + public void createAfterSaleLog(AfterSaleLogCreateReqBO createReqBO) {
  27 + AfterSaleLogDO afterSaleLog = AfterSaleLogConvert.INSTANCE.convert(createReqBO);
  28 + afterSaleLogMapper.insert(afterSaleLog);
  29 + }
  30 +
  31 + @Override
  32 + public List<AfterSaleLogDO> getAfterSaleLogList(Long afterSaleId) {
  33 + return afterSaleLogMapper.selectListByAfterSaleId(afterSaleId);
  34 + }
  35 +
  36 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleService.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleService.java
@@ -2,19 +2,19 @@ package cn.iocoder.yudao.module.trade.service.aftersale; @@ -2,19 +2,19 @@ package cn.iocoder.yudao.module.trade.service.aftersale;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleDisagreeReqVO;  
6 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO;  
7 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleRefuseReqVO;  
8 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO;  
9 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleDeliveryReqVO;  
10 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO; 5 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleDisagreeReqVO;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSalePageReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleRefuseReqVO;
  8 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  9 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO;
  10 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
11 11
12 /** 12 /**
13 * 售后订单 Service 接口 13 * 售后订单 Service 接口
14 * 14 *
15 * @author 芋道源码 15 * @author 芋道源码
16 */ 16 */
17 -public interface TradeAfterSaleService { 17 +public interface AfterSaleService {
18 18
19 /** 19 /**
20 * 【管理员】获得售后订单分页 20 * 【管理员】获得售后订单分页
@@ -22,7 +22,7 @@ public interface TradeAfterSaleService { @@ -22,7 +22,7 @@ public interface TradeAfterSaleService {
22 * @param pageReqVO 分页查询 22 * @param pageReqVO 分页查询
23 * @return 售后订单分页 23 * @return 售后订单分页
24 */ 24 */
25 - PageResult<TradeAfterSaleDO> getAfterSalePage(TradeAfterSalePageReqVO pageReqVO); 25 + PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO);
26 26
27 /** 27 /**
28 * 【会员】获得售后订单分页 28 * 【会员】获得售后订单分页
@@ -31,7 +31,7 @@ public interface TradeAfterSaleService { @@ -31,7 +31,7 @@ public interface TradeAfterSaleService {
31 * @param pageParam 分页参数 31 * @param pageParam 分页参数
32 * @return 售后订单分页 32 * @return 售后订单分页
33 */ 33 */
34 - PageResult<TradeAfterSaleDO> getAfterSalePage(Long userId, PageParam pageParam); 34 + PageResult<AfterSaleDO> getAfterSalePage(Long userId, PageParam pageParam);
35 35
36 /** 36 /**
37 * 【会员】获得售后单 37 * 【会员】获得售后单
@@ -40,7 +40,7 @@ public interface TradeAfterSaleService { @@ -40,7 +40,7 @@ public interface TradeAfterSaleService {
40 * @param id 售后编号 40 * @param id 售后编号
41 * @return 售后订单 41 * @return 售后订单
42 */ 42 */
43 - TradeAfterSaleDO getAfterSale(Long userId, Long id); 43 + AfterSaleDO getAfterSale(Long userId, Long id);
44 44
45 /** 45 /**
46 * 【管理员】获得售后单 46 * 【管理员】获得售后单
@@ -48,7 +48,7 @@ public interface TradeAfterSaleService { @@ -48,7 +48,7 @@ public interface TradeAfterSaleService {
48 * @param id 售后编号 48 * @param id 售后编号
49 * @return 售后订单 49 * @return 售后订单
50 */ 50 */
51 - TradeAfterSaleDO getAfterSale(Long id); 51 + AfterSaleDO getAfterSale(Long id);
52 52
53 /** 53 /**
54 * 【会员】创建售后订单 54 * 【会员】创建售后订单
@@ -57,7 +57,7 @@ public interface TradeAfterSaleService { @@ -57,7 +57,7 @@ public interface TradeAfterSaleService {
57 * @param createReqVO 创建 Request 信息 57 * @param createReqVO 创建 Request 信息
58 * @return 售后编号 58 * @return 售后编号
59 */ 59 */
60 - Long createAfterSale(Long userId, AppTradeAfterSaleCreateReqVO createReqVO); 60 + Long createAfterSale(Long userId, AppAfterSaleCreateReqVO createReqVO);
61 61
62 /** 62 /**
63 * 【管理员】同意售后订单 63 * 【管理员】同意售后订单
@@ -73,7 +73,7 @@ public interface TradeAfterSaleService { @@ -73,7 +73,7 @@ public interface TradeAfterSaleService {
73 * @param userId 管理员用户编号 73 * @param userId 管理员用户编号
74 * @param auditReqVO 审批 Request 信息 74 * @param auditReqVO 审批 Request 信息
75 */ 75 */
76 - void disagreeAfterSale(Long userId, TradeAfterSaleDisagreeReqVO auditReqVO); 76 + void disagreeAfterSale(Long userId, AfterSaleDisagreeReqVO auditReqVO);
77 77
78 /** 78 /**
79 * 【会员】退回货物 79 * 【会员】退回货物
@@ -81,7 +81,7 @@ public interface TradeAfterSaleService { @@ -81,7 +81,7 @@ public interface TradeAfterSaleService {
81 * @param userId 会员用户编号 81 * @param userId 会员用户编号
82 * @param deliveryReqVO 退货 Request 信息 82 * @param deliveryReqVO 退货 Request 信息
83 */ 83 */
84 - void deliveryAfterSale(Long userId, AppTradeAfterSaleDeliveryReqVO deliveryReqVO); 84 + void deliveryAfterSale(Long userId, AppAfterSaleDeliveryReqVO deliveryReqVO);
85 85
86 /** 86 /**
87 * 【管理员】确认收货 87 * 【管理员】确认收货
@@ -97,7 +97,7 @@ public interface TradeAfterSaleService { @@ -97,7 +97,7 @@ public interface TradeAfterSaleService {
97 * @param userId 管理员用户编号 97 * @param userId 管理员用户编号
98 * @param refuseReqVO 拒绝收货 Request 信息 98 * @param refuseReqVO 拒绝收货 Request 信息
99 */ 99 */
100 - void refuseAfterSale(Long userId, TradeAfterSaleRefuseReqVO refuseReqVO); 100 + void refuseAfterSale(Long userId, AfterSaleRefuseReqVO refuseReqVO);
101 101
102 /** 102 /**
103 * 【管理员】确认退款 103 * 【管理员】确认退款
@@ -119,7 +119,7 @@ public interface TradeAfterSaleService { @@ -119,7 +119,7 @@ public interface TradeAfterSaleService {
119 /** 119 /**
120 * 【会员】获得正在进行中的售后订单数量 120 * 【会员】获得正在进行中的售后订单数量
121 * 121 *
122 - * @param userId 122 + * @param userId 用户编号
123 * @return 数量 123 * @return 数量
124 */ 124 */
125 Long getApplyingAfterSaleCount(Long userId); 125 Long getApplyingAfterSaleCount(Long userId);
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java
@@ -2,42 +2,36 @@ package cn.iocoder.yudao.module.trade.service.aftersale; @@ -2,42 +2,36 @@ package cn.iocoder.yudao.module.trade.service.aftersale;
2 2
3 import cn.hutool.core.map.MapUtil; 3 import cn.hutool.core.map.MapUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
5 -import cn.hutool.core.util.RandomUtil;  
6 import cn.iocoder.yudao.framework.common.pojo.PageParam; 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
7 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; 7 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
9 import cn.iocoder.yudao.module.pay.api.refund.PayRefundApi; 8 import cn.iocoder.yudao.module.pay.api.refund.PayRefundApi;
10 import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO; 9 import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO;
11 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleDisagreeReqVO;  
12 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO;  
13 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleRefuseReqVO;  
14 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO;  
15 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO;  
16 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleDeliveryReqVO;  
17 -import cn.iocoder.yudao.module.trade.convert.aftersale.TradeAfterSaleConvert;  
18 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;  
19 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO; 10 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleDisagreeReqVO;
  11 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSalePageReqVO;
  12 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleRefuseReqVO;
  13 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  14 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO;
  15 +import cn.iocoder.yudao.module.trade.convert.aftersale.AfterSaleConvert;
  16 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
20 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; 17 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
21 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 18 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
22 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 19 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
23 -import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleLogMapper;  
24 -import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper; 20 +import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.AfterSaleMapper;
  21 +import cn.iocoder.yudao.module.trade.dal.redis.no.TradeNoRedisDAO;
25 import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleOperateTypeEnum; 22 import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleOperateTypeEnum;
26 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;  
27 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;  
28 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum; 23 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleStatusEnum;
  24 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleTypeEnum;
  25 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleWayEnum;
29 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; 26 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
30 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 27 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
31 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.annotations.AfterSaleLog;  
32 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO;  
33 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service.AfterSaleLogService;  
34 -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.util.AfterSaleLogUtils; 28 +import cn.iocoder.yudao.module.trade.framework.aftersale.core.annotations.AfterSaleLog;
  29 +import cn.iocoder.yudao.module.trade.framework.aftersale.core.utils.AfterSaleLogUtils;
35 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 30 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
36 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; 31 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
37 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; 32 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
38 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; 33 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
39 import lombok.extern.slf4j.Slf4j; 34 import lombok.extern.slf4j.Slf4j;
40 -import org.springframework.scheduling.annotation.Async;  
41 import org.springframework.stereotype.Service; 35 import org.springframework.stereotype.Service;
42 import org.springframework.transaction.annotation.Transactional; 36 import org.springframework.transaction.annotation.Transactional;
43 import org.springframework.transaction.support.TransactionSynchronization; 37 import org.springframework.transaction.support.TransactionSynchronization;
@@ -46,10 +40,8 @@ import org.springframework.validation.annotation.Validated; @@ -46,10 +40,8 @@ import org.springframework.validation.annotation.Validated;
46 40
47 import javax.annotation.Resource; 41 import javax.annotation.Resource;
48 import java.time.LocalDateTime; 42 import java.time.LocalDateTime;
49 -import java.util.List;  
50 43
51 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 44 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
52 -import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;  
53 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; 45 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
54 46
55 /** 47 /**
@@ -60,7 +52,7 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; @@ -60,7 +52,7 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
60 @Slf4j 52 @Slf4j
61 @Service 53 @Service
62 @Validated 54 @Validated
63 -public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSaleLogService { 55 +public class AfterSaleServiceImpl implements AfterSaleService {
64 56
65 @Resource 57 @Resource
66 private TradeOrderUpdateService tradeOrderUpdateService; 58 private TradeOrderUpdateService tradeOrderUpdateService;
@@ -70,9 +62,9 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -70,9 +62,9 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
70 private DeliveryExpressService deliveryExpressService; 62 private DeliveryExpressService deliveryExpressService;
71 63
72 @Resource 64 @Resource
73 - private TradeAfterSaleMapper tradeAfterSaleMapper; 65 + private AfterSaleMapper tradeAfterSaleMapper;
74 @Resource 66 @Resource
75 - private TradeAfterSaleLogMapper tradeAfterSaleLogMapper; 67 + private TradeNoRedisDAO tradeNoRedisDAO;
76 68
77 @Resource 69 @Resource
78 private PayRefundApi payRefundApi; 70 private PayRefundApi payRefundApi;
@@ -81,34 +73,34 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -81,34 +73,34 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
81 private TradeOrderProperties tradeOrderProperties; 73 private TradeOrderProperties tradeOrderProperties;
82 74
83 @Override 75 @Override
84 - public PageResult<TradeAfterSaleDO> getAfterSalePage(TradeAfterSalePageReqVO pageReqVO) { 76 + public PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO) {
85 return tradeAfterSaleMapper.selectPage(pageReqVO); 77 return tradeAfterSaleMapper.selectPage(pageReqVO);
86 } 78 }
87 79
88 @Override 80 @Override
89 - public PageResult<TradeAfterSaleDO> getAfterSalePage(Long userId, PageParam pageParam) { 81 + public PageResult<AfterSaleDO> getAfterSalePage(Long userId, PageParam pageParam) {
90 return tradeAfterSaleMapper.selectPage(userId, pageParam); 82 return tradeAfterSaleMapper.selectPage(userId, pageParam);
91 } 83 }
92 84
93 @Override 85 @Override
94 - public TradeAfterSaleDO getAfterSale(Long userId, Long id) { 86 + public AfterSaleDO getAfterSale(Long userId, Long id) {
95 return tradeAfterSaleMapper.selectByIdAndUserId(id, userId); 87 return tradeAfterSaleMapper.selectByIdAndUserId(id, userId);
96 } 88 }
97 89
98 @Override 90 @Override
99 - public TradeAfterSaleDO getAfterSale(Long id) { 91 + public AfterSaleDO getAfterSale(Long id) {
100 return tradeAfterSaleMapper.selectById(id); 92 return tradeAfterSaleMapper.selectById(id);
101 } 93 }
102 94
103 @Override 95 @Override
104 @Transactional(rollbackFor = Exception.class) 96 @Transactional(rollbackFor = Exception.class)
105 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CREATE) 97 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CREATE)
106 - public Long createAfterSale(Long userId, AppTradeAfterSaleCreateReqVO createReqVO) { 98 + public Long createAfterSale(Long userId, AppAfterSaleCreateReqVO createReqVO) {
107 // 第一步,前置校验 99 // 第一步,前置校验
108 TradeOrderItemDO tradeOrderItem = validateOrderItemApplicable(userId, createReqVO); 100 TradeOrderItemDO tradeOrderItem = validateOrderItemApplicable(userId, createReqVO);
109 101
110 // 第二步,存储售后订单 102 // 第二步,存储售后订单
111 - TradeAfterSaleDO afterSale = createAfterSale(createReqVO, tradeOrderItem); 103 + AfterSaleDO afterSale = createAfterSale(createReqVO, tradeOrderItem);
112 return afterSale.getId(); 104 return afterSale.getId();
113 } 105 }
114 106
@@ -119,7 +111,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -119,7 +111,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
119 * @param createReqVO 售后创建信息 111 * @param createReqVO 售后创建信息
120 * @return 交易订单项 112 * @return 交易订单项
121 */ 113 */
122 - private TradeOrderItemDO validateOrderItemApplicable(Long userId, AppTradeAfterSaleCreateReqVO createReqVO) { 114 + private TradeOrderItemDO validateOrderItemApplicable(Long userId, AppAfterSaleCreateReqVO createReqVO) {
123 // 校验订单项存在 115 // 校验订单项存在
124 TradeOrderItemDO orderItem = tradeOrderQueryService.getOrderItem(userId, createReqVO.getOrderItemId()); 116 TradeOrderItemDO orderItem = tradeOrderQueryService.getOrderItem(userId, createReqVO.getOrderItemId());
125 if (orderItem == null) { 117 if (orderItem == null) {
@@ -149,24 +141,24 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -149,24 +141,24 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
149 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID); 141 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_PAID);
150 } 142 }
151 // 如果是【退货退款】的情况,需要额外校验是否发货 143 // 如果是【退货退款】的情况,需要额外校验是否发货
152 - if (createReqVO.getWay().equals(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay()) 144 + if (createReqVO.getWay().equals(AfterSaleWayEnum.RETURN_AND_REFUND.getWay())
153 && !TradeOrderStatusEnum.haveDelivered(order.getStatus())) { 145 && !TradeOrderStatusEnum.haveDelivered(order.getStatus())) {
154 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED); 146 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED);
155 } 147 }
156 return orderItem; 148 return orderItem;
157 } 149 }
158 150
159 - private TradeAfterSaleDO createAfterSale(AppTradeAfterSaleCreateReqVO createReqVO,  
160 - TradeOrderItemDO orderItem) { 151 + private AfterSaleDO createAfterSale(AppAfterSaleCreateReqVO createReqVO,
  152 + TradeOrderItemDO orderItem) {
161 // 创建售后单 153 // 创建售后单
162 - TradeAfterSaleDO afterSale = TradeAfterSaleConvert.INSTANCE.convert(createReqVO, orderItem);  
163 - afterSale.setNo(RandomUtil.randomString(10)); // TODO 芋艿:优化 no 生成逻辑  
164 - afterSale.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus()); 154 + AfterSaleDO afterSale = AfterSaleConvert.INSTANCE.convert(createReqVO, orderItem);
  155 + afterSale.setNo(tradeNoRedisDAO.generate(TradeNoRedisDAO.AFTER_SALE_NO_PREFIX));
  156 + afterSale.setStatus(AfterSaleStatusEnum.APPLY.getStatus());
165 // 标记是售中还是售后 157 // 标记是售中还是售后
166 TradeOrderDO order = tradeOrderQueryService.getOrder(orderItem.getUserId(), orderItem.getOrderId()); 158 TradeOrderDO order = tradeOrderQueryService.getOrder(orderItem.getUserId(), orderItem.getOrderId());
167 afterSale.setOrderNo(order.getNo()); // 记录 orderNo 订单流水,方便后续检索 159 afterSale.setOrderNo(order.getNo()); // 记录 orderNo 订单流水,方便后续检索
168 afterSale.setType(TradeOrderStatusEnum.isCompleted(order.getStatus()) 160 afterSale.setType(TradeOrderStatusEnum.isCompleted(order.getStatus())
169 - ? TradeAfterSaleTypeEnum.AFTER_SALE.getType() : TradeAfterSaleTypeEnum.IN_SALE.getType()); 161 + ? AfterSaleTypeEnum.AFTER_SALE.getType() : AfterSaleTypeEnum.IN_SALE.getType());
170 tradeAfterSaleMapper.insert(afterSale); 162 tradeAfterSaleMapper.insert(afterSale);
171 163
172 // 更新交易订单项的售后状态 164 // 更新交易订单项的售后状态
@@ -174,7 +166,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -174,7 +166,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
174 166
175 // 记录售后日志 167 // 记录售后日志
176 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), null, 168 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), null,
177 - TradeAfterSaleStatusEnum.APPLY.getStatus()); 169 + AfterSaleStatusEnum.APPLY.getStatus());
178 170
179 // TODO 发送售后消息 171 // TODO 发送售后消息
180 return afterSale; 172 return afterSale;
@@ -185,14 +177,14 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -185,14 +177,14 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
185 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_APPLY) 177 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_APPLY)
186 public void agreeAfterSale(Long userId, Long id) { 178 public void agreeAfterSale(Long userId, Long id) {
187 // 校验售后单存在,并状态未审批 179 // 校验售后单存在,并状态未审批
188 - TradeAfterSaleDO afterSale = validateAfterSaleAuditable(id); 180 + AfterSaleDO afterSale = validateAfterSaleAuditable(id);
189 181
190 // 更新售后单的状态 182 // 更新售后单的状态
191 // 情况一:退款:标记为 WAIT_REFUND 状态。后续等退款发起成功后,在标记为 COMPLETE 状态 183 // 情况一:退款:标记为 WAIT_REFUND 状态。后续等退款发起成功后,在标记为 COMPLETE 状态
192 // 情况二:退货退款:需要等用户退货后,才能发起退款 184 // 情况二:退货退款:需要等用户退货后,才能发起退款
193 - Integer newStatus = afterSale.getWay().equals(TradeAfterSaleWayEnum.REFUND.getWay()) ?  
194 - TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus() : TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus();  
195 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.APPLY.getStatus(), new TradeAfterSaleDO() 185 + Integer newStatus = afterSale.getWay().equals(AfterSaleWayEnum.REFUND.getWay()) ?
  186 + AfterSaleStatusEnum.WAIT_REFUND.getStatus() : AfterSaleStatusEnum.SELLER_AGREE.getStatus();
  187 + updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.APPLY.getStatus(), new AfterSaleDO()
196 .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now())); 188 .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now()));
197 189
198 // 记录售后日志 190 // 记录售后日志
@@ -204,13 +196,13 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -204,13 +196,13 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
204 @Override 196 @Override
205 @Transactional(rollbackFor = Exception.class) 197 @Transactional(rollbackFor = Exception.class)
206 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_DISAGREE_APPLY) 198 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_DISAGREE_APPLY)
207 - public void disagreeAfterSale(Long userId, TradeAfterSaleDisagreeReqVO auditReqVO) { 199 + public void disagreeAfterSale(Long userId, AfterSaleDisagreeReqVO auditReqVO) {
208 // 校验售后单存在,并状态未审批 200 // 校验售后单存在,并状态未审批
209 - TradeAfterSaleDO afterSale = validateAfterSaleAuditable(auditReqVO.getId()); 201 + AfterSaleDO afterSale = validateAfterSaleAuditable(auditReqVO.getId());
210 202
211 // 更新售后单的状态 203 // 更新售后单的状态
212 - Integer newStatus = TradeAfterSaleStatusEnum.SELLER_DISAGREE.getStatus();  
213 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.APPLY.getStatus(), new TradeAfterSaleDO() 204 + Integer newStatus = AfterSaleStatusEnum.SELLER_DISAGREE.getStatus();
  205 + updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.APPLY.getStatus(), new AfterSaleDO()
214 .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now()) 206 .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now())
215 .setAuditReason(auditReqVO.getAuditReason())); 207 .setAuditReason(auditReqVO.getAuditReason()));
216 208
@@ -229,18 +221,18 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -229,18 +221,18 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
229 * @param id 售后编号 221 * @param id 售后编号
230 * @return 售后单 222 * @return 售后单
231 */ 223 */
232 - private TradeAfterSaleDO validateAfterSaleAuditable(Long id) {  
233 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id); 224 + private AfterSaleDO validateAfterSaleAuditable(Long id) {
  225 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
234 if (afterSale == null) { 226 if (afterSale == null) {
235 throw exception(AFTER_SALE_NOT_FOUND); 227 throw exception(AFTER_SALE_NOT_FOUND);
236 } 228 }
237 - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus())) { 229 + if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.APPLY.getStatus())) {
238 throw exception(AFTER_SALE_AUDIT_FAIL_STATUS_NOT_APPLY); 230 throw exception(AFTER_SALE_AUDIT_FAIL_STATUS_NOT_APPLY);
239 } 231 }
240 return afterSale; 232 return afterSale;
241 } 233 }
242 234
243 - private void updateAfterSaleStatus(Long id, Integer status, TradeAfterSaleDO updateObj) { 235 + private void updateAfterSaleStatus(Long id, Integer status, AfterSaleDO updateObj) {
244 int updateCount = tradeAfterSaleMapper.updateByIdAndStatus(id, status, updateObj); 236 int updateCount = tradeAfterSaleMapper.updateByIdAndStatus(id, status, updateObj);
245 if (updateCount == 0) { 237 if (updateCount == 0) {
246 throw exception(AFTER_SALE_UPDATE_STATUS_FAIL); 238 throw exception(AFTER_SALE_UPDATE_STATUS_FAIL);
@@ -250,26 +242,26 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -250,26 +242,26 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
250 @Override 242 @Override
251 @Transactional(rollbackFor = Exception.class) 243 @Transactional(rollbackFor = Exception.class)
252 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_DELIVERY) 244 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_DELIVERY)
253 - public void deliveryAfterSale(Long userId, AppTradeAfterSaleDeliveryReqVO deliveryReqVO) { 245 + public void deliveryAfterSale(Long userId, AppAfterSaleDeliveryReqVO deliveryReqVO) {
254 // 校验售后单存在,并状态未退货 246 // 校验售后单存在,并状态未退货
255 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(deliveryReqVO.getId()); 247 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(deliveryReqVO.getId());
256 if (afterSale == null) { 248 if (afterSale == null) {
257 throw exception(AFTER_SALE_NOT_FOUND); 249 throw exception(AFTER_SALE_NOT_FOUND);
258 } 250 }
259 - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus())) { 251 + if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.SELLER_AGREE.getStatus())) {
260 throw exception(AFTER_SALE_DELIVERY_FAIL_STATUS_NOT_SELLER_AGREE); 252 throw exception(AFTER_SALE_DELIVERY_FAIL_STATUS_NOT_SELLER_AGREE);
261 } 253 }
262 DeliveryExpressDO express = deliveryExpressService.validateDeliveryExpress(deliveryReqVO.getLogisticsId()); 254 DeliveryExpressDO express = deliveryExpressService.validateDeliveryExpress(deliveryReqVO.getLogisticsId());
263 255
264 // 更新售后单的物流信息 256 // 更新售后单的物流信息
265 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus(), new TradeAfterSaleDO()  
266 - .setStatus(TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus()) 257 + updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.SELLER_AGREE.getStatus(), new AfterSaleDO()
  258 + .setStatus(AfterSaleStatusEnum.BUYER_DELIVERY.getStatus())
267 .setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo()) 259 .setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo())
268 .setDeliveryTime(LocalDateTime.now())); 260 .setDeliveryTime(LocalDateTime.now()));
269 261
270 // 记录售后日志 262 // 记录售后日志
271 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), 263 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
272 - TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), 264 + AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(),
273 MapUtil.<String, Object>builder().put("expressName", express.getName()) 265 MapUtil.<String, Object>builder().put("expressName", express.getName())
274 .put("logisticsNo", deliveryReqVO.getLogisticsNo()).build()); 266 .put("logisticsNo", deliveryReqVO.getLogisticsNo()).build());
275 267
@@ -281,15 +273,15 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -281,15 +273,15 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
281 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_RECEIVE) 273 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_RECEIVE)
282 public void receiveAfterSale(Long userId, Long id) { 274 public void receiveAfterSale(Long userId, Long id) {
283 // 校验售后单存在,并状态为已退货 275 // 校验售后单存在,并状态为已退货
284 - TradeAfterSaleDO afterSale = validateAfterSaleReceivable(id); 276 + AfterSaleDO afterSale = validateAfterSaleReceivable(id);
285 277
286 // 更新售后单的状态 278 // 更新售后单的状态
287 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new TradeAfterSaleDO()  
288 - .setStatus(TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus()).setReceiveTime(LocalDateTime.now())); 279 + updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new AfterSaleDO()
  280 + .setStatus(AfterSaleStatusEnum.WAIT_REFUND.getStatus()).setReceiveTime(LocalDateTime.now()));
289 281
290 // 记录售后日志 282 // 记录售后日志
291 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), 283 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
292 - TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus()); 284 + AfterSaleStatusEnum.WAIT_REFUND.getStatus());
293 285
294 // TODO 发送售后消息 286 // TODO 发送售后消息
295 } 287 }
@@ -297,24 +289,24 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -297,24 +289,24 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
297 @Override 289 @Override
298 @Transactional(rollbackFor = Exception.class) 290 @Transactional(rollbackFor = Exception.class)
299 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_DISAGREE_RECEIVE) 291 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_DISAGREE_RECEIVE)
300 - public void refuseAfterSale(Long userId, TradeAfterSaleRefuseReqVO refuseReqVO) { 292 + public void refuseAfterSale(Long userId, AfterSaleRefuseReqVO refuseReqVO) {
301 // 校验售后单存在,并状态为已退货 293 // 校验售后单存在,并状态为已退货
302 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(refuseReqVO.getId()); 294 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(refuseReqVO.getId());
303 if (afterSale == null) { 295 if (afterSale == null) {
304 throw exception(AFTER_SALE_NOT_FOUND); 296 throw exception(AFTER_SALE_NOT_FOUND);
305 } 297 }
306 - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) { 298 + if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
307 throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY); 299 throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY);
308 } 300 }
309 301
310 // 更新售后单的状态 302 // 更新售后单的状态
311 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new TradeAfterSaleDO()  
312 - .setStatus(TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus()).setReceiveTime(LocalDateTime.now()) 303 + updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(), new AfterSaleDO()
  304 + .setStatus(AfterSaleStatusEnum.SELLER_REFUSE.getStatus()).setReceiveTime(LocalDateTime.now())
313 .setReceiveReason(refuseReqVO.getRefuseMemo())); 305 .setReceiveReason(refuseReqVO.getRefuseMemo()));
314 306
315 // 记录售后日志 307 // 记录售后日志
316 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), 308 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
317 - TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus(), 309 + AfterSaleStatusEnum.SELLER_REFUSE.getStatus(),
318 MapUtil.of("reason", refuseReqVO.getRefuseMemo())); 310 MapUtil.of("reason", refuseReqVO.getRefuseMemo()));
319 311
320 // TODO 发送售后消息 312 // TODO 发送售后消息
@@ -329,12 +321,12 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -329,12 +321,12 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
329 * @param id 售后编号 321 * @param id 售后编号
330 * @return 售后单 322 * @return 售后单
331 */ 323 */
332 - private TradeAfterSaleDO validateAfterSaleReceivable(Long id) {  
333 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id); 324 + private AfterSaleDO validateAfterSaleReceivable(Long id) {
  325 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
334 if (afterSale == null) { 326 if (afterSale == null) {
335 throw exception(AFTER_SALE_NOT_FOUND); 327 throw exception(AFTER_SALE_NOT_FOUND);
336 } 328 }
337 - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) { 329 + if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
338 throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY); 330 throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY);
339 } 331 }
340 return afterSale; 332 return afterSale;
@@ -345,11 +337,11 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -345,11 +337,11 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
345 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_REFUND) 337 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_REFUND)
346 public void refundAfterSale(Long userId, String userIp, Long id) { 338 public void refundAfterSale(Long userId, String userIp, Long id) {
347 // 校验售后单的状态,并状态待退款 339 // 校验售后单的状态,并状态待退款
348 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id); 340 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
349 if (afterSale == null) { 341 if (afterSale == null) {
350 throw exception(AFTER_SALE_NOT_FOUND); 342 throw exception(AFTER_SALE_NOT_FOUND);
351 } 343 }
352 - if (ObjectUtil.notEqual(afterSale.getStatus(), TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus())) { 344 + if (ObjectUtil.notEqual(afterSale.getStatus(), AfterSaleStatusEnum.WAIT_REFUND.getStatus())) {
353 throw exception(AFTER_SALE_REFUND_FAIL_STATUS_NOT_WAIT_REFUND); 345 throw exception(AFTER_SALE_REFUND_FAIL_STATUS_NOT_WAIT_REFUND);
354 } 346 }
355 347
@@ -357,12 +349,12 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -357,12 +349,12 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
357 createPayRefund(userIp, afterSale); 349 createPayRefund(userIp, afterSale);
358 350
359 // 更新售后单的状态为【已完成】 351 // 更新售后单的状态为【已完成】
360 - updateAfterSaleStatus(afterSale.getId(), TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus(), new TradeAfterSaleDO()  
361 - .setStatus(TradeAfterSaleStatusEnum.COMPLETE.getStatus()).setRefundTime(LocalDateTime.now())); 352 + updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.WAIT_REFUND.getStatus(), new AfterSaleDO()
  353 + .setStatus(AfterSaleStatusEnum.COMPLETE.getStatus()).setRefundTime(LocalDateTime.now()));
362 354
363 // 记录售后日志 355 // 记录售后日志
364 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), 356 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
365 - TradeAfterSaleStatusEnum.COMPLETE.getStatus()); 357 + AfterSaleStatusEnum.COMPLETE.getStatus());
366 358
367 // TODO 发送售后消息 359 // TODO 发送售后消息
368 360
@@ -370,16 +362,16 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -370,16 +362,16 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
370 tradeOrderUpdateService.updateOrderItemWhenAfterSaleSuccess(afterSale.getOrderItemId(), afterSale.getRefundPrice()); 362 tradeOrderUpdateService.updateOrderItemWhenAfterSaleSuccess(afterSale.getOrderItemId(), afterSale.getRefundPrice());
371 } 363 }
372 364
373 - private void createPayRefund(String userIp, TradeAfterSaleDO afterSale) { 365 + private void createPayRefund(String userIp, AfterSaleDO afterSale) {
374 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { 366 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
375 367
376 @Override 368 @Override
377 public void afterCommit() { 369 public void afterCommit() {
378 // 创建退款单 370 // 创建退款单
379 - PayRefundCreateReqDTO createReqDTO = TradeAfterSaleConvert.INSTANCE.convert(userIp, afterSale, tradeOrderProperties); 371 + PayRefundCreateReqDTO createReqDTO = AfterSaleConvert.INSTANCE.convert(userIp, afterSale, tradeOrderProperties);
380 Long payRefundId = payRefundApi.createRefund(createReqDTO); 372 Long payRefundId = payRefundApi.createRefund(createReqDTO);
381 // 更新售后单的退款单号 373 // 更新售后单的退款单号
382 - tradeAfterSaleMapper.updateById(new TradeAfterSaleDO().setId(afterSale.getId()).setPayRefundId(payRefundId)); 374 + tradeAfterSaleMapper.updateById(new AfterSaleDO().setId(afterSale.getId()).setPayRefundId(payRefundId));
383 } 375 }
384 }); 376 });
385 } 377 }
@@ -389,23 +381,23 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -389,23 +381,23 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
389 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CANCEL) 381 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CANCEL)
390 public void cancelAfterSale(Long userId, Long id) { 382 public void cancelAfterSale(Long userId, Long id) {
391 // 校验售后单的状态,并状态待退款 383 // 校验售后单的状态,并状态待退款
392 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id); 384 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
393 if (afterSale == null) { 385 if (afterSale == null) {
394 throw exception(AFTER_SALE_NOT_FOUND); 386 throw exception(AFTER_SALE_NOT_FOUND);
395 } 387 }
396 - if (!ObjectUtils.equalsAny(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus(),  
397 - TradeAfterSaleStatusEnum.SELLER_AGREE.getStatus(),  
398 - TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) { 388 + if (!ObjectUtils.equalsAny(afterSale.getStatus(), AfterSaleStatusEnum.APPLY.getStatus(),
  389 + AfterSaleStatusEnum.SELLER_AGREE.getStatus(),
  390 + AfterSaleStatusEnum.BUYER_DELIVERY.getStatus())) {
399 throw exception(AFTER_SALE_CANCEL_FAIL_STATUS_NOT_APPLY_OR_AGREE_OR_BUYER_DELIVERY); 391 throw exception(AFTER_SALE_CANCEL_FAIL_STATUS_NOT_APPLY_OR_AGREE_OR_BUYER_DELIVERY);
400 } 392 }
401 393
402 // 更新售后单的状态为【已取消】 394 // 更新售后单的状态为【已取消】
403 - updateAfterSaleStatus(afterSale.getId(), afterSale.getStatus(), new TradeAfterSaleDO()  
404 - .setStatus(TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus())); 395 + updateAfterSaleStatus(afterSale.getId(), afterSale.getStatus(), new AfterSaleDO()
  396 + .setStatus(AfterSaleStatusEnum.BUYER_CANCEL.getStatus()));
405 397
406 // 记录售后日志 398 // 记录售后日志
407 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), 399 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
408 - TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus()); 400 + AfterSaleStatusEnum.BUYER_CANCEL.getStatus());
409 401
410 // TODO 发送售后消息 402 // TODO 发送售后消息
411 403
@@ -415,52 +407,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa @@ -415,52 +407,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
415 407
416 @Override 408 @Override
417 public Long getApplyingAfterSaleCount(Long userId) { 409 public Long getApplyingAfterSaleCount(Long userId) {
418 - return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, TradeAfterSaleStatusEnum.APPLYING_STATUSES);  
419 - }  
420 -  
421 - @Deprecated  
422 - private void createAfterSaleLog(Long userId, Integer userType, TradeAfterSaleDO afterSale,  
423 - Integer beforeStatus, Integer afterStatus) {  
424 - TradeAfterSaleLogCreateReqDTO logDTO = new TradeAfterSaleLogCreateReqDTO()  
425 - .setUserId(userId)  
426 - .setUserType(userType)  
427 - .setAfterSaleId(afterSale.getId())  
428 - .setOperateType(afterStatus.toString());  
429 - // TODO 废弃,待删除  
430 - this.createLog(logDTO);  
431 - }  
432 -  
433 - // TODO @CHENCHEN:这个注释,写在接口就好了,补充重复写哈;@date 应该是 @since  
434 - /**  
435 - * 日志记录  
436 - *  
437 - * @param logDTO 日志记录  
438 - * @author 陈賝  
439 - * @date 2023/6/12 14:18  
440 - */  
441 - @Override  
442 - @Async  
443 - public void createLog(TradeAfterSaleLogCreateReqDTO logDTO) {  
444 - try {  
445 - TradeAfterSaleLogDO afterSaleLog = new TradeAfterSaleLogDO()  
446 - .setUserId(logDTO.getUserId())  
447 - .setUserType(logDTO.getUserType())  
448 - .setAfterSaleId(logDTO.getAfterSaleId())  
449 - .setOperateType(logDTO.getOperateType())  
450 - .setContent(logDTO.getContent());  
451 - tradeAfterSaleLogMapper.insert(afterSaleLog);  
452 - // TODO @CHENCHEN:代码排版哈;空格要正确  
453 - }catch (Exception exception){  
454 - log.error("[createLog][request({}) 日志记录错误]", toJsonString(logDTO), exception);  
455 - }  
456 - }  
457 -  
458 - // TODO @puhui999:应该返回 do 哈。  
459 - @Override  
460 - public List<TradeAfterSaleLogRespVO> getLog(Long afterSaleId) {  
461 - // TODO 不熟悉流程先这么滴  
462 - List<TradeAfterSaleLogDO> saleLogDOs = tradeAfterSaleLogMapper.selectList(TradeAfterSaleLogDO::getAfterSaleId, afterSaleId);  
463 - return TradeAfterSaleConvert.INSTANCE.convertList(saleLogDOs); 410 + return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, AfterSaleStatusEnum.APPLYING_STATUSES);
464 } 411 }
465 412
466 } 413 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogCreateReqDTO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/bo/AfterSaleLogCreateReqBO.java
1 -package cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto; 1 +package cn.iocoder.yudao.module.trade.service.aftersale.bo;
2 2
3 import lombok.AllArgsConstructor; 3 import lombok.AllArgsConstructor;
4 import lombok.Data; 4 import lombok.Data;
5 import lombok.NoArgsConstructor; 5 import lombok.NoArgsConstructor;
6 6
  7 +import javax.validation.constraints.NotEmpty;
  8 +import javax.validation.constraints.NotNull;
  9 +
7 /** 10 /**
8 - * 售后日志的创建 Request DTO 11 + * 售后日志的创建 Request BO
9 * 12 *
10 * @author 陈賝 13 * @author 陈賝
11 * @since 2023/6/19 09:54 14 * @since 2023/6/19 09:54
@@ -13,42 +16,42 @@ import lombok.NoArgsConstructor; @@ -13,42 +16,42 @@ import lombok.NoArgsConstructor;
13 @Data 16 @Data
14 @NoArgsConstructor 17 @NoArgsConstructor
15 @AllArgsConstructor 18 @AllArgsConstructor
16 -public class TradeAfterSaleLogCreateReqDTO { 19 +public class AfterSaleLogCreateReqBO {
17 20
18 /** 21 /**
19 - * 编号  
20 - */  
21 - private Long id;  
22 - /**  
23 * 用户编号 22 * 用户编号
24 - *  
25 - * 关联 1:AdminUserDO 的 id 字段  
26 - * 关联 2:MemberUserDO 的 id 字段  
27 */ 23 */
  24 + @NotNull(message = "用户编号不能为空")
28 private Long userId; 25 private Long userId;
29 /** 26 /**
30 * 用户类型 27 * 用户类型
31 */ 28 */
  29 + @NotNull(message = "用户类型不能为空")
32 private Integer userType; 30 private Integer userType;
  31 +
33 /** 32 /**
34 * 售后编号 33 * 售后编号
35 */ 34 */
  35 + @NotNull(message = "售后编号不能为空")
36 private Long afterSaleId; 36 private Long afterSaleId;
37 /** 37 /**
38 - * 操作类型 38 + * 操作前状态
39 */ 39 */
40 - private String operateType; 40 + private Integer beforeStatus;
41 /** 41 /**
42 - * 操作明细 42 + * 操作后状态
43 */ 43 */
44 - private String content; 44 + @NotNull(message = "操作后的状态不能为空")
  45 + private Integer afterStatus;
  46 +
45 /** 47 /**
46 - * 售前状态 48 + * 操作类型
47 */ 49 */
48 - private Integer beforeStatus; 50 + @NotNull(message = "操作类型不能为空")
  51 + private Integer operateType;
49 /** 52 /**
50 - * 售后状态 53 + * 操作明细
51 */ 54 */
52 - private Integer afterStatus;  
53 - 55 + @NotEmpty(message = "操作明细不能为空")
  56 + private String content;
54 } 57 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java
@@ -94,12 +94,12 @@ public interface TradeOrderQueryService { @@ -94,12 +94,12 @@ public interface TradeOrderQueryService {
94 TradeOrderItemDO getOrderItem(Long userId, Long itemId); 94 TradeOrderItemDO getOrderItem(Long userId, Long itemId);
95 95
96 /** 96 /**
97 - * 根据交易订单项编号数组,查询交易订单项 97 + * 获得交易订单项
98 * 98 *
99 - * @param ids 交易订单项编号数组  
100 - * @return 交易订单项数组 99 + * @param id 交易订单项编号 itemId
  100 + * @return 交易订单项
101 */ 101 */
102 - List<TradeOrderItemDO> getOrderItemList(Collection<Long> ids); 102 + TradeOrderItemDO getOrderItem(Long id);
103 103
104 /** 104 /**
105 * 根据交易订单编号,查询交易订单项 105 * 根据交易订单编号,查询交易订单项
@@ -119,5 +119,4 @@ public interface TradeOrderQueryService { @@ -119,5 +119,4 @@ public interface TradeOrderQueryService {
119 */ 119 */
120 List<TradeOrderItemDO> getOrderItemListByOrderId(Collection<Long> orderIds); 120 List<TradeOrderItemDO> getOrderItemListByOrderId(Collection<Long> orderIds);
121 121
122 -  
123 } 122 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
@@ -156,8 +156,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { @@ -156,8 +156,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
156 } 156 }
157 157
158 @Override 158 @Override
159 - public List<TradeOrderItemDO> getOrderItemList(Collection<Long> ids) {  
160 - return tradeOrderItemMapper.selectBatchIds(ids); 159 + public TradeOrderItemDO getOrderItem(Long id) {
  160 + return tradeOrderItemMapper.selectById(id);
161 } 161 }
162 162
163 @Override 163 @Override
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -47,7 +47,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; @@ -47,7 +47,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
47 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 47 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
48 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper; 48 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
49 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; 49 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
50 -import cn.iocoder.yudao.module.trade.dal.redis.no.TradeOrderNoRedisDAO; 50 +import cn.iocoder.yudao.module.trade.dal.redis.no.TradeNoRedisDAO;
51 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 51 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
52 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum; 52 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
53 import cn.iocoder.yudao.module.trade.enums.order.*; 53 import cn.iocoder.yudao.module.trade.enums.order.*;
@@ -97,7 +97,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -97,7 +97,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
97 @Resource 97 @Resource
98 private TradeOrderItemMapper tradeOrderItemMapper; 98 private TradeOrderItemMapper tradeOrderItemMapper;
99 @Resource 99 @Resource
100 - private TradeOrderNoRedisDAO orderNoRedisDAO; 100 + private TradeNoRedisDAO tradeNoRedisDAO;
101 101
102 @Resource 102 @Resource
103 private List<TradeOrderHandler> tradeOrderHandlers; 103 private List<TradeOrderHandler> tradeOrderHandlers;
@@ -215,7 +215,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -215,7 +215,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
215 TradePriceCalculateRespBO calculateRespBO) { 215 TradePriceCalculateRespBO calculateRespBO) {
216 TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO); 216 TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO);
217 order.setType(calculateRespBO.getType()); 217 order.setType(calculateRespBO.getType());
218 - order.setNo(orderNoRedisDAO.generate(TradeOrderNoRedisDAO.TRADE_ORDER_NO_PREFIX)); 218 + order.setNo(tradeNoRedisDAO.generate(TradeNoRedisDAO.TRADE_ORDER_NO_PREFIX));
219 order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus()); 219 order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus());
220 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus()); 220 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
221 order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum)); 221 order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/logger/TradeOrderLogCreateReqBO.java
@@ -28,7 +28,7 @@ public class TradeOrderLogCreateReqBO { @@ -28,7 +28,7 @@ public class TradeOrderLogCreateReqBO {
28 /** 28 /**
29 * 订单编号 29 * 订单编号
30 */ 30 */
31 - @NotNull(message = "订单编号") 31 + @NotNull(message = "订单编号不能为空")
32 private Long orderId; 32 private Long orderId;
33 /** 33 /**
34 * 操作前状态 34 * 操作前状态
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceTest.java renamed to yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceTest.java
@@ -4,17 +4,17 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; @@ -4,17 +4,17 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; 5 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
6 import cn.iocoder.yudao.module.pay.api.refund.PayRefundApi; 6 import cn.iocoder.yudao.module.pay.api.refund.PayRefundApi;
7 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSalePageReqVO;  
8 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppTradeAfterSaleCreateReqVO;  
9 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;  
10 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO; 7 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSalePageReqVO;
  8 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  9 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
  10 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO;
11 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 11 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
12 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 12 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
13 -import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleLogMapper;  
14 -import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.TradeAfterSaleMapper;  
15 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleStatusEnum;  
16 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleTypeEnum;  
17 -import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum; 13 +import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.AfterSaleLogMapper;
  14 +import cn.iocoder.yudao.module.trade.dal.mysql.aftersale.AfterSaleMapper;
  15 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleStatusEnum;
  16 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleTypeEnum;
  17 +import cn.iocoder.yudao.module.trade.enums.aftersale.AfterSaleWayEnum;
18 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; 18 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
19 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 19 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
20 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 20 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
@@ -37,20 +37,20 @@ import static org.mockito.ArgumentMatchers.eq; @@ -37,20 +37,20 @@ import static org.mockito.ArgumentMatchers.eq;
37 import static org.mockito.Mockito.when; 37 import static org.mockito.Mockito.when;
38 38
39 /** 39 /**
40 - * {@link TradeAfterSaleService} 的单元测试 40 + * {@link AfterSaleService} 的单元测试
41 * 41 *
42 * @author 芋道源码 42 * @author 芋道源码
43 */ 43 */
44 -@Import(TradeAfterSaleServiceImpl.class)  
45 -public class TradeAfterSaleServiceTest extends BaseDbUnitTest { 44 +@Import(AfterSaleServiceImpl.class)
  45 +public class AfterSaleServiceTest extends BaseDbUnitTest {
46 46
47 @Resource 47 @Resource
48 - private TradeAfterSaleServiceImpl tradeAfterSaleService; 48 + private AfterSaleServiceImpl tradeAfterSaleService;
49 49
50 @Resource 50 @Resource
51 - private TradeAfterSaleMapper tradeAfterSaleMapper; 51 + private AfterSaleMapper tradeAfterSaleMapper;
52 @Resource 52 @Resource
53 - private TradeAfterSaleLogMapper tradeAfterSaleLogMapper; 53 + private AfterSaleLogMapper tradeAfterSaleLogMapper;
54 54
55 @MockBean 55 @MockBean
56 private TradeOrderUpdateService tradeOrderUpdateService; 56 private TradeOrderUpdateService tradeOrderUpdateService;
@@ -67,8 +67,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -67,8 +67,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
67 public void testCreateAfterSale() { 67 public void testCreateAfterSale() {
68 // 准备参数 68 // 准备参数
69 Long userId = 1024L; 69 Long userId = 1024L;
70 - AppTradeAfterSaleCreateReqVO createReqVO = new AppTradeAfterSaleCreateReqVO()  
71 - .setOrderItemId(1L).setRefundPrice(100).setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay()) 70 + AppAfterSaleCreateReqVO createReqVO = new AppAfterSaleCreateReqVO()
  71 + .setOrderItemId(1L).setRefundPrice(100).setWay(AfterSaleWayEnum.RETURN_AND_REFUND.getWay())
72 .setApplyReason("退钱").setApplyDescription("快退") 72 .setApplyReason("退钱").setApplyDescription("快退")
73 .setApplyPicUrls(asList("https://www.baidu.com/1.png", "https://www.baidu.com/2.png")); 73 .setApplyPicUrls(asList("https://www.baidu.com/1.png", "https://www.baidu.com/2.png"));
74 // mock 方法(交易订单项) 74 // mock 方法(交易订单项)
@@ -86,10 +86,10 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -86,10 +86,10 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
86 // 调用 86 // 调用
87 Long afterSaleId = tradeAfterSaleService.createAfterSale(userId, createReqVO); 87 Long afterSaleId = tradeAfterSaleService.createAfterSale(userId, createReqVO);
88 // 断言(TradeAfterSaleDO) 88 // 断言(TradeAfterSaleDO)
89 - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(afterSaleId); 89 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(afterSaleId);
90 assertNotNull(afterSale.getNo()); 90 assertNotNull(afterSale.getNo());
91 - assertEquals(afterSale.getStatus(), TradeAfterSaleStatusEnum.APPLY.getStatus());  
92 - assertEquals(afterSale.getType(), TradeAfterSaleTypeEnum.IN_SALE.getType()); 91 + assertEquals(afterSale.getStatus(), AfterSaleStatusEnum.APPLY.getStatus());
  92 + assertEquals(afterSale.getType(), AfterSaleTypeEnum.IN_SALE.getType());
93 assertPojoEquals(afterSale, createReqVO); 93 assertPojoEquals(afterSale, createReqVO);
94 assertEquals(afterSale.getUserId(), 1024L); 94 assertEquals(afterSale.getUserId(), 1024L);
95 assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime"); 95 assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime");
@@ -101,22 +101,22 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -101,22 +101,22 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
101 assertNull(afterSale.getDeliveryTime()); 101 assertNull(afterSale.getDeliveryTime());
102 assertNull(afterSale.getReceiveReason()); 102 assertNull(afterSale.getReceiveReason());
103 // 断言(TradeAfterSaleLogDO) 103 // 断言(TradeAfterSaleLogDO)
104 - TradeAfterSaleLogDO afterSaleLog = tradeAfterSaleLogMapper.selectList().get(0); 104 + AfterSaleLogDO afterSaleLog = tradeAfterSaleLogMapper.selectList().get(0);
105 assertEquals(afterSaleLog.getUserId(), userId); 105 assertEquals(afterSaleLog.getUserId(), userId);
106 assertEquals(afterSaleLog.getUserType(), UserTypeEnum.MEMBER.getValue()); 106 assertEquals(afterSaleLog.getUserType(), UserTypeEnum.MEMBER.getValue());
107 assertEquals(afterSaleLog.getAfterSaleId(), afterSaleId); 107 assertEquals(afterSaleLog.getAfterSaleId(), afterSaleId);
108 assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime"); 108 assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime");
109 - assertEquals(afterSaleLog.getContent(), TradeAfterSaleStatusEnum.APPLY.getContent()); 109 + assertEquals(afterSaleLog.getContent(), AfterSaleStatusEnum.APPLY.getContent());
110 } 110 }
111 111
112 @Test 112 @Test
113 public void testGetAfterSalePage() { 113 public void testGetAfterSalePage() {
114 // mock 数据 114 // mock 数据
115 - TradeAfterSaleDO dbAfterSale = randomPojo(TradeAfterSaleDO.class, o -> { // 等会查询到 115 + AfterSaleDO dbAfterSale = randomPojo(AfterSaleDO.class, o -> { // 等会查询到
116 o.setNo("202211190847450020500077"); 116 o.setNo("202211190847450020500077");
117 - o.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus());  
118 - o.setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay());  
119 - o.setType(TradeAfterSaleTypeEnum.IN_SALE.getType()); 117 + o.setStatus(AfterSaleStatusEnum.APPLY.getStatus());
  118 + o.setWay(AfterSaleWayEnum.RETURN_AND_REFUND.getWay());
  119 + o.setType(AfterSaleTypeEnum.IN_SALE.getType());
120 o.setOrderNo("202211190847450020500011"); 120 o.setOrderNo("202211190847450020500011");
121 o.setSpuName("芋艿"); 121 o.setSpuName("芋艿");
122 o.setCreateTime(buildTime(2022, 1, 15)); 122 o.setCreateTime(buildTime(2022, 1, 15));
@@ -125,11 +125,11 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -125,11 +125,11 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
125 // 测试 no 不匹配 125 // 测试 no 不匹配
126 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setNo("202211190847450020500066"))); 126 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setNo("202211190847450020500066")));
127 // 测试 status 不匹配 127 // 测试 status 不匹配
128 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setStatus(TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus()))); 128 + tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setStatus(AfterSaleStatusEnum.SELLER_REFUSE.getStatus())));
129 // 测试 way 不匹配 129 // 测试 way 不匹配
130 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setWay(TradeAfterSaleWayEnum.REFUND.getWay()))); 130 + tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setWay(AfterSaleWayEnum.REFUND.getWay())));
131 // 测试 type 不匹配 131 // 测试 type 不匹配
132 - tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setType(TradeAfterSaleTypeEnum.AFTER_SALE.getType()))); 132 + tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setType(AfterSaleTypeEnum.AFTER_SALE.getType())));
133 // 测试 orderNo 不匹配 133 // 测试 orderNo 不匹配
134 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setOrderNo("202211190847450020500022"))); 134 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setOrderNo("202211190847450020500022")));
135 // 测试 spuName 不匹配 135 // 测试 spuName 不匹配
@@ -137,17 +137,17 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest { @@ -137,17 +137,17 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
137 // 测试 createTime 不匹配 137 // 测试 createTime 不匹配
138 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setCreateTime(buildTime(2022, 1, 20)))); 138 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setCreateTime(buildTime(2022, 1, 20))));
139 // 准备参数 139 // 准备参数
140 - TradeAfterSalePageReqVO reqVO = new TradeAfterSalePageReqVO(); 140 + AfterSalePageReqVO reqVO = new AfterSalePageReqVO();
141 reqVO.setNo("20221119084745002050007"); 141 reqVO.setNo("20221119084745002050007");
142 - reqVO.setStatus(TradeAfterSaleStatusEnum.APPLY.getStatus());  
143 - reqVO.setWay(TradeAfterSaleWayEnum.RETURN_AND_REFUND.getWay());  
144 - reqVO.setType(TradeAfterSaleTypeEnum.IN_SALE.getType()); 142 + reqVO.setStatus(AfterSaleStatusEnum.APPLY.getStatus());
  143 + reqVO.setWay(AfterSaleWayEnum.RETURN_AND_REFUND.getWay());
  144 + reqVO.setType(AfterSaleTypeEnum.IN_SALE.getType());
145 reqVO.setOrderNo("20221119084745002050001"); 145 reqVO.setOrderNo("20221119084745002050001");
146 reqVO.setSpuName("芋"); 146 reqVO.setSpuName("芋");
147 reqVO.setCreateTime(new LocalDateTime[]{buildTime(2022, 1, 1), buildTime(2022, 1, 16)}); 147 reqVO.setCreateTime(new LocalDateTime[]{buildTime(2022, 1, 1), buildTime(2022, 1, 16)});
148 148
149 // 调用 149 // 调用
150 - PageResult<TradeAfterSaleDO> pageResult = tradeAfterSaleService.getAfterSalePage(reqVO); 150 + PageResult<AfterSaleDO> pageResult = tradeAfterSaleService.getAfterSalePage(reqVO);
151 // 断言 151 // 断言
152 assertEquals(1, pageResult.getTotal()); 152 assertEquals(1, pageResult.getTotal());
153 assertEquals(1, pageResult.getList().size()); 153 assertEquals(1, pageResult.getList().size());
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/RedisKeyConstants.java
@@ -22,6 +22,6 @@ public interface RedisKeyConstants { @@ -22,6 +22,6 @@ public interface RedisKeyConstants {
22 * KEY 格式:pay_no:{prefix} 22 * KEY 格式:pay_no:{prefix}
23 * VALUE 数据格式:编号自增 23 * VALUE 数据格式:编号自增
24 */ 24 */
25 - String PAY_NO = "pay_no"; 25 + String PAY_NO = "pay_no:";
26 26
27 } 27 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/redis/no/PayNoRedisDAO.java
1 package cn.iocoder.yudao.module.pay.dal.redis.no; 1 package cn.iocoder.yudao.module.pay.dal.redis.no;
2 2
3 -import cn.hutool.core.date.DatePattern;import cn.hutool.core.date.DateUtil;import org.springframework.data.redis.core.StringRedisTemplate; 3 +import cn.hutool.core.date.DatePattern;import cn.hutool.core.date.DateUtil;
  4 +import cn.iocoder.yudao.module.pay.dal.redis.RedisKeyConstants;
  5 +import org.springframework.data.redis.core.StringRedisTemplate;
4 import org.springframework.stereotype.Repository; 6 import org.springframework.stereotype.Repository;
5 7
6 -import javax.annotation.Resource;import java.time.LocalDateTime; 8 +import javax.annotation.Resource;
  9 +import java.time.Duration;
  10 +import java.time.LocalDateTime;
7 11
8 /** 12 /**
9 * 支付序号的 Redis DAO 13 * 支付序号的 Redis DAO
@@ -23,8 +27,12 @@ public class PayNoRedisDAO { @@ -23,8 +27,12 @@ public class PayNoRedisDAO {
23 * @return 序号 27 * @return 序号
24 */ 28 */
25 public String generate(String prefix) { 29 public String generate(String prefix) {
  30 + // 递增序号
26 String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN); 31 String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN);
27 - Long no = stringRedisTemplate.opsForValue().increment(noPrefix); 32 + String key = RedisKeyConstants.PAY_NO + noPrefix;
  33 + Long no = stringRedisTemplate.opsForValue().increment(key);
  34 + // 设置过期时间
  35 + stringRedisTemplate.expire(key, Duration.ofMinutes(1L));
28 return noPrefix + no; 36 return noPrefix + no;
29 } 37 }
30 38