Commit abbb0768597ba2eaf5bd2cf0c12c45533a96b03d

Authored by halfninety
1 parent 0b9ddddd

完成秒杀时段,秒杀活动相关todo

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