Commit f9b4874ee9bf459cf8b88b5bf40377445d142d1a
Committed by
Gitee
!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 | 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
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; |
| ... | ... | @@ -14,9 +14,9 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ |
| 14 | 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 | 20 | @Data |
| 21 | 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 | 3 | import io.swagger.annotations.ApiModel; |
| 4 | 4 | import io.swagger.annotations.ApiModelProperty; |
| ... | ... | @@ -7,12 +7,10 @@ import lombok.EqualsAndHashCode; |
| 7 | 7 | import lombok.ToString; |
| 8 | 8 | |
| 9 | 9 | import javax.validation.Valid; |
| 10 | -import javax.validation.constraints.NotBlank; | |
| 11 | 10 | import javax.validation.constraints.NotEmpty; |
| 12 | 11 | import javax.validation.constraints.NotNull; |
| 13 | 12 | import java.util.List; |
| 14 | 13 | |
| 15 | -// TODO halfninety:检查下所有的 VO,需要保证 example 都写了哈。 | |
| 16 | 14 | @ApiModel("管理后台 - 秒杀活动创建 Request VO") |
| 17 | 15 | @Data |
| 18 | 16 | @EqualsAndHashCode(callSuper = true) |
| ... | ... | @@ -22,14 +20,13 @@ public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO { |
| 22 | 20 | @ApiModelProperty(value = "备注", example = "限时秒杀活动") |
| 23 | 21 | private String remark; |
| 24 | 22 | |
| 25 | - @ApiModelProperty(value = "排序", required = true) | |
| 23 | + @ApiModelProperty(value = "排序", required = true, example = "1") | |
| 26 | 24 | @NotNull(message = "排序不能为空") |
| 27 | 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 | 3 | import io.swagger.annotations.ApiModel; |
| 4 | 4 | import lombok.Data; |
| ... | ... | @@ -11,7 +11,7 @@ import java.util.List; |
| 11 | 11 | @Data |
| 12 | 12 | @EqualsAndHashCode(callSuper = true) |
| 13 | 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 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | 4 | import com.fasterxml.jackson.annotation.JsonFormat; |
| ... | ... | @@ -26,8 +26,8 @@ public class SeckillActivityPageReqVO extends PageParam { |
| 26 | 26 | @ApiModelProperty(value = "活动状态", example = "进行中") |
| 27 | 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 | 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 |
| ... | ... | @@ -14,22 +15,22 @@ import java.time.LocalDateTime; |
| 14 | 15 | @ToString(callSuper = true) |
| 15 | 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 | 19 | private Long id; |
| 19 | 20 | |
| 20 | - @ApiModelProperty(value = "付款订单数", required = true) | |
| 21 | + @ApiModelProperty(value = "付款订单数", required = true, example = "1") | |
| 21 | 22 | private Integer orderCount; |
| 22 | 23 | |
| 23 | - @ApiModelProperty(value = "付款人数", required = true) | |
| 24 | + @ApiModelProperty(value = "付款人数", required = true, example = "1") | |
| 24 | 25 | private Integer userCount; |
| 25 | 26 | |
| 26 | 27 | @ApiModelProperty(value = "创建时间", required = true) |
| 27 | 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 | 34 | private Integer sort; |
| 34 | 35 | |
| 35 | 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 | 3 | import io.swagger.annotations.ApiModel; |
| 4 | 4 | import io.swagger.annotations.ApiModelProperty; |
| ... | ... | @@ -24,13 +24,13 @@ public class SeckillActivityUpdateReqVO extends SeckillActivityBaseVO { |
| 24 | 24 | @ApiModelProperty(value = "备注", example = "限时秒杀活动") |
| 25 | 25 | private String remark; |
| 26 | 26 | |
| 27 | - @ApiModelProperty(value = "排序", required = true) | |
| 27 | + @ApiModelProperty(value = "排序", required = true, example = "1") | |
| 28 | 28 | @NotNull(message = "排序不能为空") |
| 29 | 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 | 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 | 13 | @Data |
| 18 | 14 | public class SeckillTimeBaseVO { |
| 19 | 15 | |
| 20 | - @ApiModelProperty(value = "秒杀时段名称", required = true) | |
| 16 | + @ApiModelProperty(value = "秒杀时段名称", required = true, example = "上午场") | |
| 21 | 17 | @NotNull(message = "秒杀时段名称不能为空") |
| 22 | 18 | private String name; |
| 23 | 19 | |
| 24 | - @ApiModelProperty(value = "开始时间点", required = true) | |
| 20 | + @ApiModelProperty(value = "开始时间点", required = true, example = "16:30:40") | |
| 25 | 21 | @NotNull(message = "开始时间点不能为空") |
| 26 | 22 | private LocalTime startTime; |
| 27 | 23 | |
| 28 | - @ApiModelProperty(value = "结束时间点", required = true) | |
| 24 | + @ApiModelProperty(value = "结束时间点", required = true, example = "16:30:40") | |
| 29 | 25 | @NotNull(message = "结束时间点不能为空") |
| 30 | 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
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; |
| ... | ... | @@ -16,25 +16,15 @@ import java.time.LocalTime; |
| 16 | 16 | @ToString(callSuper = true) |
| 17 | 17 | public class SeckillTimePageReqVO extends PageParam { |
| 18 | 18 | |
| 19 | - @ApiModelProperty(value = "秒杀时段名称") | |
| 19 | + @ApiModelProperty(value = "秒杀时段名称", example = "上午场") | |
| 20 | 20 | private String name; |
| 21 | 21 | |
| 22 | - @ApiModelProperty(value = "开始时间点") | |
| 22 | + @ApiModelProperty(value = "开始时间点", example = "16:30:40") | |
| 23 | 23 | @DateTimeFormat(pattern = "HH:mm:ss") |
| 24 | 24 | private LocalTime startTime; |
| 25 | 25 | |
| 26 | - @ApiModelProperty(value = "结束时间点") | |
| 26 | + @ApiModelProperty(value = "结束时间点", example = "16:30:40") | |
| 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 | -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 | 11 | @ApiModel("管理后台 - 秒杀时段 Response VO") |
| 8 | 12 | @Data |
| ... | ... | @@ -10,13 +14,13 @@ import io.swagger.annotations.*; |
| 10 | 14 | @ToString(callSuper = true) |
| 11 | 15 | public class SeckillTimeRespVO extends SeckillTimeBaseVO { |
| 12 | 16 | |
| 13 | - @ApiModelProperty(value = "编号", required = true) | |
| 17 | + @ApiModelProperty(value = "编号", required = true, example = "1") | |
| 14 | 18 | private Long id; |
| 15 | 19 | |
| 16 | - @ApiModelProperty(value = "秒杀活动数量", required = true) | |
| 20 | + @ApiModelProperty(value = "秒杀活动数量", required = true, example = "1") | |
| 17 | 21 | private Integer seckillActivityCount; |
| 18 | 22 | |
| 19 | 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 | 3 | import io.swagger.annotations.ApiModel; |
| 4 | 4 | import io.swagger.annotations.ApiModelProperty; |
| ... | ... | @@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull; |
| 14 | 14 | @ToString(callSuper = true) |
| 15 | 15 | public class SeckillTimeUpdateReqVO extends SeckillTimeBaseVO { |
| 16 | 16 | |
| 17 | - @ApiModelProperty(value = "编号", required = true) | |
| 17 | + @ApiModelProperty(value = "编号", required = true, example = "1") | |
| 18 | 18 | @NotNull(message = "编号不能为空") |
| 19 | 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 | 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,10 @@ 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, 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 | 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
| 1 | 1 | package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity; |
| 2 | 2 | |
| 3 | 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 | 6 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 7 | +import com.baomidou.mybatisplus.annotation.TableField; | |
| 5 | 8 | import com.baomidou.mybatisplus.annotation.TableId; |
| 6 | 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 | 14 | import java.time.LocalDateTime; |
| 15 | +import java.util.List; | |
| 12 | 16 | |
| 13 | 17 | /** |
| 14 | 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 | 23 | @KeySequence("promotion_seckill_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 |
| 20 | 24 | @Data |
| 21 | 25 | @EqualsAndHashCode(callSuper = true) |
| 22 | 26 | @ToString(callSuper = true) |
| 23 | -@Builder | |
| 24 | -@NoArgsConstructor | |
| 25 | -@AllArgsConstructor | |
| 26 | 27 | public class SeckillActivityDO extends BaseDO { |
| 27 | 28 | |
| 28 | 29 | /** |
| ... | ... | @@ -36,7 +37,7 @@ public class SeckillActivityDO extends BaseDO { |
| 36 | 37 | private String name; |
| 37 | 38 | /** |
| 38 | 39 | * 活动状态 |
| 39 | - * | |
| 40 | + * <p> | |
| 40 | 41 | * 枚举 {@link PromotionActivityStatusEnum 对应的类} |
| 41 | 42 | */ |
| 42 | 43 | private Integer status; |
| ... | ... | @@ -59,8 +60,8 @@ public class SeckillActivityDO extends BaseDO { |
| 59 | 60 | /** |
| 60 | 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 | 70 | * 付款人数 |
| 70 | 71 | */ |
| 71 | 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 | 1 | package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity; |
| 2 | 2 | |
| 3 | 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 | 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 | 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 | 20 | @Data |
| 21 | +@EqualsAndHashCode(callSuper = true) | |
| 22 | +@ToString(callSuper = true) | |
| 19 | 23 | public class SeckillProductDO extends BaseDO { |
| 20 | 24 | /** |
| 21 | 25 | * 秒杀参与商品编号 |
| ... | ... | @@ -31,7 +35,8 @@ public class SeckillProductDO extends BaseDO { |
| 31 | 35 | /** |
| 32 | 36 | * 秒杀时段id |
| 33 | 37 | */ |
| 34 | - private Long timeId; | |
| 38 | + @TableField(typeHandler = LongListTypeHandler.class) | |
| 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/dataobject/seckill/seckilltime/SeckillTimeDO.java
| ... | ... | @@ -4,7 +4,9 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | 4 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 5 | 5 | import com.baomidou.mybatisplus.annotation.TableId; |
| 6 | 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 | 11 | import java.time.LocalTime; |
| 10 | 12 | |
| ... | ... | @@ -18,9 +20,6 @@ import java.time.LocalTime; |
| 18 | 20 | @Data |
| 19 | 21 | @EqualsAndHashCode(callSuper = true) |
| 20 | 22 | @ToString(callSuper = true) |
| 21 | -@Builder | |
| 22 | -@NoArgsConstructor | |
| 23 | -@AllArgsConstructor | |
| 24 | 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 | 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.util.ObjectUtil; | |
| 3 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | 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 | 8 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; |
| 8 | 9 | import org.apache.ibatis.annotations.Mapper; |
| 9 | 10 | |
| 10 | 11 | /** |
| 11 | 12 | * 秒杀活动 Mapper |
| 12 | 13 | * |
| 13 | - * @author 芋道源码 | |
| 14 | + * @author halfninety | |
| 14 | 15 | */ |
| 15 | 16 | @Mapper |
| 16 | 17 | public interface SeckillActivityMapper extends BaseMapperX<SeckillActivityDO> { |
| 17 | -// TODO: 2022/11/28 halfninety 秒杀活动通过场次查询使用like会出现问题,查询活动场次编号为1,则活动场次编号为 1,11,......的都会被查出来 | |
| 18 | 18 | default PageResult<SeckillActivityDO> selectPage(SeckillActivityPageReqVO reqVO) { |
| 19 | 19 | return selectPage(reqVO, new LambdaQueryWrapperX<SeckillActivityDO>() |
| 20 | 20 | .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) |
| 21 | 21 | .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) |
| 22 | - .likeIfPresent(SeckillActivityDO::getTimeId, reqVO.getTimeId()) | |
| 23 | -// .like(StringUtils.hasText(reqVO.getTimeId()),SeckillActivityDO::getTimeId, reqVO.getTimeId() + ",") | |
| 24 | 22 | .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) |
| 23 | + .apply(ObjectUtil.isNotNull(reqVO.getTimeId()),"FIND_IN_SET(" + reqVO.getTimeId() + ",time_ids) > 0") | |
| 25 | 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 | 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 3 | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 4 | 5 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; |
| 6 | +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; | |
| 5 | 7 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 8 | |
| 7 | 9 | import java.util.Collection; |
| 8 | 10 | import java.util.List; |
| 9 | 11 | |
| 12 | +/** | |
| 13 | + * 秒杀活动商品 Mapper | |
| 14 | + * | |
| 15 | + * @author halfninety | |
| 16 | + */ | |
| 10 | 17 | @Mapper |
| 11 | 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 | 1 | package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime; |
| 2 | 2 | |
| 3 | -import cn.hutool.core.collection.CollUtil; | |
| 4 | 3 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | 4 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; |
| 6 | 5 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| ... | ... | @@ -8,59 +7,31 @@ import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWra |
| 8 | 7 | import org.apache.ibatis.annotations.Mapper; |
| 9 | 8 | |
| 10 | 9 | import java.time.LocalTime; |
| 11 | -import java.util.Collections; | |
| 10 | +import java.util.Collection; | |
| 12 | 11 | import java.util.List; |
| 13 | 12 | |
| 14 | 13 | /** |
| 15 | 14 | * 秒杀时段 Mapper |
| 16 | 15 | * |
| 17 | - * @author 芋道源码 | |
| 16 | + * @author halfninety | |
| 18 | 17 | */ |
| 19 | 18 | @Mapper |
| 20 | 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 | 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 | 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 | 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
| ... | ... | @@ -3,11 +3,10 @@ package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; |
| 3 | 3 | 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 | -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 | 10 | import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert; |
| 12 | 11 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; |
| 13 | 12 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; |
| ... | ... | @@ -22,7 +21,6 @@ import org.springframework.validation.annotation.Validated; |
| 22 | 21 | import javax.annotation.Resource; |
| 23 | 22 | import java.util.Collection; |
| 24 | 23 | import java.util.List; |
| 25 | -import java.util.stream.Collectors; | |
| 26 | 24 | |
| 27 | 25 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 28 | 26 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; |
| ... | ... | @@ -31,41 +29,34 @@ import static java.util.Arrays.asList; |
| 31 | 29 | /** |
| 32 | 30 | * 秒杀活动 Service 实现类 |
| 33 | 31 | * |
| 34 | - * @author 芋道源码 // TODO @halfninety:作者改成你自己哈 | |
| 32 | + * @author halfninety | |
| 35 | 33 | */ |
| 36 | 34 | @Service |
| 37 | 35 | @Validated |
| 38 | 36 | public class SeckillActivityServiceImpl implements SeckillActivityService { |
| 39 | - | |
| 40 | 37 | @Resource |
| 41 | 38 | private SeckillActivityMapper seckillActivityMapper; |
| 42 | 39 | @Resource |
| 43 | 40 | private SeckillProductMapper seckillProductMapper; |
| 44 | - | |
| 45 | 41 | @Resource |
| 46 | 42 | private SeckillTimeService seckillTimeService; |
| 47 | 43 | |
| 48 | 44 | @Override |
| 49 | 45 | public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) { |
| 50 | - // TODO @halfninety:多余的变量,需要删除 | |
| 51 | - List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus()); | |
| 52 | 46 | // 校验商品是否冲突 |
| 53 | 47 | validateSeckillActivityProductConflicts(null, createReqVO.getProducts()); |
| 48 | + // 校验秒杀时段是否存在 | |
| 49 | + seckillTimeService.validateSeckillTimeExists(createReqVO.getTimeIds()); | |
| 54 | 50 | |
| 55 | - // TODO halfninety:要校验下,秒杀时间段存在 | |
| 56 | 51 | // 插入秒杀活动 |
| 57 | 52 | SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO) |
| 58 | 53 | .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime())); |
| 59 | 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 | 57 | seckillProductMapper.insertBatch(productDOS); |
| 65 | - | |
| 66 | - // TODO halfninety:最后在更新秒杀时间段的商品数量哈。【我已经改了】一般先做核心的逻辑,在做附件的逻辑。 | |
| 67 | 58 | // 更新秒杀时段的秒杀活动数量 |
| 68 | - seckillTimeService.sekillActivityCountAdd(StrUtils.splitToLong(createReqVO.getTimeId(),",")); | |
| 59 | + seckillTimeService.sekillActivityCountIncr(createReqVO.getTimeIds()); | |
| 69 | 60 | return seckillActivity.getId(); |
| 70 | 61 | } |
| 71 | 62 | |
| ... | ... | @@ -79,53 +70,51 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { |
| 79 | 70 | // 校验商品是否冲突 |
| 80 | 71 | validateSeckillActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); |
| 81 | 72 | |
| 82 | - // 更新秒杀时段的秒杀活动数量 | |
| 83 | - // TODO @halfninety:可以直接传递 seckillActivity 进去,不用重复查询; | |
| 84 | - updateSeckillTimeActivityCount(updateReqVO.getId(), updateReqVO.getTimeId()); | |
| 85 | 73 | // 更新活动 |
| 86 | 74 | SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO) |
| 87 | 75 | .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); |
| 88 | 76 | seckillActivityMapper.updateById(updateObj); |
| 89 | 77 | // 更新商品 |
| 90 | 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 | 115 | private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) { |
| 123 | 116 | List<SeckillProductDO> seckillProductDOS = seckillProductMapper.selectListByActivityId(updateReqVO.getId()); |
| 124 | 117 | List<SeckillActivityBaseVO.Product> products = updateReqVO.getProducts(); |
| 125 | - // TODO halfninety:下面这段,其实可以放到注释哈 | |
| 126 | - // 对后台查出的数据和前台查出的数据进行遍历, | |
| 127 | - // 1. 对前台数据进行遍历:如果不存在于后台的 sku 中需要新增 | |
| 128 | - // 2. 对后台数据进行遍历:如果不存在于前台的 sku 中需要删除 | |
| 129 | 118 | |
| 130 | 119 | // 计算需要删除的数据 |
| 131 | 120 | List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOS, SeckillProductDO::getId, |
| ... | ... | @@ -143,6 +132,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { |
| 143 | 132 | if (CollUtil.isNotEmpty(newSeckillProductDOs)) { |
| 144 | 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 | 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 | 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 | 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 sekillActivityCountIncr(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 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 | 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,15 +101,24 @@ public class SeckillTimeServiceImpl implements SeckillTimeService { |
| 100 | 101 | return seckillTimeMapper.selectList(); |
| 101 | 102 | } |
| 102 | 103 | |
| 103 | - // TODO @halfninety:updateActivityCount + 和 -,可以执使用一个方法实现哈。多传递一个参数 | |
| 104 | 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 | 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 | 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; | ... | ... |
yudao-ui-admin/src/views/mall/promotion/seckill/seckillActivity/index.vue
| ... | ... | @@ -51,10 +51,10 @@ |
| 51 | 51 | <dict-tag :type="DICT_TYPE.PROMOTION_ACTIVITY_STATUS" :value="scope.row.status" /> |
| 52 | 52 | </template> |
| 53 | 53 | </el-table-column> |
| 54 | - <el-table-column label="参与场次" prop="timeId" width="250"> | |
| 54 | + <el-table-column label="参与场次" prop="timeIds" width="250"> | |
| 55 | 55 | <template slot-scope="scope"> |
| 56 | 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 | 58 | <el-tag style="margin:4px;" size="small">{{ item.name }}</el-tag> |
| 59 | 59 | </span> |
| 60 | 60 | </template> |
| ... | ... | @@ -107,7 +107,7 @@ |
| 107 | 107 | <el-input type="textarea" v-model="form.remark" placeholder="请输入备注" /> |
| 108 | 108 | </el-form-item> |
| 109 | 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 | 111 | style="width: 880px"> |
| 112 | 112 | <el-option v-for="item in seckillTimeList" :key="item.id" :label="item.name" :value="item.id"> |
| 113 | 113 | <span style="float: left">{{ item.name + ': { ' }} {{ item.startTime }} -- {{ item.endTime + |
| ... | ... | @@ -186,7 +186,7 @@ |
| 186 | 186 | |
| 187 | 187 | <script> |
| 188 | 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 | 190 | import { getSeckillTimeList } from "@/api/mall/promotion/seckillTime"; |
| 191 | 191 | import { deepClone } from "@/utils"; |
| 192 | 192 | |
| ... | ... | @@ -223,7 +223,7 @@ export default { |
| 223 | 223 | form: { |
| 224 | 224 | skuIds: [], // 选中的 SKU |
| 225 | 225 | products: [], // 商品信息 |
| 226 | - timeId: [], //选中的秒杀场次id | |
| 226 | + timeIds: [], //选中的秒杀场次id | |
| 227 | 227 | }, |
| 228 | 228 | // 商品 SKU 列表 |
| 229 | 229 | productSkus: [], |
| ... | ... | @@ -233,7 +233,7 @@ export default { |
| 233 | 233 | status: [{ required: true, message: "活动状态不能为空", trigger: "blur" }], |
| 234 | 234 | startAndEndTime: [{ required: true, message: "活动时间不能为空", trigger: "blur" }], |
| 235 | 235 | sort: [{ required: true, message: "排序不能为空", trigger: "blur" }], |
| 236 | - timeId: [{ required: true, message: "秒杀场次不能为空", trigger: "blur" }], | |
| 236 | + timeIds: [{ required: true, message: "秒杀场次不能为空", trigger: "blur" }], | |
| 237 | 237 | totalPrice: [{ required: true, message: "订单实付金额,单位:分不能为空", trigger: "blur" }], |
| 238 | 238 | } |
| 239 | 239 | }; |
| ... | ... | @@ -241,12 +241,13 @@ export default { |
| 241 | 241 | created() { |
| 242 | 242 | this.getList(); |
| 243 | 243 | }, |
| 244 | - watch:{ | |
| 244 | + watch: { | |
| 245 | 245 | $route: 'getList' |
| 246 | 246 | }, |
| 247 | 247 | methods: { |
| 248 | 248 | /** 查询列表 */ |
| 249 | 249 | getList() { |
| 250 | + // 从秒杀时段跳转过来并鞋带timeId参数进行查询 | |
| 250 | 251 | const timeId = this.$route.params && this.$route.params.timeId; |
| 251 | 252 | if (timeId) { |
| 252 | 253 | this.queryParams.timeId = timeId |
| ... | ... | @@ -254,11 +255,13 @@ export default { |
| 254 | 255 | this.loading = true; |
| 255 | 256 | // 执行查询 |
| 256 | 257 | getSeckillActivityPage(this.queryParams).then(response => { |
| 258 | + console.log(response.data.list, "查询出的值"); | |
| 257 | 259 | this.list = response.data.list; |
| 258 | 260 | this.total = response.data.total; |
| 259 | 261 | this.loading = false; |
| 260 | 262 | }); |
| 261 | 263 | if (timeId) { |
| 264 | + //查询完成后设置为空 | |
| 262 | 265 | this.$route.params.timeId = undefined |
| 263 | 266 | } |
| 264 | 267 | // 获得 SKU 商品列表 |
| ... | ... | @@ -285,7 +288,7 @@ export default { |
| 285 | 288 | startTime: undefined, |
| 286 | 289 | endTime: undefined, |
| 287 | 290 | sort: undefined, |
| 288 | - timeId: [], | |
| 291 | + timeIds: [], | |
| 289 | 292 | totalPrice: undefined, |
| 290 | 293 | skuIds: [], |
| 291 | 294 | products: [], |
| ... | ... | @@ -317,11 +320,9 @@ export default { |
| 317 | 320 | this.reset(); |
| 318 | 321 | const id = row.id; |
| 319 | 322 | getSeckillActivity(id).then(response => { |
| 320 | - var timeIdList = response.data.timeId.split(',') | |
| 321 | 323 | this.form = response.data; |
| 322 | 324 | // 修改数据 |
| 323 | 325 | this.form.startAndEndTime = [response.data.startTime, response.data.endTime]; |
| 324 | - this.form.timeId = timeIdList.map(item => parseInt(item)) | |
| 325 | 326 | this.form.skuIds = response.data.products.map(item => item.skuId); |
| 326 | 327 | this.form.products.forEach(product => { |
| 327 | 328 | // 获得对应的 SKU 信息 |
| ... | ... | @@ -334,7 +335,7 @@ export default { |
| 334 | 335 | product.spuName = sku.spuName; |
| 335 | 336 | product.price = sku.price; |
| 336 | 337 | product.productStock = sku.stock; |
| 337 | - this.$set(product,'seckillStock',product.stock); | |
| 338 | + this.$set(product, 'seckillStock', product.stock); | |
| 338 | 339 | product.seckillPrice = product.seckillPrice !== undefined ? product.seckillPrice / 100 : undefined; |
| 339 | 340 | |
| 340 | 341 | }); |
| ... | ... | @@ -353,7 +354,6 @@ export default { |
| 353 | 354 | const data = deepClone(this.form); |
| 354 | 355 | data.startTime = this.form.startAndEndTime[0]; |
| 355 | 356 | data.endTime = this.form.startAndEndTime[1]; |
| 356 | - data.timeId = data.timeId.toString(); | |
| 357 | 357 | data.products.forEach(product => { |
| 358 | 358 | product.stock = product.seckillStock; |
| 359 | 359 | product.seckillPrice = product.seckillPrice !== undefined ? product.seckillPrice * 100 : undefined; | ... | ... |