mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-08-16 11:11:53 +08:00
fix:seckillTime => seckillConfig
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigRespVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.convert.seckill.seckillconfig.SeckillConfigConvert;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
|
||||
import cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig.SeckillConfigService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
/**
|
||||
* 管理后台 - 秒杀时段相关接口
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@Tag(name = "管理后台 - 秒杀时段")
|
||||
@RestController
|
||||
@RequestMapping("/promotion/seckill-config")
|
||||
@Validated
|
||||
public class SeckillConfigController {
|
||||
|
||||
@Resource
|
||||
private SeckillConfigService seckillConfigService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建秒杀时段")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-config:create')")
|
||||
public CommonResult<Long> createSeckillConfig(@Valid @RequestBody SeckillConfigCreateReqVO createReqVO) {
|
||||
return success(seckillConfigService.createSeckillConfig(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新秒杀时段")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-config:update')")
|
||||
public CommonResult<Boolean> updateSeckillConfig(@Valid @RequestBody SeckillConfigUpdateReqVO updateReqVO) {
|
||||
seckillConfigService.updateSeckillConfig(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除秒杀时段")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-config:delete')")
|
||||
public CommonResult<Boolean> deleteSeckillConfig(@RequestParam("id") Long id) {
|
||||
seckillConfigService.deleteSeckillConfig(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "获得秒杀时段")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')")
|
||||
public CommonResult<SeckillConfigRespVO> getSeckillConfig(@RequestParam("id") Long id) {
|
||||
SeckillConfigDO seckillConfig = seckillConfigService.getSeckillConfig(id);
|
||||
return success(SeckillConfigConvert.INSTANCE.convert(seckillConfig));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "获得所有秒杀时段列表")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')")
|
||||
public CommonResult<List<SeckillConfigRespVO>> getSeckillConfigList() {
|
||||
List<SeckillConfigDO> list = seckillConfigService.getSeckillConfigList();
|
||||
return success(SeckillConfigConvert.INSTANCE.convertList(list));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得秒杀活动分页")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')")
|
||||
public CommonResult<PageResult<SeckillConfigRespVO>> getSeckillActivityPage(@Valid SeckillConfigPageReqVO pageVO) {
|
||||
PageResult<SeckillConfigDO> pageResult = seckillConfigService.getSeckillConfigPage(pageVO);
|
||||
return success(SeckillConfigConvert.INSTANCE.convertPage(pageResult));
|
||||
}
|
||||
}
|
@@ -1,72 +0,0 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeRespVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
|
||||
import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@Tag(name = "管理后台 - 秒杀时段")
|
||||
@RestController
|
||||
@RequestMapping("/promotion/seckill-time")
|
||||
@Validated
|
||||
public class SeckillTimeController {
|
||||
|
||||
@Resource
|
||||
private SeckillTimeService seckillTimeService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建秒杀时段")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-time:create')")
|
||||
public CommonResult<Long> createSeckillTime(@Valid @RequestBody SeckillTimeCreateReqVO createReqVO) {
|
||||
return success(seckillTimeService.createSeckillTime(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新秒杀时段")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-time:update')")
|
||||
public CommonResult<Boolean> updateSeckillTime(@Valid @RequestBody SeckillTimeUpdateReqVO updateReqVO) {
|
||||
seckillTimeService.updateSeckillTime(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除秒杀时段")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-time:delete')")
|
||||
public CommonResult<Boolean> deleteSeckillTime(@RequestParam("id") Long id) {
|
||||
seckillTimeService.deleteSeckillTime(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "获得秒杀时段")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')")
|
||||
public CommonResult<SeckillTimeRespVO> getSeckillTime(@RequestParam("id") Long id) {
|
||||
SeckillTimeDO seckillTime = seckillTimeService.getSeckillTime(id);
|
||||
return success(SeckillTimeConvert.INSTANCE.convert(seckillTime));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "获得所有秒杀时段列表")
|
||||
@PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')")
|
||||
public CommonResult<List<SeckillTimeRespVO>> getSeckillTimeList() {
|
||||
List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList();
|
||||
return success(SeckillTimeConvert.INSTANCE.convertList(list));
|
||||
}
|
||||
}
|
@@ -54,7 +54,7 @@ public class SeckillActivityBaseVO {
|
||||
|
||||
@Schema(description = "秒杀库存", example = "80")
|
||||
@Min(value = 0, message = "秒杀库存需要大于等于 0")
|
||||
private Integer stock;
|
||||
private Integer quota;
|
||||
|
||||
@Schema(description = "每人限购", example = "10") // 如果为 0 则不限购
|
||||
@Min(value = 0, message = "每人限购需要大于等于 0")
|
||||
|
@@ -0,0 +1,43 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_HOUR_MINUTE_SECOND;
|
||||
|
||||
/**
|
||||
* 秒杀时段 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@Data
|
||||
public class SeckillConfigBaseVO {
|
||||
|
||||
@Schema(description = "秒杀时段名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "早上场")
|
||||
@NotNull(message = "秒杀时段名称不能为空")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "开始时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "09:00:00")
|
||||
@NotNull(message = "开始时间点不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_HOUR_MINUTE_SECOND)
|
||||
private LocalTime startTime;
|
||||
|
||||
@Schema(description = "结束时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "16:00:00")
|
||||
@NotNull(message = "结束时间点不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_HOUR_MINUTE_SECOND)
|
||||
private LocalTime endTime;
|
||||
|
||||
@Schema(description = "秒杀主图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
|
||||
@NotNull(message = "秒杀主图不能为空")
|
||||
private String picUrl;
|
||||
|
||||
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
}
|
@@ -1,14 +1,19 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* 管理后台 秒杀时段创建 Request VO
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 秒杀时段创建 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class SeckillTimeCreateReqVO extends SeckillTimeBaseVO {
|
||||
public class SeckillConfigCreateReqVO extends SeckillConfigBaseVO {
|
||||
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -9,21 +9,29 @@ import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalTime;
|
||||
|
||||
/**
|
||||
* 管理后台 - 秒杀时段分页 Request VO
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 秒杀时段分页 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class SeckillTimePageReqVO extends PageParam {
|
||||
public class SeckillConfigPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "秒杀时段名称", example = "上午场")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "状态", example = "0")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "开始时间点", example = "16:30:40")
|
||||
@DateTimeFormat(pattern = "HH:mm:ss")
|
||||
private LocalTime startTime;
|
||||
private LocalTime[] startTime;
|
||||
|
||||
@Schema(description = "结束时间点", example = "16:30:40")
|
||||
@DateTimeFormat(pattern = "HH:mm:ss")
|
||||
private LocalTime endTime;
|
||||
private LocalTime[] endTime;
|
||||
|
||||
}
|
@@ -1,25 +1,34 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
/**
|
||||
* 管理后台 - 秒杀时段 Response VO
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 秒杀时段 Response VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class SeckillTimeRespVO extends SeckillTimeBaseVO {
|
||||
public class SeckillConfigRespVO extends SeckillConfigBaseVO {
|
||||
|
||||
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "秒杀活动数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@Schema(description = "秒杀活动数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
|
||||
private Integer seckillActivityCount;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -7,11 +7,16 @@ import lombok.ToString;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 管理后台 - 秒杀时段更新 Request VO
|
||||
*
|
||||
* @author HUIHUI
|
||||
*/
|
||||
@Schema(description = "管理后台 - 秒杀时段更新 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class SeckillTimeUpdateReqVO extends SeckillTimeBaseVO {
|
||||
public class SeckillConfigUpdateReqVO extends SeckillConfigBaseVO {
|
||||
|
||||
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@NotNull(message = "编号不能为空")
|
@@ -1,28 +0,0 @@
|
||||
package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalTime;
|
||||
|
||||
/**
|
||||
* 秒杀时段 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||
*/
|
||||
@Data
|
||||
public class SeckillTimeBaseVO {
|
||||
|
||||
@Schema(description = "秒杀时段名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "上午场")
|
||||
@NotNull(message = "秒杀时段名称不能为空")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "开始时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "16:30:40")
|
||||
@NotNull(message = "开始时间点不能为空")
|
||||
private LocalTime startTime;
|
||||
|
||||
@Schema(description = "结束时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "16:30:40")
|
||||
@NotNull(message = "结束时间点不能为空")
|
||||
private LocalTime endTime;
|
||||
|
||||
}
|
@@ -0,0 +1,35 @@
|
||||
package cn.iocoder.yudao.module.promotion.convert.seckill.seckillconfig;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigRespVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 秒杀时段 Convert
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Mapper
|
||||
public interface SeckillConfigConvert {
|
||||
|
||||
SeckillConfigConvert INSTANCE = Mappers.getMapper(SeckillConfigConvert.class);
|
||||
|
||||
SeckillConfigDO convert(SeckillConfigCreateReqVO bean);
|
||||
|
||||
SeckillConfigDO convert(SeckillConfigUpdateReqVO bean);
|
||||
|
||||
@Mapping(target = "s")
|
||||
SeckillConfigRespVO convert(SeckillConfigDO bean);
|
||||
|
||||
List<SeckillConfigRespVO> convertList(List<SeckillConfigDO> list);
|
||||
|
||||
PageResult<SeckillConfigRespVO> convertPage(PageResult<SeckillConfigDO> page);
|
||||
|
||||
}
|
@@ -1,34 +0,0 @@
|
||||
package cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeRespVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
|
||||
|
||||
/**
|
||||
* 秒杀时段 Convert
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Mapper
|
||||
public interface SeckillTimeConvert {
|
||||
|
||||
SeckillTimeConvert INSTANCE = Mappers.getMapper(SeckillTimeConvert.class);
|
||||
|
||||
SeckillTimeDO convert(SeckillTimeCreateReqVO bean);
|
||||
|
||||
SeckillTimeDO convert(SeckillTimeUpdateReqVO bean);
|
||||
|
||||
SeckillTimeRespVO convert(SeckillTimeDO bean);
|
||||
|
||||
List<SeckillTimeRespVO> convertList(List<SeckillTimeDO> list);
|
||||
|
||||
PageResult<SeckillTimeRespVO> convertPage(PageResult<SeckillTimeDO> page);
|
||||
|
||||
}
|
@@ -57,7 +57,7 @@ public class SeckillProductDO extends BaseDO {
|
||||
/**
|
||||
* 秒杀库存
|
||||
*/
|
||||
private Integer stock;
|
||||
private Integer quota;
|
||||
|
||||
/**
|
||||
* 每人限购
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime;
|
||||
package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
@@ -15,12 +16,12 @@ import java.time.LocalTime;
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@TableName("promotion_seckill_time")
|
||||
@KeySequence("promotion_seckill_time_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||
@TableName("promotion_seckill_config")
|
||||
@KeySequence("promotion_seckill_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class SeckillTimeDO extends BaseDO {
|
||||
public class SeckillConfigDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
@@ -40,8 +41,14 @@ public class SeckillTimeDO extends BaseDO {
|
||||
*/
|
||||
private LocalTime endTime;
|
||||
/**
|
||||
* 秒杀活动数量
|
||||
* 秒杀主图
|
||||
*/
|
||||
private Integer seckillActivityCount;
|
||||
private String picUrl;
|
||||
/**
|
||||
* 状态 开启:0 禁用:1
|
||||
* <p>
|
||||
* 枚举 {@link CommonStatusEnum 对应的类}
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
}
|
@@ -0,0 +1,45 @@
|
||||
package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.time.LocalTime;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface SeckillConfigMapper extends BaseMapperX<SeckillConfigDO> {
|
||||
|
||||
default List<SeckillConfigDO> selectListByTime(LocalTime time) {
|
||||
return selectList(SeckillConfigDO::getStartTime, SeckillConfigDO::getEndTime, time);
|
||||
}
|
||||
|
||||
default List<SeckillConfigDO> selectListByTime(LocalTime startTime, LocalTime endTime) {
|
||||
return selectList(new LambdaQueryWrapper<SeckillConfigDO>()
|
||||
.ge(SeckillConfigDO::getStartTime, startTime)
|
||||
.le(SeckillConfigDO::getEndTime, endTime));
|
||||
}
|
||||
|
||||
default void updateActivityCount(Collection<Long> ids, String type, Integer count) {
|
||||
new LambdaUpdateChainWrapper<>(this)
|
||||
.in(SeckillConfigDO::getId, ids)
|
||||
.setSql("`seckill_activity_count` = `seckill_activity_count` " + type + count)
|
||||
.update();
|
||||
}
|
||||
|
||||
default PageResult<SeckillConfigDO> selectPage(SeckillConfigPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<SeckillConfigDO>()
|
||||
.likeIfPresent(SeckillConfigDO::getName, reqVO.getName())
|
||||
.betweenIfPresent(SeckillConfigDO::getStartTime, reqVO.getStartTime())
|
||||
.betweenIfPresent(SeckillConfigDO::getEndTime, reqVO.getEndTime())
|
||||
.eqIfPresent(SeckillConfigDO::getStatus, reqVO.getStatus())
|
||||
.orderByDesc(SeckillConfigDO::getId));
|
||||
}
|
||||
|
||||
}
|
@@ -1,32 +0,0 @@
|
||||
package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.time.LocalTime;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> {
|
||||
|
||||
default List<SeckillTimeDO> selectListByTime(LocalTime time) {
|
||||
return selectList(SeckillTimeDO::getStartTime, SeckillTimeDO::getEndTime, time);
|
||||
}
|
||||
|
||||
default List<SeckillTimeDO> selectListByTime(LocalTime startTime, LocalTime endTime) {
|
||||
return selectList(new LambdaQueryWrapper<SeckillTimeDO>()
|
||||
.ge(SeckillTimeDO::getStartTime, startTime)
|
||||
.le(SeckillTimeDO::getEndTime, endTime));
|
||||
}
|
||||
|
||||
default void updateActivityCount(Collection<Long> ids, String type, Integer count) {
|
||||
new LambdaUpdateChainWrapper<>(this)
|
||||
.in(SeckillTimeDO::getId, ids)
|
||||
.setSql("`seckill_activity_count` = `seckill_activity_count` " + type + count)
|
||||
.update();
|
||||
}
|
||||
}
|
@@ -1,15 +1,16 @@
|
||||
package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity;
|
||||
|
||||
import java.util.*;
|
||||
import javax.validation.*;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 秒杀活动 Service 接口
|
||||
*
|
||||
@@ -77,4 +78,5 @@ public interface SeckillActivityService {
|
||||
* @return 活动商品列表
|
||||
*/
|
||||
List<SeckillProductDO> getSeckillProductListByActivityId(Long id);
|
||||
|
||||
}
|
||||
|
@@ -13,7 +13,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.
|
||||
import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper;
|
||||
import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper;
|
||||
import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
|
||||
import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeService;
|
||||
import cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig.SeckillConfigService;
|
||||
import cn.iocoder.yudao.module.promotion.util.PromotionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@@ -34,29 +34,30 @@ import static java.util.Arrays.asList;
|
||||
@Service
|
||||
@Validated
|
||||
public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
|
||||
@Resource
|
||||
private SeckillActivityMapper seckillActivityMapper;
|
||||
@Resource
|
||||
private SeckillProductMapper seckillProductMapper;
|
||||
@Resource
|
||||
private SeckillTimeService seckillTimeService;
|
||||
private SeckillConfigService seckillConfigService;
|
||||
|
||||
@Override
|
||||
public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) {
|
||||
// 校验商品是否冲突
|
||||
validateSeckillActivityProductConflicts(null, createReqVO.getProducts());
|
||||
// 校验秒杀时段是否存在
|
||||
seckillTimeService.validateSeckillTimeExists(createReqVO.getTimeIds());
|
||||
seckillConfigService.validateSeckillConfigExists(createReqVO.getTimeIds());
|
||||
|
||||
// 插入秒杀活动
|
||||
SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO)
|
||||
.setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));
|
||||
seckillActivityMapper.insert(seckillActivity);
|
||||
// 插入商品
|
||||
List<SeckillProductDO> productDOS = SeckillActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), seckillActivity);
|
||||
seckillProductMapper.insertBatch(productDOS);
|
||||
List<SeckillProductDO> productDOs = SeckillActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), seckillActivity);
|
||||
seckillProductMapper.insertBatch(productDOs);
|
||||
// 更新秒杀时段的秒杀活动数量
|
||||
seckillTimeService.sekillActivityCountIncr(createReqVO.getTimeIds());
|
||||
seckillConfigService.seckillActivityCountIncr(createReqVO.getTimeIds());
|
||||
return seckillActivity.getId();
|
||||
}
|
||||
|
||||
@@ -77,17 +78,16 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
// 更新商品
|
||||
updateSeckillProduct(updateReqVO);
|
||||
// 更新秒杀时段的秒杀活动数量
|
||||
updateSeckillTimeActivityCount(seckillActivity, updateReqVO.getTimeIds());
|
||||
updateSeckillConfigActivityCount(seckillActivity, updateReqVO.getTimeIds());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 更新秒杀时段的秒杀活动数量
|
||||
*
|
||||
* @param seckillActivity 查询出的秒杀活动
|
||||
* @param updateTimeIds 更新后的秒杀时段id列表
|
||||
*/
|
||||
private void updateSeckillTimeActivityCount(SeckillActivityDO seckillActivity, List<Long> updateTimeIds) {
|
||||
private void updateSeckillConfigActivityCount(SeckillActivityDO seckillActivity, List<Long> updateTimeIds) {
|
||||
// 查询出 timeIds
|
||||
List<Long> existsTimeIds = seckillActivity.getTimeIds();
|
||||
// 需要减少的时间段
|
||||
@@ -96,10 +96,10 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
updateTimeIds.removeIf(existsTimeIds::contains);
|
||||
// 更新减少时间段和增加时间段
|
||||
if (CollUtil.isNotEmpty(updateTimeIds)) {
|
||||
seckillTimeService.sekillActivityCountIncr(updateTimeIds);
|
||||
seckillConfigService.seckillActivityCountIncr(updateTimeIds);
|
||||
}
|
||||
if (CollUtil.isNotEmpty(reduceIds)) {
|
||||
seckillTimeService.sekillActivityCountDecr(reduceIds);
|
||||
seckillConfigService.seckillActivityCountDecr(reduceIds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,11 +113,11 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
* @param updateReqVO 更新的请求VO
|
||||
*/
|
||||
private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) {
|
||||
List<SeckillProductDO> seckillProductDOS = seckillProductMapper.selectListByActivityId(updateReqVO.getId());
|
||||
List<SeckillProductDO> seckillProductDOs = seckillProductMapper.selectListByActivityId(updateReqVO.getId());
|
||||
List<SeckillActivityBaseVO.Product> products = updateReqVO.getProducts();
|
||||
|
||||
// 计算需要删除的数据
|
||||
List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOS, SeckillProductDO::getId,
|
||||
List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOs, SeckillProductDO::getId,
|
||||
seckillProductDO -> products.stream()
|
||||
.noneMatch(product -> SeckillActivityConvert.INSTANCE.isEquals(seckillProductDO, product)));
|
||||
if (CollUtil.isNotEmpty(deleteIds)) {
|
||||
@@ -127,7 +127,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
// 计算需要新增的数据
|
||||
List<SeckillProductDO> newSeckillProductDOs = CollectionUtils.convertList(products,
|
||||
product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId()));
|
||||
newSeckillProductDOs.removeIf(product -> seckillProductDOS.stream()
|
||||
newSeckillProductDOs.removeIf(product -> seckillProductDOs.stream()
|
||||
.anyMatch(seckillProduct -> SeckillActivityConvert.INSTANCE.isEquals(seckillProduct, product)));
|
||||
if (CollUtil.isNotEmpty(newSeckillProductDOs)) {
|
||||
seckillProductMapper.insertBatch(newSeckillProductDOs);
|
||||
@@ -147,21 +147,21 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
if (CollUtil.isEmpty(products)) {
|
||||
return;
|
||||
}
|
||||
List<SeckillProductDO> seckillProductDOS = seckillProductMapper
|
||||
List<SeckillProductDO> seckillProductDOs = seckillProductMapper
|
||||
.selectListBySkuIds(CollectionUtils.convertSet(products, SeckillActivityBaseVO.Product::getSkuId));
|
||||
if (CollUtil.isEmpty(seckillProductDOS)) {
|
||||
if (CollUtil.isEmpty(seckillProductDOs)) {
|
||||
return;
|
||||
}
|
||||
List<SeckillActivityDO> seckillActivityDOS = seckillActivityMapper
|
||||
.selectBatchIds(CollectionUtils.convertSet(seckillProductDOS, SeckillProductDO::getActivityId));
|
||||
List<SeckillActivityDO> seckillActivityDOs = seckillActivityMapper
|
||||
.selectBatchIds(CollectionUtils.convertSet(seckillProductDOs, SeckillProductDO::getActivityId));
|
||||
if (id != null) { // 排除自己这个活动
|
||||
seckillActivityDOS.removeIf(item -> id.equals(item.getId()));
|
||||
seckillActivityDOs.removeIf(item -> id.equals(item.getId()));
|
||||
}
|
||||
// 排除不满足 status 的活动
|
||||
List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus());
|
||||
seckillActivityDOS.removeIf(item -> !statuses.contains(item.getStatus()));
|
||||
seckillActivityDOs.removeIf(item -> !statuses.contains(item.getStatus()));
|
||||
// 如果非空,则说明冲突
|
||||
if (CollUtil.isNotEmpty(seckillActivityDOS)) {
|
||||
if (CollUtil.isNotEmpty(seckillActivityDOs)) {
|
||||
throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS);
|
||||
}
|
||||
}
|
||||
@@ -190,7 +190,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
|
||||
throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END);
|
||||
}
|
||||
// 更新秒杀时段的秒杀活动数量
|
||||
seckillTimeService.sekillActivityCountDecr(seckillActivity.getTimeIds());
|
||||
seckillConfigService.seckillActivityCountDecr(seckillActivity.getTimeIds());
|
||||
// 删除
|
||||
seckillActivityMapper.deleteById(id);
|
||||
}
|
||||
|
@@ -1,8 +1,10 @@
|
||||
package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime;
|
||||
package cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig;
|
||||
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.Collection;
|
||||
@@ -13,7 +15,7 @@ import java.util.List;
|
||||
*
|
||||
* @author halfninety
|
||||
*/
|
||||
public interface SeckillTimeService {
|
||||
public interface SeckillConfigService {
|
||||
|
||||
/**
|
||||
* 创建秒杀时段
|
||||
@@ -21,21 +23,21 @@ public interface SeckillTimeService {
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createSeckillTime(@Valid SeckillTimeCreateReqVO createReqVO);
|
||||
Long createSeckillConfig(@Valid SeckillConfigCreateReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新秒杀时段
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateSeckillTime(@Valid SeckillTimeUpdateReqVO updateReqVO);
|
||||
void updateSeckillConfig(@Valid SeckillConfigUpdateReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 删除秒杀时段
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteSeckillTime(Long id);
|
||||
void deleteSeckillConfig(Long id);
|
||||
|
||||
/**
|
||||
* 获得秒杀时段
|
||||
@@ -43,28 +45,28 @@ public interface SeckillTimeService {
|
||||
* @param id 编号
|
||||
* @return 秒杀时段
|
||||
*/
|
||||
SeckillTimeDO getSeckillTime(Long id);
|
||||
SeckillConfigDO getSeckillConfig(Long id);
|
||||
|
||||
/**
|
||||
* 获得所有秒杀时段列表
|
||||
*
|
||||
* @return 所有秒杀时段列表
|
||||
*/
|
||||
List<SeckillTimeDO> getSeckillTimeList();
|
||||
List<SeckillConfigDO> getSeckillConfigList();
|
||||
|
||||
/**
|
||||
* 校验秒杀时段是否存在
|
||||
*
|
||||
* @param timeIds 秒杀时段id集合
|
||||
*/
|
||||
void validateSeckillTimeExists(Collection<Long> timeIds);
|
||||
void validateSeckillConfigExists(Collection<Long> timeIds);
|
||||
|
||||
/**
|
||||
* 秒杀时段列表的秒杀活动数量加 1
|
||||
*
|
||||
* @param ids 秒杀时段id列表
|
||||
*/
|
||||
void sekillActivityCountIncr(Collection<Long> ids);
|
||||
void seckillActivityCountIncr(Collection<Long> ids);
|
||||
|
||||
|
||||
/**
|
||||
@@ -72,5 +74,14 @@ public interface SeckillTimeService {
|
||||
*
|
||||
* @param ids 秒杀时段id列表
|
||||
*/
|
||||
void sekillActivityCountDecr(Collection<Long> ids);
|
||||
void seckillActivityCountDecr(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 获得秒杀时间段配置分页数据
|
||||
*
|
||||
* @param pageVO 分页请求参数
|
||||
* @return 秒杀时段分页列表
|
||||
*/
|
||||
PageResult<SeckillConfigDO> getSeckillConfigPage(SeckillConfigPageReqVO pageVO);
|
||||
|
||||
}
|
@@ -0,0 +1,131 @@
|
||||
package cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.convert.seckill.seckillconfig.SeckillConfigConvert;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig.SeckillConfigMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalTime;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_TIME_CONFLICTS;
|
||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_TIME_NOT_EXISTS;
|
||||
|
||||
/**
|
||||
* 秒杀时段 Service 实现类
|
||||
*
|
||||
* @author halfninety
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class SeckillConfigServiceImpl implements SeckillConfigService {
|
||||
|
||||
@Resource
|
||||
private SeckillConfigMapper seckillConfigMapper;
|
||||
|
||||
@Override
|
||||
public Long createSeckillConfig(SeckillConfigCreateReqVO createReqVO) {
|
||||
// 校验时间段是否冲突
|
||||
validateSeckillConfigConflict(null, createReqVO.getStartTime(), createReqVO.getEndTime());
|
||||
// 插入
|
||||
SeckillConfigDO seckillConfig = SeckillConfigConvert.INSTANCE.convert(createReqVO);
|
||||
seckillConfigMapper.insert(seckillConfig);
|
||||
// 返回
|
||||
return seckillConfig.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSeckillConfig(SeckillConfigUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateSeckillConfigExists(updateReqVO.getId());
|
||||
// 校验时间段是否冲突
|
||||
validateSeckillConfigConflict(updateReqVO.getId(), updateReqVO.getStartTime(), updateReqVO.getEndTime());
|
||||
// 更新
|
||||
SeckillConfigDO updateObj = SeckillConfigConvert.INSTANCE.convert(updateReqVO);
|
||||
seckillConfigMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteSeckillConfig(Long id) {
|
||||
// 校验存在
|
||||
this.validateSeckillConfigExists(id);
|
||||
// 删除
|
||||
seckillConfigMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateSeckillConfigExists(Long id) {
|
||||
if (seckillConfigMapper.selectById(id) == null) {
|
||||
throw exception(SECKILL_TIME_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验时间是否存在冲突
|
||||
*
|
||||
* @param startTime 开始时间
|
||||
* @param endTime 结束时间
|
||||
*/
|
||||
private void validateSeckillConfigConflict(Long id, LocalTime startTime, LocalTime endTime) {
|
||||
//查询开始时间,结束时间,是否在别人的时间段内
|
||||
List<SeckillConfigDO> startTimeList = seckillConfigMapper.selectListByTime(startTime);
|
||||
List<SeckillConfigDO> endTimeList = seckillConfigMapper.selectListByTime(endTime);
|
||||
//查询自己时间段内是否有时间段
|
||||
List<SeckillConfigDO> startEndTimeList = seckillConfigMapper.selectListByTime(startTime, endTime);
|
||||
if (id != null) {
|
||||
//移除自己
|
||||
startTimeList.removeIf(seckillConfig -> Objects.equals(seckillConfig.getId(), id));
|
||||
endTimeList.removeIf(seckillConfig -> Objects.equals(seckillConfig.getId(), id));
|
||||
startEndTimeList.removeIf(seckillConfig -> Objects.equals(seckillConfig.getId(), id));
|
||||
}
|
||||
if (CollUtil.isNotEmpty(startTimeList) || CollUtil.isNotEmpty(endTimeList)
|
||||
|| CollUtil.isNotEmpty(startEndTimeList)) {
|
||||
throw exception(SECKILL_TIME_CONFLICTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SeckillConfigDO getSeckillConfig(Long id) {
|
||||
return seckillConfigMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SeckillConfigDO> getSeckillConfigList() {
|
||||
return seckillConfigMapper.selectList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validateSeckillConfigExists(Collection<Long> timeIds) {
|
||||
if (CollUtil.isEmpty(timeIds)) {
|
||||
throw exception(SECKILL_TIME_NOT_EXISTS);
|
||||
}
|
||||
if (seckillConfigMapper.selectBatchIds(timeIds).size() != timeIds.size()) {
|
||||
throw exception(SECKILL_TIME_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seckillActivityCountIncr(Collection<Long> ids) {
|
||||
seckillConfigMapper.updateActivityCount(ids, "+", 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seckillActivityCountDecr(Collection<Long> ids) {
|
||||
seckillConfigMapper.updateActivityCount(ids, "-", 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<SeckillConfigDO> getSeckillConfigPage(SeckillConfigPageReqVO pageVO) {
|
||||
return seckillConfigMapper.selectPage(pageVO);
|
||||
}
|
||||
|
||||
}
|
@@ -1,124 +0,0 @@
|
||||
package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;
|
||||
import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert;
|
||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;
|
||||
import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime.SeckillTimeMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalTime;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_TIME_CONFLICTS;
|
||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_TIME_NOT_EXISTS;
|
||||
|
||||
/**
|
||||
* 秒杀时段 Service 实现类
|
||||
*
|
||||
* @author halfninety
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class SeckillTimeServiceImpl implements SeckillTimeService {
|
||||
|
||||
@Resource
|
||||
private SeckillTimeMapper seckillTimeMapper;
|
||||
|
||||
@Override
|
||||
public Long createSeckillTime(SeckillTimeCreateReqVO createReqVO) {
|
||||
// 校验时间段是否冲突
|
||||
validateSeckillTimeConflict(null, createReqVO.getStartTime(), createReqVO.getEndTime());
|
||||
// 插入
|
||||
SeckillTimeDO seckillTime = SeckillTimeConvert.INSTANCE.convert(createReqVO);
|
||||
seckillTimeMapper.insert(seckillTime);
|
||||
// 返回
|
||||
return seckillTime.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSeckillTime(SeckillTimeUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateSeckillTimeExists(updateReqVO.getId());
|
||||
// 校验时间段是否冲突
|
||||
validateSeckillTimeConflict(updateReqVO.getId(), updateReqVO.getStartTime(), updateReqVO.getEndTime());
|
||||
// 更新
|
||||
SeckillTimeDO updateObj = SeckillTimeConvert.INSTANCE.convert(updateReqVO);
|
||||
seckillTimeMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteSeckillTime(Long id) {
|
||||
// 校验存在
|
||||
this.validateSeckillTimeExists(id);
|
||||
// 删除
|
||||
seckillTimeMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateSeckillTimeExists(Long id) {
|
||||
if (seckillTimeMapper.selectById(id) == null) {
|
||||
throw exception(SECKILL_TIME_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验时间是否存在冲突
|
||||
*
|
||||
* @param startTime 开始时间
|
||||
* @param endTime 结束时间
|
||||
*/
|
||||
private void validateSeckillTimeConflict(Long id, LocalTime startTime, LocalTime endTime) {
|
||||
//查询开始时间,结束时间,是否在别人的时间段内
|
||||
List<SeckillTimeDO> startTimeList = seckillTimeMapper.selectListByTime(startTime);
|
||||
List<SeckillTimeDO> endTimeList = seckillTimeMapper.selectListByTime(endTime);
|
||||
//查询自己时间段内是否有时间段
|
||||
List<SeckillTimeDO> startEndTimeList = seckillTimeMapper.selectListByTime(startTime, endTime);
|
||||
if (id != null) {
|
||||
//移除自己
|
||||
startTimeList.removeIf(seckillTime -> Objects.equals(seckillTime.getId(), id));
|
||||
endTimeList.removeIf(seckillTime -> Objects.equals(seckillTime.getId(), id));
|
||||
startEndTimeList.removeIf(seckillTime -> Objects.equals(seckillTime.getId(), id));
|
||||
}
|
||||
if (CollUtil.isNotEmpty(startTimeList) || CollUtil.isNotEmpty(endTimeList)
|
||||
|| CollUtil.isNotEmpty(startEndTimeList)) {
|
||||
throw exception(SECKILL_TIME_CONFLICTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SeckillTimeDO getSeckillTime(Long id) {
|
||||
return seckillTimeMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SeckillTimeDO> getSeckillTimeList() {
|
||||
return seckillTimeMapper.selectList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validateSeckillTimeExists(Collection<Long> timeIds) {
|
||||
if (CollUtil.isEmpty(timeIds)) {
|
||||
throw exception(SECKILL_TIME_NOT_EXISTS);
|
||||
}
|
||||
if (seckillTimeMapper.selectBatchIds(timeIds).size() != timeIds.size()) {
|
||||
throw exception(SECKILL_TIME_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sekillActivityCountIncr(Collection<Long> ids) {
|
||||
seckillTimeMapper.updateActivityCount(ids, "+", 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sekillActivityCountDecr(Collection<Long> ids) {
|
||||
seckillTimeMapper.updateActivityCount(ids, "-", 1);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user