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 20 <modules>
21 21 <module>yudao-module-product</module>
22 22 <module>yudao-module-promotion</module>
23   - <module>yudao-module-trade-biz</module>
  23 + <module>yudao-module-trade</module>
24 24 <module>yudao-module-statistics</module>
25 25 <!--
26 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 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 8 <version>${revision}</version>
9 9 </parent>
10 10 <modelVersion>4.0.0</modelVersion>
11   - <artifactId>yudao-module-trade-biz</artifactId>
  11 + <artifactId>yudao-module-trade</artifactId>
12 12 <packaging>jar</packaging>
13 13  
14 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 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 68 <!-- 商城相关模块。默认注释,保证编译速度-->
69 69 <!-- <dependency>-->
70 70 <!-- <groupId>cn.iocoder.boot</groupId>-->
71   -<!-- <artifactId>yudao-module-promotion-biz</artifactId>-->
  71 +<!-- <artifactId>yudao-module-product</artifactId>-->
72 72 <!-- <version>${revision}</version>-->
73 73 <!-- </dependency>-->
74 74 <!-- <dependency>-->
75 75 <!-- <groupId>cn.iocoder.boot</groupId>-->
76   -<!-- <artifactId>yudao-module-product-biz</artifactId>-->
  76 +<!-- <artifactId>yudao-module-promotion</artifactId>-->
77 77 <!-- <version>${revision}</version>-->
78 78 <!-- </dependency>-->
79 79 <!-- <dependency>-->
80 80 <!-- <groupId>cn.iocoder.boot</groupId>-->
81   -<!-- <artifactId>yudao-module-trade-biz</artifactId>-->
  81 +<!-- <artifactId>yudao-module-trade</artifactId>-->
82 82 <!-- <version>${revision}</version>-->
83 83 <!-- </dependency>-->
84 84 <!-- <dependency>-->
85 85 <!-- <groupId>cn.iocoder.boot</groupId>-->
86   -<!-- <artifactId>yudao-module-statistics-biz</artifactId>-->
  86 +<!-- <artifactId>yudao-module-statistics</artifactId>-->
87 87 <!-- <version>${revision}</version>-->
88 88 <!-- </dependency>-->
89 89  
... ...