Commit dfffc935849e4c9cd99bb43039f899cbfbfc19bc

Authored by YunaiV
1 parent 31b8ee42

reactor:移除 mall-trade 的 api 包

Showing 345 changed files with 3845 additions and 3841 deletions
yudao-module-mall/pom.xml
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 <modules> 20 <modules>
21 <module>yudao-module-product</module> 21 <module>yudao-module-product</module>
22 <module>yudao-module-promotion</module> 22 <module>yudao-module-promotion</module>
23 - <module>yudao-module-trade-biz</module> 23 + <module>yudao-module-trade</module>
24 <module>yudao-module-statistics</module> 24 <module>yudao-module-statistics</module>
25 <!-- 25 <!--
26 特殊:为什么会有 yudao-module-trade-api 呢? 26 特殊:为什么会有 yudao-module-trade-api 呢?
yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/api/package-info.java 0 → 100644
  1 +/**
  2 + * promotion API 包,定义并实现提供给其它模块的 API
  3 + */
  4 +package cn.iocoder.yudao.module.promotion.api;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/package-info.java deleted
1 -/**  
2 - * 属于 trade 模块的 framework 封装  
3 - *  
4 - * @author 芋道源码  
5 - */  
6 -package cn.iocoder.yudao.module.trade.framework;  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/web/package-info.java deleted
1 -/**  
2 - * trade 模块的 web 配置  
3 - */  
4 -package cn.iocoder.yudao.module.trade.framework.web;  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleLogServiceImpl.java deleted
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 jakarta.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/AfterSaleService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.aftersale;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleDisagreeReqVO;  
5 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSalePageReqVO;  
6 -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleRefuseReqVO;  
7 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;  
8 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO;  
9 -import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSalePageReqVO;  
10 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;  
11 -  
12 -/**  
13 - * 售后订单 Service 接口  
14 - *  
15 - * @author 芋道源码  
16 - */  
17 -public interface AfterSaleService {  
18 -  
19 - /**  
20 - * 【管理员】获得售后订单分页  
21 - *  
22 - * @param pageReqVO 分页查询  
23 - * @return 售后订单分页  
24 - */  
25 - PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO);  
26 -  
27 - /**  
28 - * 【会员】获得售后订单分页  
29 - *  
30 - * @param userId 用户编号  
31 - * @param pageReqVO 分页参数  
32 - * @return 售后订单分页  
33 - */  
34 - PageResult<AfterSaleDO> getAfterSalePage(Long userId, AppAfterSalePageReqVO pageReqVO);  
35 -  
36 - /**  
37 - * 【会员】获得售后单  
38 - *  
39 - * @param userId 用户编号  
40 - * @param id 售后编号  
41 - * @return 售后订单  
42 - */  
43 - AfterSaleDO getAfterSale(Long userId, Long id);  
44 -  
45 - /**  
46 - * 【管理员】获得售后单  
47 - *  
48 - * @param id 售后编号  
49 - * @return 售后订单  
50 - */  
51 - AfterSaleDO getAfterSale(Long id);  
52 -  
53 - /**  
54 - * 【会员】创建售后订单  
55 - *  
56 - * @param userId 会员用户编号  
57 - * @param createReqVO 创建 Request 信息  
58 - * @return 售后编号  
59 - */  
60 - Long createAfterSale(Long userId, AppAfterSaleCreateReqVO createReqVO);  
61 -  
62 - /**  
63 - * 【管理员】同意售后订单  
64 - *  
65 - * @param userId 管理员用户编号  
66 - * @param id 售后编号  
67 - */  
68 - void agreeAfterSale(Long userId, Long id);  
69 -  
70 - /**  
71 - * 【管理员】拒绝售后订单  
72 - *  
73 - * @param userId 管理员用户编号  
74 - * @param auditReqVO 审批 Request 信息  
75 - */  
76 - void disagreeAfterSale(Long userId, AfterSaleDisagreeReqVO auditReqVO);  
77 -  
78 - /**  
79 - * 【会员】退回货物  
80 - *  
81 - * @param userId 会员用户编号  
82 - * @param deliveryReqVO 退货 Request 信息  
83 - */  
84 - void deliveryAfterSale(Long userId, AppAfterSaleDeliveryReqVO deliveryReqVO);  
85 -  
86 - /**  
87 - * 【管理员】确认收货  
88 - *  
89 - * @param userId 管理员编号  
90 - * @param id 售后编号  
91 - */  
92 - void receiveAfterSale(Long userId, Long id);  
93 -  
94 - /**  
95 - * 【管理员】拒绝收货  
96 - *  
97 - * @param userId 管理员用户编号  
98 - * @param refuseReqVO 拒绝收货 Request 信息  
99 - */  
100 - void refuseAfterSale(Long userId, AfterSaleRefuseReqVO refuseReqVO);  
101 -  
102 - /**  
103 - * 【管理员】确认退款  
104 - *  
105 - * @param userId 管理员用户编号  
106 - * @param userIp 管理员用户 IP  
107 - * @param id 售后编号  
108 - */  
109 - void refundAfterSale(Long userId, String userIp, Long id);  
110 -  
111 - /**  
112 - * 更新售后订单为已退款  
113 - *  
114 - * @param id 售后编号  
115 - * @param orderId 订单编号  
116 - * @param payRefundId 支付退款编号  
117 - */  
118 - void updateAfterSaleRefunded(Long id, Long orderId, Long payRefundId);  
119 -  
120 - /**  
121 - * 【会员】取消售后  
122 - *  
123 - * @param userId 会员用户编号  
124 - * @param id 售后编号  
125 - */  
126 - void cancelAfterSale(Long userId, Long id);  
127 -  
128 - /**  
129 - * 【会员】获得正在进行中的售后订单数量  
130 - *  
131 - * @param userId 用户编号  
132 - * @return 数量  
133 - */  
134 - Long getApplyingAfterSaleCount(Long userId);  
135 -  
136 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/bo/AfterSaleLogCreateReqBO.java deleted
1 -package cn.iocoder.yudao.module.trade.service.aftersale.bo;  
2 -  
3 -import lombok.AllArgsConstructor;  
4 -import lombok.Data;  
5 -import lombok.NoArgsConstructor;  
6 -  
7 -import jakarta.validation.constraints.NotEmpty;  
8 -import jakarta.validation.constraints.NotNull;  
9 -  
10 -/**  
11 - * 售后日志的创建 Request BO  
12 - *  
13 - * @author 陈賝  
14 - * @since 2023/6/19 09:54  
15 - */  
16 -@Data  
17 -@NoArgsConstructor  
18 -@AllArgsConstructor  
19 -public class AfterSaleLogCreateReqBO {  
20 -  
21 - /**  
22 - * 用户编号  
23 - */  
24 - @NotNull(message = "用户编号不能为空")  
25 - private Long userId;  
26 - /**  
27 - * 用户类型  
28 - */  
29 - @NotNull(message = "用户类型不能为空")  
30 - private Integer userType;  
31 -  
32 - /**  
33 - * 售后编号  
34 - */  
35 - @NotNull(message = "售后编号不能为空")  
36 - private Long afterSaleId;  
37 - /**  
38 - * 操作前状态  
39 - */  
40 - private Integer beforeStatus;  
41 - /**  
42 - * 操作后状态  
43 - */  
44 - @NotNull(message = "操作后的状态不能为空")  
45 - private Integer afterStatus;  
46 -  
47 - /**  
48 - * 操作类型  
49 - */  
50 - @NotNull(message = "操作类型不能为空")  
51 - private Integer operateType;  
52 - /**  
53 - * 操作明细  
54 - */  
55 - @NotEmpty(message = "操作明细不能为空")  
56 - private String content;  
57 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.brokerage;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserCreateReqVO;  
5 -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;  
6 -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO;  
7 -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;  
8 -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;  
9 -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;  
10 -import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;  
11 -import jakarta.validation.Valid;  
12 -import jakarta.validation.constraints.NotNull;  
13 -  
14 -/**  
15 - * 分销用户 Service 接口  
16 - *  
17 - * @author owen  
18 - */  
19 -public interface BrokerageUserService {  
20 -  
21 - /**  
22 - * 获得分销用户  
23 - *  
24 - * @param id 编号  
25 - * @return 分销用户  
26 - */  
27 - BrokerageUserDO getBrokerageUser(Long id);  
28 -  
29 - /**  
30 - * 获得分销用户分页  
31 - *  
32 - * @param pageReqVO 分页查询  
33 - * @return 分销用户分页  
34 - */  
35 - PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO);  
36 -  
37 - /**  
38 - * 修改推广员编号  
39 - *  
40 - * @param id 用户编号  
41 - * @param bindUserId 推广员编号  
42 - */  
43 - void updateBrokerageUserId(Long id, Long bindUserId);  
44 -  
45 - /**  
46 - * 修改推广资格  
47 - *  
48 - * @param id 用户编号  
49 - * @param enabled 推广资格  
50 - */  
51 - void updateBrokerageUserEnabled(Long id, Boolean enabled);  
52 -  
53 - /**  
54 - * 获得用户的推广人  
55 - *  
56 - * @param id 用户编号  
57 - * @return 用户的推广人  
58 - */  
59 - BrokerageUserDO getBindBrokerageUser(Long id);  
60 -  
61 - /**  
62 - * 获得或创建分销用户  
63 - *  
64 - * @param id 用户编号  
65 - * @return 分销用户  
66 - */  
67 - BrokerageUserDO getOrCreateBrokerageUser(Long id);  
68 -  
69 - /**  
70 - * 更新用户佣金  
71 - *  
72 - * @param id 用户编号  
73 - * @param price 用户可用佣金  
74 - * @return 更新结果  
75 - */  
76 - boolean updateUserPrice(Long id, Integer price);  
77 -  
78 - /**  
79 - * 更新用户冻结佣金  
80 - *  
81 - * @param id 用户编号  
82 - * @param frozenPrice 用户冻结佣金  
83 - */  
84 - void updateUserFrozenPrice(Long id, Integer frozenPrice);  
85 -  
86 - /**  
87 - * 更新用户冻结佣金(减少),更新用户佣金(增加)  
88 - *  
89 - * @param id 用户编号  
90 - * @param frozenPrice 减少冻结佣金(负数)  
91 - */  
92 - void updateFrozenPriceDecrAndPriceIncr(Long id, Integer frozenPrice);  
93 -  
94 - /**  
95 - * 获得推广用户数量  
96 - *  
97 - * @param bindUserId 绑定的推广员编号  
98 - * @param level 推广用户等级  
99 - * @return 推广用户数量  
100 - */  
101 - Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level);  
102 -  
103 - /**  
104 - * 【会员】绑定推广员  
105 - *  
106 - * @param userId 用户编号  
107 - * @param bindUserId 推广员编号  
108 - * @return 是否绑定  
109 - */  
110 - boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId);  
111 -  
112 - /**  
113 - * 【管理员】创建分销用户  
114 - *  
115 - * @param createReqVO 请求  
116 - * @return 编号  
117 - */  
118 - Long createBrokerageUser(@Valid BrokerageUserCreateReqVO createReqVO);  
119 -  
120 - /**  
121 - * 获取用户是否有分销资格  
122 - *  
123 - * @param userId 用户编号  
124 - * @return 是否有分销资格  
125 - */  
126 - Boolean getUserBrokerageEnabled(Long userId);  
127 -  
128 - /**  
129 - * 获得推广人排行  
130 - *  
131 - * @param pageReqVO 分页查询  
132 - * @return 推广人排行  
133 - */  
134 - PageResult<AppBrokerageUserRankByUserCountRespVO> getBrokerageUserRankPageByUserCount(AppBrokerageUserRankPageReqVO pageReqVO);  
135 -  
136 - /**  
137 - * 获得下级分销统计分页  
138 - *  
139 - * @param pageReqVO 分页查询  
140 - * @param userId 用户编号  
141 - * @return 下级分销统计分页  
142 - */  
143 - PageResult<AppBrokerageUserChildSummaryRespVO> getBrokerageUserChildSummaryPage(AppBrokerageUserChildSummaryPageReqVO pageReqVO, Long userId);  
144 -  
145 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.brokerage;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO;  
5 -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO;  
6 -import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO;  
7 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;  
8 -import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageWithdrawSummaryRespBO;  
9 -  
10 -import java.util.Collection;  
11 -import java.util.List;  
12 -import java.util.Map;  
13 -import java.util.Set;  
14 -  
15 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
16 -  
17 -/**  
18 - * 佣金提现 Service 接口  
19 - *  
20 - * @author 芋道源码  
21 - */  
22 -public interface BrokerageWithdrawService {  
23 -  
24 - /**  
25 - * 【管理员】审核佣金提现  
26 - *  
27 - * @param id 佣金编号  
28 - * @param status 审核状态  
29 - * @param auditReason 驳回原因  
30 - * @param userIp 操作 IP  
31 - */  
32 - void auditBrokerageWithdraw(Long id, BrokerageWithdrawStatusEnum status, String auditReason, String userIp);  
33 -  
34 - /**  
35 - * 获得佣金提现  
36 - *  
37 - * @param id 编号  
38 - * @return 佣金提现  
39 - */  
40 - BrokerageWithdrawDO getBrokerageWithdraw(Long id);  
41 -  
42 - /**  
43 - * 获得佣金提现分页  
44 - *  
45 - * @param pageReqVO 分页查询  
46 - * @return 佣金提现分页  
47 - */  
48 - PageResult<BrokerageWithdrawDO> getBrokerageWithdrawPage(BrokerageWithdrawPageReqVO pageReqVO);  
49 -  
50 - /**  
51 - * 【会员】创建佣金提现  
52 - *  
53 - * @param userId 会员用户编号  
54 - * @param createReqVO 创建信息  
55 - * @return 佣金提现编号  
56 - */  
57 - Long createBrokerageWithdraw(Long userId, AppBrokerageWithdrawCreateReqVO createReqVO);  
58 -  
59 - /**  
60 - * 【API】更新佣金提现的转账结果  
61 - *  
62 - * 目前用于支付回调,标记提现转账结果  
63 - *  
64 - * @param id 提现编号  
65 - * @param payTransferId 转账订单编号  
66 - */  
67 - void updateBrokerageWithdrawTransferred(Long id, Long payTransferId);  
68 -  
69 - /**  
70 - * 按照 userId,汇总每个用户的提现  
71 - *  
72 - * @param userIds 用户编号  
73 - * @param status 提现状态  
74 - * @return 用户提现汇总 List  
75 - */  
76 - List<BrokerageWithdrawSummaryRespBO> getWithdrawSummaryListByUserId(Collection<Long> userIds,  
77 - Collection<BrokerageWithdrawStatusEnum> status);  
78 -  
79 - /**  
80 - * 按照 userId,汇总每个用户的提现  
81 - *  
82 - * @param userIds 用户编号  
83 - * @param status 提现状态  
84 - * @return 用户提现汇总 Map  
85 - */  
86 - default Map<Long, BrokerageWithdrawSummaryRespBO> getWithdrawSummaryMapByUserId(Set<Long> userIds,  
87 - Collection<BrokerageWithdrawStatusEnum> status) {  
88 - return convertMap(getWithdrawSummaryListByUserId(userIds, status), BrokerageWithdrawSummaryRespBO::getUserId);  
89 - }  
90 -  
91 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/bo/BrokerageAddReqBO.java deleted
1 -package cn.iocoder.yudao.module.trade.service.brokerage.bo;  
2 -  
3 -import lombok.AllArgsConstructor;  
4 -import lombok.Data;  
5 -import lombok.NoArgsConstructor;  
6 -  
7 -import jakarta.validation.constraints.NotBlank;  
8 -import jakarta.validation.constraints.NotEmpty;  
9 -import jakarta.validation.constraints.NotNull;  
10 -  
11 -/**  
12 - * 佣金 增加 Request BO  
13 - *  
14 - * @author owen  
15 - */  
16 -@Data  
17 -@NoArgsConstructor  
18 -@AllArgsConstructor  
19 -public class BrokerageAddReqBO {  
20 -  
21 - /**  
22 - * 业务编号  
23 - */  
24 - @NotBlank(message = "业务编号不能为空")  
25 - private String bizId;  
26 - /**  
27 - * 佣金基数  
28 - */  
29 - @NotNull(message = "佣金基数不能为空")  
30 - private Integer basePrice;  
31 - /**  
32 - * 一级佣金(固定)  
33 - */  
34 - @NotNull(message = "一级佣金(固定)不能为空")  
35 - private Integer firstFixedPrice;  
36 - /**  
37 - * 二级佣金(固定)  
38 - */  
39 - private Integer secondFixedPrice;  
40 -  
41 - /**  
42 - * 来源用户编号  
43 - */  
44 - @NotNull(message = "来源用户编号不能为空")  
45 - private Long sourceUserId;  
46 -  
47 - /**  
48 - * 佣金记录标题  
49 - */  
50 - @NotEmpty(message = "佣金记录标题不能为空")  
51 - private String title;  
52 -  
53 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/cart/CartService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.cart;  
2 -  
3 -import cn.iocoder.yudao.module.trade.controller.app.cart.vo.*;  
4 -import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO;  
5 -  
6 -import jakarta.validation.Valid;  
7 -import java.util.Collection;  
8 -import java.util.List;  
9 -import java.util.Set;  
10 -  
11 -/**  
12 - * 购物车 Service 接口  
13 - *  
14 - * @author 芋道源码  
15 - */  
16 -public interface CartService {  
17 -  
18 - /**  
19 - * 添加商品到购物车  
20 - *  
21 - * @param userId 用户编号  
22 - * @param addReqVO 添加信息  
23 - * @return 购物项的编号  
24 - */  
25 - Long addCart(Long userId, @Valid AppCartAddReqVO addReqVO);  
26 -  
27 - /**  
28 - * 更新购物车商品数量  
29 - *  
30 - * @param userId 用户编号  
31 - * @param updateCountReqVO 更新信息  
32 - */  
33 - void updateCartCount(Long userId, AppCartUpdateCountReqVO updateCountReqVO);  
34 -  
35 - /**  
36 - * 更新购物车选中状态  
37 - *  
38 - * @param userId 用户编号  
39 - * @param updateSelectedReqVO 更新信息  
40 - */  
41 - void updateCartSelected(Long userId, @Valid AppCartUpdateSelectedReqVO updateSelectedReqVO);  
42 -  
43 - /**  
44 - * 重置购物车商品  
45 - *  
46 - * 使用场景:在一个购物车项对应的商品失效(例如说 SPU 被下架),可以重新选择对应的 SKU  
47 - *  
48 - * @param userId 用户编号  
49 - * @param updateReqVO 重置信息  
50 - */  
51 - void resetCart(Long userId, AppCartResetReqVO updateReqVO);  
52 -  
53 - /**  
54 - * 删除购物车商品  
55 - *  
56 - * @param userId 用户编号  
57 - * @param ids 购物项的编号  
58 - */  
59 - void deleteCart(Long userId, Collection<Long> ids);  
60 -  
61 - /**  
62 - * 查询用户在购物车中的商品数量  
63 - *  
64 - * @param userId 用户编号  
65 - * @return 商品数量  
66 - */  
67 - Integer getCartCount(Long userId);  
68 -  
69 - /**  
70 - * 查询用户的购物车列表  
71 - *  
72 - * @param userId 用户编号  
73 - * @return 购物车列表  
74 - */  
75 - AppCartListRespVO getCartList(Long userId);  
76 -  
77 - /**  
78 - * 查询用户的购物车列表  
79 - *  
80 - * @param userId 用户编号  
81 - * @param ids 购物项的编号  
82 - * @return 购物车列表  
83 - */  
84 - List<CartDO> getCartList(Long userId, Set<Long> ids);  
85 -  
86 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/config/TradeConfigService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.config;  
2 -  
3 -import cn.iocoder.yudao.module.trade.controller.admin.config.vo.TradeConfigSaveReqVO;  
4 -import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;  
5 -  
6 -import jakarta.validation.Valid;  
7 -  
8 -/**  
9 - * 交易中心配置 Service 接口  
10 - *  
11 - * @author owen  
12 - */  
13 -public interface TradeConfigService {  
14 -  
15 - /**  
16 - * 更新交易中心配置  
17 - *  
18 - * @param updateReqVO 更新信息  
19 - */  
20 - void saveTradeConfig(@Valid TradeConfigSaveReqVO updateReqVO);  
21 -  
22 - /**  
23 - * 获得交易中心配置  
24 - *  
25 - * @return 交易中心配置  
26 - */  
27 - TradeConfigDO getTradeConfig();  
28 -  
29 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/config/TradeConfigServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.trade.service.config;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;  
4 -import cn.iocoder.yudao.module.trade.controller.admin.config.vo.TradeConfigSaveReqVO;  
5 -import cn.iocoder.yudao.module.trade.convert.config.TradeConfigConvert;  
6 -import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;  
7 -import cn.iocoder.yudao.module.trade.dal.mysql.config.TradeConfigMapper;  
8 -import org.springframework.stereotype.Service;  
9 -import org.springframework.validation.annotation.Validated;  
10 -  
11 -import jakarta.annotation.Resource;  
12 -import java.util.List;  
13 -  
14 -/**  
15 - * 交易中心配置 Service 实现类  
16 - *  
17 - * @author owen  
18 - */  
19 -@Service  
20 -@Validated  
21 -public class TradeConfigServiceImpl implements TradeConfigService {  
22 -  
23 - @Resource  
24 - private TradeConfigMapper tradeConfigMapper;  
25 -  
26 - @Override  
27 - public void saveTradeConfig(TradeConfigSaveReqVO saveReqVO) {  
28 - // 存在,则进行更新  
29 - TradeConfigDO dbConfig = getTradeConfig();  
30 - if (dbConfig != null) {  
31 - tradeConfigMapper.updateById(TradeConfigConvert.INSTANCE.convert(saveReqVO).setId(dbConfig.getId()));  
32 - return;  
33 - }  
34 - // 不存在,则进行插入  
35 - tradeConfigMapper.insert(TradeConfigConvert.INSTANCE.convert(saveReqVO));  
36 - }  
37 -  
38 - @Override  
39 - public TradeConfigDO getTradeConfig() {  
40 - List<TradeConfigDO> list = tradeConfigMapper.selectList();  
41 - return CollectionUtils.getFirst(list);  
42 - }  
43 -  
44 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.delivery;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressCreateReqVO;  
5 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressExportReqVO;  
6 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressPageReqVO;  
7 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressUpdateReqVO;  
8 -import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;  
9 -  
10 -import jakarta.validation.Valid;  
11 -import java.util.List;  
12 -  
13 -/**  
14 - * 快递公司 Service 接口  
15 - *  
16 - * @author jason  
17 - */  
18 -public interface DeliveryExpressService {  
19 -  
20 - /**  
21 - * 创建快递公司  
22 - *  
23 - * @param createReqVO 创建信息  
24 - * @return 编号  
25 - */  
26 - Long createDeliveryExpress(@Valid DeliveryExpressCreateReqVO createReqVO);  
27 -  
28 - /**  
29 - * 更新快递公司  
30 - *  
31 - * @param updateReqVO 更新信息  
32 - */  
33 - void updateDeliveryExpress(@Valid DeliveryExpressUpdateReqVO updateReqVO);  
34 -  
35 - /**  
36 - * 删除快递公司  
37 - *  
38 - * @param id 编号  
39 - */  
40 - void deleteDeliveryExpress(Long id);  
41 -  
42 - /**  
43 - * 获得快递公司  
44 - *  
45 - * @param id 编号  
46 - * @return 快递公司  
47 - */  
48 - DeliveryExpressDO getDeliveryExpress(Long id);  
49 -  
50 - /**  
51 - * 校验快递公司是否合法  
52 - *  
53 - * @param id 编号  
54 - * @return 快递公司  
55 - */  
56 - DeliveryExpressDO validateDeliveryExpress(Long id);  
57 -  
58 - /**  
59 - * 获得快递公司分页  
60 - *  
61 - * @param pageReqVO 分页查询  
62 - * @return 快递公司分页  
63 - */  
64 - PageResult<DeliveryExpressDO> getDeliveryExpressPage(DeliveryExpressPageReqVO pageReqVO);  
65 -  
66 - /**  
67 - * 获得快递公司列表, 用于 Excel 导出  
68 - *  
69 - * @param exportReqVO 查询条件  
70 - * @return 快递公司列表  
71 - */  
72 - List<DeliveryExpressDO> getDeliveryExpressList(DeliveryExpressExportReqVO exportReqVO);  
73 -  
74 - /**  
75 - * 获取指定状态的快递公司列表  
76 - *  
77 - * @param status 状态  
78 - * @return 快递公司列表  
79 - */  
80 - List<DeliveryExpressDO> getDeliveryExpressListByStatus(Integer status);  
81 -  
82 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.trade.service.delivery;  
2 -  
3 -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressCreateReqVO;  
6 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressExportReqVO;  
7 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressPageReqVO;  
8 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressUpdateReqVO;  
9 -import cn.iocoder.yudao.module.trade.convert.delivery.DeliveryExpressConvert;  
10 -import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;  
11 -import cn.iocoder.yudao.module.trade.dal.mysql.delivery.DeliveryExpressMapper;  
12 -import org.springframework.stereotype.Service;  
13 -import org.springframework.validation.annotation.Validated;  
14 -  
15 -import jakarta.annotation.Resource;  
16 -import java.util.List;  
17 -  
18 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
19 -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;  
20 -  
21 -/**  
22 - * 快递公司 Service 实现类  
23 - *  
24 - * @author jason  
25 - */  
26 -@Service  
27 -@Validated  
28 -public class DeliveryExpressServiceImpl implements DeliveryExpressService {  
29 -  
30 - @Resource  
31 - private DeliveryExpressMapper deliveryExpressMapper;  
32 -  
33 - @Override  
34 - public Long createDeliveryExpress(DeliveryExpressCreateReqVO createReqVO) {  
35 - //校验编码是否唯一  
36 - validateExpressCodeUnique(createReqVO.getCode(), null);  
37 - // 插入  
38 - DeliveryExpressDO deliveryExpress = DeliveryExpressConvert.INSTANCE.convert(createReqVO);  
39 - deliveryExpressMapper.insert(deliveryExpress);  
40 - // 返回  
41 - return deliveryExpress.getId();  
42 - }  
43 -  
44 - @Override  
45 - public void updateDeliveryExpress(DeliveryExpressUpdateReqVO updateReqVO) {  
46 - // 校验存在  
47 - validateDeliveryExpressExists(updateReqVO.getId());  
48 - //校验编码是否唯一  
49 - validateExpressCodeUnique(updateReqVO.getCode(), updateReqVO.getId());  
50 - // 更新  
51 - DeliveryExpressDO updateObj = DeliveryExpressConvert.INSTANCE.convert(updateReqVO);  
52 - deliveryExpressMapper.updateById(updateObj);  
53 - }  
54 -  
55 - @Override  
56 - public void deleteDeliveryExpress(Long id) {  
57 - // 校验存在  
58 - validateDeliveryExpressExists(id);  
59 - // 删除  
60 - deliveryExpressMapper.deleteById(id);  
61 - }  
62 -  
63 - private void validateExpressCodeUnique(String code, Long id) {  
64 - DeliveryExpressDO express = deliveryExpressMapper.selectByCode(code);  
65 - if (express == null) {  
66 - return;  
67 - }  
68 - // 如果 id 为空,说明不用比较是否为相同 id 的快递公司  
69 - if (id == null) {  
70 - throw exception(EXPRESS_CODE_DUPLICATE);  
71 - }  
72 - if (!express.getId().equals(id)) {  
73 - throw exception(EXPRESS_CODE_DUPLICATE);  
74 - }  
75 - }  
76 - private void validateDeliveryExpressExists(Long id) {  
77 - if (deliveryExpressMapper.selectById(id) == null) {  
78 - throw exception(EXPRESS_NOT_EXISTS);  
79 - }  
80 - }  
81 -  
82 - @Override  
83 - public DeliveryExpressDO getDeliveryExpress(Long id) {  
84 - return deliveryExpressMapper.selectById(id);  
85 - }  
86 -  
87 - @Override  
88 - public DeliveryExpressDO validateDeliveryExpress(Long id) {  
89 - DeliveryExpressDO deliveryExpress = deliveryExpressMapper.selectById(id);  
90 - if (deliveryExpress == null) {  
91 - throw exception(EXPRESS_NOT_EXISTS);  
92 - }  
93 - if (deliveryExpress.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) {  
94 - throw exception(EXPRESS_STATUS_NOT_ENABLE);  
95 - }  
96 - return deliveryExpress;  
97 - }  
98 -  
99 - @Override  
100 - public PageResult<DeliveryExpressDO> getDeliveryExpressPage(DeliveryExpressPageReqVO pageReqVO) {  
101 - return deliveryExpressMapper.selectPage(pageReqVO);  
102 - }  
103 -  
104 - @Override  
105 - public List<DeliveryExpressDO> getDeliveryExpressList(DeliveryExpressExportReqVO exportReqVO) {  
106 - return deliveryExpressMapper.selectList(exportReqVO);  
107 - }  
108 -  
109 - @Override  
110 - public List<DeliveryExpressDO> getDeliveryExpressListByStatus(Integer status) {  
111 - return deliveryExpressMapper.selectListByStatus(status);  
112 - }  
113 -  
114 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressTemplateService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.delivery;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateCreateReqVO;  
5 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateDetailRespVO;  
6 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplatePageReqVO;  
7 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateUpdateReqVO;  
8 -import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO;  
9 -import cn.iocoder.yudao.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO;  
10 -  
11 -import jakarta.validation.Valid;  
12 -import java.util.Collection;  
13 -import java.util.List;  
14 -import java.util.Map;  
15 -  
16 -/**  
17 - * 快递运费模板 Service 接口  
18 - *  
19 - * @author jason  
20 - */  
21 -public interface DeliveryExpressTemplateService {  
22 -  
23 - /**  
24 - * 创建快递运费模板  
25 - *  
26 - * @param createReqVO 创建信息  
27 - * @return 编号  
28 - */  
29 - Long createDeliveryExpressTemplate(@Valid DeliveryExpressTemplateCreateReqVO createReqVO);  
30 -  
31 - /**  
32 - * 更新快递运费模板  
33 - *  
34 - * @param updateReqVO 更新信息  
35 - */  
36 - void updateDeliveryExpressTemplate(@Valid DeliveryExpressTemplateUpdateReqVO updateReqVO);  
37 -  
38 - /**  
39 - * 删除快递运费模板  
40 - *  
41 - * @param id 编号  
42 - */  
43 - void deleteDeliveryExpressTemplate(Long id);  
44 -  
45 - /**  
46 - * 获得快递运费模板  
47 - *  
48 - * @param id 编号  
49 - * @return 快递运费模板详情  
50 - */  
51 - DeliveryExpressTemplateDetailRespVO getDeliveryExpressTemplate(Long id);  
52 -  
53 - /**  
54 - * 获得快递运费模板列表  
55 - *  
56 - * @param ids 编号  
57 - * @return 快递运费模板列表  
58 - */  
59 - List<DeliveryExpressTemplateDO> getDeliveryExpressTemplateList(Collection<Long> ids);  
60 -  
61 - /**  
62 - * 获得快递运费模板列表  
63 - *  
64 - * @return 快递运费模板列表  
65 - */  
66 - List<DeliveryExpressTemplateDO> getDeliveryExpressTemplateList();  
67 -  
68 - /**  
69 - * 获得快递运费模板分页  
70 - *  
71 - * @param pageReqVO 分页查询  
72 - * @return 快递运费模板分页  
73 - */  
74 - PageResult<DeliveryExpressTemplateDO> getDeliveryExpressTemplatePage(DeliveryExpressTemplatePageReqVO pageReqVO);  
75 -  
76 - /**  
77 - * 校验快递运费模板  
78 - *  
79 - * 如果校验不通过,抛出 {@link cn.iocoder.yudao.framework.common.exception.ServiceException} 异常  
80 - *  
81 - * @param templateId 模板编号  
82 - * @return 快递运费模板  
83 - */  
84 - DeliveryExpressTemplateDO validateDeliveryExpressTemplate(Long templateId);  
85 -  
86 - /**  
87 - * 基于运费模板编号数组和收件人地址区域编号,获取匹配运费模板  
88 - *  
89 - * @param ids 编号列表  
90 - * @param areaId 区域编号  
91 - * @return Map (templateId -> 运费模板设置)  
92 - */  
93 - Map<Long, DeliveryExpressTemplateRespBO> getExpressTemplateMapByIdsAndArea(Collection<Long> ids, Integer areaId);  
94 -  
95 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryPickUpStoreService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.delivery;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.*;  
5 -import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO;  
6 -  
7 -import jakarta.validation.Valid;  
8 -import java.util.Collection;  
9 -import java.util.List;  
10 -  
11 -/**  
12 - * 自提门店 Service 接口  
13 - *  
14 - * @author jason  
15 - */  
16 -public interface DeliveryPickUpStoreService {  
17 -  
18 - /**  
19 - * 创建自提门店  
20 - *  
21 - * @param createReqVO 创建信息  
22 - * @return 编号  
23 - */  
24 - Long createDeliveryPickUpStore(@Valid DeliveryPickUpStoreCreateReqVO createReqVO);  
25 -  
26 - /**  
27 - * 更新自提门店  
28 - *  
29 - * @param updateReqVO 更新信息  
30 - */  
31 - void updateDeliveryPickUpStore(@Valid DeliveryPickUpStoreUpdateReqVO updateReqVO);  
32 -  
33 - /**  
34 - * 删除自提门店  
35 - *  
36 - * @param id 编号  
37 - */  
38 - void deleteDeliveryPickUpStore(Long id);  
39 -  
40 - /**  
41 - * 获得自提门店  
42 - *  
43 - * @param id 编号  
44 - * @return 自提门店  
45 - */  
46 - DeliveryPickUpStoreDO getDeliveryPickUpStore(Long id);  
47 -  
48 - /**  
49 - * 获得自提门店列表  
50 - *  
51 - * @param ids 编号  
52 - * @return 自提门店列表  
53 - */  
54 - List<DeliveryPickUpStoreDO> getDeliveryPickUpStoreList(Collection<Long> ids);  
55 -  
56 - /**  
57 - * 获得指定状态的自提门店列表  
58 - *  
59 - * @param status 状态  
60 - * @return 自提门店列表  
61 - */  
62 - List<DeliveryPickUpStoreDO> getDeliveryPickUpStoreListByStatus(Integer status);  
63 -  
64 - /**  
65 - * 获得自提门店分页  
66 - *  
67 - * @param pageReqVO 分页查询  
68 - * @return 自提门店分页  
69 - */  
70 - PageResult<DeliveryPickUpStoreDO> getDeliveryPickUpStorePage(DeliveryPickUpStorePageReqVO pageReqVO);  
71 -  
72 - /**  
73 - * 绑定自提店员  
74 - *  
75 - * @param bindReqVO 绑定数据  
76 - */  
77 - void bindDeliveryPickUpStore(DeliveryPickUpBindReqVO bindReqVO);  
78 -  
79 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryPickUpStoreServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.trade.service.delivery;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.framework.common.util.object.BeanUtils;  
5 -import cn.iocoder.yudao.module.system.api.user.AdminUserApi;  
6 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpBindReqVO;  
7 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreCreateReqVO;  
8 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStorePageReqVO;  
9 -import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreUpdateReqVO;  
10 -import cn.iocoder.yudao.module.trade.convert.delivery.DeliveryPickUpStoreConvert;  
11 -import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO;  
12 -import cn.iocoder.yudao.module.trade.dal.mysql.delivery.DeliveryPickUpStoreMapper;  
13 -import jakarta.annotation.Resource;  
14 -import org.springframework.stereotype.Service;  
15 -import org.springframework.validation.annotation.Validated;  
16 -  
17 -import java.util.Collection;  
18 -import java.util.List;  
19 -  
20 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
21 -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PICK_UP_STORE_NOT_EXISTS;  
22 -  
23 -/**  
24 - * 自提门店 Service 实现类  
25 - *  
26 - * @author jason  
27 - */  
28 -@Service  
29 -@Validated  
30 -public class DeliveryPickUpStoreServiceImpl implements DeliveryPickUpStoreService {  
31 -  
32 - @Resource  
33 - private DeliveryPickUpStoreMapper deliveryPickUpStoreMapper;  
34 -  
35 - @Resource  
36 - private AdminUserApi adminUserApi;  
37 -  
38 - @Override  
39 - public Long createDeliveryPickUpStore(DeliveryPickUpStoreCreateReqVO createReqVO) {  
40 - // 插入  
41 - DeliveryPickUpStoreDO deliveryPickUpStore = DeliveryPickUpStoreConvert.INSTANCE.convert(createReqVO);  
42 - deliveryPickUpStoreMapper.insert(deliveryPickUpStore);  
43 - // 返回  
44 - return deliveryPickUpStore.getId();  
45 - }  
46 -  
47 - @Override  
48 - public void updateDeliveryPickUpStore(DeliveryPickUpStoreUpdateReqVO updateReqVO) {  
49 - // 校验存在  
50 - validateDeliveryPickUpStoreExists(updateReqVO.getId());  
51 - // 更新  
52 - DeliveryPickUpStoreDO updateObj = DeliveryPickUpStoreConvert.INSTANCE.convert(updateReqVO);  
53 - deliveryPickUpStoreMapper.updateById(updateObj);  
54 - }  
55 -  
56 - @Override  
57 - public void deleteDeliveryPickUpStore(Long id) {  
58 - // 校验存在  
59 - validateDeliveryPickUpStoreExists(id);  
60 - // 删除  
61 - deliveryPickUpStoreMapper.deleteById(id);  
62 - }  
63 -  
64 - private void validateDeliveryPickUpStoreExists(Long id) {  
65 - DeliveryPickUpStoreDO deliveryPickUpStore = deliveryPickUpStoreMapper.selectById(id);  
66 - if (deliveryPickUpStore == null) {  
67 - throw exception(PICK_UP_STORE_NOT_EXISTS);  
68 - }  
69 - }  
70 -  
71 - @Override  
72 - public DeliveryPickUpStoreDO getDeliveryPickUpStore(Long id) {  
73 - return deliveryPickUpStoreMapper.selectById(id);  
74 - }  
75 -  
76 - @Override  
77 - public List<DeliveryPickUpStoreDO> getDeliveryPickUpStoreList(Collection<Long> ids) {  
78 - return deliveryPickUpStoreMapper.selectBatchIds(ids);  
79 - }  
80 -  
81 - @Override  
82 - public List<DeliveryPickUpStoreDO> getDeliveryPickUpStoreListByStatus(Integer status) {  
83 - return deliveryPickUpStoreMapper.selectListByStatus(status);  
84 - }  
85 -  
86 - @Override  
87 - public PageResult<DeliveryPickUpStoreDO> getDeliveryPickUpStorePage(DeliveryPickUpStorePageReqVO pageReqVO) {  
88 - return deliveryPickUpStoreMapper.selectPage(pageReqVO);  
89 - }  
90 -  
91 - @Override  
92 - public void bindDeliveryPickUpStore(DeliveryPickUpBindReqVO bindReqVO) {  
93 - // 1.1 校验门店存在  
94 - validateDeliveryPickUpStoreExists(bindReqVO.getId());  
95 - // 1.2 校验用户存在  
96 - adminUserApi.validateUserList(bindReqVO.getVerifyUserIds());  
97 -  
98 - // 2. 更新  
99 - DeliveryPickUpStoreDO updateObj = BeanUtils.toBean(bindReqVO, DeliveryPickUpStoreDO.class);  
100 - deliveryPickUpStoreMapper.updateById(updateObj);  
101 - }  
102 -  
103 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/bo/DeliveryExpressTemplateRespBO.java deleted
1 -package cn.iocoder.yudao.module.trade.service.delivery.bo;  
2 -  
3 -import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryExpressChargeModeEnum;  
4 -import lombok.Data;  
5 -  
6 -/**  
7 - * 运费模板配置 Resp BO  
8 - *  
9 - * @author jason  
10 - */  
11 -@Data  
12 -public class DeliveryExpressTemplateRespBO {  
13 -  
14 - /**  
15 - * 配送计费方式  
16 - *  
17 - * 枚举 {@link DeliveryExpressChargeModeEnum}  
18 - */  
19 - private Integer chargeMode;  
20 -  
21 - /**  
22 - * 运费模板快递运费设置  
23 - */  
24 - private Charge charge;  
25 -  
26 - /**  
27 - * 运费模板包邮设置  
28 - */  
29 - private Free free;  
30 -  
31 - /**  
32 - * 快递运费模板费用配置 BO  
33 - *  
34 - * @author jason  
35 - */  
36 - @Data  
37 - public static class Charge {  
38 -  
39 - /**  
40 - * 首件数量(件数,重量,或体积)  
41 - */  
42 - private Double startCount;  
43 - /**  
44 - * 起步价,单位:分  
45 - */  
46 - private Integer startPrice;  
47 - /**  
48 - * 续件数量(件, 重量,或体积)  
49 - */  
50 - private Double extraCount;  
51 - /**  
52 - * 额外价,单位:分  
53 - */  
54 - private Integer extraPrice;  
55 - }  
56 -  
57 - /**  
58 - * 快递运费模板包邮配置 BO  
59 - *  
60 - * @author jason  
61 - */  
62 - @Data  
63 - public static class Free {  
64 -  
65 - /**  
66 - * 包邮金额,单位:分  
67 - *  
68 - * 订单总金额 > 包邮金额时,才免运费  
69 - */  
70 - private Integer freePrice;  
71 -  
72 - /**  
73 - * 包邮件数  
74 - *  
75 - * 订单总件数 > 包邮件数时,才免运费  
76 - */  
77 - private Integer freeCount;  
78 - }  
79 -  
80 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/message/TradeMessageServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.trade.service.message;  
2 -  
3 -import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;  
4 -import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;  
5 -import cn.iocoder.yudao.module.trade.enums.MessageTemplateConstants;  
6 -import cn.iocoder.yudao.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO;  
7 -import org.springframework.stereotype.Service;  
8 -import org.springframework.validation.annotation.Validated;  
9 -  
10 -import jakarta.annotation.Resource;  
11 -import java.util.HashMap;  
12 -import java.util.Map;  
13 -  
14 -/**  
15 - * Trade 消息 service 实现类  
16 - *  
17 - * @author HUIHUI  
18 - */  
19 -@Service  
20 -@Validated  
21 -public class TradeMessageServiceImpl implements TradeMessageService {  
22 -  
23 - @Resource  
24 - private NotifyMessageSendApi notifyMessageSendApi;  
25 -  
26 - @Override  
27 - public void sendMessageWhenDeliveryOrder(TradeOrderMessageWhenDeliveryOrderReqBO reqBO) {  
28 - if (true) {  
29 - return;  
30 - }  
31 - // 1、构造消息  
32 - Map<String, Object> msgMap = new HashMap<>(2);  
33 - msgMap.put("orderId", reqBO.getOrderId());  
34 - msgMap.put("deliveryMessage", reqBO.getMessage());  
35 - // TODO 芋艿:看下模版  
36 - // 2、发送站内信  
37 - notifyMessageSendApi.sendSingleMessageToMember(  
38 - new NotifySendSingleToUserReqDTO()  
39 - .setUserId(reqBO.getUserId())  
40 - .setTemplateCode(MessageTemplateConstants.SMS_ORDER_DELIVERY)  
41 - .setTemplateParams(msgMap));  
42 - }  
43 -  
44 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/message/bo/TradeOrderMessageWhenDeliveryOrderReqBO.java deleted
1 -package cn.iocoder.yudao.module.trade.service.message.bo;  
2 -  
3 -import lombok.Data;  
4 -  
5 -import jakarta.validation.constraints.NotEmpty;  
6 -import jakarta.validation.constraints.NotNull;  
7 -  
8 -/**  
9 - * 订单发货时通知创建 Req BO  
10 - *  
11 - * @author HUIHUI  
12 - */  
13 -@Data  
14 -public class TradeOrderMessageWhenDeliveryOrderReqBO {  
15 -  
16 - /**  
17 - * 订单编号  
18 - */  
19 - @NotNull(message = "订单编号不能为空")  
20 - private Long orderId;  
21 - /**  
22 - * 用户编号  
23 - */  
24 - @NotNull(message = "用户编号不能为空")  
25 - private Long userId;  
26 - /**  
27 - * 消息  
28 - */  
29 - @NotEmpty(message = "发送消息不能为空")  
30 - private String message;  
31 -  
32 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderLogService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order;  
2 -  
3 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO;  
4 -import cn.iocoder.yudao.module.trade.service.order.bo.TradeOrderLogCreateReqBO;  
5 -import org.springframework.scheduling.annotation.Async;  
6 -  
7 -import java.util.List;  
8 -  
9 -/**  
10 - * 交易下单日志 Service 接口  
11 - *  
12 - * @author 陈賝  
13 - * @since 2023/7/6 15:44  
14 - */  
15 -public interface TradeOrderLogService {  
16 -  
17 - /**  
18 - * 创建交易下单日志  
19 - *  
20 - * @param logDTO 日志记录  
21 - * @author 陈賝  
22 - * @since 2023/7/6 15:45  
23 - */  
24 - @Async  
25 - void createOrderLog(TradeOrderLogCreateReqBO logDTO);  
26 -  
27 - /**  
28 - * 获得交易订单日志列表  
29 - *  
30 - * @param orderId 订单编号  
31 - * @return 交易订单日志列表  
32 - */  
33 - List<TradeOrderLogDO> getOrderLogListByOrderId(Long orderId);  
34 -  
35 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderLogServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order;  
2 -  
3 -import cn.iocoder.yudao.module.trade.convert.order.TradeOrderLogConvert;  
4 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO;  
5 -import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderLogMapper;  
6 -import cn.iocoder.yudao.module.trade.service.order.bo.TradeOrderLogCreateReqBO;  
7 -import org.springframework.stereotype.Service;  
8 -  
9 -import jakarta.annotation.Resource;  
10 -import java.util.List;  
11 -  
12 -/**  
13 - * 交易下单日志 Service 实现类  
14 - *  
15 - * @author 陈賝  
16 - * @since 2023/7/6 15:44  
17 - */  
18 -@Service  
19 -public class TradeOrderLogServiceImpl implements TradeOrderLogService {  
20 -  
21 - @Resource  
22 - private TradeOrderLogMapper tradeOrderLogMapper;  
23 -  
24 - @Override  
25 - public void createOrderLog(TradeOrderLogCreateReqBO createReqBO) {  
26 - tradeOrderLogMapper.insert(TradeOrderLogConvert.INSTANCE.convert(createReqBO));  
27 - }  
28 -  
29 - @Override  
30 - public List<TradeOrderLogDO> getOrderLogListByOrderId(Long orderId) {  
31 - return tradeOrderLogMapper.selectListByOrderId(orderId);  
32 - }  
33 -  
34 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;  
5 -import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;  
6 -import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;  
7 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
8 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
9 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
10 -import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;  
11 -  
12 -import java.util.Collection;  
13 -import java.util.List;  
14 -  
15 -import static java.util.Collections.singleton;  
16 -  
17 -/**  
18 - * 交易订单【读】 Service 接口  
19 - *  
20 - * @author 芋道源码  
21 - */  
22 -public interface TradeOrderQueryService {  
23 -  
24 - // =================== Order ===================  
25 -  
26 - /**  
27 - * 获得指定编号的交易订单  
28 - *  
29 - * @param id 交易订单编号  
30 - * @return 交易订单  
31 - */  
32 - TradeOrderDO getOrder(Long id);  
33 -  
34 - /**  
35 - * 获得指定用户,指定的交易订单  
36 - *  
37 - * @param userId 用户编号  
38 - * @param id 交易订单编号  
39 - * @return 交易订单  
40 - */  
41 - TradeOrderDO getOrder(Long userId, Long id);  
42 -  
43 - /**  
44 - * 获得指定用户,指定活动,指定状态的交易订单  
45 - *  
46 - * @param userId 用户编号  
47 - * @param combinationActivityId 活动编号  
48 - * @param status 订单状态  
49 - * @return 交易订单  
50 - */  
51 - TradeOrderDO getOrderByUserIdAndStatusAndCombination(Long userId, Long combinationActivityId, Integer status);  
52 -  
53 - /**  
54 - * 获得订单列表  
55 - *  
56 - * @param ids 订单编号数组  
57 - * @return 订单列表  
58 - */  
59 - List<TradeOrderDO> getOrderList(Collection<Long> ids);  
60 -  
61 - /**  
62 - * 【管理员】获得交易订单分页  
63 - *  
64 - * @param reqVO 分页请求  
65 - * @return 交易订单  
66 - */  
67 - PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO);  
68 -  
69 - /**  
70 - * 获得订单统计  
71 - *  
72 - * @param reqVO 请求参数  
73 - * @return 订单统计  
74 - */  
75 - TradeOrderSummaryRespVO getOrderSummary(TradeOrderPageReqVO reqVO);  
76 -  
77 - /**  
78 - * 【会员】获得交易订单分页  
79 - *  
80 - * @param userId 用户编号  
81 - * @param reqVO 分页请求  
82 - * @return 交易订单  
83 - */  
84 - PageResult<TradeOrderDO> getOrderPage(Long userId, AppTradeOrderPageReqVO reqVO);  
85 -  
86 - /**  
87 - * 【会员】获得交易订单数量  
88 - *  
89 - * @param userId 用户编号  
90 - * @param status 订单状态。如果为空,则不进行筛选  
91 - * @param commonStatus 评价状态。如果为空,则不进行筛选  
92 - * @return 订单数量  
93 - */  
94 - Long getOrderCount(Long userId, Integer status, Boolean commonStatus);  
95 -  
96 - /**  
97 - * 【前台】获得订单的物流轨迹  
98 - *  
99 - * @param id 订单编号  
100 - * @param userId 用户编号  
101 - * @return 物流轨迹数组  
102 - */  
103 - List<ExpressTrackRespDTO> getExpressTrackList(Long id, Long userId);  
104 -  
105 - /**  
106 - * 【后台】获得订单的物流轨迹  
107 - *  
108 - * @param id 订单编号  
109 - * @return 物流轨迹数组  
110 - */  
111 - List<ExpressTrackRespDTO> getExpressTrackList(Long id);  
112 -  
113 - /**  
114 - * 【会员】在指定活动下,用户购买的商品数量  
115 - *  
116 - * @param userId 用户编号  
117 - * @param activityId 活动编号  
118 - * @param type 订单类型  
119 - * @return 活动商品数量  
120 - */  
121 - int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type);  
122 -  
123 - // =================== Order Item ===================  
124 -  
125 - /**  
126 - * 获得指定用户,指定的交易订单项  
127 - *  
128 - * @param userId 用户编号  
129 - * @param itemId 交易订单项编号  
130 - * @return 交易订单项  
131 - */  
132 - TradeOrderItemDO getOrderItem(Long userId, Long itemId);  
133 -  
134 - /**  
135 - * 获得交易订单项  
136 - *  
137 - * @param id 交易订单项编号 itemId  
138 - * @return 交易订单项  
139 - */  
140 - TradeOrderItemDO getOrderItem(Long id);  
141 -  
142 - /**  
143 - * 根据交易订单编号,查询交易订单项  
144 - *  
145 - * @param orderId 交易订单编号  
146 - * @return 交易订单项数组  
147 - */  
148 - default List<TradeOrderItemDO> getOrderItemListByOrderId(Long orderId) {  
149 - return getOrderItemListByOrderId(singleton(orderId));  
150 - }  
151 -  
152 - /**  
153 - * 根据交易订单编号数组,查询交易订单项  
154 - *  
155 - * @param orderIds 交易订单编号数组  
156 - * @return 交易订单项数组  
157 - */  
158 - List<TradeOrderItemDO> getOrderItemListByOrderId(Collection<Long> orderIds);  
159 -  
160 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeOrderLogCreateReqBO.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.bo;  
2 -  
3 -import lombok.Data;  
4 -  
5 -import jakarta.validation.constraints.NotEmpty;  
6 -import jakarta.validation.constraints.NotNull;  
7 -  
8 -/**  
9 - * 订单日志的创建 Request BO  
10 - *  
11 - * @author 陈賝  
12 - * @since 2023/7/6 15:27  
13 - */  
14 -@Data  
15 -public class TradeOrderLogCreateReqBO {  
16 -  
17 - /**  
18 - * 用户编号  
19 - */  
20 - @NotNull(message = "用户编号不能为空")  
21 - private Long userId;  
22 - /**  
23 - * 用户类型  
24 - */  
25 - @NotNull(message = "用户类型不能为空")  
26 - private Integer userType;  
27 -  
28 - /**  
29 - * 订单编号  
30 - */  
31 - @NotNull(message = "订单编号不能为空")  
32 - private Long orderId;  
33 - /**  
34 - * 操作前状态  
35 - */  
36 - private Integer beforeStatus;  
37 - /**  
38 - * 操作后状态  
39 - */  
40 - @NotNull(message = "操作后的状态不能为空")  
41 - private Integer afterStatus;  
42 -  
43 - /**  
44 - * 操作类型  
45 - */  
46 - @NotNull(message = "操作类型不能为空")  
47 - private Integer operateType;  
48 - /**  
49 - * 操作明细  
50 - */  
51 - @NotEmpty(message = "操作明细不能为空")  
52 - private String content;  
53 -  
54 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.lang.Assert;  
5 -import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi;  
6 -import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;  
7 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
8 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
9 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
10 -import org.springframework.stereotype.Component;  
11 -  
12 -import jakarta.annotation.Resource;  
13 -import java.util.List;  
14 -  
15 -/**  
16 - * 砍价订单的 {@link TradeOrderHandler} 实现类  
17 - *  
18 - * @author HUIHUI  
19 - */  
20 -@Component  
21 -public class TradeBargainOrderHandler implements TradeOrderHandler {  
22 -  
23 - @Resource  
24 - private BargainActivityApi bargainActivityApi;  
25 - @Resource  
26 - private BargainRecordApi bargainRecordApi;  
27 -  
28 - @Override  
29 - public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
30 - if (!TradeOrderTypeEnum.isBargain(order.getType())) {  
31 - return;  
32 - }  
33 - // 明确校验一下  
34 - Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品");  
35 -  
36 - // 扣减砍价活动的库存  
37 - bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(),  
38 - -orderItems.get(0).getCount());  
39 - }  
40 -  
41 - @Override  
42 - public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
43 - if (!TradeOrderTypeEnum.isBargain(order.getType())) {  
44 - return;  
45 - }  
46 - // 明确校验一下  
47 - Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品");  
48 -  
49 - // 记录砍价记录对应的订单编号  
50 - bargainRecordApi.updateBargainRecordOrderId(order.getBargainRecordId(), order.getId());  
51 - }  
52 -  
53 - @Override  
54 - public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
55 - if (!TradeOrderTypeEnum.isBargain(order.getType())) {  
56 - return;  
57 - }  
58 - // 明确校验一下  
59 - Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品");  
60 -  
61 - // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚  
62 - orderItems = filterOrderItemListByNoneAfterSale(orderItems);  
63 - if (CollUtil.isEmpty(orderItems)) {  
64 - return;  
65 - }  
66 - afterCancelOrderItem(order, orderItems.get(0));  
67 - }  
68 -  
69 - @Override  
70 - public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {  
71 - if (!TradeOrderTypeEnum.isBargain(order.getType())) {  
72 - return;  
73 - }  
74 - // 恢复(增加)砍价活动的库存  
75 - bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(), orderItem.getCount());  
76 - }  
77 -  
78 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBrokerageOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.lang.Assert;  
5 -import cn.iocoder.yudao.module.member.api.user.MemberUserApi;  
6 -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;  
7 -import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;  
8 -import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;  
9 -import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;  
10 -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;  
11 -import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;  
12 -import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;  
13 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
14 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
15 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;  
16 -import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService;  
17 -import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService;  
18 -import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;  
19 -import org.springframework.stereotype.Component;  
20 -  
21 -import jakarta.annotation.Resource;  
22 -import java.util.List;  
23 -import java.util.Map;  
24 -  
25 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;  
26 -  
27 -/**  
28 - * 订单分销的 {@link TradeOrderHandler} 实现类  
29 - *  
30 - * @author 芋道源码  
31 - */  
32 -@Component  
33 -public class TradeBrokerageOrderHandler implements TradeOrderHandler {  
34 -  
35 - @Resource  
36 - private MemberUserApi memberUserApi;  
37 - @Resource  
38 - private ProductSpuApi productSpuApi;  
39 - @Resource  
40 - private ProductSkuApi productSkuApi;  
41 -  
42 - @Resource  
43 - private BrokerageRecordService brokerageRecordService;  
44 - @Resource  
45 - private BrokerageUserService brokerageUserService;  
46 -  
47 - @Override  
48 - public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
49 - // 设置订单推广人  
50 - BrokerageUserDO brokerageUser = brokerageUserService.getBrokerageUser(order.getUserId());  
51 - if (brokerageUser != null && brokerageUser.getBindUserId() != null) {  
52 - order.setBrokerageUserId(brokerageUser.getBindUserId());  
53 - }  
54 - }  
55 -  
56 - @Override  
57 - public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
58 - if (order.getBrokerageUserId() == null) {  
59 - return;  
60 - }  
61 - addBrokerage(order.getUserId(), orderItems);  
62 - }  
63 -  
64 - @Override  
65 - public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
66 - // 如果是未支付的订单,不会产生分销结果,所以直接 return  
67 - if (!order.getPayStatus()) {  
68 - return;  
69 - }  
70 - if (order.getBrokerageUserId() == null) {  
71 - return;  
72 - }  
73 -  
74 - // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚  
75 - orderItems = filterOrderItemListByNoneAfterSale(orderItems);  
76 - if (CollUtil.isEmpty(orderItems)) {  
77 - return;  
78 - }  
79 - orderItems.forEach(orderItem -> afterCancelOrderItem(order, orderItem));  
80 - }  
81 -  
82 - @Override  
83 - public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {  
84 - if (order.getBrokerageUserId() == null) {  
85 - return;  
86 - }  
87 - brokerageRecordService.cancelBrokerage(BrokerageRecordBizTypeEnum.ORDER, String.valueOf(orderItem.getId()));  
88 - }  
89 -  
90 - /**  
91 - * 创建分销记录  
92 - * <p>  
93 - * 目前是支付成功后,就会创建分销记录。  
94 - * <p>  
95 - * 业内还有两种做法,可以根据自己的业务调整:  
96 - * 1. 确认收货后,才创建分销记录  
97 - * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻  
98 - *  
99 - * @param userId 用户编号  
100 - * @param orderItems 订单项  
101 - */  
102 - protected void addBrokerage(Long userId, List<TradeOrderItemDO> orderItems) {  
103 - MemberUserRespDTO user = memberUserApi.getUser(userId);  
104 - Assert.notNull(user);  
105 - Map<Long, ProductSpuRespDTO> spusMap = productSpuApi.getSpuMap(convertList(orderItems, TradeOrderItemDO::getSpuId));  
106 - Map<Long, ProductSkuRespDTO> skusMap = productSkuApi.getSkuMap(convertList(orderItems, TradeOrderItemDO::getSkuId));  
107 -  
108 - // 每一个订单项,都会去生成分销记录  
109 - List<BrokerageAddReqBO> addList = convertList(orderItems, item -> {  
110 - ProductSpuRespDTO spu = spusMap.get(item.getSpuId());  
111 - Assert.notNull(spu);  
112 - ProductSkuRespDTO sku = skusMap.get(item.getSkuId());  
113 - Assert.notNull(sku);  
114 - return TradeOrderConvert.INSTANCE.convert(user, item, spu, sku);  
115 - });  
116 - brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, addList);  
117 - }  
118 -  
119 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.lang.Assert;  
4 -import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;  
5 -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateRespDTO;  
6 -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;  
7 -import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;  
8 -import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;  
9 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
10 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
11 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;  
12 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
13 -import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;  
14 -import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;  
15 -import org.springframework.context.annotation.Lazy;  
16 -import org.springframework.stereotype.Component;  
17 -  
18 -import jakarta.annotation.Resource;  
19 -import java.util.List;  
20 -  
21 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
22 -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_EXIST_UNPAID;  
23 -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS;  
24 -  
25 -/**  
26 - * 拼团订单的 {@link TradeOrderHandler} 实现类  
27 - *  
28 - * @author HUIHUI  
29 - */  
30 -@Component  
31 -public class TradeCombinationOrderHandler implements TradeOrderHandler {  
32 -  
33 - @Resource  
34 - @Lazy // 延迟加载,避免循环依赖  
35 - private TradeOrderUpdateService orderUpdateService;  
36 - @Resource  
37 - private TradeOrderQueryService orderQueryService;  
38 -  
39 - @Resource  
40 - @Lazy // 延迟加载,避免循环依赖  
41 - private CombinationRecordApi combinationRecordApi;  
42 -  
43 - @Override  
44 - public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
45 - // 如果不是拼团订单则结束  
46 - if (!TradeOrderTypeEnum.isCombination(order.getType())) {  
47 - return;  
48 - }  
49 - Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");  
50 -  
51 - // 1. 校验是否满足拼团活动相关限制  
52 - TradeOrderItemDO item = orderItems.get(0);  
53 - combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(),  
54 - order.getCombinationHeadId(), item.getSkuId(), item.getCount());  
55 -  
56 - // 2. 校验该用户是否存在未支付的拼团活动订单,避免一个拼团可以下多个单子了  
57 - TradeOrderDO activityOrder = orderQueryService.getOrderByUserIdAndStatusAndCombination(  
58 - order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus());  
59 - if (activityOrder != null) {  
60 - throw exception(ORDER_CREATE_FAIL_EXIST_UNPAID);  
61 - }  
62 - }  
63 -  
64 - @Override  
65 - public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
66 - // 1.如果不是拼团订单则结束  
67 - if (!TradeOrderTypeEnum.isCombination(order.getType())) {  
68 - return;  
69 - }  
70 - Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");  
71 -  
72 - // 2. 创建拼团记录  
73 - TradeOrderItemDO item = orderItems.get(0);  
74 - CombinationRecordCreateRespDTO combinationRecord = combinationRecordApi.createCombinationRecord(  
75 - TradeOrderConvert.INSTANCE.convert(order, item));  
76 -  
77 - // 3. 更新拼团相关信息到订单。为什么几个字段都要更新?  
78 - // 原因是:如果创建订单时自己是团长的情况下 combinationHeadId 是为 null 的,设置团长编号这个操作时在订单是否后创建拼团记录时才设置的。  
79 - orderUpdateService.updateOrderCombinationInfo(order.getId(), order.getCombinationActivityId(),  
80 - combinationRecord.getCombinationRecordId(), combinationRecord.getCombinationHeadId());  
81 - }  
82 -  
83 - @Override  
84 - public void beforeDeliveryOrder(TradeOrderDO order) {  
85 - if (!TradeOrderTypeEnum.isCombination(order.getType())) {  
86 - return;  
87 - }  
88 - // 校验订单拼团是否成功  
89 - CombinationRecordRespDTO combinationRecord = combinationRecordApi.getCombinationRecordByOrderId(order.getUserId(), order.getId());  
90 - Assert.notNull(combinationRecord, "订单({})对应的拼团记录不存在", order.getId());  
91 - if (!CombinationRecordStatusEnum.isSuccess(combinationRecord.getStatus())) {  
92 - throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS);  
93 - }  
94 - }  
95 -  
96 -}  
97 -  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCouponOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi;  
5 -import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO;  
6 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
7 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
8 -import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;  
9 -import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;  
10 -import jakarta.annotation.Resource;  
11 -import lombok.extern.slf4j.Slf4j;  
12 -import org.springframework.context.annotation.Lazy;  
13 -import org.springframework.stereotype.Component;  
14 -  
15 -import java.util.List;  
16 -  
17 -/**  
18 - * 优惠劵的 {@link TradeOrderHandler} 实现类  
19 - *  
20 - * @author 芋道源码  
21 - */  
22 -@Component  
23 -@Slf4j  
24 -public class TradeCouponOrderHandler implements TradeOrderHandler {  
25 -  
26 - @Resource  
27 - @Lazy // 延迟加载,避免循环依赖  
28 - private TradeOrderUpdateService orderUpdateService;  
29 - @Resource  
30 - private TradeOrderQueryService orderQueryService;  
31 -  
32 - @Resource  
33 - private CouponApi couponApi;  
34 -  
35 - @Override  
36 - public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
37 - if (order.getCouponId() == null || order.getCouponId() <= 0) {  
38 - return;  
39 - }  
40 - // 不在前置扣减的原因,是因为优惠劵要记录使用的订单号  
41 - couponApi.useCoupon(new CouponUseReqDTO().setId(order.getCouponId()).setUserId(order.getUserId())  
42 - .setOrderId(order.getId()));  
43 - }  
44 -  
45 - @Override  
46 - public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
47 - if (CollUtil.isEmpty(order.getGiveCouponTemplateCounts())) {  
48 - return;  
49 - }  
50 - // 赠送优惠券  
51 - try {  
52 - List<Long> couponIds = couponApi.takeCouponsByAdmin(order.getGiveCouponTemplateCounts(), order.getUserId());  
53 - if (CollUtil.isEmpty(couponIds)) {  
54 - return;  
55 - }  
56 - orderUpdateService.updateOrderGiveCouponIds(order.getUserId(), order.getId(), couponIds);  
57 - } catch (Exception e) {  
58 - log.error("[afterPayOrder][order({}) 赠送优惠券({})失败,需要手工补偿]", order.getId(), order.getGiveCouponTemplateCounts(), e);  
59 - }  
60 - }  
61 -  
62 - @Override  
63 - public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
64 - // 情况一:退还订单使用的优惠券  
65 - if (order.getCouponId() != null && order.getCouponId() > 0) {  
66 - // 退回优惠劵  
67 - couponApi.returnUsedCoupon(order.getCouponId());  
68 - }  
69 - // 情况二:收回赠送的优惠券  
70 - if (CollUtil.isEmpty(order.getGiveCouponIds())) {  
71 - return;  
72 - }  
73 - couponApi.invalidateCouponsByAdmin(order.getGiveCouponIds(), order.getUserId());  
74 - }  
75 -  
76 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeMemberPointOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;  
5 -import cn.iocoder.yudao.module.member.api.point.MemberPointApi;  
6 -import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;  
7 -import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;  
8 -import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;  
9 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
10 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
11 -import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleService;  
12 -import org.springframework.stereotype.Component;  
13 -  
14 -import jakarta.annotation.Resource;  
15 -import java.util.List;  
16 -  
17 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;  
18 -  
19 -/**  
20 - * 会员积分、等级的 {@link TradeOrderHandler} 实现类  
21 - *  
22 - * @author owen  
23 - */  
24 -@Component  
25 -public class TradeMemberPointOrderHandler implements TradeOrderHandler {  
26 -  
27 - @Resource  
28 - private MemberPointApi memberPointApi;  
29 - @Resource  
30 - private MemberLevelApi memberLevelApi;  
31 -  
32 - @Resource  
33 - private AfterSaleService afterSaleService;  
34 -  
35 - @Override  
36 - public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
37 - // 扣减用户积分(订单抵扣)。不在前置扣减的原因,是因为积分扣减时,需要记录关联业务  
38 - reducePoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE, order.getId());  
39 - }  
40 -  
41 - @Override  
42 - public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
43 - // 增加用户积分(订单赠送)  
44 - addPoint(order.getUserId(), order.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE,  
45 - order.getId());  
46 -  
47 - // 增加用户经验  
48 - memberLevelApi.addExperience(order.getUserId(), order.getPayPrice(),  
49 - MemberExperienceBizTypeEnum.ORDER_GIVE.getType(), String.valueOf(order.getId()));  
50 - }  
51 -  
52 - @Override  
53 - public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
54 - // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚  
55 - orderItems = filterOrderItemListByNoneAfterSale(orderItems);  
56 - if (CollUtil.isEmpty(orderItems)) {  
57 - return;  
58 - }  
59 -  
60 - // 增加(回滚)用户积分(订单抵扣)  
61 - Integer usePoint = getSumValue(orderItems, TradeOrderItemDO::getUsePoint, Integer::sum);  
62 - addPoint(order.getUserId(), usePoint, MemberPointBizTypeEnum.ORDER_USE_CANCEL,  
63 - order.getId());  
64 -  
65 - // 如下的返还,需要经过支持,也就是经历 afterPayOrder 流程  
66 - if (!order.getPayStatus()) {  
67 - return;  
68 - }  
69 - // 扣减(回滚)积分(订单赠送)  
70 - Integer givePoint = getSumValue(orderItems, TradeOrderItemDO::getGivePoint, Integer::sum);  
71 - reducePoint(order.getUserId(), givePoint, MemberPointBizTypeEnum.ORDER_GIVE_CANCEL,  
72 - order.getId());  
73 - // 扣减(回滚)用户经验  
74 - int payPrice = order.getPayPrice() - order.getRefundPrice();  
75 - memberLevelApi.addExperience(order.getUserId(), payPrice,  
76 - MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL.getType(), String.valueOf(order.getId()));  
77 - }  
78 -  
79 - @Override  
80 - public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {  
81 - // 增加(回滚)积分(订单抵扣)  
82 - addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE_CANCEL_ITEM, orderItem.getId());  
83 - // 扣减(回滚)积分(订单赠送)  
84 - reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE_CANCEL_ITEM, orderItem.getId());  
85 -  
86 - // 扣减(回滚)用户经验  
87 - AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId());  
88 - memberLevelApi.reduceExperience(order.getUserId(), afterSale.getRefundPrice(),  
89 - MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL_ITEM.getType(), String.valueOf(orderItem.getId()));  
90 - }  
91 -  
92 - /**  
93 - * 添加用户积分  
94 - * <p>  
95 - * 目前是支付成功后,就会创建积分记录。  
96 - * <p>  
97 - * 业内还有两种做法,可以根据自己的业务调整:  
98 - * 1. 确认收货后,才创建积分记录  
99 - * 2. 支付 or 下单成功时,创建积分记录(冻结),确认收货解冻或者 n 天后解冻  
100 - *  
101 - * @param userId 用户编号  
102 - * @param point 增加积分数量  
103 - * @param bizType 业务编号  
104 - * @param bizId 业务编号  
105 - */  
106 - protected void addPoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) {  
107 - if (point != null && point > 0) {  
108 - memberPointApi.addPoint(userId, point, bizType.getType(), String.valueOf(bizId));  
109 - }  
110 - }  
111 -  
112 - protected void reducePoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) {  
113 - if (point != null && point > 0) {  
114 - memberPointApi.reducePoint(userId, point, bizType.getType(), String.valueOf(bizId));  
115 - }  
116 - }  
117 -  
118 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;  
4 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
5 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
6 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;  
7 -  
8 -import java.util.List;  
9 -  
10 -/**  
11 - * 订单活动特殊逻辑处理器 handler 接口  
12 - * 提供订单生命周期钩子接口;订单创建前、订单创建后、订单支付后、订单取消  
13 - *  
14 - * @author HUIHUI  
15 - */  
16 -public interface TradeOrderHandler {  
17 -  
18 - /**  
19 - * 订单创建前  
20 - *  
21 - * @param order 订单  
22 - * @param orderItems 订单项  
23 - */  
24 - default void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {}  
25 -  
26 - /**  
27 - * 订单创建后  
28 - *  
29 - * @param order 订单  
30 - * @param orderItems 订单项  
31 - */  
32 - default void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {}  
33 -  
34 - /**  
35 - * 支付订单后  
36 - *  
37 - * @param order 订单  
38 - * @param orderItems 订单项  
39 - */  
40 - default void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {}  
41 -  
42 - /**  
43 - * 订单取消后  
44 - *  
45 - * @param order 订单  
46 - * @param orderItems 订单项  
47 - */  
48 - default void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {}  
49 -  
50 - /**  
51 - * 订单项取消后  
52 - *  
53 - * @param order 订单  
54 - * @param orderItem 订单项  
55 - */  
56 - default void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {}  
57 -  
58 - /**  
59 - * 订单发货前  
60 - *  
61 - * @param order 订单  
62 - */  
63 - default void beforeDeliveryOrder(TradeOrderDO order) {}  
64 -  
65 - /**  
66 - * 订单发货后  
67 - *  
68 - * @param order 订单  
69 - */  
70 - default void afterDeliveryOrder(TradeOrderDO order) {}  
71 -  
72 - /**  
73 - * 订单收货前  
74 - *  
75 - * @param order 订单  
76 - */  
77 - default void beforeReceiveOrder(TradeOrderDO order) {}  
78 -  
79 - /**  
80 - * 订单收货后  
81 - *  
82 - * @param order 订单  
83 - */  
84 - default void afterReceiveOrder(TradeOrderDO order) {}  
85 -  
86 - // ========== 公用方法 ==========  
87 -  
88 - /**  
89 - * 过滤“未售后”的订单项列表  
90 - *  
91 - * @param orderItems 订单项列表  
92 - * @return 过滤后的订单项列表  
93 - */  
94 - default List<TradeOrderItemDO> filterOrderItemListByNoneAfterSale(List<TradeOrderItemDO> orderItems) {  
95 - return CollectionUtils.filterList(orderItems,  
96 - item -> TradeOrderItemAfterSaleStatusEnum.isNone(item.getAfterSaleStatus()));  
97 - }  
98 -  
99 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradePointOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.lang.Assert;  
5 -import cn.iocoder.yudao.module.member.api.user.MemberUserApi;  
6 -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;  
7 -import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi;  
8 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
9 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
10 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;  
11 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
12 -import jakarta.annotation.Resource;  
13 -import org.springframework.stereotype.Component;  
14 -  
15 -import java.util.List;  
16 -import java.util.Objects;  
17 -  
18 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
19 -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS;  
20 -  
21 -/**  
22 - * 积分商城活动订单的 {@link TradeOrderHandler} 实现类  
23 - *  
24 - * @author HUIHUI  
25 - */  
26 -@Component  
27 -public class TradePointOrderHandler implements TradeOrderHandler {  
28 -  
29 - @Resource  
30 - private PointActivityApi pointActivityApi;  
31 - @Resource  
32 - private MemberUserApi memberUserApi;  
33 -  
34 - @Override  
35 - public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
36 - if (!TradeOrderTypeEnum.isPoint(order.getType())) {  
37 - return;  
38 - }  
39 - // 明确校验一下  
40 - Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品");  
41 - // 校验用户剩余积分是否足够兑换商品  
42 - MemberUserRespDTO user = memberUserApi.getUser(order.getUserId());  
43 - if (user.getPoint() < order.getUsePoint()) {  
44 - throw exception(ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS);  
45 - }  
46 -  
47 - // 扣减积分商城活动的库存  
48 - pointActivityApi.updatePointStockDecr(order.getPointActivityId(),  
49 - orderItems.get(0).getSkuId(), orderItems.get(0).getCount());  
50 -  
51 - // 如果支付金额为 0,则直接设置为已支付  
52 - if (Objects.equals(order.getPayPrice(), 0)) {  
53 - order.setPayStatus(true).setStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus());  
54 - }  
55 - }  
56 -  
57 - @Override  
58 - public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
59 - if (!TradeOrderTypeEnum.isPoint(order.getType())) {  
60 - return;  
61 - }  
62 - // 明确校验一下  
63 - Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品");  
64 -  
65 - // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚  
66 - orderItems = filterOrderItemListByNoneAfterSale(orderItems);  
67 - if (CollUtil.isEmpty(orderItems)) {  
68 - return;  
69 - }  
70 - afterCancelOrderItem(order, orderItems.get(0));  
71 - }  
72 -  
73 - @Override  
74 - public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {  
75 - if (!TradeOrderTypeEnum.isPoint(order.getType())) {  
76 - return;  
77 - }  
78 - // 恢复积分商城活动的库存  
79 - pointActivityApi.updatePointStockIncr(order.getPointActivityId(),  
80 - orderItem.getSkuId(), orderItem.getCount());  
81 - }  
82 -  
83 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeProductSkuOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;  
5 -import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;  
6 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
7 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
8 -import org.springframework.stereotype.Component;  
9 -  
10 -import jakarta.annotation.Resource;  
11 -import java.util.List;  
12 -  
13 -import static java.util.Collections.singletonList;  
14 -  
15 -/**  
16 - * 商品 SKU 库存的 {@link TradeOrderHandler} 实现类  
17 - *  
18 - * @author 芋道源码  
19 - */  
20 -@Component  
21 -public class TradeProductSkuOrderHandler implements TradeOrderHandler {  
22 -  
23 - @Resource  
24 - private ProductSkuApi productSkuApi;  
25 -  
26 - @Override  
27 - public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
28 - productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convertNegative(orderItems));  
29 - }  
30 -  
31 - @Override  
32 - public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
33 - // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚  
34 - orderItems = filterOrderItemListByNoneAfterSale(orderItems);  
35 - if (CollUtil.isEmpty(orderItems)) {  
36 - return;  
37 - }  
38 - productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems));  
39 - }  
40 -  
41 - @Override  
42 - public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {  
43 - productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(singletonList(orderItem)));  
44 - }  
45 -  
46 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.lang.Assert;  
5 -import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;  
6 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
7 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;  
8 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
9 -import org.springframework.stereotype.Component;  
10 -  
11 -import jakarta.annotation.Resource;  
12 -import java.util.List;  
13 -  
14 -/**  
15 - * 秒杀订单的 {@link TradeOrderHandler} 实现类  
16 - *  
17 - * @author HUIHUI  
18 - */  
19 -@Component  
20 -public class TradeSeckillOrderHandler implements TradeOrderHandler {  
21 -  
22 - @Resource  
23 - private SeckillActivityApi seckillActivityApi;  
24 -  
25 - @Override  
26 - public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
27 - if (!TradeOrderTypeEnum.isSeckill(order.getType())) {  
28 - return;  
29 - }  
30 - // 明确校验一下  
31 - Assert.isTrue(orderItems.size() == 1, "秒杀时,只允许选择一个商品");  
32 -  
33 - // 扣减秒杀活动的库存  
34 - seckillActivityApi.updateSeckillStockDecr(order.getSeckillActivityId(),  
35 - orderItems.get(0).getSkuId(), orderItems.get(0).getCount());  
36 - }  
37 -  
38 - @Override  
39 - public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {  
40 - if (!TradeOrderTypeEnum.isSeckill(order.getType())) {  
41 - return;  
42 - }  
43 - // 明确校验一下  
44 - Assert.isTrue(orderItems.size() == 1, "秒杀时,只允许选择一个商品");  
45 -  
46 - // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚  
47 - orderItems = filterOrderItemListByNoneAfterSale(orderItems);  
48 - if (CollUtil.isEmpty(orderItems)) {  
49 - return;  
50 - }  
51 - afterCancelOrderItem(order, orderItems.get(0));  
52 - }  
53 -  
54 - @Override  
55 - public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {  
56 - if (!TradeOrderTypeEnum.isSeckill(order.getType())) {  
57 - return;  
58 - }  
59 - // 恢复秒杀活动的库存  
60 - seckillActivityApi.updateSeckillStockIncr(order.getSeckillActivityId(),  
61 - orderItem.getSkuId(), orderItem.getCount());  
62 - }  
63 -  
64 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeStatusSyncToWxaOrderHandler.java deleted
1 -package cn.iocoder.yudao.module.trade.service.order.handler;  
2 -  
3 -import cn.hutool.core.util.ObjUtil;  
4 -import cn.hutool.core.util.StrUtil;  
5 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
6 -import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;  
7 -import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;  
8 -import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;  
9 -import cn.iocoder.yudao.module.system.api.social.SocialClientApi;  
10 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaOrderNotifyConfirmReceiveReqDTO;  
11 -import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaOrderUploadShippingInfoReqDTO;  
12 -import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;  
13 -import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;  
14 -import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;  
15 -import jakarta.annotation.Resource;  
16 -import lombok.extern.slf4j.Slf4j;  
17 -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;  
18 -import org.springframework.stereotype.Component;  
19 -  
20 -/**  
21 - * 同步订单状态到微信小程序的 {@link TradeOrderHandler} 实现类  
22 - *  
23 - * 背景:电商类目的微信小程序需要上传发货信息,不然微信支付会被封 = =!  
24 - * 注意:微信小程序开发环境下的订单不能用来发货。只有小程序正式版才会有发货,所以体验版无法调通,提示订单不存在。注意别踩坑。  
25 - */  
26 -@Slf4j  
27 -@Component  
28 -@ConditionalOnProperty(prefix = "yudao.trade.order", value = "status-sync-to-wxa-enable")  
29 -public class TradeStatusSyncToWxaOrderHandler implements TradeOrderHandler {  
30 -  
31 - @Resource  
32 - private PayOrderApi payOrderApi;  
33 - @Resource  
34 - private SocialClientApi socialClientApi;  
35 -  
36 - @Resource  
37 - private DeliveryExpressService expressService;  
38 -  
39 - @Override  
40 - public void afterDeliveryOrder(TradeOrderDO order) {  
41 - // 注意:只有微信小程序支付的订单,才需要同步  
42 - if (ObjUtil.notEqual(order.getPayChannelCode(), PayChannelEnum.WX_LITE.getCode())) {  
43 - return;  
44 - }  
45 - PayOrderRespDTO payOrder = payOrderApi.getOrder(order.getPayOrderId());  
46 - SocialWxaOrderUploadShippingInfoReqDTO reqDTO = new SocialWxaOrderUploadShippingInfoReqDTO()  
47 - .setTransactionId(payOrder.getChannelOrderNo())  
48 - .setOpenid(payOrder.getChannelUserId())  
49 - .setItemDesc(payOrder.getSubject())  
50 - .setReceiverContact(order.getReceiverMobile());  
51 - if (DeliveryTypeEnum.EXPRESS.getType().equals(order.getDeliveryType()) && StrUtil.isNotEmpty(order.getLogisticsNo())) {  
52 - reqDTO.setLogisticsType(SocialWxaOrderUploadShippingInfoReqDTO.LOGISTICS_TYPE_EXPRESS)  
53 - .setExpressCompany(expressService.getDeliveryExpress(order.getLogisticsId()).getCode())  
54 - .setLogisticsNo(order.getLogisticsNo());  
55 - } else if (DeliveryTypeEnum.PICK_UP.getType().equals(order.getDeliveryType())) {  
56 - reqDTO.setLogisticsType(SocialWxaOrderUploadShippingInfoReqDTO.LOGISTICS_TYPE_PICK_UP);  
57 - } else {  
58 - reqDTO.setLogisticsType(SocialWxaOrderUploadShippingInfoReqDTO.LOGISTICS_TYPE_VIRTUAL);  
59 - }  
60 - try {  
61 - socialClientApi.uploadWxaOrderShippingInfo(UserTypeEnum.MEMBER.getValue(), reqDTO);  
62 - } catch (Exception ex) {  
63 - log.error("[afterDeliveryOrder][订单({}) 上传订单物流信息到微信小程序失败]", order, ex);  
64 - }  
65 - }  
66 -  
67 - @Override  
68 - public void afterReceiveOrder(TradeOrderDO order) {  
69 - // 注意:只有微信小程序支付的订单,才需要同步  
70 - if (ObjUtil.notEqual(order.getPayChannelCode(), PayChannelEnum.WX_LITE.getCode())) {  
71 - return;  
72 - }  
73 - PayOrderRespDTO payOrder = payOrderApi.getOrder(order.getPayOrderId());  
74 - SocialWxaOrderNotifyConfirmReceiveReqDTO reqDTO = new SocialWxaOrderNotifyConfirmReceiveReqDTO()  
75 - .setTransactionId(payOrder.getChannelOrderNo())  
76 - .setReceivedTime(order.getReceiveTime());  
77 - try {  
78 - socialClientApi.notifyWxaOrderConfirmReceive(UserTypeEnum.MEMBER.getValue(), reqDTO);  
79 - } catch (Exception ex) {  
80 - log.error("[afterReceiveOrder][订单({}) 通知订单收货到微信小程序失败]", order, ex);  
81 - }  
82 - }  
83 -  
84 - // TODO @芋艿:【设置路径】 https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html#%E5%85%AD%E3%80%81%E6%B6%88%E6%81%AF%E8%B7%B3%E8%BD%AC%E8%B7%AF%E5%BE%84%E8%AE%BE%E7%BD%AE%E6%8E%A5%E5%8F%A3  
85 -  
86 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceService.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price;  
2 -  
3 -import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeProductSettlementRespVO;  
4 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
5 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
6 -import jakarta.validation.Valid;  
7 -  
8 -import java.util.List;  
9 -  
10 -/**  
11 - * 价格计算 Service 接口  
12 - *  
13 - * @author 芋道源码  
14 - */  
15 -public interface TradePriceService {  
16 -  
17 - /**  
18 - * 【订单】价格计算  
19 - *  
20 - * @param calculateReqDTO 计算信息  
21 - * @return 计算结果  
22 - */  
23 - TradePriceCalculateRespBO calculateOrderPrice(@Valid TradePriceCalculateReqBO calculateReqDTO);  
24 -  
25 - /**  
26 - * 【商品】价格计算,用于商品列表、商品详情  
27 - *  
28 - * @param userId 用户编号,允许为空  
29 - * @param spuIds 商品 SPU 编号数组  
30 - * @return 计算结果  
31 - */  
32 - List<AppTradeProductSettlementRespVO> calculateProductPrice(Long userId, List<Long> spuIds);  
33 -  
34 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateReqBO.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.bo;  
2 -  
3 -import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;  
4 -import jakarta.validation.Valid;  
5 -import jakarta.validation.constraints.Min;  
6 -import jakarta.validation.constraints.NotNull;  
7 -import lombok.Data;  
8 -  
9 -import java.util.List;  
10 -  
11 -/**  
12 - * 价格计算 Request BO  
13 - *  
14 - * @author yudao源码  
15 - */  
16 -@Data  
17 -public class TradePriceCalculateReqBO {  
18 -  
19 - /**  
20 - * 用户编号  
21 - *  
22 - * 对应 MemberUserDO 的 id 编号  
23 - */  
24 - private Long userId;  
25 -  
26 - /**  
27 - * 优惠劵编号  
28 - *  
29 - * 对应 CouponDO 的 id 编号  
30 - */  
31 - private Long couponId;  
32 -  
33 - /**  
34 - * 是否使用积分  
35 - */  
36 - @NotNull(message = "是否使用积分不能为空")  
37 - private Boolean pointStatus;  
38 -  
39 - /**  
40 - * 配送方式  
41 - *  
42 - * 枚举 {@link DeliveryTypeEnum}  
43 - */  
44 - private Integer deliveryType;  
45 - /**  
46 - * 收货地址编号  
47 - *  
48 - * 对应 MemberAddressDO 的 id 编号  
49 - */  
50 - private Long addressId;  
51 - /**  
52 - * 自提门店编号  
53 - *  
54 - * 对应 PickUpStoreDO 的 id 编号  
55 - */  
56 - private Long pickUpStoreId;  
57 -  
58 - /**  
59 - * 商品 SKU 数组  
60 - */  
61 - @NotNull(message = "商品数组不能为空")  
62 - private List<Item> items;  
63 -  
64 - // ========== 秒杀活动相关字段 ==========  
65 - /**  
66 - * 秒杀活动编号  
67 - */  
68 - private Long seckillActivityId;  
69 -  
70 - // ========== 拼团活动相关字段 ==========  
71 - /**  
72 - * 拼团活动编号  
73 - */  
74 - private Long combinationActivityId;  
75 -  
76 - /**  
77 - * 拼团团长编号  
78 - */  
79 - private Long combinationHeadId;  
80 -  
81 - // ========== 砍价活动相关字段 ==========  
82 - /**  
83 - * 砍价记录编号  
84 - */  
85 - private Long bargainRecordId;  
86 -  
87 - // ========== 积分商城活动相关字段 ==========  
88 - /**  
89 - * 积分商城活动编号  
90 - */  
91 - private Long pointActivityId;  
92 -  
93 - /**  
94 - * 商品 SKU  
95 - */  
96 - @Data  
97 - @Valid  
98 - public static class Item {  
99 -  
100 - /**  
101 - * SKU 编号  
102 - */  
103 - @NotNull(message = "商品 SKU 编号不能为空")  
104 - private Long skuId;  
105 -  
106 - /**  
107 - * SKU 数量  
108 - */  
109 - @NotNull(message = "商品 SKU 数量不能为空")  
110 - @Min(value = 0L, message = "商品 SKU 数量必须大于等于 0")  
111 - private Integer count;  
112 -  
113 - /**  
114 - * 购物车项的编号  
115 - */  
116 - private Long cartId;  
117 -  
118 - /**  
119 - * 是否选中  
120 - */  
121 - @NotNull(message = "是否选中不能为空")  
122 - private Boolean selected;  
123 -  
124 - }  
125 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeBargainActivityPriceCalculator.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.hutool.core.lang.Assert;  
4 -import cn.hutool.core.util.ObjectUtil;  
5 -import cn.hutool.core.util.StrUtil;  
6 -import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;  
7 -import cn.iocoder.yudao.module.promotion.api.bargain.dto.BargainValidateJoinRespDTO;  
8 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;  
9 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
10 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
11 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
12 -import org.springframework.core.annotation.Order;  
13 -import org.springframework.stereotype.Component;  
14 -  
15 -import jakarta.annotation.Resource;  
16 -  
17 -// TODO huihui:单测需要补充  
18 -/**  
19 - * 砍价活动的 {@link TradePriceCalculator} 实现类  
20 - *  
21 - * @author 芋道源码  
22 - */  
23 -@Component  
24 -@Order(TradePriceCalculator.ORDER_BARGAIN_ACTIVITY)  
25 -public class TradeBargainActivityPriceCalculator implements TradePriceCalculator {  
26 -  
27 - @Resource  
28 - private BargainRecordApi bargainRecordApi;  
29 -  
30 - @Override  
31 - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {  
32 - // 1. 判断订单类型和是否具有拼团记录编号  
33 - if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.BARGAIN.getType())) {  
34 - return;  
35 - }  
36 - Assert.isTrue(param.getItems().size() == 1, "砍价时,只允许选择一个商品");  
37 - Assert.isTrue(param.getItems().get(0).getCount() == 1, "砍价时,只允许选择一个商品");  
38 - // 2. 校验是否可以参与砍价  
39 - TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);  
40 - BargainValidateJoinRespDTO bargainActivity = bargainRecordApi.validateJoinBargain(  
41 - param.getUserId(), param.getBargainRecordId(), orderItem.getSkuId());  
42 -  
43 - // 3.1 记录优惠明细  
44 - Integer discountPrice = orderItem.getPayPrice() - bargainActivity.getBargainPrice() * orderItem.getCount();  
45 - // TODO 芋艿:极端情况,优惠金额为负数,需要处理  
46 - TradePriceCalculatorHelper.addPromotion(result, orderItem,  
47 - param.getSeckillActivityId(), bargainActivity.getName(), PromotionTypeEnum.BARGAIN_ACTIVITY.getType(),  
48 - StrUtil.format("砍价活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),  
49 - discountPrice);  
50 - // 3.2 更新 SKU 优惠金额  
51 - orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);  
52 - TradePriceCalculatorHelper.recountPayPrice(orderItem);  
53 - TradePriceCalculatorHelper.recountAllPrice(result);  
54 - // 4. 特殊:设置对应的砍价活动编号  
55 - result.setBargainActivityId(bargainActivity.getActivityId());  
56 - }  
57 -  
58 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCombinationActivityPriceCalculator.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.hutool.core.lang.Assert;  
4 -import cn.hutool.core.util.StrUtil;  
5 -import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;  
6 -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationValidateJoinRespDTO;  
7 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;  
8 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
9 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
10 -import org.springframework.core.annotation.Order;  
11 -import org.springframework.stereotype.Component;  
12 -  
13 -import jakarta.annotation.Resource;  
14 -  
15 -// TODO @puhui999:单测可以后补下  
16 -  
17 -/**  
18 - * 拼团活动的 {@link TradePriceCalculator} 实现类  
19 - *  
20 - * @author HUIHUI  
21 - */  
22 -@Component  
23 -@Order(TradePriceCalculator.ORDER_COMBINATION_ACTIVITY)  
24 -public class TradeCombinationActivityPriceCalculator implements TradePriceCalculator {  
25 -  
26 - @Resource  
27 - private CombinationRecordApi combinationRecordApi;  
28 -  
29 - @Override  
30 - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {  
31 - // 1. 判断订单类型和是否具有拼团活动编号  
32 - if (param.getCombinationActivityId() == null) {  
33 - return;  
34 - }  
35 - Assert.isTrue(param.getItems().size() == 1, "拼团时,只允许选择一个商品");  
36 - // 2. 校验是否可以参与拼团  
37 - TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);  
38 - CombinationValidateJoinRespDTO combinationActivity = combinationRecordApi.validateJoinCombination(  
39 - param.getUserId(), param.getCombinationActivityId(), param.getCombinationHeadId(),  
40 - orderItem.getSkuId(), orderItem.getCount());  
41 -  
42 - // 3.1 记录优惠明细  
43 - Integer discountPrice = orderItem.getPayPrice() - combinationActivity.getCombinationPrice() * orderItem.getCount();  
44 - TradePriceCalculatorHelper.addPromotion(result, orderItem,  
45 - param.getCombinationActivityId(), combinationActivity.getName(), PromotionTypeEnum.COMBINATION_ACTIVITY.getType(),  
46 - StrUtil.format("拼团活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),  
47 - discountPrice);  
48 - // 3.2 更新 SKU 优惠金额  
49 - orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);  
50 - TradePriceCalculatorHelper.recountPayPrice(orderItem);  
51 - TradePriceCalculatorHelper.recountAllPrice(result);  
52 - }  
53 -  
54 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.hutool.core.lang.Assert;  
4 -import cn.hutool.core.util.ObjectUtil;  
5 -import cn.hutool.core.util.StrUtil;  
6 -import cn.iocoder.yudao.module.member.api.user.MemberUserApi;  
7 -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;  
8 -import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi;  
9 -import cn.iocoder.yudao.module.promotion.api.point.dto.PointValidateJoinRespDTO;  
10 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;  
11 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
12 -import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;  
13 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
14 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
15 -import jakarta.annotation.Resource;  
16 -import lombok.extern.slf4j.Slf4j;  
17 -import org.springframework.core.annotation.Order;  
18 -import org.springframework.stereotype.Component;  
19 -  
20 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
21 -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT;  
22 -  
23 -/**  
24 - * 积分商城的 {@link TradePriceCalculator} 实现类  
25 - *  
26 - * @author owen  
27 - */  
28 -@Component  
29 -@Order(TradePriceCalculator.ORDER_POINT_ACTIVITY)  
30 -@Slf4j  
31 -public class TradePointActivityPriceCalculator implements TradePriceCalculator {  
32 -  
33 - @Resource  
34 - private PointActivityApi pointActivityApi;  
35 - @Resource  
36 - private MemberUserApi memberUserApi;  
37 -  
38 - @Resource  
39 - private TradeOrderQueryService tradeOrderQueryService;  
40 -  
41 - @Override  
42 - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {  
43 - // 1.1 判断订单类型是否为积分商城活动  
44 - if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.POINT.getType())) {  
45 - return;  
46 - }  
47 - // 1.2 初始化积分  
48 - MemberUserRespDTO user = memberUserApi.getUser(param.getUserId());  
49 - result.setTotalPoint(user.getPoint()).setUsePoint(0);  
50 -  
51 - // 1.3 校验用户积分余额  
52 - if (user.getPoint() == null || user.getPoint() <= 0) {  
53 - return;  
54 - }  
55 -  
56 - Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品");  
57 - // 2. 校验是否可以参与积分商城活动  
58 - TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);  
59 - PointValidateJoinRespDTO activity = validateJoinPointActivity(  
60 - param.getUserId(), param.getPointActivityId(),  
61 - orderItem.getSkuId(), orderItem.getCount());  
62 -  
63 - // 3.0 积分兑换前置校验  
64 - Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1");  
65 - // 3.1 记录优惠明细  
66 - int usePoint = activity.getPoint() * orderItem.getCount();  
67 - result.setUsePoint(usePoint);  
68 - orderItem.setUsePoint(usePoint);  
69 - int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换  
70 - if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额  
71 - discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount();  
72 - }  
73 - TradePriceCalculatorHelper.addPromotion(result, orderItem,  
74 - param.getPointActivityId(), "积分商城活动", PromotionTypeEnum.POINT.getType(),  
75 - StrUtil.format("积分商城活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),  
76 - discountPrice);  
77 - // 3.2 更新 SKU 优惠金额  
78 - orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);  
79 - TradePriceCalculatorHelper.recountPayPrice(orderItem);  
80 - TradePriceCalculatorHelper.recountAllPrice(result);  
81 - }  
82 -  
83 - private PointValidateJoinRespDTO validateJoinPointActivity(Long userId, Long activityId, Long skuId, Integer count) {  
84 - // 1. 校验是否可以参与积分商城活动  
85 - PointValidateJoinRespDTO pointValidateJoinRespDTO = pointActivityApi.validateJoinPointActivity(activityId, skuId, count);  
86 - // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用  
87 - int pointProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.POINT);  
88 - if (pointProductCount + count > pointValidateJoinRespDTO.getCount()) {  
89 - throw exception(PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT);  
90 - }  
91 - return pointValidateJoinRespDTO;  
92 - }  
93 -  
94 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculator.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.hutool.core.util.BooleanUtil;  
4 -import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;  
5 -import cn.iocoder.yudao.module.member.api.config.MemberConfigApi;  
6 -import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO;  
7 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
8 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
9 -import lombok.extern.slf4j.Slf4j;  
10 -import org.springframework.core.annotation.Order;  
11 -import org.springframework.stereotype.Component;  
12 -  
13 -import jakarta.annotation.Resource;  
14 -import java.util.List;  
15 -import java.util.Optional;  
16 -  
17 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;  
18 -  
19 -/**  
20 - * 赠送积分的 {@link TradePriceCalculator} 实现类  
21 - *  
22 - * @author owen  
23 - */  
24 -@Component  
25 -@Order(TradePriceCalculator.ORDER_POINT_GIVE)  
26 -@Slf4j  
27 -public class TradePointGiveCalculator implements TradePriceCalculator {  
28 -  
29 - @Resource  
30 - private MemberConfigApi memberConfigApi;  
31 -  
32 - @Override  
33 - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {  
34 - // 1.1 校验积分功能是否开启  
35 - int givePointPerYuan = Optional.ofNullable(memberConfigApi.getConfig())  
36 - .filter(config -> BooleanUtil.isTrue(config.getPointTradeDeductEnable()))  
37 - .map(MemberConfigRespDTO::getPointTradeGivePoint)  
38 - .orElse(0);  
39 - if (givePointPerYuan <= 0) {  
40 - return;  
41 - }  
42 - // 1.2 校验支付金额  
43 - if (result.getPrice().getPayPrice() <= 0) {  
44 - return;  
45 - }  
46 -  
47 - // 2.1 计算赠送积分  
48 - int givePoint = MoneyUtils.calculateRatePriceFloor(result.getPrice().getPayPrice(), (double) givePointPerYuan);  
49 - // 2.2 计算分摊的赠送积分  
50 - List<TradePriceCalculateRespBO.OrderItem> orderItems = filterList(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSelected);  
51 - List<Integer> dividePoints = TradePriceCalculatorHelper.dividePrice(orderItems, givePoint);  
52 -  
53 - // 3.2 更新 SKU 赠送积分  
54 - for (int i = 0; i < orderItems.size(); i++) {  
55 - TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i);  
56 - // 商品可能赠送了积分,所以这里要加上  
57 - orderItem.setGivePoint(orderItem.getGivePoint() + dividePoints.get(i));  
58 - }  
59 - // 3.3 更新订单赠送积分  
60 - TradePriceCalculatorHelper.recountAllGivePoint(result);  
61 - }  
62 -  
63 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculator.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.hutool.core.util.BooleanUtil;  
4 -import cn.hutool.core.util.ObjectUtil;  
5 -import cn.hutool.core.util.StrUtil;  
6 -import cn.iocoder.yudao.module.member.api.config.MemberConfigApi;  
7 -import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO;  
8 -import cn.iocoder.yudao.module.member.api.user.MemberUserApi;  
9 -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;  
10 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;  
11 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
12 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
13 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
14 -import jakarta.annotation.Resource;  
15 -import lombok.extern.slf4j.Slf4j;  
16 -import org.springframework.core.annotation.Order;  
17 -import org.springframework.stereotype.Component;  
18 -  
19 -import java.util.List;  
20 -  
21 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
22 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;  
23 -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_PAY_PRICE_ILLEGAL;  
24 -  
25 -/**  
26 - * 使用积分的 {@link TradePriceCalculator} 实现类  
27 - *  
28 - * @author owen  
29 - */  
30 -@Component  
31 -@Order(TradePriceCalculator.ORDER_POINT_USE)  
32 -@Slf4j  
33 -public class TradePointUsePriceCalculator implements TradePriceCalculator {  
34 -  
35 - @Resource  
36 - private MemberConfigApi memberConfigApi;  
37 - @Resource  
38 - private MemberUserApi memberUserApi;  
39 -  
40 - @Override  
41 - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {  
42 - // 判断订单类型是否不为积分商城活动  
43 - if (ObjectUtil.equal(result.getType(), TradeOrderTypeEnum.POINT.getType())) {  
44 - return;  
45 - }  
46 - // 0. 初始化积分  
47 - MemberUserRespDTO user = memberUserApi.getUser(param.getUserId());  
48 - result.setTotalPoint(user.getPoint()).setUsePoint(0);  
49 -  
50 - // 1.1 校验是否使用积分  
51 - if (!BooleanUtil.isTrue(param.getPointStatus())) {  
52 - return;  
53 - }  
54 - // 1.2 校验积分抵扣是否开启  
55 - MemberConfigRespDTO config = memberConfigApi.getConfig();  
56 - if (!isDeductPointEnable(config)) {  
57 - return;  
58 - }  
59 - // 1.3 校验用户积分余额  
60 - if (user.getPoint() == null || user.getPoint() <= 0) {  
61 - return;  
62 - }  
63 -  
64 - // 2.1 计算积分优惠金额  
65 - int pointPrice = calculatePointPrice(config, user.getPoint(), result);  
66 - // 2.2 计算分摊的积分、抵扣金额  
67 - List<TradePriceCalculateRespBO.OrderItem> orderItems = filterList(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSelected);  
68 - List<Integer> dividePointPrices = TradePriceCalculatorHelper.dividePrice(orderItems, pointPrice);  
69 - List<Integer> divideUsePoints = TradePriceCalculatorHelper.dividePrice(orderItems, result.getUsePoint());  
70 -  
71 - // 3.1 记录优惠明细  
72 - TradePriceCalculatorHelper.addPromotion(result, orderItems,  
73 - param.getUserId(), "积分抵扣", PromotionTypeEnum.POINT.getType(),  
74 - StrUtil.format("积分抵扣:省 {} 元", TradePriceCalculatorHelper.formatPrice(pointPrice)),  
75 - dividePointPrices);  
76 - // 3.2 更新 SKU 优惠金额  
77 - for (int i = 0; i < orderItems.size(); i++) {  
78 - TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i);  
79 - orderItem.setPointPrice(dividePointPrices.get(i));  
80 - orderItem.setUsePoint(divideUsePoints.get(i));  
81 - TradePriceCalculatorHelper.recountPayPrice(orderItem);  
82 - }  
83 - TradePriceCalculatorHelper.recountAllPrice(result);  
84 - }  
85 -  
86 - private boolean isDeductPointEnable(MemberConfigRespDTO config) {  
87 - return config != null &&  
88 - BooleanUtil.isTrue(config.getPointTradeDeductEnable()) && // 积分功能是否启用  
89 - config.getPointTradeDeductUnitPrice() != null && config.getPointTradeDeductUnitPrice() > 0; // 有没有配置:1 积分抵扣多少分  
90 - }  
91 -  
92 - private Integer calculatePointPrice(MemberConfigRespDTO config, Integer usePoint, TradePriceCalculateRespBO result) {  
93 - // 每个订单最多可以使用的积分数量  
94 - if (config.getPointTradeDeductMaxPrice() != null && config.getPointTradeDeductMaxPrice() > 0) {  
95 - usePoint = Math.min(usePoint, config.getPointTradeDeductMaxPrice());  
96 - }  
97 - // TODO @疯狂:这里应该是,抵扣到只剩下 0.01;  
98 - // 积分优惠金额(分)  
99 - int pointPrice = usePoint * config.getPointTradeDeductUnitPrice();  
100 - if (result.getPrice().getPayPrice() <= pointPrice) {  
101 - // 禁止 0 元购  
102 - throw exception(PRICE_CALCULATE_PAY_PRICE_ILLEGAL);  
103 - }  
104 -// // 允许0 元购!!!:用户积分比较多时,积分可以抵扣的金额要大于支付金额,这时需要根据支付金额反推使用多少积分  
105 -// if (result.getPrice().getPayPrice() < pointPrice) {  
106 -// pointPrice = result.getPrice().getPayPrice();  
107 -// // 反推需要扣除的积分  
108 -// usePoint = NumberUtil.toBigDecimal(pointPrice)  
109 -// .divide(NumberUtil.toBigDecimal(config.getPointTradeDeductUnitPrice()), 0, RoundingMode.HALF_UP)  
110 -// .intValue();  
111 -// }  
112 - // 记录使用的积分  
113 - result.setUsePoint(usePoint);  
114 - return pointPrice;  
115 - }  
116 -  
117 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculator.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
4 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
5 -  
6 -/**  
7 - * 价格计算的计算器接口  
8 - *  
9 - * 优惠计算顺序:  
10 - * 1. <a href="https://help.youzan.com/displaylist/detail_4_4-1-53316">积分抵现、会员价、优惠券、粉丝专享价、满减送哪个优先计算?</>  
11 - *  
12 - * @author 芋道源码  
13 - */  
14 -public interface TradePriceCalculator {  
15 -  
16 - int ORDER_SECKILL_ACTIVITY = 8;  
17 - int ORDER_BARGAIN_ACTIVITY = 8;  
18 - int ORDER_COMBINATION_ACTIVITY = 8;  
19 - int ORDER_POINT_ACTIVITY = 8;  
20 -  
21 - int ORDER_DISCOUNT_ACTIVITY = 10;  
22 - int ORDER_REWARD_ACTIVITY = 20;  
23 - int ORDER_COUPON = 30;  
24 - int ORDER_POINT_USE = 40;  
25 - /**  
26 - * 快递运费的计算  
27 - *  
28 - * 放在各种营销活动、优惠劵后面  
29 - */  
30 - int ORDER_DELIVERY = 50;  
31 - /**  
32 - * 赠送积分,放最后  
33 - *  
34 - * 放在 {@link #ORDER_DELIVERY} 后面的原因,是运费也会产生费用,需要赠送对应积分  
35 - */  
36 - int ORDER_POINT_GIVE = 999;  
37 -  
38 - void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result);  
39 -  
40 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeSeckillActivityPriceCalculator.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.hutool.core.lang.Assert;  
4 -import cn.hutool.core.util.StrUtil;  
5 -import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;  
6 -import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO;  
7 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;  
8 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
9 -import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;  
10 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
11 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
12 -import jakarta.annotation.Resource;  
13 -import org.springframework.core.annotation.Order;  
14 -import org.springframework.stereotype.Component;  
15 -  
16 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
17 -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT;  
18 -  
19 -// TODO huihui:单测需要补充  
20 -/**  
21 - * 秒杀活动的 {@link TradePriceCalculator} 实现类  
22 - *  
23 - * @author HUIHUI  
24 - */  
25 -@Component  
26 -@Order(TradePriceCalculator.ORDER_SECKILL_ACTIVITY)  
27 -public class TradeSeckillActivityPriceCalculator implements TradePriceCalculator {  
28 -  
29 - @Resource  
30 - private SeckillActivityApi seckillActivityApi;  
31 -  
32 - @Resource  
33 - private TradeOrderQueryService tradeOrderQueryService;  
34 -  
35 - @Override  
36 - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {  
37 - // 1. 判断订单类型和是否具有秒杀活动编号  
38 - if (param.getSeckillActivityId() == null) {  
39 - return;  
40 - }  
41 - Assert.isTrue(param.getItems().size() == 1, "秒杀时,只允许选择一个商品");  
42 - // 2. 校验是否可以参与秒杀  
43 - TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);  
44 - SeckillValidateJoinRespDTO seckillActivity = validateJoinSeckill(  
45 - param.getUserId(), param.getSeckillActivityId(),  
46 - orderItem.getSkuId(), orderItem.getCount());  
47 -  
48 - // 3.1 记录优惠明细  
49 - Integer discountPrice = orderItem.getPayPrice() - seckillActivity.getSeckillPrice() * orderItem.getCount();  
50 - TradePriceCalculatorHelper.addPromotion(result, orderItem,  
51 - param.getSeckillActivityId(), seckillActivity.getName(), PromotionTypeEnum.SECKILL_ACTIVITY.getType(),  
52 - StrUtil.format("秒杀活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),  
53 - discountPrice);  
54 - // 3.2 更新 SKU 优惠金额  
55 - orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);  
56 - TradePriceCalculatorHelper.recountPayPrice(orderItem);  
57 - TradePriceCalculatorHelper.recountAllPrice(result);  
58 - }  
59 -  
60 - private SeckillValidateJoinRespDTO validateJoinSeckill(Long userId, Long activityId, Long skuId, Integer count) {  
61 - // 1. 校验是否可以参与秒杀  
62 - SeckillValidateJoinRespDTO seckillActivity = seckillActivityApi.validateJoinSeckill(activityId, skuId, count);  
63 - // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用  
64 - int seckillProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.SECKILL);  
65 - if (seckillProductCount + count > seckillActivity.getTotalLimitCount()) {  
66 - throw exception(PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT);  
67 - }  
68 - return seckillActivity;  
69 - }  
70 -  
71 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/resources/mapper/brokerage/BrokerageUserMapper.xml deleted
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
3 -<mapper namespace="cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageUserMapper">  
4 -  
5 - <select id="selectSummaryPageByUserId"  
6 - resultType="cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO">  
7 -  
8 - SELECT bu.id, bu.bind_user_time AS brokerageTime,  
9 - (SELECT SUM(price) FROM trade_brokerage_record r  
10 - WHERE r.user_id = bu.id AND biz_type = #{bizType} AND r.status = #{status} AND r.deleted = FALSE) AS brokeragePrice,  
11 - (SELECT COUNT(1) FROM trade_brokerage_record r  
12 - WHERE r.user_id = bu.id AND biz_type = #{bizType} AND r.status = #{status} AND r.deleted = FALSE) AS brokerageOrderCount,  
13 - (SELECT COUNT(1) FROM trade_brokerage_user c  
14 - WHERE c.bind_user_id = bu.id AND c.deleted = FALSE) AS brokerageUserCount  
15 - FROM trade_brokerage_user AS bu  
16 - <where>  
17 - bu.deleted = false  
18 - <if test="ids != null and ids.size() > 0">  
19 - and bu.id in  
20 - <foreach collection="ids" open="(" item="id" separator="," close=")">  
21 - #{id}  
22 - </foreach>  
23 - </if>  
24 - </where>  
25 - <choose>  
26 - <when test="sortingField.field == 'userCount'">  
27 - ORDER BY brokerageUserCount ${sortingField.order}  
28 - </when>  
29 - <when test="sortingField.field == 'orderCount'">  
30 - ORDER BY brokerageOrderCount ${sortingField.order}  
31 - </when>  
32 - <when test="sortingField.field == 'price'">  
33 - ORDER BY brokeragePrice ${sortingField.order}  
34 - </when>  
35 - <otherwise>  
36 - ORDER BY bu.bind_user_time DESC  
37 - </otherwise>  
38 - </choose>  
39 - </select>  
40 -  
41 -</mapper>  
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/Kd100ExpressClientIntegrationTest.java deleted
1 -package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.json.JsonUtils;  
4 -import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;  
5 -import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;  
6 -import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;  
7 -import cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl.kd100.Kd100ExpressClient;  
8 -import lombok.extern.slf4j.Slf4j;  
9 -import org.junit.jupiter.api.BeforeEach;  
10 -import org.junit.jupiter.api.Disabled;  
11 -import org.junit.jupiter.api.Test;  
12 -import org.springframework.boot.web.client.RestTemplateBuilder;  
13 -import org.springframework.web.client.RestTemplate;  
14 -  
15 -import java.util.List;  
16 -  
17 -/**  
18 - * {@link Kd100ExpressClient} 的集成测试  
19 - *  
20 - * @author jason  
21 - */  
22 -@Slf4j  
23 -public class Kd100ExpressClientIntegrationTest {  
24 -  
25 - private Kd100ExpressClient client;  
26 -  
27 - @BeforeEach  
28 - public void init() {  
29 - RestTemplate restTemplate = new RestTemplateBuilder().build();  
30 - TradeExpressProperties.Kd100Config config = new TradeExpressProperties.Kd100Config()  
31 - .setKey("pLXUGAwK5305")  
32 - .setCustomer("E77DF18BE109F454A5CD319E44BF5177");  
33 - client = new Kd100ExpressClient(restTemplate, config);  
34 - }  
35 -  
36 - @Test  
37 - @Disabled("集成测试,暂时忽略")  
38 - public void testGetExpressTrackList() {  
39 - ExpressTrackQueryReqDTO reqDTO = new ExpressTrackQueryReqDTO();  
40 - reqDTO.setExpressCode("STO");  
41 - reqDTO.setLogisticsNo("773220402764314");  
42 - List<ExpressTrackRespDTO> tracks = client.getExpressTrackList(reqDTO);  
43 - System.out.println(JsonUtils.toJsonPrettyString(tracks));  
44 - }  
45 -  
46 -}  
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/KdNiaoExpressClientIntegrationTest.java deleted
1 -package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.json.JsonUtils;  
4 -import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;  
5 -import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;  
6 -import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;  
7 -import cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl.kdniao.KdNiaoExpressClient;  
8 -import lombok.extern.slf4j.Slf4j;  
9 -import org.junit.jupiter.api.BeforeEach;  
10 -import org.junit.jupiter.api.Disabled;  
11 -import org.junit.jupiter.api.Test;  
12 -import org.springframework.boot.web.client.RestTemplateBuilder;  
13 -import org.springframework.web.client.RestTemplate;  
14 -  
15 -import java.util.List;  
16 -  
17 -/**  
18 - * {@link KdNiaoExpressClient} 的集成测试  
19 - *  
20 - * @author jason  
21 - */  
22 -@Slf4j  
23 -public class KdNiaoExpressClientIntegrationTest {  
24 -  
25 - private KdNiaoExpressClient client;  
26 -  
27 - @BeforeEach  
28 - public void init() {  
29 - RestTemplate restTemplate = new RestTemplateBuilder().build();  
30 - TradeExpressProperties.KdNiaoConfig config = new TradeExpressProperties.KdNiaoConfig()  
31 - .setApiKey("cb022f1e-48f1-4c4a-a723-9001ac9676b8")  
32 - .setBusinessId("1809751");  
33 - client = new KdNiaoExpressClient(restTemplate, config);  
34 - }  
35 -  
36 - @Test  
37 - @Disabled("集成测试,暂时忽略")  
38 - public void testGetExpressTrackList() {  
39 - ExpressTrackQueryReqDTO reqDTO = new ExpressTrackQueryReqDTO();  
40 - reqDTO.setExpressCode("STO");  
41 - reqDTO.setLogisticsNo("777168349863987");  
42 - List<ExpressTrackRespDTO> tracks = client.getExpressTrackList(reqDTO);  
43 - System.out.println(JsonUtils.toJsonPrettyString(tracks));  
44 - }  
45 -  
46 -}  
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.trade.service.brokerage;  
2 -  
3 -import cn.hutool.core.util.NumberUtil;  
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
6 -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;  
7 -import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;  
8 -import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageRecordMapper;  
9 -import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;  
10 -import org.junit.jupiter.api.Disabled;  
11 -import org.junit.jupiter.api.Test;  
12 -import org.springframework.boot.test.mock.mockito.MockBean;  
13 -import org.springframework.context.annotation.Import;  
14 -  
15 -import jakarta.annotation.Resource;  
16 -import java.math.RoundingMode;  
17 -  
18 -import static cn.hutool.core.util.RandomUtil.randomEle;  
19 -import static cn.hutool.core.util.RandomUtil.randomInt;  
20 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;  
21 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;  
22 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;  
23 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomInteger;  
24 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;  
25 -import static org.junit.jupiter.api.Assertions.assertEquals;  
26 -  
27 -// TODO @芋艿:单测后续看看  
28 -/**  
29 - * {@link BrokerageRecordServiceImpl} 的单元测试类  
30 - *  
31 - * @author owen  
32 - */  
33 -@Disabled // TODO 芋艿:后续 fix 补充的单测  
34 -@Import(BrokerageRecordServiceImpl.class)  
35 -public class BrokerageRecordServiceImplTest extends BaseDbUnitTest {  
36 -  
37 - @Resource  
38 - private BrokerageRecordServiceImpl brokerageRecordService;  
39 - @Resource  
40 - private BrokerageRecordMapper brokerageRecordMapper;  
41 -  
42 - @MockBean  
43 - private TradeConfigService tradeConfigService;  
44 - @MockBean  
45 - private BrokerageUserService brokerageUserService;  
46 -  
47 - @Test  
48 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
49 - public void testGetBrokerageRecordPage() {  
50 - // mock 数据  
51 - BrokerageRecordDO dbBrokerageRecord = randomPojo(BrokerageRecordDO.class, o -> { // 等会查询到  
52 - o.setUserId(null);  
53 - o.setBizType(null);  
54 - o.setStatus(null);  
55 - o.setCreateTime(null);  
56 - });  
57 - brokerageRecordMapper.insert(dbBrokerageRecord);  
58 - // 测试 userId 不匹配  
59 - brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setUserId(null)));  
60 - // 测试 bizType 不匹配  
61 - brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setBizType(null)));  
62 - // 测试 status 不匹配  
63 - brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setStatus(null)));  
64 - // 测试 createTime 不匹配  
65 - brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setCreateTime(null)));  
66 - // 准备参数  
67 - BrokerageRecordPageReqVO reqVO = new BrokerageRecordPageReqVO();  
68 - reqVO.setUserId(null);  
69 - reqVO.setBizType(null);  
70 - reqVO.setStatus(null);  
71 - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));  
72 -  
73 - // 调用  
74 - PageResult<BrokerageRecordDO> pageResult = brokerageRecordService.getBrokerageRecordPage(reqVO);  
75 - // 断言  
76 - assertEquals(1, pageResult.getTotal());  
77 - assertEquals(1, pageResult.getList().size());  
78 - assertPojoEquals(dbBrokerageRecord, pageResult.getList().get(0));  
79 - }  
80 -  
81 - @Test  
82 - public void testCalculatePrice_useFixedPrice() {  
83 - // mock 数据  
84 - Integer payPrice = randomInteger();  
85 - Integer percent = randomInt(1, 101);  
86 - Integer fixedPrice = randomInt();  
87 - // 调用  
88 - int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);  
89 - // 断言  
90 - assertEquals(brokerage, fixedPrice);  
91 - }  
92 -  
93 - @Test  
94 - public void testCalculatePrice_usePercent() {  
95 - // mock 数据  
96 - Integer payPrice = randomInteger();  
97 - Integer percent = randomInt(1, 101);  
98 - Integer fixedPrice = randomEle(new Integer[]{0, null});  
99 - System.out.println("fixedPrice=" + fixedPrice);  
100 - // 调用  
101 - int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);  
102 - // 断言  
103 - assertEquals(brokerage, NumberUtil.div(NumberUtil.mul(payPrice, percent), 100, 0, RoundingMode.DOWN).intValue());  
104 - }  
105 -  
106 - @Test  
107 - public void testCalculatePrice_equalsZero() {  
108 - // mock 数据  
109 - Integer payPrice = null;  
110 - Integer percent = null;  
111 - Integer fixedPrice = null;  
112 - // 调用  
113 - int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);  
114 - // 断言  
115 - assertEquals(brokerage, 0);  
116 - }  
117 -}  
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.trade.service.brokerage;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
5 -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;  
6 -import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;  
7 -import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageUserMapper;  
8 -import org.junit.jupiter.api.Disabled;  
9 -import org.junit.jupiter.api.Test;  
10 -import org.springframework.context.annotation.Import;  
11 -  
12 -import jakarta.annotation.Resource;  
13 -  
14 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;  
15 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;  
16 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;  
17 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;  
18 -import static org.junit.jupiter.api.Assertions.assertEquals;  
19 -  
20 -// TODO @芋艿:单测后续看看  
21 -/**  
22 - * {@link BrokerageUserServiceImpl} 的单元测试类  
23 - *  
24 - * @author owen  
25 - */  
26 -@Disabled // TODO 芋艿:后续 fix 补充的单测  
27 -@Import(BrokerageUserServiceImpl.class)  
28 -public class BrokerageUserServiceImplTest extends BaseDbUnitTest {  
29 -  
30 - @Resource  
31 - private BrokerageUserServiceImpl brokerageUserService;  
32 -  
33 - @Resource  
34 - private BrokerageUserMapper brokerageUserMapper;  
35 -  
36 - @Test  
37 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
38 - public void testGetBrokerageUserPage() {  
39 - // mock 数据  
40 - BrokerageUserDO dbBrokerageUser = randomPojo(BrokerageUserDO.class, o -> { // 等会查询到  
41 - o.setBindUserId(null);  
42 - o.setBrokerageEnabled(null);  
43 - o.setCreateTime(null);  
44 - });  
45 - brokerageUserMapper.insert(dbBrokerageUser);  
46 - // 测试 brokerageUserId 不匹配  
47 - brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setBindUserId(null)));  
48 - // 测试 brokerageEnabled 不匹配  
49 - brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setBrokerageEnabled(null)));  
50 - // 测试 createTime 不匹配  
51 - brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setCreateTime(null)));  
52 - // 准备参数  
53 - BrokerageUserPageReqVO reqVO = new BrokerageUserPageReqVO();  
54 - reqVO.setBindUserId(null);  
55 - reqVO.setBrokerageEnabled(null);  
56 - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));  
57 -  
58 - // 调用  
59 - PageResult<BrokerageUserDO> pageResult = brokerageUserService.getBrokerageUserPage(reqVO);  
60 - // 断言  
61 - assertEquals(1, pageResult.getTotal());  
62 - assertEquals(1, pageResult.getList().size());  
63 - assertPojoEquals(dbBrokerageUser, pageResult.getList().get(0));  
64 - }  
65 -  
66 -}  
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.trade.service.brokerage;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
5 -import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;  
6 -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO;  
7 -import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO;  
8 -import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageWithdrawMapper;  
9 -import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;  
10 -import jakarta.annotation.Resource;  
11 -import jakarta.validation.Validator;  
12 -import org.junit.jupiter.api.Disabled;  
13 -import org.junit.jupiter.api.Test;  
14 -import org.springframework.boot.test.mock.mockito.MockBean;  
15 -import org.springframework.context.annotation.Import;  
16 -  
17 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;  
18 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;  
19 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;  
20 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;  
21 -import static org.junit.jupiter.api.Assertions.assertEquals;  
22 -  
23 -// TODO 芋艿:后续 review  
24 -/**  
25 - * {@link BrokerageWithdrawServiceImpl} 的单元测试类  
26 - *  
27 - * @author 芋道源码  
28 - */  
29 -@Disabled // TODO 芋艿:后续 fix 补充的单测  
30 -@Import(BrokerageWithdrawServiceImpl.class)  
31 -public class BrokerageWithdrawServiceImplTest extends BaseDbUnitTest {  
32 -  
33 - @Resource  
34 - private BrokerageWithdrawServiceImpl brokerageWithdrawService;  
35 -  
36 - @Resource  
37 - private BrokerageWithdrawMapper brokerageWithdrawMapper;  
38 -  
39 - @MockBean  
40 - private BrokerageRecordService brokerageRecordService;  
41 - @MockBean  
42 - private BrokerageUserService brokerageUserService;  
43 - @MockBean  
44 - private TradeConfigService tradeConfigService;  
45 -  
46 - @MockBean  
47 - private NotifyMessageSendApi notifyMessageSendApi;  
48 -  
49 - @Resource  
50 - private Validator validator;  
51 -  
52 - @Test  
53 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
54 - public void testGetBrokerageWithdrawPage() {  
55 - // mock 数据  
56 - BrokerageWithdrawDO dbBrokerageWithdraw = randomPojo(BrokerageWithdrawDO.class, o -> { // 等会查询到  
57 - o.setUserId(null);  
58 - o.setType(null);  
59 - o.setUserName(null);  
60 - o.setUserAccount(null);  
61 - o.setBankName(null);  
62 - o.setStatus(null);  
63 - o.setCreateTime(null);  
64 - });  
65 - brokerageWithdrawMapper.insert(dbBrokerageWithdraw);  
66 - // 测试 userId 不匹配  
67 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setUserId(null)));  
68 - // 测试 type 不匹配  
69 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setType(null)));  
70 - // 测试 name 不匹配  
71 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setUserName(null)));  
72 - // 测试 accountNo 不匹配  
73 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setUserAccount(null)));  
74 - // 测试 bankName 不匹配  
75 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setBankName(null)));  
76 - // 测试 status 不匹配  
77 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setStatus(null)));  
78 - // 测试 auditReason 不匹配  
79 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setAuditReason(null)));  
80 - // 测试 auditTime 不匹配  
81 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setAuditTime(null)));  
82 - // 测试 remark 不匹配  
83 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setRemark(null)));  
84 - // 测试 createTime 不匹配  
85 - brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setCreateTime(null)));  
86 - // 准备参数  
87 - BrokerageWithdrawPageReqVO reqVO = new BrokerageWithdrawPageReqVO();  
88 - reqVO.setUserId(null);  
89 - reqVO.setType(null);  
90 - reqVO.setUserName(null);  
91 - reqVO.setUserAccount(null);  
92 - reqVO.setBankName(null);  
93 - reqVO.setStatus(null);  
94 - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));  
95 -  
96 - // 调用  
97 - PageResult<BrokerageWithdrawDO> pageResult = brokerageWithdrawService.getBrokerageWithdrawPage(reqVO);  
98 - // 断言  
99 - assertEquals(1, pageResult.getTotal());  
100 - assertEquals(1, pageResult.getList().size());  
101 - assertPojoEquals(dbBrokerageWithdraw, pageResult.getList().get(0));  
102 - }  
103 -  
104 - @Test  
105 - public void testCalculateFeePrice() {  
106 - //Integer withdrawPrice = 100;  
107 - //// 测试手续费比例未设置  
108 - //Integer percent = null;  
109 - //assertEquals(brokerageWithdrawService.calculateFeePrice(withdrawPrice, percent), 0);  
110 - //// 测试手续费给为0  
111 - //percent = 0;  
112 - //assertEquals(brokerageWithdrawService.calculateFeePrice(withdrawPrice, percent), 0);  
113 - //// 测试手续费  
114 - //percent = 1;  
115 - //assertEquals(brokerageWithdrawService.calculateFeePrice(withdrawPrice, percent), 1);  
116 - }  
117 -}  
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;  
4 -import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi;  
5 -import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO;  
6 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;  
7 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;  
8 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
9 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
10 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
11 -import org.junit.jupiter.api.Disabled;  
12 -import org.junit.jupiter.api.Test;  
13 -import org.mockito.InjectMocks;  
14 -import org.mockito.Mock;  
15 -  
16 -import java.util.ArrayList;  
17 -  
18 -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;  
19 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;  
20 -import static java.util.Arrays.asList;  
21 -import static org.junit.jupiter.api.Assertions.*;  
22 -import static org.mockito.ArgumentMatchers.eq;  
23 -import static org.mockito.Mockito.when;  
24 -  
25 -/**  
26 - * {@link TradeDiscountActivityPriceCalculator} 的单元测试类  
27 - *  
28 - * @author 芋道源码  
29 - */  
30 -@Disabled // TODO 芋艿:后续修复  
31 -public class TradeDiscountActivityPriceCalculatorTest extends BaseMockitoUnitTest {  
32 -  
33 - @InjectMocks  
34 - private TradeDiscountActivityPriceCalculator tradeDiscountActivityPriceCalculator;  
35 -  
36 - @Mock  
37 - private DiscountActivityApi discountActivityApi;  
38 -  
39 - @Test  
40 - public void testCalculate() {  
41 - // 准备参数  
42 - TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()  
43 - .setItems(asList(  
44 - new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 匹配活动,且已选中  
45 - new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中  
46 - ));  
47 - TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()  
48 - .setType(TradeOrderTypeEnum.NORMAL.getType())  
49 - .setPrice(new TradePriceCalculateRespBO.Price())  
50 - .setPromotions(new ArrayList<>())  
51 - .setItems(asList(  
52 - new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)  
53 - .setPrice(100),  
54 - new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(false)  
55 - .setPrice(50)  
56 - ));  
57 - // 保证价格被初始化上  
58 - TradePriceCalculatorHelper.recountPayPrice(result.getItems());  
59 - TradePriceCalculatorHelper.recountAllPrice(result);  
60 -  
61 - // mock 方法(限时折扣活动)  
62 - when(discountActivityApi.getMatchDiscountProductListBySkuIds(eq(asSet(10L, 20L)))).thenReturn(asList(  
63 - randomPojo(DiscountProductRespDTO.class, o -> o.setActivityId(1000L)  
64 - .setActivityName("活动 1000 号").setSkuId(10L)  
65 - .setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(40)),  
66 - randomPojo(DiscountProductRespDTO.class, o -> o.setActivityId(2000L)  
67 - .setActivityName("活动 2000 号").setSkuId(20L)  
68 - .setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(60))  
69 - ));  
70 - // 10L: 100 * 2 - 40 * 2 = 120  
71 - // 20L:50 * 3 - 50 * 3 * 0.4 = 90  
72 -  
73 - // 调用  
74 - tradeDiscountActivityPriceCalculator.calculate(param, result);  
75 - // 断言:Price 部分  
76 - TradePriceCalculateRespBO.Price price = result.getPrice();  
77 - assertEquals(price.getTotalPrice(), 200);  
78 - assertEquals(price.getDiscountPrice(), 80);  
79 - assertEquals(price.getPointPrice(), 0);  
80 - assertEquals(price.getDeliveryPrice(), 0);  
81 - assertEquals(price.getCouponPrice(), 0);  
82 - assertEquals(price.getPayPrice(), 120);  
83 - assertNull(result.getCouponId());  
84 - // 断言:SKU 1  
85 - assertEquals(result.getItems().size(), 2);  
86 - TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);  
87 - assertEquals(orderItem01.getSkuId(), 10L);  
88 - assertEquals(orderItem01.getCount(), 2);  
89 - assertEquals(orderItem01.getPrice(), 100);  
90 - assertEquals(orderItem01.getDiscountPrice(), 80);  
91 - assertEquals(orderItem01.getDeliveryPrice(), 0);  
92 - assertEquals(orderItem01.getCouponPrice(), 0);  
93 - assertEquals(orderItem01.getPointPrice(), 0);  
94 - assertEquals(orderItem01.getPayPrice(), 120);  
95 - // 断言:SKU 2  
96 - TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);  
97 - assertEquals(orderItem02.getSkuId(), 20L);  
98 - assertEquals(orderItem02.getCount(), 3);  
99 - assertEquals(orderItem02.getPrice(), 50);  
100 - assertEquals(orderItem02.getDiscountPrice(), 60);  
101 - assertEquals(orderItem02.getDeliveryPrice(), 0);  
102 - assertEquals(orderItem02.getCouponPrice(), 0);  
103 - assertEquals(orderItem02.getPointPrice(), 0);  
104 - assertEquals(orderItem02.getPayPrice(), 90);  
105 - // 断言:Promotion 部分  
106 - assertEquals(result.getPromotions().size(), 1);  
107 - TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0);  
108 - assertEquals(promotion01.getId(), 1000L);  
109 - assertEquals(promotion01.getName(), "活动 1000 号");  
110 - assertEquals(promotion01.getType(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType());  
111 - assertEquals(promotion01.getTotalPrice(), 200);  
112 - assertEquals(promotion01.getDiscountPrice(), 80);  
113 - assertTrue(promotion01.getMatch());  
114 - assertEquals(promotion01.getDescription(), "限时折扣:省 0.80 元");  
115 - TradePriceCalculateRespBO.PromotionItem promotionItem01 = promotion01.getItems().get(0);  
116 - assertEquals(promotion01.getItems().size(), 1);  
117 - assertEquals(promotionItem01.getSkuId(), 10L);  
118 - assertEquals(promotionItem01.getTotalPrice(), 200);  
119 - assertEquals(promotionItem01.getDiscountPrice(), 80);  
120 - }  
121 -  
122 -}  
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculatorTest.java deleted
1 -package cn.iocoder.yudao.module.trade.service.price.calculator;  
2 -  
3 -import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;  
4 -import cn.iocoder.yudao.module.member.api.config.MemberConfigApi;  
5 -import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO;  
6 -import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;  
7 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;  
8 -import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;  
9 -import org.junit.jupiter.api.Test;  
10 -import org.mockito.InjectMocks;  
11 -import org.mockito.Mock;  
12 -  
13 -import java.util.ArrayList;  
14 -  
15 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;  
16 -import static java.util.Arrays.asList;  
17 -import static org.junit.jupiter.api.Assertions.assertEquals;  
18 -import static org.mockito.Mockito.when;  
19 -  
20 -// TODO 芋艿:晚点 review  
21 -/**  
22 - * {@link TradePointGiveCalculator} 的单元测试类  
23 - *  
24 - * @author owen  
25 - */  
26 -public class TradePointGiveCalculatorTest extends BaseMockitoUnitTest {  
27 -  
28 - @InjectMocks  
29 - private TradePointGiveCalculator tradePointGiveCalculator;  
30 -  
31 - @Mock  
32 - private MemberConfigApi memberConfigApi;  
33 -  
34 - @Test  
35 - public void testCalculate() {  
36 -  
37 - // 准备参数  
38 - TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()  
39 - .setUserId(233L)  
40 - .setItems(asList(  
41 - new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 全局积分  
42 - new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 全局积分 + SKU 积分  
43 - new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(false), // 全局积分,但是未选中  
44 - new TradePriceCalculateReqBO.Item().setSkuId(40L).setCount(5).setSelected(false) // 全局积分 + SKU 积分,但是未选中  
45 - ));  
46 - TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()  
47 - .setType(TradeOrderTypeEnum.NORMAL.getType())  
48 - .setPrice(new TradePriceCalculateRespBO.Price())  
49 - .setPromotions(new ArrayList<>())  
50 - .setItems(asList(  
51 - new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)  
52 - .setPrice(100).setSpuId(1L).setGivePoint(0),  
53 - new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true)  
54 - .setPrice(50).setSpuId(2L).setGivePoint(100),  
55 - new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(4).setSelected(false)  
56 - .setPrice(30).setSpuId(3L).setGivePoint(0),  
57 - new TradePriceCalculateRespBO.OrderItem().setSkuId(40L).setCount(5).setSelected(false)  
58 - .setPrice(60).setSpuId(1L).setGivePoint(100)  
59 - ));  
60 - // 保证价格被初始化上  
61 - TradePriceCalculatorHelper.recountPayPrice(result.getItems());  
62 - TradePriceCalculatorHelper.recountAllPrice(result);  
63 -  
64 - // mock 方法(积分配置 信息)  
65 - MemberConfigRespDTO memberConfig = randomPojo(MemberConfigRespDTO.class,  
66 - o -> o.setPointTradeDeductEnable(true) // 启用积分折扣  
67 - .setPointTradeGivePoint(100)); // 1 元赠送多少分  
68 - when(memberConfigApi.getConfig()).thenReturn(memberConfig);  
69 -  
70 - // 调用  
71 - tradePointGiveCalculator.calculate(param, result);  
72 - // 断言:Price 部分  
73 - assertEquals(result.getGivePoint(), 2 * 100 + 3 * 50 + 100);  
74 - // 断言:SKU 1  
75 - TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);  
76 - assertEquals(orderItem01.getSkuId(), 10L);  
77 - assertEquals(orderItem01.getCount(), 2);  
78 - assertEquals(orderItem01.getPrice(), 100);  
79 - assertEquals(orderItem01.getGivePoint(), 2 * 100); // 全局积分  
80 - // 断言:SKU 2  
81 - TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);  
82 - assertEquals(orderItem02.getSkuId(), 20L);  
83 - assertEquals(orderItem02.getCount(), 3);  
84 - assertEquals(orderItem02.getPrice(), 50);  
85 - assertEquals(orderItem02.getGivePoint(), 3 * 50 + 100); // 全局积分 + SKU 积分  
86 - // 断言:SKU 3  
87 - TradePriceCalculateRespBO.OrderItem orderItem03 = result.getItems().get(2);  
88 - assertEquals(orderItem03.getSkuId(), 30L);  
89 - assertEquals(orderItem03.getCount(), 4);  
90 - assertEquals(orderItem03.getPrice(), 30);  
91 - assertEquals(orderItem03.getGivePoint(), 0); // 全局积分,但是未选中  
92 - // 断言:SKU 4  
93 - TradePriceCalculateRespBO.OrderItem orderItem04 = result.getItems().get(3);  
94 - assertEquals(orderItem04.getSkuId(), 40L);  
95 - assertEquals(orderItem04.getCount(), 5);  
96 - assertEquals(orderItem04.getPrice(), 60);  
97 - assertEquals(orderItem04.getGivePoint(), 100); // 全局积分 + SKU 积分,但是未选中  
98 - }  
99 -}  
yudao-module-mall/yudao-module-trade-biz/src/test/resources/application-unit-test.yaml deleted
1 -spring:  
2 - main:  
3 - lazy-initialization: true # 开启懒加载,加快速度  
4 - banner-mode: off # 单元测试,禁用 Banner  
5 -  
6 ---- #################### 数据库相关配置 ####################  
7 -  
8 -spring:  
9 - # 数据源配置项  
10 - datasource:  
11 - name: ruoyi-vue-pro  
12 - url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写  
13 - driver-class-name: org.h2.Driver  
14 - username: sa  
15 - password:  
16 - druid:  
17 - async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度  
18 - initial-size: 1 # 单元测试,配置为 1,提升启动速度  
19 - sql:  
20 - init:  
21 - schema-locations: classpath:/sql/create_tables.sql  
22 -  
23 - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优  
24 - data:  
25 - redis:  
26 - host: 127.0.0.1 # 地址  
27 - port: 16379 # 端口(单元测试,使用 16379 端口)  
28 - database: 0 # 数据库索引  
29 -  
30 -mybatis:  
31 - lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试  
32 -  
33 ---- #################### 定时任务相关配置 ####################  
34 -  
35 ---- #################### 配置中心相关配置 ####################  
36 -  
37 ---- #################### 服务保障相关配置 ####################  
38 -  
39 -# Lock4j 配置项(单元测试,禁用 Lock4j)  
40 -  
41 ---- #################### 监控相关配置 ####################  
42 -  
43 ---- #################### 芋道相关配置 ####################  
44 -  
45 -# 芋道配置项,设置当前项目所有自定义的配置  
46 -yudao:  
47 - info:  
48 - base-package: cn.iocoder.yudao.module  
49 - trade:  
50 - order:  
51 - app-id: 1  
52 - merchant-order-id: 1  
53 - express:  
54 - kd-niao:  
55 - api-key: xxxx  
56 - business-id: xxxxx  
57 - kd100:  
58 - customer: xxxxx  
59 - key: xxxxx  
60 - client: not_provide  
61 \ No newline at end of file 0 \ No newline at end of file
yudao-module-mall/yudao-module-trade-biz/pom.xml renamed to yudao-module-mall/yudao-module-trade/pom.xml
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 <version>${revision}</version> 8 <version>${revision}</version>
9 </parent> 9 </parent>
10 <modelVersion>4.0.0</modelVersion> 10 <modelVersion>4.0.0</modelVersion>
11 - <artifactId>yudao-module-trade-biz</artifactId> 11 + <artifactId>yudao-module-trade</artifactId>
12 <packaging>jar</packaging> 12 <packaging>jar</packaging>
13 13
14 <name>${project.artifactId}</name> 14 <name>${project.artifactId}</name>
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApiImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApiImpl.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/package-info.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/api/package-info.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/AfterSaleController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/AfterSaleController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/TradeAfterSaleController.http renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/TradeAfterSaleController.http
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleDetailRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleDetailRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleDisagreeReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleDisagreeReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSalePageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSalePageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleRefuseReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleRefuseReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleRespPageItemVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/AfterSaleRespPageItemVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/log/AfterSaleLogRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/vo/log/AfterSaleLogRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/member/package-info.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/member/package-info.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/member/user/MemberUserRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/member/user/MemberUserRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/package-info.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/package-info.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/product/property/ProductPropertyValueDetailRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/product/property/ProductPropertyValueDetailRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/system/package-info.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/system/package-info.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/system/user/UserSimpleBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/base/system/user/UserSimpleBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageRecordController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageRecordController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageUserController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageWithdrawController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageWithdrawController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/record/BrokerageRecordBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/record/BrokerageRecordBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/record/BrokerageRecordPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/record/BrokerageRecordPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/record/BrokerageRecordRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/record/BrokerageRecordRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserClearBrokerageUserReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserClearBrokerageUserReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserCreateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserUpdateBrokerageEnabledReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserUpdateBrokerageEnabledReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserUpdateBrokerageUserReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserUpdateBrokerageUserReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawRejectReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawRejectReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/TradeConfigController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/TradeConfigController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigSaveReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/config/vo/TradeConfigSaveReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryExpressController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryExpressController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryPickUpStoreController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryPickUpStoreController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressCreateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExcelVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExcelVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExportReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressExportReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressSimpleRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressSimpleRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressUpdateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressUpdateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateChargeBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateChargeBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateCreateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateDetailRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateDetailRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateFreeBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateFreeBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplatePageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplatePageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateSimpleRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateSimpleRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateUpdateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateUpdateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpBindReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpBindReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreCreateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreSimpleRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreSimpleRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreUpdateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreUpdateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.http
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/TradeOrderController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderDetailRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderDetailRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderItemBaseVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderPageItemRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderPageItemRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderRemarkReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderRemarkReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSummaryRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderSummaryRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderUpdateAddressReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderUpdateAddressReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderUpdatePriceReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderUpdatePriceReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppAfterSaleController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppAfterSaleController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppAfterSaleLogController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/AppAfterSaleLogController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleCreateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleDeliveryReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleDeliveryReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSalePageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSalePageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppAfterSaleRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/log/AppAfterSaleLogRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/log/AppAfterSaleLogRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/base/package-info.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/base/package-info.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/base/property/AppProductPropertyValueDetailRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/base/property/AppProductPropertyValueDetailRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/base/sku/AppProductSkuBaseRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/base/sku/AppProductSkuBaseRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/base/spu/AppProductSpuBaseRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/base/spu/AppProductSpuBaseRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageRecordController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageRecordController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageUserController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageWithdrawController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageWithdrawController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/record/AppBrokerageProductPriceRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/record/AppBrokerageProductPriceRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserBindReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserBindReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserChildSummaryRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserMySummaryRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserMySummaryRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByPriceRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByPriceRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByUserCountRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankByUserCountRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRankPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/user/AppBrokerageUserRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawCreateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/AppCartController.http renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/AppCartController.http
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/AppCartController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/AppCartController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartAddReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartAddReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartDetailRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartDetailRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartListRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartListRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartResetReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartResetReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartUpdateCountReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartUpdateCountReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartUpdateSelectedReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppCartUpdateSelectedReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/config/AppTradeConfigController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/config/AppTradeConfigController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/config/vo/AppTradeConfigRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/config/vo/AppTradeConfigRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/AppDeliverExpressController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/AppDeliverExpressController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/AppDeliverPickUpStoreController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/AppDeliverPickUpStoreController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/vo/config/AppDeliveryConfigRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/vo/config/AppDeliveryConfigRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/vo/express/AppDeliveryExpressRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/vo/express/AppDeliveryExpressRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/vo/pickup/AppDeliveryPickUpStoreRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/delivery/vo/pickup/AppDeliveryPickUpStoreRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.http
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppOrderExpressTrackRespDTO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppOrderExpressTrackRespDTO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageItemRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderPageReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeProductSettlementRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeProductSettlementRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemCommentCreateReqVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemCommentCreateReqVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/package-info.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/controller/package-info.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/AfterSaleConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/AfterSaleConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/AfterSaleLogConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/AfterSaleLogConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageRecordConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageRecordConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageWithdrawConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageWithdrawConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/cart/TradeCartConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/cart/TradeCartConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/config/TradeConfigConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/config/TradeConfigConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/delivery/DeliveryExpressConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/delivery/DeliveryExpressConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/delivery/DeliveryExpressTemplateConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/delivery/DeliveryExpressTemplateConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/delivery/DeliveryPickUpStoreConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/delivery/DeliveryPickUpStoreConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderLogConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderLogConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/AfterSaleDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/AfterSaleDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/AfterSaleLogDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/aftersale/AfterSaleLogDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageRecordDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageRecordDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageUserDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageUserDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageWithdrawDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageWithdrawDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/cart/CartDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/cart/CartDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/config/TradeConfigDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/config/TradeConfigDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryExpressDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryExpressDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateChargeDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateChargeDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateFreeDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateFreeDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/delivery/DeliveryPickUpStoreDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderItemDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderLogDO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderLogDO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/AfterSaleLogMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/AfterSaleLogMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/AfterSaleMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/aftersale/AfterSaleMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageRecordMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageRecordMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageUserMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageUserMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageWithdrawMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/BrokerageWithdrawMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/cart/CartMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/cart/CartMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/config/TradeConfigMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/config/TradeConfigMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryExpressMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryExpressMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryExpressTemplateChargeMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryExpressTemplateChargeMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryExpressTemplateFreeMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryExpressTemplateFreeMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryExpressTemplateMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryExpressTemplateMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryPickUpStoreMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/delivery/DeliveryPickUpStoreMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderLogMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderLogMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/redis/RedisKeyConstants.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/redis/RedisKeyConstants.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/redis/no/TradeNoRedisDAO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/dal/redis/no/TradeNoRedisDAO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/config/AfterSaleLogConfiguration.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/config/AfterSaleLogConfiguration.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/annotations/AfterSaleLog.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/annotations/AfterSaleLog.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/aop/AfterSaleLogAspect.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/aop/AfterSaleLogAspect.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/utils/AfterSaleLogUtils.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersale/core/utils/AfterSaleLogUtils.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/ExpressClientConfig.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/ExpressClientConfig.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressProperties.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/config/TradeExpressProperties.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/ExpressClient.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/ExpressClient.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/ExpressClientFactory.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/ExpressClientFactory.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/convert/ExpressQueryConvert.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/convert/ExpressQueryConvert.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/ExpressTrackQueryReqDTO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/ExpressTrackQueryReqDTO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/ExpressTrackRespDTO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/ExpressTrackRespDTO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryReqDTO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryReqDTO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kd100/Kd100ExpressQueryRespDTO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryReqDTO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryReqDTO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/dto/kdniao/KdNiaoExpressQueryRespDTO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/ExpressClientFactoryImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/ExpressClientFactoryImpl.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/NoProvideExpressClient.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/NoProvideExpressClient.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/kdniao/KdNiaoExpressClient.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/kdniao/KdNiaoExpressClient.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/enums/ExpressClientEnum.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/delivery/core/enums/ExpressClientEnum.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderConfig.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderConfig.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderProperties.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderProperties.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/annotations/TradeOrderLog.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/annotations/TradeOrderLog.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/aop/TradeOrderLogAspect.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/aop/TradeOrderLogAspect.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/utils/TradeOrderLogUtils.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/order/core/utils/TradeOrderLogUtils.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/package-info.java 0 → 100644
  1 +/**
  2 + * 属于 trade 模块的 framework 封装
  3 + *
  4 + * @author 芋道源码
  5 + */
  6 +package cn.iocoder.yudao.module.trade.framework;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/web/config/TradeWebConfiguration.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/web/config/TradeWebConfiguration.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/framework/web/package-info.java 0 → 100644
  1 +/**
  2 + * trade 模块的 web 配置
  3 + */
  4 +package cn.iocoder.yudao.module.trade.framework.web;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/job/brokerage/BrokerageRecordUnfreezeJob.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/job/brokerage/BrokerageRecordUnfreezeJob.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/job/order/TradeOrderAutoCancelJob.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/job/order/TradeOrderAutoCancelJob.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/job/order/TradeOrderAutoCommentJob.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/job/order/TradeOrderAutoCommentJob.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/job/order/TradeOrderAutoReceiveJob.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/job/order/TradeOrderAutoReceiveJob.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/package-info.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/package-info.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleLogService.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleLogService.java
yudao-module-mall/yudao-module-trade/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 jakarta.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/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.aftersale;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleDisagreeReqVO;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSalePageReqVO;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.AfterSaleRefuseReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
  8 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO;
  9 +import cn.iocoder.yudao.module.trade.controller.app.aftersale.vo.AppAfterSalePageReqVO;
  10 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
  11 +
  12 +/**
  13 + * 售后订单 Service 接口
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +public interface AfterSaleService {
  18 +
  19 + /**
  20 + * 【管理员】获得售后订单分页
  21 + *
  22 + * @param pageReqVO 分页查询
  23 + * @return 售后订单分页
  24 + */
  25 + PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO);
  26 +
  27 + /**
  28 + * 【会员】获得售后订单分页
  29 + *
  30 + * @param userId 用户编号
  31 + * @param pageReqVO 分页参数
  32 + * @return 售后订单分页
  33 + */
  34 + PageResult<AfterSaleDO> getAfterSalePage(Long userId, AppAfterSalePageReqVO pageReqVO);
  35 +
  36 + /**
  37 + * 【会员】获得售后单
  38 + *
  39 + * @param userId 用户编号
  40 + * @param id 售后编号
  41 + * @return 售后订单
  42 + */
  43 + AfterSaleDO getAfterSale(Long userId, Long id);
  44 +
  45 + /**
  46 + * 【管理员】获得售后单
  47 + *
  48 + * @param id 售后编号
  49 + * @return 售后订单
  50 + */
  51 + AfterSaleDO getAfterSale(Long id);
  52 +
  53 + /**
  54 + * 【会员】创建售后订单
  55 + *
  56 + * @param userId 会员用户编号
  57 + * @param createReqVO 创建 Request 信息
  58 + * @return 售后编号
  59 + */
  60 + Long createAfterSale(Long userId, AppAfterSaleCreateReqVO createReqVO);
  61 +
  62 + /**
  63 + * 【管理员】同意售后订单
  64 + *
  65 + * @param userId 管理员用户编号
  66 + * @param id 售后编号
  67 + */
  68 + void agreeAfterSale(Long userId, Long id);
  69 +
  70 + /**
  71 + * 【管理员】拒绝售后订单
  72 + *
  73 + * @param userId 管理员用户编号
  74 + * @param auditReqVO 审批 Request 信息
  75 + */
  76 + void disagreeAfterSale(Long userId, AfterSaleDisagreeReqVO auditReqVO);
  77 +
  78 + /**
  79 + * 【会员】退回货物
  80 + *
  81 + * @param userId 会员用户编号
  82 + * @param deliveryReqVO 退货 Request 信息
  83 + */
  84 + void deliveryAfterSale(Long userId, AppAfterSaleDeliveryReqVO deliveryReqVO);
  85 +
  86 + /**
  87 + * 【管理员】确认收货
  88 + *
  89 + * @param userId 管理员编号
  90 + * @param id 售后编号
  91 + */
  92 + void receiveAfterSale(Long userId, Long id);
  93 +
  94 + /**
  95 + * 【管理员】拒绝收货
  96 + *
  97 + * @param userId 管理员用户编号
  98 + * @param refuseReqVO 拒绝收货 Request 信息
  99 + */
  100 + void refuseAfterSale(Long userId, AfterSaleRefuseReqVO refuseReqVO);
  101 +
  102 + /**
  103 + * 【管理员】确认退款
  104 + *
  105 + * @param userId 管理员用户编号
  106 + * @param userIp 管理员用户 IP
  107 + * @param id 售后编号
  108 + */
  109 + void refundAfterSale(Long userId, String userIp, Long id);
  110 +
  111 + /**
  112 + * 更新售后订单为已退款
  113 + *
  114 + * @param id 售后编号
  115 + * @param orderId 订单编号
  116 + * @param payRefundId 支付退款编号
  117 + */
  118 + void updateAfterSaleRefunded(Long id, Long orderId, Long payRefundId);
  119 +
  120 + /**
  121 + * 【会员】取消售后
  122 + *
  123 + * @param userId 会员用户编号
  124 + * @param id 售后编号
  125 + */
  126 + void cancelAfterSale(Long userId, Long id);
  127 +
  128 + /**
  129 + * 【会员】获得正在进行中的售后订单数量
  130 + *
  131 + * @param userId 用户编号
  132 + * @return 数量
  133 + */
  134 + Long getApplyingAfterSaleCount(Long userId);
  135 +
  136 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/bo/AfterSaleLogCreateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.aftersale.bo;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +import jakarta.validation.constraints.NotEmpty;
  8 +import jakarta.validation.constraints.NotNull;
  9 +
  10 +/**
  11 + * 售后日志的创建 Request BO
  12 + *
  13 + * @author 陈賝
  14 + * @since 2023/6/19 09:54
  15 + */
  16 +@Data
  17 +@NoArgsConstructor
  18 +@AllArgsConstructor
  19 +public class AfterSaleLogCreateReqBO {
  20 +
  21 + /**
  22 + * 用户编号
  23 + */
  24 + @NotNull(message = "用户编号不能为空")
  25 + private Long userId;
  26 + /**
  27 + * 用户类型
  28 + */
  29 + @NotNull(message = "用户类型不能为空")
  30 + private Integer userType;
  31 +
  32 + /**
  33 + * 售后编号
  34 + */
  35 + @NotNull(message = "售后编号不能为空")
  36 + private Long afterSaleId;
  37 + /**
  38 + * 操作前状态
  39 + */
  40 + private Integer beforeStatus;
  41 + /**
  42 + * 操作后状态
  43 + */
  44 + @NotNull(message = "操作后的状态不能为空")
  45 + private Integer afterStatus;
  46 +
  47 + /**
  48 + * 操作类型
  49 + */
  50 + @NotNull(message = "操作类型不能为空")
  51 + private Integer operateType;
  52 + /**
  53 + * 操作明细
  54 + */
  55 + @NotEmpty(message = "操作明细不能为空")
  56 + private String content;
  57 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserCreateReqVO;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
  6 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
  8 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByUserCountRespVO;
  9 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;
  10 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
  11 +import jakarta.validation.Valid;
  12 +import jakarta.validation.constraints.NotNull;
  13 +
  14 +/**
  15 + * 分销用户 Service 接口
  16 + *
  17 + * @author owen
  18 + */
  19 +public interface BrokerageUserService {
  20 +
  21 + /**
  22 + * 获得分销用户
  23 + *
  24 + * @param id 编号
  25 + * @return 分销用户
  26 + */
  27 + BrokerageUserDO getBrokerageUser(Long id);
  28 +
  29 + /**
  30 + * 获得分销用户分页
  31 + *
  32 + * @param pageReqVO 分页查询
  33 + * @return 分销用户分页
  34 + */
  35 + PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO);
  36 +
  37 + /**
  38 + * 修改推广员编号
  39 + *
  40 + * @param id 用户编号
  41 + * @param bindUserId 推广员编号
  42 + */
  43 + void updateBrokerageUserId(Long id, Long bindUserId);
  44 +
  45 + /**
  46 + * 修改推广资格
  47 + *
  48 + * @param id 用户编号
  49 + * @param enabled 推广资格
  50 + */
  51 + void updateBrokerageUserEnabled(Long id, Boolean enabled);
  52 +
  53 + /**
  54 + * 获得用户的推广人
  55 + *
  56 + * @param id 用户编号
  57 + * @return 用户的推广人
  58 + */
  59 + BrokerageUserDO getBindBrokerageUser(Long id);
  60 +
  61 + /**
  62 + * 获得或创建分销用户
  63 + *
  64 + * @param id 用户编号
  65 + * @return 分销用户
  66 + */
  67 + BrokerageUserDO getOrCreateBrokerageUser(Long id);
  68 +
  69 + /**
  70 + * 更新用户佣金
  71 + *
  72 + * @param id 用户编号
  73 + * @param price 用户可用佣金
  74 + * @return 更新结果
  75 + */
  76 + boolean updateUserPrice(Long id, Integer price);
  77 +
  78 + /**
  79 + * 更新用户冻结佣金
  80 + *
  81 + * @param id 用户编号
  82 + * @param frozenPrice 用户冻结佣金
  83 + */
  84 + void updateUserFrozenPrice(Long id, Integer frozenPrice);
  85 +
  86 + /**
  87 + * 更新用户冻结佣金(减少),更新用户佣金(增加)
  88 + *
  89 + * @param id 用户编号
  90 + * @param frozenPrice 减少冻结佣金(负数)
  91 + */
  92 + void updateFrozenPriceDecrAndPriceIncr(Long id, Integer frozenPrice);
  93 +
  94 + /**
  95 + * 获得推广用户数量
  96 + *
  97 + * @param bindUserId 绑定的推广员编号
  98 + * @param level 推广用户等级
  99 + * @return 推广用户数量
  100 + */
  101 + Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level);
  102 +
  103 + /**
  104 + * 【会员】绑定推广员
  105 + *
  106 + * @param userId 用户编号
  107 + * @param bindUserId 推广员编号
  108 + * @return 是否绑定
  109 + */
  110 + boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId);
  111 +
  112 + /**
  113 + * 【管理员】创建分销用户
  114 + *
  115 + * @param createReqVO 请求
  116 + * @return 编号
  117 + */
  118 + Long createBrokerageUser(@Valid BrokerageUserCreateReqVO createReqVO);
  119 +
  120 + /**
  121 + * 获取用户是否有分销资格
  122 + *
  123 + * @param userId 用户编号
  124 + * @return 是否有分销资格
  125 + */
  126 + Boolean getUserBrokerageEnabled(Long userId);
  127 +
  128 + /**
  129 + * 获得推广人排行
  130 + *
  131 + * @param pageReqVO 分页查询
  132 + * @return 推广人排行
  133 + */
  134 + PageResult<AppBrokerageUserRankByUserCountRespVO> getBrokerageUserRankPageByUserCount(AppBrokerageUserRankPageReqVO pageReqVO);
  135 +
  136 + /**
  137 + * 获得下级分销统计分页
  138 + *
  139 + * @param pageReqVO 分页查询
  140 + * @param userId 用户编号
  141 + * @return 下级分销统计分页
  142 + */
  143 + PageResult<AppBrokerageUserChildSummaryRespVO> getBrokerageUserChildSummaryPage(AppBrokerageUserChildSummaryPageReqVO pageReqVO, Long userId);
  144 +
  145 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO;
  5 +import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO;
  7 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
  8 +import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageWithdrawSummaryRespBO;
  9 +
  10 +import java.util.Collection;
  11 +import java.util.List;
  12 +import java.util.Map;
  13 +import java.util.Set;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  16 +
  17 +/**
  18 + * 佣金提现 Service 接口
  19 + *
  20 + * @author 芋道源码
  21 + */
  22 +public interface BrokerageWithdrawService {
  23 +
  24 + /**
  25 + * 【管理员】审核佣金提现
  26 + *
  27 + * @param id 佣金编号
  28 + * @param status 审核状态
  29 + * @param auditReason 驳回原因
  30 + * @param userIp 操作 IP
  31 + */
  32 + void auditBrokerageWithdraw(Long id, BrokerageWithdrawStatusEnum status, String auditReason, String userIp);
  33 +
  34 + /**
  35 + * 获得佣金提现
  36 + *
  37 + * @param id 编号
  38 + * @return 佣金提现
  39 + */
  40 + BrokerageWithdrawDO getBrokerageWithdraw(Long id);
  41 +
  42 + /**
  43 + * 获得佣金提现分页
  44 + *
  45 + * @param pageReqVO 分页查询
  46 + * @return 佣金提现分页
  47 + */
  48 + PageResult<BrokerageWithdrawDO> getBrokerageWithdrawPage(BrokerageWithdrawPageReqVO pageReqVO);
  49 +
  50 + /**
  51 + * 【会员】创建佣金提现
  52 + *
  53 + * @param userId 会员用户编号
  54 + * @param createReqVO 创建信息
  55 + * @return 佣金提现编号
  56 + */
  57 + Long createBrokerageWithdraw(Long userId, AppBrokerageWithdrawCreateReqVO createReqVO);
  58 +
  59 + /**
  60 + * 【API】更新佣金提现的转账结果
  61 + *
  62 + * 目前用于支付回调,标记提现转账结果
  63 + *
  64 + * @param id 提现编号
  65 + * @param payTransferId 转账订单编号
  66 + */
  67 + void updateBrokerageWithdrawTransferred(Long id, Long payTransferId);
  68 +
  69 + /**
  70 + * 按照 userId,汇总每个用户的提现
  71 + *
  72 + * @param userIds 用户编号
  73 + * @param status 提现状态
  74 + * @return 用户提现汇总 List
  75 + */
  76 + List<BrokerageWithdrawSummaryRespBO> getWithdrawSummaryListByUserId(Collection<Long> userIds,
  77 + Collection<BrokerageWithdrawStatusEnum> status);
  78 +
  79 + /**
  80 + * 按照 userId,汇总每个用户的提现
  81 + *
  82 + * @param userIds 用户编号
  83 + * @param status 提现状态
  84 + * @return 用户提现汇总 Map
  85 + */
  86 + default Map<Long, BrokerageWithdrawSummaryRespBO> getWithdrawSummaryMapByUserId(Set<Long> userIds,
  87 + Collection<BrokerageWithdrawStatusEnum> status) {
  88 + return convertMap(getWithdrawSummaryListByUserId(userIds, status), BrokerageWithdrawSummaryRespBO::getUserId);
  89 + }
  90 +
  91 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/bo/BrokerageAddReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage.bo;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +import jakarta.validation.constraints.NotBlank;
  8 +import jakarta.validation.constraints.NotEmpty;
  9 +import jakarta.validation.constraints.NotNull;
  10 +
  11 +/**
  12 + * 佣金 增加 Request BO
  13 + *
  14 + * @author owen
  15 + */
  16 +@Data
  17 +@NoArgsConstructor
  18 +@AllArgsConstructor
  19 +public class BrokerageAddReqBO {
  20 +
  21 + /**
  22 + * 业务编号
  23 + */
  24 + @NotBlank(message = "业务编号不能为空")
  25 + private String bizId;
  26 + /**
  27 + * 佣金基数
  28 + */
  29 + @NotNull(message = "佣金基数不能为空")
  30 + private Integer basePrice;
  31 + /**
  32 + * 一级佣金(固定)
  33 + */
  34 + @NotNull(message = "一级佣金(固定)不能为空")
  35 + private Integer firstFixedPrice;
  36 + /**
  37 + * 二级佣金(固定)
  38 + */
  39 + private Integer secondFixedPrice;
  40 +
  41 + /**
  42 + * 来源用户编号
  43 + */
  44 + @NotNull(message = "来源用户编号不能为空")
  45 + private Long sourceUserId;
  46 +
  47 + /**
  48 + * 佣金记录标题
  49 + */
  50 + @NotEmpty(message = "佣金记录标题不能为空")
  51 + private String title;
  52 +
  53 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/bo/BrokerageWithdrawSummaryRespBO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/bo/BrokerageWithdrawSummaryRespBO.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/bo/UserBrokerageSummaryRespBO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/bo/UserBrokerageSummaryRespBO.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/cart/CartService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.cart;
  2 +
  3 +import cn.iocoder.yudao.module.trade.controller.app.cart.vo.*;
  4 +import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO;
  5 +
  6 +import jakarta.validation.Valid;
  7 +import java.util.Collection;
  8 +import java.util.List;
  9 +import java.util.Set;
  10 +
  11 +/**
  12 + * 购物车 Service 接口
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +public interface CartService {
  17 +
  18 + /**
  19 + * 添加商品到购物车
  20 + *
  21 + * @param userId 用户编号
  22 + * @param addReqVO 添加信息
  23 + * @return 购物项的编号
  24 + */
  25 + Long addCart(Long userId, @Valid AppCartAddReqVO addReqVO);
  26 +
  27 + /**
  28 + * 更新购物车商品数量
  29 + *
  30 + * @param userId 用户编号
  31 + * @param updateCountReqVO 更新信息
  32 + */
  33 + void updateCartCount(Long userId, AppCartUpdateCountReqVO updateCountReqVO);
  34 +
  35 + /**
  36 + * 更新购物车选中状态
  37 + *
  38 + * @param userId 用户编号
  39 + * @param updateSelectedReqVO 更新信息
  40 + */
  41 + void updateCartSelected(Long userId, @Valid AppCartUpdateSelectedReqVO updateSelectedReqVO);
  42 +
  43 + /**
  44 + * 重置购物车商品
  45 + *
  46 + * 使用场景:在一个购物车项对应的商品失效(例如说 SPU 被下架),可以重新选择对应的 SKU
  47 + *
  48 + * @param userId 用户编号
  49 + * @param updateReqVO 重置信息
  50 + */
  51 + void resetCart(Long userId, AppCartResetReqVO updateReqVO);
  52 +
  53 + /**
  54 + * 删除购物车商品
  55 + *
  56 + * @param userId 用户编号
  57 + * @param ids 购物项的编号
  58 + */
  59 + void deleteCart(Long userId, Collection<Long> ids);
  60 +
  61 + /**
  62 + * 查询用户在购物车中的商品数量
  63 + *
  64 + * @param userId 用户编号
  65 + * @return 商品数量
  66 + */
  67 + Integer getCartCount(Long userId);
  68 +
  69 + /**
  70 + * 查询用户的购物车列表
  71 + *
  72 + * @param userId 用户编号
  73 + * @return 购物车列表
  74 + */
  75 + AppCartListRespVO getCartList(Long userId);
  76 +
  77 + /**
  78 + * 查询用户的购物车列表
  79 + *
  80 + * @param userId 用户编号
  81 + * @param ids 购物项的编号
  82 + * @return 购物车列表
  83 + */
  84 + List<CartDO> getCartList(Long userId, Set<Long> ids);
  85 +
  86 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/cart/CartServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/cart/CartServiceImpl.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/config/TradeConfigService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.config;
  2 +
  3 +import cn.iocoder.yudao.module.trade.controller.admin.config.vo.TradeConfigSaveReqVO;
  4 +import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
  5 +
  6 +import jakarta.validation.Valid;
  7 +
  8 +/**
  9 + * 交易中心配置 Service 接口
  10 + *
  11 + * @author owen
  12 + */
  13 +public interface TradeConfigService {
  14 +
  15 + /**
  16 + * 更新交易中心配置
  17 + *
  18 + * @param updateReqVO 更新信息
  19 + */
  20 + void saveTradeConfig(@Valid TradeConfigSaveReqVO updateReqVO);
  21 +
  22 + /**
  23 + * 获得交易中心配置
  24 + *
  25 + * @return 交易中心配置
  26 + */
  27 + TradeConfigDO getTradeConfig();
  28 +
  29 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/config/TradeConfigServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.config;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.config.vo.TradeConfigSaveReqVO;
  5 +import cn.iocoder.yudao.module.trade.convert.config.TradeConfigConvert;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
  7 +import cn.iocoder.yudao.module.trade.dal.mysql.config.TradeConfigMapper;
  8 +import org.springframework.stereotype.Service;
  9 +import org.springframework.validation.annotation.Validated;
  10 +
  11 +import jakarta.annotation.Resource;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 交易中心配置 Service 实现类
  16 + *
  17 + * @author owen
  18 + */
  19 +@Service
  20 +@Validated
  21 +public class TradeConfigServiceImpl implements TradeConfigService {
  22 +
  23 + @Resource
  24 + private TradeConfigMapper tradeConfigMapper;
  25 +
  26 + @Override
  27 + public void saveTradeConfig(TradeConfigSaveReqVO saveReqVO) {
  28 + // 存在,则进行更新
  29 + TradeConfigDO dbConfig = getTradeConfig();
  30 + if (dbConfig != null) {
  31 + tradeConfigMapper.updateById(TradeConfigConvert.INSTANCE.convert(saveReqVO).setId(dbConfig.getId()));
  32 + return;
  33 + }
  34 + // 不存在,则进行插入
  35 + tradeConfigMapper.insert(TradeConfigConvert.INSTANCE.convert(saveReqVO));
  36 + }
  37 +
  38 + @Override
  39 + public TradeConfigDO getTradeConfig() {
  40 + List<TradeConfigDO> list = tradeConfigMapper.selectList();
  41 + return CollectionUtils.getFirst(list);
  42 + }
  43 +
  44 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.delivery;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressCreateReqVO;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressExportReqVO;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressUpdateReqVO;
  8 +import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
  9 +
  10 +import jakarta.validation.Valid;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 快递公司 Service 接口
  15 + *
  16 + * @author jason
  17 + */
  18 +public interface DeliveryExpressService {
  19 +
  20 + /**
  21 + * 创建快递公司
  22 + *
  23 + * @param createReqVO 创建信息
  24 + * @return 编号
  25 + */
  26 + Long createDeliveryExpress(@Valid DeliveryExpressCreateReqVO createReqVO);
  27 +
  28 + /**
  29 + * 更新快递公司
  30 + *
  31 + * @param updateReqVO 更新信息
  32 + */
  33 + void updateDeliveryExpress(@Valid DeliveryExpressUpdateReqVO updateReqVO);
  34 +
  35 + /**
  36 + * 删除快递公司
  37 + *
  38 + * @param id 编号
  39 + */
  40 + void deleteDeliveryExpress(Long id);
  41 +
  42 + /**
  43 + * 获得快递公司
  44 + *
  45 + * @param id 编号
  46 + * @return 快递公司
  47 + */
  48 + DeliveryExpressDO getDeliveryExpress(Long id);
  49 +
  50 + /**
  51 + * 校验快递公司是否合法
  52 + *
  53 + * @param id 编号
  54 + * @return 快递公司
  55 + */
  56 + DeliveryExpressDO validateDeliveryExpress(Long id);
  57 +
  58 + /**
  59 + * 获得快递公司分页
  60 + *
  61 + * @param pageReqVO 分页查询
  62 + * @return 快递公司分页
  63 + */
  64 + PageResult<DeliveryExpressDO> getDeliveryExpressPage(DeliveryExpressPageReqVO pageReqVO);
  65 +
  66 + /**
  67 + * 获得快递公司列表, 用于 Excel 导出
  68 + *
  69 + * @param exportReqVO 查询条件
  70 + * @return 快递公司列表
  71 + */
  72 + List<DeliveryExpressDO> getDeliveryExpressList(DeliveryExpressExportReqVO exportReqVO);
  73 +
  74 + /**
  75 + * 获取指定状态的快递公司列表
  76 + *
  77 + * @param status 状态
  78 + * @return 快递公司列表
  79 + */
  80 + List<DeliveryExpressDO> getDeliveryExpressListByStatus(Integer status);
  81 +
  82 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.delivery;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressCreateReqVO;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressExportReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressPageReqVO;
  8 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express.DeliveryExpressUpdateReqVO;
  9 +import cn.iocoder.yudao.module.trade.convert.delivery.DeliveryExpressConvert;
  10 +import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
  11 +import cn.iocoder.yudao.module.trade.dal.mysql.delivery.DeliveryExpressMapper;
  12 +import org.springframework.stereotype.Service;
  13 +import org.springframework.validation.annotation.Validated;
  14 +
  15 +import jakarta.annotation.Resource;
  16 +import java.util.List;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  19 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
  20 +
  21 +/**
  22 + * 快递公司 Service 实现类
  23 + *
  24 + * @author jason
  25 + */
  26 +@Service
  27 +@Validated
  28 +public class DeliveryExpressServiceImpl implements DeliveryExpressService {
  29 +
  30 + @Resource
  31 + private DeliveryExpressMapper deliveryExpressMapper;
  32 +
  33 + @Override
  34 + public Long createDeliveryExpress(DeliveryExpressCreateReqVO createReqVO) {
  35 + //校验编码是否唯一
  36 + validateExpressCodeUnique(createReqVO.getCode(), null);
  37 + // 插入
  38 + DeliveryExpressDO deliveryExpress = DeliveryExpressConvert.INSTANCE.convert(createReqVO);
  39 + deliveryExpressMapper.insert(deliveryExpress);
  40 + // 返回
  41 + return deliveryExpress.getId();
  42 + }
  43 +
  44 + @Override
  45 + public void updateDeliveryExpress(DeliveryExpressUpdateReqVO updateReqVO) {
  46 + // 校验存在
  47 + validateDeliveryExpressExists(updateReqVO.getId());
  48 + //校验编码是否唯一
  49 + validateExpressCodeUnique(updateReqVO.getCode(), updateReqVO.getId());
  50 + // 更新
  51 + DeliveryExpressDO updateObj = DeliveryExpressConvert.INSTANCE.convert(updateReqVO);
  52 + deliveryExpressMapper.updateById(updateObj);
  53 + }
  54 +
  55 + @Override
  56 + public void deleteDeliveryExpress(Long id) {
  57 + // 校验存在
  58 + validateDeliveryExpressExists(id);
  59 + // 删除
  60 + deliveryExpressMapper.deleteById(id);
  61 + }
  62 +
  63 + private void validateExpressCodeUnique(String code, Long id) {
  64 + DeliveryExpressDO express = deliveryExpressMapper.selectByCode(code);
  65 + if (express == null) {
  66 + return;
  67 + }
  68 + // 如果 id 为空,说明不用比较是否为相同 id 的快递公司
  69 + if (id == null) {
  70 + throw exception(EXPRESS_CODE_DUPLICATE);
  71 + }
  72 + if (!express.getId().equals(id)) {
  73 + throw exception(EXPRESS_CODE_DUPLICATE);
  74 + }
  75 + }
  76 + private void validateDeliveryExpressExists(Long id) {
  77 + if (deliveryExpressMapper.selectById(id) == null) {
  78 + throw exception(EXPRESS_NOT_EXISTS);
  79 + }
  80 + }
  81 +
  82 + @Override
  83 + public DeliveryExpressDO getDeliveryExpress(Long id) {
  84 + return deliveryExpressMapper.selectById(id);
  85 + }
  86 +
  87 + @Override
  88 + public DeliveryExpressDO validateDeliveryExpress(Long id) {
  89 + DeliveryExpressDO deliveryExpress = deliveryExpressMapper.selectById(id);
  90 + if (deliveryExpress == null) {
  91 + throw exception(EXPRESS_NOT_EXISTS);
  92 + }
  93 + if (deliveryExpress.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) {
  94 + throw exception(EXPRESS_STATUS_NOT_ENABLE);
  95 + }
  96 + return deliveryExpress;
  97 + }
  98 +
  99 + @Override
  100 + public PageResult<DeliveryExpressDO> getDeliveryExpressPage(DeliveryExpressPageReqVO pageReqVO) {
  101 + return deliveryExpressMapper.selectPage(pageReqVO);
  102 + }
  103 +
  104 + @Override
  105 + public List<DeliveryExpressDO> getDeliveryExpressList(DeliveryExpressExportReqVO exportReqVO) {
  106 + return deliveryExpressMapper.selectList(exportReqVO);
  107 + }
  108 +
  109 + @Override
  110 + public List<DeliveryExpressDO> getDeliveryExpressListByStatus(Integer status) {
  111 + return deliveryExpressMapper.selectListByStatus(status);
  112 + }
  113 +
  114 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressTemplateService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.delivery;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateCreateReqVO;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateDetailRespVO;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplatePageReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate.DeliveryExpressTemplateUpdateReqVO;
  8 +import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO;
  9 +import cn.iocoder.yudao.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO;
  10 +
  11 +import jakarta.validation.Valid;
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +
  16 +/**
  17 + * 快递运费模板 Service 接口
  18 + *
  19 + * @author jason
  20 + */
  21 +public interface DeliveryExpressTemplateService {
  22 +
  23 + /**
  24 + * 创建快递运费模板
  25 + *
  26 + * @param createReqVO 创建信息
  27 + * @return 编号
  28 + */
  29 + Long createDeliveryExpressTemplate(@Valid DeliveryExpressTemplateCreateReqVO createReqVO);
  30 +
  31 + /**
  32 + * 更新快递运费模板
  33 + *
  34 + * @param updateReqVO 更新信息
  35 + */
  36 + void updateDeliveryExpressTemplate(@Valid DeliveryExpressTemplateUpdateReqVO updateReqVO);
  37 +
  38 + /**
  39 + * 删除快递运费模板
  40 + *
  41 + * @param id 编号
  42 + */
  43 + void deleteDeliveryExpressTemplate(Long id);
  44 +
  45 + /**
  46 + * 获得快递运费模板
  47 + *
  48 + * @param id 编号
  49 + * @return 快递运费模板详情
  50 + */
  51 + DeliveryExpressTemplateDetailRespVO getDeliveryExpressTemplate(Long id);
  52 +
  53 + /**
  54 + * 获得快递运费模板列表
  55 + *
  56 + * @param ids 编号
  57 + * @return 快递运费模板列表
  58 + */
  59 + List<DeliveryExpressTemplateDO> getDeliveryExpressTemplateList(Collection<Long> ids);
  60 +
  61 + /**
  62 + * 获得快递运费模板列表
  63 + *
  64 + * @return 快递运费模板列表
  65 + */
  66 + List<DeliveryExpressTemplateDO> getDeliveryExpressTemplateList();
  67 +
  68 + /**
  69 + * 获得快递运费模板分页
  70 + *
  71 + * @param pageReqVO 分页查询
  72 + * @return 快递运费模板分页
  73 + */
  74 + PageResult<DeliveryExpressTemplateDO> getDeliveryExpressTemplatePage(DeliveryExpressTemplatePageReqVO pageReqVO);
  75 +
  76 + /**
  77 + * 校验快递运费模板
  78 + *
  79 + * 如果校验不通过,抛出 {@link cn.iocoder.yudao.framework.common.exception.ServiceException} 异常
  80 + *
  81 + * @param templateId 模板编号
  82 + * @return 快递运费模板
  83 + */
  84 + DeliveryExpressTemplateDO validateDeliveryExpressTemplate(Long templateId);
  85 +
  86 + /**
  87 + * 基于运费模板编号数组和收件人地址区域编号,获取匹配运费模板
  88 + *
  89 + * @param ids 编号列表
  90 + * @param areaId 区域编号
  91 + * @return Map (templateId -> 运费模板设置)
  92 + */
  93 + Map<Long, DeliveryExpressTemplateRespBO> getExpressTemplateMapByIdsAndArea(Collection<Long> ids, Integer areaId);
  94 +
  95 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryPickUpStoreService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.delivery;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.*;
  5 +import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO;
  6 +
  7 +import jakarta.validation.Valid;
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * 自提门店 Service 接口
  13 + *
  14 + * @author jason
  15 + */
  16 +public interface DeliveryPickUpStoreService {
  17 +
  18 + /**
  19 + * 创建自提门店
  20 + *
  21 + * @param createReqVO 创建信息
  22 + * @return 编号
  23 + */
  24 + Long createDeliveryPickUpStore(@Valid DeliveryPickUpStoreCreateReqVO createReqVO);
  25 +
  26 + /**
  27 + * 更新自提门店
  28 + *
  29 + * @param updateReqVO 更新信息
  30 + */
  31 + void updateDeliveryPickUpStore(@Valid DeliveryPickUpStoreUpdateReqVO updateReqVO);
  32 +
  33 + /**
  34 + * 删除自提门店
  35 + *
  36 + * @param id 编号
  37 + */
  38 + void deleteDeliveryPickUpStore(Long id);
  39 +
  40 + /**
  41 + * 获得自提门店
  42 + *
  43 + * @param id 编号
  44 + * @return 自提门店
  45 + */
  46 + DeliveryPickUpStoreDO getDeliveryPickUpStore(Long id);
  47 +
  48 + /**
  49 + * 获得自提门店列表
  50 + *
  51 + * @param ids 编号
  52 + * @return 自提门店列表
  53 + */
  54 + List<DeliveryPickUpStoreDO> getDeliveryPickUpStoreList(Collection<Long> ids);
  55 +
  56 + /**
  57 + * 获得指定状态的自提门店列表
  58 + *
  59 + * @param status 状态
  60 + * @return 自提门店列表
  61 + */
  62 + List<DeliveryPickUpStoreDO> getDeliveryPickUpStoreListByStatus(Integer status);
  63 +
  64 + /**
  65 + * 获得自提门店分页
  66 + *
  67 + * @param pageReqVO 分页查询
  68 + * @return 自提门店分页
  69 + */
  70 + PageResult<DeliveryPickUpStoreDO> getDeliveryPickUpStorePage(DeliveryPickUpStorePageReqVO pageReqVO);
  71 +
  72 + /**
  73 + * 绑定自提店员
  74 + *
  75 + * @param bindReqVO 绑定数据
  76 + */
  77 + void bindDeliveryPickUpStore(DeliveryPickUpBindReqVO bindReqVO);
  78 +
  79 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/DeliveryPickUpStoreServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.delivery;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  5 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpBindReqVO;
  7 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreCreateReqVO;
  8 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStorePageReqVO;
  9 +import cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup.DeliveryPickUpStoreUpdateReqVO;
  10 +import cn.iocoder.yudao.module.trade.convert.delivery.DeliveryPickUpStoreConvert;
  11 +import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO;
  12 +import cn.iocoder.yudao.module.trade.dal.mysql.delivery.DeliveryPickUpStoreMapper;
  13 +import jakarta.annotation.Resource;
  14 +import org.springframework.stereotype.Service;
  15 +import org.springframework.validation.annotation.Validated;
  16 +
  17 +import java.util.Collection;
  18 +import java.util.List;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  21 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PICK_UP_STORE_NOT_EXISTS;
  22 +
  23 +/**
  24 + * 自提门店 Service 实现类
  25 + *
  26 + * @author jason
  27 + */
  28 +@Service
  29 +@Validated
  30 +public class DeliveryPickUpStoreServiceImpl implements DeliveryPickUpStoreService {
  31 +
  32 + @Resource
  33 + private DeliveryPickUpStoreMapper deliveryPickUpStoreMapper;
  34 +
  35 + @Resource
  36 + private AdminUserApi adminUserApi;
  37 +
  38 + @Override
  39 + public Long createDeliveryPickUpStore(DeliveryPickUpStoreCreateReqVO createReqVO) {
  40 + // 插入
  41 + DeliveryPickUpStoreDO deliveryPickUpStore = DeliveryPickUpStoreConvert.INSTANCE.convert(createReqVO);
  42 + deliveryPickUpStoreMapper.insert(deliveryPickUpStore);
  43 + // 返回
  44 + return deliveryPickUpStore.getId();
  45 + }
  46 +
  47 + @Override
  48 + public void updateDeliveryPickUpStore(DeliveryPickUpStoreUpdateReqVO updateReqVO) {
  49 + // 校验存在
  50 + validateDeliveryPickUpStoreExists(updateReqVO.getId());
  51 + // 更新
  52 + DeliveryPickUpStoreDO updateObj = DeliveryPickUpStoreConvert.INSTANCE.convert(updateReqVO);
  53 + deliveryPickUpStoreMapper.updateById(updateObj);
  54 + }
  55 +
  56 + @Override
  57 + public void deleteDeliveryPickUpStore(Long id) {
  58 + // 校验存在
  59 + validateDeliveryPickUpStoreExists(id);
  60 + // 删除
  61 + deliveryPickUpStoreMapper.deleteById(id);
  62 + }
  63 +
  64 + private void validateDeliveryPickUpStoreExists(Long id) {
  65 + DeliveryPickUpStoreDO deliveryPickUpStore = deliveryPickUpStoreMapper.selectById(id);
  66 + if (deliveryPickUpStore == null) {
  67 + throw exception(PICK_UP_STORE_NOT_EXISTS);
  68 + }
  69 + }
  70 +
  71 + @Override
  72 + public DeliveryPickUpStoreDO getDeliveryPickUpStore(Long id) {
  73 + return deliveryPickUpStoreMapper.selectById(id);
  74 + }
  75 +
  76 + @Override
  77 + public List<DeliveryPickUpStoreDO> getDeliveryPickUpStoreList(Collection<Long> ids) {
  78 + return deliveryPickUpStoreMapper.selectBatchIds(ids);
  79 + }
  80 +
  81 + @Override
  82 + public List<DeliveryPickUpStoreDO> getDeliveryPickUpStoreListByStatus(Integer status) {
  83 + return deliveryPickUpStoreMapper.selectListByStatus(status);
  84 + }
  85 +
  86 + @Override
  87 + public PageResult<DeliveryPickUpStoreDO> getDeliveryPickUpStorePage(DeliveryPickUpStorePageReqVO pageReqVO) {
  88 + return deliveryPickUpStoreMapper.selectPage(pageReqVO);
  89 + }
  90 +
  91 + @Override
  92 + public void bindDeliveryPickUpStore(DeliveryPickUpBindReqVO bindReqVO) {
  93 + // 1.1 校验门店存在
  94 + validateDeliveryPickUpStoreExists(bindReqVO.getId());
  95 + // 1.2 校验用户存在
  96 + adminUserApi.validateUserList(bindReqVO.getVerifyUserIds());
  97 +
  98 + // 2. 更新
  99 + DeliveryPickUpStoreDO updateObj = BeanUtils.toBean(bindReqVO, DeliveryPickUpStoreDO.class);
  100 + deliveryPickUpStoreMapper.updateById(updateObj);
  101 + }
  102 +
  103 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/delivery/bo/DeliveryExpressTemplateRespBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.delivery.bo;
  2 +
  3 +import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryExpressChargeModeEnum;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + * 运费模板配置 Resp BO
  8 + *
  9 + * @author jason
  10 + */
  11 +@Data
  12 +public class DeliveryExpressTemplateRespBO {
  13 +
  14 + /**
  15 + * 配送计费方式
  16 + *
  17 + * 枚举 {@link DeliveryExpressChargeModeEnum}
  18 + */
  19 + private Integer chargeMode;
  20 +
  21 + /**
  22 + * 运费模板快递运费设置
  23 + */
  24 + private Charge charge;
  25 +
  26 + /**
  27 + * 运费模板包邮设置
  28 + */
  29 + private Free free;
  30 +
  31 + /**
  32 + * 快递运费模板费用配置 BO
  33 + *
  34 + * @author jason
  35 + */
  36 + @Data
  37 + public static class Charge {
  38 +
  39 + /**
  40 + * 首件数量(件数,重量,或体积)
  41 + */
  42 + private Double startCount;
  43 + /**
  44 + * 起步价,单位:分
  45 + */
  46 + private Integer startPrice;
  47 + /**
  48 + * 续件数量(件, 重量,或体积)
  49 + */
  50 + private Double extraCount;
  51 + /**
  52 + * 额外价,单位:分
  53 + */
  54 + private Integer extraPrice;
  55 + }
  56 +
  57 + /**
  58 + * 快递运费模板包邮配置 BO
  59 + *
  60 + * @author jason
  61 + */
  62 + @Data
  63 + public static class Free {
  64 +
  65 + /**
  66 + * 包邮金额,单位:分
  67 + *
  68 + * 订单总金额 > 包邮金额时,才免运费
  69 + */
  70 + private Integer freePrice;
  71 +
  72 + /**
  73 + * 包邮件数
  74 + *
  75 + * 订单总件数 > 包邮件数时,才免运费
  76 + */
  77 + private Integer freeCount;
  78 + }
  79 +
  80 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/message/TradeMessageService.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/message/TradeMessageService.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/message/TradeMessageServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.message;
  2 +
  3 +import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
  4 +import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
  5 +import cn.iocoder.yudao.module.trade.enums.MessageTemplateConstants;
  6 +import cn.iocoder.yudao.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO;
  7 +import org.springframework.stereotype.Service;
  8 +import org.springframework.validation.annotation.Validated;
  9 +
  10 +import jakarta.annotation.Resource;
  11 +import java.util.HashMap;
  12 +import java.util.Map;
  13 +
  14 +/**
  15 + * Trade 消息 service 实现类
  16 + *
  17 + * @author HUIHUI
  18 + */
  19 +@Service
  20 +@Validated
  21 +public class TradeMessageServiceImpl implements TradeMessageService {
  22 +
  23 + @Resource
  24 + private NotifyMessageSendApi notifyMessageSendApi;
  25 +
  26 + @Override
  27 + public void sendMessageWhenDeliveryOrder(TradeOrderMessageWhenDeliveryOrderReqBO reqBO) {
  28 + if (true) {
  29 + return;
  30 + }
  31 + // 1、构造消息
  32 + Map<String, Object> msgMap = new HashMap<>(2);
  33 + msgMap.put("orderId", reqBO.getOrderId());
  34 + msgMap.put("deliveryMessage", reqBO.getMessage());
  35 + // TODO 芋艿:看下模版
  36 + // 2、发送站内信
  37 + notifyMessageSendApi.sendSingleMessageToMember(
  38 + new NotifySendSingleToUserReqDTO()
  39 + .setUserId(reqBO.getUserId())
  40 + .setTemplateCode(MessageTemplateConstants.SMS_ORDER_DELIVERY)
  41 + .setTemplateParams(msgMap));
  42 + }
  43 +
  44 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/message/bo/TradeOrderMessageWhenDeliveryOrderReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.message.bo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 订单发货时通知创建 Req BO
  10 + *
  11 + * @author HUIHUI
  12 + */
  13 +@Data
  14 +public class TradeOrderMessageWhenDeliveryOrderReqBO {
  15 +
  16 + /**
  17 + * 订单编号
  18 + */
  19 + @NotNull(message = "订单编号不能为空")
  20 + private Long orderId;
  21 + /**
  22 + * 用户编号
  23 + */
  24 + @NotNull(message = "用户编号不能为空")
  25 + private Long userId;
  26 + /**
  27 + * 消息
  28 + */
  29 + @NotEmpty(message = "发送消息不能为空")
  30 + private String message;
  31 +
  32 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderLogService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order;
  2 +
  3 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO;
  4 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeOrderLogCreateReqBO;
  5 +import org.springframework.scheduling.annotation.Async;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * 交易下单日志 Service 接口
  11 + *
  12 + * @author 陈賝
  13 + * @since 2023/7/6 15:44
  14 + */
  15 +public interface TradeOrderLogService {
  16 +
  17 + /**
  18 + * 创建交易下单日志
  19 + *
  20 + * @param logDTO 日志记录
  21 + * @author 陈賝
  22 + * @since 2023/7/6 15:45
  23 + */
  24 + @Async
  25 + void createOrderLog(TradeOrderLogCreateReqBO logDTO);
  26 +
  27 + /**
  28 + * 获得交易订单日志列表
  29 + *
  30 + * @param orderId 订单编号
  31 + * @return 交易订单日志列表
  32 + */
  33 + List<TradeOrderLogDO> getOrderLogListByOrderId(Long orderId);
  34 +
  35 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderLogServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order;
  2 +
  3 +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderLogConvert;
  4 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO;
  5 +import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderLogMapper;
  6 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeOrderLogCreateReqBO;
  7 +import org.springframework.stereotype.Service;
  8 +
  9 +import jakarta.annotation.Resource;
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 交易下单日志 Service 实现类
  14 + *
  15 + * @author 陈賝
  16 + * @since 2023/7/6 15:44
  17 + */
  18 +@Service
  19 +public class TradeOrderLogServiceImpl implements TradeOrderLogService {
  20 +
  21 + @Resource
  22 + private TradeOrderLogMapper tradeOrderLogMapper;
  23 +
  24 + @Override
  25 + public void createOrderLog(TradeOrderLogCreateReqBO createReqBO) {
  26 + tradeOrderLogMapper.insert(TradeOrderLogConvert.INSTANCE.convert(createReqBO));
  27 + }
  28 +
  29 + @Override
  30 + public List<TradeOrderLogDO> getOrderLogListByOrderId(Long orderId) {
  31 + return tradeOrderLogMapper.selectListByOrderId(orderId);
  32 + }
  33 +
  34 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
  6 +import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  8 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  9 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  10 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
  11 +
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +
  15 +import static java.util.Collections.singleton;
  16 +
  17 +/**
  18 + * 交易订单【读】 Service 接口
  19 + *
  20 + * @author 芋道源码
  21 + */
  22 +public interface TradeOrderQueryService {
  23 +
  24 + // =================== Order ===================
  25 +
  26 + /**
  27 + * 获得指定编号的交易订单
  28 + *
  29 + * @param id 交易订单编号
  30 + * @return 交易订单
  31 + */
  32 + TradeOrderDO getOrder(Long id);
  33 +
  34 + /**
  35 + * 获得指定用户,指定的交易订单
  36 + *
  37 + * @param userId 用户编号
  38 + * @param id 交易订单编号
  39 + * @return 交易订单
  40 + */
  41 + TradeOrderDO getOrder(Long userId, Long id);
  42 +
  43 + /**
  44 + * 获得指定用户,指定活动,指定状态的交易订单
  45 + *
  46 + * @param userId 用户编号
  47 + * @param combinationActivityId 活动编号
  48 + * @param status 订单状态
  49 + * @return 交易订单
  50 + */
  51 + TradeOrderDO getOrderByUserIdAndStatusAndCombination(Long userId, Long combinationActivityId, Integer status);
  52 +
  53 + /**
  54 + * 获得订单列表
  55 + *
  56 + * @param ids 订单编号数组
  57 + * @return 订单列表
  58 + */
  59 + List<TradeOrderDO> getOrderList(Collection<Long> ids);
  60 +
  61 + /**
  62 + * 【管理员】获得交易订单分页
  63 + *
  64 + * @param reqVO 分页请求
  65 + * @return 交易订单
  66 + */
  67 + PageResult<TradeOrderDO> getOrderPage(TradeOrderPageReqVO reqVO);
  68 +
  69 + /**
  70 + * 获得订单统计
  71 + *
  72 + * @param reqVO 请求参数
  73 + * @return 订单统计
  74 + */
  75 + TradeOrderSummaryRespVO getOrderSummary(TradeOrderPageReqVO reqVO);
  76 +
  77 + /**
  78 + * 【会员】获得交易订单分页
  79 + *
  80 + * @param userId 用户编号
  81 + * @param reqVO 分页请求
  82 + * @return 交易订单
  83 + */
  84 + PageResult<TradeOrderDO> getOrderPage(Long userId, AppTradeOrderPageReqVO reqVO);
  85 +
  86 + /**
  87 + * 【会员】获得交易订单数量
  88 + *
  89 + * @param userId 用户编号
  90 + * @param status 订单状态。如果为空,则不进行筛选
  91 + * @param commonStatus 评价状态。如果为空,则不进行筛选
  92 + * @return 订单数量
  93 + */
  94 + Long getOrderCount(Long userId, Integer status, Boolean commonStatus);
  95 +
  96 + /**
  97 + * 【前台】获得订单的物流轨迹
  98 + *
  99 + * @param id 订单编号
  100 + * @param userId 用户编号
  101 + * @return 物流轨迹数组
  102 + */
  103 + List<ExpressTrackRespDTO> getExpressTrackList(Long id, Long userId);
  104 +
  105 + /**
  106 + * 【后台】获得订单的物流轨迹
  107 + *
  108 + * @param id 订单编号
  109 + * @return 物流轨迹数组
  110 + */
  111 + List<ExpressTrackRespDTO> getExpressTrackList(Long id);
  112 +
  113 + /**
  114 + * 【会员】在指定活动下,用户购买的商品数量
  115 + *
  116 + * @param userId 用户编号
  117 + * @param activityId 活动编号
  118 + * @param type 订单类型
  119 + * @return 活动商品数量
  120 + */
  121 + int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type);
  122 +
  123 + // =================== Order Item ===================
  124 +
  125 + /**
  126 + * 获得指定用户,指定的交易订单项
  127 + *
  128 + * @param userId 用户编号
  129 + * @param itemId 交易订单项编号
  130 + * @return 交易订单项
  131 + */
  132 + TradeOrderItemDO getOrderItem(Long userId, Long itemId);
  133 +
  134 + /**
  135 + * 获得交易订单项
  136 + *
  137 + * @param id 交易订单项编号 itemId
  138 + * @return 交易订单项
  139 + */
  140 + TradeOrderItemDO getOrderItem(Long id);
  141 +
  142 + /**
  143 + * 根据交易订单编号,查询交易订单项
  144 + *
  145 + * @param orderId 交易订单编号
  146 + * @return 交易订单项数组
  147 + */
  148 + default List<TradeOrderItemDO> getOrderItemListByOrderId(Long orderId) {
  149 + return getOrderItemListByOrderId(singleton(orderId));
  150 + }
  151 +
  152 + /**
  153 + * 根据交易订单编号数组,查询交易订单项
  154 + *
  155 + * @param orderIds 交易订单编号数组
  156 + * @return 交易订单项数组
  157 + */
  158 + List<TradeOrderItemDO> getOrderItemListByOrderId(Collection<Long> orderIds);
  159 +
  160 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeOrderLogCreateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.bo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 订单日志的创建 Request BO
  10 + *
  11 + * @author 陈賝
  12 + * @since 2023/7/6 15:27
  13 + */
  14 +@Data
  15 +public class TradeOrderLogCreateReqBO {
  16 +
  17 + /**
  18 + * 用户编号
  19 + */
  20 + @NotNull(message = "用户编号不能为空")
  21 + private Long userId;
  22 + /**
  23 + * 用户类型
  24 + */
  25 + @NotNull(message = "用户类型不能为空")
  26 + private Integer userType;
  27 +
  28 + /**
  29 + * 订单编号
  30 + */
  31 + @NotNull(message = "订单编号不能为空")
  32 + private Long orderId;
  33 + /**
  34 + * 操作前状态
  35 + */
  36 + private Integer beforeStatus;
  37 + /**
  38 + * 操作后状态
  39 + */
  40 + @NotNull(message = "操作后的状态不能为空")
  41 + private Integer afterStatus;
  42 +
  43 + /**
  44 + * 操作类型
  45 + */
  46 + @NotNull(message = "操作类型不能为空")
  47 + private Integer operateType;
  48 + /**
  49 + * 操作明细
  50 + */
  51 + @NotEmpty(message = "操作明细不能为空")
  52 + private String content;
  53 +
  54 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
  5 +import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi;
  6 +import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  8 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  9 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import jakarta.annotation.Resource;
  13 +import java.util.List;
  14 +
  15 +/**
  16 + * 砍价订单的 {@link TradeOrderHandler} 实现类
  17 + *
  18 + * @author HUIHUI
  19 + */
  20 +@Component
  21 +public class TradeBargainOrderHandler implements TradeOrderHandler {
  22 +
  23 + @Resource
  24 + private BargainActivityApi bargainActivityApi;
  25 + @Resource
  26 + private BargainRecordApi bargainRecordApi;
  27 +
  28 + @Override
  29 + public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  30 + if (!TradeOrderTypeEnum.isBargain(order.getType())) {
  31 + return;
  32 + }
  33 + // 明确校验一下
  34 + Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品");
  35 +
  36 + // 扣减砍价活动的库存
  37 + bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(),
  38 + -orderItems.get(0).getCount());
  39 + }
  40 +
  41 + @Override
  42 + public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  43 + if (!TradeOrderTypeEnum.isBargain(order.getType())) {
  44 + return;
  45 + }
  46 + // 明确校验一下
  47 + Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品");
  48 +
  49 + // 记录砍价记录对应的订单编号
  50 + bargainRecordApi.updateBargainRecordOrderId(order.getBargainRecordId(), order.getId());
  51 + }
  52 +
  53 + @Override
  54 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  55 + if (!TradeOrderTypeEnum.isBargain(order.getType())) {
  56 + return;
  57 + }
  58 + // 明确校验一下
  59 + Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品");
  60 +
  61 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  62 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  63 + if (CollUtil.isEmpty(orderItems)) {
  64 + return;
  65 + }
  66 + afterCancelOrderItem(order, orderItems.get(0));
  67 + }
  68 +
  69 + @Override
  70 + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
  71 + if (!TradeOrderTypeEnum.isBargain(order.getType())) {
  72 + return;
  73 + }
  74 + // 恢复(增加)砍价活动的库存
  75 + bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(), orderItem.getCount());
  76 + }
  77 +
  78 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBrokerageOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
  5 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  6 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  7 +import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
  8 +import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
  9 +import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
  10 +import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
  11 +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
  12 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
  13 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  14 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  15 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
  16 +import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService;
  17 +import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService;
  18 +import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
  19 +import org.springframework.stereotype.Component;
  20 +
  21 +import jakarta.annotation.Resource;
  22 +import java.util.List;
  23 +import java.util.Map;
  24 +
  25 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  26 +
  27 +/**
  28 + * 订单分销的 {@link TradeOrderHandler} 实现类
  29 + *
  30 + * @author 芋道源码
  31 + */
  32 +@Component
  33 +public class TradeBrokerageOrderHandler implements TradeOrderHandler {
  34 +
  35 + @Resource
  36 + private MemberUserApi memberUserApi;
  37 + @Resource
  38 + private ProductSpuApi productSpuApi;
  39 + @Resource
  40 + private ProductSkuApi productSkuApi;
  41 +
  42 + @Resource
  43 + private BrokerageRecordService brokerageRecordService;
  44 + @Resource
  45 + private BrokerageUserService brokerageUserService;
  46 +
  47 + @Override
  48 + public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  49 + // 设置订单推广人
  50 + BrokerageUserDO brokerageUser = brokerageUserService.getBrokerageUser(order.getUserId());
  51 + if (brokerageUser != null && brokerageUser.getBindUserId() != null) {
  52 + order.setBrokerageUserId(brokerageUser.getBindUserId());
  53 + }
  54 + }
  55 +
  56 + @Override
  57 + public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  58 + if (order.getBrokerageUserId() == null) {
  59 + return;
  60 + }
  61 + addBrokerage(order.getUserId(), orderItems);
  62 + }
  63 +
  64 + @Override
  65 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  66 + // 如果是未支付的订单,不会产生分销结果,所以直接 return
  67 + if (!order.getPayStatus()) {
  68 + return;
  69 + }
  70 + if (order.getBrokerageUserId() == null) {
  71 + return;
  72 + }
  73 +
  74 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  75 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  76 + if (CollUtil.isEmpty(orderItems)) {
  77 + return;
  78 + }
  79 + orderItems.forEach(orderItem -> afterCancelOrderItem(order, orderItem));
  80 + }
  81 +
  82 + @Override
  83 + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
  84 + if (order.getBrokerageUserId() == null) {
  85 + return;
  86 + }
  87 + brokerageRecordService.cancelBrokerage(BrokerageRecordBizTypeEnum.ORDER, String.valueOf(orderItem.getId()));
  88 + }
  89 +
  90 + /**
  91 + * 创建分销记录
  92 + * <p>
  93 + * 目前是支付成功后,就会创建分销记录。
  94 + * <p>
  95 + * 业内还有两种做法,可以根据自己的业务调整:
  96 + * 1. 确认收货后,才创建分销记录
  97 + * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻
  98 + *
  99 + * @param userId 用户编号
  100 + * @param orderItems 订单项
  101 + */
  102 + protected void addBrokerage(Long userId, List<TradeOrderItemDO> orderItems) {
  103 + MemberUserRespDTO user = memberUserApi.getUser(userId);
  104 + Assert.notNull(user);
  105 + Map<Long, ProductSpuRespDTO> spusMap = productSpuApi.getSpuMap(convertList(orderItems, TradeOrderItemDO::getSpuId));
  106 + Map<Long, ProductSkuRespDTO> skusMap = productSkuApi.getSkuMap(convertList(orderItems, TradeOrderItemDO::getSkuId));
  107 +
  108 + // 每一个订单项,都会去生成分销记录
  109 + List<BrokerageAddReqBO> addList = convertList(orderItems, item -> {
  110 + ProductSpuRespDTO spu = spusMap.get(item.getSpuId());
  111 + Assert.notNull(spu);
  112 + ProductSkuRespDTO sku = skusMap.get(item.getSkuId());
  113 + Assert.notNull(sku);
  114 + return TradeOrderConvert.INSTANCE.convert(user, item, spu, sku);
  115 + });
  116 + brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, addList);
  117 + }
  118 +
  119 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
  5 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateRespDTO;
  6 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
  7 +import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
  8 +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
  9 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  10 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  11 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
  12 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  13 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
  14 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
  15 +import org.springframework.context.annotation.Lazy;
  16 +import org.springframework.stereotype.Component;
  17 +
  18 +import jakarta.annotation.Resource;
  19 +import java.util.List;
  20 +
  21 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  22 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_EXIST_UNPAID;
  23 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS;
  24 +
  25 +/**
  26 + * 拼团订单的 {@link TradeOrderHandler} 实现类
  27 + *
  28 + * @author HUIHUI
  29 + */
  30 +@Component
  31 +public class TradeCombinationOrderHandler implements TradeOrderHandler {
  32 +
  33 + @Resource
  34 + @Lazy // 延迟加载,避免循环依赖
  35 + private TradeOrderUpdateService orderUpdateService;
  36 + @Resource
  37 + private TradeOrderQueryService orderQueryService;
  38 +
  39 + @Resource
  40 + @Lazy // 延迟加载,避免循环依赖
  41 + private CombinationRecordApi combinationRecordApi;
  42 +
  43 + @Override
  44 + public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  45 + // 如果不是拼团订单则结束
  46 + if (!TradeOrderTypeEnum.isCombination(order.getType())) {
  47 + return;
  48 + }
  49 + Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
  50 +
  51 + // 1. 校验是否满足拼团活动相关限制
  52 + TradeOrderItemDO item = orderItems.get(0);
  53 + combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(),
  54 + order.getCombinationHeadId(), item.getSkuId(), item.getCount());
  55 +
  56 + // 2. 校验该用户是否存在未支付的拼团活动订单,避免一个拼团可以下多个单子了
  57 + TradeOrderDO activityOrder = orderQueryService.getOrderByUserIdAndStatusAndCombination(
  58 + order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus());
  59 + if (activityOrder != null) {
  60 + throw exception(ORDER_CREATE_FAIL_EXIST_UNPAID);
  61 + }
  62 + }
  63 +
  64 + @Override
  65 + public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  66 + // 1.如果不是拼团订单则结束
  67 + if (!TradeOrderTypeEnum.isCombination(order.getType())) {
  68 + return;
  69 + }
  70 + Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
  71 +
  72 + // 2. 创建拼团记录
  73 + TradeOrderItemDO item = orderItems.get(0);
  74 + CombinationRecordCreateRespDTO combinationRecord = combinationRecordApi.createCombinationRecord(
  75 + TradeOrderConvert.INSTANCE.convert(order, item));
  76 +
  77 + // 3. 更新拼团相关信息到订单。为什么几个字段都要更新?
  78 + // 原因是:如果创建订单时自己是团长的情况下 combinationHeadId 是为 null 的,设置团长编号这个操作时在订单是否后创建拼团记录时才设置的。
  79 + orderUpdateService.updateOrderCombinationInfo(order.getId(), order.getCombinationActivityId(),
  80 + combinationRecord.getCombinationRecordId(), combinationRecord.getCombinationHeadId());
  81 + }
  82 +
  83 + @Override
  84 + public void beforeDeliveryOrder(TradeOrderDO order) {
  85 + if (!TradeOrderTypeEnum.isCombination(order.getType())) {
  86 + return;
  87 + }
  88 + // 校验订单拼团是否成功
  89 + CombinationRecordRespDTO combinationRecord = combinationRecordApi.getCombinationRecordByOrderId(order.getUserId(), order.getId());
  90 + Assert.notNull(combinationRecord, "订单({})对应的拼团记录不存在", order.getId());
  91 + if (!CombinationRecordStatusEnum.isSuccess(combinationRecord.getStatus())) {
  92 + throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS);
  93 + }
  94 + }
  95 +
  96 +}
  97 +
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCouponOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi;
  5 +import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  8 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
  9 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService;
  10 +import jakarta.annotation.Resource;
  11 +import lombok.extern.slf4j.Slf4j;
  12 +import org.springframework.context.annotation.Lazy;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import java.util.List;
  16 +
  17 +/**
  18 + * 优惠劵的 {@link TradeOrderHandler} 实现类
  19 + *
  20 + * @author 芋道源码
  21 + */
  22 +@Component
  23 +@Slf4j
  24 +public class TradeCouponOrderHandler implements TradeOrderHandler {
  25 +
  26 + @Resource
  27 + @Lazy // 延迟加载,避免循环依赖
  28 + private TradeOrderUpdateService orderUpdateService;
  29 + @Resource
  30 + private TradeOrderQueryService orderQueryService;
  31 +
  32 + @Resource
  33 + private CouponApi couponApi;
  34 +
  35 + @Override
  36 + public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  37 + if (order.getCouponId() == null || order.getCouponId() <= 0) {
  38 + return;
  39 + }
  40 + // 不在前置扣减的原因,是因为优惠劵要记录使用的订单号
  41 + couponApi.useCoupon(new CouponUseReqDTO().setId(order.getCouponId()).setUserId(order.getUserId())
  42 + .setOrderId(order.getId()));
  43 + }
  44 +
  45 + @Override
  46 + public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  47 + if (CollUtil.isEmpty(order.getGiveCouponTemplateCounts())) {
  48 + return;
  49 + }
  50 + // 赠送优惠券
  51 + try {
  52 + List<Long> couponIds = couponApi.takeCouponsByAdmin(order.getGiveCouponTemplateCounts(), order.getUserId());
  53 + if (CollUtil.isEmpty(couponIds)) {
  54 + return;
  55 + }
  56 + orderUpdateService.updateOrderGiveCouponIds(order.getUserId(), order.getId(), couponIds);
  57 + } catch (Exception e) {
  58 + log.error("[afterPayOrder][order({}) 赠送优惠券({})失败,需要手工补偿]", order.getId(), order.getGiveCouponTemplateCounts(), e);
  59 + }
  60 + }
  61 +
  62 + @Override
  63 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  64 + // 情况一:退还订单使用的优惠券
  65 + if (order.getCouponId() != null && order.getCouponId() > 0) {
  66 + // 退回优惠劵
  67 + couponApi.returnUsedCoupon(order.getCouponId());
  68 + }
  69 + // 情况二:收回赠送的优惠券
  70 + if (CollUtil.isEmpty(order.getGiveCouponIds())) {
  71 + return;
  72 + }
  73 + couponApi.invalidateCouponsByAdmin(order.getGiveCouponIds(), order.getUserId());
  74 + }
  75 +
  76 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeMemberPointOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
  5 +import cn.iocoder.yudao.module.member.api.point.MemberPointApi;
  6 +import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
  7 +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
  9 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  10 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  11 +import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleService;
  12 +import org.springframework.stereotype.Component;
  13 +
  14 +import jakarta.annotation.Resource;
  15 +import java.util.List;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
  18 +
  19 +/**
  20 + * 会员积分、等级的 {@link TradeOrderHandler} 实现类
  21 + *
  22 + * @author owen
  23 + */
  24 +@Component
  25 +public class TradeMemberPointOrderHandler implements TradeOrderHandler {
  26 +
  27 + @Resource
  28 + private MemberPointApi memberPointApi;
  29 + @Resource
  30 + private MemberLevelApi memberLevelApi;
  31 +
  32 + @Resource
  33 + private AfterSaleService afterSaleService;
  34 +
  35 + @Override
  36 + public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  37 + // 扣减用户积分(订单抵扣)。不在前置扣减的原因,是因为积分扣减时,需要记录关联业务
  38 + reducePoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE, order.getId());
  39 + }
  40 +
  41 + @Override
  42 + public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  43 + // 增加用户积分(订单赠送)
  44 + addPoint(order.getUserId(), order.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE,
  45 + order.getId());
  46 +
  47 + // 增加用户经验
  48 + memberLevelApi.addExperience(order.getUserId(), order.getPayPrice(),
  49 + MemberExperienceBizTypeEnum.ORDER_GIVE.getType(), String.valueOf(order.getId()));
  50 + }
  51 +
  52 + @Override
  53 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  54 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  55 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  56 + if (CollUtil.isEmpty(orderItems)) {
  57 + return;
  58 + }
  59 +
  60 + // 增加(回滚)用户积分(订单抵扣)
  61 + Integer usePoint = getSumValue(orderItems, TradeOrderItemDO::getUsePoint, Integer::sum);
  62 + addPoint(order.getUserId(), usePoint, MemberPointBizTypeEnum.ORDER_USE_CANCEL,
  63 + order.getId());
  64 +
  65 + // 如下的返还,需要经过支持,也就是经历 afterPayOrder 流程
  66 + if (!order.getPayStatus()) {
  67 + return;
  68 + }
  69 + // 扣减(回滚)积分(订单赠送)
  70 + Integer givePoint = getSumValue(orderItems, TradeOrderItemDO::getGivePoint, Integer::sum);
  71 + reducePoint(order.getUserId(), givePoint, MemberPointBizTypeEnum.ORDER_GIVE_CANCEL,
  72 + order.getId());
  73 + // 扣减(回滚)用户经验
  74 + int payPrice = order.getPayPrice() - order.getRefundPrice();
  75 + memberLevelApi.addExperience(order.getUserId(), payPrice,
  76 + MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL.getType(), String.valueOf(order.getId()));
  77 + }
  78 +
  79 + @Override
  80 + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
  81 + // 增加(回滚)积分(订单抵扣)
  82 + addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE_CANCEL_ITEM, orderItem.getId());
  83 + // 扣减(回滚)积分(订单赠送)
  84 + reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE_CANCEL_ITEM, orderItem.getId());
  85 +
  86 + // 扣减(回滚)用户经验
  87 + AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId());
  88 + memberLevelApi.reduceExperience(order.getUserId(), afterSale.getRefundPrice(),
  89 + MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL_ITEM.getType(), String.valueOf(orderItem.getId()));
  90 + }
  91 +
  92 + /**
  93 + * 添加用户积分
  94 + * <p>
  95 + * 目前是支付成功后,就会创建积分记录。
  96 + * <p>
  97 + * 业内还有两种做法,可以根据自己的业务调整:
  98 + * 1. 确认收货后,才创建积分记录
  99 + * 2. 支付 or 下单成功时,创建积分记录(冻结),确认收货解冻或者 n 天后解冻
  100 + *
  101 + * @param userId 用户编号
  102 + * @param point 增加积分数量
  103 + * @param bizType 业务编号
  104 + * @param bizId 业务编号
  105 + */
  106 + protected void addPoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) {
  107 + if (point != null && point > 0) {
  108 + memberPointApi.addPoint(userId, point, bizType.getType(), String.valueOf(bizId));
  109 + }
  110 + }
  111 +
  112 + protected void reducePoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) {
  113 + if (point != null && point > 0) {
  114 + memberPointApi.reducePoint(userId, point, bizType.getType(), String.valueOf(bizId));
  115 + }
  116 + }
  117 +
  118 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  4 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  5 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  6 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * 订单活动特殊逻辑处理器 handler 接口
  12 + * 提供订单生命周期钩子接口;订单创建前、订单创建后、订单支付后、订单取消
  13 + *
  14 + * @author HUIHUI
  15 + */
  16 +public interface TradeOrderHandler {
  17 +
  18 + /**
  19 + * 订单创建前
  20 + *
  21 + * @param order 订单
  22 + * @param orderItems 订单项
  23 + */
  24 + default void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {}
  25 +
  26 + /**
  27 + * 订单创建后
  28 + *
  29 + * @param order 订单
  30 + * @param orderItems 订单项
  31 + */
  32 + default void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {}
  33 +
  34 + /**
  35 + * 支付订单后
  36 + *
  37 + * @param order 订单
  38 + * @param orderItems 订单项
  39 + */
  40 + default void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {}
  41 +
  42 + /**
  43 + * 订单取消后
  44 + *
  45 + * @param order 订单
  46 + * @param orderItems 订单项
  47 + */
  48 + default void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {}
  49 +
  50 + /**
  51 + * 订单项取消后
  52 + *
  53 + * @param order 订单
  54 + * @param orderItem 订单项
  55 + */
  56 + default void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {}
  57 +
  58 + /**
  59 + * 订单发货前
  60 + *
  61 + * @param order 订单
  62 + */
  63 + default void beforeDeliveryOrder(TradeOrderDO order) {}
  64 +
  65 + /**
  66 + * 订单发货后
  67 + *
  68 + * @param order 订单
  69 + */
  70 + default void afterDeliveryOrder(TradeOrderDO order) {}
  71 +
  72 + /**
  73 + * 订单收货前
  74 + *
  75 + * @param order 订单
  76 + */
  77 + default void beforeReceiveOrder(TradeOrderDO order) {}
  78 +
  79 + /**
  80 + * 订单收货后
  81 + *
  82 + * @param order 订单
  83 + */
  84 + default void afterReceiveOrder(TradeOrderDO order) {}
  85 +
  86 + // ========== 公用方法 ==========
  87 +
  88 + /**
  89 + * 过滤“未售后”的订单项列表
  90 + *
  91 + * @param orderItems 订单项列表
  92 + * @return 过滤后的订单项列表
  93 + */
  94 + default List<TradeOrderItemDO> filterOrderItemListByNoneAfterSale(List<TradeOrderItemDO> orderItems) {
  95 + return CollectionUtils.filterList(orderItems,
  96 + item -> TradeOrderItemAfterSaleStatusEnum.isNone(item.getAfterSaleStatus()));
  97 + }
  98 +
  99 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradePointOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
  5 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  6 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  7 +import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi;
  8 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  9 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  10 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
  11 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  12 +import jakarta.annotation.Resource;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import java.util.List;
  16 +import java.util.Objects;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  19 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS;
  20 +
  21 +/**
  22 + * 积分商城活动订单的 {@link TradeOrderHandler} 实现类
  23 + *
  24 + * @author HUIHUI
  25 + */
  26 +@Component
  27 +public class TradePointOrderHandler implements TradeOrderHandler {
  28 +
  29 + @Resource
  30 + private PointActivityApi pointActivityApi;
  31 + @Resource
  32 + private MemberUserApi memberUserApi;
  33 +
  34 + @Override
  35 + public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  36 + if (!TradeOrderTypeEnum.isPoint(order.getType())) {
  37 + return;
  38 + }
  39 + // 明确校验一下
  40 + Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品");
  41 + // 校验用户剩余积分是否足够兑换商品
  42 + MemberUserRespDTO user = memberUserApi.getUser(order.getUserId());
  43 + if (user.getPoint() < order.getUsePoint()) {
  44 + throw exception(ORDER_CREATE_FAIL_INSUFFICIENT_USER_POINTS);
  45 + }
  46 +
  47 + // 扣减积分商城活动的库存
  48 + pointActivityApi.updatePointStockDecr(order.getPointActivityId(),
  49 + orderItems.get(0).getSkuId(), orderItems.get(0).getCount());
  50 +
  51 + // 如果支付金额为 0,则直接设置为已支付
  52 + if (Objects.equals(order.getPayPrice(), 0)) {
  53 + order.setPayStatus(true).setStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus());
  54 + }
  55 + }
  56 +
  57 + @Override
  58 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  59 + if (!TradeOrderTypeEnum.isPoint(order.getType())) {
  60 + return;
  61 + }
  62 + // 明确校验一下
  63 + Assert.isTrue(orderItems.size() == 1, "积分商城活动兑换商品兑换时,只允许选择一个商品");
  64 +
  65 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  66 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  67 + if (CollUtil.isEmpty(orderItems)) {
  68 + return;
  69 + }
  70 + afterCancelOrderItem(order, orderItems.get(0));
  71 + }
  72 +
  73 + @Override
  74 + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
  75 + if (!TradeOrderTypeEnum.isPoint(order.getType())) {
  76 + return;
  77 + }
  78 + // 恢复积分商城活动的库存
  79 + pointActivityApi.updatePointStockIncr(order.getPointActivityId(),
  80 + orderItem.getSkuId(), orderItem.getCount());
  81 + }
  82 +
  83 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeProductSkuOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
  5 +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +import jakarta.annotation.Resource;
  11 +import java.util.List;
  12 +
  13 +import static java.util.Collections.singletonList;
  14 +
  15 +/**
  16 + * 商品 SKU 库存的 {@link TradeOrderHandler} 实现类
  17 + *
  18 + * @author 芋道源码
  19 + */
  20 +@Component
  21 +public class TradeProductSkuOrderHandler implements TradeOrderHandler {
  22 +
  23 + @Resource
  24 + private ProductSkuApi productSkuApi;
  25 +
  26 + @Override
  27 + public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  28 + productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convertNegative(orderItems));
  29 + }
  30 +
  31 + @Override
  32 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  33 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  34 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  35 + if (CollUtil.isEmpty(orderItems)) {
  36 + return;
  37 + }
  38 + productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems));
  39 + }
  40 +
  41 + @Override
  42 + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
  43 + productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(singletonList(orderItem)));
  44 + }
  45 +
  46 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
  5 +import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  8 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import jakarta.annotation.Resource;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 秒杀订单的 {@link TradeOrderHandler} 实现类
  16 + *
  17 + * @author HUIHUI
  18 + */
  19 +@Component
  20 +public class TradeSeckillOrderHandler implements TradeOrderHandler {
  21 +
  22 + @Resource
  23 + private SeckillActivityApi seckillActivityApi;
  24 +
  25 + @Override
  26 + public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  27 + if (!TradeOrderTypeEnum.isSeckill(order.getType())) {
  28 + return;
  29 + }
  30 + // 明确校验一下
  31 + Assert.isTrue(orderItems.size() == 1, "秒杀时,只允许选择一个商品");
  32 +
  33 + // 扣减秒杀活动的库存
  34 + seckillActivityApi.updateSeckillStockDecr(order.getSeckillActivityId(),
  35 + orderItems.get(0).getSkuId(), orderItems.get(0).getCount());
  36 + }
  37 +
  38 + @Override
  39 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  40 + if (!TradeOrderTypeEnum.isSeckill(order.getType())) {
  41 + return;
  42 + }
  43 + // 明确校验一下
  44 + Assert.isTrue(orderItems.size() == 1, "秒杀时,只允许选择一个商品");
  45 +
  46 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  47 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  48 + if (CollUtil.isEmpty(orderItems)) {
  49 + return;
  50 + }
  51 + afterCancelOrderItem(order, orderItems.get(0));
  52 + }
  53 +
  54 + @Override
  55 + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
  56 + if (!TradeOrderTypeEnum.isSeckill(order.getType())) {
  57 + return;
  58 + }
  59 + // 恢复秒杀活动的库存
  60 + seckillActivityApi.updateSeckillStockIncr(order.getSeckillActivityId(),
  61 + orderItem.getSkuId(), orderItem.getCount());
  62 + }
  63 +
  64 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeStatusSyncToWxaOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.util.ObjUtil;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  6 +import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;
  7 +import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;
  8 +import cn.iocoder.yudao.module.pay.enums.PayChannelEnum;
  9 +import cn.iocoder.yudao.module.system.api.social.SocialClientApi;
  10 +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaOrderNotifyConfirmReceiveReqDTO;
  11 +import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaOrderUploadShippingInfoReqDTO;
  12 +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  13 +import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
  14 +import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
  15 +import jakarta.annotation.Resource;
  16 +import lombok.extern.slf4j.Slf4j;
  17 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  18 +import org.springframework.stereotype.Component;
  19 +
  20 +/**
  21 + * 同步订单状态到微信小程序的 {@link TradeOrderHandler} 实现类
  22 + *
  23 + * 背景:电商类目的微信小程序需要上传发货信息,不然微信支付会被封 = =!
  24 + * 注意:微信小程序开发环境下的订单不能用来发货。只有小程序正式版才会有发货,所以体验版无法调通,提示订单不存在。注意别踩坑。
  25 + */
  26 +@Slf4j
  27 +@Component
  28 +@ConditionalOnProperty(prefix = "yudao.trade.order", value = "status-sync-to-wxa-enable")
  29 +public class TradeStatusSyncToWxaOrderHandler implements TradeOrderHandler {
  30 +
  31 + @Resource
  32 + private PayOrderApi payOrderApi;
  33 + @Resource
  34 + private SocialClientApi socialClientApi;
  35 +
  36 + @Resource
  37 + private DeliveryExpressService expressService;
  38 +
  39 + @Override
  40 + public void afterDeliveryOrder(TradeOrderDO order) {
  41 + // 注意:只有微信小程序支付的订单,才需要同步
  42 + if (ObjUtil.notEqual(order.getPayChannelCode(), PayChannelEnum.WX_LITE.getCode())) {
  43 + return;
  44 + }
  45 + PayOrderRespDTO payOrder = payOrderApi.getOrder(order.getPayOrderId());
  46 + SocialWxaOrderUploadShippingInfoReqDTO reqDTO = new SocialWxaOrderUploadShippingInfoReqDTO()
  47 + .setTransactionId(payOrder.getChannelOrderNo())
  48 + .setOpenid(payOrder.getChannelUserId())
  49 + .setItemDesc(payOrder.getSubject())
  50 + .setReceiverContact(order.getReceiverMobile());
  51 + if (DeliveryTypeEnum.EXPRESS.getType().equals(order.getDeliveryType()) && StrUtil.isNotEmpty(order.getLogisticsNo())) {
  52 + reqDTO.setLogisticsType(SocialWxaOrderUploadShippingInfoReqDTO.LOGISTICS_TYPE_EXPRESS)
  53 + .setExpressCompany(expressService.getDeliveryExpress(order.getLogisticsId()).getCode())
  54 + .setLogisticsNo(order.getLogisticsNo());
  55 + } else if (DeliveryTypeEnum.PICK_UP.getType().equals(order.getDeliveryType())) {
  56 + reqDTO.setLogisticsType(SocialWxaOrderUploadShippingInfoReqDTO.LOGISTICS_TYPE_PICK_UP);
  57 + } else {
  58 + reqDTO.setLogisticsType(SocialWxaOrderUploadShippingInfoReqDTO.LOGISTICS_TYPE_VIRTUAL);
  59 + }
  60 + try {
  61 + socialClientApi.uploadWxaOrderShippingInfo(UserTypeEnum.MEMBER.getValue(), reqDTO);
  62 + } catch (Exception ex) {
  63 + log.error("[afterDeliveryOrder][订单({}) 上传订单物流信息到微信小程序失败]", order, ex);
  64 + }
  65 + }
  66 +
  67 + @Override
  68 + public void afterReceiveOrder(TradeOrderDO order) {
  69 + // 注意:只有微信小程序支付的订单,才需要同步
  70 + if (ObjUtil.notEqual(order.getPayChannelCode(), PayChannelEnum.WX_LITE.getCode())) {
  71 + return;
  72 + }
  73 + PayOrderRespDTO payOrder = payOrderApi.getOrder(order.getPayOrderId());
  74 + SocialWxaOrderNotifyConfirmReceiveReqDTO reqDTO = new SocialWxaOrderNotifyConfirmReceiveReqDTO()
  75 + .setTransactionId(payOrder.getChannelOrderNo())
  76 + .setReceivedTime(order.getReceiveTime());
  77 + try {
  78 + socialClientApi.notifyWxaOrderConfirmReceive(UserTypeEnum.MEMBER.getValue(), reqDTO);
  79 + } catch (Exception ex) {
  80 + log.error("[afterReceiveOrder][订单({}) 通知订单收货到微信小程序失败]", order, ex);
  81 + }
  82 + }
  83 +
  84 + // TODO @芋艿:【设置路径】 https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html#%E5%85%AD%E3%80%81%E6%B6%88%E6%81%AF%E8%B7%B3%E8%BD%AC%E8%B7%AF%E5%BE%84%E8%AE%BE%E7%BD%AE%E6%8E%A5%E5%8F%A3
  85 +
  86 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price;
  2 +
  3 +import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeProductSettlementRespVO;
  4 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  5 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  6 +import jakarta.validation.Valid;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * 价格计算 Service 接口
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +public interface TradePriceService {
  16 +
  17 + /**
  18 + * 【订单】价格计算
  19 + *
  20 + * @param calculateReqDTO 计算信息
  21 + * @return 计算结果
  22 + */
  23 + TradePriceCalculateRespBO calculateOrderPrice(@Valid TradePriceCalculateReqBO calculateReqDTO);
  24 +
  25 + /**
  26 + * 【商品】价格计算,用于商品列表、商品详情
  27 + *
  28 + * @param userId 用户编号,允许为空
  29 + * @param spuIds 商品 SPU 编号数组
  30 + * @return 计算结果
  31 + */
  32 + List<AppTradeProductSettlementRespVO> calculateProductPrice(Long userId, List<Long> spuIds);
  33 +
  34 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImpl.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImpl.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.bo;
  2 +
  3 +import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
  4 +import jakarta.validation.Valid;
  5 +import jakarta.validation.constraints.Min;
  6 +import jakarta.validation.constraints.NotNull;
  7 +import lombok.Data;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * 价格计算 Request BO
  13 + *
  14 + * @author yudao源码
  15 + */
  16 +@Data
  17 +public class TradePriceCalculateReqBO {
  18 +
  19 + /**
  20 + * 用户编号
  21 + *
  22 + * 对应 MemberUserDO 的 id 编号
  23 + */
  24 + private Long userId;
  25 +
  26 + /**
  27 + * 优惠劵编号
  28 + *
  29 + * 对应 CouponDO 的 id 编号
  30 + */
  31 + private Long couponId;
  32 +
  33 + /**
  34 + * 是否使用积分
  35 + */
  36 + @NotNull(message = "是否使用积分不能为空")
  37 + private Boolean pointStatus;
  38 +
  39 + /**
  40 + * 配送方式
  41 + *
  42 + * 枚举 {@link DeliveryTypeEnum}
  43 + */
  44 + private Integer deliveryType;
  45 + /**
  46 + * 收货地址编号
  47 + *
  48 + * 对应 MemberAddressDO 的 id 编号
  49 + */
  50 + private Long addressId;
  51 + /**
  52 + * 自提门店编号
  53 + *
  54 + * 对应 PickUpStoreDO 的 id 编号
  55 + */
  56 + private Long pickUpStoreId;
  57 +
  58 + /**
  59 + * 商品 SKU 数组
  60 + */
  61 + @NotNull(message = "商品数组不能为空")
  62 + private List<Item> items;
  63 +
  64 + // ========== 秒杀活动相关字段 ==========
  65 + /**
  66 + * 秒杀活动编号
  67 + */
  68 + private Long seckillActivityId;
  69 +
  70 + // ========== 拼团活动相关字段 ==========
  71 + /**
  72 + * 拼团活动编号
  73 + */
  74 + private Long combinationActivityId;
  75 +
  76 + /**
  77 + * 拼团团长编号
  78 + */
  79 + private Long combinationHeadId;
  80 +
  81 + // ========== 砍价活动相关字段 ==========
  82 + /**
  83 + * 砍价记录编号
  84 + */
  85 + private Long bargainRecordId;
  86 +
  87 + // ========== 积分商城活动相关字段 ==========
  88 + /**
  89 + * 积分商城活动编号
  90 + */
  91 + private Long pointActivityId;
  92 +
  93 + /**
  94 + * 商品 SKU
  95 + */
  96 + @Data
  97 + @Valid
  98 + public static class Item {
  99 +
  100 + /**
  101 + * SKU 编号
  102 + */
  103 + @NotNull(message = "商品 SKU 编号不能为空")
  104 + private Long skuId;
  105 +
  106 + /**
  107 + * SKU 数量
  108 + */
  109 + @NotNull(message = "商品 SKU 数量不能为空")
  110 + @Min(value = 0L, message = "商品 SKU 数量必须大于等于 0")
  111 + private Integer count;
  112 +
  113 + /**
  114 + * 购物车项的编号
  115 + */
  116 + private Long cartId;
  117 +
  118 + /**
  119 + * 是否选中
  120 + */
  121 + @NotNull(message = "是否选中不能为空")
  122 + private Boolean selected;
  123 +
  124 + }
  125 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeBargainActivityPriceCalculator.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.hutool.core.util.StrUtil;
  6 +import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
  7 +import cn.iocoder.yudao.module.promotion.api.bargain.dto.BargainValidateJoinRespDTO;
  8 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  9 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  10 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  11 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  12 +import org.springframework.core.annotation.Order;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import jakarta.annotation.Resource;
  16 +
  17 +// TODO huihui:单测需要补充
  18 +/**
  19 + * 砍价活动的 {@link TradePriceCalculator} 实现类
  20 + *
  21 + * @author 芋道源码
  22 + */
  23 +@Component
  24 +@Order(TradePriceCalculator.ORDER_BARGAIN_ACTIVITY)
  25 +public class TradeBargainActivityPriceCalculator implements TradePriceCalculator {
  26 +
  27 + @Resource
  28 + private BargainRecordApi bargainRecordApi;
  29 +
  30 + @Override
  31 + public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  32 + // 1. 判断订单类型和是否具有拼团记录编号
  33 + if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.BARGAIN.getType())) {
  34 + return;
  35 + }
  36 + Assert.isTrue(param.getItems().size() == 1, "砍价时,只允许选择一个商品");
  37 + Assert.isTrue(param.getItems().get(0).getCount() == 1, "砍价时,只允许选择一个商品");
  38 + // 2. 校验是否可以参与砍价
  39 + TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);
  40 + BargainValidateJoinRespDTO bargainActivity = bargainRecordApi.validateJoinBargain(
  41 + param.getUserId(), param.getBargainRecordId(), orderItem.getSkuId());
  42 +
  43 + // 3.1 记录优惠明细
  44 + Integer discountPrice = orderItem.getPayPrice() - bargainActivity.getBargainPrice() * orderItem.getCount();
  45 + // TODO 芋艿:极端情况,优惠金额为负数,需要处理
  46 + TradePriceCalculatorHelper.addPromotion(result, orderItem,
  47 + param.getSeckillActivityId(), bargainActivity.getName(), PromotionTypeEnum.BARGAIN_ACTIVITY.getType(),
  48 + StrUtil.format("砍价活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),
  49 + discountPrice);
  50 + // 3.2 更新 SKU 优惠金额
  51 + orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);
  52 + TradePriceCalculatorHelper.recountPayPrice(orderItem);
  53 + TradePriceCalculatorHelper.recountAllPrice(result);
  54 + // 4. 特殊:设置对应的砍价活动编号
  55 + result.setBargainActivityId(bargainActivity.getActivityId());
  56 + }
  57 +
  58 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCombinationActivityPriceCalculator.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
  6 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationValidateJoinRespDTO;
  7 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  9 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  10 +import org.springframework.core.annotation.Order;
  11 +import org.springframework.stereotype.Component;
  12 +
  13 +import jakarta.annotation.Resource;
  14 +
  15 +// TODO @puhui999:单测可以后补下
  16 +
  17 +/**
  18 + * 拼团活动的 {@link TradePriceCalculator} 实现类
  19 + *
  20 + * @author HUIHUI
  21 + */
  22 +@Component
  23 +@Order(TradePriceCalculator.ORDER_COMBINATION_ACTIVITY)
  24 +public class TradeCombinationActivityPriceCalculator implements TradePriceCalculator {
  25 +
  26 + @Resource
  27 + private CombinationRecordApi combinationRecordApi;
  28 +
  29 + @Override
  30 + public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  31 + // 1. 判断订单类型和是否具有拼团活动编号
  32 + if (param.getCombinationActivityId() == null) {
  33 + return;
  34 + }
  35 + Assert.isTrue(param.getItems().size() == 1, "拼团时,只允许选择一个商品");
  36 + // 2. 校验是否可以参与拼团
  37 + TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);
  38 + CombinationValidateJoinRespDTO combinationActivity = combinationRecordApi.validateJoinCombination(
  39 + param.getUserId(), param.getCombinationActivityId(), param.getCombinationHeadId(),
  40 + orderItem.getSkuId(), orderItem.getCount());
  41 +
  42 + // 3.1 记录优惠明细
  43 + Integer discountPrice = orderItem.getPayPrice() - combinationActivity.getCombinationPrice() * orderItem.getCount();
  44 + TradePriceCalculatorHelper.addPromotion(result, orderItem,
  45 + param.getCombinationActivityId(), combinationActivity.getName(), PromotionTypeEnum.COMBINATION_ACTIVITY.getType(),
  46 + StrUtil.format("拼团活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),
  47 + discountPrice);
  48 + // 3.2 更新 SKU 优惠金额
  49 + orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);
  50 + TradePriceCalculatorHelper.recountPayPrice(orderItem);
  51 + TradePriceCalculatorHelper.recountAllPrice(result);
  52 + }
  53 +
  54 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculator.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculator.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.hutool.core.util.StrUtil;
  6 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  7 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  8 +import cn.iocoder.yudao.module.promotion.api.point.PointActivityApi;
  9 +import cn.iocoder.yudao.module.promotion.api.point.dto.PointValidateJoinRespDTO;
  10 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  11 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  12 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
  13 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  14 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  15 +import jakarta.annotation.Resource;
  16 +import lombok.extern.slf4j.Slf4j;
  17 +import org.springframework.core.annotation.Order;
  18 +import org.springframework.stereotype.Component;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  21 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT;
  22 +
  23 +/**
  24 + * 积分商城的 {@link TradePriceCalculator} 实现类
  25 + *
  26 + * @author owen
  27 + */
  28 +@Component
  29 +@Order(TradePriceCalculator.ORDER_POINT_ACTIVITY)
  30 +@Slf4j
  31 +public class TradePointActivityPriceCalculator implements TradePriceCalculator {
  32 +
  33 + @Resource
  34 + private PointActivityApi pointActivityApi;
  35 + @Resource
  36 + private MemberUserApi memberUserApi;
  37 +
  38 + @Resource
  39 + private TradeOrderQueryService tradeOrderQueryService;
  40 +
  41 + @Override
  42 + public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  43 + // 1.1 判断订单类型是否为积分商城活动
  44 + if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.POINT.getType())) {
  45 + return;
  46 + }
  47 + // 1.2 初始化积分
  48 + MemberUserRespDTO user = memberUserApi.getUser(param.getUserId());
  49 + result.setTotalPoint(user.getPoint()).setUsePoint(0);
  50 +
  51 + // 1.3 校验用户积分余额
  52 + if (user.getPoint() == null || user.getPoint() <= 0) {
  53 + return;
  54 + }
  55 +
  56 + Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品");
  57 + // 2. 校验是否可以参与积分商城活动
  58 + TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);
  59 + PointValidateJoinRespDTO activity = validateJoinPointActivity(
  60 + param.getUserId(), param.getPointActivityId(),
  61 + orderItem.getSkuId(), orderItem.getCount());
  62 +
  63 + // 3.0 积分兑换前置校验
  64 + Assert.isTrue(activity.getPoint() >= 1, "积分商城商品兑换积分必须大于 1");
  65 + // 3.1 记录优惠明细
  66 + int usePoint = activity.getPoint() * orderItem.getCount();
  67 + result.setUsePoint(usePoint);
  68 + orderItem.setUsePoint(usePoint);
  69 + int discountPrice = orderItem.getPayPrice(); // 情况一:单使用积分兑换
  70 + if (activity.getPrice() != null && activity.getPrice() > 0) { // 情况二:积分 + 金额
  71 + discountPrice = orderItem.getPayPrice() - activity.getPrice() * orderItem.getCount();
  72 + }
  73 + TradePriceCalculatorHelper.addPromotion(result, orderItem,
  74 + param.getPointActivityId(), "积分商城活动", PromotionTypeEnum.POINT.getType(),
  75 + StrUtil.format("积分商城活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),
  76 + discountPrice);
  77 + // 3.2 更新 SKU 优惠金额
  78 + orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);
  79 + TradePriceCalculatorHelper.recountPayPrice(orderItem);
  80 + TradePriceCalculatorHelper.recountAllPrice(result);
  81 + }
  82 +
  83 + private PointValidateJoinRespDTO validateJoinPointActivity(Long userId, Long activityId, Long skuId, Integer count) {
  84 + // 1. 校验是否可以参与积分商城活动
  85 + PointValidateJoinRespDTO pointValidateJoinRespDTO = pointActivityApi.validateJoinPointActivity(activityId, skuId, count);
  86 + // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用
  87 + int pointProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.POINT);
  88 + if (pointProductCount + count > pointValidateJoinRespDTO.getCount()) {
  89 + throw exception(PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT);
  90 + }
  91 + return pointValidateJoinRespDTO;
  92 + }
  93 +
  94 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculator.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.hutool.core.util.BooleanUtil;
  4 +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
  5 +import cn.iocoder.yudao.module.member.api.config.MemberConfigApi;
  6 +import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO;
  7 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  8 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  9 +import lombok.extern.slf4j.Slf4j;
  10 +import org.springframework.core.annotation.Order;
  11 +import org.springframework.stereotype.Component;
  12 +
  13 +import jakarta.annotation.Resource;
  14 +import java.util.List;
  15 +import java.util.Optional;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
  18 +
  19 +/**
  20 + * 赠送积分的 {@link TradePriceCalculator} 实现类
  21 + *
  22 + * @author owen
  23 + */
  24 +@Component
  25 +@Order(TradePriceCalculator.ORDER_POINT_GIVE)
  26 +@Slf4j
  27 +public class TradePointGiveCalculator implements TradePriceCalculator {
  28 +
  29 + @Resource
  30 + private MemberConfigApi memberConfigApi;
  31 +
  32 + @Override
  33 + public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  34 + // 1.1 校验积分功能是否开启
  35 + int givePointPerYuan = Optional.ofNullable(memberConfigApi.getConfig())
  36 + .filter(config -> BooleanUtil.isTrue(config.getPointTradeDeductEnable()))
  37 + .map(MemberConfigRespDTO::getPointTradeGivePoint)
  38 + .orElse(0);
  39 + if (givePointPerYuan <= 0) {
  40 + return;
  41 + }
  42 + // 1.2 校验支付金额
  43 + if (result.getPrice().getPayPrice() <= 0) {
  44 + return;
  45 + }
  46 +
  47 + // 2.1 计算赠送积分
  48 + int givePoint = MoneyUtils.calculateRatePriceFloor(result.getPrice().getPayPrice(), (double) givePointPerYuan);
  49 + // 2.2 计算分摊的赠送积分
  50 + List<TradePriceCalculateRespBO.OrderItem> orderItems = filterList(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSelected);
  51 + List<Integer> dividePoints = TradePriceCalculatorHelper.dividePrice(orderItems, givePoint);
  52 +
  53 + // 3.2 更新 SKU 赠送积分
  54 + for (int i = 0; i < orderItems.size(); i++) {
  55 + TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i);
  56 + // 商品可能赠送了积分,所以这里要加上
  57 + orderItem.setGivePoint(orderItem.getGivePoint() + dividePoints.get(i));
  58 + }
  59 + // 3.3 更新订单赠送积分
  60 + TradePriceCalculatorHelper.recountAllGivePoint(result);
  61 + }
  62 +
  63 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculator.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.hutool.core.util.BooleanUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.hutool.core.util.StrUtil;
  6 +import cn.iocoder.yudao.module.member.api.config.MemberConfigApi;
  7 +import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO;
  8 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  9 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  10 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  11 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  12 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  13 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  14 +import jakarta.annotation.Resource;
  15 +import lombok.extern.slf4j.Slf4j;
  16 +import org.springframework.core.annotation.Order;
  17 +import org.springframework.stereotype.Component;
  18 +
  19 +import java.util.List;
  20 +
  21 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  22 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
  23 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_PAY_PRICE_ILLEGAL;
  24 +
  25 +/**
  26 + * 使用积分的 {@link TradePriceCalculator} 实现类
  27 + *
  28 + * @author owen
  29 + */
  30 +@Component
  31 +@Order(TradePriceCalculator.ORDER_POINT_USE)
  32 +@Slf4j
  33 +public class TradePointUsePriceCalculator implements TradePriceCalculator {
  34 +
  35 + @Resource
  36 + private MemberConfigApi memberConfigApi;
  37 + @Resource
  38 + private MemberUserApi memberUserApi;
  39 +
  40 + @Override
  41 + public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  42 + // 判断订单类型是否不为积分商城活动
  43 + if (ObjectUtil.equal(result.getType(), TradeOrderTypeEnum.POINT.getType())) {
  44 + return;
  45 + }
  46 + // 0. 初始化积分
  47 + MemberUserRespDTO user = memberUserApi.getUser(param.getUserId());
  48 + result.setTotalPoint(user.getPoint()).setUsePoint(0);
  49 +
  50 + // 1.1 校验是否使用积分
  51 + if (!BooleanUtil.isTrue(param.getPointStatus())) {
  52 + return;
  53 + }
  54 + // 1.2 校验积分抵扣是否开启
  55 + MemberConfigRespDTO config = memberConfigApi.getConfig();
  56 + if (!isDeductPointEnable(config)) {
  57 + return;
  58 + }
  59 + // 1.3 校验用户积分余额
  60 + if (user.getPoint() == null || user.getPoint() <= 0) {
  61 + return;
  62 + }
  63 +
  64 + // 2.1 计算积分优惠金额
  65 + int pointPrice = calculatePointPrice(config, user.getPoint(), result);
  66 + // 2.2 计算分摊的积分、抵扣金额
  67 + List<TradePriceCalculateRespBO.OrderItem> orderItems = filterList(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSelected);
  68 + List<Integer> dividePointPrices = TradePriceCalculatorHelper.dividePrice(orderItems, pointPrice);
  69 + List<Integer> divideUsePoints = TradePriceCalculatorHelper.dividePrice(orderItems, result.getUsePoint());
  70 +
  71 + // 3.1 记录优惠明细
  72 + TradePriceCalculatorHelper.addPromotion(result, orderItems,
  73 + param.getUserId(), "积分抵扣", PromotionTypeEnum.POINT.getType(),
  74 + StrUtil.format("积分抵扣:省 {} 元", TradePriceCalculatorHelper.formatPrice(pointPrice)),
  75 + dividePointPrices);
  76 + // 3.2 更新 SKU 优惠金额
  77 + for (int i = 0; i < orderItems.size(); i++) {
  78 + TradePriceCalculateRespBO.OrderItem orderItem = orderItems.get(i);
  79 + orderItem.setPointPrice(dividePointPrices.get(i));
  80 + orderItem.setUsePoint(divideUsePoints.get(i));
  81 + TradePriceCalculatorHelper.recountPayPrice(orderItem);
  82 + }
  83 + TradePriceCalculatorHelper.recountAllPrice(result);
  84 + }
  85 +
  86 + private boolean isDeductPointEnable(MemberConfigRespDTO config) {
  87 + return config != null &&
  88 + BooleanUtil.isTrue(config.getPointTradeDeductEnable()) && // 积分功能是否启用
  89 + config.getPointTradeDeductUnitPrice() != null && config.getPointTradeDeductUnitPrice() > 0; // 有没有配置:1 积分抵扣多少分
  90 + }
  91 +
  92 + private Integer calculatePointPrice(MemberConfigRespDTO config, Integer usePoint, TradePriceCalculateRespBO result) {
  93 + // 每个订单最多可以使用的积分数量
  94 + if (config.getPointTradeDeductMaxPrice() != null && config.getPointTradeDeductMaxPrice() > 0) {
  95 + usePoint = Math.min(usePoint, config.getPointTradeDeductMaxPrice());
  96 + }
  97 + // TODO @疯狂:这里应该是,抵扣到只剩下 0.01;
  98 + // 积分优惠金额(分)
  99 + int pointPrice = usePoint * config.getPointTradeDeductUnitPrice();
  100 + if (result.getPrice().getPayPrice() <= pointPrice) {
  101 + // 禁止 0 元购
  102 + throw exception(PRICE_CALCULATE_PAY_PRICE_ILLEGAL);
  103 + }
  104 +// // 允许0 元购!!!:用户积分比较多时,积分可以抵扣的金额要大于支付金额,这时需要根据支付金额反推使用多少积分
  105 +// if (result.getPrice().getPayPrice() < pointPrice) {
  106 +// pointPrice = result.getPrice().getPayPrice();
  107 +// // 反推需要扣除的积分
  108 +// usePoint = NumberUtil.toBigDecimal(pointPrice)
  109 +// .divide(NumberUtil.toBigDecimal(config.getPointTradeDeductUnitPrice()), 0, RoundingMode.HALF_UP)
  110 +// .intValue();
  111 +// }
  112 + // 记录使用的积分
  113 + result.setUsePoint(usePoint);
  114 + return pointPrice;
  115 + }
  116 +
  117 +}
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculator.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  4 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  5 +
  6 +/**
  7 + * 价格计算的计算器接口
  8 + *
  9 + * 优惠计算顺序:
  10 + * 1. <a href="https://help.youzan.com/displaylist/detail_4_4-1-53316">积分抵现、会员价、优惠券、粉丝专享价、满减送哪个优先计算?</>
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +public interface TradePriceCalculator {
  15 +
  16 + int ORDER_SECKILL_ACTIVITY = 8;
  17 + int ORDER_BARGAIN_ACTIVITY = 8;
  18 + int ORDER_COMBINATION_ACTIVITY = 8;
  19 + int ORDER_POINT_ACTIVITY = 8;
  20 +
  21 + int ORDER_DISCOUNT_ACTIVITY = 10;
  22 + int ORDER_REWARD_ACTIVITY = 20;
  23 + int ORDER_COUPON = 30;
  24 + int ORDER_POINT_USE = 40;
  25 + /**
  26 + * 快递运费的计算
  27 + *
  28 + * 放在各种营销活动、优惠劵后面
  29 + */
  30 + int ORDER_DELIVERY = 50;
  31 + /**
  32 + * 赠送积分,放最后
  33 + *
  34 + * 放在 {@link #ORDER_DELIVERY} 后面的原因,是运费也会产生费用,需要赠送对应积分
  35 + */
  36 + int ORDER_POINT_GIVE = 999;
  37 +
  38 + void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result);
  39 +
  40 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculatorHelper.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculatorHelper.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java renamed to yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeSeckillActivityPriceCalculator.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.hutool.core.util.StrUtil;
  5 +import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
  6 +import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO;
  7 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  9 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
  10 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  11 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  12 +import jakarta.annotation.Resource;
  13 +import org.springframework.core.annotation.Order;
  14 +import org.springframework.stereotype.Component;
  15 +
  16 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  17 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT;
  18 +
  19 +// TODO huihui:单测需要补充
  20 +/**
  21 + * 秒杀活动的 {@link TradePriceCalculator} 实现类
  22 + *
  23 + * @author HUIHUI
  24 + */
  25 +@Component
  26 +@Order(TradePriceCalculator.ORDER_SECKILL_ACTIVITY)
  27 +public class TradeSeckillActivityPriceCalculator implements TradePriceCalculator {
  28 +
  29 + @Resource
  30 + private SeckillActivityApi seckillActivityApi;
  31 +
  32 + @Resource
  33 + private TradeOrderQueryService tradeOrderQueryService;
  34 +
  35 + @Override
  36 + public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) {
  37 + // 1. 判断订单类型和是否具有秒杀活动编号
  38 + if (param.getSeckillActivityId() == null) {
  39 + return;
  40 + }
  41 + Assert.isTrue(param.getItems().size() == 1, "秒杀时,只允许选择一个商品");
  42 + // 2. 校验是否可以参与秒杀
  43 + TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);
  44 + SeckillValidateJoinRespDTO seckillActivity = validateJoinSeckill(
  45 + param.getUserId(), param.getSeckillActivityId(),
  46 + orderItem.getSkuId(), orderItem.getCount());
  47 +
  48 + // 3.1 记录优惠明细
  49 + Integer discountPrice = orderItem.getPayPrice() - seckillActivity.getSeckillPrice() * orderItem.getCount();
  50 + TradePriceCalculatorHelper.addPromotion(result, orderItem,
  51 + param.getSeckillActivityId(), seckillActivity.getName(), PromotionTypeEnum.SECKILL_ACTIVITY.getType(),
  52 + StrUtil.format("秒杀活动:省 {} 元", TradePriceCalculatorHelper.formatPrice(discountPrice)),
  53 + discountPrice);
  54 + // 3.2 更新 SKU 优惠金额
  55 + orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice);
  56 + TradePriceCalculatorHelper.recountPayPrice(orderItem);
  57 + TradePriceCalculatorHelper.recountAllPrice(result);
  58 + }
  59 +
  60 + private SeckillValidateJoinRespDTO validateJoinSeckill(Long userId, Long activityId, Long skuId, Integer count) {
  61 + // 1. 校验是否可以参与秒杀
  62 + SeckillValidateJoinRespDTO seckillActivity = seckillActivityApi.validateJoinSeckill(activityId, skuId, count);
  63 + // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用
  64 + int seckillProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.SECKILL);
  65 + if (seckillProductCount + count > seckillActivity.getTotalLimitCount()) {
  66 + throw exception(PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT);
  67 + }
  68 + return seckillActivity;
  69 + }
  70 +
  71 +}
yudao-module-mall/yudao-module-trade/src/main/resources/mapper/brokerage/BrokerageUserMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageUserMapper">
  4 +
  5 + <select id="selectSummaryPageByUserId"
  6 + resultType="cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO">
  7 +
  8 + SELECT bu.id, bu.bind_user_time AS brokerageTime,
  9 + (SELECT SUM(price) FROM trade_brokerage_record r
  10 + WHERE r.user_id = bu.id AND biz_type = #{bizType} AND r.status = #{status} AND r.deleted = FALSE) AS brokeragePrice,
  11 + (SELECT COUNT(1) FROM trade_brokerage_record r
  12 + WHERE r.user_id = bu.id AND biz_type = #{bizType} AND r.status = #{status} AND r.deleted = FALSE) AS brokerageOrderCount,
  13 + (SELECT COUNT(1) FROM trade_brokerage_user c
  14 + WHERE c.bind_user_id = bu.id AND c.deleted = FALSE) AS brokerageUserCount
  15 + FROM trade_brokerage_user AS bu
  16 + <where>
  17 + bu.deleted = false
  18 + <if test="ids != null and ids.size() > 0">
  19 + and bu.id in
  20 + <foreach collection="ids" open="(" item="id" separator="," close=")">
  21 + #{id}
  22 + </foreach>
  23 + </if>
  24 + </where>
  25 + <choose>
  26 + <when test="sortingField.field == 'userCount'">
  27 + ORDER BY brokerageUserCount ${sortingField.order}
  28 + </when>
  29 + <when test="sortingField.field == 'orderCount'">
  30 + ORDER BY brokerageOrderCount ${sortingField.order}
  31 + </when>
  32 + <when test="sortingField.field == 'price'">
  33 + ORDER BY brokeragePrice ${sortingField.order}
  34 + </when>
  35 + <otherwise>
  36 + ORDER BY bu.bind_user_time DESC
  37 + </otherwise>
  38 + </choose>
  39 + </select>
  40 +
  41 +</mapper>
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/Kd100ExpressClientIntegrationTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
  6 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
  7 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl.kd100.Kd100ExpressClient;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.junit.jupiter.api.BeforeEach;
  10 +import org.junit.jupiter.api.Disabled;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.springframework.boot.web.client.RestTemplateBuilder;
  13 +import org.springframework.web.client.RestTemplate;
  14 +
  15 +import java.util.List;
  16 +
  17 +/**
  18 + * {@link Kd100ExpressClient} 的集成测试
  19 + *
  20 + * @author jason
  21 + */
  22 +@Slf4j
  23 +public class Kd100ExpressClientIntegrationTest {
  24 +
  25 + private Kd100ExpressClient client;
  26 +
  27 + @BeforeEach
  28 + public void init() {
  29 + RestTemplate restTemplate = new RestTemplateBuilder().build();
  30 + TradeExpressProperties.Kd100Config config = new TradeExpressProperties.Kd100Config()
  31 + .setKey("pLXUGAwK5305")
  32 + .setCustomer("E77DF18BE109F454A5CD319E44BF5177");
  33 + client = new Kd100ExpressClient(restTemplate, config);
  34 + }
  35 +
  36 + @Test
  37 + @Disabled("集成测试,暂时忽略")
  38 + public void testGetExpressTrackList() {
  39 + ExpressTrackQueryReqDTO reqDTO = new ExpressTrackQueryReqDTO();
  40 + reqDTO.setExpressCode("STO");
  41 + reqDTO.setLogisticsNo("773220402764314");
  42 + List<ExpressTrackRespDTO> tracks = client.getExpressTrackList(reqDTO);
  43 + System.out.println(JsonUtils.toJsonPrettyString(tracks));
  44 + }
  45 +
  46 +}
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/framework/delivery/core/client/impl/KdNiaoExpressClientIntegrationTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl;
  2 +
  3 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  4 +import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties;
  5 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
  6 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
  7 +import cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl.kdniao.KdNiaoExpressClient;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.junit.jupiter.api.BeforeEach;
  10 +import org.junit.jupiter.api.Disabled;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.springframework.boot.web.client.RestTemplateBuilder;
  13 +import org.springframework.web.client.RestTemplate;
  14 +
  15 +import java.util.List;
  16 +
  17 +/**
  18 + * {@link KdNiaoExpressClient} 的集成测试
  19 + *
  20 + * @author jason
  21 + */
  22 +@Slf4j
  23 +public class KdNiaoExpressClientIntegrationTest {
  24 +
  25 + private KdNiaoExpressClient client;
  26 +
  27 + @BeforeEach
  28 + public void init() {
  29 + RestTemplate restTemplate = new RestTemplateBuilder().build();
  30 + TradeExpressProperties.KdNiaoConfig config = new TradeExpressProperties.KdNiaoConfig()
  31 + .setApiKey("cb022f1e-48f1-4c4a-a723-9001ac9676b8")
  32 + .setBusinessId("1809751");
  33 + client = new KdNiaoExpressClient(restTemplate, config);
  34 + }
  35 +
  36 + @Test
  37 + @Disabled("集成测试,暂时忽略")
  38 + public void testGetExpressTrackList() {
  39 + ExpressTrackQueryReqDTO reqDTO = new ExpressTrackQueryReqDTO();
  40 + reqDTO.setExpressCode("STO");
  41 + reqDTO.setLogisticsNo("777168349863987");
  42 + List<ExpressTrackRespDTO> tracks = client.getExpressTrackList(reqDTO);
  43 + System.out.println(JsonUtils.toJsonPrettyString(tracks));
  44 + }
  45 +
  46 +}
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceTest.java renamed to yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceTest.java
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage;
  2 +
  3 +import cn.hutool.core.util.NumberUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
  8 +import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageRecordMapper;
  9 +import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
  10 +import org.junit.jupiter.api.Disabled;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.springframework.boot.test.mock.mockito.MockBean;
  13 +import org.springframework.context.annotation.Import;
  14 +
  15 +import jakarta.annotation.Resource;
  16 +import java.math.RoundingMode;
  17 +
  18 +import static cn.hutool.core.util.RandomUtil.randomEle;
  19 +import static cn.hutool.core.util.RandomUtil.randomInt;
  20 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
  21 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  22 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  23 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomInteger;
  24 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  25 +import static org.junit.jupiter.api.Assertions.assertEquals;
  26 +
  27 +// TODO @芋艿:单测后续看看
  28 +/**
  29 + * {@link BrokerageRecordServiceImpl} 的单元测试类
  30 + *
  31 + * @author owen
  32 + */
  33 +@Disabled // TODO 芋艿:后续 fix 补充的单测
  34 +@Import(BrokerageRecordServiceImpl.class)
  35 +public class BrokerageRecordServiceImplTest extends BaseDbUnitTest {
  36 +
  37 + @Resource
  38 + private BrokerageRecordServiceImpl brokerageRecordService;
  39 + @Resource
  40 + private BrokerageRecordMapper brokerageRecordMapper;
  41 +
  42 + @MockBean
  43 + private TradeConfigService tradeConfigService;
  44 + @MockBean
  45 + private BrokerageUserService brokerageUserService;
  46 +
  47 + @Test
  48 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  49 + public void testGetBrokerageRecordPage() {
  50 + // mock 数据
  51 + BrokerageRecordDO dbBrokerageRecord = randomPojo(BrokerageRecordDO.class, o -> { // 等会查询到
  52 + o.setUserId(null);
  53 + o.setBizType(null);
  54 + o.setStatus(null);
  55 + o.setCreateTime(null);
  56 + });
  57 + brokerageRecordMapper.insert(dbBrokerageRecord);
  58 + // 测试 userId 不匹配
  59 + brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setUserId(null)));
  60 + // 测试 bizType 不匹配
  61 + brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setBizType(null)));
  62 + // 测试 status 不匹配
  63 + brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setStatus(null)));
  64 + // 测试 createTime 不匹配
  65 + brokerageRecordMapper.insert(cloneIgnoreId(dbBrokerageRecord, o -> o.setCreateTime(null)));
  66 + // 准备参数
  67 + BrokerageRecordPageReqVO reqVO = new BrokerageRecordPageReqVO();
  68 + reqVO.setUserId(null);
  69 + reqVO.setBizType(null);
  70 + reqVO.setStatus(null);
  71 + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  72 +
  73 + // 调用
  74 + PageResult<BrokerageRecordDO> pageResult = brokerageRecordService.getBrokerageRecordPage(reqVO);
  75 + // 断言
  76 + assertEquals(1, pageResult.getTotal());
  77 + assertEquals(1, pageResult.getList().size());
  78 + assertPojoEquals(dbBrokerageRecord, pageResult.getList().get(0));
  79 + }
  80 +
  81 + @Test
  82 + public void testCalculatePrice_useFixedPrice() {
  83 + // mock 数据
  84 + Integer payPrice = randomInteger();
  85 + Integer percent = randomInt(1, 101);
  86 + Integer fixedPrice = randomInt();
  87 + // 调用
  88 + int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);
  89 + // 断言
  90 + assertEquals(brokerage, fixedPrice);
  91 + }
  92 +
  93 + @Test
  94 + public void testCalculatePrice_usePercent() {
  95 + // mock 数据
  96 + Integer payPrice = randomInteger();
  97 + Integer percent = randomInt(1, 101);
  98 + Integer fixedPrice = randomEle(new Integer[]{0, null});
  99 + System.out.println("fixedPrice=" + fixedPrice);
  100 + // 调用
  101 + int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);
  102 + // 断言
  103 + assertEquals(brokerage, NumberUtil.div(NumberUtil.mul(payPrice, percent), 100, 0, RoundingMode.DOWN).intValue());
  104 + }
  105 +
  106 + @Test
  107 + public void testCalculatePrice_equalsZero() {
  108 + // mock 数据
  109 + Integer payPrice = null;
  110 + Integer percent = null;
  111 + Integer fixedPrice = null;
  112 + // 调用
  113 + int brokerage = brokerageRecordService.calculatePrice(payPrice, percent, fixedPrice);
  114 + // 断言
  115 + assertEquals(brokerage, 0);
  116 + }
  117 +}
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
  7 +import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageUserMapper;
  8 +import org.junit.jupiter.api.Disabled;
  9 +import org.junit.jupiter.api.Test;
  10 +import org.springframework.context.annotation.Import;
  11 +
  12 +import jakarta.annotation.Resource;
  13 +
  14 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
  15 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  16 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  17 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  18 +import static org.junit.jupiter.api.Assertions.assertEquals;
  19 +
  20 +// TODO @芋艿:单测后续看看
  21 +/**
  22 + * {@link BrokerageUserServiceImpl} 的单元测试类
  23 + *
  24 + * @author owen
  25 + */
  26 +@Disabled // TODO 芋艿:后续 fix 补充的单测
  27 +@Import(BrokerageUserServiceImpl.class)
  28 +public class BrokerageUserServiceImplTest extends BaseDbUnitTest {
  29 +
  30 + @Resource
  31 + private BrokerageUserServiceImpl brokerageUserService;
  32 +
  33 + @Resource
  34 + private BrokerageUserMapper brokerageUserMapper;
  35 +
  36 + @Test
  37 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  38 + public void testGetBrokerageUserPage() {
  39 + // mock 数据
  40 + BrokerageUserDO dbBrokerageUser = randomPojo(BrokerageUserDO.class, o -> { // 等会查询到
  41 + o.setBindUserId(null);
  42 + o.setBrokerageEnabled(null);
  43 + o.setCreateTime(null);
  44 + });
  45 + brokerageUserMapper.insert(dbBrokerageUser);
  46 + // 测试 brokerageUserId 不匹配
  47 + brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setBindUserId(null)));
  48 + // 测试 brokerageEnabled 不匹配
  49 + brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setBrokerageEnabled(null)));
  50 + // 测试 createTime 不匹配
  51 + brokerageUserMapper.insert(cloneIgnoreId(dbBrokerageUser, o -> o.setCreateTime(null)));
  52 + // 准备参数
  53 + BrokerageUserPageReqVO reqVO = new BrokerageUserPageReqVO();
  54 + reqVO.setBindUserId(null);
  55 + reqVO.setBrokerageEnabled(null);
  56 + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  57 +
  58 + // 调用
  59 + PageResult<BrokerageUserDO> pageResult = brokerageUserService.getBrokerageUserPage(reqVO);
  60 + // 断言
  61 + assertEquals(1, pageResult.getTotal());
  62 + assertEquals(1, pageResult.getList().size());
  63 + assertPojoEquals(dbBrokerageUser, pageResult.getList().get(0));
  64 + }
  65 +
  66 +}
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO;
  8 +import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageWithdrawMapper;
  9 +import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
  10 +import jakarta.annotation.Resource;
  11 +import jakarta.validation.Validator;
  12 +import org.junit.jupiter.api.Disabled;
  13 +import org.junit.jupiter.api.Test;
  14 +import org.springframework.boot.test.mock.mockito.MockBean;
  15 +import org.springframework.context.annotation.Import;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
  18 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  19 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  20 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  21 +import static org.junit.jupiter.api.Assertions.assertEquals;
  22 +
  23 +// TODO 芋艿:后续 review
  24 +/**
  25 + * {@link BrokerageWithdrawServiceImpl} 的单元测试类
  26 + *
  27 + * @author 芋道源码
  28 + */
  29 +@Disabled // TODO 芋艿:后续 fix 补充的单测
  30 +@Import(BrokerageWithdrawServiceImpl.class)
  31 +public class BrokerageWithdrawServiceImplTest extends BaseDbUnitTest {
  32 +
  33 + @Resource
  34 + private BrokerageWithdrawServiceImpl brokerageWithdrawService;
  35 +
  36 + @Resource
  37 + private BrokerageWithdrawMapper brokerageWithdrawMapper;
  38 +
  39 + @MockBean
  40 + private BrokerageRecordService brokerageRecordService;
  41 + @MockBean
  42 + private BrokerageUserService brokerageUserService;
  43 + @MockBean
  44 + private TradeConfigService tradeConfigService;
  45 +
  46 + @MockBean
  47 + private NotifyMessageSendApi notifyMessageSendApi;
  48 +
  49 + @Resource
  50 + private Validator validator;
  51 +
  52 + @Test
  53 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  54 + public void testGetBrokerageWithdrawPage() {
  55 + // mock 数据
  56 + BrokerageWithdrawDO dbBrokerageWithdraw = randomPojo(BrokerageWithdrawDO.class, o -> { // 等会查询到
  57 + o.setUserId(null);
  58 + o.setType(null);
  59 + o.setUserName(null);
  60 + o.setUserAccount(null);
  61 + o.setBankName(null);
  62 + o.setStatus(null);
  63 + o.setCreateTime(null);
  64 + });
  65 + brokerageWithdrawMapper.insert(dbBrokerageWithdraw);
  66 + // 测试 userId 不匹配
  67 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setUserId(null)));
  68 + // 测试 type 不匹配
  69 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setType(null)));
  70 + // 测试 name 不匹配
  71 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setUserName(null)));
  72 + // 测试 accountNo 不匹配
  73 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setUserAccount(null)));
  74 + // 测试 bankName 不匹配
  75 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setBankName(null)));
  76 + // 测试 status 不匹配
  77 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setStatus(null)));
  78 + // 测试 auditReason 不匹配
  79 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setAuditReason(null)));
  80 + // 测试 auditTime 不匹配
  81 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setAuditTime(null)));
  82 + // 测试 remark 不匹配
  83 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setRemark(null)));
  84 + // 测试 createTime 不匹配
  85 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setCreateTime(null)));
  86 + // 准备参数
  87 + BrokerageWithdrawPageReqVO reqVO = new BrokerageWithdrawPageReqVO();
  88 + reqVO.setUserId(null);
  89 + reqVO.setType(null);
  90 + reqVO.setUserName(null);
  91 + reqVO.setUserAccount(null);
  92 + reqVO.setBankName(null);
  93 + reqVO.setStatus(null);
  94 + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  95 +
  96 + // 调用
  97 + PageResult<BrokerageWithdrawDO> pageResult = brokerageWithdrawService.getBrokerageWithdrawPage(reqVO);
  98 + // 断言
  99 + assertEquals(1, pageResult.getTotal());
  100 + assertEquals(1, pageResult.getList().size());
  101 + assertPojoEquals(dbBrokerageWithdraw, pageResult.getList().get(0));
  102 + }
  103 +
  104 + @Test
  105 + public void testCalculateFeePrice() {
  106 + //Integer withdrawPrice = 100;
  107 + //// 测试手续费比例未设置
  108 + //Integer percent = null;
  109 + //assertEquals(brokerageWithdrawService.calculateFeePrice(withdrawPrice, percent), 0);
  110 + //// 测试手续费给为0
  111 + //percent = 0;
  112 + //assertEquals(brokerageWithdrawService.calculateFeePrice(withdrawPrice, percent), 0);
  113 + //// 测试手续费
  114 + //percent = 1;
  115 + //assertEquals(brokerageWithdrawService.calculateFeePrice(withdrawPrice, percent), 1);
  116 + }
  117 +}
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceTest.java renamed to yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceTest.java
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImplTest.java renamed to yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/price/TradePriceServiceImplTest.java
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java renamed to yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeCouponPriceCalculatorTest.java
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculatorTest.java renamed to yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculatorTest.java
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculatorTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
  4 +import cn.iocoder.yudao.module.promotion.api.discount.DiscountActivityApi;
  5 +import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO;
  6 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum;
  7 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  9 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  10 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  11 +import org.junit.jupiter.api.Disabled;
  12 +import org.junit.jupiter.api.Test;
  13 +import org.mockito.InjectMocks;
  14 +import org.mockito.Mock;
  15 +
  16 +import java.util.ArrayList;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
  19 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  20 +import static java.util.Arrays.asList;
  21 +import static org.junit.jupiter.api.Assertions.*;
  22 +import static org.mockito.ArgumentMatchers.eq;
  23 +import static org.mockito.Mockito.when;
  24 +
  25 +/**
  26 + * {@link TradeDiscountActivityPriceCalculator} 的单元测试类
  27 + *
  28 + * @author 芋道源码
  29 + */
  30 +@Disabled // TODO 芋艿:后续修复
  31 +public class TradeDiscountActivityPriceCalculatorTest extends BaseMockitoUnitTest {
  32 +
  33 + @InjectMocks
  34 + private TradeDiscountActivityPriceCalculator tradeDiscountActivityPriceCalculator;
  35 +
  36 + @Mock
  37 + private DiscountActivityApi discountActivityApi;
  38 +
  39 + @Test
  40 + public void testCalculate() {
  41 + // 准备参数
  42 + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
  43 + .setItems(asList(
  44 + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 匹配活动,且已选中
  45 + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(false) // 匹配活动,但未选中
  46 + ));
  47 + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  48 + .setType(TradeOrderTypeEnum.NORMAL.getType())
  49 + .setPrice(new TradePriceCalculateRespBO.Price())
  50 + .setPromotions(new ArrayList<>())
  51 + .setItems(asList(
  52 + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
  53 + .setPrice(100),
  54 + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(false)
  55 + .setPrice(50)
  56 + ));
  57 + // 保证价格被初始化上
  58 + TradePriceCalculatorHelper.recountPayPrice(result.getItems());
  59 + TradePriceCalculatorHelper.recountAllPrice(result);
  60 +
  61 + // mock 方法(限时折扣活动)
  62 + when(discountActivityApi.getMatchDiscountProductListBySkuIds(eq(asSet(10L, 20L)))).thenReturn(asList(
  63 + randomPojo(DiscountProductRespDTO.class, o -> o.setActivityId(1000L)
  64 + .setActivityName("活动 1000 号").setSkuId(10L)
  65 + .setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(40)),
  66 + randomPojo(DiscountProductRespDTO.class, o -> o.setActivityId(2000L)
  67 + .setActivityName("活动 2000 号").setSkuId(20L)
  68 + .setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(60))
  69 + ));
  70 + // 10L: 100 * 2 - 40 * 2 = 120
  71 + // 20L:50 * 3 - 50 * 3 * 0.4 = 90
  72 +
  73 + // 调用
  74 + tradeDiscountActivityPriceCalculator.calculate(param, result);
  75 + // 断言:Price 部分
  76 + TradePriceCalculateRespBO.Price price = result.getPrice();
  77 + assertEquals(price.getTotalPrice(), 200);
  78 + assertEquals(price.getDiscountPrice(), 80);
  79 + assertEquals(price.getPointPrice(), 0);
  80 + assertEquals(price.getDeliveryPrice(), 0);
  81 + assertEquals(price.getCouponPrice(), 0);
  82 + assertEquals(price.getPayPrice(), 120);
  83 + assertNull(result.getCouponId());
  84 + // 断言:SKU 1
  85 + assertEquals(result.getItems().size(), 2);
  86 + TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);
  87 + assertEquals(orderItem01.getSkuId(), 10L);
  88 + assertEquals(orderItem01.getCount(), 2);
  89 + assertEquals(orderItem01.getPrice(), 100);
  90 + assertEquals(orderItem01.getDiscountPrice(), 80);
  91 + assertEquals(orderItem01.getDeliveryPrice(), 0);
  92 + assertEquals(orderItem01.getCouponPrice(), 0);
  93 + assertEquals(orderItem01.getPointPrice(), 0);
  94 + assertEquals(orderItem01.getPayPrice(), 120);
  95 + // 断言:SKU 2
  96 + TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);
  97 + assertEquals(orderItem02.getSkuId(), 20L);
  98 + assertEquals(orderItem02.getCount(), 3);
  99 + assertEquals(orderItem02.getPrice(), 50);
  100 + assertEquals(orderItem02.getDiscountPrice(), 60);
  101 + assertEquals(orderItem02.getDeliveryPrice(), 0);
  102 + assertEquals(orderItem02.getCouponPrice(), 0);
  103 + assertEquals(orderItem02.getPointPrice(), 0);
  104 + assertEquals(orderItem02.getPayPrice(), 90);
  105 + // 断言:Promotion 部分
  106 + assertEquals(result.getPromotions().size(), 1);
  107 + TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0);
  108 + assertEquals(promotion01.getId(), 1000L);
  109 + assertEquals(promotion01.getName(), "活动 1000 号");
  110 + assertEquals(promotion01.getType(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType());
  111 + assertEquals(promotion01.getTotalPrice(), 200);
  112 + assertEquals(promotion01.getDiscountPrice(), 80);
  113 + assertTrue(promotion01.getMatch());
  114 + assertEquals(promotion01.getDescription(), "限时折扣:省 0.80 元");
  115 + TradePriceCalculateRespBO.PromotionItem promotionItem01 = promotion01.getItems().get(0);
  116 + assertEquals(promotion01.getItems().size(), 1);
  117 + assertEquals(promotionItem01.getSkuId(), 10L);
  118 + assertEquals(promotionItem01.getTotalPrice(), 200);
  119 + assertEquals(promotionItem01.getDiscountPrice(), 80);
  120 + }
  121 +
  122 +}
yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointGiveCalculatorTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.price.calculator;
  2 +
  3 +import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
  4 +import cn.iocoder.yudao.module.member.api.config.MemberConfigApi;
  5 +import cn.iocoder.yudao.module.member.api.config.dto.MemberConfigRespDTO;
  6 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  7 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
  8 +import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
  9 +import org.junit.jupiter.api.Test;
  10 +import org.mockito.InjectMocks;
  11 +import org.mockito.Mock;
  12 +
  13 +import java.util.ArrayList;
  14 +
  15 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  16 +import static java.util.Arrays.asList;
  17 +import static org.junit.jupiter.api.Assertions.assertEquals;
  18 +import static org.mockito.Mockito.when;
  19 +
  20 +// TODO 芋艿:晚点 review
  21 +/**
  22 + * {@link TradePointGiveCalculator} 的单元测试类
  23 + *
  24 + * @author owen
  25 + */
  26 +public class TradePointGiveCalculatorTest extends BaseMockitoUnitTest {
  27 +
  28 + @InjectMocks
  29 + private TradePointGiveCalculator tradePointGiveCalculator;
  30 +
  31 + @Mock
  32 + private MemberConfigApi memberConfigApi;
  33 +
  34 + @Test
  35 + public void testCalculate() {
  36 +
  37 + // 准备参数
  38 + TradePriceCalculateReqBO param = new TradePriceCalculateReqBO()
  39 + .setUserId(233L)
  40 + .setItems(asList(
  41 + new TradePriceCalculateReqBO.Item().setSkuId(10L).setCount(2).setSelected(true), // 全局积分
  42 + new TradePriceCalculateReqBO.Item().setSkuId(20L).setCount(3).setSelected(true), // 全局积分 + SKU 积分
  43 + new TradePriceCalculateReqBO.Item().setSkuId(30L).setCount(4).setSelected(false), // 全局积分,但是未选中
  44 + new TradePriceCalculateReqBO.Item().setSkuId(40L).setCount(5).setSelected(false) // 全局积分 + SKU 积分,但是未选中
  45 + ));
  46 + TradePriceCalculateRespBO result = new TradePriceCalculateRespBO()
  47 + .setType(TradeOrderTypeEnum.NORMAL.getType())
  48 + .setPrice(new TradePriceCalculateRespBO.Price())
  49 + .setPromotions(new ArrayList<>())
  50 + .setItems(asList(
  51 + new TradePriceCalculateRespBO.OrderItem().setSkuId(10L).setCount(2).setSelected(true)
  52 + .setPrice(100).setSpuId(1L).setGivePoint(0),
  53 + new TradePriceCalculateRespBO.OrderItem().setSkuId(20L).setCount(3).setSelected(true)
  54 + .setPrice(50).setSpuId(2L).setGivePoint(100),
  55 + new TradePriceCalculateRespBO.OrderItem().setSkuId(30L).setCount(4).setSelected(false)
  56 + .setPrice(30).setSpuId(3L).setGivePoint(0),
  57 + new TradePriceCalculateRespBO.OrderItem().setSkuId(40L).setCount(5).setSelected(false)
  58 + .setPrice(60).setSpuId(1L).setGivePoint(100)
  59 + ));
  60 + // 保证价格被初始化上
  61 + TradePriceCalculatorHelper.recountPayPrice(result.getItems());
  62 + TradePriceCalculatorHelper.recountAllPrice(result);
  63 +
  64 + // mock 方法(积分配置 信息)
  65 + MemberConfigRespDTO memberConfig = randomPojo(MemberConfigRespDTO.class,
  66 + o -> o.setPointTradeDeductEnable(true) // 启用积分折扣
  67 + .setPointTradeGivePoint(100)); // 1 元赠送多少分
  68 + when(memberConfigApi.getConfig()).thenReturn(memberConfig);
  69 +
  70 + // 调用
  71 + tradePointGiveCalculator.calculate(param, result);
  72 + // 断言:Price 部分
  73 + assertEquals(result.getGivePoint(), 2 * 100 + 3 * 50 + 100);
  74 + // 断言:SKU 1
  75 + TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0);
  76 + assertEquals(orderItem01.getSkuId(), 10L);
  77 + assertEquals(orderItem01.getCount(), 2);
  78 + assertEquals(orderItem01.getPrice(), 100);
  79 + assertEquals(orderItem01.getGivePoint(), 2 * 100); // 全局积分
  80 + // 断言:SKU 2
  81 + TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1);
  82 + assertEquals(orderItem02.getSkuId(), 20L);
  83 + assertEquals(orderItem02.getCount(), 3);
  84 + assertEquals(orderItem02.getPrice(), 50);
  85 + assertEquals(orderItem02.getGivePoint(), 3 * 50 + 100); // 全局积分 + SKU 积分
  86 + // 断言:SKU 3
  87 + TradePriceCalculateRespBO.OrderItem orderItem03 = result.getItems().get(2);
  88 + assertEquals(orderItem03.getSkuId(), 30L);
  89 + assertEquals(orderItem03.getCount(), 4);
  90 + assertEquals(orderItem03.getPrice(), 30);
  91 + assertEquals(orderItem03.getGivePoint(), 0); // 全局积分,但是未选中
  92 + // 断言:SKU 4
  93 + TradePriceCalculateRespBO.OrderItem orderItem04 = result.getItems().get(3);
  94 + assertEquals(orderItem04.getSkuId(), 40L);
  95 + assertEquals(orderItem04.getCount(), 5);
  96 + assertEquals(orderItem04.getPrice(), 60);
  97 + assertEquals(orderItem04.getGivePoint(), 100); // 全局积分 + SKU 积分,但是未选中
  98 + }
  99 +}
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculatorTest.java renamed to yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointUsePriceCalculatorTest.java
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java renamed to yudao-module-mall/yudao-module-trade/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java
yudao-module-mall/yudao-module-trade/src/test/resources/application-unit-test.yaml 0 → 100644
  1 +spring:
  2 + main:
  3 + lazy-initialization: true # 开启懒加载,加快速度
  4 + banner-mode: off # 单元测试,禁用 Banner
  5 +
  6 +--- #################### 数据库相关配置 ####################
  7 +
  8 +spring:
  9 + # 数据源配置项
  10 + datasource:
  11 + name: ruoyi-vue-pro
  12 + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
  13 + driver-class-name: org.h2.Driver
  14 + username: sa
  15 + password:
  16 + druid:
  17 + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
  18 + initial-size: 1 # 单元测试,配置为 1,提升启动速度
  19 + sql:
  20 + init:
  21 + schema-locations: classpath:/sql/create_tables.sql
  22 +
  23 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
  24 + data:
  25 + redis:
  26 + host: 127.0.0.1 # 地址
  27 + port: 16379 # 端口(单元测试,使用 16379 端口)
  28 + database: 0 # 数据库索引
  29 +
  30 +mybatis:
  31 + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
  32 +
  33 +--- #################### 定时任务相关配置 ####################
  34 +
  35 +--- #################### 配置中心相关配置 ####################
  36 +
  37 +--- #################### 服务保障相关配置 ####################
  38 +
  39 +# Lock4j 配置项(单元测试,禁用 Lock4j)
  40 +
  41 +--- #################### 监控相关配置 ####################
  42 +
  43 +--- #################### 芋道相关配置 ####################
  44 +
  45 +# 芋道配置项,设置当前项目所有自定义的配置
  46 +yudao:
  47 + info:
  48 + base-package: cn.iocoder.yudao.module
  49 + trade:
  50 + order:
  51 + app-id: 1
  52 + merchant-order-id: 1
  53 + express:
  54 + kd-niao:
  55 + api-key: xxxx
  56 + business-id: xxxxx
  57 + kd100:
  58 + customer: xxxxx
  59 + key: xxxxx
  60 + client: not_provide
0 \ No newline at end of file 61 \ No newline at end of file
yudao-module-mall/yudao-module-trade-biz/src/test/resources/logback.xml renamed to yudao-module-mall/yudao-module-trade/src/test/resources/logback.xml
yudao-module-mall/yudao-module-trade-biz/src/test/resources/sql/clean.sql renamed to yudao-module-mall/yudao-module-trade/src/test/resources/sql/clean.sql
yudao-module-mall/yudao-module-trade-biz/src/test/resources/sql/create_tables.sql renamed to yudao-module-mall/yudao-module-trade/src/test/resources/sql/create_tables.sql
yudao-server/pom.xml
@@ -68,22 +68,22 @@ @@ -68,22 +68,22 @@
68 <!-- 商城相关模块。默认注释,保证编译速度--> 68 <!-- 商城相关模块。默认注释,保证编译速度-->
69 <!-- <dependency>--> 69 <!-- <dependency>-->
70 <!-- <groupId>cn.iocoder.boot</groupId>--> 70 <!-- <groupId>cn.iocoder.boot</groupId>-->
71 -<!-- <artifactId>yudao-module-promotion-biz</artifactId>--> 71 +<!-- <artifactId>yudao-module-product</artifactId>-->
72 <!-- <version>${revision}</version>--> 72 <!-- <version>${revision}</version>-->
73 <!-- </dependency>--> 73 <!-- </dependency>-->
74 <!-- <dependency>--> 74 <!-- <dependency>-->
75 <!-- <groupId>cn.iocoder.boot</groupId>--> 75 <!-- <groupId>cn.iocoder.boot</groupId>-->
76 -<!-- <artifactId>yudao-module-product-biz</artifactId>--> 76 +<!-- <artifactId>yudao-module-promotion</artifactId>-->
77 <!-- <version>${revision}</version>--> 77 <!-- <version>${revision}</version>-->
78 <!-- </dependency>--> 78 <!-- </dependency>-->
79 <!-- <dependency>--> 79 <!-- <dependency>-->
80 <!-- <groupId>cn.iocoder.boot</groupId>--> 80 <!-- <groupId>cn.iocoder.boot</groupId>-->
81 -<!-- <artifactId>yudao-module-trade-biz</artifactId>--> 81 +<!-- <artifactId>yudao-module-trade</artifactId>-->
82 <!-- <version>${revision}</version>--> 82 <!-- <version>${revision}</version>-->
83 <!-- </dependency>--> 83 <!-- </dependency>-->
84 <!-- <dependency>--> 84 <!-- <dependency>-->
85 <!-- <groupId>cn.iocoder.boot</groupId>--> 85 <!-- <groupId>cn.iocoder.boot</groupId>-->
86 -<!-- <artifactId>yudao-module-statistics-biz</artifactId>--> 86 +<!-- <artifactId>yudao-module-statistics</artifactId>-->
87 <!-- <version>${revision}</version>--> 87 <!-- <version>${revision}</version>-->
88 <!-- </dependency>--> 88 <!-- </dependency>-->
89 89