Commit cd45be1fe23f6098a99f7a5b9c7704c3349aa8dc
1 parent
16e436a0
promotion:优化砍价活动的分页结果
Showing
15 changed files
with
191 additions
and
44 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/BargainActivityController.java
| ... | ... | @@ -5,13 +5,13 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 5 | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | 6 | import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; |
| 7 | 7 | import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; |
| 8 | -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO; | |
| 9 | -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO; | |
| 10 | -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO; | |
| 11 | -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO; | |
| 8 | +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.*; | |
| 12 | 9 | import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert; |
| 13 | 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO; |
| 11 | +import cn.iocoder.yudao.module.promotion.enums.bargain.BargainRecordStatusEnum; | |
| 14 | 12 | import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService; |
| 13 | +import cn.iocoder.yudao.module.promotion.service.bargain.BargainHelpService; | |
| 14 | +import cn.iocoder.yudao.module.promotion.service.bargain.BargainRecordService; | |
| 15 | 15 | import io.swagger.v3.oas.annotations.Operation; |
| 16 | 16 | import io.swagger.v3.oas.annotations.Parameter; |
| 17 | 17 | import io.swagger.v3.oas.annotations.tags.Tag; |
| ... | ... | @@ -21,7 +21,9 @@ import org.springframework.web.bind.annotation.*; |
| 21 | 21 | |
| 22 | 22 | import javax.annotation.Resource; |
| 23 | 23 | import javax.validation.Valid; |
| 24 | +import java.util.Collection; | |
| 24 | 25 | import java.util.List; |
| 26 | +import java.util.Map; | |
| 25 | 27 | |
| 26 | 28 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 27 | 29 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| ... | ... | @@ -33,7 +35,12 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. |
| 33 | 35 | public class BargainActivityController { |
| 34 | 36 | |
| 35 | 37 | @Resource |
| 36 | - private BargainActivityService activityService; | |
| 38 | + private BargainActivityService bargainActivityService; | |
| 39 | + @Resource | |
| 40 | + private BargainRecordService bargainRecordService; | |
| 41 | + @Resource | |
| 42 | + private BargainHelpService bargainHelpService; | |
| 43 | + | |
| 37 | 44 | @Resource |
| 38 | 45 | private ProductSpuApi spuApi; |
| 39 | 46 | |
| ... | ... | @@ -41,14 +48,14 @@ public class BargainActivityController { |
| 41 | 48 | @Operation(summary = "创建砍价活动") |
| 42 | 49 | @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:create')") |
| 43 | 50 | public CommonResult<Long> createBargainActivity(@Valid @RequestBody BargainActivityCreateReqVO createReqVO) { |
| 44 | - return success(activityService.createBargainActivity(createReqVO)); | |
| 51 | + return success(bargainActivityService.createBargainActivity(createReqVO)); | |
| 45 | 52 | } |
| 46 | 53 | |
| 47 | 54 | @PutMapping("/update") |
| 48 | 55 | @Operation(summary = "更新砍价活动") |
| 49 | 56 | @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:update')") |
| 50 | 57 | public CommonResult<Boolean> updateBargainActivity(@Valid @RequestBody BargainActivityUpdateReqVO updateReqVO) { |
| 51 | - activityService.updateBargainActivity(updateReqVO); | |
| 58 | + bargainActivityService.updateBargainActivity(updateReqVO); | |
| 52 | 59 | return success(true); |
| 53 | 60 | } |
| 54 | 61 | |
| ... | ... | @@ -57,7 +64,7 @@ public class BargainActivityController { |
| 57 | 64 | @Parameter(name = "id", description = "编号", required = true) |
| 58 | 65 | @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:delete')") |
| 59 | 66 | public CommonResult<Boolean> deleteBargainActivity(@RequestParam("id") Long id) { |
| 60 | - activityService.deleteBargainActivity(id); | |
| 67 | + bargainActivityService.deleteBargainActivity(id); | |
| 61 | 68 | return success(true); |
| 62 | 69 | } |
| 63 | 70 | |
| ... | ... | @@ -66,23 +73,30 @@ public class BargainActivityController { |
| 66 | 73 | @Parameter(name = "id", description = "编号", required = true, example = "1024") |
| 67 | 74 | @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:query')") |
| 68 | 75 | public CommonResult<BargainActivityRespVO> getBargainActivity(@RequestParam("id") Long id) { |
| 69 | - return success(BargainActivityConvert.INSTANCE.convert(activityService.getBargainActivity(id))); | |
| 76 | + return success(BargainActivityConvert.INSTANCE.convert(bargainActivityService.getBargainActivity(id))); | |
| 70 | 77 | } |
| 71 | 78 | |
| 72 | 79 | @GetMapping("/page") |
| 73 | 80 | @Operation(summary = "获得砍价活动分页") |
| 74 | 81 | @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:query')") |
| 75 | - public CommonResult<PageResult<BargainActivityRespVO>> getBargainActivityPage( | |
| 82 | + public CommonResult<PageResult<BargainActivityPageItemRespVO>> getBargainActivityPage( | |
| 76 | 83 | @Valid BargainActivityPageReqVO pageVO) { |
| 77 | 84 | // 查询砍价活动 |
| 78 | - PageResult<BargainActivityDO> pageResult = activityService.getBargainActivityPage(pageVO); | |
| 85 | + PageResult<BargainActivityDO> pageResult = bargainActivityService.getBargainActivityPage(pageVO); | |
| 79 | 86 | if (CollUtil.isEmpty(pageResult.getList())) { |
| 80 | 87 | return success(PageResult.empty(pageResult.getTotal())); |
| 81 | 88 | } |
| 82 | 89 | |
| 83 | 90 | // 拼接数据 |
| 84 | 91 | List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(pageResult.getList(), BargainActivityDO::getSpuId)); |
| 85 | - return success(BargainActivityConvert.INSTANCE.convertPage(pageResult, spuList)); | |
| 92 | + // 统计数据 | |
| 93 | + Collection<Long> activityIds = convertList(pageResult.getList(), BargainActivityDO::getId); | |
| 94 | + Map<Long, Integer> recordUserCountMap = bargainRecordService.getBargainRecordUserCountMap(activityIds, null); | |
| 95 | + Map<Long, Integer> recordSuccessUserCountMap = bargainRecordService.getBargainRecordUserCountMap(activityIds, | |
| 96 | + BargainRecordStatusEnum.SUCCESS.getStatus()); | |
| 97 | + Map<Long, Integer> helpUserCountMap = bargainHelpService.getBargainHelpUserCountMap(activityIds); | |
| 98 | + return success(BargainActivityConvert.INSTANCE.convertPage(pageResult, spuList, | |
| 99 | + recordUserCountMap, recordSuccessUserCountMap, helpUserCountMap)); | |
| 86 | 100 | } |
| 87 | 101 | |
| 88 | 102 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/BargainActivityBaseVO.java
| ... | ... | @@ -36,7 +36,7 @@ public class BargainActivityBaseVO { |
| 36 | 36 | |
| 37 | 37 | @Schema(description = "砍价底价", requiredMode = Schema.RequiredMode.REQUIRED, example = "23") |
| 38 | 38 | @NotNull(message = "砍价底价不能为空") |
| 39 | - private Integer bargainPrice; | |
| 39 | + private Integer bargainMinPrice; | |
| 40 | 40 | |
| 41 | 41 | @Schema(description = "活动库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "23") |
| 42 | 42 | @NotNull(message = "活动库存不能为空") | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/BargainActivityPageItemRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo; | |
| 2 | + | |
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | +import lombok.Data; | |
| 5 | +import lombok.EqualsAndHashCode; | |
| 6 | +import lombok.ToString; | |
| 7 | + | |
| 8 | +import javax.validation.constraints.NotNull; | |
| 9 | +import java.time.LocalDateTime; | |
| 10 | + | |
| 11 | +@Schema(description = "管理后台 - 砍价活动的分页项 Response VO") | |
| 12 | +@Data | |
| 13 | +@EqualsAndHashCode(callSuper = true) | |
| 14 | +@ToString(callSuper = true) | |
| 15 | +public class BargainActivityPageItemRespVO extends BargainActivityBaseVO { | |
| 16 | + | |
| 17 | + @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901") | |
| 18 | + private Long id; | |
| 19 | + | |
| 20 | + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618大促") | |
| 21 | + private String spuName; | |
| 22 | + @Schema(description = "商品主图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") | |
| 23 | + private String picUrl; | |
| 24 | + | |
| 25 | + @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 26 | + @NotNull(message = "活动状态不能为空") | |
| 27 | + private Integer status; | |
| 28 | + | |
| 29 | + @Schema(description = "活动总库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "23") | |
| 30 | + private Integer totalStock; | |
| 31 | + | |
| 32 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-01 23:59:59") | |
| 33 | + private LocalDateTime createTime; | |
| 34 | + | |
| 35 | + // ========== 统计字段 ========== | |
| 36 | + | |
| 37 | + @Schema(description = "总砍价的用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "999") | |
| 38 | + private Integer recordUserCount; | |
| 39 | + | |
| 40 | + @Schema(description = "成功砍价的用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "500") | |
| 41 | + private Integer recordSuccessUserCount; | |
| 42 | + | |
| 43 | + @Schema(description = "帮助砍价的用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "888") | |
| 44 | + private Integer helpUserCount; | |
| 45 | + | |
| 46 | +} | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/BargainActivityRespVO.java
| ... | ... | @@ -5,7 +5,6 @@ import lombok.Data; |
| 5 | 5 | import lombok.EqualsAndHashCode; |
| 6 | 6 | import lombok.ToString; |
| 7 | 7 | |
| 8 | -import javax.validation.constraints.NotNull; | |
| 9 | 8 | import java.time.LocalDateTime; |
| 10 | 9 | @Schema(description = "管理后台 - 砍价活动 Response VO") |
| 11 | 10 | @Data |
| ... | ... | @@ -13,23 +12,13 @@ import java.time.LocalDateTime; |
| 13 | 12 | @ToString(callSuper = true) |
| 14 | 13 | public class BargainActivityRespVO extends BargainActivityBaseVO { |
| 15 | 14 | |
| 16 | - @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618大促") | |
| 17 | - private String spuName; | |
| 18 | - | |
| 19 | - @Schema(description = "商品主图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png") | |
| 20 | - private String picUrl; | |
| 21 | - | |
| 22 | 15 | @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901") |
| 23 | 16 | private Long id; |
| 24 | 17 | |
| 25 | - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-01 23:59:59") | |
| 26 | - private LocalDateTime createTime; | |
| 27 | - | |
| 28 | - @Schema(description = "砍价成功数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "999") | |
| 29 | - private Integer successCount; | |
| 30 | - | |
| 31 | 18 | @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| 32 | - @NotNull(message = "活动状态不能为空") | |
| 33 | 19 | private Integer status; |
| 34 | 20 | |
| 21 | + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-01 23:59:59") | |
| 22 | + private LocalDateTime createTime; | |
| 23 | + | |
| 35 | 24 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.java
| ... | ... | @@ -22,6 +22,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 22 | 22 | @Validated |
| 23 | 23 | public class AppActivityController { |
| 24 | 24 | |
| 25 | + // TODO @puhui999:可以实现下 | |
| 25 | 26 | @GetMapping("/list-by-spu-id") |
| 26 | 27 | @Operation(summary = "获得单个商品,近期参与的每个活动") // 每种活动,只返回一个 |
| 27 | 28 | @Parameter(name = "spuId", description = "商品编号", required = true) |
| ... | ... | @@ -41,6 +42,7 @@ public class AppActivityController { |
| 41 | 42 | return success(randomList); |
| 42 | 43 | } |
| 43 | 44 | |
| 45 | + // TODO @puhui999:可以实现下 | |
| 44 | 46 | @GetMapping("/list-by-spu-ids") |
| 45 | 47 | @Operation(summary = "获得多个商品,近期参与的每个活动") // 每种活动,只返回一个;key 为 SPU 编号 |
| 46 | 48 | @Parameter(name = "spuIds", description = "商品编号数组", required = true) | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainActivityController.java
| ... | ... | @@ -32,6 +32,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. |
| 32 | 32 | @RequestMapping("/promotion/bargain-activity") |
| 33 | 33 | @Validated |
| 34 | 34 | public class AppBargainActivityController { |
| 35 | + | |
| 35 | 36 | @Resource |
| 36 | 37 | private BargainActivityService bargainActivityService; |
| 37 | 38 | @Resource | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/bargain/BargainActivityConvert.java
| ... | ... | @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.dict.core.util.DictFrameworkUtils; |
| 6 | 6 | import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; |
| 7 | 7 | import cn.iocoder.yudao.module.product.enums.DictTypeConstants; |
| 8 | 8 | import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO; |
| 9 | +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageItemRespVO; | |
| 9 | 10 | import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO; |
| 10 | 11 | import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO; |
| 11 | 12 | import cn.iocoder.yudao.module.promotion.controller.app.bargain.vo.activity.AppBargainActivityDetailRespVO; |
| ... | ... | @@ -38,19 +39,23 @@ public interface BargainActivityConvert { |
| 38 | 39 | |
| 39 | 40 | List<BargainActivityRespVO> convertList(List<BargainActivityDO> list); |
| 40 | 41 | |
| 41 | - PageResult<BargainActivityRespVO> convertPage(PageResult<BargainActivityDO> page); | |
| 42 | + PageResult<BargainActivityPageItemRespVO> convertPage(PageResult<BargainActivityDO> page); | |
| 42 | 43 | |
| 43 | - default PageResult<BargainActivityRespVO> convertPage(PageResult<BargainActivityDO> page, List<ProductSpuRespDTO> spuList) { | |
| 44 | - PageResult<BargainActivityRespVO> result = convertPage(page); | |
| 44 | + default PageResult<BargainActivityPageItemRespVO> convertPage(PageResult<BargainActivityDO> page, List<ProductSpuRespDTO> spuList, | |
| 45 | + Map<Long, Integer> recordUserCountMap, Map<Long, Integer> recordSuccessUserCountMap, | |
| 46 | + Map<Long, Integer> helpUserCountMap) { | |
| 47 | + PageResult<BargainActivityPageItemRespVO> result = convertPage(page); | |
| 45 | 48 | // 拼接关联属性 |
| 46 | 49 | Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId); |
| 47 | - List<BargainActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> { | |
| 50 | + result.getList().forEach(item -> { | |
| 48 | 51 | findAndThen(spuMap, item.getSpuId(), spu -> { |
| 49 | 52 | item.setPicUrl(spu.getPicUrl()).setSpuName(spu.getName()); |
| 50 | 53 | }); |
| 51 | - return item; | |
| 54 | + // 设置统计字段 | |
| 55 | + item.setRecordUserCount(recordUserCountMap.getOrDefault(item.getId(), 0)) | |
| 56 | + .setRecordSuccessUserCount(recordSuccessUserCountMap.getOrDefault(item.getId(), 0)) | |
| 57 | + .setHelpUserCount(helpUserCountMap.getOrDefault(item.getId(), 0)); | |
| 52 | 58 | }); |
| 53 | - result.setList(list); | |
| 54 | 59 | return result; |
| 55 | 60 | } |
| 56 | 61 | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/bargain/BargainActivityDO.java
| ... | ... | @@ -67,10 +67,15 @@ public class BargainActivityDO extends BaseDO { |
| 67 | 67 | * 砍价底价,单位:分 |
| 68 | 68 | */ |
| 69 | 69 | private Integer bargainMinPrice; |
| 70 | + | |
| 70 | 71 | /** |
| 71 | - * 砍价活动库存 | |
| 72 | + * 砍价库存(剩余库存砍价时扣减) | |
| 72 | 73 | */ |
| 73 | 74 | private Integer stock; |
| 75 | + /** | |
| 76 | + * 砍价总库存 | |
| 77 | + */ | |
| 78 | + private Integer totalStock; | |
| 74 | 79 | |
| 75 | 80 | /** |
| 76 | 81 | * 砍价人数 |
| ... | ... | @@ -99,11 +104,4 @@ public class BargainActivityDO extends BaseDO { |
| 99 | 104 | */ |
| 100 | 105 | private Integer randomMaxPrice; |
| 101 | 106 | |
| 102 | - // ========== 统计字段 ========== | |
| 103 | - | |
| 104 | - /** | |
| 105 | - * 砍价成功数量 | |
| 106 | - */ | |
| 107 | - private Integer successCount; | |
| 108 | - | |
| 109 | 107 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainHelpMapper.java
| 1 | 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.bargain; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.hutool.core.map.MapUtil; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | |
| 3 | 6 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | 7 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainHelpDO; |
| 5 | 8 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| 9 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |
| 6 | 10 | import org.apache.ibatis.annotations.Mapper; |
| 7 | 11 | |
| 12 | +import java.util.Collection; | |
| 13 | +import java.util.Collections; | |
| 14 | +import java.util.List; | |
| 15 | +import java.util.Map; | |
| 16 | + | |
| 8 | 17 | @Mapper |
| 9 | 18 | public interface BargainHelpMapper extends BaseMapperX<BargainHelpDO> { |
| 10 | 19 | |
| ... | ... | @@ -24,4 +33,20 @@ public interface BargainHelpMapper extends BaseMapperX<BargainHelpDO> { |
| 24 | 33 | .eq(BargainHelpDO::getRecordId, recordId)); |
| 25 | 34 | } |
| 26 | 35 | |
| 36 | + | |
| 37 | + default Map<Long, Integer> selectCountByActivityId(Collection<Long> activityIds) { | |
| 38 | + // SQL count 查询 | |
| 39 | + List<Map<String, Object>> result = selectMaps(new QueryWrapper<BargainHelpDO>() | |
| 40 | + .select("COUNT(DISTINCT(user_id)) AS userCount, activity_id AS activityId") | |
| 41 | + .in("activity_id", activityIds) | |
| 42 | + .groupBy("activity_id")); | |
| 43 | + if (CollUtil.isEmpty(result)) { | |
| 44 | + return Collections.emptyMap(); | |
| 45 | + } | |
| 46 | + // 转换数据 | |
| 47 | + return CollectionUtils.convertMap(result, | |
| 48 | + record -> MapUtil.getLong(record, "activityId"), | |
| 49 | + record -> MapUtil.getInt(record, "userCount" )); | |
| 50 | + } | |
| 51 | + | |
| 27 | 52 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainRecordMapper.java
| 1 | 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.bargain; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.hutool.core.map.MapUtil; | |
| 5 | +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | |
| 3 | 6 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | 7 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainRecordDO; |
| 5 | 8 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| 9 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |
| 6 | 10 | import org.apache.ibatis.annotations.Mapper; |
| 7 | 11 | |
| 12 | +import java.util.Collection; | |
| 13 | +import java.util.Collections; | |
| 8 | 14 | import java.util.List; |
| 15 | +import java.util.Map; | |
| 9 | 16 | |
| 10 | 17 | /** |
| 11 | 18 | * 砍价记录 Mapper |
| ... | ... | @@ -42,4 +49,20 @@ public interface BargainRecordMapper extends BaseMapperX<BargainRecordDO> { |
| 42 | 49 | .eq(BargainRecordDO::getBargainPrice, whereBargainPrice)); |
| 43 | 50 | } |
| 44 | 51 | |
| 52 | + default Map<Long, Integer> selectCountByActivityIdsAndStatus(Collection<Long> activityIds, Integer status) { | |
| 53 | + // SQL count 查询 | |
| 54 | + List<Map<String, Object>> result = selectMaps(new QueryWrapper<BargainRecordDO>() | |
| 55 | + .select("COUNT(DISTINCT(user_id)) AS userCount, activity_id AS activityId") | |
| 56 | + .in("activity_id", activityIds) | |
| 57 | + .eq(status != null, "status", status) | |
| 58 | + .groupBy("activity_id")); | |
| 59 | + if (CollUtil.isEmpty(result)) { | |
| 60 | + return Collections.emptyMap(); | |
| 61 | + } | |
| 62 | + // 转换数据 | |
| 63 | + return CollectionUtils.convertMap(result, | |
| 64 | + record -> MapUtil.getLong(record, "activityId"), | |
| 65 | + record -> MapUtil.getInt(record, "userCount" )); | |
| 66 | + } | |
| 67 | + | |
| 45 | 68 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityServiceImpl.java
| ... | ... | @@ -52,7 +52,8 @@ public class BargainActivityServiceImpl implements BargainActivityService { |
| 52 | 52 | |
| 53 | 53 | // 插入砍价活动 |
| 54 | 54 | BargainActivityDO activityDO = BargainActivityConvert.INSTANCE.convert(createReqVO) |
| 55 | - .setStatus(CommonStatusEnum.ENABLE.getStatus()).setSuccessCount(0); | |
| 55 | + .setTotalStock(createReqVO.getStock()) | |
| 56 | + .setStatus(CommonStatusEnum.ENABLE.getStatus()); | |
| 56 | 57 | bargainActivityMapper.insert(activityDO); |
| 57 | 58 | return activityDO.getId(); |
| 58 | 59 | } |
| ... | ... | @@ -61,9 +62,9 @@ public class BargainActivityServiceImpl implements BargainActivityService { |
| 61 | 62 | @Transactional(rollbackFor = Exception.class) |
| 62 | 63 | public void updateBargainActivity(BargainActivityUpdateReqVO updateReqVO) { |
| 63 | 64 | // 校验存在 |
| 64 | - BargainActivityDO activityDO = validateBargainActivityExists(updateReqVO.getId()); | |
| 65 | + BargainActivityDO activity = validateBargainActivityExists(updateReqVO.getId()); | |
| 65 | 66 | // 校验状态 |
| 66 | - if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { | |
| 67 | + if (ObjectUtil.equal(activity.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { | |
| 67 | 68 | throw exception(BARGAIN_ACTIVITY_STATUS_DISABLE); |
| 68 | 69 | } |
| 69 | 70 | // 校验商品冲突 |
| ... | ... | @@ -73,6 +74,9 @@ public class BargainActivityServiceImpl implements BargainActivityService { |
| 73 | 74 | |
| 74 | 75 | // 更新 |
| 75 | 76 | BargainActivityDO updateObj = BargainActivityConvert.INSTANCE.convert(updateReqVO); |
| 77 | + if (updateObj.getStock() > activity.getTotalStock()) { // 如果更新的库存大于原来的库存,则更新总库存 | |
| 78 | + updateObj.setTotalStock(updateObj.getStock()); | |
| 79 | + } | |
| 76 | 80 | bargainActivityMapper.updateById(updateObj); |
| 77 | 81 | } |
| 78 | 82 | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainHelpService.java
| ... | ... | @@ -3,6 +3,9 @@ package cn.iocoder.yudao.module.promotion.service.bargain; |
| 3 | 3 | import cn.iocoder.yudao.module.promotion.controller.app.bargain.vo.help.AppBargainHelpCreateReqVO; |
| 4 | 4 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainHelpDO; |
| 5 | 5 | |
| 6 | +import java.util.Collection; | |
| 7 | +import java.util.Map; | |
| 8 | + | |
| 6 | 9 | /** |
| 7 | 10 | * 砍价助力 Service 接口 |
| 8 | 11 | * |
| ... | ... | @@ -19,4 +22,12 @@ public interface BargainHelpService { |
| 19 | 22 | */ |
| 20 | 23 | BargainHelpDO createBargainHelp(Long userId, AppBargainHelpCreateReqVO reqVO); |
| 21 | 24 | |
| 25 | + /** | |
| 26 | + * 获得助力人数 Map | |
| 27 | + * | |
| 28 | + * @param activityIds 活动编号 | |
| 29 | + * @return 助力人数 Map | |
| 30 | + */ | |
| 31 | + Map<Long, Integer> getBargainHelpUserCountMap(Collection<Long> activityIds); | |
| 32 | + | |
| 22 | 33 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainHelpServiceImpl.java
| ... | ... | @@ -15,6 +15,9 @@ import org.springframework.validation.annotation.Validated; |
| 15 | 15 | |
| 16 | 16 | import javax.annotation.Resource; |
| 17 | 17 | |
| 18 | +import java.util.Collection; | |
| 19 | +import java.util.Map; | |
| 20 | + | |
| 18 | 21 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 19 | 22 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; |
| 20 | 23 | |
| ... | ... | @@ -99,4 +102,9 @@ public class BargainHelpServiceImpl implements BargainHelpService { |
| 99 | 102 | return reducePrice; |
| 100 | 103 | } |
| 101 | 104 | |
| 105 | + @Override | |
| 106 | + public Map<Long, Integer> getBargainHelpUserCountMap(Collection<Long> activityIds) { | |
| 107 | + return bargainHelpMapper.selectCountByActivityId(activityIds); | |
| 108 | + } | |
| 109 | + | |
| 102 | 110 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainRecordService.java
| ... | ... | @@ -5,6 +5,10 @@ import cn.iocoder.yudao.module.promotion.api.bargain.dto.BargainValidateJoinResp |
| 5 | 5 | import cn.iocoder.yudao.module.promotion.controller.app.bargain.vo.record.AppBargainRecordCreateReqVO; |
| 6 | 6 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainRecordDO; |
| 7 | 7 | |
| 8 | +import javax.annotation.Nullable; | |
| 9 | +import java.util.Collection; | |
| 10 | +import java.util.Map; | |
| 11 | + | |
| 8 | 12 | /** |
| 9 | 13 | * 砍价记录 service 接口 |
| 10 | 14 | * |
| ... | ... | @@ -55,4 +59,13 @@ public interface BargainRecordService { |
| 55 | 59 | */ |
| 56 | 60 | BargainRecordDO getBargainRecord(Long id); |
| 57 | 61 | |
| 62 | + /** | |
| 63 | + * 获得砍价人数 Map | |
| 64 | + * | |
| 65 | + * @param activityIds 活动编号 | |
| 66 | + * @param status 砍价记录状态 | |
| 67 | + * @return 砍价人数 Map | |
| 68 | + */ | |
| 69 | + Map<Long, Integer> getBargainRecordUserCountMap(Collection<Long> activityIds, @Nullable Integer status); | |
| 70 | + | |
| 58 | 71 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainRecordServiceImpl.java
| ... | ... | @@ -12,7 +12,10 @@ import cn.iocoder.yudao.module.promotion.enums.bargain.BargainRecordStatusEnum; |
| 12 | 12 | import org.springframework.stereotype.Service; |
| 13 | 13 | import org.springframework.validation.annotation.Validated; |
| 14 | 14 | |
| 15 | +import javax.annotation.Nullable; | |
| 15 | 16 | import javax.annotation.Resource; |
| 17 | +import java.util.Collection; | |
| 18 | +import java.util.Map; | |
| 16 | 19 | import java.util.Objects; |
| 17 | 20 | |
| 18 | 21 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| ... | ... | @@ -92,4 +95,9 @@ public class BargainRecordServiceImpl implements BargainRecordService { |
| 92 | 95 | return bargainRecordMapper.selectById(id); |
| 93 | 96 | } |
| 94 | 97 | |
| 98 | + @Override | |
| 99 | + public Map<Long, Integer> getBargainRecordUserCountMap(Collection<Long> activityIds, @Nullable Integer status) { | |
| 100 | + return bargainRecordMapper.selectCountByActivityIdsAndStatus(activityIds, status); | |
| 101 | + } | |
| 102 | + | |
| 95 | 103 | } | ... | ... |