Commit dfffc935849e4c9cd99bb43039f899cbfbfc19bc
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
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/package-info.java deleted
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/web/package-info.java deleted
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
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
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 | ... | ... |