Commit b7359706db9b535392a4ed0f37cb39cbc81da110

Authored by owen
2 parents d0f0bc58 1f910992

Merge remote-tracking branch 'origin/feature/mall_product' into feature/mall_product

Showing 68 changed files with 745 additions and 843 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/number/NumberUtils.java
... ... @@ -13,4 +13,28 @@ public class NumberUtils {
13 13 return StrUtil.isNotEmpty(str) ? Long.valueOf(str) : null;
14 14 }
15 15  
  16 + /**
  17 + * 通过经纬度获取地球上两点之间的距离
  18 + *
  19 + * 参考 <<a href="https://gitee.com/dromara/hutool/blob/1caabb586b1f95aec66a21d039c5695df5e0f4c1/hutool-core/src/main/java/cn/hutool/core/util/DistanceUtil.java">DistanceUtil</a>> 实现,目前它已经被 hutool 删除
  20 + *
  21 + * @param lat1 经度1
  22 + * @param lng1 纬度1
  23 + * @param lat2 经度2
  24 + * @param lng2 纬度2
  25 + * @return 距离,单位:千米
  26 + */
  27 + public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
  28 + double radLat1 = lat1 * Math.PI / 180.0;
  29 + double radLat2 = lat2 * Math.PI / 180.0;
  30 + double a = radLat1 - radLat2;
  31 + double b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
  32 + double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
  33 + + Math.cos(radLat1) * Math.cos(radLat2)
  34 + * Math.pow(Math.sin(b / 2), 2)));
  35 + distance = distance * 6378.137;
  36 + distance = Math.round(distance * 10000d) / 10000d;
  37 + return distance;
  38 + }
  39 +
16 40 }
... ...
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 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.map.MapUtil;
5 5 import cn.hutool.core.util.ArrayUtil;
6   -import org.aspectj.lang.JoinPoint;
7 6 import org.aspectj.lang.ProceedingJoinPoint;
8 7 import org.aspectj.lang.reflect.MethodSignature;
9 8 import org.springframework.core.DefaultParameterNameDiscoverer;
... ... @@ -87,47 +86,4 @@ public class SpringExpressionUtils {
87 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 18 */
19 19 @AllArgsConstructor
20 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 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 88 return ARRAYS;
89 89 }
90 90  
91   - public static TradeAfterSaleStatusEnum valueOf(Integer status) {
  91 + public static AfterSaleStatusEnum valueOf(Integer status) {
92 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 13 */
14 14 @RequiredArgsConstructor
15 15 @Getter
16   -public enum TradeAfterSaleTypeEnum implements IntArrayValuable {
  16 +public enum AfterSaleTypeEnum implements IntArrayValuable {
17 17  
18 18 IN_SALE(10, "售中退款"), // 交易完成前买家申请退款
19 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 13 */
14 14 @RequiredArgsConstructor
15 15 @Getter
16   -public enum TradeAfterSaleWayEnum implements IntArrayValuable {
  16 +public enum AfterSaleWayEnum implements IntArrayValuable {
17 17  
18 18 REFUND(10, "仅退款"),
19 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 8 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
9 9 import cn.iocoder.yudao.module.pay.api.notify.dto.PayRefundNotifyReqDTO;
10 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 14 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
15 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 18 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
19 19 import io.swagger.v3.oas.annotations.Operation;
20 20 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -27,8 +27,6 @@ import org.springframework.web.bind.annotation.*;
27 27 import javax.annotation.Resource;
28 28 import javax.annotation.security.PermitAll;
29 29 import javax.validation.Valid;
30   -import java.time.LocalDateTime;
31   -import java.util.ArrayList;
32 30 import java.util.List;
33 31 import java.util.Map;
34 32  
... ... @@ -42,10 +40,10 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
42 40 @RequestMapping("/trade/after-sale")
43 41 @Validated
44 42 @Slf4j
45   -public class TradeAfterSaleController {
  43 +public class AfterSaleController {
46 44  
47 45 @Resource
48   - private TradeAfterSaleService afterSaleService;
  46 + private AfterSaleService afterSaleService;
49 47 @Resource
50 48 private TradeOrderQueryService tradeOrderQueryService;
51 49 @Resource
... ... @@ -56,26 +54,26 @@ public class TradeAfterSaleController {
56 54 @GetMapping("/page")
57 55 @Operation(summary = "获得售后订单分页")
58 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 60 if (CollUtil.isEmpty(pageResult.getList())) {
63 61 return success(PageResult.empty());
64 62 }
65 63  
66 64 // 查询会员
67 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 70 @GetMapping("/get-detail")
73 71 @Operation(summary = "获得售后订单详情")
74 72 @Parameter(name = "id", description = "售后编号", required = true, example = "1")
75 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 77 if (afterSale == null) {
80 78 return success(null);
81 79 }
... ... @@ -83,34 +81,11 @@ public class TradeAfterSaleController {
83 81 // 查询订单
84 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 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 91 @PutMapping("/agree")
... ... @@ -125,7 +100,7 @@ public class TradeAfterSaleController {
125 100 @PutMapping("/disagree")
126 101 @Operation(summary = "拒绝售后")
127 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 104 afterSaleService.disagreeAfterSale(getLoginUserId(), confirmReqVO);
130 105 return success(true);
131 106 }
... ... @@ -143,7 +118,7 @@ public class TradeAfterSaleController {
143 118 @Operation(summary = "拒绝收货")
144 119 @Parameter(name = "id", description = "售后编号", required = true, example = "1")
145 120 @PreAuthorize("@ss.hasPermission('trade:after-sale:receive')")
146   - public CommonResult<Boolean> refuseAfterSale(TradeAfterSaleRefuseReqVO refuseReqVO) {
  121 + public CommonResult<Boolean> refuseAfterSale(AfterSaleRefuseReqVO refuseReqVO) {
147 122 afterSaleService.refuseAfterSale(getLoginUserId(), refuseReqVO);
148 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 15 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
16 16 */
17 17 @Data
18   -public class TradeAfterSaleBaseVO {
  18 +public class AfterSaleBaseVO {
19 19  
20 20 @Schema(description = "售后流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "202211190847450020500077")
21 21 @NotNull(message = "售后流水号不能为空")
... ... @@ -53,7 +53,7 @@ public class TradeAfterSaleBaseVO {
53 53  
54 54 @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022111917190001")
55 55 @NotNull(message = "订单流水号不能为空")
56   - private Long orderNo;
  56 + private String orderNo;
57 57  
58 58 @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "572")
59 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 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 4 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
5 5 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
6 6 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderBaseVO;
... ... @@ -12,20 +12,21 @@ import java.util.List;
12 12  
13 13 @Schema(description = "管理后台 - 售后订单的详情 Response VO")
14 14 @Data
15   -public class TradeAfterSaleDetailRespVO extends TradeAfterSaleBaseVO {
  15 +public class AfterSaleDetailRespVO extends AfterSaleBaseVO {
16 16  
17 17 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
18 18 private Long id;
19 19  
20   - /**
21   - * 订单项列表
22   - */
23   - private List<Item> items;
  20 +
24 21  
25 22 /**
26 23 * 订单基本信息
27 24 */
28 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 36 /**
36 37 * 售后日志
37 38 */
38   - private List<TradeAfterSaleLogRespVO> logs;
  39 + private List<AfterSaleLogRespVO> logs;
39 40  
40 41 @Schema(description = "管理后台 - 交易订单的详情的订单项目")
41 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 8  
9 9 @Schema(description = "管理后台 - 交易售后拒绝 Request VO")
10 10 @Data
11   -public class TradeAfterSaleDisagreeReqVO {
  11 +public class AfterSaleDisagreeReqVO {
12 12  
13 13 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14 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 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 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 8 import io.swagger.v3.oas.annotations.media.Schema;
9 9 import lombok.Data;
10 10 import lombok.EqualsAndHashCode;
... ... @@ -19,21 +19,21 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
19 19 @Data
20 20 @EqualsAndHashCode(callSuper = true)
21 21 @ToString(callSuper = true)
22   -public class TradeAfterSalePageReqVO extends PageParam {
  22 +public class AfterSalePageReqVO extends PageParam {
23 23  
24 24 @Schema(description = "售后流水号", example = "202211190847450020500077")
25 25 private String no;
26 26  
27 27 @Schema(description = "售后状态", example = "10")
28   - @InEnum(value = TradeAfterSaleStatusEnum.class, message = "售后状态必须是 {value}")
  28 + @InEnum(value = AfterSaleStatusEnum.class, message = "售后状态必须是 {value}")
29 29 private Integer status;
30 30  
31 31 @Schema(description = "售后类型", example = "20")
32   - @InEnum(value = TradeAfterSaleTypeEnum.class, message = "售后类型必须是 {value}")
  32 + @InEnum(value = AfterSaleTypeEnum.class, message = "售后类型必须是 {value}")
33 33 private Integer type;
34 34  
35 35 @Schema(description = "售后方式", example = "10")
36   - @InEnum(value = TradeAfterSaleWayEnum.class, message = "售后方式必须是 {value}")
  36 + @InEnum(value = AfterSaleWayEnum.class, message = "售后方式必须是 {value}")
37 37 private Integer way;
38 38  
39 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  
8 8 @Schema(description = "管理后台 - 交易售后拒绝收货 Request VO")
9 9 @Data
10   -public class TradeAfterSaleRefuseReqVO {
  10 +public class AfterSaleRefuseReqVO {
11 11  
12 12 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 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 14 @Data
15 15 @EqualsAndHashCode(callSuper = true)
16 16 @ToString(callSuper = true)
17   -public class TradeAfterSaleRespPageItemVO extends TradeAfterSaleBaseVO {
  17 +public class AfterSaleRespPageItemVO extends AfterSaleBaseVO {
18 18  
19 19 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27630")
20 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 8  
9 9 @Schema(description = "管理后台 - 交易售后日志 Response VO")
10 10 @Data
11   -public class TradeAfterSaleLogRespVO {
  11 +public class AfterSaleLogRespVO {
12 12  
13 13 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20669")
14 14 private Long id;
... ... @@ -25,14 +25,6 @@ public class TradeAfterSaleLogRespVO {
25 25 @NotNull(message = "售后编号不能为空")
26 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 28 @Schema(description = "售后状态(之前)", example = "2")
37 29 private Integer beforeStatus;
38 30  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/TradeConfigController.java
... ... @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
8 8 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
9 9 import io.swagger.v3.oas.annotations.Operation;
10 10 import io.swagger.v3.oas.annotations.tags.Tag;
  11 +import org.springframework.beans.factory.annotation.Value;
11 12 import org.springframework.security.access.prepost.PreAuthorize;
12 13 import org.springframework.validation.annotation.Validated;
13 14 import org.springframework.web.bind.annotation.*;
... ... @@ -26,6 +27,9 @@ public class TradeConfigController {
26 27 @Resource
27 28 private TradeConfigService tradeConfigService;
28 29  
  30 + @Value("${yudao.tencent-lbs-key}")
  31 + private String tencentLbsKey;
  32 +
29 33 @PutMapping("/save")
30 34 @Operation(summary = "更新交易中心配置")
31 35 @PreAuthorize("@ss.hasPermission('trade:config:save')")
... ... @@ -39,7 +43,11 @@ public class TradeConfigController {
39 43 @PreAuthorize("@ss.hasPermission('trade:config:query')")
40 44 public CommonResult<TradeConfigRespVO> getConfig() {
41 45 TradeConfigDO config = tradeConfigService.getTradeConfig();
42   - return success(TradeConfigConvert.INSTANCE.convert(config));
  46 + TradeConfigRespVO configVO = TradeConfigConvert.INSTANCE.convert(config);
  47 + if (configVO != null) {
  48 + configVO.setTencentLbsKey(tencentLbsKey);
  49 + }
  50 + return success(configVO);
43 51 }
44 52  
45 53 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java
... ... @@ -44,6 +44,10 @@ public class TradeConfigBaseVO {
44 44 @PositiveOrZero(message = "全场包邮的最小金额不能是负数")
45 45 private Integer deliveryExpressFreePrice;
46 46  
  47 + @Schema(description = "是否开启自提", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
  48 + @NotNull(message = "是否开启自提不能为空")
  49 + private Boolean deliveryPickUpEnabled;
  50 +
47 51 // ========== 分销相关 ==========
48 52  
49 53 @Schema(description = "是否启用分佣", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigRespVO.java
... ... @@ -14,4 +14,7 @@ public class TradeConfigRespVO extends TradeConfigBaseVO {
14 14 @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
15 15 private Long id;
16 16  
  17 + @Schema(description = "腾讯地图 KEY", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
  18 + private String tencentLbsKey;
  19 +
17 20 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateChargeBaseVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateChargeBaseVO.java
... ... @@ -11,7 +11,10 @@ import java.util.List;
11 11 * 快递运费模板运费设置 Base VO,提供给添加运费模板使用
12 12 */
13 13 @Data
14   -public class ExpressTemplateChargeBaseVO {
  14 +public class DeliveryExpressTemplateChargeBaseVO {
  15 +
  16 + @Schema(description = "编号", example = "6592", hidden = true) // 由于想简单一点,复用这个 VO 在更新操作,所以 hidden 为 false
  17 + private Long id;
15 18  
16 19 @Schema(description = "区域编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,120000]")
17 20 @NotEmpty(message = "区域编号列表不能为空")
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateCreateReqVO.java
... ... @@ -6,7 +6,6 @@ import lombok.EqualsAndHashCode;
6 6 import lombok.ToString;
7 7  
8 8 import javax.validation.Valid;
9   -import java.util.Collections;
10 9 import java.util.List;
11 10  
12 11 @Schema(description = "管理后台 - 快递运费模板创建 Request VO")
... ... @@ -17,10 +16,10 @@ public class DeliveryExpressTemplateCreateReqVO extends DeliveryExpressTemplateB
17 16  
18 17 @Schema(description = "区域运费列表")
19 18 @Valid
20   - private List<ExpressTemplateChargeBaseVO> templateCharge;
  19 + private List<DeliveryExpressTemplateChargeBaseVO> charges;
21 20  
22 21 @Schema(description = "包邮区域列表")
23 22 @Valid
24   - private List<ExpressTemplateFreeBaseVO> templateFree;
  23 + private List<DeliveryExpressTemplateFreeBaseVO> frees;
25 24  
26 25 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateDetailRespVO.java
... ... @@ -17,9 +17,9 @@ public class DeliveryExpressTemplateDetailRespVO extends DeliveryExpressTemplate
17 17 private Long id;
18 18  
19 19 @Schema(description = "运费模板运费设置", requiredMode = Schema.RequiredMode.REQUIRED)
20   - private List<ExpressTemplateChargeBaseVO> templateCharge;
  20 + private List<DeliveryExpressTemplateChargeBaseVO> charges;
21 21  
22 22 @Schema(description = "运费模板包邮区域", requiredMode = Schema.RequiredMode.REQUIRED)
23   - private List<ExpressTemplateFreeBaseVO> templateFree;
  23 + private List<DeliveryExpressTemplateFreeBaseVO> frees;
24 24  
25 25 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/ExpressTemplateFreeBaseVO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateFreeBaseVO.java
... ... @@ -11,7 +11,7 @@ import java.util.List;
11 11 * 快递运费模板包邮 Base VO,提供给添加运费模板使用
12 12 */
13 13 @Data
14   -public class ExpressTemplateFreeBaseVO {
  14 +public class DeliveryExpressTemplateFreeBaseVO {
15 15  
16 16 @Schema(description = "区域编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,120000]")
17 17 @NotEmpty(message = "区域编号列表不能为空")
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateUpdateReqVO.java
... ... @@ -21,36 +21,10 @@ public class DeliveryExpressTemplateUpdateReqVO extends DeliveryExpressTemplateB
21 21  
22 22 @Schema(description = "区域运费列表")
23 23 @Valid
24   - private List<ExpressTemplateChargeUpdateVO> templateCharge;
  24 + private List<DeliveryExpressTemplateChargeBaseVO> charges;
25 25  
26 26 @Schema(description = "包邮区域列表")
27 27 @Valid
28   - private List<ExpressTemplateFreeUpdateVO> templateFree;
  28 + private List<DeliveryExpressTemplateFreeBaseVO> frees;
29 29  
30   - @Schema(description = "管理后台 - 快递运费模板区域运费更新 Request VO")
31   - @Data
32   - public static class ExpressTemplateChargeUpdateVO extends ExpressTemplateChargeBaseVO {
33   -
34   - @Schema(description = "编号", example = "6592")
35   - private Long id;
36   -
37   - // TODO @jason:这几个字段,应该不通过前端传递,而是后端查询后去赋值的
38   - @Schema(description = "配送模板编号", example = "1")
39   - private Long templateId;
40   -
41   - @Schema(description = "配送计费方式", example = "1")
42   - private Integer chargeMode;
43   -
44   - }
45   -
46   - @Schema(description = "管理后台 - 快递运费模板包邮区域更新 Request VO")
47   - @Data
48   - public static class ExpressTemplateFreeUpdateVO extends ExpressTemplateFreeBaseVO {
49   -
50   - @Schema(description = "编号", example = "6592")
51   - private Long id;
52   -
53   - @Schema(description = "配送模板编号", example = "1")
54   - private Long templateId;
55   - }
56 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 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageParam;
5 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 11 import io.swagger.v3.oas.annotations.Operation;
16 12 import io.swagger.v3.oas.annotations.Parameter;
17 13 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -29,23 +25,23 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
29 25 @RequestMapping("/trade/after-sale")
30 26 @Validated
31 27 @Slf4j
32   -public class AppTradeAfterSaleController {
  28 +public class AppAfterSaleController {
33 29  
34 30 @Resource
35   - private TradeAfterSaleService afterSaleService;
  31 + private AfterSaleService afterSaleService;
36 32  
37 33 @GetMapping(value = "/page")
38 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 37 afterSaleService.getAfterSalePage(getLoginUserId(), pageParam)));
42 38 }
43 39  
44 40 @GetMapping(value = "/get")
45 41 @Operation(summary = "获得售后订单")
46 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 47 @GetMapping(value = "/get-applying-count")
... ... @@ -56,16 +52,13 @@ public class AppTradeAfterSaleController {
56 52  
57 53 @PostMapping(value = "/create")
58 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 56 return success(afterSaleService.createAfterSale(getLoginUserId(), createReqVO));
64 57 }
65 58  
66 59 @PutMapping(value = "/delivery")
67 60 @Operation(summary = "退回货物")
68   - public CommonResult<Boolean> deliveryAfterSale(@RequestBody AppTradeAfterSaleDeliveryReqVO deliveryReqVO) {
  61 + public CommonResult<Boolean> deliveryAfterSale(@RequestBody AppAfterSaleDeliveryReqVO deliveryReqVO) {
69 62 afterSaleService.deliveryAfterSale(getLoginUserId(), deliveryReqVO);
70 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 1 package cn.iocoder.yudao.module.trade.controller.app.aftersale.vo;
2 2  
3 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 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.Data;
7 7  
... ... @@ -11,7 +11,7 @@ import java.util.List;
11 11  
12 12 @Schema(description = "用户 App - 交易售后创建 Request VO")
13 13 @Data
14   -public class AppTradeAfterSaleCreateReqVO {
  14 +public class AppAfterSaleCreateReqVO {
15 15  
16 16 @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
17 17 @NotNull(message = "订单项编号不能为空")
... ... @@ -19,7 +19,7 @@ public class AppTradeAfterSaleCreateReqVO {
19 19  
20 20 @Schema(description = "售后方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
21 21 @NotNull(message = "售后方式不能为空")
22   - @InEnum(value = TradeAfterSaleWayEnum.class, message = "售后方式必须是 {value}")
  22 + @InEnum(value = AfterSaleWayEnum.class, message = "售后方式必须是 {value}")
23 23 private Integer way;
24 24  
25 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  
8 8 @Schema(description = "用户 App - 交易售后退回货物 Request VO")
9 9 @Data
10   -public class AppTradeAfterSaleDeliveryReqVO {
  10 +public class AppAfterSaleDeliveryReqVO {
11 11  
12 12 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 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 9  
10 10 @Schema(description = "用户 App - 交易售后 Response VO")
11 11 @Data
12   -public class AppTradeAfterSaleRespVO {
  12 +public class AppAfterSaleRespVO {
13 13  
14 14 @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
15 15 private Long id;
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/config/AppTradeConfigController.java
... ... @@ -10,6 +10,7 @@ import io.swagger.v3.oas.annotations.Operation;
10 10 import io.swagger.v3.oas.annotations.tags.Tag;
11 11 import lombok.RequiredArgsConstructor;
12 12 import lombok.extern.slf4j.Slf4j;
  13 +import org.springframework.beans.factory.annotation.Value;
13 14 import org.springframework.validation.annotation.Validated;
14 15 import org.springframework.web.bind.annotation.GetMapping;
15 16 import org.springframework.web.bind.annotation.RequestMapping;
... ... @@ -30,11 +31,14 @@ public class AppTradeConfigController {
30 31 @Resource
31 32 private TradeConfigService tradeConfigService;
32 33  
  34 + @Value("${yudao.tencent-lbs-key}")
  35 + private String tencentLbsKey;
  36 +
33 37 @GetMapping("/get")
34 38 @Operation(summary = "获得交易配置")
35 39 public CommonResult<AppTradeConfigRespVO> getTradeConfig() {
36   - TradeConfigDO tradeConfig = ObjUtil.defaultIfNull(tradeConfigService.getTradeConfig(), new TradeConfigDO());
37   - return success(TradeConfigConvert.INSTANCE.convert02(tradeConfig));
  40 + TradeConfigDO config = ObjUtil.defaultIfNull(tradeConfigService.getTradeConfig(), new TradeConfigDO());
  41 + return success(TradeConfigConvert.INSTANCE.convert02(config).setTencentLbsKey(tencentLbsKey));
38 42 }
39 43  
40 44 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/config/vo/AppTradeConfigRespVO.java
... ... @@ -3,12 +3,22 @@ package cn.iocoder.yudao.module.trade.controller.app.config.vo;
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
5 5  
  6 +import javax.validation.constraints.NotNull;
6 7 import java.util.List;
7 8  
8 9 @Schema(description = "用户 App - 交易配置 Response VO")
9 10 @Data
10 11 public class AppTradeConfigRespVO {
11 12  
  13 + @Schema(description = "腾讯地图 KEY", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
  14 + private String tencentLbsKey;
  15 +
  16 + // ========== 配送相关 ==========
  17 +
  18 + @Schema(description = "是否开启自提", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
  19 + @NotNull(message = "是否开启自提不能为空")
  20 + private Boolean deliveryPickUpEnabled;
  21 +
12 22 // ========== 售后相关 ==========
13 23  
14 24 @Schema(description = "售后的退款理由", requiredMode = Schema.RequiredMode.REQUIRED)
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/AppDeliverPickUpStoreController.java
1 1 package cn.iocoder.yudao.module.trade.controller.app.delivery;
2 2  
3   -import cn.hutool.core.util.RandomUtil;
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.module.trade.controller.app.delivery.vo.pickup.AppDeliveryPickUpStoreRespVO;
  6 +import cn.iocoder.yudao.module.trade.convert.delivery.DeliveryPickUpStoreConvert;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO;
  8 +import cn.iocoder.yudao.module.trade.service.delivery.DeliveryPickUpStoreService;
6 9 import io.swagger.v3.oas.annotations.Operation;
7 10 import io.swagger.v3.oas.annotations.Parameter;
  11 +import io.swagger.v3.oas.annotations.Parameters;
8 12 import io.swagger.v3.oas.annotations.tags.Tag;
9 13 import org.springframework.validation.annotation.Validated;
10 14 import org.springframework.web.bind.annotation.GetMapping;
... ... @@ -12,9 +16,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
12 16 import org.springframework.web.bind.annotation.RequestParam;
13 17 import org.springframework.web.bind.annotation.RestController;
14 18  
15   -import java.util.ArrayList;
  19 +import javax.annotation.Resource;
16 20 import java.util.List;
17   -import java.util.Random;
18 21  
19 22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
20 23  
... ... @@ -24,51 +27,29 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
24 27 @Validated
25 28 public class AppDeliverPickUpStoreController {
26 29  
27   - // TODO 待实现[门店自提]:如果 latitude、longitude 非空,计算经纬度,并排序。计算的库,可以使用 hutool 的 DistanceUtil 计算。
  30 + @Resource
  31 + private DeliveryPickUpStoreService deliveryPickUpStoreService;
  32 +
28 33 @GetMapping("/list")
29 34 @Operation(summary = "获得自提门店列表")
  35 + @Parameters({
  36 + @Parameter(name = "latitude", description = "精度", example = "110"),
  37 + @Parameter(name = "longitude", description = "纬度", example = "120")
  38 + })
30 39 public CommonResult<List<AppDeliveryPickUpStoreRespVO>> getDeliveryPickUpStoreList(
31 40 @RequestParam(value = "latitude", required = false) Double latitude,
32 41 @RequestParam(value = "longitude", required = false) Double longitude) {
33   - List<AppDeliveryPickUpStoreRespVO> list = new ArrayList<>();
34   - Random random = new Random();
35   - for (int i = 0; i < 10; i++) {
36   - AppDeliveryPickUpStoreRespVO store = new AppDeliveryPickUpStoreRespVO();
37   - store.setId(random.nextLong());
38   - store.setName(RandomUtil.randomString(10));
39   - store.setLogo("https://www.iocoder.cn/" + (i + 1) + ".png");
40   - store.setPhone("15601691300");
41   - store.setAreaId(random.nextInt(100000));
42   - store.setAreaName("上海-" + RandomUtil.randomString(10));
43   - store.setDetailAddress("普陀区-" + RandomUtil.randomString(10));
44   - store.setLatitude(random.nextDouble() * 10);
45   - store.setLongitude(random.nextDouble() * 10);
46   - store.setDistance(random.nextInt(1000));
47   -
48   - list.add(store);
49   - }
50   -
51   - return success(list);
  42 + List<DeliveryPickUpStoreDO> list = deliveryPickUpStoreService.getDeliveryPickUpStoreListByStatus(
  43 + CommonStatusEnum.ENABLE.getStatus());
  44 + return success(DeliveryPickUpStoreConvert.INSTANCE.convertList(list, latitude, longitude));
52 45 }
53 46  
54   - // TODO 待实现[门店自提]:
55 47 @GetMapping("/get")
56 48 @Operation(summary = "获得自提门店")
57 49 @Parameter(name = "id", description = "门店编号")
58 50 public CommonResult<AppDeliveryPickUpStoreRespVO> getOrder(@RequestParam("id") Long id) {
59   - AppDeliveryPickUpStoreRespVO store = new AppDeliveryPickUpStoreRespVO();
60   - Random random = new Random();
61   - store.setId(random.nextLong());
62   - store.setName(RandomUtil.randomString(10));
63   - store.setLogo("https://www.iocoder.cn/" + (1) + ".png");
64   - store.setPhone("15601691300");
65   - store.setAreaId(random.nextInt(100000));
66   - store.setAreaName("上海-" + RandomUtil.randomString(10));
67   - store.setDetailAddress("普陀区-" + RandomUtil.randomString(10));
68   - store.setLatitude(random.nextDouble() * 10);
69   - store.setLongitude(random.nextDouble() * 10);
70   - store.setDistance(random.nextInt(1000));
71   - return success(store);
  51 + DeliveryPickUpStoreDO store = deliveryPickUpStoreService.getDeliveryPickUpStore(id);
  52 + return success(DeliveryPickUpStoreConvert.INSTANCE.convert03(store));
72 53 }
73 54  
74 55 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/vo/pickup/AppDeliveryPickUpStoreRespVO.java
... ... @@ -34,7 +34,7 @@ public class AppDeliveryPickUpStoreRespVO {
34 34 @Schema(description = "经度", requiredMode = Schema.RequiredMode.REQUIRED, example = "6.99")
35 35 private Double longitude;
36 36  
37   - @Schema(description = "距离,单位:米", example = "100") // 只有在用户传递了经纬度时,才进行计算
38   - private Integer distance;
  37 + @Schema(description = "距离,单位:千米", example = "100") // 只有在用户传递了经纬度时,才进行计算
  38 + private Double distance;
39 39  
40 40 }
... ...
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 4 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
5 5 import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO;
6 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 10 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
11 11 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
12 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 17 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
18 18 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
19 19 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
... ... @@ -26,9 +26,9 @@ import java.util.List;
26 26 import java.util.Map;
27 27  
28 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 33 @Mappings({
34 34 @Mapping(target = "id", ignore = true),
... ... @@ -37,7 +37,7 @@ public interface TradeAfterSaleConvert {
37 37 @Mapping(target = "creator", ignore = true),
38 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 42 @Mappings({
43 43 @Mapping(source = "afterSale.orderId", target = "merchantOrderId"),
... ... @@ -45,16 +45,16 @@ public interface TradeAfterSaleConvert {
45 45 @Mapping(source = "afterSale.applyReason", target = "reason"),
46 46 @Mapping(source = "afterSale.refundPrice", target = "price")
47 47 })
48   - PayRefundCreateReqDTO convert(String userIp, TradeAfterSaleDO afterSale,
  48 + PayRefundCreateReqDTO convert(String userIp, AfterSaleDO afterSale,
49 49 TradeOrderProperties orderProperties);
50 50  
51 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 59 voPageResult.getList().forEach(afterSale -> afterSale.setUser(
60 60 convert(memberUsers.get(afterSale.getUserId()))));
... ... @@ -63,27 +63,26 @@ public interface TradeAfterSaleConvert {
63 63  
64 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 74 respVO.setUser(convert(user));
77 75 // 处理订单信息
78 76 respVO.setOrder(convert(order));
  77 + respVO.setOrderItem(convert02(orderItem));
79 78 // 处理售后日志
80 79 respVO.setLogs(convertList1(logs));
81 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/delivery/DeliveryExpressTemplateConvert.java
... ... @@ -42,36 +42,32 @@ public interface DeliveryExpressTemplateConvert {
42 42 List<DeliveryExpressTemplateChargeDO> chargeList,
43 43 List<DeliveryExpressTemplateFreeDO> freeList) {
44 44 DeliveryExpressTemplateDetailRespVO respVO = convert2(bean);
45   - respVO.setTemplateCharge(convertTemplateChargeList(chargeList));
46   - respVO.setTemplateFree(convertTemplateFreeList(freeList));
  45 + respVO.setCharges(convertTemplateChargeList(chargeList));
  46 + respVO.setFrees(convertTemplateFreeList(freeList));
47 47 return respVO;
48 48 }
49 49  
50 50 // ========== Template Charge ==========
51 51  
52   - DeliveryExpressTemplateChargeDO convertTemplateCharge(Long templateId, Integer chargeMode, ExpressTemplateChargeBaseVO vo);
53   -
54   - DeliveryExpressTemplateChargeDO convertTemplateCharge(DeliveryExpressTemplateUpdateReqVO.ExpressTemplateChargeUpdateVO vo);
  52 + DeliveryExpressTemplateChargeDO convertTemplateCharge(Long templateId, Integer chargeMode, DeliveryExpressTemplateChargeBaseVO vo);
55 53  
56 54 DeliveryExpressTemplateRespBO.Charge convertTemplateCharge(DeliveryExpressTemplateChargeDO bean);
57 55  
58   - default List<DeliveryExpressTemplateChargeDO> convertTemplateChargeList(Long templateId, Integer chargeMode, List<ExpressTemplateChargeBaseVO> list) {
  56 + default List<DeliveryExpressTemplateChargeDO> convertTemplateChargeList(Long templateId, Integer chargeMode, List<DeliveryExpressTemplateChargeBaseVO> list) {
59 57 return CollectionUtils.convertList(list, vo -> convertTemplateCharge(templateId, chargeMode, vo));
60 58 }
61 59  
62 60 // ========== Template Free ==========
63 61  
64   - DeliveryExpressTemplateFreeDO convertTemplateFree(Long templateId, ExpressTemplateFreeBaseVO vo);
65   -
66   - DeliveryExpressTemplateFreeDO convertTemplateFree(DeliveryExpressTemplateUpdateReqVO.ExpressTemplateFreeUpdateVO vo);
  62 + DeliveryExpressTemplateFreeDO convertTemplateFree(Long templateId, DeliveryExpressTemplateFreeBaseVO vo);
67 63  
68 64 DeliveryExpressTemplateRespBO.Free convertTemplateFree(DeliveryExpressTemplateFreeDO bean);
69 65  
70   - List<ExpressTemplateChargeBaseVO> convertTemplateChargeList(List<DeliveryExpressTemplateChargeDO> list);
  66 + List<DeliveryExpressTemplateChargeBaseVO> convertTemplateChargeList(List<DeliveryExpressTemplateChargeDO> list);
71 67  
72   - List<ExpressTemplateFreeBaseVO> convertTemplateFreeList(List<DeliveryExpressTemplateFreeDO> list);
  68 + List<DeliveryExpressTemplateFreeBaseVO> convertTemplateFreeList(List<DeliveryExpressTemplateFreeDO> list);
73 69  
74   - default List<DeliveryExpressTemplateFreeDO> convertTemplateFreeList(Long templateId, List<ExpressTemplateFreeBaseVO> list) {
  70 + default List<DeliveryExpressTemplateFreeDO> convertTemplateFreeList(Long templateId, List<DeliveryExpressTemplateFreeBaseVO> list) {
75 71 return CollectionUtils.convertList(list, vo -> convertTemplateFree(templateId, vo));
76 72 }
77 73  
... ... @@ -93,4 +89,5 @@ public interface DeliveryExpressTemplateConvert {
93 89 });
94 90 return result;
95 91 }
  92 +
96 93 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/delivery/DeliveryPickUpStoreConvert.java
1 1 package cn.iocoder.yudao.module.trade.convert.delivery;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  5 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
4 6 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
5 7 import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreCreateReqVO;
6 8 import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreRespVO;
7 9 import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreSimpleRespVO;
8 10 import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreUpdateReqVO;
  11 +import cn.iocoder.yudao.module.trade.controller.app.delivery.vo.pickup.AppDeliveryPickUpStoreRespVO;
9 12 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO;
10 13 import org.mapstruct.Mapper;
11 14 import org.mapstruct.Mapping;
... ... @@ -38,4 +41,18 @@ public interface DeliveryPickUpStoreConvert {
38 41 return AreaUtils.format(areaId);
39 42 }
40 43  
  44 + default List<AppDeliveryPickUpStoreRespVO> convertList(List<DeliveryPickUpStoreDO> list,
  45 + Double latitude, Double longitude) {
  46 + List<AppDeliveryPickUpStoreRespVO> voList = CollectionUtils.convertList(list, store -> {
  47 + AppDeliveryPickUpStoreRespVO storeVO = convert03(store);
  48 + if (latitude != null && longitude != null) {
  49 + storeVO.setDistance(NumberUtils.getDistance(latitude, longitude, storeVO.getLatitude(), storeVO.getLongitude()));
  50 + }
  51 + return storeVO;
  52 + });
  53 + return voList;
  54 + }
  55 + @Mapping(source = "areaId", target = "areaName", qualifiedByName = "convertAreaIdToAreaName")
  56 + AppDeliveryPickUpStoreRespVO convert03(DeliveryPickUpStoreDO bean);
  57 +
41 58 }
... ...
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 10  
11 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 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
5 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 9 import com.baomidou.mybatisplus.annotation.TableField;
10 10 import com.baomidou.mybatisplus.annotation.TableName;
11 11 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
... ... @@ -25,7 +25,7 @@ import java.util.List;
25 25 @Data
26 26 @EqualsAndHashCode(callSuper = true)
27 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 40 /**
41 41 * 退款状态
42 42 *
43   - * 枚举 {@link TradeAfterSaleStatusEnum}
  43 + * 枚举 {@link AfterSaleStatusEnum}
44 44 */
45 45 private Integer status;
46 46 /**
47 47 * 售后方式
48 48 *
49   - * 枚举 {@link TradeAfterSaleWayEnum}
  49 + * 枚举 {@link AfterSaleWayEnum}
50 50 */
51 51 private Integer way;
52 52 /**
53 53 * 售后类型
54 54 *
55   - * 枚举 {@link TradeAfterSaleTypeEnum}
  55 + * 枚举 {@link AfterSaleTypeEnum}
56 56 */
57 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 11 /**
12 12 * 交易售后日志 DO
13 13 *
14   - * // TODO 可优化:参考淘宝或者有赞:1)增加 action 表示什么操作;2)content 记录每个操作的明细
15   - *
16 14 * @author 芋道源码
17 15 */
18 16 @TableName("trade_after_sale_log")
... ... @@ -23,7 +21,7 @@ import lombok.*;
23 21 @Builder
24 22 @NoArgsConstructor
25 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 41 * 枚举 {@link UserTypeEnum}
44 42 */
45 43 private Integer userType;
  44 +
46 45 /**
47 46 * 售后编号
48 47 *
49   - * 关联 {@link TradeAfterSaleDO#getId()}
  48 + * 关联 {@link AfterSaleDO#getId()}
50 49 */
51 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 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/config/TradeConfigDO.java
... ... @@ -59,6 +59,11 @@ public class TradeConfigDO extends BaseDO {
59 59 */
60 60 private Integer deliveryExpressFreePrice;
61 61  
  62 + /**
  63 + * 是否开启自提
  64 + */
  65 + private Boolean deliveryPickUpEnabled;
  66 +
62 67 // ========== 分销相关 ==========
63 68  
64 69 /**
... ...
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 2  
3 3 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
4 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 6 import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO;
7 7 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
8 8 import com.baomidou.mybatisplus.annotation.TableField;
... ... @@ -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 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 1 package cn.iocoder.yudao.module.trade.dal.mysql.aftersale;
2 2  
3 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 5 import org.apache.ibatis.annotations.Mapper;
6 6  
  7 +import java.util.List;
  8 +
7 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 2  
3 3 import cn.hutool.core.date.DatePattern;
4 4 import cn.hutool.core.date.DateUtil;
  5 +import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants;
5 6 import org.springframework.data.redis.core.StringRedisTemplate;
6 7 import org.springframework.stereotype.Repository;
7 8  
8 9 import javax.annotation.Resource;
  10 +import java.time.Duration;
9 11 import java.time.LocalDateTime;
10 12  
11 13 /**
... ... @@ -14,9 +16,11 @@ import java.time.LocalDateTime;
14 16 * @author HUIHUI
15 17 */
16 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 25 @Resource
22 26 private StringRedisTemplate stringRedisTemplate;
... ... @@ -28,8 +32,12 @@ public class TradeOrderNoRedisDAO {
28 32 * @return 序号
29 33 */
30 34 public String generate(String prefix) {
  35 + // 递增序号
31 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 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 4 import org.springframework.context.annotation.Bean;
5 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 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 6 import java.lang.annotation.*;
6 7  
... ... @@ -11,7 +12,7 @@ import java.lang.annotation.*;
11 12 *
12 13 * @author 陈賝
13 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 17 @Target({ElementType.METHOD, ElementType.TYPE})
17 18 @Retention(RetentionPolicy.RUNTIME)
... ... @@ -19,20 +20,8 @@ import java.lang.annotation.*;
19 20 public @interface AfterSaleLog {
20 21  
21 22 /**
22   - * 售后 ID
23   - */
24   - @Deprecated
25   - String id() default "";
26   -
27   - /**
28 23 * 操作类型
29 24 */
30 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 6 import java.util.Map;
7 7  
... ... @@ -13,21 +13,13 @@ import java.util.Map;
13 13 */
14 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 16 public static void setAfterSaleInfo(Long id, Integer beforeStatus, Integer afterStatus) {
25 17 setAfterSaleInfo(id, beforeStatus, afterStatus, null);
26 18 }
27 19  
28 20 public static void setAfterSaleInfo(Long id, Integer beforeStatus, Integer afterStatus,
29 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 1 package cn.iocoder.yudao.module.trade.framework.order.core.annotations;
2 2  
3 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 6 import java.lang.annotation.Documented;
6 7 import java.lang.annotation.Retention;
... ... @@ -15,6 +16,7 @@ import static java.lang.annotation.ElementType.METHOD;
15 16 *
16 17 * @author 陈賝
17 18 * @since 2023/7/6 15:37
  19 + * @see TradeOrderLogAspect
18 20 */
19 21 @Target({METHOD, ANNOTATION_TYPE})
20 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 73 Long userId = getUserId();
74 74 // 1.2 订单信息
75 75 Long orderId = ORDER_ID.get();
76   - if (orderId == null) { // 如果未设置,只有注解,说明不需要记录订单日志
  76 + if (orderId == null) { // 如果未设置,只有注解,说明不需要记录日志
77 77 return;
78 78 }
79 79 Integer beforeStatus = BEFORE_STATUS.get();
... ... @@ -81,7 +81,7 @@ public class TradeOrderLogAspect {
81 81 Map<String, Object> exts = ObjectUtil.defaultIfNull(EXTS.get(), emptyMap());
82 82 String content = StrUtil.format(orderLog.operateType().getContent(), exts);
83 83  
84   - // 2.1 记录日志
  84 + // 2. 记录日志
85 85 TradeOrderLogCreateReqBO createBO = new TradeOrderLogCreateReqBO()
86 86 .setUserId(userId).setUserType(userType)
87 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 7 import java.util.List;
8 8  
... ... @@ -17,11 +17,11 @@ public interface AfterSaleLogService {
17 17 /**
18 18 * 创建售后日志
19 19 *
20   - * @param logDTO 日志记录
  20 + * @param createReqBO 日志记录
21 21 * @author 陈賝
22 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 29 * @param afterSaleId 售后编号
30 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 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 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 13 * 售后订单 Service 接口
14 14 *
15 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 22 * @param pageReqVO 分页查询
23 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 31 * @param pageParam 分页参数
32 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 40 * @param id 售后编号
41 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 48 * @param id 售后编号
49 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 57 * @param createReqVO 创建 Request 信息
58 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 73 * @param userId 管理员用户编号
74 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 81 * @param userId 会员用户编号
82 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 97 * @param userId 管理员用户编号
98 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 119 /**
120 120 * 【会员】获得正在进行中的售后订单数量
121 121 *
122   - * @param userId
  122 + * @param userId 用户编号
123 123 * @return 数量
124 124 */
125 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 2  
3 3 import cn.hutool.core.map.MapUtil;
4 4 import cn.hutool.core.util.ObjectUtil;
5   -import cn.hutool.core.util.RandomUtil;
6 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
7 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 7 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
9 8 import cn.iocoder.yudao.module.pay.api.refund.PayRefundApi;
10 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 17 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
21 18 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
22 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 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 26 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
30 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 30 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
36 31 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
37 32 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
38 33 import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
39 34 import lombok.extern.slf4j.Slf4j;
40   -import org.springframework.scheduling.annotation.Async;
41 35 import org.springframework.stereotype.Service;
42 36 import org.springframework.transaction.annotation.Transactional;
43 37 import org.springframework.transaction.support.TransactionSynchronization;
... ... @@ -46,10 +40,8 @@ import org.springframework.validation.annotation.Validated;
46 40  
47 41 import javax.annotation.Resource;
48 42 import java.time.LocalDateTime;
49   -import java.util.List;
50 43  
51 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 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 52 @Slf4j
61 53 @Service
62 54 @Validated
63   -public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSaleLogService {
  55 +public class AfterSaleServiceImpl implements AfterSaleService {
64 56  
65 57 @Resource
66 58 private TradeOrderUpdateService tradeOrderUpdateService;
... ... @@ -70,9 +62,9 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
70 62 private DeliveryExpressService deliveryExpressService;
71 63  
72 64 @Resource
73   - private TradeAfterSaleMapper tradeAfterSaleMapper;
  65 + private AfterSaleMapper tradeAfterSaleMapper;
74 66 @Resource
75   - private TradeAfterSaleLogMapper tradeAfterSaleLogMapper;
  67 + private TradeNoRedisDAO tradeNoRedisDAO;
76 68  
77 69 @Resource
78 70 private PayRefundApi payRefundApi;
... ... @@ -81,34 +73,34 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
81 73 private TradeOrderProperties tradeOrderProperties;
82 74  
83 75 @Override
84   - public PageResult<TradeAfterSaleDO> getAfterSalePage(TradeAfterSalePageReqVO pageReqVO) {
  76 + public PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO) {
85 77 return tradeAfterSaleMapper.selectPage(pageReqVO);
86 78 }
87 79  
88 80 @Override
89   - public PageResult<TradeAfterSaleDO> getAfterSalePage(Long userId, PageParam pageParam) {
  81 + public PageResult<AfterSaleDO> getAfterSalePage(Long userId, PageParam pageParam) {
90 82 return tradeAfterSaleMapper.selectPage(userId, pageParam);
91 83 }
92 84  
93 85 @Override
94   - public TradeAfterSaleDO getAfterSale(Long userId, Long id) {
  86 + public AfterSaleDO getAfterSale(Long userId, Long id) {
95 87 return tradeAfterSaleMapper.selectByIdAndUserId(id, userId);
96 88 }
97 89  
98 90 @Override
99   - public TradeAfterSaleDO getAfterSale(Long id) {
  91 + public AfterSaleDO getAfterSale(Long id) {
100 92 return tradeAfterSaleMapper.selectById(id);
101 93 }
102 94  
103 95 @Override
104 96 @Transactional(rollbackFor = Exception.class)
105 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 100 TradeOrderItemDO tradeOrderItem = validateOrderItemApplicable(userId, createReqVO);
109 101  
110 102 // 第二步,存储售后订单
111   - TradeAfterSaleDO afterSale = createAfterSale(createReqVO, tradeOrderItem);
  103 + AfterSaleDO afterSale = createAfterSale(createReqVO, tradeOrderItem);
112 104 return afterSale.getId();
113 105 }
114 106  
... ... @@ -119,7 +111,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
119 111 * @param createReqVO 售后创建信息
120 112 * @return 交易订单项
121 113 */
122   - private TradeOrderItemDO validateOrderItemApplicable(Long userId, AppTradeAfterSaleCreateReqVO createReqVO) {
  114 + private TradeOrderItemDO validateOrderItemApplicable(Long userId, AppAfterSaleCreateReqVO createReqVO) {
123 115 // 校验订单项存在
124 116 TradeOrderItemDO orderItem = tradeOrderQueryService.getOrderItem(userId, createReqVO.getOrderItemId());
125 117 if (orderItem == null) {
... ... @@ -149,24 +141,24 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
149 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 145 && !TradeOrderStatusEnum.haveDelivered(order.getStatus())) {
154 146 throw exception(AFTER_SALE_CREATE_FAIL_ORDER_STATUS_NO_DELIVERED);
155 147 }
156 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 158 TradeOrderDO order = tradeOrderQueryService.getOrder(orderItem.getUserId(), orderItem.getOrderId());
167 159 afterSale.setOrderNo(order.getNo()); // 记录 orderNo 订单流水,方便后续检索
168 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 162 tradeAfterSaleMapper.insert(afterSale);
171 163  
172 164 // 更新交易订单项的售后状态
... ... @@ -174,7 +166,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
174 166  
175 167 // 记录售后日志
176 168 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), null,
177   - TradeAfterSaleStatusEnum.APPLY.getStatus());
  169 + AfterSaleStatusEnum.APPLY.getStatus());
178 170  
179 171 // TODO 发送售后消息
180 172 return afterSale;
... ... @@ -185,14 +177,14 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
185 177 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_APPLY)
186 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 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 188 .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now()));
197 189  
198 190 // 记录售后日志
... ... @@ -204,13 +196,13 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
204 196 @Override
205 197 @Transactional(rollbackFor = Exception.class)
206 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 206 .setStatus(newStatus).setAuditUserId(userId).setAuditTime(LocalDateTime.now())
215 207 .setAuditReason(auditReqVO.getAuditReason()));
216 208  
... ... @@ -229,18 +221,18 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
229 221 * @param id 售后编号
230 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 226 if (afterSale == null) {
235 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 230 throw exception(AFTER_SALE_AUDIT_FAIL_STATUS_NOT_APPLY);
239 231 }
240 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 236 int updateCount = tradeAfterSaleMapper.updateByIdAndStatus(id, status, updateObj);
245 237 if (updateCount == 0) {
246 238 throw exception(AFTER_SALE_UPDATE_STATUS_FAIL);
... ... @@ -250,26 +242,26 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
250 242 @Override
251 243 @Transactional(rollbackFor = Exception.class)
252 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 248 if (afterSale == null) {
257 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 252 throw exception(AFTER_SALE_DELIVERY_FAIL_STATUS_NOT_SELLER_AGREE);
261 253 }
262 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 259 .setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo())
268 260 .setDeliveryTime(LocalDateTime.now()));
269 261  
270 262 // 记录售后日志
271 263 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
272   - TradeAfterSaleStatusEnum.BUYER_DELIVERY.getStatus(),
  264 + AfterSaleStatusEnum.BUYER_DELIVERY.getStatus(),
273 265 MapUtil.<String, Object>builder().put("expressName", express.getName())
274 266 .put("logisticsNo", deliveryReqVO.getLogisticsNo()).build());
275 267  
... ... @@ -281,15 +273,15 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
281 273 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_AGREE_RECEIVE)
282 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 283 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
292   - TradeAfterSaleStatusEnum.WAIT_REFUND.getStatus());
  284 + AfterSaleStatusEnum.WAIT_REFUND.getStatus());
293 285  
294 286 // TODO 发送售后消息
295 287 }
... ... @@ -297,24 +289,24 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
297 289 @Override
298 290 @Transactional(rollbackFor = Exception.class)
299 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 295 if (afterSale == null) {
304 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 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 305 .setReceiveReason(refuseReqVO.getRefuseMemo()));
314 306  
315 307 // 记录售后日志
316 308 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
317   - TradeAfterSaleStatusEnum.SELLER_REFUSE.getStatus(),
  309 + AfterSaleStatusEnum.SELLER_REFUSE.getStatus(),
318 310 MapUtil.of("reason", refuseReqVO.getRefuseMemo()));
319 311  
320 312 // TODO 发送售后消息
... ... @@ -329,12 +321,12 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
329 321 * @param id 售后编号
330 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 326 if (afterSale == null) {
335 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 330 throw exception(AFTER_SALE_CONFIRM_FAIL_STATUS_NOT_BUYER_DELIVERY);
339 331 }
340 332 return afterSale;
... ... @@ -345,11 +337,11 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
345 337 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.ADMIN_REFUND)
346 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 341 if (afterSale == null) {
350 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 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 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 356 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
365   - TradeAfterSaleStatusEnum.COMPLETE.getStatus());
  357 + AfterSaleStatusEnum.COMPLETE.getStatus());
366 358  
367 359 // TODO 发送售后消息
368 360  
... ... @@ -370,16 +362,16 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
370 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 366 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
375 367  
376 368 @Override
377 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 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 381 @AfterSaleLog(operateType = AfterSaleOperateTypeEnum.MEMBER_CANCEL)
390 382 public void cancelAfterSale(Long userId, Long id) {
391 383 // 校验售后单的状态,并状态待退款
392   - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
  384 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
393 385 if (afterSale == null) {
394 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 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 399 AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
408   - TradeAfterSaleStatusEnum.BUYER_CANCEL.getStatus());
  400 + AfterSaleStatusEnum.BUYER_CANCEL.getStatus());
409 401  
410 402 // TODO 发送售后消息
411 403  
... ... @@ -415,52 +407,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
415 407  
416 408 @Override
417 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 3 import lombok.AllArgsConstructor;
4 4 import lombok.Data;
5 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 13 * @author 陈賝
11 14 * @since 2023/6/19 09:54
... ... @@ -13,42 +16,42 @@ import lombok.NoArgsConstructor;
13 16 @Data
14 17 @NoArgsConstructor
15 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 25 private Long userId;
29 26 /**
30 27 * 用户类型
31 28 */
  29 + @NotNull(message = "用户类型不能为空")
32 30 private Integer userType;
  31 +
33 32 /**
34 33 * 售后编号
35 34 */
  35 + @NotNull(message = "售后编号不能为空")
36 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/delivery/DeliveryExpressTemplateServiceImpl.java
... ... @@ -2,11 +2,10 @@ package cn.iocoder.yudao.module.trade.service.delivery;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.lang.Assert;
  5 +import cn.hutool.core.util.ObjectUtil;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateCreateReqVO;
7   -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateDetailRespVO;
8   -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplatePageReqVO;
9   -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateUpdateReqVO;
  7 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  8 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.*;
10 9 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateChargeDO;
11 10 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO;
12 11 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateFreeDO;
... ... @@ -50,21 +49,21 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
50 49 validateTemplateNameUnique(createReqVO.getName(), null);
51 50  
52 51 // 插入
53   - DeliveryExpressTemplateDO deliveryExpressTemplate = INSTANCE.convert(createReqVO);
54   - expressTemplateMapper.insert(deliveryExpressTemplate);
  52 + DeliveryExpressTemplateDO template = INSTANCE.convert(createReqVO);
  53 + expressTemplateMapper.insert(template);
55 54 // 插入运费模板计费表
56   - if (CollUtil.isNotEmpty(createReqVO.getTemplateCharge())) {
  55 + if (CollUtil.isNotEmpty(createReqVO.getCharges())) {
57 56 expressTemplateChargeMapper.insertBatch(
58   - INSTANCE.convertTemplateChargeList(deliveryExpressTemplate.getId(), createReqVO.getChargeMode(), createReqVO.getTemplateCharge())
  57 + INSTANCE.convertTemplateChargeList(template.getId(), createReqVO.getChargeMode(), createReqVO.getCharges())
59 58 );
60 59 }
61 60 // 插入运费模板包邮表
62   - if (CollUtil.isNotEmpty(createReqVO.getTemplateFree())) {
  61 + if (CollUtil.isNotEmpty(createReqVO.getFrees())) {
63 62 expressTemplateFreeMapper.insertBatch(
64   - INSTANCE.convertTemplateFreeList(deliveryExpressTemplate.getId(), createReqVO.getTemplateFree())
  63 + INSTANCE.convertTemplateFreeList(template.getId(), createReqVO.getFrees())
65 64 );
66 65 }
67   - return deliveryExpressTemplate.getId();
  66 + return template.getId();
68 67 }
69 68  
70 69 @Override
... ... @@ -76,76 +75,54 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
76 75 validateTemplateNameUnique(updateReqVO.getName(), updateReqVO.getId());
77 76  
78 77 // 更新运费从表
79   - updateExpressTemplateCharge(updateReqVO);
  78 + updateExpressTemplateCharge(updateReqVO.getId(), updateReqVO.getChargeMode(), updateReqVO.getCharges());
80 79 // 更新包邮从表
81   - updateExpressTemplateFree(updateReqVO);
  80 + updateExpressTemplateFree(updateReqVO.getId(), updateReqVO.getFrees());
82 81 // 更新模板主表
83 82 DeliveryExpressTemplateDO updateObj = INSTANCE.convert(updateReqVO);
84 83 expressTemplateMapper.updateById(updateObj);
85 84 }
86 85  
87   - private void updateExpressTemplateFree(DeliveryExpressTemplateUpdateReqVO updateReqVO) {
88   - // 1.1 获得新增/修改的区域列表
89   - List<DeliveryExpressTemplateFreeDO> oldFreeList = expressTemplateFreeMapper.selectListByTemplateId(updateReqVO.getId());
90   - List<DeliveryExpressTemplateUpdateReqVO.ExpressTemplateFreeUpdateVO> newFreeList = updateReqVO.getTemplateFree();
91   - List<DeliveryExpressTemplateFreeDO> addFreeList = new ArrayList<>(newFreeList.size()); // 新增包邮区域列表
92   - List<DeliveryExpressTemplateFreeDO> updateFreeList = new ArrayList<>(newFreeList.size()); // 更新包邮区域列表
93   - for (DeliveryExpressTemplateUpdateReqVO.ExpressTemplateFreeUpdateVO item : newFreeList) {
94   - if (Objects.nonNull(item.getId())) {
95   - updateFreeList.add(INSTANCE.convertTemplateFree(item));
96   - } else {
97   - item.setTemplateId(updateReqVO.getId());
98   - addFreeList.add(INSTANCE.convertTemplateFree(item));
99   - }
100   - }
101   - // 1.2 新增
102   - if (CollUtil.isNotEmpty(addFreeList)) {
103   - expressTemplateFreeMapper.insertBatch(addFreeList);
  86 + private void updateExpressTemplateFree(Long templateId, List<DeliveryExpressTemplateFreeBaseVO> frees) {
  87 + // 第一步,对比新老数据,获得添加、修改、删除的列表
  88 + List<DeliveryExpressTemplateFreeDO> oldList = expressTemplateFreeMapper.selectListByTemplateId(templateId);
  89 + List<DeliveryExpressTemplateFreeDO> newList = INSTANCE.convertTemplateFreeList(templateId, frees);
  90 + List<List<DeliveryExpressTemplateFreeDO>> diffList = CollectionUtils.diffList(oldList, newList,
  91 + (oldVal, newVal) -> ObjectUtil.equal(oldVal.getId(), newVal.getTemplateId()));
  92 +
  93 + // 第二步,批量添加、修改、删除
  94 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  95 + expressTemplateFreeMapper.insertBatch(diffList.get(0));
104 96 }
105   - // 1.3 修改
106   - if (CollUtil.isNotEmpty(updateFreeList)) {
107   - expressTemplateFreeMapper.updateBatch(updateFreeList);
  97 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  98 + expressTemplateFreeMapper.updateBatch(diffList.get(1));
108 99 }
109   -
110   - // 2. 删除
111   - Set<Long> deleteFreeIds = convertSet(oldFreeList, DeliveryExpressTemplateFreeDO::getId);
112   - deleteFreeIds.removeAll(convertSet(updateFreeList, DeliveryExpressTemplateFreeDO::getId));
113   - if (CollUtil.isNotEmpty(deleteFreeIds)) {
114   - expressTemplateFreeMapper.deleteBatchIds(deleteFreeIds);
  100 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  101 + expressTemplateFreeMapper.deleteBatchIds(convertList(diffList.get(2), DeliveryExpressTemplateFreeDO::getId));
115 102 }
116 103 }
117 104  
118   - private void updateExpressTemplateCharge(DeliveryExpressTemplateUpdateReqVO updateReqVO) {
119   - // 1.1 获得新增/修改的区域列表
120   - List<DeliveryExpressTemplateChargeDO> oldChargeList = expressTemplateChargeMapper.selectListByTemplateId(updateReqVO.getId());
121   - List<DeliveryExpressTemplateUpdateReqVO.ExpressTemplateChargeUpdateVO> newChargeList = updateReqVO.getTemplateCharge();
122   - List<DeliveryExpressTemplateChargeDO> addList = new ArrayList<>(newChargeList.size()); // 新增运费区域列表
123   - List<DeliveryExpressTemplateChargeDO> updateList = new ArrayList<>(newChargeList.size()); // 更新运费区域列表
124   - for (DeliveryExpressTemplateUpdateReqVO.ExpressTemplateChargeUpdateVO item : newChargeList) {
125   - if (item.getId() != null) {
126   - // 计费模式以主表为准
127   - item.setChargeMode(updateReqVO.getChargeMode());
128   - updateList.add(INSTANCE.convertTemplateCharge(item));
129   - } else {
130   - item.setTemplateId(updateReqVO.getId());
131   - item.setChargeMode(updateReqVO.getChargeMode());
132   - addList.add(INSTANCE.convertTemplateCharge(item));
  105 + private void updateExpressTemplateCharge(Long templateId, Integer chargeMode, List<DeliveryExpressTemplateChargeBaseVO> charges) {
  106 + // 第一步,对比新老数据,获得添加、修改、删除的列表
  107 + List<DeliveryExpressTemplateChargeDO> oldList = expressTemplateChargeMapper.selectListByTemplateId(templateId);
  108 + List<DeliveryExpressTemplateChargeDO> newList = INSTANCE.convertTemplateChargeList(templateId, chargeMode, charges);
  109 + List<List<DeliveryExpressTemplateChargeDO>> diffList = diffList(oldList, newList, (oldVal, newVal) -> {
  110 + boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId());
  111 + if (same) {
  112 + newVal.setChargeMode(chargeMode); // 更新下收费模式
133 113 }
  114 + return same;
  115 + });
  116 +
  117 + // 第二步,批量添加、修改、删除
  118 + if (CollUtil.isNotEmpty(diffList.get(0))) {
  119 + expressTemplateChargeMapper.insertBatch(diffList.get(0));
134 120 }
135   - // 1.2 新增
136   - if (CollUtil.isNotEmpty(addList)) {
137   - expressTemplateChargeMapper.insertBatch(addList);
  121 + if (CollUtil.isNotEmpty(diffList.get(1))) {
  122 + expressTemplateChargeMapper.updateBatch(diffList.get(1));
138 123 }
139   - // 1.3 修改
140   - if (CollUtil.isNotEmpty(updateList)) {
141   - expressTemplateChargeMapper.updateBatch(updateList);
142   - }
143   -
144   - // 2. 删除
145   - Set<Long> deleteChargeIds = convertSet(oldChargeList, DeliveryExpressTemplateChargeDO::getId);
146   - deleteChargeIds.removeAll(convertSet(updateList, DeliveryExpressTemplateChargeDO::getId));
147   - if (CollUtil.isNotEmpty(deleteChargeIds)) {
148   - expressTemplateChargeMapper.deleteBatchIds(deleteChargeIds);
  124 + if (CollUtil.isNotEmpty(diffList.get(2))) {
  125 + expressTemplateChargeMapper.deleteBatchIds(convertList(diffList.get(2), DeliveryExpressTemplateChargeDO::getId));
149 126 }
150 127 }
151 128  
... ... @@ -238,14 +215,4 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
238 215 return INSTANCE.convertMap(areaId, templateList, chargeList, freeList);
239 216 }
240 217  
241   - private DeliveryExpressTemplateRespBO.Charge findMatchExpressTemplateCharge(
242   - List<DeliveryExpressTemplateChargeDO> templateChargeList, Integer areaId) {
243   - return INSTANCE.convertTemplateCharge(findFirst(templateChargeList, item -> item.getAreaIds().contains(areaId)));
244   - }
245   -
246   - private DeliveryExpressTemplateRespBO.Free findMatchExpressTemplateFree(
247   - List<DeliveryExpressTemplateFreeDO> templateFreeList, Integer areaId) {
248   - return INSTANCE.convertTemplateFree(findFirst(templateFreeList, item -> item.getAreaIds().contains(areaId)));
249   - }
250   -
251 218 }
... ...
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 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 119 */
120 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 156 }
157 157  
158 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 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 47 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
48 48 import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
49 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 51 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
52 52 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
53 53 import cn.iocoder.yudao.module.trade.enums.order.*;
... ... @@ -97,7 +97,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
97 97 @Resource
98 98 private TradeOrderItemMapper tradeOrderItemMapper;
99 99 @Resource
100   - private TradeOrderNoRedisDAO orderNoRedisDAO;
  100 + private TradeNoRedisDAO tradeNoRedisDAO;
101 101  
102 102 @Resource
103 103 private List<TradeOrderHandler> tradeOrderHandlers;
... ... @@ -215,7 +215,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
215 215 TradePriceCalculateRespBO calculateRespBO) {
216 216 TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO);
217 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 219 order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus());
220 220 order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
221 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 28 /**
29 29 * 订单编号
30 30 */
31   - @NotNull(message = "订单编号")
  31 + @NotNull(message = "订单编号不能为空")
32 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 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
6 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 11 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
12 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 18 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
19 19 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
20 20 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
... ... @@ -37,20 +37,20 @@ import static org.mockito.ArgumentMatchers.eq;
37 37 import static org.mockito.Mockito.when;
38 38  
39 39 /**
40   - * {@link TradeAfterSaleService} 的单元测试
  40 + * {@link AfterSaleService} 的单元测试
41 41 *
42 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 47 @Resource
48   - private TradeAfterSaleServiceImpl tradeAfterSaleService;
  48 + private AfterSaleServiceImpl tradeAfterSaleService;
49 49  
50 50 @Resource
51   - private TradeAfterSaleMapper tradeAfterSaleMapper;
  51 + private AfterSaleMapper tradeAfterSaleMapper;
52 52 @Resource
53   - private TradeAfterSaleLogMapper tradeAfterSaleLogMapper;
  53 + private AfterSaleLogMapper tradeAfterSaleLogMapper;
54 54  
55 55 @MockBean
56 56 private TradeOrderUpdateService tradeOrderUpdateService;
... ... @@ -67,8 +67,8 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
67 67 public void testCreateAfterSale() {
68 68 // 准备参数
69 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 72 .setApplyReason("退钱").setApplyDescription("快退")
73 73 .setApplyPicUrls(asList("https://www.baidu.com/1.png", "https://www.baidu.com/2.png"));
74 74 // mock 方法(交易订单项)
... ... @@ -86,10 +86,10 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
86 86 // 调用
87 87 Long afterSaleId = tradeAfterSaleService.createAfterSale(userId, createReqVO);
88 88 // 断言(TradeAfterSaleDO)
89   - TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(afterSaleId);
  89 + AfterSaleDO afterSale = tradeAfterSaleMapper.selectById(afterSaleId);
90 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 93 assertPojoEquals(afterSale, createReqVO);
94 94 assertEquals(afterSale.getUserId(), 1024L);
95 95 assertPojoEquals(afterSale, orderItem, "id", "creator", "createTime", "updater", "updateTime");
... ... @@ -101,22 +101,22 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
101 101 assertNull(afterSale.getDeliveryTime());
102 102 assertNull(afterSale.getReceiveReason());
103 103 // 断言(TradeAfterSaleLogDO)
104   - TradeAfterSaleLogDO afterSaleLog = tradeAfterSaleLogMapper.selectList().get(0);
  104 + AfterSaleLogDO afterSaleLog = tradeAfterSaleLogMapper.selectList().get(0);
105 105 assertEquals(afterSaleLog.getUserId(), userId);
106 106 assertEquals(afterSaleLog.getUserType(), UserTypeEnum.MEMBER.getValue());
107 107 assertEquals(afterSaleLog.getAfterSaleId(), afterSaleId);
108 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 112 @Test
113 113 public void testGetAfterSalePage() {
114 114 // mock 数据
115   - TradeAfterSaleDO dbAfterSale = randomPojo(TradeAfterSaleDO.class, o -> { // 等会查询到
  115 + AfterSaleDO dbAfterSale = randomPojo(AfterSaleDO.class, o -> { // 等会查询到
116 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 120 o.setOrderNo("202211190847450020500011");
121 121 o.setSpuName("芋艿");
122 122 o.setCreateTime(buildTime(2022, 1, 15));
... ... @@ -125,11 +125,11 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
125 125 // 测试 no 不匹配
126 126 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setNo("202211190847450020500066")));
127 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 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 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 133 // 测试 orderNo 不匹配
134 134 tradeAfterSaleMapper.insert(cloneIgnoreId(dbAfterSale, o -> o.setOrderNo("202211190847450020500022")));
135 135 // 测试 spuName 不匹配
... ... @@ -137,17 +137,17 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
137 137 // 测试 createTime 不匹配
138 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 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 145 reqVO.setOrderNo("20221119084745002050001");
146 146 reqVO.setSpuName("芋");
147 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 152 assertEquals(1, pageResult.getTotal());
153 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 22 * KEY 格式:pay_no:{prefix}
23 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 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 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 13 * 支付序号的 Redis DAO
... ... @@ -23,8 +27,12 @@ public class PayNoRedisDAO {
23 27 * @return 序号
24 28 */
25 29 public String generate(String prefix) {
  30 + // 递增序号
26 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 36 return noPrefix + no;
29 37 }
30 38  
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/ip/AreaController.java
... ... @@ -6,17 +6,17 @@ import cn.iocoder.yudao.framework.ip.core.Area;
6 6 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
7 7 import cn.iocoder.yudao.framework.ip.core.utils.IPUtils;
8 8 import cn.iocoder.yudao.module.system.controller.admin.ip.vo.AreaNodeRespVO;
9   -import cn.iocoder.yudao.module.system.controller.admin.ip.vo.AreaNodeSimpleRespVO;
10 9 import cn.iocoder.yudao.module.system.convert.ip.AreaConvert;
11 10 import io.swagger.v3.oas.annotations.Operation;
12 11 import io.swagger.v3.oas.annotations.Parameter;
13 12 import io.swagger.v3.oas.annotations.tags.Tag;
14 13 import org.springframework.validation.annotation.Validated;
15   -import org.springframework.web.bind.annotation.*;
  14 +import org.springframework.web.bind.annotation.GetMapping;
  15 +import org.springframework.web.bind.annotation.RequestMapping;
  16 +import org.springframework.web.bind.annotation.RequestParam;
  17 +import org.springframework.web.bind.annotation.RestController;
16 18  
17   -import java.util.ArrayList;
18 19 import java.util.List;
19   -import java.util.Set;
20 20  
21 21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
22 22  
... ... @@ -34,28 +34,6 @@ public class AreaController {
34 34 return success(AreaConvert.INSTANCE.convertList(area.getChildren()));
35 35 }
36 36  
37   - @GetMapping("/get-children")
38   - @Operation(summary = "获得地区的下级区域")
39   - @Parameter(name = "id", description = "区域编号", required = true, example = "150000")
40   - public CommonResult<List<AreaNodeSimpleRespVO>> getChildren(@RequestParam("id") Integer id) {
41   - Area area = AreaUtils.getArea(id);
42   - Assert.notNull(area, String.format("获取不到 id : %d 的区域", id));
43   - return success(AreaConvert.INSTANCE.convertList2(area.getChildren()));
44   - }
45   -
46   - // 4)方法改成 getAreaChildrenList 获得子节点们;5)url 可以已改成 children-list
47   - //@芋艿 是不是叫 getAreaListByIds 更合适。 因为不一定是子节点。 用于前端树选择获取缓存数据。 见 <el-tree-select :cache-data="areaCache">
48   - @GetMapping("/get-by-ids")
49   - @Operation(summary = "通过区域 ids 获得地区列表")
50   - @Parameter(name = "ids", description = "区域编号 ids", required = true, example = "1,150000")
51   - public CommonResult<List<AreaNodeSimpleRespVO>> getAreaListByIds(@RequestParam("ids") Set<Integer> ids) {
52   - List<Area> areaList = new ArrayList<>(ids.size());
53   - for (Integer areaId : ids) {
54   - areaList.add(AreaUtils.getArea(areaId));
55   - }
56   - return success(AreaConvert.INSTANCE.convertList2(areaList));
57   - }
58   -
59 37 @GetMapping("/get-by-ip")
60 38 @Operation(summary = "获得 IP 对应的地区名")
61 39 @Parameter(name = "ip", description = "IP", required = true)
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/ip/vo/AreaNodeSimpleRespVO.java deleted
1   -package cn.iocoder.yudao.module.system.controller.admin.ip.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -@Schema(description = "管理后台 - 简洁的地区节点 Response VO")
7   -@Data
8   -public class AreaNodeSimpleRespVO {
9   -
10   - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110000")
11   - private Integer id;
12   -
13   - @Schema(description = "名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "北京")
14   - private String name;
15   -
16   - @Schema(description = "是否叶子节点", example = "false")
17   - private Boolean leaf;
18   -
19   -}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/ip/AreaConvert.java
1 1 package cn.iocoder.yudao.module.system.convert.ip;
2 2  
3 3 import cn.iocoder.yudao.framework.ip.core.Area;
4   -import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum;
5 4 import cn.iocoder.yudao.module.system.controller.admin.ip.vo.AreaNodeRespVO;
6   -import cn.iocoder.yudao.module.system.controller.admin.ip.vo.AreaNodeSimpleRespVO;
7 5 import cn.iocoder.yudao.module.system.controller.app.ip.vo.AppAreaNodeRespVO;
8 6 import org.mapstruct.Mapper;
9   -import org.mapstruct.Mapping;
10 7 import org.mapstruct.factory.Mappers;
11 8  
12 9 import java.util.List;
13   -import java.util.Objects;
14 10  
15 11 @Mapper
16 12 public interface AreaConvert {
... ... @@ -19,15 +15,6 @@ public interface AreaConvert {
19 15  
20 16 List<AreaNodeRespVO> convertList(List<Area> list);
21 17  
22   - List<AreaNodeSimpleRespVO> convertList2(List<Area> list);
23   -
24   - @Mapping(source = "type", target = "leaf")
25   - AreaNodeSimpleRespVO convert(Area area);
26   -
27   - default Boolean convertAreaType(Integer type) {
28   - return Objects.equals(AreaTypeEnum.DISTRICT.getType(), type);
29   - }
30   -
31 18 List<AppAreaNodeRespVO> convertList3(List<Area> list);
32 19  
33 20 }
... ...
yudao-server/src/main/resources/application-dev.yaml
... ... @@ -170,6 +170,7 @@ yudao:
170 170 order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
171 171 refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
172 172 demo: true # 开启演示模式
  173 + tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
173 174  
174 175 justauth:
175 176 enabled: true
... ...
yudao-server/src/main/resources/application-local.yaml
... ... @@ -213,6 +213,7 @@ yudao:
213 213 error-code: # 错误码相关配置项
214 214 enable: false
215 215 demo: false # 关闭演示模式
  216 + tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
216 217 clean-job:
217 218 access-retain-day: 7
218 219 error-retain-day: 8
... ...