Commit fee7267799bc3ec16a8ce72b12252c80a00f17e9
1 parent
2876c7ce
【代码优化】商城:价格计算相关逻辑
Showing
42 changed files
with
269 additions
and
844 deletions
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java
| @@ -4,10 +4,6 @@ import cn.hutool.core.collection.CollUtil; | @@ -4,10 +4,6 @@ import cn.hutool.core.collection.CollUtil; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 6 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 7 | -import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | ||
| 8 | -import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; | ||
| 9 | -import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | ||
| 10 | -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | ||
| 11 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; | 7 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; |
| 12 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; | 8 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; |
| 13 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuRespVO; | 9 | import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuRespVO; |
| @@ -51,11 +47,6 @@ public class AppProductSpuController { | @@ -51,11 +47,6 @@ public class AppProductSpuController { | ||
| 51 | @Resource | 47 | @Resource |
| 52 | private ProductBrowseHistoryService productBrowseHistoryService; | 48 | private ProductBrowseHistoryService productBrowseHistoryService; |
| 53 | 49 | ||
| 54 | - @Resource | ||
| 55 | - private MemberLevelApi memberLevelApi; | ||
| 56 | - @Resource | ||
| 57 | - private MemberUserApi memberUserApi; | ||
| 58 | - | ||
| 59 | @GetMapping("/list-by-ids") | 50 | @GetMapping("/list-by-ids") |
| 60 | @Operation(summary = "获得商品 SPU 列表") | 51 | @Operation(summary = "获得商品 SPU 列表") |
| 61 | @Parameter(name = "ids", description = "编号列表", required = true) | 52 | @Parameter(name = "ids", description = "编号列表", required = true) |
| @@ -68,9 +59,6 @@ public class AppProductSpuController { | @@ -68,9 +59,6 @@ public class AppProductSpuController { | ||
| 68 | // 拼接返回 | 59 | // 拼接返回 |
| 69 | list.forEach(spu -> spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount())); | 60 | list.forEach(spu -> spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount())); |
| 70 | List<AppProductSpuRespVO> voList = BeanUtils.toBean(list, AppProductSpuRespVO.class); | 61 | List<AppProductSpuRespVO> voList = BeanUtils.toBean(list, AppProductSpuRespVO.class); |
| 71 | - // 处理 vip 价格 | ||
| 72 | -// MemberLevelRespDTO memberLevel = getMemberLevel(); | ||
| 73 | -// voList.forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel))); | ||
| 74 | return success(voList); | 62 | return success(voList); |
| 75 | } | 63 | } |
| 76 | 64 | ||
| @@ -85,9 +73,6 @@ public class AppProductSpuController { | @@ -85,9 +73,6 @@ public class AppProductSpuController { | ||
| 85 | // 拼接返回 | 73 | // 拼接返回 |
| 86 | pageResult.getList().forEach(spu -> spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount())); | 74 | pageResult.getList().forEach(spu -> spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount())); |
| 87 | PageResult<AppProductSpuRespVO> voPageResult = BeanUtils.toBean(pageResult, AppProductSpuRespVO.class); | 75 | PageResult<AppProductSpuRespVO> voPageResult = BeanUtils.toBean(pageResult, AppProductSpuRespVO.class); |
| 88 | - // 处理 vip 价格 | ||
| 89 | -// MemberLevelRespDTO memberLevel = getMemberLevel(); | ||
| 90 | -// voPageResult.getList().forEach(vo -> vo.setVipPrice(calculateVipPrice(vo.getPrice(), memberLevel))); | ||
| 91 | return success(voPageResult); | 76 | return success(voPageResult); |
| 92 | } | 77 | } |
| 93 | 78 | ||
| @@ -115,37 +100,7 @@ public class AppProductSpuController { | @@ -115,37 +100,7 @@ public class AppProductSpuController { | ||
| 115 | spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount()); | 100 | spu.setSalesCount(spu.getSalesCount() + spu.getVirtualSalesCount()); |
| 116 | AppProductSpuDetailRespVO spuVO = BeanUtils.toBean(spu, AppProductSpuDetailRespVO.class) | 101 | AppProductSpuDetailRespVO spuVO = BeanUtils.toBean(spu, AppProductSpuDetailRespVO.class) |
| 117 | .setSkus(BeanUtils.toBean(skus, AppProductSpuDetailRespVO.Sku.class)); | 102 | .setSkus(BeanUtils.toBean(skus, AppProductSpuDetailRespVO.Sku.class)); |
| 118 | - // 处理 vip 价格 | ||
| 119 | - MemberLevelRespDTO memberLevel = getMemberLevel(); | ||
| 120 | - spuVO.setVipPrice(calculateVipPrice(spuVO.getPrice(), memberLevel)); | ||
| 121 | return success(spuVO); | 103 | return success(spuVO); |
| 122 | } | 104 | } |
| 123 | 105 | ||
| 124 | - private MemberLevelRespDTO getMemberLevel() { | ||
| 125 | - Long userId = getLoginUserId(); | ||
| 126 | - if (userId == null) { | ||
| 127 | - return null; | ||
| 128 | - } | ||
| 129 | - MemberUserRespDTO user = memberUserApi.getUser(userId); | ||
| 130 | - if (user.getLevelId() == null || user.getLevelId() <= 0) { | ||
| 131 | - return null; | ||
| 132 | - } | ||
| 133 | - return memberLevelApi.getMemberLevel(user.getLevelId()); | ||
| 134 | - } | ||
| 135 | - | ||
| 136 | - /** | ||
| 137 | - * 计算会员 VIP 优惠价格 | ||
| 138 | - * | ||
| 139 | - * @param price 原价 | ||
| 140 | - * @param memberLevel 会员等级 | ||
| 141 | - * @return 优惠价格 | ||
| 142 | - */ | ||
| 143 | - public Integer calculateVipPrice(Integer price, MemberLevelRespDTO memberLevel) { | ||
| 144 | - if (memberLevel == null || memberLevel.getDiscountPercent() == null) { | ||
| 145 | - return null; | ||
| 146 | - } | ||
| 147 | - Integer newPrice = price * memberLevel.getDiscountPercent() / 100; | ||
| 148 | - return price - newPrice; | ||
| 149 | - } | ||
| 150 | - | ||
| 151 | } | 106 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/vo/AppProductSpuDetailRespVO.java
| @@ -46,9 +46,6 @@ public class AppProductSpuDetailRespVO { | @@ -46,9 +46,6 @@ public class AppProductSpuDetailRespVO { | ||
| 46 | @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | 46 | @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 47 | private Integer marketPrice; | 47 | private Integer marketPrice; |
| 48 | 48 | ||
| 49 | - @Schema(description = "VIP 价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "968") // 通过会员等级,计算出折扣后价格 | ||
| 50 | - private Integer vipPrice; | ||
| 51 | - | ||
| 52 | @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") | 49 | @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") |
| 53 | private Integer stock; | 50 | private Integer stock; |
| 54 | 51 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/vo/AppProductSpuRespVO.java
| @@ -38,9 +38,6 @@ public class AppProductSpuRespVO { | @@ -38,9 +38,6 @@ public class AppProductSpuRespVO { | ||
| 38 | @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | 38 | @Schema(description = "市场价,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| 39 | private Integer marketPrice; | 39 | private Integer marketPrice; |
| 40 | 40 | ||
| 41 | -// @Schema(description = "VIP 价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "968") // 通过会员等级,计算出折扣后价格 | ||
| 42 | -// private Integer vipPrice; | ||
| 43 | - | ||
| 44 | @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") | 41 | @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "666") |
| 45 | private Integer stock; | 42 | private Integer stock; |
| 46 | 43 |
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/discount/dto/DiscountProductRespDTO.java
| @@ -47,9 +47,11 @@ public class DiscountProductRespDTO { | @@ -47,9 +47,11 @@ public class DiscountProductRespDTO { | ||
| 47 | */ | 47 | */ |
| 48 | private String activityName; | 48 | private String activityName; |
| 49 | /** | 49 | /** |
| 50 | + * 活动开始时间点 | ||
| 51 | + */ | ||
| 52 | + private LocalDateTime activityStartTime; | ||
| 53 | + /** | ||
| 50 | * 活动结束时间点 | 54 | * 活动结束时间点 |
| 51 | - * | ||
| 52 | - * 冗余 {@link DiscountActivityDO#getEndTime()} | ||
| 53 | */ | 55 | */ |
| 54 | private LocalDateTime activityEndTime; | 56 | private LocalDateTime activityEndTime; |
| 55 | 57 |
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/reward/RewardActivityApi.java
| @@ -14,15 +14,6 @@ import java.util.List; | @@ -14,15 +14,6 @@ import java.util.List; | ||
| 14 | public interface RewardActivityApi { | 14 | public interface RewardActivityApi { |
| 15 | 15 | ||
| 16 | /** | 16 | /** |
| 17 | - * 获得当前时间内开启的满减送活动 | ||
| 18 | - * | ||
| 19 | - * @param status 状态 | ||
| 20 | - * @param dateTime 当前时间,即筛选 <= dateTime 的满减送活动 | ||
| 21 | - * @return 满减送活动列表 | ||
| 22 | - */ | ||
| 23 | - List<RewardActivityMatchRespDTO> getRewardActivityListByStatusAndNow(Integer status, LocalDateTime dateTime); | ||
| 24 | - | ||
| 25 | - /** | ||
| 26 | * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 | 17 | * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 |
| 27 | * | 18 | * |
| 28 | * @param spuIds spu 编号 | 19 | * @param spuIds spu 编号 |
| @@ -31,4 +22,5 @@ public interface RewardActivityApi { | @@ -31,4 +22,5 @@ public interface RewardActivityApi { | ||
| 31 | * @return 满减送活动列表 | 22 | * @return 满减送活动列表 |
| 32 | */ | 23 | */ |
| 33 | List<RewardActivityMatchRespDTO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime); | 24 | List<RewardActivityMatchRespDTO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime); |
| 25 | + | ||
| 34 | } | 26 | } |
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
| @@ -15,7 +15,6 @@ public interface ErrorCodeConstants { | @@ -15,7 +15,6 @@ public interface ErrorCodeConstants { | ||
| 15 | ErrorCode DISCOUNT_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_001_002, "限时折扣活动已关闭,不能修改"); | 15 | ErrorCode DISCOUNT_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_001_002, "限时折扣活动已关闭,不能修改"); |
| 16 | ErrorCode DISCOUNT_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_001_003, "限时折扣活动未关闭,不能删除"); | 16 | ErrorCode DISCOUNT_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_001_003, "限时折扣活动未关闭,不能删除"); |
| 17 | ErrorCode DISCOUNT_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_001_004, "限时折扣活动已关闭,不能重复关闭"); | 17 | ErrorCode DISCOUNT_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_001_004, "限时折扣活动已关闭,不能重复关闭"); |
| 18 | - ErrorCode DISCOUNT_ACTIVITY_TYPE_NOT_EXISTS = new ErrorCode(1_013_001_005, "限时折扣活动类型不存在"); | ||
| 19 | 18 | ||
| 20 | // ========== Banner 相关 1-013-002-000 ============ | 19 | // ========== Banner 相关 1-013-002-000 ============ |
| 21 | ErrorCode BANNER_NOT_EXISTS = new ErrorCode(1_013_002_000, "Banner 不存在"); | 20 | ErrorCode BANNER_NOT_EXISTS = new ErrorCode(1_013_002_000, "Banner 不存在"); |
| @@ -44,7 +43,6 @@ public interface ErrorCodeConstants { | @@ -44,7 +43,6 @@ public interface ErrorCodeConstants { | ||
| 44 | ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除"); | 43 | ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除"); |
| 45 | ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭"); | 44 | ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭"); |
| 46 | ErrorCode REWARD_ACTIVITY_SCOPE_EXISTS = new ErrorCode(1_013_006_005, "与该时间段已存在的满减送活动商品范围冲突"); | 45 | ErrorCode REWARD_ACTIVITY_SCOPE_EXISTS = new ErrorCode(1_013_006_005, "与该时间段已存在的满减送活动商品范围冲突"); |
| 47 | - ErrorCode REWARD_ACTIVITY_TYPE_NOT_EXISTS = new ErrorCode(1_013_006_006, "满减送活动类型不存在"); | ||
| 48 | 46 | ||
| 49 | // ========== TODO 空着 1-013-007-000 ============ | 47 | // ========== TODO 空着 1-013-007-000 ============ |
| 50 | 48 |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/discount/DiscountActivityApiImpl.java
| 1 | package cn.iocoder.yudao.module.promotion.api.discount; | 1 | package cn.iocoder.yudao.module.promotion.api.discount; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 3 | import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | 4 | import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; |
| 4 | -import cn.iocoder.yudao.module.promotion.convert.discount.DiscountActivityConvert; | 5 | +import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; |
| 5 | import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService; | 6 | import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService; |
| 7 | +import jakarta.annotation.Resource; | ||
| 6 | import org.springframework.stereotype.Service; | 8 | import org.springframework.stereotype.Service; |
| 7 | import org.springframework.validation.annotation.Validated; | 9 | import org.springframework.validation.annotation.Validated; |
| 8 | 10 | ||
| 9 | -import jakarta.annotation.Resource; | ||
| 10 | import java.util.Collection; | 11 | import java.util.Collection; |
| 11 | import java.util.List; | 12 | import java.util.List; |
| 12 | 13 | ||
| @@ -24,7 +25,8 @@ public class DiscountActivityApiImpl implements DiscountActivityApi { | @@ -24,7 +25,8 @@ public class DiscountActivityApiImpl implements DiscountActivityApi { | ||
| 24 | 25 | ||
| 25 | @Override | 26 | @Override |
| 26 | public List<DiscountProductRespDTO> getMatchDiscountProductList(Collection<Long> skuIds) { | 27 | public List<DiscountProductRespDTO> getMatchDiscountProductList(Collection<Long> skuIds) { |
| 27 | - return discountActivityService.getMatchDiscountProductList(skuIds); | 28 | + List<DiscountProductDO> list = discountActivityService.getMatchDiscountProductList(skuIds); |
| 29 | + return BeanUtils.toBean(list, DiscountProductRespDTO.class); | ||
| 28 | } | 30 | } |
| 29 | 31 | ||
| 30 | } | 32 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/reward/RewardActivityApiImpl.java
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.promotion.api.reward; | @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.promotion.api.reward; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 3 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 4 | import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; | 4 | import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; |
| 5 | -import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert; | ||
| 6 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | 5 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; |
| 7 | import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService; | 6 | import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService; |
| 8 | import jakarta.annotation.Resource; | 7 | import jakarta.annotation.Resource; |
| @@ -26,15 +25,9 @@ public class RewardActivityApiImpl implements RewardActivityApi { | @@ -26,15 +25,9 @@ public class RewardActivityApiImpl implements RewardActivityApi { | ||
| 26 | private RewardActivityService rewardActivityService; | 25 | private RewardActivityService rewardActivityService; |
| 27 | 26 | ||
| 28 | @Override | 27 | @Override |
| 29 | - public List<RewardActivityMatchRespDTO> getRewardActivityListByStatusAndNow(Integer status, LocalDateTime dateTime) { | ||
| 30 | - List<RewardActivityDO> list = rewardActivityService.getRewardActivityListByStatusAndDateTimeLt(status, dateTime); | ||
| 31 | - return BeanUtils.toBean(list, RewardActivityMatchRespDTO.class); | ||
| 32 | - } | ||
| 33 | - | ||
| 34 | - @Override | ||
| 35 | public List<RewardActivityMatchRespDTO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) { | 28 | public List<RewardActivityMatchRespDTO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) { |
| 36 | - List<RewardActivityDO> rewardActivityBySpuIdsAndStatusAndDateTimeLt = rewardActivityService.getRewardActivityBySpuIdsAndStatusAndDateTimeLt(spuIds, status, dateTime); | ||
| 37 | - return RewardActivityConvert.INSTANCE.convertList(rewardActivityBySpuIdsAndStatusAndDateTimeLt); | 29 | + List<RewardActivityDO> list = rewardActivityService.getRewardActivityBySpuIdsAndStatusAndDateTimeLt(spuIds, status, dateTime); |
| 30 | + return BeanUtils.toBean(list, RewardActivityMatchRespDTO.class); | ||
| 38 | } | 31 | } |
| 39 | 32 | ||
| 40 | } | 33 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/coupon/vo/template/CouponTemplateBaseVO.java
| @@ -2,22 +2,19 @@ package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template; | @@ -2,22 +2,19 @@ package cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.util.ObjectUtil; | 4 | import cn.hutool.core.util.ObjectUtil; |
| 5 | -import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; | ||
| 6 | import cn.iocoder.yudao.framework.common.validation.InEnum; | 5 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 7 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; | 6 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; |
| 8 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | 7 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| 9 | -import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum; | ||
| 10 | import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum; | 8 | import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTemplateValidityTypeEnum; |
| 11 | import com.fasterxml.jackson.annotation.JsonFormat; | 9 | import com.fasterxml.jackson.annotation.JsonFormat; |
| 12 | import com.fasterxml.jackson.annotation.JsonIgnore; | 10 | import com.fasterxml.jackson.annotation.JsonIgnore; |
| 13 | import io.swagger.v3.oas.annotations.media.Schema; | 11 | import io.swagger.v3.oas.annotations.media.Schema; |
| 14 | -import lombok.Data; | ||
| 15 | -import org.springframework.format.annotation.DateTimeFormat; | ||
| 16 | - | ||
| 17 | -import jakarta.validation.Validator; | ||
| 18 | import jakarta.validation.constraints.AssertTrue; | 12 | import jakarta.validation.constraints.AssertTrue; |
| 19 | import jakarta.validation.constraints.Min; | 13 | import jakarta.validation.constraints.Min; |
| 20 | import jakarta.validation.constraints.NotNull; | 14 | import jakarta.validation.constraints.NotNull; |
| 15 | +import lombok.Data; | ||
| 16 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 17 | + | ||
| 21 | import java.time.LocalDateTime; | 18 | import java.time.LocalDateTime; |
| 22 | import java.util.List; | 19 | import java.util.List; |
| 23 | import java.util.Objects; | 20 | import java.util.Objects; |
| @@ -40,11 +37,11 @@ public class CouponTemplateBaseVO { | @@ -40,11 +37,11 @@ public class CouponTemplateBaseVO { | ||
| 40 | private String description; | 37 | private String description; |
| 41 | 38 | ||
| 42 | @Schema(description = "发行总量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") // -1 - 则表示不限制发放数量 | 39 | @Schema(description = "发行总量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") // -1 - 则表示不限制发放数量 |
| 43 | - @NotNull(message = "发行总量不能为空", groups = {User.class}) | 40 | + @NotNull(message = "发行总量不能为空") |
| 44 | private Integer totalCount; | 41 | private Integer totalCount; |
| 45 | 42 | ||
| 46 | @Schema(description = "每人限领个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "66") // -1 - 则表示不限制 | 43 | @Schema(description = "每人限领个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "66") // -1 - 则表示不限制 |
| 47 | - @NotNull(message = "每人限领个数不能为空", groups = {User.class}) | 44 | + @NotNull(message = "每人限领个数不能为空") |
| 48 | private Integer takeLimitCount; | 45 | private Integer takeLimitCount; |
| 49 | 46 | ||
| 50 | @Schema(description = "领取方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 47 | @Schema(description = "领取方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| @@ -92,16 +89,13 @@ public class CouponTemplateBaseVO { | @@ -92,16 +89,13 @@ public class CouponTemplateBaseVO { | ||
| 92 | private Integer discountType; | 89 | private Integer discountType; |
| 93 | 90 | ||
| 94 | @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 | 91 | @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 |
| 95 | - @NotNull(message = "折扣百分比不能为空", groups = {Percent.class}) | ||
| 96 | private Integer discountPercent; | 92 | private Integer discountPercent; |
| 97 | 93 | ||
| 98 | @Schema(description = "优惠金额", example = "10") | 94 | @Schema(description = "优惠金额", example = "10") |
| 99 | @Min(value = 0, message = "优惠金额需要大于等于 0") | 95 | @Min(value = 0, message = "优惠金额需要大于等于 0") |
| 100 | - @NotNull(message = "优惠金额不能为空", groups = {Price.class}) | ||
| 101 | private Integer discountPrice; | 96 | private Integer discountPrice; |
| 102 | 97 | ||
| 103 | @Schema(description = "折扣上限", example = "100") // 单位:分,仅在 discountType 为 PERCENT 使用 | 98 | @Schema(description = "折扣上限", example = "100") // 单位:分,仅在 discountType 为 PERCENT 使用 |
| 104 | - @NotNull(message = "折扣上限不能为空", groups = {Percent.class}) | ||
| 105 | private Integer discountLimitPrice; | 99 | private Integer discountLimitPrice; |
| 106 | 100 | ||
| 107 | @AssertTrue(message = "商品范围编号的数组不能为空") | 101 | @AssertTrue(message = "商品范围编号的数组不能为空") |
| @@ -160,54 +154,4 @@ public class CouponTemplateBaseVO { | @@ -160,54 +154,4 @@ public class CouponTemplateBaseVO { | ||
| 160 | || discountLimitPrice != null; | 154 | || discountLimitPrice != null; |
| 161 | } | 155 | } |
| 162 | 156 | ||
| 163 | - //-------------------------领取方式校验start---------------------------- | ||
| 164 | - | ||
| 165 | - /** | ||
| 166 | - * 直接领取 | ||
| 167 | - */ | ||
| 168 | - public interface User { | ||
| 169 | - } | ||
| 170 | - | ||
| 171 | - /** | ||
| 172 | - * 指定发放 | ||
| 173 | - */ | ||
| 174 | - public interface Admin { | ||
| 175 | - } | ||
| 176 | - | ||
| 177 | - //-------------------------领取方式校验end------------------------------ | ||
| 178 | - | ||
| 179 | - //-------------------------优惠类型校验start---------------------------- | ||
| 180 | - | ||
| 181 | - /** | ||
| 182 | - * 满减 | ||
| 183 | - */ | ||
| 184 | - public interface Price { | ||
| 185 | - } | ||
| 186 | - | ||
| 187 | - /** | ||
| 188 | - * 折扣 | ||
| 189 | - */ | ||
| 190 | - public interface Percent { | ||
| 191 | - } | ||
| 192 | - | ||
| 193 | - //-------------------------优惠类型校验end------------------------------ | ||
| 194 | - | ||
| 195 | - public void validate(Validator validator) { | ||
| 196 | - | ||
| 197 | - //领取方式校验 | ||
| 198 | - if (CouponTakeTypeEnum.USER.getType().equals(takeType)) { | ||
| 199 | - ValidationUtils.validate(validator, this, User.class); | ||
| 200 | - } else if (CouponTakeTypeEnum.ADMIN.getType().equals(takeType)) { | ||
| 201 | - ValidationUtils.validate(validator, this, Admin.class); | ||
| 202 | - } | ||
| 203 | - | ||
| 204 | - //优惠类型校验 | ||
| 205 | - if (PromotionDiscountTypeEnum.PRICE.getType().equals(discountType)){ | ||
| 206 | - ValidationUtils.validate(validator, this, Price.class); | ||
| 207 | - } else if (PromotionDiscountTypeEnum.PERCENT.getType().equals(discountType)) { | ||
| 208 | - ValidationUtils.validate(validator, this, Percent.class); | ||
| 209 | - } | ||
| 210 | - | ||
| 211 | - } | ||
| 212 | - | ||
| 213 | } | 157 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.java
| @@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.promotion.controller.app.activity; | @@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.promotion.controller.app.activity; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.map.MapUtil; | 4 | import cn.hutool.core.map.MapUtil; |
| 5 | -import cn.hutool.core.util.ObjUtil; | ||
| 6 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 5 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 7 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 8 | import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; | 7 | import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; |
| 9 | -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; | ||
| 10 | import cn.iocoder.yudao.module.promotion.controller.app.activity.vo.AppActivityRespVO; | 8 | import cn.iocoder.yudao.module.promotion.controller.app.activity.vo.AppActivityRespVO; |
| 11 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO; | 9 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO; |
| 12 | import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO; | 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO; |
| @@ -151,46 +149,23 @@ public class AppActivityController { | @@ -151,46 +149,23 @@ public class AppActivityController { | ||
| 151 | } | 149 | } |
| 152 | 150 | ||
| 153 | private void getRewardActivityList(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) { | 151 | private void getRewardActivityList(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) { |
| 154 | - // TODO @puhui999:有 3 范围,不只 spuId,还有 categoryId,全部,下次 fix | ||
| 155 | - List<RewardActivityDO> rewardActivityList = rewardActivityService.getRewardActivityBySpuIdsAndStatusAndDateTimeLt( | 152 | + List<RewardActivityDO> rewardActivities = rewardActivityService.getRewardActivityBySpuIdsAndStatusAndDateTimeLt( |
| 156 | spuIds, CommonStatusEnum.ENABLE.getStatus(), now); | 153 | spuIds, CommonStatusEnum.ENABLE.getStatus(), now); |
| 157 | - if (CollUtil.isEmpty(rewardActivityList)) { | 154 | + if (CollUtil.isEmpty(rewardActivities)) { |
| 158 | return; | 155 | return; |
| 159 | } | 156 | } |
| 160 | 157 | ||
| 161 | - Map<Long, Optional<RewardActivityDO>> spuIdAndActivityMap = spuIds.stream() | ||
| 162 | - .collect(Collectors.toMap( | ||
| 163 | - spuId -> spuId, | ||
| 164 | - spuId -> rewardActivityList.stream() | ||
| 165 | - .filter(activity -> | ||
| 166 | - ( activity.getProductScopeValues()!=null && | ||
| 167 | - (activity.getProductScopeValues().contains(spuId) || | ||
| 168 | - activity.getProductScopeValues().contains(productSpuApi.getSpu(spuId).getCategoryId()))) || | ||
| 169 | - activity.getProductScope()==1 | ||
| 170 | - ) | ||
| 171 | - .max(Comparator.comparing(RewardActivityDO::getCreateTime)))); | 158 | + Map<Long, Optional<RewardActivityDO>> spuIdAndActivityMap = spuIds.stream().collect(Collectors.toMap(spuId -> spuId, spuId -> rewardActivities.stream() |
| 159 | + .filter(activity -> PromotionProductScopeEnum.isAll(activity.getProductScope()) | ||
| 160 | + || PromotionProductScopeEnum.isSpu(activity.getProductScope()) // 商品范围 | ||
| 161 | + && CollUtil.contains(activity.getProductScopeValues(), spuId) | ||
| 162 | + || PromotionProductScopeEnum.isCategory(activity.getProductScope()) // 分类范围 | ||
| 163 | + && CollUtil.contains(activity.getProductScopeValues(), productSpuApi.getSpu(spuId).getCategoryId())) | ||
| 164 | + .max(Comparator.comparing(RewardActivityDO::getCreateTime)))); | ||
| 172 | for (Long supId : spuIdAndActivityMap.keySet()) { | 165 | for (Long supId : spuIdAndActivityMap.keySet()) { |
| 173 | - if (spuIdAndActivityMap.get(supId).isEmpty()) { | ||
| 174 | - continue; | ||
| 175 | - } | ||
| 176 | - | ||
| 177 | - RewardActivityDO rewardActivityDO = spuIdAndActivityMap.get(supId).get(); | ||
| 178 | - activityList.add(new AppActivityRespVO(rewardActivityDO.getId(), PromotionTypeEnum.REWARD_ACTIVITY.getType(), | ||
| 179 | - rewardActivityDO.getName(), supId, rewardActivityDO.getStartTime(), rewardActivityDO.getEndTime())); | ||
| 180 | - } | ||
| 181 | - } | ||
| 182 | - | ||
| 183 | - private static void buildAppActivityRespVO(RewardActivityDO rewardActivity, Collection<Long> spuIds, | ||
| 184 | - List<AppActivityRespVO> activityList) { | ||
| 185 | - for (Long spuId : spuIds) { | ||
| 186 | - // 校验商品是否已经加入过活动 | ||
| 187 | - if (anyMatch(activityList, appActivity -> ObjUtil.equal(appActivity.getId(), rewardActivity.getId()) && | ||
| 188 | - ObjUtil.equal(appActivity.getSpuId(), spuId))) { | ||
| 189 | - continue; | ||
| 190 | - } | ||
| 191 | - activityList.add(new AppActivityRespVO(rewardActivity.getId(), | ||
| 192 | - PromotionTypeEnum.REWARD_ACTIVITY.getType(), rewardActivity.getName(), spuId, | ||
| 193 | - rewardActivity.getStartTime(), rewardActivity.getEndTime())); | 166 | + spuIdAndActivityMap.get(supId).ifPresent(rewardActivity -> activityList.add( |
| 167 | + new AppActivityRespVO(rewardActivity.getId(), PromotionTypeEnum.REWARD_ACTIVITY.getType(), | ||
| 168 | + rewardActivity.getName(), supId, rewardActivity.getStartTime(), rewardActivity.getEndTime()))); | ||
| 194 | } | 169 | } |
| 195 | } | 170 | } |
| 196 | 171 |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/reward/vo/AppRewardActivityRespVO.java
| @@ -20,6 +20,12 @@ public class AppRewardActivityRespVO { | @@ -20,6 +20,12 @@ public class AppRewardActivityRespVO { | ||
| 20 | @Schema(description = "活动标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "满啦满啦") | 20 | @Schema(description = "活动标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "满啦满啦") |
| 21 | private String name; | 21 | private String name; |
| 22 | 22 | ||
| 23 | + @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 24 | + private LocalDateTime startTime; | ||
| 25 | + | ||
| 26 | + @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) | ||
| 27 | + private LocalDateTime endTime; | ||
| 28 | + | ||
| 23 | @Schema(description = "条件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 29 | @Schema(description = "条件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 24 | private Integer conditionType; | 30 | private Integer conditionType; |
| 25 | 31 | ||
| @@ -32,10 +38,4 @@ public class AppRewardActivityRespVO { | @@ -32,10 +38,4 @@ public class AppRewardActivityRespVO { | ||
| 32 | @Schema(description = "优惠规则的数组") | 38 | @Schema(description = "优惠规则的数组") |
| 33 | private List<RewardActivityBaseVO.Rule> rules; | 39 | private List<RewardActivityBaseVO.Rule> rules; |
| 34 | 40 | ||
| 35 | - @Schema(description = "开始时间") | ||
| 36 | - private LocalDateTime startTime; | ||
| 37 | - | ||
| 38 | - @Schema(description = "结束时间") | ||
| 39 | - private LocalDateTime endTime; | ||
| 40 | - | ||
| 41 | } | 41 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/coupon/CouponConvert.java
| @@ -29,8 +29,6 @@ public interface CouponConvert { | @@ -29,8 +29,6 @@ public interface CouponConvert { | ||
| 29 | 29 | ||
| 30 | CouponRespDTO convert(CouponDO bean); | 30 | CouponRespDTO convert(CouponDO bean); |
| 31 | 31 | ||
| 32 | - AppCouponMatchRespVO convert2(CouponDO bean); | ||
| 33 | - | ||
| 34 | default CouponDO convert(CouponTemplateDO template, Long userId) { | 32 | default CouponDO convert(CouponTemplateDO template, Long userId) { |
| 35 | CouponDO couponDO = new CouponDO() | 33 | CouponDO couponDO = new CouponDO() |
| 36 | .setTemplateId(template.getId()) | 34 | .setTemplateId(template.getId()) |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/discount/DiscountActivityConvert.java
| @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 6 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | 6 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 7 | import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; | 7 | import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; |
| 8 | -import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | ||
| 9 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.*; | 8 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.*; |
| 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; | 9 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; |
| 11 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; |
| @@ -34,9 +33,6 @@ public interface DiscountActivityConvert { | @@ -34,9 +33,6 @@ public interface DiscountActivityConvert { | ||
| 34 | 33 | ||
| 35 | List<DiscountActivityRespVO> convertList(List<DiscountActivityDO> list); | 34 | List<DiscountActivityRespVO> convertList(List<DiscountActivityDO> list); |
| 36 | List<DiscountActivityBaseVO.Product> convertList2(List<DiscountProductDO> list); | 35 | List<DiscountActivityBaseVO.Product> convertList2(List<DiscountProductDO> list); |
| 37 | - | ||
| 38 | - List<DiscountProductRespDTO> convertList02(List<DiscountProductDO> list); | ||
| 39 | - | ||
| 40 | PageResult<DiscountActivityRespVO> convertPage(PageResult<DiscountActivityDO> page); | 36 | PageResult<DiscountActivityRespVO> convertPage(PageResult<DiscountActivityDO> page); |
| 41 | 37 | ||
| 42 | default PageResult<DiscountActivityRespVO> convertPage(PageResult<DiscountActivityDO> page, | 38 | default PageResult<DiscountActivityRespVO> convertPage(PageResult<DiscountActivityDO> page, |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/reward/RewardActivityConvert.java deleted
| 1 | -package cn.iocoder.yudao.module.promotion.convert.reward; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 4 | -import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; | ||
| 5 | -import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityRespVO; | ||
| 7 | -import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; | ||
| 8 | -import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | ||
| 9 | -import org.mapstruct.Mapper; | ||
| 10 | -import org.mapstruct.factory.Mappers; | ||
| 11 | - | ||
| 12 | -import java.util.List; | ||
| 13 | - | ||
| 14 | -/** | ||
| 15 | - * 满减送活动 Convert | ||
| 16 | - * | ||
| 17 | - * @author 芋道源码 | ||
| 18 | - */ | ||
| 19 | -@Mapper | ||
| 20 | -public interface RewardActivityConvert { | ||
| 21 | - | ||
| 22 | - RewardActivityConvert INSTANCE = Mappers.getMapper(RewardActivityConvert.class); | ||
| 23 | - | ||
| 24 | - RewardActivityDO convert(RewardActivityCreateReqVO bean); | ||
| 25 | - | ||
| 26 | - RewardActivityDO convert(RewardActivityUpdateReqVO bean); | ||
| 27 | - | ||
| 28 | - RewardActivityRespVO convert(RewardActivityDO bean); | ||
| 29 | - | ||
| 30 | - PageResult<RewardActivityRespVO> convertPage(PageResult<RewardActivityDO> page); | ||
| 31 | - | ||
| 32 | - List<RewardActivityMatchRespDTO> convertList(List<RewardActivityDO> rewardActivityBySpuIdsAndStatusAndDateTimeLt); | ||
| 33 | -} |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/discount/DiscountProductDO.java
| @@ -67,9 +67,15 @@ public class DiscountProductDO extends BaseDO { | @@ -67,9 +67,15 @@ public class DiscountProductDO extends BaseDO { | ||
| 67 | private Integer discountPrice; | 67 | private Integer discountPrice; |
| 68 | 68 | ||
| 69 | /** | 69 | /** |
| 70 | + * 活动标题 | ||
| 71 | + * | ||
| 72 | + * 冗余 {@link DiscountActivityDO#getName()} | ||
| 73 | + */ | ||
| 74 | + private String activityName; | ||
| 75 | + /** | ||
| 70 | * 活动状态 | 76 | * 活动状态 |
| 71 | * | 77 | * |
| 72 | - * 关联 {@link DiscountActivityDO#getStatus()} | 78 | + * 冗余 {@link DiscountActivityDO#getStatus()} |
| 73 | */ | 79 | */ |
| 74 | private Integer activityStatus; | 80 | private Integer activityStatus; |
| 75 | /** | 81 | /** |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/coupon/CouponMapper.java
| @@ -80,15 +80,6 @@ public interface CouponMapper extends BaseMapperX<CouponDO> { | @@ -80,15 +80,6 @@ public interface CouponMapper extends BaseMapperX<CouponDO> { | ||
| 80 | return convertMap(list, map -> MapUtil.getLong(map, templateIdAlias), map -> MapUtil.getInt(map, countAlias)); | 80 | return convertMap(list, map -> MapUtil.getLong(map, templateIdAlias), map -> MapUtil.getInt(map, countAlias)); |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | - default List<CouponDO> selectListByUserIdAndStatusAndUsePriceLeAndProductScope( | ||
| 84 | - Long userId, Integer status) { | ||
| 85 | - List<CouponDO> couponDOS = selectList(new LambdaQueryWrapperX<CouponDO>() | ||
| 86 | - .eq(CouponDO::getUserId, userId) | ||
| 87 | - .eq(CouponDO::getStatus, status) | ||
| 88 | - ); | ||
| 89 | - return couponDOS; | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | default List<CouponDO> selectListByStatusAndValidEndTimeLe(Integer status, LocalDateTime validEndTime) { | 83 | default List<CouponDO> selectListByStatusAndValidEndTimeLe(Integer status, LocalDateTime validEndTime) { |
| 93 | return selectList(new LambdaQueryWrapperX<CouponDO>() | 84 | return selectList(new LambdaQueryWrapperX<CouponDO>() |
| 94 | .eq(CouponDO::getStatus, status) | 85 | .eq(CouponDO::getStatus, status) |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/coupon/CouponTemplateMapper.java
| @@ -70,7 +70,7 @@ public interface CouponTemplateMapper extends BaseMapperX<CouponTemplateDO> { | @@ -70,7 +70,7 @@ public interface CouponTemplateMapper extends BaseMapperX<CouponTemplateDO> { | ||
| 70 | .in(CouponTemplateDO::getTakeType, canTakeTypes) // 2. 领取方式一致 | 70 | .in(CouponTemplateDO::getTakeType, canTakeTypes) // 2. 领取方式一致 |
| 71 | .and(ww -> ww.gt(CouponTemplateDO::getValidEndTime, LocalDateTime.now()) // 3.1 未过期 | 71 | .and(ww -> ww.gt(CouponTemplateDO::getValidEndTime, LocalDateTime.now()) // 3.1 未过期 |
| 72 | .or().eq(CouponTemplateDO::getValidityType, CouponTemplateValidityTypeEnum.TERM.getType())) // 3.2 领取之后 | 72 | .or().eq(CouponTemplateDO::getValidityType, CouponTemplateValidityTypeEnum.TERM.getType())) // 3.2 领取之后 |
| 73 | - .apply(" (take_count < total_count OR total_count = -1 or total_count is null)"); // 4. 剩余数量大于 0,或者无限领取,或者是指定发放的券 | 73 | + .apply(" (take_count < total_count OR total_count = -1)"); // 4. 剩余数量大于 0,或者无限领取 |
| 74 | } | 74 | } |
| 75 | return canTakeConsumer; | 75 | return canTakeConsumer; |
| 76 | } | 76 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/discount/DiscountProductMapper.java
| 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.discount; | 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.discount; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | -import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | 4 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 5 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | 5 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; |
| 6 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 6 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| 7 | import org.apache.ibatis.annotations.Mapper; | 7 | import org.apache.ibatis.annotations.Mapper; |
| 8 | -import org.apache.ibatis.annotations.Param; | ||
| 9 | 8 | ||
| 9 | +import java.time.LocalDateTime; | ||
| 10 | import java.util.Collection; | 10 | import java.util.Collection; |
| 11 | import java.util.List; | 11 | import java.util.List; |
| 12 | import java.util.Map; | 12 | import java.util.Map; |
| @@ -19,20 +19,21 @@ import java.util.Map; | @@ -19,20 +19,21 @@ import java.util.Map; | ||
| 19 | @Mapper | 19 | @Mapper |
| 20 | public interface DiscountProductMapper extends BaseMapperX<DiscountProductDO> { | 20 | public interface DiscountProductMapper extends BaseMapperX<DiscountProductDO> { |
| 21 | 21 | ||
| 22 | - default List<DiscountProductDO> selectListBySkuId(Collection<Long> skuIds) { | ||
| 23 | - return selectList(DiscountProductDO::getSkuId, skuIds); | ||
| 24 | - } | ||
| 25 | - | ||
| 26 | default List<DiscountProductDO> selectListByActivityId(Long activityId) { | 22 | default List<DiscountProductDO> selectListByActivityId(Long activityId) { |
| 27 | return selectList(DiscountProductDO::getActivityId, activityId); | 23 | return selectList(DiscountProductDO::getActivityId, activityId); |
| 28 | } | 24 | } |
| 29 | 25 | ||
| 30 | - default List<DiscountProductDO> selectListByActivityId(Collection<Long> activityIds) { | ||
| 31 | - return selectList(DiscountProductDO::getActivityId, activityIds); | 26 | + default List<DiscountProductDO> selectListBySkuIds(Collection<Long> skuIds) { |
| 27 | + return selectList(DiscountProductDO::getSkuId, skuIds); | ||
| 32 | } | 28 | } |
| 33 | 29 | ||
| 34 | - // TODO @zhangshuai:逻辑里,尽量避免写 join 语句哈,你可以看看这个查询,有什么办法优化?目前的一个思路,是分 2 次查询,性能也是 ok 的 | ||
| 35 | - List<DiscountProductRespDTO> getMatchDiscountProductList(@Param("skuIds") Collection<Long> skuIds); | 30 | + default List<DiscountProductDO> selectListByStatusAndDateTimeLt(Collection<Long> skuIds, Integer status, LocalDateTime dateTime) { |
| 31 | + return selectList(new LambdaQueryWrapperX<DiscountProductDO>() | ||
| 32 | + .in(DiscountProductDO::getSkuId, skuIds) | ||
| 33 | + .eq(DiscountProductDO::getActivityStatus,status) | ||
| 34 | + .lt(DiscountProductDO::getActivityStartTime, dateTime) | ||
| 35 | + .gt(DiscountProductDO::getActivityEndTime, dateTime)); | ||
| 36 | + } | ||
| 36 | 37 | ||
| 37 | /** | 38 | /** |
| 38 | * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号 | 39 | * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号 |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/reward/RewardActivityMapper.java
| @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||
| 7 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; | 7 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; |
| 8 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | 8 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; |
| 9 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | 9 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| 10 | -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
| 11 | import org.apache.ibatis.annotations.Mapper; | 10 | import org.apache.ibatis.annotations.Mapper; |
| 12 | 11 | ||
| 13 | import java.time.LocalDateTime; | 12 | import java.time.LocalDateTime; |
| @@ -31,34 +30,7 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> { | @@ -31,34 +30,7 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> { | ||
| 31 | .orderByDesc(RewardActivityDO::getId)); | 30 | .orderByDesc(RewardActivityDO::getId)); |
| 32 | } | 31 | } |
| 33 | 32 | ||
| 34 | - default List<RewardActivityDO> selectListBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) { | ||
| 35 | - Function<Collection<Long>, String> productScopeValuesFindInSetFunc = ids -> ids.stream() | ||
| 36 | - .map(id -> StrUtil.format("FIND_IN_SET({}, product_scope_values) ", id)) | ||
| 37 | - .collect(Collectors.joining(" OR ")); | ||
| 38 | - return selectList(new QueryWrapper<RewardActivityDO>() | ||
| 39 | - .eq("status", status) | ||
| 40 | - .apply(productScopeValuesFindInSetFunc.apply(spuIds))); | ||
| 41 | - } | ||
| 42 | - | ||
| 43 | - /** | ||
| 44 | - * 获取指定活动编号的活动列表且 | ||
| 45 | - * 开始时间和结束时间小于给定时间 dateTime 的活动列表 | ||
| 46 | - * | ||
| 47 | - * @param status 状态 | ||
| 48 | - * @param dateTime 指定日期 | ||
| 49 | - * @return 活动列表 | ||
| 50 | - */ | ||
| 51 | - default List<RewardActivityDO> selectListByStatusAndDateTimeLt(Integer status, LocalDateTime dateTime) { | ||
| 52 | - return selectList(new LambdaQueryWrapperX<RewardActivityDO>() | ||
| 53 | - .eq(RewardActivityDO::getStatus, status) | ||
| 54 | - .lt(RewardActivityDO::getStartTime, dateTime) | ||
| 55 | - .gt(RewardActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动 | ||
| 56 | - .orderByAsc(RewardActivityDO::getStartTime) | ||
| 57 | - ); | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - default List<RewardActivityDO> getRewardActivityByStatusAndDateTimeLt(Collection<Long> spuIds,Collection<Long> categoryIds, Integer status, LocalDateTime dateTime) { | ||
| 61 | - //拼接通用券查询语句 | 33 | + default List<RewardActivityDO> selectListByStatusAndDateTimeLt(Collection<Long> spuIds, Collection<Long> categoryIds, Integer status, LocalDateTime dateTime) { |
| 62 | Function<Collection<Long>, String> productScopeValuesFindInSetFunc = ids -> ids.stream() | 34 | Function<Collection<Long>, String> productScopeValuesFindInSetFunc = ids -> ids.stream() |
| 63 | .map(id -> StrUtil.format("FIND_IN_SET({}, product_scope_values) ", id)) | 35 | .map(id -> StrUtil.format("FIND_IN_SET({}, product_scope_values) ", id)) |
| 64 | .collect(Collectors.joining(" OR ")); | 36 | .collect(Collectors.joining(" OR ")); |
| @@ -67,7 +39,7 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> { | @@ -67,7 +39,7 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> { | ||
| 67 | .lt(RewardActivityDO::getStartTime, dateTime) | 39 | .lt(RewardActivityDO::getStartTime, dateTime) |
| 68 | .gt(RewardActivityDO::getEndTime, dateTime) | 40 | .gt(RewardActivityDO::getEndTime, dateTime) |
| 69 | .and(i -> i.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.SPU.getScope()) | 41 | .and(i -> i.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.SPU.getScope()) |
| 70 | - .and(i1 -> i1.apply(productScopeValuesFindInSetFunc.apply(spuIds))) | 42 | + .and(i1 -> i1.apply(productScopeValuesFindInSetFunc.apply(spuIds))) |
| 71 | .or(i1 -> i1.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.ALL.getScope())) | 43 | .or(i1 -> i1.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.ALL.getScope())) |
| 72 | .or(i1 -> i1.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.CATEGORY.getScope()) | 44 | .or(i1 -> i1.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.CATEGORY.getScope()) |
| 73 | .and(i2 -> i2.apply(productScopeValuesFindInSetFunc.apply(categoryIds))))) | 45 | .and(i2 -> i2.apply(productScopeValuesFindInSetFunc.apply(categoryIds))))) |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillconfig/SeckillConfigMapper.java
| 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig; | 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 6 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 7 | import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO; | 6 | import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO; |
| 8 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillConfigDO; | 7 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillConfigDO; |
| 9 | -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
| 10 | import org.apache.ibatis.annotations.Mapper; | 8 | import org.apache.ibatis.annotations.Mapper; |
| 11 | 9 | ||
| 12 | -import java.time.LocalDateTime; | ||
| 13 | -import java.time.format.DateTimeFormatter; | ||
| 14 | import java.util.List; | 10 | import java.util.List; |
| 15 | 11 | ||
| 16 | @Mapper | 12 | @Mapper |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java
| @@ -279,7 +279,7 @@ public class CouponServiceImpl implements CouponService { | @@ -279,7 +279,7 @@ public class CouponServiceImpl implements CouponService { | ||
| 279 | } | 279 | } |
| 280 | } | 280 | } |
| 281 | // 校验领取方式 | 281 | // 校验领取方式 |
| 282 | - if (ObjectUtil.notEqual(couponTemplate.getTakeType(), takeType.getValue())) { | 282 | + if (ObjectUtil.notEqual(couponTemplate.getTakeType(), takeType.getType())) { |
| 283 | throw exception(COUPON_TEMPLATE_CANNOT_TAKE); | 283 | throw exception(COUPON_TEMPLATE_CANNOT_TAKE); |
| 284 | } | 284 | } |
| 285 | } | 285 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java
| @@ -12,11 +12,10 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO; | @@ -12,11 +12,10 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO; | ||
| 12 | import cn.iocoder.yudao.module.promotion.dal.mysql.coupon.CouponTemplateMapper; | 12 | import cn.iocoder.yudao.module.promotion.dal.mysql.coupon.CouponTemplateMapper; |
| 13 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | 13 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| 14 | import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum; | 14 | import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum; |
| 15 | +import jakarta.annotation.Resource; | ||
| 15 | import org.springframework.stereotype.Service; | 16 | import org.springframework.stereotype.Service; |
| 16 | -import jakarta.validation.Validator; | ||
| 17 | import org.springframework.validation.annotation.Validated; | 17 | import org.springframework.validation.annotation.Validated; |
| 18 | 18 | ||
| 19 | -import jakarta.annotation.Resource; | ||
| 20 | import java.util.Collection; | 19 | import java.util.Collection; |
| 21 | import java.util.List; | 20 | import java.util.List; |
| 22 | import java.util.Objects; | 21 | import java.util.Objects; |
| @@ -41,13 +40,9 @@ public class CouponTemplateServiceImpl implements CouponTemplateService { | @@ -41,13 +40,9 @@ public class CouponTemplateServiceImpl implements CouponTemplateService { | ||
| 41 | private ProductCategoryApi productCategoryApi; | 40 | private ProductCategoryApi productCategoryApi; |
| 42 | @Resource | 41 | @Resource |
| 43 | private ProductSpuApi productSpuApi; | 42 | private ProductSpuApi productSpuApi; |
| 44 | - @Resource | ||
| 45 | - private Validator validator; | ||
| 46 | 43 | ||
| 47 | @Override | 44 | @Override |
| 48 | public Long createCouponTemplate(CouponTemplateCreateReqVO createReqVO) { | 45 | public Long createCouponTemplate(CouponTemplateCreateReqVO createReqVO) { |
| 49 | - // 校验参数 | ||
| 50 | - createReqVO.validate(validator); | ||
| 51 | // 校验商品范围 | 46 | // 校验商品范围 |
| 52 | validateProductScope(createReqVO.getProductScope(), createReqVO.getProductScopeValues()); | 47 | validateProductScope(createReqVO.getProductScope(), createReqVO.getProductScopeValues()); |
| 53 | // 插入 | 48 | // 插入 |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityService.java
| 1 | package cn.iocoder.yudao.module.promotion.service.discount; | 1 | package cn.iocoder.yudao.module.promotion.service.discount; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | -import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | ||
| 5 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; | 4 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; |
| 6 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; | 5 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; |
| 7 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; | 6 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; |
| @@ -28,7 +27,7 @@ public interface DiscountActivityService { | @@ -28,7 +27,7 @@ public interface DiscountActivityService { | ||
| 28 | * @param skuIds SKU 编号数组 | 27 | * @param skuIds SKU 编号数组 |
| 29 | * @return 匹配的限时折扣商品 | 28 | * @return 匹配的限时折扣商品 |
| 30 | */ | 29 | */ |
| 31 | - List<DiscountProductRespDTO> getMatchDiscountProductList(Collection<Long> skuIds); | 30 | + List<DiscountProductDO> getMatchDiscountProductList(Collection<Long> skuIds); |
| 32 | 31 | ||
| 33 | /** | 32 | /** |
| 34 | * 创建限时折扣活动 | 33 | * 创建限时折扣活动 |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityServiceImpl.java
| @@ -6,7 +6,6 @@ import cn.hutool.core.map.MapUtil; | @@ -6,7 +6,6 @@ import cn.hutool.core.map.MapUtil; | ||
| 6 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 6 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 8 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 8 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 9 | -import cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO; | ||
| 10 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO; | 9 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO; |
| 11 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; | 10 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; |
| 12 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; | 11 | import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; |
| @@ -16,8 +15,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivit | @@ -16,8 +15,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivit | ||
| 16 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | 15 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; |
| 17 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountActivityMapper; | 16 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountActivityMapper; |
| 18 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper; | 17 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper; |
| 19 | -import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; | ||
| 20 | -import cn.iocoder.yudao.module.promotion.util.PromotionUtils; | ||
| 21 | import jakarta.annotation.Resource; | 18 | import jakarta.annotation.Resource; |
| 22 | import org.springframework.stereotype.Service; | 19 | import org.springframework.stereotype.Service; |
| 23 | import org.springframework.transaction.annotation.Transactional; | 20 | import org.springframework.transaction.annotation.Transactional; |
| @@ -28,7 +25,6 @@ import java.util.Collection; | @@ -28,7 +25,6 @@ import java.util.Collection; | ||
| 28 | import java.util.Collections; | 25 | import java.util.Collections; |
| 29 | import java.util.List; | 26 | import java.util.List; |
| 30 | import java.util.Map; | 27 | import java.util.Map; |
| 31 | -import java.util.stream.Collectors; | ||
| 32 | 28 | ||
| 33 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 29 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 34 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | 30 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| @@ -50,8 +46,8 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -50,8 +46,8 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 50 | private DiscountProductMapper discountProductMapper; | 46 | private DiscountProductMapper discountProductMapper; |
| 51 | 47 | ||
| 52 | @Override | 48 | @Override |
| 53 | - public List<DiscountProductRespDTO> getMatchDiscountProductList(Collection<Long> skuIds) { | ||
| 54 | - return discountProductMapper.getMatchDiscountProductList(skuIds); | 49 | + public List<DiscountProductDO> getMatchDiscountProductList(Collection<Long> skuIds) { |
| 50 | + return discountProductMapper.selectListByStatusAndDateTimeLt(skuIds, CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now()); | ||
| 55 | } | 51 | } |
| 56 | 52 | ||
| 57 | @Override | 53 | @Override |
| @@ -66,10 +62,10 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -66,10 +62,10 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 66 | discountActivityMapper.insert(discountActivity); | 62 | discountActivityMapper.insert(discountActivity); |
| 67 | // 插入商品 | 63 | // 插入商品 |
| 68 | List<DiscountProductDO> discountProducts = BeanUtils.toBean(createReqVO.getProducts(), DiscountProductDO.class, | 64 | List<DiscountProductDO> discountProducts = BeanUtils.toBean(createReqVO.getProducts(), DiscountProductDO.class, |
| 69 | - product -> product.setActivityId(discountActivity.getId()).setActivityStatus(discountActivity.getStatus()) | 65 | + product -> product.setActivityId(discountActivity.getId()) |
| 66 | + .setActivityName(discountActivity.getName()).setActivityStatus(discountActivity.getStatus()) | ||
| 70 | .setActivityStartTime(createReqVO.getStartTime()).setActivityEndTime(createReqVO.getEndTime())); | 67 | .setActivityStartTime(createReqVO.getStartTime()).setActivityEndTime(createReqVO.getEndTime())); |
| 71 | discountProductMapper.insertBatch(discountProducts); | 68 | discountProductMapper.insertBatch(discountProducts); |
| 72 | - // 返回 | ||
| 73 | return discountActivity.getId(); | 69 | return discountActivity.getId(); |
| 74 | } | 70 | } |
| 75 | 71 | ||
| @@ -85,8 +81,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -85,8 +81,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 85 | validateDiscountActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); | 81 | validateDiscountActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); |
| 86 | 82 | ||
| 87 | // 更新活动 | 83 | // 更新活动 |
| 88 | - DiscountActivityDO updateObj = DiscountActivityConvert.INSTANCE.convert(updateReqVO) | ||
| 89 | - .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime())); | 84 | + DiscountActivityDO updateObj = DiscountActivityConvert.INSTANCE.convert(updateReqVO); |
| 90 | discountActivityMapper.updateById(updateObj); | 85 | discountActivityMapper.updateById(updateObj); |
| 91 | // 更新商品 | 86 | // 更新商品 |
| 92 | updateDiscountProduct(updateReqVO); | 87 | updateDiscountProduct(updateReqVO); |
| @@ -101,12 +96,13 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -101,12 +96,13 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 101 | discountProductDO -> updateReqVO.getProducts().stream() | 96 | discountProductDO -> updateReqVO.getProducts().stream() |
| 102 | .noneMatch(product -> DiscountActivityConvert.INSTANCE.isEquals(discountProductDO, product))); | 97 | .noneMatch(product -> DiscountActivityConvert.INSTANCE.isEquals(discountProductDO, product))); |
| 103 | if (CollUtil.isNotEmpty(deleteIds)) { | 98 | if (CollUtil.isNotEmpty(deleteIds)) { |
| 104 | - discountProductMapper.deleteBatchIds(deleteIds); | 99 | + discountProductMapper.deleteByIds(deleteIds); |
| 105 | } | 100 | } |
| 106 | // 计算新增的记录 | 101 | // 计算新增的记录 |
| 107 | List<DiscountProductDO> newDiscountProducts = convertList(updateReqVO.getProducts(), | 102 | List<DiscountProductDO> newDiscountProducts = convertList(updateReqVO.getProducts(), |
| 108 | product -> DiscountActivityConvert.INSTANCE.convert(product) | 103 | product -> DiscountActivityConvert.INSTANCE.convert(product) |
| 109 | .setActivityId(updateReqVO.getId()) | 104 | .setActivityId(updateReqVO.getId()) |
| 105 | + .setActivityName(updateReqVO.getName()) | ||
| 110 | .setActivityStartTime(updateReqVO.getStartTime()) | 106 | .setActivityStartTime(updateReqVO.getStartTime()) |
| 111 | .setActivityEndTime(updateReqVO.getEndTime())); | 107 | .setActivityEndTime(updateReqVO.getEndTime())); |
| 112 | newDiscountProducts.removeIf(product -> dbDiscountProducts.stream().anyMatch( | 108 | newDiscountProducts.removeIf(product -> dbDiscountProducts.stream().anyMatch( |
| @@ -127,11 +123,9 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -127,11 +123,9 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 127 | return; | 123 | return; |
| 128 | } | 124 | } |
| 129 | // 查询商品参加的活动 | 125 | // 查询商品参加的活动 |
| 130 | - // TODO @zhangshuai:下面 121 这个查询,是不是不用做呀;直接 convert 出 skuId 集合就 ok 啦; | ||
| 131 | List<DiscountProductDO> list = discountProductMapper.selectListByActivityId(id); | 126 | List<DiscountProductDO> list = discountProductMapper.selectListByActivityId(id); |
| 132 | - // TODO @zhangshuai:一般简单的 stream 方法,建议是使用 CollectionUtils,例如说这里是 convertList 对把。 | ||
| 133 | - List<Long> skuIds = list.stream().map(item -> item.getSkuId()).collect(Collectors.toList()); | ||
| 134 | - List<DiscountProductRespDTO> matchDiscountProductList = getMatchDiscountProductList(skuIds); | 127 | + List<DiscountProductDO> matchDiscountProductList = discountProductMapper.selectListBySkuIds( |
| 128 | + convertSet(list, DiscountProductDO::getSkuId)); | ||
| 135 | if (id != null) { // 排除自己这个活动 | 129 | if (id != null) { // 排除自己这个活动 |
| 136 | matchDiscountProductList.removeIf(product -> id.equals(product.getActivityId())); | 130 | matchDiscountProductList.removeIf(product -> id.equals(product.getActivityId())); |
| 137 | } | 131 | } |
| @@ -150,7 +144,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -150,7 +144,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 150 | } | 144 | } |
| 151 | 145 | ||
| 152 | // 更新 | 146 | // 更新 |
| 153 | - DiscountActivityDO updateObj = new DiscountActivityDO().setId(id).setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); | 147 | + DiscountActivityDO updateObj = new DiscountActivityDO().setId(id).setStatus(CommonStatusEnum.DISABLE.getStatus()); |
| 154 | discountActivityMapper.updateById(updateObj); | 148 | discountActivityMapper.updateById(updateObj); |
| 155 | } | 149 | } |
| 156 | 150 |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityService.java
| @@ -64,15 +64,6 @@ public interface RewardActivityService { | @@ -64,15 +64,6 @@ public interface RewardActivityService { | ||
| 64 | PageResult<RewardActivityDO> getRewardActivityPage(RewardActivityPageReqVO pageReqVO); | 64 | PageResult<RewardActivityDO> getRewardActivityPage(RewardActivityPageReqVO pageReqVO); |
| 65 | 65 | ||
| 66 | /** | 66 | /** |
| 67 | - * 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动 | ||
| 68 | - * | ||
| 69 | - * @param status 状态 | ||
| 70 | - * @param dateTime 当前日期时间 | ||
| 71 | - * @return 满减送活动列表 | ||
| 72 | - */ | ||
| 73 | - List<RewardActivityDO> getRewardActivityListByStatusAndDateTimeLt(Integer status, LocalDateTime dateTime); | ||
| 74 | - | ||
| 75 | - /** | ||
| 76 | * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 | 67 | * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 |
| 77 | * | 68 | * |
| 78 | * @param spuIds SPU 编号数组 | 69 | * @param spuIds SPU 编号数组 |
| @@ -80,6 +71,8 @@ public interface RewardActivityService { | @@ -80,6 +71,8 @@ public interface RewardActivityService { | ||
| 80 | * @param dateTime 当前日期时间 | 71 | * @param dateTime 当前日期时间 |
| 81 | * @return 满减送活动列表 | 72 | * @return 满减送活动列表 |
| 82 | */ | 73 | */ |
| 83 | - List<RewardActivityDO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime); | 74 | + List<RewardActivityDO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, |
| 75 | + Integer status, | ||
| 76 | + LocalDateTime dateTime); | ||
| 84 | 77 | ||
| 85 | } | 78 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImpl.java
| @@ -12,22 +12,15 @@ import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivi | @@ -12,22 +12,15 @@ import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivi | ||
| 12 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; | 12 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; |
| 13 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; | 13 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; |
| 14 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; | 14 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; |
| 15 | -import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert; | ||
| 16 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | 15 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; |
| 17 | import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; | 16 | import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; |
| 18 | -import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; | ||
| 19 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | 17 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| 20 | -import cn.iocoder.yudao.module.promotion.util.PromotionUtils; | ||
| 21 | import jakarta.annotation.Resource; | 18 | import jakarta.annotation.Resource; |
| 22 | import org.springframework.stereotype.Service; | 19 | import org.springframework.stereotype.Service; |
| 23 | import org.springframework.validation.annotation.Validated; | 20 | import org.springframework.validation.annotation.Validated; |
| 24 | 21 | ||
| 25 | import java.time.LocalDateTime; | 22 | import java.time.LocalDateTime; |
| 26 | -import java.util.Collection; | ||
| 27 | -import java.util.Collections; | ||
| 28 | -import java.util.List; | ||
| 29 | -import java.util.Objects; | ||
| 30 | -import java.util.stream.Collectors; | 23 | +import java.util.*; |
| 31 | 24 | ||
| 32 | import static cn.hutool.core.collection.CollUtil.intersectionDistinct; | 25 | import static cn.hutool.core.collection.CollUtil.intersectionDistinct; |
| 33 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 26 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| @@ -59,12 +52,8 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -59,12 +52,8 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 59 | validateRewardActivitySpuConflicts(null, createReqVO); | 52 | validateRewardActivitySpuConflicts(null, createReqVO); |
| 60 | 53 | ||
| 61 | // 插入 | 54 | // 插入 |
| 62 | - RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO) | ||
| 63 | - .setStatus( | ||
| 64 | - PromotionUtils.calculateActivityStatus(createReqVO.getEndTime()).equals(CommonStatusEnum.DISABLE.getStatus())? | ||
| 65 | - PromotionActivityStatusEnum.WAIT.getStatus(): | ||
| 66 | - PromotionActivityStatusEnum.RUN.getStatus() | ||
| 67 | - ); | 55 | + RewardActivityDO rewardActivity = BeanUtils.toBean(createReqVO, RewardActivityDO.class) |
| 56 | + .setStatus(CommonStatusEnum.ENABLE.getStatus()); | ||
| 68 | rewardActivityMapper.insert(rewardActivity); | 57 | rewardActivityMapper.insert(rewardActivity); |
| 69 | // 返回 | 58 | // 返回 |
| 70 | return rewardActivity.getId(); | 59 | return rewardActivity.getId(); |
| @@ -83,8 +72,7 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -83,8 +72,7 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 83 | validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO); | 72 | validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO); |
| 84 | 73 | ||
| 85 | // 2. 更新 | 74 | // 2. 更新 |
| 86 | - RewardActivityDO updateObj = BeanUtils.toBean(updateReqVO, RewardActivityDO.class) | ||
| 87 | - .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime())); | 75 | + RewardActivityDO updateObj = BeanUtils.toBean(updateReqVO, RewardActivityDO.class); |
| 88 | rewardActivityMapper.updateById(updateObj); | 76 | rewardActivityMapper.updateById(updateObj); |
| 89 | } | 77 | } |
| 90 | 78 | ||
| @@ -205,23 +193,16 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -205,23 +193,16 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 205 | } | 193 | } |
| 206 | 194 | ||
| 207 | @Override | 195 | @Override |
| 208 | - public List<RewardActivityDO> getRewardActivityListByStatusAndDateTimeLt(Integer status, LocalDateTime dateTime) { | ||
| 209 | - return rewardActivityMapper.selectListByStatusAndDateTimeLt(status, dateTime); | ||
| 210 | - } | ||
| 211 | - | ||
| 212 | - @Override | ||
| 213 | public List<RewardActivityDO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) { | 196 | public List<RewardActivityDO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) { |
| 214 | - List<ProductSpuRespDTO> spuList = productSpuApi.validateSpuList(spuIds); | ||
| 215 | - //查询出商品的分类ids | ||
| 216 | - List<Long> categoryIds = spuList.stream().map(ProductSpuRespDTO::getCategoryId).collect(Collectors.toList()); | ||
| 217 | - // 1. 查询出指定 spuId 的 spu 参加的活动 | ||
| 218 | - List<RewardActivityDO> rewardActivityList = rewardActivityMapper.getRewardActivityByStatusAndDateTimeLt(spuIds, categoryIds,status,dateTime); | ||
| 219 | - if (CollUtil.isEmpty(rewardActivityList)) { | 197 | + // 1. 查询商品分类 |
| 198 | + List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(spuIds); | ||
| 199 | + if (CollUtil.isEmpty(spuList)) { | ||
| 220 | return Collections.emptyList(); | 200 | return Collections.emptyList(); |
| 221 | } | 201 | } |
| 202 | + Set<Long> categoryIds = convertSet(spuList, ProductSpuRespDTO::getCategoryId); | ||
| 222 | 203 | ||
| 223 | - // 2. 查询活动详情 | ||
| 224 | - return rewardActivityList; | 204 | + // 2. 查询出指定 spuId 的 spu 参加的活动 |
| 205 | + return rewardActivityMapper.selectListByStatusAndDateTimeLt(spuIds, categoryIds, status, dateTime); | ||
| 225 | } | 206 | } |
| 226 | 207 | ||
| 227 | } | 208 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityServiceImpl.java
| @@ -23,12 +23,11 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillConfigDO; | @@ -23,12 +23,11 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillConfigDO; | ||
| 23 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO; | 23 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO; |
| 24 | import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; | 24 | import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; |
| 25 | import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper; | 25 | import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper; |
| 26 | -import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig.SeckillConfigMapper; | 26 | +import jakarta.annotation.Resource; |
| 27 | import org.springframework.stereotype.Service; | 27 | import org.springframework.stereotype.Service; |
| 28 | import org.springframework.transaction.annotation.Transactional; | 28 | import org.springframework.transaction.annotation.Transactional; |
| 29 | import org.springframework.validation.annotation.Validated; | 29 | import org.springframework.validation.annotation.Validated; |
| 30 | 30 | ||
| 31 | -import jakarta.annotation.Resource; | ||
| 32 | import java.time.LocalDateTime; | 31 | import java.time.LocalDateTime; |
| 33 | import java.util.Collection; | 32 | import java.util.Collection; |
| 34 | import java.util.Collections; | 33 | import java.util.Collections; |
| @@ -58,8 +57,6 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | @@ -58,8 +57,6 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | ||
| 58 | @Resource | 57 | @Resource |
| 59 | private SeckillProductMapper seckillProductMapper; | 58 | private SeckillProductMapper seckillProductMapper; |
| 60 | @Resource | 59 | @Resource |
| 61 | - private SeckillConfigMapper seckillConfigMapper; | ||
| 62 | - @Resource | ||
| 63 | private SeckillConfigService seckillConfigService; | 60 | private SeckillConfigService seckillConfigService; |
| 64 | @Resource | 61 | @Resource |
| 65 | private ProductSpuApi productSpuApi; | 62 | private ProductSpuApi productSpuApi; |
| @@ -279,7 +276,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | @@ -279,7 +276,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | ||
| 279 | } | 276 | } |
| 280 | 277 | ||
| 281 | @Override | 278 | @Override |
| 282 | - public List<SeckillProductDO> getSeckillProductListByActivityId(Collection<Long> activityIds) { | 279 | + public List<SeckillProductDO> getSeckillProductListByActivityIds(Collection<Long> activityIds) { |
| 283 | return seckillProductMapper.selectListByActivityId(activityIds); | 280 | return seckillProductMapper.selectListByActivityId(activityIds); |
| 284 | } | 281 | } |
| 285 | 282 | ||
| @@ -292,7 +289,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | @@ -292,7 +289,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | ||
| 292 | 289 | ||
| 293 | @Override | 290 | @Override |
| 294 | public PageResult<SeckillActivityDO> getSeckillActivityAppPageByConfigId(AppSeckillActivityPageReqVO pageReqVO) { | 291 | public PageResult<SeckillActivityDO> getSeckillActivityAppPageByConfigId(AppSeckillActivityPageReqVO pageReqVO) { |
| 295 | - return seckillActivityMapper.selectPage(pageReqVO, CommonStatusEnum.ENABLE.getStatus(),LocalDateTime.now()); | 292 | + return seckillActivityMapper.selectPage(pageReqVO, CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now()); |
| 296 | } | 293 | } |
| 297 | 294 | ||
| 298 | @Override | 295 | @Override |
| @@ -339,4 +336,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | @@ -339,4 +336,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | ||
| 339 | convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime); | 336 | convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime); |
| 340 | } | 337 | } |
| 341 | 338 | ||
| 339 | + @Override | ||
| 340 | + public List<SeckillActivityDO> getSeckillActivityListByIds(Collection<Long> ids) { | ||
| 341 | + return List.of(); | ||
| 342 | + } | ||
| 343 | + | ||
| 342 | } | 344 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/util/PromotionUtils.java deleted
| 1 | -package cn.iocoder.yudao.module.promotion.util; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | -import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; | ||
| 5 | - | ||
| 6 | -import java.time.LocalDateTime; | ||
| 7 | - | ||
| 8 | -/** | ||
| 9 | - * 活动工具类 | ||
| 10 | - * | ||
| 11 | - * @author 芋道源码 | ||
| 12 | - */ | ||
| 13 | -public class PromotionUtils { | ||
| 14 | - | ||
| 15 | - /** | ||
| 16 | - * 根据时间,计算活动状态 | ||
| 17 | - * | ||
| 18 | - * @param endTime 结束时间 | ||
| 19 | - * @return 活动状态 | ||
| 20 | - */ | ||
| 21 | - public static Integer calculateActivityStatus(LocalDateTime endTime) { | ||
| 22 | - return LocalDateTimeUtils.beforeNow(endTime) ? CommonStatusEnum.DISABLE.getStatus() : CommonStatusEnum.ENABLE.getStatus(); | ||
| 23 | - } | ||
| 24 | - | ||
| 25 | -} |
yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/discount/DiscountProductMapper.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.promotion.dal.mysql.discount.DiscountProductMapper"> | ||
| 4 | - | ||
| 5 | - | ||
| 6 | - <select id="getMatchDiscountProductList" resultType="cn.iocoder.yudao.module.promotion.api.discount.dto.DiscountProductRespDTO"> | ||
| 7 | - SELECT pdp.*,pda.name as activity_name | ||
| 8 | - FROM promotion_discount_product pdp | ||
| 9 | - LEFT JOIN promotion_discount_activity pda | ||
| 10 | - ON pdp.activity_id = pda.id | ||
| 11 | - <where> | ||
| 12 | - <if test="skuIds != null and skuIds.size > 0"> | ||
| 13 | - AND pdp.sku_id in | ||
| 14 | - <foreach collection="skuIds" item="skuId" index="index" open="(" close=")" separator=","> | ||
| 15 | - #{skuId} | ||
| 16 | - </foreach> | ||
| 17 | - </if> | ||
| 18 | - AND pda.start_time <= CURRENT_TIME AND pda.end_time >= CURRENT_TIME | ||
| 19 | - AND pda.`status` = 0 | ||
| 20 | - AND pda.deleted =0 | ||
| 21 | - AND pdp.deleted = 0 | ||
| 22 | - </where> | ||
| 23 | - ORDER BY pdp.id DESC | ||
| 24 | - </select> | ||
| 25 | - | ||
| 26 | -</mapper> |
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImplTest.java
| @@ -18,15 +18,8 @@ import org.mockito.InjectMocks; | @@ -18,15 +18,8 @@ import org.mockito.InjectMocks; | ||
| 18 | import org.mockito.Mock; | 18 | import org.mockito.Mock; |
| 19 | 19 | ||
| 20 | import java.time.Duration; | 20 | import java.time.Duration; |
| 21 | -import java.time.LocalDateTime; | ||
| 22 | -import java.util.ArrayList; | ||
| 23 | -import java.util.Collection; | ||
| 24 | -import java.util.List; | ||
| 25 | -import java.util.Set; | ||
| 26 | 21 | ||
| 27 | -import static cn.hutool.core.collection.CollUtil.intersectionDistinct; | ||
| 28 | import static cn.hutool.core.util.RandomUtil.randomEle; | 22 | import static cn.hutool.core.util.RandomUtil.randomEle; |
| 29 | -import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet; | ||
| 30 | import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime; | 23 | import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime; |
| 31 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; | 24 | import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; |
| 32 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | 25 | import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; |
| @@ -34,8 +27,6 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic | @@ -34,8 +27,6 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic | ||
| 34 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | 27 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; |
| 35 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 28 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| 36 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS; | 29 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS; |
| 37 | -import static com.google.common.primitives.Longs.asList; | ||
| 38 | -import static java.util.Collections.singletonList; | ||
| 39 | import static org.junit.jupiter.api.Assertions.*; | 30 | import static org.junit.jupiter.api.Assertions.*; |
| 40 | 31 | ||
| 41 | /** | 32 | /** |
| @@ -176,90 +167,91 @@ public class RewardActivityServiceImplTest extends BaseMockitoUnitTest { | @@ -176,90 +167,91 @@ public class RewardActivityServiceImplTest extends BaseMockitoUnitTest { | ||
| 176 | assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules"); | 167 | assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules"); |
| 177 | } | 168 | } |
| 178 | 169 | ||
| 179 | - @Test | ||
| 180 | - public void testGetRewardActivities_all() { | ||
| 181 | - LocalDateTime now = LocalDateTime.now(); | ||
| 182 | - // mock 数据 | ||
| 183 | - RewardActivityDO allActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) | ||
| 184 | - .setProductScope(PromotionProductScopeEnum.ALL.getScope()).setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); | ||
| 185 | - rewardActivityMapper.insert(allActivity); | ||
| 186 | - RewardActivityDO productActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) | ||
| 187 | - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L)) | ||
| 188 | - .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); | ||
| 189 | - rewardActivityMapper.insert(productActivity); | ||
| 190 | - // 准备参数 | ||
| 191 | - Set<Long> spuIds = asSet(1L, 2L); | ||
| 192 | - | ||
| 193 | - // 调用 | ||
| 194 | - List<RewardActivityDO> activityList = rewardActivityServiceImpl.getRewardActivityListByStatusAndDateTimeLt( | ||
| 195 | - CommonStatusEnum.ENABLE.getStatus(), now); | ||
| 196 | - List<RewardActivityDO> matchRewardActivityList = filterMatchActivity(spuIds, activityList); | ||
| 197 | - // 断言 | ||
| 198 | - assertEquals(matchRewardActivityList.size(), 1); | ||
| 199 | - matchRewardActivityList.forEach((activity) -> { | ||
| 200 | - if (activity.getId().equals(productActivity.getId())) { | ||
| 201 | - assertPojoEquals(activity, productActivity); | ||
| 202 | - assertEquals(activity.getProductScopeValues(), asList(1L, 2L)); | ||
| 203 | - } else { | ||
| 204 | - fail(); | ||
| 205 | - } | ||
| 206 | - }); | ||
| 207 | - } | ||
| 208 | - | ||
| 209 | - @Test | ||
| 210 | - public void testGetRewardActivities_product() { | ||
| 211 | - LocalDateTime now = LocalDateTime.now(); | ||
| 212 | - // mock 数据 | ||
| 213 | - RewardActivityDO productActivity01 = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) | ||
| 214 | - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L)) | ||
| 215 | - .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); | ||
| 216 | - rewardActivityMapper.insert(productActivity01); | ||
| 217 | - RewardActivityDO productActivity02 = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) | ||
| 218 | - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(singletonList(3L)) | ||
| 219 | - .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); | ||
| 220 | - rewardActivityMapper.insert(productActivity02); | ||
| 221 | - // 准备参数 | ||
| 222 | - Set<Long> spuIds = asSet(1L, 2L, 3L); | ||
| 223 | - | ||
| 224 | - List<RewardActivityDO> activityList = rewardActivityServiceImpl.getRewardActivityListByStatusAndDateTimeLt( | ||
| 225 | - CommonStatusEnum.ENABLE.getStatus(), now); | ||
| 226 | - List<RewardActivityDO> matchRewardActivityList = filterMatchActivity(spuIds, activityList); | ||
| 227 | - // 断言 | ||
| 228 | - assertEquals(matchRewardActivityList.size(), 2); | ||
| 229 | - matchRewardActivityList.forEach((activity) -> { | ||
| 230 | - if (activity.getId().equals(productActivity01.getId())) { | ||
| 231 | - assertPojoEquals(activity, productActivity01); | ||
| 232 | - assertEquals(activity.getProductScopeValues(), asList(1L, 2L)); | ||
| 233 | - } else if (activity.getId().equals(productActivity02.getId())) { | ||
| 234 | - assertPojoEquals(activity, productActivity02); | ||
| 235 | - assertEquals(activity.getProductScopeValues(), singletonList(3L)); | ||
| 236 | - } else { | ||
| 237 | - fail(); | ||
| 238 | - } | ||
| 239 | - }); | ||
| 240 | - } | ||
| 241 | - | ||
| 242 | - /** | ||
| 243 | - * 获得满减送的订单项(商品)列表 | ||
| 244 | - * | ||
| 245 | - * @param spuIds 商品编号 | ||
| 246 | - * @param activityList 活动列表 | ||
| 247 | - * @return 订单项(商品)列表 | ||
| 248 | - */ | ||
| 249 | - private List<RewardActivityDO> filterMatchActivity(Collection<Long> spuIds, List<RewardActivityDO> activityList) { | ||
| 250 | - List<RewardActivityDO> resultActivityList = new ArrayList<>(); | ||
| 251 | - for (RewardActivityDO activity : activityList) { | ||
| 252 | - // 情况一:全部商品都可以参与 | ||
| 253 | - if (PromotionProductScopeEnum.isAll(activity.getProductScope())) { | ||
| 254 | - resultActivityList.add(activity); | ||
| 255 | - } | ||
| 256 | - // 情况二:指定商品参与 | ||
| 257 | - if (PromotionProductScopeEnum.isSpu(activity.getProductScope()) && | ||
| 258 | - !intersectionDistinct(activity.getProductScopeValues(), spuIds).isEmpty()) { | ||
| 259 | - resultActivityList.add(activity); | ||
| 260 | - } | ||
| 261 | - } | ||
| 262 | - return resultActivityList; | ||
| 263 | - } | 170 | + // TODO 芋艿:后续完善单测 |
| 171 | +// @Test | ||
| 172 | +// public void testGetRewardActivities_all() { | ||
| 173 | +// LocalDateTime now = LocalDateTime.now(); | ||
| 174 | +// // mock 数据 | ||
| 175 | +// RewardActivityDO allActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) | ||
| 176 | +// .setProductScope(PromotionProductScopeEnum.ALL.getScope()).setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); | ||
| 177 | +// rewardActivityMapper.insert(allActivity); | ||
| 178 | +// RewardActivityDO productActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) | ||
| 179 | +// .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L)) | ||
| 180 | +// .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); | ||
| 181 | +// rewardActivityMapper.insert(productActivity); | ||
| 182 | +// // 准备参数 | ||
| 183 | +// Set<Long> spuIds = asSet(1L, 2L); | ||
| 184 | +// | ||
| 185 | +// // 调用 | ||
| 186 | +// List<RewardActivityDO> activityList = rewardActivityServiceImpl.getRewardActivityListByStatusAndDateTimeLt( | ||
| 187 | +// CommonStatusEnum.ENABLE.getStatus(), now); | ||
| 188 | +// List<RewardActivityDO> matchRewardActivityList = filterMatchActivity(spuIds, activityList); | ||
| 189 | +// // 断言 | ||
| 190 | +// assertEquals(matchRewardActivityList.size(), 1); | ||
| 191 | +// matchRewardActivityList.forEach((activity) -> { | ||
| 192 | +// if (activity.getId().equals(productActivity.getId())) { | ||
| 193 | +// assertPojoEquals(activity, productActivity); | ||
| 194 | +// assertEquals(activity.getProductScopeValues(), asList(1L, 2L)); | ||
| 195 | +// } else { | ||
| 196 | +// fail(); | ||
| 197 | +// } | ||
| 198 | +// }); | ||
| 199 | +// } | ||
| 200 | +// | ||
| 201 | +// @Test | ||
| 202 | +// public void testGetRewardActivities_product() { | ||
| 203 | +// LocalDateTime now = LocalDateTime.now(); | ||
| 204 | +// // mock 数据 | ||
| 205 | +// RewardActivityDO productActivity01 = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) | ||
| 206 | +// .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L)) | ||
| 207 | +// .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); | ||
| 208 | +// rewardActivityMapper.insert(productActivity01); | ||
| 209 | +// RewardActivityDO productActivity02 = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) | ||
| 210 | +// .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(singletonList(3L)) | ||
| 211 | +// .setStartTime(now.minusDays(1)).setEndTime(now.plusDays(1))); | ||
| 212 | +// rewardActivityMapper.insert(productActivity02); | ||
| 213 | +// // 准备参数 | ||
| 214 | +// Set<Long> spuIds = asSet(1L, 2L, 3L); | ||
| 215 | +// | ||
| 216 | +// List<RewardActivityDO> activityList = rewardActivityServiceImpl.getRewardActivityListByStatusAndDateTimeLt( | ||
| 217 | +// CommonStatusEnum.ENABLE.getStatus(), now); | ||
| 218 | +// List<RewardActivityDO> matchRewardActivityList = filterMatchActivity(spuIds, activityList); | ||
| 219 | +// // 断言 | ||
| 220 | +// assertEquals(matchRewardActivityList.size(), 2); | ||
| 221 | +// matchRewardActivityList.forEach((activity) -> { | ||
| 222 | +// if (activity.getId().equals(productActivity01.getId())) { | ||
| 223 | +// assertPojoEquals(activity, productActivity01); | ||
| 224 | +// assertEquals(activity.getProductScopeValues(), asList(1L, 2L)); | ||
| 225 | +// } else if (activity.getId().equals(productActivity02.getId())) { | ||
| 226 | +// assertPojoEquals(activity, productActivity02); | ||
| 227 | +// assertEquals(activity.getProductScopeValues(), singletonList(3L)); | ||
| 228 | +// } else { | ||
| 229 | +// fail(); | ||
| 230 | +// } | ||
| 231 | +// }); | ||
| 232 | +// } | ||
| 233 | +// | ||
| 234 | +// /** | ||
| 235 | +// * 获得满减送的订单项(商品)列表 | ||
| 236 | +// * | ||
| 237 | +// * @param spuIds 商品编号 | ||
| 238 | +// * @param activityList 活动列表 | ||
| 239 | +// * @return 订单项(商品)列表 | ||
| 240 | +// */ | ||
| 241 | +// private List<RewardActivityDO> filterMatchActivity(Collection<Long> spuIds, List<RewardActivityDO> activityList) { | ||
| 242 | +// List<RewardActivityDO> resultActivityList = new ArrayList<>(); | ||
| 243 | +// for (RewardActivityDO activity : activityList) { | ||
| 244 | +// // 情况一:全部商品都可以参与 | ||
| 245 | +// if (PromotionProductScopeEnum.isAll(activity.getProductScope())) { | ||
| 246 | +// resultActivityList.add(activity); | ||
| 247 | +// } | ||
| 248 | +// // 情况二:指定商品参与 | ||
| 249 | +// if (PromotionProductScopeEnum.isSpu(activity.getProductScope()) && | ||
| 250 | +// !intersectionDistinct(activity.getProductScopeValues(), spuIds).isEmpty()) { | ||
| 251 | +// resultActivityList.add(activity); | ||
| 252 | +// } | ||
| 253 | +// } | ||
| 254 | +// return resultActivityList; | ||
| 255 | +// } | ||
| 264 | 256 | ||
| 265 | } | 257 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
| @@ -44,11 +44,9 @@ import org.springframework.web.bind.annotation.*; | @@ -44,11 +44,9 @@ import org.springframework.web.bind.annotation.*; | ||
| 44 | import java.time.LocalDateTime; | 44 | import java.time.LocalDateTime; |
| 45 | import java.util.*; | 45 | import java.util.*; |
| 46 | 46 | ||
| 47 | -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 48 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 47 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 49 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 48 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 50 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | 49 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 51 | -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.DISCOUNT_ACTIVITY_TYPE_NOT_EXISTS; | ||
| 52 | 50 | ||
| 53 | @Tag(name = "用户 App - 交易订单") | 51 | @Tag(name = "用户 App - 交易订单") |
| 54 | @RestController | 52 | @RestController |
| @@ -314,7 +312,7 @@ public class AppTradeOrderController { | @@ -314,7 +312,7 @@ public class AppTradeOrderController { | ||
| 314 | Integer newPrice = price * discountProductRespDTO.getDiscountPercent() / 100; | 312 | Integer newPrice = price * discountProductRespDTO.getDiscountPercent() / 100; |
| 315 | sku.setPrice(price - newPrice); | 313 | sku.setPrice(price - newPrice); |
| 316 | }else{ | 314 | }else{ |
| 317 | - throw exception(DISCOUNT_ACTIVITY_TYPE_NOT_EXISTS); | 315 | + throw new IllegalArgumentException("限时折扣活动类型不存在"); |
| 318 | } | 316 | } |
| 319 | return sku; | 317 | return sku; |
| 320 | } | 318 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/AfterSaleConvert.java
| @@ -43,9 +43,10 @@ public interface AfterSaleConvert { | @@ -43,9 +43,10 @@ public interface AfterSaleConvert { | ||
| 43 | @Mapping(source = "afterSale.orderId", target = "merchantOrderId"), | 43 | @Mapping(source = "afterSale.orderId", target = "merchantOrderId"), |
| 44 | @Mapping(source = "afterSale.id", target = "merchantRefundId"), | 44 | @Mapping(source = "afterSale.id", target = "merchantRefundId"), |
| 45 | @Mapping(source = "afterSale.applyReason", target = "reason"), | 45 | @Mapping(source = "afterSale.applyReason", target = "reason"), |
| 46 | - @Mapping(source = "afterSale.refundPrice", target = "price") | 46 | + @Mapping(source = "afterSale.refundPrice", target = "price"), |
| 47 | + @Mapping(source = "orderProperties.payAppKey", target = "appKey") | ||
| 47 | }) | 48 | }) |
| 48 | - PayRefundCreateReqDTO convert(String userIp, AfterSaleDO afterSale); | 49 | + PayRefundCreateReqDTO convert(String userIp, AfterSaleDO afterSale, TradeOrderProperties orderProperties); |
| 49 | 50 | ||
| 50 | MemberUserRespVO convert(MemberUserRespDTO bean); | 51 | MemberUserRespVO convert(MemberUserRespDTO bean); |
| 51 | 52 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java
| @@ -385,9 +385,8 @@ public class AfterSaleServiceImpl implements AfterSaleService { | @@ -385,9 +385,8 @@ public class AfterSaleServiceImpl implements AfterSaleService { | ||
| 385 | @Override | 385 | @Override |
| 386 | public void afterCommit() { | 386 | public void afterCommit() { |
| 387 | // 创建退款单 | 387 | // 创建退款单 |
| 388 | - PayRefundCreateReqDTO createReqDTO = AfterSaleConvert.INSTANCE.convert(userIp, afterSale) | ||
| 389 | - .setReason(StrUtil.format("退款【{}】", afterSale.getSpuName())); | ||
| 390 | - createReqDTO.setAppKey(tradeOrderProperties.getPayAppKey()); | 388 | + PayRefundCreateReqDTO createReqDTO = AfterSaleConvert.INSTANCE.convert(userIp, afterSale, tradeOrderProperties) |
| 389 | + .setReason(StrUtil.format("退款【{}】", afterSale.getSpuName()));; | ||
| 391 | Long payRefundId = payRefundApi.createRefund(createReqDTO); | 390 | Long payRefundId = payRefundApi.createRefund(createReqDTO); |
| 392 | // 更新售后单的退款单号 | 391 | // 更新售后单的退款单号 |
| 393 | tradeAfterSaleMapper.updateById(new AfterSaleDO().setId(afterSale.getId()).setPayRefundId(payRefundId)); | 392 | tradeAfterSaleMapper.updateById(new AfterSaleDO().setId(afterSale.getId()).setPayRefundId(payRefundId)); |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/bo/TradePriceCalculateRespBO.java
| @@ -73,11 +73,10 @@ public class TradePriceCalculateRespBO { | @@ -73,11 +73,10 @@ public class TradePriceCalculateRespBO { | ||
| 73 | */ | 73 | */ |
| 74 | private Long bargainActivityId; | 74 | private Long bargainActivityId; |
| 75 | 75 | ||
| 76 | - | ||
| 77 | /** | 76 | /** |
| 78 | * 是否包邮 | 77 | * 是否包邮 |
| 79 | */ | 78 | */ |
| 80 | - private Boolean freeDelivery = false; | 79 | + private Boolean freeDelivery; |
| 81 | 80 | ||
| 82 | /** | 81 | /** |
| 83 | * 赠送的优惠劵 | 82 | * 赠送的优惠劵 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java
| @@ -121,13 +121,11 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { | @@ -121,13 +121,11 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator { | ||
| 121 | * @return 是否包邮 | 121 | * @return 是否包邮 |
| 122 | */ | 122 | */ |
| 123 | private boolean isGlobalExpressFree(TradePriceCalculateRespBO result) { | 123 | private boolean isGlobalExpressFree(TradePriceCalculateRespBO result) { |
| 124 | - | ||
| 125 | TradeConfigDO config = tradeConfigService.getTradeConfig(); | 124 | TradeConfigDO config = tradeConfigService.getTradeConfig(); |
| 126 | - return result.getFreeDelivery() || | ||
| 127 | - (config != null | ||
| 128 | - && Boolean.TRUE.equals(config.getDeliveryExpressFreeEnabled()) // 开启包邮 | ||
| 129 | - && result.getPrice().getPayPrice() >= config.getDeliveryExpressFreePrice() | ||
| 130 | - ); // 满足包邮的价格 | 125 | + return config == null |
| 126 | + || Boolean.TRUE.equals(config.getDeliveryExpressFreeEnabled()) // 开启包邮 | ||
| 127 | + || result.getFreeDelivery() //满减包邮 | ||
| 128 | + || result.getPrice().getPayPrice() >= config.getDeliveryExpressFreePrice(); // 满足包邮的价格 | ||
| 131 | } | 129 | } |
| 132 | 130 | ||
| 133 | private void calculateDeliveryPrice(List<OrderItem> selectedSkus, | 131 | private void calculateDeliveryPrice(List<OrderItem> selectedSkus, |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeDiscountActivityPriceCalculator.java
| 1 | package cn.iocoder.yudao.module.trade.service.price.calculator; | 1 | package cn.iocoder.yudao.module.trade.service.price.calculator; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.collection.CollUtil; | ||
| 4 | import cn.hutool.core.util.ObjectUtil; | 3 | import cn.hutool.core.util.ObjectUtil; |
| 5 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | +import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; | ||
| 6 | import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | 6 | import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; |
| 7 | import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; | 7 | import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; |
| 8 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | 8 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; |
| @@ -14,12 +14,10 @@ import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | @@ -14,12 +14,10 @@ import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | ||
| 14 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | 14 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; |
| 15 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; | 15 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; |
| 16 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | 16 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; |
| 17 | +import jakarta.annotation.Resource; | ||
| 17 | import org.springframework.core.annotation.Order; | 18 | import org.springframework.core.annotation.Order; |
| 18 | import org.springframework.stereotype.Component; | 19 | import org.springframework.stereotype.Component; |
| 19 | 20 | ||
| 20 | -import jakarta.annotation.Resource; | ||
| 21 | - | ||
| 22 | -import java.math.BigDecimal; | ||
| 23 | import java.util.List; | 21 | import java.util.List; |
| 24 | import java.util.Map; | 22 | import java.util.Map; |
| 25 | 23 | ||
| @@ -30,6 +28,8 @@ import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceC | @@ -30,6 +28,8 @@ import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceC | ||
| 30 | /** | 28 | /** |
| 31 | * 限时折扣的 {@link TradePriceCalculator} 实现类 | 29 | * 限时折扣的 {@link TradePriceCalculator} 实现类 |
| 32 | * | 30 | * |
| 31 | + * 由于“会员折扣”和“限时折扣”是冲突,需要选择优惠金额多的,所以也放在这里计算 | ||
| 32 | + * | ||
| 33 | * @author 芋道源码 | 33 | * @author 芋道源码 |
| 34 | */ | 34 | */ |
| 35 | @Component | 35 | @Component |
| @@ -50,132 +50,89 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato | @@ -50,132 +50,89 @@ public class TradeDiscountActivityPriceCalculator implements TradePriceCalculato | ||
| 50 | return; | 50 | return; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | - boolean discount; | ||
| 54 | - boolean vip; | ||
| 55 | - | ||
| 56 | - //----------------------------------限时折扣计算----------------------------------------- | ||
| 57 | - // 获得 SKU 对应的限时折扣活动 | 53 | + // 1.1 获得 SKU 对应的限时折扣活动 |
| 58 | List<DiscountProductRespDTO> discountProducts = discountActivityApi.getMatchDiscountProductList( | 54 | List<DiscountProductRespDTO> discountProducts = discountActivityApi.getMatchDiscountProductList( |
| 59 | convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId)); | 55 | convertSet(result.getItems(), TradePriceCalculateRespBO.OrderItem::getSkuId)); |
| 60 | - if (CollUtil.isEmpty(discountProducts)) { | ||
| 61 | - discount = false; | ||
| 62 | - }else { | ||
| 63 | - discount = true; | ||
| 64 | - } | ||
| 65 | Map<Long, DiscountProductRespDTO> discountProductMap = convertMap(discountProducts, DiscountProductRespDTO::getSkuId); | 56 | Map<Long, DiscountProductRespDTO> discountProductMap = convertMap(discountProducts, DiscountProductRespDTO::getSkuId); |
| 66 | - | ||
| 67 | - | ||
| 68 | - | ||
| 69 | - //----------------------------------会员计算----------------------------------------- | ||
| 70 | - MemberLevelRespDTO level; | ||
| 71 | - // 获得用户的会员等级 | 57 | + // 1.2 获得会员等级 |
| 72 | MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); | 58 | MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); |
| 73 | - if (user.getLevelId() != null && user.getLevelId() > 0) { | ||
| 74 | - level = memberLevelApi.getMemberLevel(user.getLevelId()); | ||
| 75 | - if (level != null && level.getDiscountPercent() != null) { | ||
| 76 | - vip = true; | ||
| 77 | - }else { | ||
| 78 | - vip = false; | ||
| 79 | - } | ||
| 80 | - }else { | ||
| 81 | - level = null; | ||
| 82 | - vip = false; | ||
| 83 | - } | ||
| 84 | - | 59 | + MemberLevelRespDTO level = user != null && user.getLevelId() > 0 ? memberLevelApi.getMemberLevel(user.getLevelId()) : null; |
| 85 | 60 | ||
| 86 | // 2. 计算每个 SKU 的优惠金额 | 61 | // 2. 计算每个 SKU 的优惠金额 |
| 87 | result.getItems().forEach(orderItem -> { | 62 | result.getItems().forEach(orderItem -> { |
| 88 | - | ||
| 89 | - //----------------------------------限时折扣计算----------------------------------------- | ||
| 90 | - DiscountProductRespDTO discountProduct = null; | ||
| 91 | - Integer newDiscountPrice = 0; | ||
| 92 | - if (discount){ | ||
| 93 | - // 2.1 计算限时折扣优惠信息 | ||
| 94 | - discountProduct = discountProductMap.get(orderItem.getSkuId()); | ||
| 95 | - if (discountProduct != null) { | ||
| 96 | - // 2.2 计算优惠金额 | ||
| 97 | - Integer newPayPrice = calculatePayPrice(discountProduct, orderItem); | ||
| 98 | - newDiscountPrice = orderItem.getPayPrice() - newPayPrice; | ||
| 99 | - } | 63 | + if (!orderItem.getSelected()) { |
| 64 | + return; | ||
| 100 | } | 65 | } |
| 101 | - | ||
| 102 | - | ||
| 103 | - //----------------------------------会员计算----------------------------------------- | ||
| 104 | - Integer vipPrice = 0; | ||
| 105 | - if (vip){ | ||
| 106 | - // 2.3 计算会员优惠金额 | ||
| 107 | - vipPrice = calculateVipPrice(orderItem.getPayPrice(), level.getDiscountPercent()); | 66 | + // 2.1 计算限时折扣的优惠金额 |
| 67 | + DiscountProductRespDTO discountProduct = discountProductMap.get(orderItem.getSkuId()); | ||
| 68 | + Integer discountPrice = calculateActivityPrice(discountProduct, orderItem); | ||
| 69 | + // 2.2 计算 VIP 优惠金额 | ||
| 70 | + Integer vipPrice = calculateVipPrice(level, orderItem); | ||
| 71 | + if (discountPrice <= 0 && vipPrice <= 0) { | ||
| 72 | + return; | ||
| 108 | } | 73 | } |
| 109 | 74 | ||
| 110 | - | ||
| 111 | - // 2.4 记录优惠明细 | ||
| 112 | - // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示 | ||
| 113 | - if (orderItem.getSelected()) { | ||
| 114 | - if (discount && vip){ | ||
| 115 | - if(newDiscountPrice > vipPrice){ | ||
| 116 | - TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||
| 117 | - discountProduct.getActivityId(), discountProduct.getActivityName(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType(), | ||
| 118 | - StrUtil.format("限时折扣:省 {} 元", formatPrice(newDiscountPrice)), | ||
| 119 | - newDiscountPrice); | ||
| 120 | - // 2.5 更新 SKU 优惠金额 | ||
| 121 | - orderItem.setDiscountPrice(orderItem.getDiscountPrice() + newDiscountPrice); | ||
| 122 | - }else{ | ||
| 123 | - TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||
| 124 | - level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(), | ||
| 125 | - String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)), | ||
| 126 | - vipPrice); | ||
| 127 | - // 2.5 更新 SKU 的优惠金额 | ||
| 128 | - orderItem.setVipPrice(vipPrice); | ||
| 129 | - } | ||
| 130 | - }else if (discount){ | ||
| 131 | - TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||
| 132 | - discountProduct.getActivityId(), discountProduct.getActivityName(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType(), | ||
| 133 | - StrUtil.format("限时折扣:省 {} 元", formatPrice(newDiscountPrice)), | ||
| 134 | - newDiscountPrice); | ||
| 135 | - // 2.5 更新 SKU 优惠金额 | ||
| 136 | - orderItem.setDiscountPrice(orderItem.getDiscountPrice() + newDiscountPrice); | ||
| 137 | - }else if (vip){ | ||
| 138 | - TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||
| 139 | - level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(), | ||
| 140 | - String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)), | ||
| 141 | - vipPrice); | ||
| 142 | - // 2.5 更新 SKU 的优惠金额 | ||
| 143 | - orderItem.setVipPrice(vipPrice); | ||
| 144 | - } | 75 | + // 3. 选择优惠金额多的 |
| 76 | + if (discountPrice > vipPrice) { | ||
| 77 | + TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||
| 78 | + discountProduct.getActivityId(), discountProduct.getActivityName(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType(), | ||
| 79 | + StrUtil.format("限时折扣:省 {} 元", formatPrice(discountPrice)), | ||
| 80 | + discountPrice); | ||
| 81 | + // 更新 SKU 优惠金额 | ||
| 82 | + orderItem.setDiscountPrice(orderItem.getDiscountPrice() + discountPrice); | ||
| 83 | + } else { | ||
| 84 | + assert level != null; | ||
| 85 | + TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||
| 86 | + level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(), | ||
| 87 | + String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)), | ||
| 88 | + vipPrice); | ||
| 89 | + // 更新 SKU 的优惠金额 | ||
| 90 | + orderItem.setVipPrice(vipPrice); | ||
| 145 | } | 91 | } |
| 146 | 92 | ||
| 93 | + // 4. 分摊优惠 | ||
| 147 | TradePriceCalculatorHelper.recountPayPrice(orderItem); | 94 | TradePriceCalculatorHelper.recountPayPrice(orderItem); |
| 95 | + TradePriceCalculatorHelper.recountAllPrice(result); | ||
| 148 | }); | 96 | }); |
| 149 | - TradePriceCalculatorHelper.recountAllPrice(result); | ||
| 150 | } | 97 | } |
| 151 | 98 | ||
| 152 | - private Integer calculatePayPrice(DiscountProductRespDTO discountProduct, | ||
| 153 | - TradePriceCalculateRespBO.OrderItem orderItem) { | ||
| 154 | - Integer price = orderItem.getPayPrice(); | ||
| 155 | - if (PromotionDiscountTypeEnum.PRICE.getType().equals(discountProduct.getDiscountType())) { // 减价 | ||
| 156 | - price -= discountProduct.getDiscountPrice() * orderItem.getCount(); | ||
| 157 | - } else if (PromotionDiscountTypeEnum.PERCENT.getType().equals(discountProduct.getDiscountType())) { // 打折 | ||
| 158 | - price = price * discountProduct.getDiscountPercent() / 100; | 99 | + /** |
| 100 | + * 计算优惠活动的价格 | ||
| 101 | + * | ||
| 102 | + * @param discount 优惠活动 | ||
| 103 | + * @param orderItem 交易项 | ||
| 104 | + * @return 优惠价格 | ||
| 105 | + */ | ||
| 106 | + private Integer calculateActivityPrice(DiscountProductRespDTO discount, | ||
| 107 | + TradePriceCalculateRespBO.OrderItem orderItem) { | ||
| 108 | + if (discount == null) { | ||
| 109 | + return 0; | ||
| 110 | + } | ||
| 111 | + Integer newPrice = orderItem.getPayPrice(); | ||
| 112 | + if (PromotionDiscountTypeEnum.PRICE.getType().equals(discount.getDiscountType())) { // 减价 | ||
| 113 | + newPrice -= discount.getDiscountPrice() * orderItem.getCount(); | ||
| 114 | + } else if (PromotionDiscountTypeEnum.PERCENT.getType().equals(discount.getDiscountType())) { // 打折 | ||
| 115 | + newPrice = newPrice * discount.getDiscountPercent() / 100; | ||
| 159 | } else { | 116 | } else { |
| 160 | - throw new IllegalArgumentException(String.format("优惠活动的商品(%s) 的优惠类型不正确", discountProduct)); | 117 | + throw new IllegalArgumentException(String.format("优惠活动的商品(%s) 的优惠类型不正确", discount)); |
| 161 | } | 118 | } |
| 162 | - return price; | 119 | + return orderItem.getPayPrice() - newPrice; |
| 163 | } | 120 | } |
| 164 | 121 | ||
| 165 | /** | 122 | /** |
| 166 | - * 计算会员 VIP 优惠价格 | 123 | + * 计算会员 VIP 的优惠价格 |
| 167 | * | 124 | * |
| 168 | - * @param price 原价 | ||
| 169 | - * @param discountPercent 折扣 | 125 | + * @param level 会员等级 |
| 126 | + * @param orderItem 交易项 | ||
| 170 | * @return 优惠价格 | 127 | * @return 优惠价格 |
| 171 | */ | 128 | */ |
| 172 | - public Integer calculateVipPrice(Integer price, Integer discountPercent) { | ||
| 173 | - if (discountPercent == null) { | 129 | + public Integer calculateVipPrice(MemberLevelRespDTO level, |
| 130 | + TradePriceCalculateRespBO.OrderItem orderItem) { | ||
| 131 | + if (level == null || level.getDiscountPercent() == null) { | ||
| 174 | return 0; | 132 | return 0; |
| 175 | } | 133 | } |
| 176 | - BigDecimal divide = new BigDecimal(price).multiply(new BigDecimal(discountPercent)).divide(new BigDecimal(100)); | ||
| 177 | - Integer newPrice = divide.intValue(); | ||
| 178 | - return price - newPrice; | 134 | + Integer newPrice = MoneyUtils.calculateRatePrice(orderItem.getPayPrice(), level.getDiscountPercent().doubleValue()); |
| 135 | + return orderItem.getPayPrice() - newPrice; | ||
| 179 | } | 136 | } |
| 180 | 137 | ||
| 181 | } | 138 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculator.java deleted
| 1 | -package cn.iocoder.yudao.module.trade.service.price.calculator; | ||
| 2 | - | ||
| 3 | -import cn.hutool.core.util.ObjectUtil; | ||
| 4 | -import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | ||
| 5 | -import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; | ||
| 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.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 | -import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice; | ||
| 18 | - | ||
| 19 | -/** | ||
| 20 | - * 会员 VIP 折扣的 {@link TradePriceCalculator} 实现类 | ||
| 21 | - * | ||
| 22 | - * @author 芋道源码 | ||
| 23 | - */ | ||
| 24 | -@Component | ||
| 25 | -@Order(TradePriceCalculator.ORDER_MEMBER_LEVEL) | ||
| 26 | -public class TradeMemberLevelPriceCalculator implements TradePriceCalculator { | ||
| 27 | - | ||
| 28 | - @Resource | ||
| 29 | - private MemberLevelApi memberLevelApi; | ||
| 30 | - @Resource | ||
| 31 | - private MemberUserApi memberUserApi; | ||
| 32 | - | ||
| 33 | - /** | ||
| 34 | - * 会员计算迁移到限时优惠计算里 | ||
| 35 | - * @param param | ||
| 36 | - * @param result | ||
| 37 | - */ | ||
| 38 | - @Override | ||
| 39 | - public void calculate(TradePriceCalculateReqBO param, TradePriceCalculateRespBO result) { | ||
| 40 | -// // 0. 只有【普通】订单,才计算该优惠 | ||
| 41 | -// if (ObjectUtil.notEqual(result.getType(), TradeOrderTypeEnum.NORMAL.getType())) { | ||
| 42 | -// return; | ||
| 43 | -// } | ||
| 44 | -// // 1. 获得用户的会员等级 | ||
| 45 | -// MemberUserRespDTO user = memberUserApi.getUser(param.getUserId()); | ||
| 46 | -// if (user.getLevelId() == null || user.getLevelId() <= 0) { | ||
| 47 | -// return; | ||
| 48 | -// } | ||
| 49 | -// MemberLevelRespDTO level = memberLevelApi.getMemberLevel(user.getLevelId()); | ||
| 50 | -// if (level == null || level.getDiscountPercent() == null) { | ||
| 51 | -// return; | ||
| 52 | -// } | ||
| 53 | -// | ||
| 54 | -// // 2. 计算每个 SKU 的优惠金额 | ||
| 55 | -// result.getItems().forEach(orderItem -> { | ||
| 56 | -// // 2.1 计算优惠金额 | ||
| 57 | -// Integer vipPrice = calculateVipPrice(orderItem.getPayPrice(), level.getDiscountPercent()); | ||
| 58 | -// if (vipPrice <= 0) { | ||
| 59 | -// return; | ||
| 60 | -// } | ||
| 61 | -// | ||
| 62 | -// // 2.2 记录优惠明细 | ||
| 63 | -// if (orderItem.getSelected()) { | ||
| 64 | -// // 注意,只有在选中的情况下,才会记录到优惠明细。否则仅仅是更新 SKU 优惠金额,用于展示 | ||
| 65 | -// TradePriceCalculatorHelper.addPromotion(result, orderItem, | ||
| 66 | -// level.getId(), level.getName(), PromotionTypeEnum.MEMBER_LEVEL.getType(), | ||
| 67 | -// String.format("会员等级折扣:省 %s 元", formatPrice(vipPrice)), | ||
| 68 | -// vipPrice); | ||
| 69 | -// } | ||
| 70 | -// | ||
| 71 | -// // 2.3 更新 SKU 的优惠金额 | ||
| 72 | -// orderItem.setVipPrice(vipPrice); | ||
| 73 | -// TradePriceCalculatorHelper.recountPayPrice(orderItem); | ||
| 74 | -// }); | ||
| 75 | -// TradePriceCalculatorHelper.recountAllPrice(result); | ||
| 76 | - } | ||
| 77 | - | ||
| 78 | - /** | ||
| 79 | - * 计算会员 VIP 优惠价格 | ||
| 80 | - * | ||
| 81 | - * @param price 原价 | ||
| 82 | - * @param discountPercent 折扣 | ||
| 83 | - * @return 优惠价格 | ||
| 84 | - */ | ||
| 85 | - public Integer calculateVipPrice(Integer price, Integer discountPercent) { | ||
| 86 | - if (discountPercent == null) { | ||
| 87 | - return 0; | ||
| 88 | - } | ||
| 89 | - Integer newPrice = price * discountPercent / 100; | ||
| 90 | - return price - newPrice; | ||
| 91 | - } | ||
| 92 | - | ||
| 93 | -} |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePriceCalculator.java
| @@ -13,8 +13,6 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | @@ -13,8 +13,6 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | ||
| 13 | */ | 13 | */ |
| 14 | public interface TradePriceCalculator { | 14 | public interface TradePriceCalculator { |
| 15 | 15 | ||
| 16 | - int ORDER_MEMBER_LEVEL = 5; | ||
| 17 | - | ||
| 18 | int ORDER_SECKILL_ACTIVITY = 8; | 16 | int ORDER_SECKILL_ACTIVITY = 8; |
| 19 | int ORDER_BARGAIN_ACTIVITY = 8; | 17 | int ORDER_BARGAIN_ACTIVITY = 8; |
| 20 | int ORDER_COMBINATION_ACTIVITY = 8; | 18 | int ORDER_COMBINATION_ACTIVITY = 8; |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java
| @@ -23,10 +23,8 @@ import java.util.Comparator; | @@ -23,10 +23,8 @@ import java.util.Comparator; | ||
| 23 | import java.util.List; | 23 | import java.util.List; |
| 24 | import java.util.Map; | 24 | import java.util.Map; |
| 25 | 25 | ||
| 26 | -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 27 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 26 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 28 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; | 27 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; |
| 29 | -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_TYPE_NOT_EXISTS; | ||
| 30 | import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice; | 28 | import static cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper.formatPrice; |
| 31 | 29 | ||
| 32 | // TODO @puhui999:相关的单测,建议改一改 | 30 | // TODO @puhui999:相关的单测,建议改一改 |
| @@ -81,8 +79,10 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator | @@ -81,8 +79,10 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator | ||
| 81 | Integer newDiscountPrice = rule.getDiscountPrice(); | 79 | Integer newDiscountPrice = rule.getDiscountPrice(); |
| 82 | // 2.2 计算分摊的优惠金额 | 80 | // 2.2 计算分摊的优惠金额 |
| 83 | List<Integer> divideDiscountPrices = TradePriceCalculatorHelper.dividePrice(orderItems, newDiscountPrice); | 81 | List<Integer> divideDiscountPrices = TradePriceCalculatorHelper.dividePrice(orderItems, newDiscountPrice); |
| 84 | - //计算是否包邮 | ||
| 85 | - result.setFreeDelivery(rule.getFreeDelivery()); | 82 | + // 2.3 计算是否包邮 |
| 83 | + if (Boolean.TRUE.equals(rule.getFreeDelivery())) { | ||
| 84 | + result.setFreeDelivery(true); | ||
| 85 | + } | ||
| 86 | 86 | ||
| 87 | // 3.1 记录使用的优惠劵 | 87 | // 3.1 记录使用的优惠劵 |
| 88 | result.setCouponId(param.getCouponId()); | 88 | result.setCouponId(param.getCouponId()); |
| @@ -132,16 +132,17 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator | @@ -132,16 +132,17 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator | ||
| 132 | private List<TradePriceCalculateRespBO.OrderItem> filterMatchActivityOrderItems(TradePriceCalculateRespBO result, | 132 | private List<TradePriceCalculateRespBO.OrderItem> filterMatchActivityOrderItems(TradePriceCalculateRespBO result, |
| 133 | RewardActivityMatchRespDTO rewardActivity) { | 133 | RewardActivityMatchRespDTO rewardActivity) { |
| 134 | Integer productScope = rewardActivity.getProductScope(); | 134 | Integer productScope = rewardActivity.getProductScope(); |
| 135 | - if(PromotionProductScopeEnum.isAll(productScope)){ | 135 | + if (PromotionProductScopeEnum.isAll(productScope)){ |
| 136 | return result.getItems(); | 136 | return result.getItems(); |
| 137 | - }else if (PromotionProductScopeEnum.isSpu(productScope)) { | 137 | + } else if (PromotionProductScopeEnum.isSpu(productScope)) { |
| 138 | return filterList(result.getItems(), | 138 | return filterList(result.getItems(), |
| 139 | orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getSpuId())); | 139 | orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getSpuId())); |
| 140 | - }else if (PromotionProductScopeEnum.isCategory(productScope)) { | 140 | + } else if (PromotionProductScopeEnum.isCategory(productScope)) { |
| 141 | return filterList(result.getItems(), | 141 | return filterList(result.getItems(), |
| 142 | orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getCategoryId())); | 142 | orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getCategoryId())); |
| 143 | - }else{ | ||
| 144 | - throw exception(REWARD_ACTIVITY_TYPE_NOT_EXISTS); | 143 | + } else { |
| 144 | + throw new IllegalArgumentException(StrUtil.format("满减送活动({})的类型({})不存在", | ||
| 145 | + rewardActivity.getId(), productScope)); | ||
| 145 | } | 146 | } |
| 146 | } | 147 | } |
| 147 | 148 |
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeMemberLevelPriceCalculatorTest.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.level.MemberLevelApi; | ||
| 5 | -import cn.iocoder.yudao.module.member.api.level.dto.MemberLevelRespDTO; | ||
| 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.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.junit.jupiter.api.Test; | ||
| 13 | -import org.mockito.InjectMocks; | ||
| 14 | -import org.mockito.Mock; | ||
| 15 | - | ||
| 16 | -import java.util.ArrayList; | ||
| 17 | - | ||
| 18 | -import static java.util.Arrays.asList; | ||
| 19 | -import static org.junit.jupiter.api.Assertions.*; | ||
| 20 | -import static org.mockito.ArgumentMatchers.eq; | ||
| 21 | -import static org.mockito.Mockito.when; | ||
| 22 | - | ||
| 23 | -/** | ||
| 24 | - * {@link TradeMemberLevelPriceCalculator} 的单元测试类 | ||
| 25 | - * | ||
| 26 | - * @author 芋道源码 | ||
| 27 | - */ | ||
| 28 | -public class TradeMemberLevelPriceCalculatorTest extends BaseMockitoUnitTest { | ||
| 29 | - | ||
| 30 | - @InjectMocks | ||
| 31 | - private TradeMemberLevelPriceCalculator memberLevelPriceCalculator; | ||
| 32 | - | ||
| 33 | - @Mock | ||
| 34 | - private MemberLevelApi memberLevelApi; | ||
| 35 | - @Mock | ||
| 36 | - private MemberUserApi memberUserApi; | ||
| 37 | - | ||
| 38 | - @Test | ||
| 39 | - public void testCalculate() { | ||
| 40 | - // 准备参数 | ||
| 41 | - TradePriceCalculateReqBO param = new TradePriceCalculateReqBO() | ||
| 42 | - .setUserId(1024L) | ||
| 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(memberUserApi.getUser(eq(1024L))).thenReturn(new MemberUserRespDTO().setLevelId(2048L)); | ||
| 63 | - when(memberLevelApi.getMemberLevel(eq(2048L))).thenReturn( | ||
| 64 | - new MemberLevelRespDTO().setId(2048L).setName("VIP 会员").setDiscountPercent(60)); | ||
| 65 | - | ||
| 66 | - // 调用 | ||
| 67 | - memberLevelPriceCalculator.calculate(param, result); | ||
| 68 | - // 断言:Price 部分 | ||
| 69 | - TradePriceCalculateRespBO.Price price = result.getPrice(); | ||
| 70 | - assertEquals(price.getTotalPrice(), 200); | ||
| 71 | - assertEquals(price.getDiscountPrice(), 0); | ||
| 72 | - assertEquals(price.getPointPrice(), 0); | ||
| 73 | - assertEquals(price.getDeliveryPrice(), 0); | ||
| 74 | - assertEquals(price.getCouponPrice(), 0); | ||
| 75 | - assertEquals(price.getVipPrice(), 80); | ||
| 76 | - assertEquals(price.getPayPrice(), 120); | ||
| 77 | - assertNull(result.getCouponId()); | ||
| 78 | - // 断言:SKU 1 | ||
| 79 | - assertEquals(result.getItems().size(), 2); | ||
| 80 | - TradePriceCalculateRespBO.OrderItem orderItem01 = result.getItems().get(0); | ||
| 81 | - assertEquals(orderItem01.getSkuId(), 10L); | ||
| 82 | - assertEquals(orderItem01.getCount(), 2); | ||
| 83 | - assertEquals(orderItem01.getPrice(), 100); | ||
| 84 | - assertEquals(orderItem01.getDiscountPrice(), 0); | ||
| 85 | - assertEquals(orderItem01.getDeliveryPrice(), 0); | ||
| 86 | - assertEquals(orderItem01.getCouponPrice(), 0); | ||
| 87 | - assertEquals(orderItem01.getPointPrice(), 0); | ||
| 88 | - assertEquals(orderItem01.getVipPrice(), 80); | ||
| 89 | - assertEquals(orderItem01.getPayPrice(), 120); | ||
| 90 | - // 断言:SKU 2 | ||
| 91 | - TradePriceCalculateRespBO.OrderItem orderItem02 = result.getItems().get(1); | ||
| 92 | - assertEquals(orderItem02.getSkuId(), 20L); | ||
| 93 | - assertEquals(orderItem02.getCount(), 3); | ||
| 94 | - assertEquals(orderItem02.getPrice(), 50); | ||
| 95 | - assertEquals(orderItem02.getDiscountPrice(), 0); | ||
| 96 | - assertEquals(orderItem02.getDeliveryPrice(), 0); | ||
| 97 | - assertEquals(orderItem02.getCouponPrice(), 0); | ||
| 98 | - assertEquals(orderItem02.getPointPrice(), 0); | ||
| 99 | - assertEquals(orderItem02.getVipPrice(), 60); | ||
| 100 | - assertEquals(orderItem02.getPayPrice(), 90); | ||
| 101 | - // 断言:Promotion 部分 | ||
| 102 | - assertEquals(result.getPromotions().size(), 1); | ||
| 103 | - TradePriceCalculateRespBO.Promotion promotion01 = result.getPromotions().get(0); | ||
| 104 | - assertEquals(promotion01.getId(), 2048L); | ||
| 105 | - assertEquals(promotion01.getName(), "VIP 会员"); | ||
| 106 | - assertEquals(promotion01.getType(), PromotionTypeEnum.MEMBER_LEVEL.getType()); | ||
| 107 | - assertEquals(promotion01.getTotalPrice(), 200); | ||
| 108 | - assertEquals(promotion01.getDiscountPrice(), 80); | ||
| 109 | - assertTrue(promotion01.getMatch()); | ||
| 110 | - assertEquals(promotion01.getDescription(), "会员等级折扣:省 0.80 元"); | ||
| 111 | - TradePriceCalculateRespBO.PromotionItem promotionItem01 = promotion01.getItems().get(0); | ||
| 112 | - assertEquals(promotion01.getItems().size(), 1); | ||
| 113 | - assertEquals(promotionItem01.getSkuId(), 10L); | ||
| 114 | - assertEquals(promotionItem01.getTotalPrice(), 200); | ||
| 115 | - assertEquals(promotionItem01.getDiscountPrice(), 80); | ||
| 116 | - } | ||
| 117 | - | ||
| 118 | -} |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
| @@ -11,7 +11,6 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | @@ -11,7 +11,6 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 11 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 11 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 12 | import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; | 12 | import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; |
| 13 | import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; | 13 | import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; |
| 14 | -import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | ||
| 15 | import cn.iocoder.yudao.module.infra.api.config.ConfigApi; | 14 | import cn.iocoder.yudao.module.infra.api.config.ConfigApi; |
| 16 | import cn.iocoder.yudao.module.infra.api.file.FileApi; | 15 | import cn.iocoder.yudao.module.infra.api.file.FileApi; |
| 17 | import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; | 16 | import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthRegisterReqVO; |
| @@ -105,7 +104,6 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -105,7 +104,6 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 105 | AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class); | 104 | AdminUserDO user = BeanUtils.toBean(createReqVO, AdminUserDO.class); |
| 106 | user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 | 105 | user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 |
| 107 | user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码 | 106 | user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码 |
| 108 | - user.setTenantId(TenantContextHolder.getRequiredTenantId()); | ||
| 109 | userMapper.insert(user); | 107 | userMapper.insert(user); |
| 110 | // 2.2 插入关联岗位 | 108 | // 2.2 插入关联岗位 |
| 111 | if (CollectionUtil.isNotEmpty(user.getPostIds())) { | 109 | if (CollectionUtil.isNotEmpty(user.getPostIds())) { |
yudao-server/src/main/resources/application-local.yaml
| @@ -6,7 +6,7 @@ spring: | @@ -6,7 +6,7 @@ spring: | ||
| 6 | # 数据源配置项 | 6 | # 数据源配置项 |
| 7 | autoconfigure: | 7 | autoconfigure: |
| 8 | exclude: | 8 | exclude: |
| 9 | - #- org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置 | 9 | + - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置 |
| 10 | - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置 | 10 | - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置 |
| 11 | - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置 | 11 | - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置 |
| 12 | - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置 | 12 | - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置 |
| @@ -45,7 +45,7 @@ spring: | @@ -45,7 +45,7 @@ spring: | ||
| 45 | primary: master | 45 | primary: master |
| 46 | datasource: | 46 | datasource: |
| 47 | master: | 47 | master: |
| 48 | - url: jdbc:mysql://192.168.10.207:3306/specialty?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 | 48 | + url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 |
| 49 | # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例 | 49 | # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例 |
| 50 | # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例 | 50 | # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例 |
| 51 | # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 | 51 | # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 |
| @@ -61,19 +61,19 @@ spring: | @@ -61,19 +61,19 @@ spring: | ||
| 61 | # password: SYSDBA001 # DM 连接的示例 | 61 | # password: SYSDBA001 # DM 连接的示例 |
| 62 | # username: root # OpenGauss 连接的示例 | 62 | # username: root # OpenGauss 连接的示例 |
| 63 | # password: Yudao@2024 # OpenGauss 连接的示例 | 63 | # password: Yudao@2024 # OpenGauss 连接的示例 |
| 64 | -# slave: # 模拟从库,可根据自己需要修改 | ||
| 65 | -# lazy: true # 开启懒加载,保证启动速度 | ||
| 66 | -# url: jdbc:mysql://192.168.10.207:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true | ||
| 67 | -# username: root | ||
| 68 | -# password: 123456 | 64 | + slave: # 模拟从库,可根据自己需要修改 |
| 65 | + lazy: true # 开启懒加载,保证启动速度 | ||
| 66 | + url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true | ||
| 67 | + username: root | ||
| 68 | + password: 123456 | ||
| 69 | 69 | ||
| 70 | # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 | 70 | # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 |
| 71 | data: | 71 | data: |
| 72 | redis: | 72 | redis: |
| 73 | - host: 192.168.10.207 # 地址 | 73 | + host: 127.0.0.1 # 地址 |
| 74 | port: 6379 # 端口 | 74 | port: 6379 # 端口 |
| 75 | database: 0 # 数据库索引 | 75 | database: 0 # 数据库索引 |
| 76 | - password: 123456 # 密码,建议生产环境开启 | 76 | +# password: dev # 密码,建议生产环境开启 |
| 77 | 77 | ||
| 78 | --- #################### 定时任务相关配置 #################### | 78 | --- #################### 定时任务相关配置 #################### |
| 79 | 79 | ||
| @@ -200,8 +200,8 @@ wx: | @@ -200,8 +200,8 @@ wx: | ||
| 200 | # secret: 6f270509224a7ae1296bbf1c8cb97aed | 200 | # secret: 6f270509224a7ae1296bbf1c8cb97aed |
| 201 | # appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的) | 201 | # appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的) |
| 202 | # secret: 4a1a04e07f6a4a0751b39c3064a92c8b | 202 | # secret: 4a1a04e07f6a4a0751b39c3064a92c8b |
| 203 | - appid: wx9a0a5b259d852380 # 测试号(puhui 提供的) | ||
| 204 | - secret: 70e65fa9d1a4f2c4e1b2aa8751d3b75e | 203 | + appid: wx66186af0759f47c9 # 测试号(puhui 提供的) |
| 204 | + secret: 3218bcbd112cbc614c7264ceb20144ac | ||
| 205 | config-storage: | 205 | config-storage: |
| 206 | type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 | 206 | type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 |
| 207 | key-prefix: wa # Redis Key 的前缀 | 207 | key-prefix: wa # Redis Key 的前缀 |