Commit f9b4874ee9bf459cf8b88b5bf40377445d142d1a

Authored by 芋道源码
Committed by Gitee
2 parents 4a2cb33c 9384ba0d

!320 秒杀活动相关

Merge pull request !320 from halfninety/feature/1.8.0-uniapp
Showing 32 changed files with 241 additions and 285 deletions
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.mybatis.core.mapper; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.mybatis.core.mapper;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; 6 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
6 import com.baomidou.mybatisplus.core.conditions.Wrapper; 7 import com.baomidou.mybatisplus.core.conditions.Wrapper;
7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 8 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -75,9 +76,13 @@ public interface BaseMapperX<T> extends BaseMapper<T> { @@ -75,9 +76,13 @@ public interface BaseMapperX<T> extends BaseMapper<T> {
75 return selectList(new LambdaQueryWrapper<T>().in(field, values)); 76 return selectList(new LambdaQueryWrapper<T>().in(field, values));
76 } 77 }
77 78
  79 + default List<T> selectList(SFunction<T, ?> leField, SFunction<T, ?> geField, Object value) {
  80 + return selectList(new LambdaQueryWrapper<T>().le(leField, value).ge(geField, value));
  81 + }
  82 +
78 /** 83 /**
79 * 逐条插入,适合少量数据插入,或者对性能要求不高的场景 84 * 逐条插入,适合少量数据插入,或者对性能要求不高的场景
80 - * 85 + * <p>
81 * 如果大量,请使用 {@link com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveBatch(Collection)} 方法 86 * 如果大量,请使用 {@link com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveBatch(Collection)} 方法
82 * 使用示例,可见 RoleMenuBatchInsertMapper、UserRoleBatchInsertMapper 类 87 * 使用示例,可见 RoleMenuBatchInsertMapper、UserRoleBatchInsertMapper 类
83 * 88 *
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/SeckillActivityController.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/SeckillActivityController.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.*; 5 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.*;
6 import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert; 6 import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert;
7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/SeckillTimeController.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/SeckillTimeController.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO;  
5 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeRespVO;  
6 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; 4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeRespVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
7 import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert; 7 import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert;
8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
9 import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeService; 9 import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeService;
@@ -20,7 +20,6 @@ import java.util.List; @@ -20,7 +20,6 @@ import java.util.List;
20 20
21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
22 22
23 -// TODO @halfninety:controller 可以都放在 seckill 包下;vo 下分成 actvity 和 time  
24 @Api(tags = "管理后台 - 秒杀时段") 23 @Api(tags = "管理后台 - 秒杀时段")
25 @RestController 24 @RestController
26 @RequestMapping("/promotion/seckill-time") 25 @RequestMapping("/promotion/seckill-time")
@@ -65,20 +64,9 @@ public class SeckillTimeController { @@ -65,20 +64,9 @@ public class SeckillTimeController {
65 64
66 @GetMapping("/list") 65 @GetMapping("/list")
67 @ApiOperation("获得所有秒杀时段列表") 66 @ApiOperation("获得所有秒杀时段列表")
68 -// @PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')")  
69 - // TODO @halfninety:权限为啥注释掉呀? 67 + @PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')")
70 public CommonResult<List<SeckillTimeRespVO>> getSeckillTimeList() { 68 public CommonResult<List<SeckillTimeRespVO>> getSeckillTimeList() {
71 List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList(); 69 List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList();
72 return success(SeckillTimeConvert.INSTANCE.convertList(list)); 70 return success(SeckillTimeConvert.INSTANCE.convertList(list));
73 } 71 }
74 -  
75 - // TODO @halfninety:不用的,可以删除掉  
76 -// @GetMapping("/page")  
77 -// @ApiOperation("获得秒杀时段分页")  
78 -// @PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')")  
79 -// public CommonResult<PageResult<SeckillTimeRespVO>> getSeckillTimePage(@Valid SeckillTimePageReqVO pageVO) {  
80 -// PageResult<SeckillTimeDO> pageResult = seckillTimeService.getSeckillTimePage(pageVO);  
81 -// return success(SeckillTimeConvert.INSTANCE.convertPage(pageResult));  
82 -// }  
83 -  
84 } 72 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeSimpleRespVO.java deleted
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo;  
2 -  
3 -public class SeckillTimeSimpleRespVO {  
4 -}  
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityBaseVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityBaseVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
3 import com.fasterxml.jackson.annotation.JsonFormat; 3 import com.fasterxml.jackson.annotation.JsonFormat;
4 import io.swagger.annotations.ApiModel; 4 import io.swagger.annotations.ApiModel;
@@ -14,9 +14,9 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -14,9 +14,9 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
14 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; 14 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;
15 15
16 /** 16 /**
17 -* 秒杀活动 Base VO,提供给添加、修改、详细的子 VO 使用  
18 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成  
19 -*/ 17 + * 秒杀活动 Base VO,提供给添加、修改、详细的子 VO 使用
  18 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  19 + */
20 @Data 20 @Data
21 public class SeckillActivityBaseVO { 21 public class SeckillActivityBaseVO {
22 22
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityCreateReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityCreateReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
@@ -7,12 +7,10 @@ import lombok.EqualsAndHashCode; @@ -7,12 +7,10 @@ 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;
14 13
15 -// TODO halfninety:检查下所有的 VO,需要保证 example 都写了哈。  
16 @ApiModel("管理后台 - 秒杀活动创建 Request VO") 14 @ApiModel("管理后台 - 秒杀活动创建 Request VO")
17 @Data 15 @Data
18 @EqualsAndHashCode(callSuper = true) 16 @EqualsAndHashCode(callSuper = true)
@@ -22,14 +20,13 @@ public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO { @@ -22,14 +20,13 @@ public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO {
22 @ApiModelProperty(value = "备注", example = "限时秒杀活动") 20 @ApiModelProperty(value = "备注", example = "限时秒杀活动")
23 private String remark; 21 private String remark;
24 22
25 - @ApiModelProperty(value = "排序", required = true) 23 + @ApiModelProperty(value = "排序", required = true, example = "1")
26 @NotNull(message = "排序不能为空") 24 @NotNull(message = "排序不能为空")
27 private Integer sort; 25 private Integer sort;
28 26
29 - // TODO halfninety:直接使用数组接口。timeIds,  
30 - @ApiModelProperty(value = "秒杀时段id", required = true)  
31 - @NotBlank(message = "参与场次不能为空")  
32 - private String timeId; 27 + @ApiModelProperty(value = "秒杀时段id", required = true, example = "1,3")
  28 + @NotEmpty(message = "参与场次不能为空")
  29 + private List<Long> timeIds;
33 30
34 /** 31 /**
35 * 商品列表 32 * 商品列表
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityDetailRespVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityDetailRespVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import lombok.Data; 4 import lombok.Data;
@@ -11,7 +11,7 @@ import java.util.List; @@ -11,7 +11,7 @@ import java.util.List;
11 @Data 11 @Data
12 @EqualsAndHashCode(callSuper = true) 12 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 13 @ToString(callSuper = true)
14 -public class SeckillActivityDetailRespVO extends SeckillActivityRespVO{ 14 +public class SeckillActivityDetailRespVO extends SeckillActivityRespVO {
15 15
16 /** 16 /**
17 * 商品列表 17 * 商品列表
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityPageReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityPageReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import com.fasterxml.jackson.annotation.JsonFormat; 4 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -26,8 +26,8 @@ public class SeckillActivityPageReqVO extends PageParam { @@ -26,8 +26,8 @@ public class SeckillActivityPageReqVO extends PageParam {
26 @ApiModelProperty(value = "活动状态", example = "进行中") 26 @ApiModelProperty(value = "活动状态", example = "进行中")
27 private Integer status; 27 private Integer status;
28 28
29 - @ApiModelProperty(value = "秒杀时段id")  
30 - private String timeId; 29 + @ApiModelProperty(value = "秒杀时段id", example = "1")
  30 + private Long timeId;
31 31
32 @ApiModelProperty(value = "创建时间") 32 @ApiModelProperty(value = "创建时间")
33 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 33 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityRespVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityRespVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
@@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode; @@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
7 import lombok.ToString; 7 import lombok.ToString;
8 8
9 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
  10 +import java.util.List;
10 11
11 @ApiModel("管理后台 - 秒杀活动 Response VO") 12 @ApiModel("管理后台 - 秒杀活动 Response VO")
12 @Data 13 @Data
@@ -14,22 +15,22 @@ import java.time.LocalDateTime; @@ -14,22 +15,22 @@ import java.time.LocalDateTime;
14 @ToString(callSuper = true) 15 @ToString(callSuper = true)
15 public class SeckillActivityRespVO extends SeckillActivityBaseVO { 16 public class SeckillActivityRespVO extends SeckillActivityBaseVO {
16 17
17 - @ApiModelProperty(value = "秒杀活动id", required = true, example = "1") 18 + @ApiModelProperty(value = "秒杀活动id", required = true, example = "1")
18 private Long id; 19 private Long id;
19 20
20 - @ApiModelProperty(value = "付款订单数", required = true) 21 + @ApiModelProperty(value = "付款订单数", required = true, example = "1")
21 private Integer orderCount; 22 private Integer orderCount;
22 23
23 - @ApiModelProperty(value = "付款人数", required = true) 24 + @ApiModelProperty(value = "付款人数", required = true, example = "1")
24 private Integer userCount; 25 private Integer userCount;
25 26
26 @ApiModelProperty(value = "创建时间", required = true) 27 @ApiModelProperty(value = "创建时间", required = true)
27 private LocalDateTime createTime; 28 private LocalDateTime createTime;
28 29
29 - @ApiModelProperty(value = "秒杀时段id", required = true)  
30 - private String timeId; 30 + @ApiModelProperty(value = "秒杀时段id", required = true, example = "1,3")
  31 + private List<Long> timeIds;
31 32
32 - @ApiModelProperty(value = "排序", required = true) 33 + @ApiModelProperty(value = "排序", required = true, example = "1")
33 private Integer sort; 34 private Integer sort;
34 35
35 @ApiModelProperty(value = "备注", example = "限时秒杀活动") 36 @ApiModelProperty(value = "备注", example = "限时秒杀活动")
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityUpdateReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityUpdateReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
@@ -24,13 +24,13 @@ public class SeckillActivityUpdateReqVO extends SeckillActivityBaseVO { @@ -24,13 +24,13 @@ public class SeckillActivityUpdateReqVO extends SeckillActivityBaseVO {
24 @ApiModelProperty(value = "备注", example = "限时秒杀活动") 24 @ApiModelProperty(value = "备注", example = "限时秒杀活动")
25 private String remark; 25 private String remark;
26 26
27 - @ApiModelProperty(value = "排序", required = true) 27 + @ApiModelProperty(value = "排序", required = true, example = "1")
28 @NotNull(message = "排序不能为空") 28 @NotNull(message = "排序不能为空")
29 private Integer sort; 29 private Integer sort;
30 30
31 - @ApiModelProperty(value = "秒杀时段id", required = true)  
32 - @NotNull(message = "秒杀时段id不能为空")  
33 - private String timeId; 31 + @ApiModelProperty(value = "秒杀时段id", required = true, example = "1,3")
  32 + @NotEmpty(message = "秒杀时段id不能为空")
  33 + private List<Long> timeIds;
34 34
35 /** 35 /**
36 * 商品列表 36 * 商品列表
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeBaseVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimeBaseVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
2 2
3 -import lombok.*; 3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
4 5
  6 +import javax.validation.constraints.NotNull;
5 import java.time.LocalTime; 7 import java.time.LocalTime;
6 -import java.util.*;  
7 -import io.swagger.annotations.*;  
8 -import javax.validation.constraints.*;  
9 -import org.springframework.format.annotation.DateTimeFormat;  
10 -  
11 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
12 8
13 /** 9 /**
14 -* 秒杀时段 Base VO,提供给添加、修改、详细的子 VO 使用  
15 -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成  
16 -*/ 10 + * 秒杀时段 Base VO,提供给添加、修改、详细的子 VO 使用
  11 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  12 + */
17 @Data 13 @Data
18 public class SeckillTimeBaseVO { 14 public class SeckillTimeBaseVO {
19 15
20 - @ApiModelProperty(value = "秒杀时段名称", required = true) 16 + @ApiModelProperty(value = "秒杀时段名称", required = true, example = "上午场")
21 @NotNull(message = "秒杀时段名称不能为空") 17 @NotNull(message = "秒杀时段名称不能为空")
22 private String name; 18 private String name;
23 19
24 - @ApiModelProperty(value = "开始时间点", required = true) 20 + @ApiModelProperty(value = "开始时间点", required = true, example = "16:30:40")
25 @NotNull(message = "开始时间点不能为空") 21 @NotNull(message = "开始时间点不能为空")
26 private LocalTime startTime; 22 private LocalTime startTime;
27 23
28 - @ApiModelProperty(value = "结束时间点", required = true) 24 + @ApiModelProperty(value = "结束时间点", required = true, example = "16:30:40")
29 @NotNull(message = "结束时间点不能为空") 25 @NotNull(message = "结束时间点不能为空")
30 private LocalTime endTime; 26 private LocalTime endTime;
31 27
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeCreateReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimeCreateReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
2 2
3 import lombok.*; 3 import lombok.*;
4 import io.swagger.annotations.*; 4 import io.swagger.annotations.*;
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimePageReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimePageReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.annotations.ApiModel; 4 import io.swagger.annotations.ApiModel;
@@ -16,25 +16,15 @@ import java.time.LocalTime; @@ -16,25 +16,15 @@ import java.time.LocalTime;
16 @ToString(callSuper = true) 16 @ToString(callSuper = true)
17 public class SeckillTimePageReqVO extends PageParam { 17 public class SeckillTimePageReqVO extends PageParam {
18 18
19 - @ApiModelProperty(value = "秒杀时段名称") 19 + @ApiModelProperty(value = "秒杀时段名称", example = "上午场")
20 private String name; 20 private String name;
21 21
22 - @ApiModelProperty(value = "开始时间点") 22 + @ApiModelProperty(value = "开始时间点", example = "16:30:40")
23 @DateTimeFormat(pattern = "HH:mm:ss") 23 @DateTimeFormat(pattern = "HH:mm:ss")
24 private LocalTime startTime; 24 private LocalTime startTime;
25 25
26 - @ApiModelProperty(value = "结束时间点") 26 + @ApiModelProperty(value = "结束时间点", example = "16:30:40")
27 @DateTimeFormat(pattern = "HH:mm:ss") 27 @DateTimeFormat(pattern = "HH:mm:ss")
28 private LocalTime endTime; 28 private LocalTime endTime;
29 29
30 -  
31 -  
32 -  
33 -  
34 -  
35 -  
36 -// @ApiModelProperty(value = "创建时间")  
37 -// @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
38 -// private Date[] createTime;  
39 -  
40 } 30 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeRespVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimeRespVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
2 2
3 -import lombok.*;  
4 -import java.util.*;  
5 -import io.swagger.annotations.*; 3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import java.time.LocalDateTime;
6 10
7 @ApiModel("管理后台 - 秒杀时段 Response VO") 11 @ApiModel("管理后台 - 秒杀时段 Response VO")
8 @Data 12 @Data
@@ -10,13 +14,13 @@ import io.swagger.annotations.*; @@ -10,13 +14,13 @@ import io.swagger.annotations.*;
10 @ToString(callSuper = true) 14 @ToString(callSuper = true)
11 public class SeckillTimeRespVO extends SeckillTimeBaseVO { 15 public class SeckillTimeRespVO extends SeckillTimeBaseVO {
12 16
13 - @ApiModelProperty(value = "编号", required = true) 17 + @ApiModelProperty(value = "编号", required = true, example = "1")
14 private Long id; 18 private Long id;
15 19
16 - @ApiModelProperty(value = "秒杀活动数量", required = true) 20 + @ApiModelProperty(value = "秒杀活动数量", required = true, example = "1")
17 private Integer seckillActivityCount; 21 private Integer seckillActivityCount;
18 22
19 @ApiModelProperty(value = "创建时间", required = true) 23 @ApiModelProperty(value = "创建时间", required = true)
20 - private Date createTime; 24 + private LocalDateTime createTime;
21 25
22 } 26 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeUpdateReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimeUpdateReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
@@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull; @@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull;
14 @ToString(callSuper = true) 14 @ToString(callSuper = true)
15 public class SeckillTimeUpdateReqVO extends SeckillTimeBaseVO { 15 public class SeckillTimeUpdateReqVO extends SeckillTimeBaseVO {
16 16
17 - @ApiModelProperty(value = "编号", required = true) 17 + @ApiModelProperty(value = "编号", required = true, example = "1")
18 @NotNull(message = "编号不能为空") 18 @NotNull(message = "编号不能为空")
19 private Long id; 19 private Long id;
20 20
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java
@@ -2,7 +2,8 @@ package cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity; @@ -2,7 +2,8 @@ package cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity;
2 2
3 import cn.hutool.core.util.ObjectUtil; 3 import cn.hutool.core.util.ObjectUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.*; 5 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.*;
6 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
8 import org.mapstruct.Mapper; 9 import org.mapstruct.Mapper;
@@ -27,7 +28,7 @@ public interface SeckillActivityConvert { @@ -27,7 +28,7 @@ public interface SeckillActivityConvert {
27 28
28 SeckillActivityDO convert(SeckillActivityCreateReqVO bean); 29 SeckillActivityDO convert(SeckillActivityCreateReqVO bean);
29 30
30 - default String map(Long[] value){ 31 + default String map(Long[] value) {
31 return value.toString(); 32 return value.toString();
32 } 33 }
33 34
@@ -39,7 +40,7 @@ public interface SeckillActivityConvert { @@ -39,7 +40,7 @@ public interface SeckillActivityConvert {
39 40
40 PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page); 41 PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page);
41 42
42 - @Mappings({@Mapping(target = "products",source = "seckillProducts")}) 43 + @Mappings({@Mapping(target = "products", source = "seckillProducts")})
43 SeckillActivityDetailRespVO convert(SeckillActivityDO seckillActivity, List<SeckillProductDO> seckillProducts); 44 SeckillActivityDetailRespVO convert(SeckillActivityDO seckillActivity, List<SeckillProductDO> seckillProducts);
44 45
45 46
@@ -56,7 +57,6 @@ public interface SeckillActivityConvert { @@ -56,7 +57,6 @@ public interface SeckillActivityConvert {
56 && ObjectUtil.equals(productDO.getSeckillPrice(), productVO.getSeckillPrice()) 57 && ObjectUtil.equals(productDO.getSeckillPrice(), productVO.getSeckillPrice())
57 && ObjectUtil.equals(productDO.getStock(), productVO.getStock()) 58 && ObjectUtil.equals(productDO.getStock(), productVO.getStock())
58 && ObjectUtil.equals(productDO.getLimitBuyCount(), productVO.getLimitBuyCount()); 59 && ObjectUtil.equals(productDO.getLimitBuyCount(), productVO.getLimitBuyCount());
59 -  
60 } 60 }
61 61
62 /** 62 /**
@@ -74,4 +74,10 @@ public interface SeckillActivityConvert { @@ -74,4 +74,10 @@ public interface SeckillActivityConvert {
74 && ObjectUtil.equals(productDO.getLimitBuyCount(), productVO.getLimitBuyCount()); 74 && ObjectUtil.equals(productDO.getLimitBuyCount(), productVO.getLimitBuyCount());
75 75
76 } 76 }
  77 +
  78 + default List<SeckillProductDO> convertList(List<SeckillActivityBaseVO.Product> products, SeckillActivityDO seckillActivity) {
  79 + return CollectionUtils.convertList(products, product -> convert(product)
  80 + .setActivityId(seckillActivity.getId()).setTimeIds(seckillActivity.getTimeIds()));
  81 + }
  82 +
77 } 83 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckilltime/SeckillTimeConvert.java
@@ -4,9 +4,9 @@ import java.util.*; @@ -4,9 +4,9 @@ import java.util.*;
4 4
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6
7 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO;  
8 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeRespVO;  
9 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; 7 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeRespVO;
  9 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
10 import org.mapstruct.Mapper; 10 import org.mapstruct.Mapper;
11 import org.mapstruct.factory.Mappers; 11 import org.mapstruct.factory.Mappers;
12 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; 12 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
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;
  15 +import java.util.List;
12 16
13 /** 17 /**
14 * 秒杀活动 DO 18 * 秒杀活动 DO
15 * 19 *
16 - * @author 芋道源码 20 + * @author halfninety
17 */ 21 */
18 -@TableName("promotion_seckill_activity") 22 +@TableName(value = "promotion_seckill_activity", autoResultMap = true)
19 @KeySequence("promotion_seckill_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 23 @KeySequence("promotion_seckill_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
20 @Data 24 @Data
21 @EqualsAndHashCode(callSuper = true) 25 @EqualsAndHashCode(callSuper = true)
22 @ToString(callSuper = true) 26 @ToString(callSuper = true)
23 -@Builder  
24 -@NoArgsConstructor  
25 -@AllArgsConstructor  
26 public class SeckillActivityDO extends BaseDO { 27 public class SeckillActivityDO extends BaseDO {
27 28
28 /** 29 /**
@@ -36,7 +37,7 @@ public class SeckillActivityDO extends BaseDO { @@ -36,7 +37,7 @@ public class SeckillActivityDO extends BaseDO {
36 private String name; 37 private String name;
37 /** 38 /**
38 * 活动状态 39 * 活动状态
39 - * 40 + * <p>
40 * 枚举 {@link PromotionActivityStatusEnum 对应的类} 41 * 枚举 {@link PromotionActivityStatusEnum 对应的类}
41 */ 42 */
42 private Integer status; 43 private Integer status;
@@ -59,8 +60,8 @@ public class SeckillActivityDO extends BaseDO { @@ -59,8 +60,8 @@ public class SeckillActivityDO extends BaseDO {
59 /** 60 /**
60 * 秒杀时段 id 61 * 秒杀时段 id
61 */ 62 */
62 - // TODO @halfninety 可以使用 List 存储;看下别的模块怎么做的哈  
63 - private String timeId; 63 + @TableField(typeHandler = LongListTypeHandler.class)
  64 + private List<Long> timeIds;
64 /** 65 /**
65 * 付款订单数 66 * 付款订单数
66 */ 67 */
@@ -69,10 +70,9 @@ public class SeckillActivityDO extends BaseDO { @@ -69,10 +70,9 @@ public class SeckillActivityDO extends BaseDO {
69 * 付款人数 70 * 付款人数
70 */ 71 */
71 private Integer userCount; 72 private Integer userCount;
72 - // TODO @halfninety 使用 Long 哈。单位是分  
73 /** 73 /**
74 * 订单实付金额,单位:分 74 * 订单实付金额,单位:分
75 */ 75 */
76 - private BigDecimal totalPrice; 76 + private Long totalPrice;
77 77
78 } 78 }
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;  
8 -import java.io.Serializable;  
9 -import java.math.BigDecimal;  
10 -import java.util.Date; 4 +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
  5 +import com.baomidou.mybatisplus.annotation.*;
11 import lombok.Data; 6 import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +
  10 +import java.util.List;
12 11
13 /** 12 /**
14 * 秒杀参与商品 13 * 秒杀参与商品
  14 + *
  15 + * @author halfninety
15 * @TableName promotion_seckill_product 16 * @TableName promotion_seckill_product
16 */ 17 */
17 -@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 等数据库,可不写。
18 @Data 20 @Data
  21 +@EqualsAndHashCode(callSuper = true)
  22 +@ToString(callSuper = true)
19 public class SeckillProductDO extends BaseDO { 23 public class SeckillProductDO extends BaseDO {
20 /** 24 /**
21 * 秒杀参与商品编号 25 * 秒杀参与商品编号
@@ -31,7 +35,8 @@ public class SeckillProductDO extends BaseDO { @@ -31,7 +35,8 @@ public class SeckillProductDO extends BaseDO {
31 /** 35 /**
32 * 秒杀时段id 36 * 秒杀时段id
33 */ 37 */
34 - private Long timeId; 38 + @TableField(typeHandler = LongListTypeHandler.class)
  39 + private List<Long> timeIds;
35 40
36 /** 41 /**
37 * 商品id 42 * 商品id
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;
6 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityPageReqVO; 7 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
8 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
9 10
10 /** 11 /**
11 * 秒杀活动 Mapper 12 * 秒杀活动 Mapper
12 * 13 *
13 - * @author 芋道源码 14 + * @author halfninety
14 */ 15 */
15 @Mapper 16 @Mapper
16 public interface SeckillActivityMapper extends BaseMapperX<SeckillActivityDO> { 17 public interface SeckillActivityMapper extends BaseMapperX<SeckillActivityDO> {
17 -// TODO: 2022/11/28 halfninety 秒杀活动通过场次查询使用like会出现问题,查询活动场次编号为1,则活动场次编号为 1,11,......的都会被查出来  
18 default PageResult<SeckillActivityDO> selectPage(SeckillActivityPageReqVO reqVO) { 18 default PageResult<SeckillActivityDO> selectPage(SeckillActivityPageReqVO reqVO) {
19 return selectPage(reqVO, new LambdaQueryWrapperX<SeckillActivityDO>() 19 return selectPage(reqVO, new LambdaQueryWrapperX<SeckillActivityDO>()
20 .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) 20 .likeIfPresent(SeckillActivityDO::getName, reqVO.getName())
21 .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) 21 .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus())
22 - .likeIfPresent(SeckillActivityDO::getTimeId, reqVO.getTimeId())  
23 -// .like(StringUtils.hasText(reqVO.getTimeId()),SeckillActivityDO::getTimeId, reqVO.getTimeId() + ",")  
24 .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) 22 .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime())
  23 + .apply(ObjectUtil.isNotNull(reqVO.getTimeId()),"FIND_IN_SET(" + reqVO.getTimeId() + ",time_ids) > 0")
25 .orderByDesc(SeckillActivityDO::getId)); 24 .orderByDesc(SeckillActivityDO::getId));
26 } 25 }
27 -  
28 } 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;
8 import java.util.List; 10 import java.util.List;
9 11
  12 +/**
  13 + * 秒杀活动商品 Mapper
  14 + *
  15 + * @author halfninety
  16 + */
10 @Mapper 17 @Mapper
11 public interface SeckillProductMapper extends BaseMapperX<SeckillProductDO> { 18 public interface SeckillProductMapper extends BaseMapperX<SeckillProductDO> {
12 19
13 - default List<SeckillProductDO> selectListByActivityId(Long id){  
14 - return selectList(SeckillProductDO::getActivityId,id); 20 + default List<SeckillProductDO> selectListByActivityId(Long id) {
  21 + return selectList(SeckillProductDO::getActivityId, id);
15 } 22 }
16 23
17 - default List<SeckillProductDO> selectListBySkuIds(Collection<Long> skuIds){  
18 - return selectList(SeckillProductDO::getSkuId,skuIds); 24 + default List<SeckillProductDO> selectListBySkuIds(Collection<Long> skuIds) {
  25 + return selectList(SeckillProductDO::getSkuId, skuIds);
  26 + }
  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();
19 } 33 }
20 34
21 } 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;
@@ -8,59 +7,31 @@ import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWra @@ -8,59 +7,31 @@ import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWra
8 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
9 8
10 import java.time.LocalTime; 9 import java.time.LocalTime;
11 -import java.util.Collections; 10 +import java.util.Collection;
12 import java.util.List; 11 import java.util.List;
13 12
14 /** 13 /**
15 * 秒杀时段 Mapper 14 * 秒杀时段 Mapper
16 * 15 *
17 - * @author 芋道源码 16 + * @author halfninety
18 */ 17 */
19 @Mapper 18 @Mapper
20 public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> { 19 public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> {
21 20
22 - // @TODO halfninety:){ 之间要有空格哈  
23 - default List<SeckillTimeDO> selectListWithTime(LocalTime time){  
24 - // TODO @halfninety:mapper 层,不做空判断,业务上面自己的保证  
25 - if (time == null) {  
26 - return Collections.emptyList();  
27 - }  
28 - // TODO @halfninety:在 BaseMapperX 上,可以封装一个 2 个字段的检索哈  
29 - return selectList(new LambdaQueryWrapper<SeckillTimeDO>()  
30 - .le(SeckillTimeDO::getStartTime,time)  
31 - .ge(SeckillTimeDO::getEndTime,time)); 21 + default List<SeckillTimeDO> selectListByTime(LocalTime time) {
  22 + return selectList(SeckillTimeDO::getStartTime, SeckillTimeDO::getEndTime, time);
32 } 23 }
33 24
34 - // TODO @halfninety:selectListByXXX,使用 By 作为查询条件。  
35 - default List<SeckillTimeDO> selectListWithTime(LocalTime startTime, LocalTime endTime){  
36 - // TODO @halfninety:mapper 层,不做空判断,业务上面自己的保证  
37 - if (startTime == null && endTime == null) {  
38 - return Collections.emptyList();  
39 - } 25 + default List<SeckillTimeDO> selectListByTime(LocalTime startTime, LocalTime endTime) {
40 return selectList(new LambdaQueryWrapper<SeckillTimeDO>() 26 return selectList(new LambdaQueryWrapper<SeckillTimeDO>()
41 - .ge(SeckillTimeDO::getStartTime,startTime)  
42 - .le(SeckillTimeDO::getEndTime,endTime)); 27 + .ge(SeckillTimeDO::getStartTime, startTime)
  28 + .le(SeckillTimeDO::getEndTime, endTime));
43 } 29 }
44 30
45 - // TODO @halfninety:updateActivityCount + 和 -,可以执使用一个方法实现哈。多传递一个参数  
46 - default void sekillActivityCountAdd(List<Long> ids){  
47 - if (CollUtil.isEmpty(ids)){  
48 - return;  
49 - }  
50 - new LambdaUpdateChainWrapper<SeckillTimeDO>(this)  
51 - .in(SeckillTimeDO::getId,ids)  
52 - .setSql("`seckill_activity_count` = `seckill_activity_count` + 1 ") 31 + default void updateActivityCount(Collection<Long> ids, String type, Integer count) {
  32 + new LambdaUpdateChainWrapper<>(this)
  33 + .in(SeckillTimeDO::getId, ids)
  34 + .setSql("`seckill_activity_count` = `seckill_activity_count` " + type + count)
53 .update(); 35 .update();
54 } 36 }
55 -  
56 - default void sekillActivityCountReduce(List<Long> ids){  
57 - if (CollUtil.isEmpty(ids)){  
58 - return;  
59 - }  
60 - new LambdaUpdateChainWrapper<SeckillTimeDO>(this)  
61 - .in(SeckillTimeDO::getId,ids)  
62 - .setSql("`seckill_activity_count` = `seckill_activity_count` - 1 ")  
63 - .update();  
64 - }  
65 -  
66 } 37 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityService.java
@@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; @@ -3,9 +3,9 @@ package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity;
3 import java.util.*; 3 import java.util.*;
4 import javax.validation.*; 4 import javax.validation.*;
5 5
6 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityCreateReqVO;  
7 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityPageReqVO;  
8 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityUpdateReqVO; 6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
9 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 9 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
10 import cn.iocoder.yudao.framework.common.pojo.PageResult; 10 import cn.iocoder.yudao.framework.common.pojo.PageResult;
11 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; 11 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
@@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity. @@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.
13 /** 13 /**
14 * 秒杀活动 Service 接口 14 * 秒杀活动 Service 接口
15 * 15 *
16 - * @author 芋道源码 16 + * @author halfninety
17 */ 17 */
18 public interface SeckillActivityService { 18 public interface SeckillActivityService {
19 19
@@ -34,6 +34,7 @@ public interface SeckillActivityService { @@ -34,6 +34,7 @@ public interface SeckillActivityService {
34 34
35 /** 35 /**
36 * 关闭秒杀活动 36 * 关闭秒杀活动
  37 + *
37 * @param id 编号 38 * @param id 编号
38 */ 39 */
39 void closeSeckillActivity(Long id); 40 void closeSeckillActivity(Long id);
@@ -71,6 +72,7 @@ public interface SeckillActivityService { @@ -71,6 +72,7 @@ public interface SeckillActivityService {
71 72
72 /** 73 /**
73 * 通过活动编号获取活动商品 74 * 通过活动编号获取活动商品
  75 + *
74 * @param id 活动编号 76 * @param id 活动编号
75 * @return 活动商品列表 77 * @return 活动商品列表
76 */ 78 */
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityServiceImpl.java
@@ -3,11 +3,10 @@ package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; @@ -3,11 +3,10 @@ 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.seckillactivity.vo.SeckillActivityBaseVO;  
8 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityCreateReqVO;  
9 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityPageReqVO;  
10 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityUpdateReqVO; 6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityBaseVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
  9 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
11 import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert; 10 import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert;
12 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 11 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
13 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; 12 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
@@ -22,7 +21,6 @@ import org.springframework.validation.annotation.Validated; @@ -22,7 +21,6 @@ import org.springframework.validation.annotation.Validated;
22 import javax.annotation.Resource; 21 import javax.annotation.Resource;
23 import java.util.Collection; 22 import java.util.Collection;
24 import java.util.List; 23 import java.util.List;
25 -import java.util.stream.Collectors;  
26 24
27 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
28 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; 26 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
@@ -31,41 +29,34 @@ import static java.util.Arrays.asList; @@ -31,41 +29,34 @@ import static java.util.Arrays.asList;
31 /** 29 /**
32 * 秒杀活动 Service 实现类 30 * 秒杀活动 Service 实现类
33 * 31 *
34 - * @author 芋道源码 // TODO @halfninety:作者改成你自己哈 32 + * @author halfninety
35 */ 33 */
36 @Service 34 @Service
37 @Validated 35 @Validated
38 public class SeckillActivityServiceImpl implements SeckillActivityService { 36 public class SeckillActivityServiceImpl implements SeckillActivityService {
39 -  
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
48 @Override 44 @Override
49 public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) { 45 public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) {
50 - // TODO @halfninety:多余的变量,需要删除  
51 - List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus());  
52 // 校验商品是否冲突 46 // 校验商品是否冲突
53 validateSeckillActivityProductConflicts(null, createReqVO.getProducts()); 47 validateSeckillActivityProductConflicts(null, createReqVO.getProducts());
  48 + // 校验秒杀时段是否存在
  49 + seckillTimeService.validateSeckillTimeExists(createReqVO.getTimeIds());
54 50
55 - // TODO halfninety:要校验下,秒杀时间段存在  
56 // 插入秒杀活动 51 // 插入秒杀活动
57 SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO) 52 SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO)
58 .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime())); 53 .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));
59 seckillActivityMapper.insert(seckillActivity); 54 seckillActivityMapper.insert(seckillActivity);
60 // 插入商品 55 // 插入商品
61 - // TODO @halfninety:是不是写成一个 convertList,通过 default 来处理下;这样可读性更好哈  
62 - List<SeckillProductDO> productDOS = CollectionUtils.convertList(createReqVO.getProducts(),  
63 - product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(seckillActivity.getId())); 56 + List<SeckillProductDO> productDOS = SeckillActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), seckillActivity);
64 seckillProductMapper.insertBatch(productDOS); 57 seckillProductMapper.insertBatch(productDOS);
65 -  
66 - // TODO halfninety:最后在更新秒杀时间段的商品数量哈。【我已经改了】一般先做核心的逻辑,在做附件的逻辑。  
67 // 更新秒杀时段的秒杀活动数量 58 // 更新秒杀时段的秒杀活动数量
68 - seckillTimeService.sekillActivityCountAdd(StrUtils.splitToLong(createReqVO.getTimeId(),",")); 59 + seckillTimeService.sekillActivityCountIncr(createReqVO.getTimeIds());
69 return seckillActivity.getId(); 60 return seckillActivity.getId();
70 } 61 }
71 62
@@ -79,53 +70,51 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -79,53 +70,51 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
79 // 校验商品是否冲突 70 // 校验商品是否冲突
80 validateSeckillActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); 71 validateSeckillActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts());
81 72
82 - // 更新秒杀时段的秒杀活动数量  
83 - // TODO @halfninety:可以直接传递 seckillActivity 进去,不用重复查询;  
84 - updateSeckillTimeActivityCount(updateReqVO.getId(), updateReqVO.getTimeId());  
85 // 更新活动 73 // 更新活动
86 SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO) 74 SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO)
87 .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); 75 .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime()));
88 seckillActivityMapper.updateById(updateObj); 76 seckillActivityMapper.updateById(updateObj);
89 // 更新商品 77 // 更新商品
90 updateSeckillProduct(updateReqVO); 78 updateSeckillProduct(updateReqVO);
  79 + // 更新秒杀时段的秒杀活动数量
  80 + updateSeckillTimeActivityCount(seckillActivity, updateReqVO.getTimeIds());
91 } 81 }
92 82
93 - // TODO @halfninety:注释写全哈; 83 +
94 /** 84 /**
95 * 更新秒杀时段的秒杀活动数量 85 * 更新秒杀时段的秒杀活动数量
96 * 86 *
97 - * @param id  
98 - * @param timeId 87 + * @param seckillActivity 查询出的秒杀活动
  88 + * @param updateTimeIds 更新后的秒杀时段id列表
99 */ 89 */
100 - private void updateSeckillTimeActivityCount(Long id, String timeId) {  
101 - List<Long> updateTimeIds = StrUtils.splitToLong(timeId, ",");  
102 - // 查出自己的 timeIds  
103 - SeckillActivityDO seckillActivityDO = seckillActivityMapper.selectById(id);  
104 - List<Long> existsTimeIds = StrUtils.splitToLong(seckillActivityDO.getTimeId(), ","); 90 + private void updateSeckillTimeActivityCount(SeckillActivityDO seckillActivity, List<Long> updateTimeIds) {
  91 + // 查询出 timeIds
  92 + List<Long> existsTimeIds = seckillActivity.getTimeIds();
105 // 需要减少的时间段 93 // 需要减少的时间段
106 - // TODO @halfninety:可以使用 CollUtil.filterNew()  
107 - List<Long> reduceIds = existsTimeIds.stream()  
108 - .filter(existsTimeId -> !updateTimeIds.contains(existsTimeId))  
109 - .collect(Collectors.toList()); 94 + Collection<Long> reduceIds = CollUtil.filterNew(existsTimeIds, existsTimeId -> !updateTimeIds.contains(existsTimeId));
110 // 需要添加的时间段 95 // 需要添加的时间段
111 - // TODO @halfninety:IDEA 一般会有告警提示,下面可以 lambada 表达式优化下;通过 command + 回车  
112 - updateTimeIds.removeIf(updateTimeId -> existsTimeIds.contains(updateTimeId)); 96 + updateTimeIds.removeIf(existsTimeIds::contains);
113 // 更新减少时间段和增加时间段 97 // 更新减少时间段和增加时间段
114 - // TODO @halfninety:判断非空才操作  
115 - seckillTimeService.sekillActivityCountAdd(updateTimeIds);  
116 - seckillTimeService.sekillActivityCountReduce(reduceIds); 98 + if (CollUtil.isNotEmpty(updateTimeIds)) {
  99 + seckillTimeService.sekillActivityCountIncr(updateTimeIds);
  100 + }
  101 + if (CollUtil.isNotEmpty(reduceIds)) {
  102 + seckillTimeService.sekillActivityCountDecr(reduceIds);
  103 + }
117 } 104 }
118 105
119 /** 106 /**
120 * 更新秒杀商品 107 * 更新秒杀商品
  108 + * 后台查出的数据和前台查出的数据进行遍历,
  109 + * 1. 对前台数据进行遍历:如果不存在于后台的 sku 中需要新增
  110 + * 2. 对后台数据进行遍历:如果不存在于前台的 sku 中需要删除
  111 + * 3. 最后对当前活动商品全部更新,更新秒杀时段id列表
  112 + *
  113 + * @param updateReqVO 更新的请求VO
121 */ 114 */
122 private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) { 115 private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) {
123 List<SeckillProductDO> seckillProductDOS = seckillProductMapper.selectListByActivityId(updateReqVO.getId()); 116 List<SeckillProductDO> seckillProductDOS = seckillProductMapper.selectListByActivityId(updateReqVO.getId());
124 List<SeckillActivityBaseVO.Product> products = updateReqVO.getProducts(); 117 List<SeckillActivityBaseVO.Product> products = updateReqVO.getProducts();
125 - // TODO halfninety:下面这段,其实可以放到注释哈  
126 - // 对后台查出的数据和前台查出的数据进行遍历,  
127 - // 1. 对前台数据进行遍历:如果不存在于后台的 sku 中需要新增  
128 - // 2. 对后台数据进行遍历:如果不存在于前台的 sku 中需要删除  
129 118
130 // 计算需要删除的数据 119 // 计算需要删除的数据
131 List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOS, SeckillProductDO::getId, 120 List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOS, SeckillProductDO::getId,
@@ -143,6 +132,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -143,6 +132,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
143 if (CollUtil.isNotEmpty(newSeckillProductDOs)) { 132 if (CollUtil.isNotEmpty(newSeckillProductDOs)) {
144 seckillProductMapper.insertBatch(newSeckillProductDOs); 133 seckillProductMapper.insertBatch(newSeckillProductDOs);
145 } 134 }
  135 +
  136 + //全量更新当前活动商品的秒杀时段id列表(timeIds)
  137 + seckillProductMapper.updateTimeIdsByActivityId(updateReqVO.getId(), updateReqVO.getTimeIds());
146 } 138 }
147 139
148 /** 140 /**
@@ -198,7 +190,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -198,7 +190,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
198 throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END); 190 throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END);
199 } 191 }
200 // 更新秒杀时段的秒杀活动数量 192 // 更新秒杀时段的秒杀活动数量
201 - seckillTimeService.sekillActivityCountReduce(StrUtils.splitToLong(seckillActivity.getTimeId(),",")); 193 + seckillTimeService.sekillActivityCountDecr(seckillActivity.getTimeIds());
202 // 删除 194 // 删除
203 seckillActivityMapper.deleteById(id); 195 seckillActivityMapper.deleteById(id);
204 } 196 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeService.java
1 package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime; 1 package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime;
2 2
3 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO;  
4 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; 3 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
5 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; 5 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
6 6
7 import javax.validation.Valid; 7 import javax.validation.Valid;
  8 +import java.util.Collection;
8 import java.util.List; 9 import java.util.List;
9 10
10 /** 11 /**
11 * 秒杀时段 Service 接口 12 * 秒杀时段 Service 接口
12 * 13 *
13 - * @author 芋道源码 14 + * @author halfninety
14 */ 15 */
15 public interface SeckillTimeService { 16 public interface SeckillTimeService {
16 17
@@ -52,11 +53,18 @@ public interface SeckillTimeService { @@ -52,11 +53,18 @@ public interface SeckillTimeService {
52 List<SeckillTimeDO> getSeckillTimeList(); 53 List<SeckillTimeDO> getSeckillTimeList();
53 54
54 /** 55 /**
  56 + * 校验秒杀时段是否存在
  57 + *
  58 + * @param timeIds 秒杀时段id集合
  59 + */
  60 + void validateSeckillTimeExists(Collection<Long> timeIds);
  61 +
  62 + /**
55 * 秒杀时段列表的秒杀活动数量加 1 63 * 秒杀时段列表的秒杀活动数量加 1
56 * 64 *
57 * @param ids 秒杀时段id列表 65 * @param ids 秒杀时段id列表
58 */ 66 */
59 - void sekillActivityCountAdd(List<Long> ids); 67 + void sekillActivityCountIncr(Collection<Long> ids);
60 68
61 69
62 /** 70 /**
@@ -64,5 +72,5 @@ public interface SeckillTimeService { @@ -64,5 +72,5 @@ public interface SeckillTimeService {
64 * 72 *
65 * @param ids 秒杀时段id列表 73 * @param ids 秒杀时段id列表
66 */ 74 */
67 - void sekillActivityCountReduce(List<Long> ids); 75 + void sekillActivityCountDecr(Collection<Long> ids);
68 } 76 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeServiceImpl.java
1 package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime; 1 package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO;  
5 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; 4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
6 import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert; 6 import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert;
7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
8 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime.SeckillTimeMapper; 8 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime.SeckillTimeMapper;
@@ -11,6 +11,7 @@ import org.springframework.validation.annotation.Validated; @@ -11,6 +11,7 @@ import org.springframework.validation.annotation.Validated;
11 11
12 import javax.annotation.Resource; 12 import javax.annotation.Resource;
13 import java.time.LocalTime; 13 import java.time.LocalTime;
  14 +import java.util.Collection;
14 import java.util.List; 15 import java.util.List;
15 import java.util.Objects; 16 import java.util.Objects;
16 17
@@ -21,7 +22,7 @@ import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL @@ -21,7 +22,7 @@ import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL
21 /** 22 /**
22 * 秒杀时段 Service 实现类 23 * 秒杀时段 Service 实现类
23 * 24 *
24 - * @author 芋道源码 // TODO @halfninety:作者改成你自己哈 25 + * @author halfninety
25 */ 26 */
26 @Service 27 @Service
27 @Validated 28 @Validated
@@ -33,7 +34,7 @@ public class SeckillTimeServiceImpl implements SeckillTimeService { @@ -33,7 +34,7 @@ public class SeckillTimeServiceImpl implements SeckillTimeService {
33 @Override 34 @Override
34 public Long createSeckillTime(SeckillTimeCreateReqVO createReqVO) { 35 public Long createSeckillTime(SeckillTimeCreateReqVO createReqVO) {
35 // 校验时间段是否冲突 36 // 校验时间段是否冲突
36 - validateSeckillTimeConflict(null,createReqVO.getStartTime(), createReqVO.getEndTime()); 37 + validateSeckillTimeConflict(null, createReqVO.getStartTime(), createReqVO.getEndTime());
37 // 插入 38 // 插入
38 SeckillTimeDO seckillTime = SeckillTimeConvert.INSTANCE.convert(createReqVO); 39 SeckillTimeDO seckillTime = SeckillTimeConvert.INSTANCE.convert(createReqVO);
39 seckillTimeMapper.insert(seckillTime); 40 seckillTimeMapper.insert(seckillTime);
@@ -74,10 +75,10 @@ public class SeckillTimeServiceImpl implements SeckillTimeService { @@ -74,10 +75,10 @@ public class SeckillTimeServiceImpl implements SeckillTimeService {
74 */ 75 */
75 private void validateSeckillTimeConflict(Long id, LocalTime startTime, LocalTime endTime) { 76 private void validateSeckillTimeConflict(Long id, LocalTime startTime, LocalTime endTime) {
76 //查询开始时间,结束时间,是否在别人的时间段内 77 //查询开始时间,结束时间,是否在别人的时间段内
77 - List<SeckillTimeDO> startTimeList = seckillTimeMapper.selectListWithTime(startTime);  
78 - List<SeckillTimeDO> endTimeList = seckillTimeMapper.selectListWithTime(endTime); 78 + List<SeckillTimeDO> startTimeList = seckillTimeMapper.selectListByTime(startTime);
  79 + List<SeckillTimeDO> endTimeList = seckillTimeMapper.selectListByTime(endTime);
79 //查询自己时间段内是否有时间段 80 //查询自己时间段内是否有时间段
80 - List<SeckillTimeDO> startEndTimeList = seckillTimeMapper.selectListWithTime(startTime, endTime); 81 + List<SeckillTimeDO> startEndTimeList = seckillTimeMapper.selectListByTime(startTime, endTime);
81 if (id != null) { 82 if (id != null) {
82 //移除自己 83 //移除自己
83 startTimeList.removeIf(seckillTime -> Objects.equals(seckillTime.getId(), id)); 84 startTimeList.removeIf(seckillTime -> Objects.equals(seckillTime.getId(), id));
@@ -100,15 +101,24 @@ public class SeckillTimeServiceImpl implements SeckillTimeService { @@ -100,15 +101,24 @@ public class SeckillTimeServiceImpl implements SeckillTimeService {
100 return seckillTimeMapper.selectList(); 101 return seckillTimeMapper.selectList();
101 } 102 }
102 103
103 - // TODO @halfninety:updateActivityCount + 和 -,可以执使用一个方法实现哈。多传递一个参数  
104 @Override 104 @Override
105 - public void sekillActivityCountAdd(List<Long> ids) {  
106 - seckillTimeMapper.sekillActivityCountAdd(ids); 105 + public void validateSeckillTimeExists(Collection<Long> timeIds) {
  106 + if (CollUtil.isEmpty(timeIds)) {
  107 + throw exception(SECKILL_TIME_NOT_EXISTS);
  108 + }
  109 + if (seckillTimeMapper.selectBatchIds(timeIds).size() != timeIds.size()) {
  110 + throw exception(SECKILL_TIME_NOT_EXISTS);
  111 + }
  112 + }
  113 +
  114 + @Override
  115 + public void sekillActivityCountIncr(Collection<Long> ids) {
  116 + seckillTimeMapper.updateActivityCount(ids, "+", 1);
107 } 117 }
108 118
109 @Override 119 @Override
110 - public void sekillActivityCountReduce(List<Long> ids) {  
111 - seckillTimeMapper.sekillActivityCountReduce(ids); 120 + public void sekillActivityCountDecr(Collection<Long> ids) {
  121 + seckillTimeMapper.updateActivityCount(ids, "-", 1);
112 } 122 }
113 123
114 } 124 }
yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.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.seckill.seckillactivity.SeckillActivityMapper">  
4 -  
5 - <!--  
6 - 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。  
7 - 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。  
8 - 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。  
9 - 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/  
10 - -->  
11 - <!-- TODO halfninety:不用的话,可以删除掉哈。 -->  
12 -  
13 -</mapper>  
yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.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.seckill.seckilltime.SeckillTimeMapper">  
4 -  
5 - <!--  
6 - 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。  
7 - 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。  
8 - 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。  
9 - 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/  
10 - -->  
11 - <!-- TODO halfninety:不用的话,可以删除掉哈。 -->  
12 -  
13 -</mapper>  
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.promotion.service.seckillactivity; @@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.promotion.service.seckillactivity;
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.framework.test.core.ut.BaseDbUnitTest; 4 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
5 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityCreateReqVO;  
6 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityPageReqVO;  
7 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityUpdateReqVO; 5 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
9 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; 9 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper;
10 import cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity.SeckillActivityServiceImpl; 10 import cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity.SeckillActivityServiceImpl;
@@ -107,7 +107,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { @@ -107,7 +107,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest {
107 SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到 107 SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到
108 o.setName(null); 108 o.setName(null);
109 o.setStatus(null); 109 o.setStatus(null);
110 - o.setTimeId(null); 110 + o.setTimeIds(null);
111 o.setCreateTime(null); 111 o.setCreateTime(null);
112 }); 112 });
113 seckillActivityMapper.insert(dbSeckillActivity); 113 seckillActivityMapper.insert(dbSeckillActivity);
@@ -116,7 +116,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { @@ -116,7 +116,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest {
116 // 测试 status 不匹配 116 // 测试 status 不匹配
117 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null))); 117 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null)));
118 // 测试 timeId 不匹配 118 // 测试 timeId 不匹配
119 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setTimeId(null))); 119 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setTimeIds(null)));
120 // 测试 createTime 不匹配 120 // 测试 createTime 不匹配
121 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null))); 121 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null)));
122 // 准备参数 122 // 准备参数
@@ -141,7 +141,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { @@ -141,7 +141,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest {
141 SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到 141 SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到
142 o.setName(null); 142 o.setName(null);
143 o.setStatus(null); 143 o.setStatus(null);
144 - o.setTimeId(null); 144 + o.setTimeIds(null);
145 o.setCreateTime(null); 145 o.setCreateTime(null);
146 }); 146 });
147 seckillActivityMapper.insert(dbSeckillActivity); 147 seckillActivityMapper.insert(dbSeckillActivity);
@@ -150,7 +150,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { @@ -150,7 +150,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest {
150 // 测试 status 不匹配 150 // 测试 status 不匹配
151 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null))); 151 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null)));
152 // 测试 timeId 不匹配 152 // 测试 timeId 不匹配
153 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setTimeId(null))); 153 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setTimeIds(null)));
154 // 测试 createTime 不匹配 154 // 测试 createTime 不匹配
155 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null))); 155 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null)));
156 // 准备参数 156 // 准备参数
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java
1 package cn.iocoder.yudao.module.promotion.service.seckilltime; 1 package cn.iocoder.yudao.module.promotion.service.seckilltime;
2 2
3 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO;  
4 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; 3 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
5 import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeServiceImpl; 5 import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeServiceImpl;
6 import com.fasterxml.jackson.core.JsonProcessingException; 6 import com.fasterxml.jackson.core.JsonProcessingException;
7 import com.fasterxml.jackson.databind.ObjectMapper; 7 import com.fasterxml.jackson.databind.ObjectMapper;
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;