Commit 6808d3c163fca5c699d21b50ec0c4d112b319df3

Authored by halfninety
1 parent abbb0768

完成秒杀时段todo,秒杀时段商品添加timeIds

Showing 12 changed files with 74 additions and 85 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityCreateReqVO.java
@@ -7,7 +7,6 @@ import lombok.EqualsAndHashCode; @@ -7,7 +7,6 @@ import lombok.EqualsAndHashCode;
7 import lombok.ToString; 7 import lombok.ToString;
8 8
9 import javax.validation.Valid; 9 import javax.validation.Valid;
10 -import javax.validation.constraints.NotBlank;  
11 import javax.validation.constraints.NotEmpty; 10 import javax.validation.constraints.NotEmpty;
12 import javax.validation.constraints.NotNull; 11 import javax.validation.constraints.NotNull;
13 import java.util.List; 12 import java.util.List;
@@ -26,7 +25,6 @@ public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO { @@ -26,7 +25,6 @@ public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO {
26 @NotNull(message = "排序不能为空") 25 @NotNull(message = "排序不能为空")
27 private Integer sort; 26 private Integer sort;
28 27
29 - // TODO halfninety:直接使用数组接口。timeIds,  
30 @ApiModelProperty(value = "秒杀时段id", required = true) 28 @ApiModelProperty(value = "秒杀时段id", required = true)
31 @NotEmpty(message = "参与场次不能为空") 29 @NotEmpty(message = "参与场次不能为空")
32 private List<Long> timeIds; 30 private List<Long> timeIds;
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java
@@ -75,8 +75,9 @@ public interface SeckillActivityConvert { @@ -75,8 +75,9 @@ public interface SeckillActivityConvert {
75 75
76 } 76 }
77 77
78 - default List<SeckillProductDO> convertList(List<SeckillActivityBaseVO.Product> products, Long seckillActivityId, List<Long> timeIds) { 78 + default List<SeckillProductDO> convertList(List<SeckillActivityBaseVO.Product> products, SeckillActivityDO seckillActivity) {
79 return CollectionUtils.convertList(products, product -> convert(product) 79 return CollectionUtils.convertList(products, product -> convert(product)
80 - .setActivityId(seckillActivityId).setTimeIds(timeIds)); 80 + .setActivityId(seckillActivity.getId()).setTimeIds(seckillActivity.getTimeIds()));
81 } 81 }
  82 +
82 } 83 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java
1 package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
  5 +import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
4 import com.baomidou.mybatisplus.annotation.KeySequence; 6 import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableField;
5 import com.baomidou.mybatisplus.annotation.TableId; 8 import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 9 import com.baomidou.mybatisplus.annotation.TableName;
7 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;  
8 -import lombok.*; 10 +import lombok.Data;
  11 +import lombok.EqualsAndHashCode;
  12 +import lombok.ToString;
9 13
10 -import java.math.BigDecimal;  
11 import java.time.LocalDateTime; 14 import java.time.LocalDateTime;
12 import java.util.List; 15 import java.util.List;
13 16
@@ -16,14 +19,11 @@ import java.util.List; @@ -16,14 +19,11 @@ import java.util.List;
16 * 19 *
17 * @author halfninety 20 * @author halfninety
18 */ 21 */
19 -@TableName("promotion_seckill_activity") 22 +@TableName(value = "promotion_seckill_activity", autoResultMap = true)
20 @KeySequence("promotion_seckill_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 23 @KeySequence("promotion_seckill_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
21 @Data 24 @Data
22 @EqualsAndHashCode(callSuper = true) 25 @EqualsAndHashCode(callSuper = true)
23 @ToString(callSuper = true) 26 @ToString(callSuper = true)
24 -@Builder  
25 -@NoArgsConstructor  
26 -@AllArgsConstructor  
27 public class SeckillActivityDO extends BaseDO { 27 public class SeckillActivityDO extends BaseDO {
28 28
29 /** 29 /**
@@ -37,7 +37,7 @@ public class SeckillActivityDO extends BaseDO { @@ -37,7 +37,7 @@ public class SeckillActivityDO extends BaseDO {
37 private String name; 37 private String name;
38 /** 38 /**
39 * 活动状态 39 * 活动状态
40 - * 40 + * <p>
41 * 枚举 {@link PromotionActivityStatusEnum 对应的类} 41 * 枚举 {@link PromotionActivityStatusEnum 对应的类}
42 */ 42 */
43 private Integer status; 43 private Integer status;
@@ -60,6 +60,7 @@ public class SeckillActivityDO extends BaseDO { @@ -60,6 +60,7 @@ public class SeckillActivityDO extends BaseDO {
60 /** 60 /**
61 * 秒杀时段 id 61 * 秒杀时段 id
62 */ 62 */
  63 + @TableField(typeHandler = LongListTypeHandler.class)
63 private List<Long> timeIds; 64 private List<Long> timeIds;
64 /** 65 /**
65 * 付款订单数 66 * 付款订单数
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java
1 package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import com.baomidou.mybatisplus.annotation.IdType;  
5 -import com.baomidou.mybatisplus.annotation.TableField;  
6 -import com.baomidou.mybatisplus.annotation.TableId;  
7 -import com.baomidou.mybatisplus.annotation.TableName; 4 +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
  5 +import com.baomidou.mybatisplus.annotation.*;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
8 9
9 -import java.io.Serializable;  
10 -import java.math.BigDecimal;  
11 -import java.util.Date;  
12 import java.util.List; 10 import java.util.List;
13 11
14 -import lombok.Data;  
15 -  
16 /** 12 /**
17 * 秒杀参与商品 13 * 秒杀参与商品
18 * 14 *
19 * @author halfninety 15 * @author halfninety
20 * @TableName promotion_seckill_product 16 * @TableName promotion_seckill_product
21 */ 17 */
22 -@TableName(value = "promotion_seckill_product") 18 +@TableName(value = "promotion_seckill_product", autoResultMap = true)
  19 +@KeySequence("promotion_seckill_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
23 @Data 20 @Data
  21 +@EqualsAndHashCode(callSuper = true)
  22 +@ToString(callSuper = true)
24 public class SeckillProductDO extends BaseDO { 23 public class SeckillProductDO extends BaseDO {
25 /** 24 /**
26 * 秒杀参与商品编号 25 * 秒杀参与商品编号
@@ -36,6 +35,7 @@ public class SeckillProductDO extends BaseDO { @@ -36,6 +35,7 @@ public class SeckillProductDO extends BaseDO {
36 /** 35 /**
37 * 秒杀时段id 36 * 秒杀时段id
38 */ 37 */
  38 + @TableField(typeHandler = LongListTypeHandler.class)
39 private List<Long> timeIds; 39 private List<Long> timeIds;
40 40
41 /** 41 /**
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckilltime/SeckillTimeDO.java
@@ -4,7 +4,9 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -4,7 +4,9 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import com.baomidou.mybatisplus.annotation.KeySequence; 4 import com.baomidou.mybatisplus.annotation.KeySequence;
5 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
7 -import lombok.*; 7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.ToString;
8 10
9 import java.time.LocalTime; 11 import java.time.LocalTime;
10 12
@@ -18,9 +20,6 @@ import java.time.LocalTime; @@ -18,9 +20,6 @@ import java.time.LocalTime;
18 @Data 20 @Data
19 @EqualsAndHashCode(callSuper = true) 21 @EqualsAndHashCode(callSuper = true)
20 @ToString(callSuper = true) 22 @ToString(callSuper = true)
21 -@Builder  
22 -@NoArgsConstructor  
23 -@AllArgsConstructor  
24 public class SeckillTimeDO extends BaseDO { 23 public class SeckillTimeDO extends BaseDO {
25 24
26 /** 25 /**
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java
1 package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity;
2 2
  3 +import cn.hutool.core.util.ObjectUtil;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -19,8 +20,7 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; { @@ -19,8 +20,7 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; {
19 .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) 20 .likeIfPresent(SeckillActivityDO::getName, reqVO.getName())
20 .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) 21 .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus())
21 .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) 22 .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime())
22 - .apply("FIND_IN_SET(" + reqVO.getTimeId() + ",time_id) > 0") 23 + .apply(ObjectUtil.isNotNull(reqVO.getTimeId()),"FIND_IN_SET(" + reqVO.getTimeId() + ",time_ids) > 0")
23 .orderByDesc(SeckillActivityDO::getId)); 24 .orderByDesc(SeckillActivityDO::getId));
24 } 25 }
25 -  
26 } 26 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java
1 package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; 5 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
  6 +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
5 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
6 8
7 import java.util.Collection; 9 import java.util.Collection;
@@ -23,4 +25,11 @@ public interface SeckillProductMapper extends BaseMapperX&lt;SeckillProductDO&gt; { @@ -23,4 +25,11 @@ public interface SeckillProductMapper extends BaseMapperX&lt;SeckillProductDO&gt; {
23 return selectList(SeckillProductDO::getSkuId, skuIds); 25 return selectList(SeckillProductDO::getSkuId, skuIds);
24 } 26 }
25 27
  28 + default void updateTimeIdsByActivityId(Long id, List<Long> timeIds) {
  29 + new LambdaUpdateChainWrapper<>(this)
  30 + .set(SeckillProductDO::getTimeIds, CollUtil.join(timeIds, ","))
  31 + .eq(SeckillProductDO::getActivityId, id)
  32 + .update();
  33 + }
  34 +
26 } 35 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java
1 package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime; 1 package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime;
2 2
3 -import cn.hutool.core.collection.CollUtil;  
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; 4 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
6 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -20,7 +19,7 @@ import java.util.List; @@ -20,7 +19,7 @@ import java.util.List;
20 public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> { 19 public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> {
21 20
22 default List<SeckillTimeDO> selectListByTime(LocalTime time) { 21 default List<SeckillTimeDO> selectListByTime(LocalTime time) {
23 - return selectList(SeckillTimeDO::getStartTime,SeckillTimeDO::getEndTime,time); 22 + return selectList(SeckillTimeDO::getStartTime, SeckillTimeDO::getEndTime, time);
24 } 23 }
25 24
26 default List<SeckillTimeDO> selectListByTime(LocalTime startTime, LocalTime endTime) { 25 default List<SeckillTimeDO> selectListByTime(LocalTime startTime, LocalTime endTime) {
@@ -29,25 +28,10 @@ public interface SeckillTimeMapper extends BaseMapperX&lt;SeckillTimeDO&gt; { @@ -29,25 +28,10 @@ public interface SeckillTimeMapper extends BaseMapperX&lt;SeckillTimeDO&gt; {
29 .le(SeckillTimeDO::getEndTime, endTime)); 28 .le(SeckillTimeDO::getEndTime, endTime));
30 } 29 }
31 30
32 - // TODO @halfninety:updateActivityCount + 和 -,可以执使用一个方法实现哈。多传递一个参数  
33 - default void sekillActivityCountAdd(Collection<Long> ids) {  
34 - if (CollUtil.isEmpty(ids)) {  
35 - return;  
36 - }  
37 - new LambdaUpdateChainWrapper<SeckillTimeDO>(this) 31 + default void updateActivityCount(Collection<Long> ids, String type, Integer count) {
  32 + new LambdaUpdateChainWrapper<>(this)
38 .in(SeckillTimeDO::getId, ids) 33 .in(SeckillTimeDO::getId, ids)
39 - .setSql("`seckill_activity_count` = `seckill_activity_count` + 1 ") 34 + .setSql("`seckill_activity_count` = `seckill_activity_count` " + type + count)
40 .update(); 35 .update();
41 } 36 }
42 -  
43 - default void sekillActivityCountReduce(Collection<Long> ids) {  
44 - if (CollUtil.isEmpty(ids)) {  
45 - return;  
46 - }  
47 - new LambdaUpdateChainWrapper<SeckillTimeDO>(this)  
48 - .in(SeckillTimeDO::getId, ids)  
49 - .setSql("`seckill_activity_count` = `seckill_activity_count` - 1 ")  
50 - .update();  
51 - }  
52 -  
53 } 37 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityServiceImpl.java
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 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.string.StrUtils;  
7 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityBaseVO; 6 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityBaseVO;
8 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; 7 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
9 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; 8 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
@@ -35,13 +34,10 @@ import static java.util.Arrays.asList; @@ -35,13 +34,10 @@ import static java.util.Arrays.asList;
35 @Service 34 @Service
36 @Validated 35 @Validated
37 public class SeckillActivityServiceImpl implements SeckillActivityService { 36 public class SeckillActivityServiceImpl implements SeckillActivityService {
38 - // TODO: 2022/12/2 halfninety 当前修改时忘记秒杀商品中的秒杀时段id的设置了;需要全部修改  
39 - // TODO: 2022/12/2 halfninety 将活动数量改为原来的商品数量  
40 @Resource 37 @Resource
41 private SeckillActivityMapper seckillActivityMapper; 38 private SeckillActivityMapper seckillActivityMapper;
42 @Resource 39 @Resource
43 private SeckillProductMapper seckillProductMapper; 40 private SeckillProductMapper seckillProductMapper;
44 -  
45 @Resource 41 @Resource
46 private SeckillTimeService seckillTimeService; 42 private SeckillTimeService seckillTimeService;
47 43
@@ -49,20 +45,18 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -49,20 +45,18 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
49 public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) { 45 public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) {
50 // 校验商品是否冲突 46 // 校验商品是否冲突
51 validateSeckillActivityProductConflicts(null, createReqVO.getProducts()); 47 validateSeckillActivityProductConflicts(null, createReqVO.getProducts());
52 -  
53 // 校验秒杀时段是否存在 48 // 校验秒杀时段是否存在
54 seckillTimeService.validateSeckillTimeExists(createReqVO.getTimeIds()); 49 seckillTimeService.validateSeckillTimeExists(createReqVO.getTimeIds());
  50 +
55 // 插入秒杀活动 51 // 插入秒杀活动
56 SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO) 52 SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO)
57 .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime())); 53 .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));
58 seckillActivityMapper.insert(seckillActivity); 54 seckillActivityMapper.insert(seckillActivity);
59 // 插入商品 55 // 插入商品
60 - List<SeckillProductDO> productDOS = SeckillActivityConvert.INSTANCE  
61 - .convertList(createReqVO.getProducts(),seckillActivity.getId(),seckillActivity.getTimeIds()); 56 + List<SeckillProductDO> productDOS = SeckillActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), seckillActivity);
62 seckillProductMapper.insertBatch(productDOS); 57 seckillProductMapper.insertBatch(productDOS);
63 -  
64 // 更新秒杀时段的秒杀活动数量 58 // 更新秒杀时段的秒杀活动数量
65 - seckillTimeService.sekillActivityCountAdd(createReqVO.getTimeIds()); 59 + seckillTimeService.sekillActivityCountIncr(createReqVO.getTimeIds());
66 return seckillActivity.getId(); 60 return seckillActivity.getId();
67 } 61 }
68 62
@@ -76,38 +70,36 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -76,38 +70,36 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
76 // 校验商品是否冲突 70 // 校验商品是否冲突
77 validateSeckillActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); 71 validateSeckillActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts());
78 72
79 - // 更新秒杀时段的秒杀活动数量  
80 - updateSeckillTimeActivityCount(seckillActivity, updateReqVO.getTimeIds());  
81 // 更新活动 73 // 更新活动
82 SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO) 74 SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO)
83 .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); 75 .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime()));
84 seckillActivityMapper.updateById(updateObj); 76 seckillActivityMapper.updateById(updateObj);
85 // 更新商品 77 // 更新商品
86 updateSeckillProduct(updateReqVO); 78 updateSeckillProduct(updateReqVO);
  79 + // 更新秒杀时段的秒杀活动数量
  80 + updateSeckillTimeActivityCount(seckillActivity, updateReqVO.getTimeIds());
87 } 81 }
88 82
89 - // TODO @halfninety:注释写全哈;  
90 83
91 /** 84 /**
92 * 更新秒杀时段的秒杀活动数量 85 * 更新秒杀时段的秒杀活动数量
93 * 86 *
94 * @param seckillActivity 查询出的秒杀活动 87 * @param seckillActivity 查询出的秒杀活动
95 - * @param updateTimeIds 更新后的秒杀时段id列表 88 + * @param updateTimeIds 更新后的秒杀时段id列表
96 */ 89 */
97 private void updateSeckillTimeActivityCount(SeckillActivityDO seckillActivity, List<Long> updateTimeIds) { 90 private void updateSeckillTimeActivityCount(SeckillActivityDO seckillActivity, List<Long> updateTimeIds) {
98 // 查询出 timeIds 91 // 查询出 timeIds
99 List<Long> existsTimeIds = seckillActivity.getTimeIds(); 92 List<Long> existsTimeIds = seckillActivity.getTimeIds();
100 // 需要减少的时间段 93 // 需要减少的时间段
101 - // TODO @halfninety:可以使用 CollUtil.filterNew()  
102 Collection<Long> reduceIds = CollUtil.filterNew(existsTimeIds, existsTimeId -> !updateTimeIds.contains(existsTimeId)); 94 Collection<Long> reduceIds = CollUtil.filterNew(existsTimeIds, existsTimeId -> !updateTimeIds.contains(existsTimeId));
103 // 需要添加的时间段 95 // 需要添加的时间段
104 updateTimeIds.removeIf(existsTimeIds::contains); 96 updateTimeIds.removeIf(existsTimeIds::contains);
105 // 更新减少时间段和增加时间段 97 // 更新减少时间段和增加时间段
106 if (CollUtil.isNotEmpty(updateTimeIds)) { 98 if (CollUtil.isNotEmpty(updateTimeIds)) {
107 - seckillTimeService.sekillActivityCountAdd(updateTimeIds); 99 + seckillTimeService.sekillActivityCountIncr(updateTimeIds);
108 } 100 }
109 if (CollUtil.isNotEmpty(reduceIds)) { 101 if (CollUtil.isNotEmpty(reduceIds)) {
110 - seckillTimeService.sekillActivityCountReduce(reduceIds); 102 + seckillTimeService.sekillActivityCountDecr(reduceIds);
111 } 103 }
112 } 104 }
113 105
@@ -116,6 +108,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -116,6 +108,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
116 * 后台查出的数据和前台查出的数据进行遍历, 108 * 后台查出的数据和前台查出的数据进行遍历,
117 * 1. 对前台数据进行遍历:如果不存在于后台的 sku 中需要新增 109 * 1. 对前台数据进行遍历:如果不存在于后台的 sku 中需要新增
118 * 2. 对后台数据进行遍历:如果不存在于前台的 sku 中需要删除 110 * 2. 对后台数据进行遍历:如果不存在于前台的 sku 中需要删除
  111 + * 3. 最后对当前活动商品全部更新,更新秒杀时段id列表
  112 + *
  113 + * @param updateReqVO 更新的请求VO
119 */ 114 */
120 private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) { 115 private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) {
121 List<SeckillProductDO> seckillProductDOS = seckillProductMapper.selectListByActivityId(updateReqVO.getId()); 116 List<SeckillProductDO> seckillProductDOS = seckillProductMapper.selectListByActivityId(updateReqVO.getId());
@@ -137,6 +132,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -137,6 +132,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
137 if (CollUtil.isNotEmpty(newSeckillProductDOs)) { 132 if (CollUtil.isNotEmpty(newSeckillProductDOs)) {
138 seckillProductMapper.insertBatch(newSeckillProductDOs); 133 seckillProductMapper.insertBatch(newSeckillProductDOs);
139 } 134 }
  135 +
  136 + //全量更新当前活动商品的秒杀时段id列表(timeIds)
  137 + seckillProductMapper.updateTimeIdsByActivityId(updateReqVO.getId(), updateReqVO.getTimeIds());
140 } 138 }
141 139
142 /** 140 /**
@@ -192,7 +190,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -192,7 +190,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
192 throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END); 190 throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END);
193 } 191 }
194 // 更新秒杀时段的秒杀活动数量 192 // 更新秒杀时段的秒杀活动数量
195 - seckillTimeService.sekillActivityCountReduce(seckillActivity.getTimeIds()); 193 + seckillTimeService.sekillActivityCountDecr(seckillActivity.getTimeIds());
196 // 删除 194 // 删除
197 seckillActivityMapper.deleteById(id); 195 seckillActivityMapper.deleteById(id);
198 } 196 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeService.java
@@ -64,7 +64,7 @@ public interface SeckillTimeService { @@ -64,7 +64,7 @@ public interface SeckillTimeService {
64 * 64 *
65 * @param ids 秒杀时段id列表 65 * @param ids 秒杀时段id列表
66 */ 66 */
67 - void sekillActivityCountAdd(Collection<Long> ids); 67 + void sekillActivityCountIncr(Collection<Long> ids);
68 68
69 69
70 /** 70 /**
@@ -72,5 +72,5 @@ public interface SeckillTimeService { @@ -72,5 +72,5 @@ public interface SeckillTimeService {
72 * 72 *
73 * @param ids 秒杀时段id列表 73 * @param ids 秒杀时段id列表
74 */ 74 */
75 - void sekillActivityCountReduce(Collection<Long> ids); 75 + void sekillActivityCountDecr(Collection<Long> ids);
76 } 76 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeServiceImpl.java
@@ -104,22 +104,21 @@ public class SeckillTimeServiceImpl implements SeckillTimeService { @@ -104,22 +104,21 @@ public class SeckillTimeServiceImpl implements SeckillTimeService {
104 @Override 104 @Override
105 public void validateSeckillTimeExists(Collection<Long> timeIds) { 105 public void validateSeckillTimeExists(Collection<Long> timeIds) {
106 if (CollUtil.isEmpty(timeIds)) { 106 if (CollUtil.isEmpty(timeIds)) {
107 - return; 107 + throw exception(SECKILL_TIME_NOT_EXISTS);
108 } 108 }
109 if (seckillTimeMapper.selectBatchIds(timeIds).size() != timeIds.size()) { 109 if (seckillTimeMapper.selectBatchIds(timeIds).size() != timeIds.size()) {
110 throw exception(SECKILL_TIME_NOT_EXISTS); 110 throw exception(SECKILL_TIME_NOT_EXISTS);
111 } 111 }
112 } 112 }
113 113
114 - // TODO @halfninety:updateActivityCount + 和 -,可以执使用一个方法实现哈。多传递一个参数  
115 @Override 114 @Override
116 - public void sekillActivityCountAdd(Collection<Long> ids) {  
117 - seckillTimeMapper.sekillActivityCountAdd(ids); 115 + public void sekillActivityCountIncr(Collection<Long> ids) {
  116 + seckillTimeMapper.updateActivityCount(ids, "+", 1);
118 } 117 }
119 118
120 @Override 119 @Override
121 - public void sekillActivityCountReduce(Collection<Long> ids) {  
122 - seckillTimeMapper.sekillActivityCountReduce(ids); 120 + public void sekillActivityCountDecr(Collection<Long> ids) {
  121 + seckillTimeMapper.updateActivityCount(ids, "-", 1);
123 } 122 }
124 123
125 } 124 }
yudao-ui-admin/src/views/mall/promotion/seckill/seckillActivity/index.vue
@@ -51,10 +51,10 @@ @@ -51,10 +51,10 @@
51 <dict-tag :type="DICT_TYPE.PROMOTION_ACTIVITY_STATUS" :value="scope.row.status" /> 51 <dict-tag :type="DICT_TYPE.PROMOTION_ACTIVITY_STATUS" :value="scope.row.status" />
52 </template> 52 </template>
53 </el-table-column> 53 </el-table-column>
54 - <el-table-column label="参与场次" prop="timeId" width="250"> 54 + <el-table-column label="参与场次" prop="timeIds" width="250">
55 <template slot-scope="scope"> 55 <template slot-scope="scope">
56 <span v-for="item in seckillTimeList" :key="item.id" 56 <span v-for="item in seckillTimeList" :key="item.id"
57 - v-if="scope.row.timeId.indexOf(item.id) !== -1"> 57 + v-if="scope.row.timeIds.includes(item.id)">
58 <el-tag style="margin:4px;" size="small">{{ item.name }}</el-tag> 58 <el-tag style="margin:4px;" size="small">{{ item.name }}</el-tag>
59 </span> 59 </span>
60 </template> 60 </template>
@@ -107,7 +107,7 @@ @@ -107,7 +107,7 @@
107 <el-input type="textarea" v-model="form.remark" placeholder="请输入备注" /> 107 <el-input type="textarea" v-model="form.remark" placeholder="请输入备注" />
108 </el-form-item> 108 </el-form-item>
109 <el-form-item label="场次选择"> 109 <el-form-item label="场次选择">
110 - <el-select v-model="form.timeId" placeholder="请选择参与场次" clearable size="small" multiple filterable 110 + <el-select v-model="form.timeIds" placeholder="请选择参与场次" clearable size="small" multiple filterable
111 style="width: 880px"> 111 style="width: 880px">
112 <el-option v-for="item in seckillTimeList" :key="item.id" :label="item.name" :value="item.id"> 112 <el-option v-for="item in seckillTimeList" :key="item.id" :label="item.name" :value="item.id">
113 <span style="float: left">{{ item.name + ': { ' }} {{ item.startTime }} -- {{ item.endTime + 113 <span style="float: left">{{ item.name + ': { ' }} {{ item.startTime }} -- {{ item.endTime +
@@ -186,7 +186,7 @@ @@ -186,7 +186,7 @@
186 186
187 <script> 187 <script>
188 import { getSkuOptionList } from "@/api/mall/product/sku"; 188 import { getSkuOptionList } from "@/api/mall/product/sku";
189 -import { createSeckillActivity, updateSeckillActivity, closeSeckillActivity,deleteSeckillActivity, getSeckillActivity, getSeckillActivityPage, exportSeckillActivityExcel } from "@/api/mall/promotion/seckillActivity"; 189 +import { createSeckillActivity, updateSeckillActivity, closeSeckillActivity, deleteSeckillActivity, getSeckillActivity, getSeckillActivityPage, exportSeckillActivityExcel } from "@/api/mall/promotion/seckillActivity";
190 import { getSeckillTimeList } from "@/api/mall/promotion/seckillTime"; 190 import { getSeckillTimeList } from "@/api/mall/promotion/seckillTime";
191 import { deepClone } from "@/utils"; 191 import { deepClone } from "@/utils";
192 192
@@ -223,7 +223,7 @@ export default { @@ -223,7 +223,7 @@ export default {
223 form: { 223 form: {
224 skuIds: [], // 选中的 SKU 224 skuIds: [], // 选中的 SKU
225 products: [], // 商品信息 225 products: [], // 商品信息
226 - timeId: [], //选中的秒杀场次id 226 + timeIds: [], //选中的秒杀场次id
227 }, 227 },
228 // 商品 SKU 列表 228 // 商品 SKU 列表
229 productSkus: [], 229 productSkus: [],
@@ -233,7 +233,7 @@ export default { @@ -233,7 +233,7 @@ export default {
233 status: [{ required: true, message: "活动状态不能为空", trigger: "blur" }], 233 status: [{ required: true, message: "活动状态不能为空", trigger: "blur" }],
234 startAndEndTime: [{ required: true, message: "活动时间不能为空", trigger: "blur" }], 234 startAndEndTime: [{ required: true, message: "活动时间不能为空", trigger: "blur" }],
235 sort: [{ required: true, message: "排序不能为空", trigger: "blur" }], 235 sort: [{ required: true, message: "排序不能为空", trigger: "blur" }],
236 - timeId: [{ required: true, message: "秒杀场次不能为空", trigger: "blur" }], 236 + timeIds: [{ required: true, message: "秒杀场次不能为空", trigger: "blur" }],
237 totalPrice: [{ required: true, message: "订单实付金额,单位:分不能为空", trigger: "blur" }], 237 totalPrice: [{ required: true, message: "订单实付金额,单位:分不能为空", trigger: "blur" }],
238 } 238 }
239 }; 239 };
@@ -241,12 +241,13 @@ export default { @@ -241,12 +241,13 @@ export default {
241 created() { 241 created() {
242 this.getList(); 242 this.getList();
243 }, 243 },
244 - watch:{ 244 + watch: {
245 $route: 'getList' 245 $route: 'getList'
246 }, 246 },
247 methods: { 247 methods: {
248 /** 查询列表 */ 248 /** 查询列表 */
249 getList() { 249 getList() {
  250 + // 从秒杀时段跳转过来并鞋带timeId参数进行查询
250 const timeId = this.$route.params && this.$route.params.timeId; 251 const timeId = this.$route.params && this.$route.params.timeId;
251 if (timeId) { 252 if (timeId) {
252 this.queryParams.timeId = timeId 253 this.queryParams.timeId = timeId
@@ -254,11 +255,13 @@ export default { @@ -254,11 +255,13 @@ export default {
254 this.loading = true; 255 this.loading = true;
255 // 执行查询 256 // 执行查询
256 getSeckillActivityPage(this.queryParams).then(response => { 257 getSeckillActivityPage(this.queryParams).then(response => {
  258 + console.log(response.data.list, "查询出的值");
257 this.list = response.data.list; 259 this.list = response.data.list;
258 this.total = response.data.total; 260 this.total = response.data.total;
259 this.loading = false; 261 this.loading = false;
260 }); 262 });
261 if (timeId) { 263 if (timeId) {
  264 + //查询完成后设置为空
262 this.$route.params.timeId = undefined 265 this.$route.params.timeId = undefined
263 } 266 }
264 // 获得 SKU 商品列表 267 // 获得 SKU 商品列表
@@ -285,7 +288,7 @@ export default { @@ -285,7 +288,7 @@ export default {
285 startTime: undefined, 288 startTime: undefined,
286 endTime: undefined, 289 endTime: undefined,
287 sort: undefined, 290 sort: undefined,
288 - timeId: [], 291 + timeIds: [],
289 totalPrice: undefined, 292 totalPrice: undefined,
290 skuIds: [], 293 skuIds: [],
291 products: [], 294 products: [],
@@ -317,11 +320,9 @@ export default { @@ -317,11 +320,9 @@ export default {
317 this.reset(); 320 this.reset();
318 const id = row.id; 321 const id = row.id;
319 getSeckillActivity(id).then(response => { 322 getSeckillActivity(id).then(response => {
320 - var timeIdList = response.data.timeId.split(',')  
321 this.form = response.data; 323 this.form = response.data;
322 // 修改数据 324 // 修改数据
323 this.form.startAndEndTime = [response.data.startTime, response.data.endTime]; 325 this.form.startAndEndTime = [response.data.startTime, response.data.endTime];
324 - this.form.timeId = timeIdList.map(item => parseInt(item))  
325 this.form.skuIds = response.data.products.map(item => item.skuId); 326 this.form.skuIds = response.data.products.map(item => item.skuId);
326 this.form.products.forEach(product => { 327 this.form.products.forEach(product => {
327 // 获得对应的 SKU 信息 328 // 获得对应的 SKU 信息
@@ -334,7 +335,7 @@ export default { @@ -334,7 +335,7 @@ export default {
334 product.spuName = sku.spuName; 335 product.spuName = sku.spuName;
335 product.price = sku.price; 336 product.price = sku.price;
336 product.productStock = sku.stock; 337 product.productStock = sku.stock;
337 - this.$set(product,'seckillStock',product.stock); 338 + this.$set(product, 'seckillStock', product.stock);
338 product.seckillPrice = product.seckillPrice !== undefined ? product.seckillPrice / 100 : undefined; 339 product.seckillPrice = product.seckillPrice !== undefined ? product.seckillPrice / 100 : undefined;
339 340
340 }); 341 });
@@ -353,7 +354,6 @@ export default { @@ -353,7 +354,6 @@ export default {
353 const data = deepClone(this.form); 354 const data = deepClone(this.form);
354 data.startTime = this.form.startAndEndTime[0]; 355 data.startTime = this.form.startAndEndTime[0];
355 data.endTime = this.form.startAndEndTime[1]; 356 data.endTime = this.form.startAndEndTime[1];
356 - data.timeId = data.timeId.toString();  
357 data.products.forEach(product => { 357 data.products.forEach(product => {
358 product.stock = product.seckillStock; 358 product.stock = product.seckillStock;
359 product.seckillPrice = product.seckillPrice !== undefined ? product.seckillPrice * 100 : undefined; 359 product.seckillPrice = product.seckillPrice !== undefined ? product.seckillPrice * 100 : undefined;