From 83ee1c61291fd94060f95462d4a6970b3fb8cbbc Mon Sep 17 00:00:00 2001 From: halfninety <690534687@qq.com> Date: Sat, 19 Nov 2022 14:25:36 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E7=A7=92=E6=9D=80=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=95=86=E5=93=81=EF=BC=8C=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/enums/ErrorCodeConstants.java | 3 + .../SeckillActivityController.java | 100 ++++++++++ .../vo/SeckillActivityBaseVO.java | 41 +++++ .../vo/SeckillActivityCreateReqVO.java | 25 +++ .../vo/SeckillActivityExcelVO.java | 46 +++++ .../vo/SeckillActivityExportReqVO.java | 28 +++ .../vo/SeckillActivityPageReqVO.java | 30 +++ .../vo/SeckillActivityRespVO.java | 25 +++ .../vo/SeckillActivityUpdateReqVO.java | 29 +++ .../SeckillActivityConvert.java | 34 ++++ .../seckillactivity/SeckillActivityDO.java | 72 ++++++++ .../SeckillActivityMapper.java | 38 ++++ .../SeckillActivityService.java | 70 +++++++ .../SeckillActivityServiceImpl.java | 82 +++++++++ .../seckillactivity/SeckillActivityMapper.xml | 12 ++ .../SeckillActivityServiceImplTest.java | 173 ++++++++++++++++++ .../src/api/promotion/seckillActivity.js | 54 ++++++ .../views/promotion/seckillActivity/index.vue | 0 18 files changed, 862 insertions(+) create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExcelVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.xml create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java create mode 100644 yudao-ui-admin/src/api/promotion/seckillActivity.js create mode 100644 yudao-ui-admin/src/views/promotion/seckillActivity/index.vue diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java index 7e8fadede..b6ac66757 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java @@ -45,4 +45,7 @@ public interface ErrorCodeConstants { // ========== Price 相关 1003007000 ============ ErrorCode PRICE_CALCULATE_PAY_PRICE_ILLEGAL = new ErrorCode(1003007000, "支付价格计算异常,原因:价格小于等于 0"); + // ========== 秒杀活动 1003008000 ========== + ErrorCode SECKILL_ACTIVITY_NOT_EXISTS = new ErrorCode(1003008000, "秒杀活动不存在"); + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java new file mode 100644 index 000000000..7ddcd3b55 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.convert.seckillactivity.SeckillActivityConvert; +import cn.iocoder.yudao.module.promotion.service.seckillactivity.SeckillActivityService; + +@Api(tags = "管理后台 - 秒杀活动") +@RestController +@RequestMapping("/promotion/seckill-activity") +@Validated +public class SeckillActivityController { + + @Resource + private SeckillActivityService seckillActivityService; + + @PostMapping("/create") + @ApiOperation("创建秒杀活动") + @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:create')") + public CommonResult<Long> createSeckillActivity(@Valid @RequestBody SeckillActivityCreateReqVO createReqVO) { + return success(seckillActivityService.createSeckillActivity(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新秒杀活动") + @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:update')") + public CommonResult<Boolean> updateSeckillActivity(@Valid @RequestBody SeckillActivityUpdateReqVO updateReqVO) { + seckillActivityService.updateSeckillActivity(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除秒杀活动") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:delete')") + public CommonResult<Boolean> deleteSeckillActivity(@RequestParam("id") Long id) { + seckillActivityService.deleteSeckillActivity(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得秒杀活动") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:query')") + public CommonResult<SeckillActivityRespVO> getSeckillActivity(@RequestParam("id") Long id) { + SeckillActivityDO seckillActivity = seckillActivityService.getSeckillActivity(id); + return success(SeckillActivityConvert.INSTANCE.convert(seckillActivity)); + } + + @GetMapping("/list") + @ApiOperation("获得秒杀活动列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:query')") + public CommonResult<List<SeckillActivityRespVO>> getSeckillActivityList(@RequestParam("ids") Collection<Long> ids) { + List<SeckillActivityDO> list = seckillActivityService.getSeckillActivityList(ids); + return success(SeckillActivityConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得秒杀活动分页") + @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:query')") + public CommonResult<PageResult<SeckillActivityRespVO>> getSeckillActivityPage(@Valid SeckillActivityPageReqVO pageVO) { + PageResult<SeckillActivityDO> pageResult = seckillActivityService.getSeckillActivityPage(pageVO); + return success(SeckillActivityConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出秒杀活动 Excel") + @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:export')") + @OperateLog(type = EXPORT) + public void exportSeckillActivityExcel(@Valid SeckillActivityExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List<SeckillActivityDO> list = seckillActivityService.getSeckillActivityList(exportReqVO); + // 导出 Excel + List<SeckillActivityExcelVO> datas = SeckillActivityConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "秒杀活动.xls", "数据", SeckillActivityExcelVO.class, datas); + } + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java new file mode 100644 index 000000000..88f0d2cc7 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 秒杀活动 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SeckillActivityBaseVO { + + @ApiModelProperty(value = "秒杀活动名称", required = true, example = "晚九点限时秒杀") + @NotNull(message = "秒杀活动名称不能为空") + private String name; + + @ApiModelProperty(value = "活动状态", required = true, example = "进行中") + @NotNull(message = "活动状态不能为空") + private Integer status; + + @ApiModelProperty(value = "活动开始时间", required = true) + @NotNull(message = "活动开始时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date startTime; + + @ApiModelProperty(value = "活动结束时间", required = true) + @NotNull(message = "活动结束时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "订单实付金额,单位:分", required = true) + @NotNull(message = "订单实付金额,单位:分不能为空") + private BigDecimal totalPrice; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java new file mode 100644 index 000000000..81028573f --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 秒杀活动创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO { + + @ApiModelProperty(value = "备注", example = "限时秒杀活动") + private String remark; + + @ApiModelProperty(value = "排序", required = true) + @NotNull(message = "排序不能为空") + private Integer sort; + + @ApiModelProperty(value = "秒杀时段id", required = true) + @NotNull(message = "秒杀时段id不能为空") + private Long timeId; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExcelVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExcelVO.java new file mode 100644 index 000000000..ea0d5f49f --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExcelVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + + +/** + * 秒杀活动 Excel VO + * + * @author 芋道源码 + */ +@Data +public class SeckillActivityExcelVO { + + @ExcelProperty("秒杀活动名称") + private String name; + + @ExcelProperty(value = "活动状态", converter = DictConvert.class) + @DictFormat("promotion_activity_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + private Integer status; + + @ExcelProperty("活动开始时间") + private Date startTime; + + @ExcelProperty("活动结束时间") + private Date endTime; + + @ExcelProperty("付款订单数") + private Integer orderCount; + + @ExcelProperty("付款人数") + private Integer userCount; + + @ExcelProperty("订单实付金额,单位:分") + private BigDecimal totalPrice; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java new file mode 100644 index 000000000..a589af74e --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 秒杀活动 Excel 导出 Request VO", description = "参数和 SeckillActivityPageReqVO 是一致的") +@Data +public class SeckillActivityExportReqVO { + + @ApiModelProperty(value = "秒杀活动名称", example = "晚九点限时秒杀") + private String name; + + @ApiModelProperty(value = "活动状态", example = "进行中") + private Integer status; + + @ApiModelProperty(value = "秒杀时段id") + private Long timeId; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java new file mode 100644 index 000000000..650010ae1 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 秒杀活动分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillActivityPageReqVO extends PageParam { + + @ApiModelProperty(value = "秒杀活动名称", example = "晚九点限时秒杀") + private String name; + + @ApiModelProperty(value = "活动状态", example = "进行中") + private Integer status; + + @ApiModelProperty(value = "秒杀时段id") + private Long timeId; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java new file mode 100644 index 000000000..444d74eee --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 秒杀活动 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillActivityRespVO extends SeckillActivityBaseVO { + + @ApiModelProperty(value = "秒杀活动id", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "付款订单数", required = true) + private Integer orderCount; + + @ApiModelProperty(value = "付款人数", required = true) + private Integer userCount; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java new file mode 100644 index 000000000..e86e398f5 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 秒杀活动更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillActivityUpdateReqVO extends SeckillActivityBaseVO { + + @ApiModelProperty(value = "秒杀活动编号", required = true, example = "224") + @NotNull(message = "秒杀活动编号不能为空") + private Long id; + + @ApiModelProperty(value = "备注", example = "限时秒杀活动") + private String remark; + + @ApiModelProperty(value = "排序", required = true) + @NotNull(message = "排序不能为空") + private Integer sort; + + @ApiModelProperty(value = "秒杀时段id", required = true) + @NotNull(message = "秒杀时段id不能为空") + private Long timeId; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java new file mode 100644 index 000000000..8e416aef4 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.promotion.convert.seckillactivity; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; + +/** + * 秒杀活动 Convert + * + * @author 芋道源码 + */ +@Mapper +public interface SeckillActivityConvert { + + SeckillActivityConvert INSTANCE = Mappers.getMapper(SeckillActivityConvert.class); + + SeckillActivityDO convert(SeckillActivityCreateReqVO bean); + + SeckillActivityDO convert(SeckillActivityUpdateReqVO bean); + + SeckillActivityRespVO convert(SeckillActivityDO bean); + + List<SeckillActivityRespVO> convertList(List<SeckillActivityDO> list); + + PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page); + + List<SeckillActivityExcelVO> convertList02(List<SeckillActivityDO> list); + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java new file mode 100644 index 000000000..c52990721 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 秒杀活动 DO + * + * @author 芋道源码 + */ +@TableName("promotion_seckill_activity") +@KeySequence("promotion_seckill_activity_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SeckillActivityDO extends BaseDO { + + /** + * 秒杀活动编号 + */ + @TableId + private Long id; + /** + * 秒杀活动名称 + */ + private String name; + /** + * 活动状态 + * + * 枚举 {@link TODO promotion_activity_status 对应的类} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 活动开始时间 + */ + private Date startTime; + /** + * 活动结束时间 + */ + private Date endTime; + /** + * 排序 + */ + private Integer sort; + /** + * 秒杀时段id + */ + private Long timeId; + /** + * 付款订单数 + */ + private Integer orderCount; + /** + * 付款人数 + */ + private Integer userCount; + /** + * 订单实付金额,单位:分 + */ + private BigDecimal totalPrice; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java new file mode 100644 index 000000000..6b3319361 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; + +/** + * 秒杀活动 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface SeckillActivityMapper extends BaseMapperX<SeckillActivityDO> { + + default PageResult<SeckillActivityDO> selectPage(SeckillActivityPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX<SeckillActivityDO>() + .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) + .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) + .eqIfPresent(SeckillActivityDO::getTimeId, reqVO.getTimeId()) + .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SeckillActivityDO::getId)); + } + + default List<SeckillActivityDO> selectList(SeckillActivityExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX<SeckillActivityDO>() + .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) + .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) + .eqIfPresent(SeckillActivityDO::getTimeId, reqVO.getTimeId()) + .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SeckillActivityDO::getId)); + } + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java new file mode 100644 index 000000000..6ff337fe4 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.promotion.service.seckillactivity; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +/** + * 秒杀活动 Service 接口 + * + * @author 芋道源码 + */ +public interface SeckillActivityService { + + /** + * 创建秒杀活动 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSeckillActivity(@Valid SeckillActivityCreateReqVO createReqVO); + + /** + * 更新秒杀活动 + * + * @param updateReqVO 更新信息 + */ + void updateSeckillActivity(@Valid SeckillActivityUpdateReqVO updateReqVO); + + /** + * 删除秒杀活动 + * + * @param id 编号 + */ + void deleteSeckillActivity(Long id); + + /** + * 获得秒杀活动 + * + * @param id 编号 + * @return 秒杀活动 + */ + SeckillActivityDO getSeckillActivity(Long id); + + /** + * 获得秒杀活动列表 + * + * @param ids 编号 + * @return 秒杀活动列表 + */ + List<SeckillActivityDO> getSeckillActivityList(Collection<Long> ids); + + /** + * 获得秒杀活动分页 + * + * @param pageReqVO 分页查询 + * @return 秒杀活动分页 + */ + PageResult<SeckillActivityDO> getSeckillActivityPage(SeckillActivityPageReqVO pageReqVO); + + /** + * 获得秒杀活动列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 秒杀活动列表 + */ + List<SeckillActivityDO> getSeckillActivityList(SeckillActivityExportReqVO exportReqVO); + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java new file mode 100644 index 000000000..9e23e0e29 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java @@ -0,0 +1,82 @@ +package cn.iocoder.yudao.module.promotion.service.seckillactivity; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import cn.iocoder.yudao.module.promotion.convert.seckillactivity.SeckillActivityConvert; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; + +/** + * 秒杀活动 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SeckillActivityServiceImpl implements SeckillActivityService { + + @Resource + private SeckillActivityMapper seckillActivityMapper; + + @Override + public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) { + // 插入 + SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO); + seckillActivityMapper.insert(seckillActivity); + // 返回 + return seckillActivity.getId(); + } + + @Override + public void updateSeckillActivity(SeckillActivityUpdateReqVO updateReqVO) { + // 校验存在 + this.validateSeckillActivityExists(updateReqVO.getId()); + // 更新 + SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO); + seckillActivityMapper.updateById(updateObj); + } + + @Override + public void deleteSeckillActivity(Long id) { + // 校验存在 + this.validateSeckillActivityExists(id); + // 删除 + seckillActivityMapper.deleteById(id); + } + + private void validateSeckillActivityExists(Long id) { + if (seckillActivityMapper.selectById(id) == null) { + throw exception(SECKILL_ACTIVITY_NOT_EXISTS); + } + } + + @Override + public SeckillActivityDO getSeckillActivity(Long id) { + return seckillActivityMapper.selectById(id); + } + + @Override + public List<SeckillActivityDO> getSeckillActivityList(Collection<Long> ids) { + return seckillActivityMapper.selectBatchIds(ids); + } + + @Override + public PageResult<SeckillActivityDO> getSeckillActivityPage(SeckillActivityPageReqVO pageReqVO) { + return seckillActivityMapper.selectPage(pageReqVO); + } + + @Override + public List<SeckillActivityDO> getSeckillActivityList(SeckillActivityExportReqVO exportReqVO) { + return seckillActivityMapper.selectList(exportReqVO); + } + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.xml b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.xml new file mode 100644 index 000000000..a9134c696 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper"> + + <!-- + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。 + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ + --> + +</mapper> diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java new file mode 100644 index 000000000..b95c8a0e4 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java @@ -0,0 +1,173 @@ +package cn.iocoder.yudao.module.promotion.service.seckillactivity; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link SeckillActivityServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(SeckillActivityServiceImpl.class) +public class SeckillActivityServiceImplTest extends BaseDbUnitTest { + + @Resource + private SeckillActivityServiceImpl seckillActivityService; + + @Resource + private SeckillActivityMapper seckillActivityMapper; + + @Test + public void testCreateSeckillActivity_success() { + // 准备参数 + SeckillActivityCreateReqVO reqVO = randomPojo(SeckillActivityCreateReqVO.class); + + // 调用 + Long seckillActivityId = seckillActivityService.createSeckillActivity(reqVO); + // 断言 + assertNotNull(seckillActivityId); + // 校验记录的属性是否正确 + SeckillActivityDO seckillActivity = seckillActivityMapper.selectById(seckillActivityId); + assertPojoEquals(reqVO, seckillActivity); + } + + @Test + public void testUpdateSeckillActivity_success() { + // mock 数据 + SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class); + seckillActivityMapper.insert(dbSeckillActivity);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SeckillActivityUpdateReqVO reqVO = randomPojo(SeckillActivityUpdateReqVO.class, o -> { + o.setId(dbSeckillActivity.getId()); // 设置更新的 ID + }); + + // 调用 + seckillActivityService.updateSeckillActivity(reqVO); + // 校验是否更新正确 + SeckillActivityDO seckillActivity = seckillActivityMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, seckillActivity); + } + + @Test + public void testUpdateSeckillActivity_notExists() { + // 准备参数 + SeckillActivityUpdateReqVO reqVO = randomPojo(SeckillActivityUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> seckillActivityService.updateSeckillActivity(reqVO), SECKILL_ACTIVITY_NOT_EXISTS); + } + + @Test + public void testDeleteSeckillActivity_success() { + // mock 数据 + SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class); + seckillActivityMapper.insert(dbSeckillActivity);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSeckillActivity.getId(); + + // 调用 + seckillActivityService.deleteSeckillActivity(id); + // 校验数据不存在了 + assertNull(seckillActivityMapper.selectById(id)); + } + + @Test + public void testDeleteSeckillActivity_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> seckillActivityService.deleteSeckillActivity(id), SECKILL_ACTIVITY_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetSeckillActivityPage() { + // mock 数据 + SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到 + o.setName(null); + o.setStatus(null); + o.setTimeId(null); + o.setCreateTime(null); + }); + seckillActivityMapper.insert(dbSeckillActivity); + // 测试 name 不匹配 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setName(null))); + // 测试 status 不匹配 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null))); + // 测试 timeId 不匹配 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setTimeId(null))); + // 测试 createTime 不匹配 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null))); + // 准备参数 + SeckillActivityPageReqVO reqVO = new SeckillActivityPageReqVO(); + reqVO.setName(null); + reqVO.setStatus(null); + reqVO.setTimeId(null); + reqVO.setCreateTime((new Date[]{})); + + // 调用 + PageResult<SeckillActivityDO> pageResult = seckillActivityService.getSeckillActivityPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSeckillActivity, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetSeckillActivityList() { + // mock 数据 + SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到 + o.setName(null); + o.setStatus(null); + o.setTimeId(null); + o.setCreateTime(null); + }); + seckillActivityMapper.insert(dbSeckillActivity); + // 测试 name 不匹配 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setName(null))); + // 测试 status 不匹配 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null))); + // 测试 timeId 不匹配 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setTimeId(null))); + // 测试 createTime 不匹配 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null))); + // 准备参数 + SeckillActivityExportReqVO reqVO = new SeckillActivityExportReqVO(); + reqVO.setName(null); + reqVO.setStatus(null); + reqVO.setTimeId(null); + reqVO.setCreateTime((new Date[]{})); + + // 调用 + List<SeckillActivityDO> list = seckillActivityService.getSeckillActivityList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbSeckillActivity, list.get(0)); + } + +} diff --git a/yudao-ui-admin/src/api/promotion/seckillActivity.js b/yudao-ui-admin/src/api/promotion/seckillActivity.js new file mode 100644 index 000000000..9b74081c0 --- /dev/null +++ b/yudao-ui-admin/src/api/promotion/seckillActivity.js @@ -0,0 +1,54 @@ +import request from '@/utils/request' + +// 创建秒杀活动 +export function createSeckillActivity(data) { + return request({ + url: '/promotion/seckill-activity/create', + method: 'post', + data: data + }) +} + +// 更新秒杀活动 +export function updateSeckillActivity(data) { + return request({ + url: '/promotion/seckill-activity/update', + method: 'put', + data: data + }) +} + +// 删除秒杀活动 +export function deleteSeckillActivity(id) { + return request({ + url: '/promotion/seckill-activity/delete?id=' + id, + method: 'delete' + }) +} + +// 获得秒杀活动 +export function getSeckillActivity(id) { + return request({ + url: '/promotion/seckill-activity/get?id=' + id, + method: 'get' + }) +} + +// 获得秒杀活动分页 +export function getSeckillActivityPage(query) { + return request({ + url: '/promotion/seckill-activity/page', + method: 'get', + params: query + }) +} + +// 导出秒杀活动 Excel +export function exportSeckillActivityExcel(query) { + return request({ + url: '/promotion/seckill-activity/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/yudao-ui-admin/src/views/promotion/seckillActivity/index.vue b/yudao-ui-admin/src/views/promotion/seckillActivity/index.vue new file mode 100644 index 000000000..e69de29bb From ea2a57f0a00b8a592cb8fa430c7c8cdd32a5e93b Mon Sep 17 00:00:00 2001 From: halfninety <690534687@qq.com> Date: Sun, 20 Nov 2022 16:48:56 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=A7=92=E6=9D=80?= =?UTF-8?q?=E6=97=B6=E6=AE=B5id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SeckillActivityController.java | 7 + .../vo/SeckillActivityCreateReqVO.java | 2 +- .../vo/SeckillActivityExportReqVO.java | 2 +- .../vo/SeckillActivityPageReqVO.java | 2 +- .../vo/SeckillActivityRespVO.java | 5 + .../vo/SeckillActivityUpdateReqVO.java | 2 +- .../seckillactivity/SeckillActivityDO.java | 2 +- .../views/promotion/seckillActivity/index.vue | 497 ++++++++++++++++++ 8 files changed, 514 insertions(+), 5 deletions(-) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java index 7ddcd3b55..419ae8e61 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity; import org.springframework.web.bind.annotation.*; + import javax.annotation.Resource; + import org.springframework.validation.annotation.Validated; import org.springframework.security.access.prepost.PreAuthorize; import io.swagger.annotations.*; @@ -14,11 +16,13 @@ import java.io.IOException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; + import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; @@ -65,6 +69,9 @@ public class SeckillActivityController { @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:query')") public CommonResult<SeckillActivityRespVO> getSeckillActivity(@RequestParam("id") Long id) { SeckillActivityDO seckillActivity = seckillActivityService.getSeckillActivity(id); + if (seckillActivity == null) { + return success(null); + } return success(SeckillActivityConvert.INSTANCE.convert(seckillActivity)); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java index 81028573f..e397bd57c 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java @@ -20,6 +20,6 @@ public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO { @ApiModelProperty(value = "秒杀时段id", required = true) @NotNull(message = "秒杀时段id不能为空") - private Long timeId; + private String timeId; } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java index a589af74e..e8a5e459b 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java @@ -19,7 +19,7 @@ public class SeckillActivityExportReqVO { private Integer status; @ApiModelProperty(value = "秒杀时段id") - private Long timeId; + private String timeId; @ApiModelProperty(value = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java index 650010ae1..ebfb9bb2a 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java @@ -21,7 +21,7 @@ public class SeckillActivityPageReqVO extends PageParam { private Integer status; @ApiModelProperty(value = "秒杀时段id") - private Long timeId; + private String timeId; @ApiModelProperty(value = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java index 444d74eee..3e75f5c16 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java @@ -4,6 +4,8 @@ import lombok.*; import java.util.*; import io.swagger.annotations.*; +import javax.validation.constraints.NotNull; + @ApiModel("管理后台 - 秒杀活动 Response VO") @Data @EqualsAndHashCode(callSuper = true) @@ -22,4 +24,7 @@ public class SeckillActivityRespVO extends SeckillActivityBaseVO { @ApiModelProperty(value = "创建时间", required = true) private Date createTime; + @ApiModelProperty(value = "秒杀时段id", required = true) + private String timeId; + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java index e86e398f5..f75a5294a 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java @@ -24,6 +24,6 @@ public class SeckillActivityUpdateReqVO extends SeckillActivityBaseVO { @ApiModelProperty(value = "秒杀时段id", required = true) @NotNull(message = "秒杀时段id不能为空") - private Long timeId; + private String timeId; } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java index c52990721..69edb1ff6 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java @@ -55,7 +55,7 @@ public class SeckillActivityDO extends BaseDO { /** * 秒杀时段id */ - private Long timeId; + private String timeId; /** * 付款订单数 */ diff --git a/yudao-ui-admin/src/views/promotion/seckillActivity/index.vue b/yudao-ui-admin/src/views/promotion/seckillActivity/index.vue index e69de29bb..7fff0106f 100644 --- a/yudao-ui-admin/src/views/promotion/seckillActivity/index.vue +++ b/yudao-ui-admin/src/views/promotion/seckillActivity/index.vue @@ -0,0 +1,497 @@ +<template> + <div class="app-container"> + + <!-- 搜索工作栏 --> + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" + label-width="68px"> + <el-form-item label="活动名称" prop="name"> + <el-input v-model="queryParams.name" placeholder="请输入秒杀活动名称" clearable + @keyup.enter.native="handleQuery" /> + </el-form-item> + <el-form-item label="活动状态" prop="status"> + <el-select v-model="queryParams.status" placeholder="请选择活动状态" clearable size="small"> + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PROMOTION_ACTIVITY_STATUS)" :key="dict.value" + :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item label="参与场次" prop="timeId"> + <el-select v-model="queryParams.timeId" placeholder="请选择参与场次" clearable size="small"> + <el-option v-for="item in seckillTimeList" :key="item.id" :label="item.name" :value="item.id" /> + </el-select> + <!-- <el-option v-for="seckill in seckillTimeList" :key="seckill.id" :lable="seckill.name" :value="seckill.id" /> --> + <!-- <el-input v-model="queryParams.timeId" placeholder="请输入秒杀时段id" clearable @keyup.enter.native="handleQuery" /> --> + </el-form-item> + <el-form-item label="创建时间" prop="createTime"> + <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" + type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" + :default-time="['00:00:00', '23:59:59']" /> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> + <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button> + </el-form-item> + </el-form> + + <!-- 操作工具栏 --> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" + v-hasPermi="['promotion:seckill-activity:create']">新增秒杀活动</el-button> + </el-col> + <el-col :span="1.5"> + <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" + :loading="exportLoading" v-hasPermi="['promotion:seckill-activity:export']">导出</el-button> + </el-col> + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> + </el-row> + + <!-- 列表 --> + <el-table v-loading="loading" :data="list"> + <el-table-column label="活动名称" align="center" prop="name" /> + <el-table-column label="活动状态" align="center" prop="status"> + <template slot-scope="scope"> + <dict-tag :type="DICT_TYPE.PROMOTION_ACTIVITY_STATUS" :value="scope.row.status" /> + </template> + </el-table-column> + <el-table-column label="参与场次" prop="timeId" width="250"> + <template slot-scope="scope"> + <span v-for="item in seckillTimeList" :key="item.id" + v-if="scope.row.timeId.indexOf(item.id) !== -1"> + <el-tag style="margin:4px;" size="small">{{ item.name }}</el-tag> + </span> + </template> + </el-table-column> + <el-table-column label="活动开始时间" align="center" prop="startTime" width="190"> + <template slot-scope="scope"> + <span>{{ "开始: " + parseTime(scope.row.startTime) }}</span> + <span>{{ "结束: " + parseTime(scope.row.endTime) }}</span> + </template> + </el-table-column> + + <el-table-column label="付款订单数" align="center" prop="orderCount" /> + <el-table-column label="付款人数" align="center" prop="userCount" /> + <el-table-column label="订单实付金额" align="center"> + <template slot-scope="scope"> + ¥{{ (scope.row.totalPrice / 100.0).toFixed(2) }} + </template> + </el-table-column> + <el-table-column label="创建时间" align="center" prop="createTime" width="180"> + <template slot-scope="scope"> + <span>{{ parseTime(scope.row.createTime) }}</span> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> + <template slot-scope="scope"> + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" + v-hasPermi="['promotion:seckill-activity:update']">修改</el-button> + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" + v-hasPermi="['promotion:seckill-activity:delete']">删除</el-button> + </template> + </el-table-column> + </el-table> + <!-- 分页组件 --> + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" + @pagination="getList" /> + + <!-- 对话框(添加 / 修改) --> + <el-dialog :title="title" :visible.sync="open" width="1200px" v-dialogDrag append-to-body> + <el-form ref="form" :model="form" :rules="rules" label-width="80px"> + <el-form-item label="活动名称" prop="name"> + <el-input v-model="form.name" placeholder="请输入秒杀活动名称" /> + </el-form-item> + <!-- <el-form-item label="活动状态" prop="status"> + <el-radio-group v-model="form.status"> + <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.PROMOTION_ACTIVITY_STATUS)" + :key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio> + </el-radio-group> + </el-form-item> --> + + <el-form-item label="活动时间" prop="startAndEndTime"> + <el-date-picker clearable v-model="form.startAndEndTime" type="datetimerange" + value-format="timestamp" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" + style="width: 1080px" /> + </el-form-item> + <!-- + <el-form-item label="活动结束时间" prop="endTime"> + <el-date-picker clearable v-model="form.endTime" type="date" value-format="timestamp" placeholder="选择活动结束时间" /> + </el-form-item> --> + + <el-form-item label="排序" prop="sort"> + <el-input-number v-model="form.sort" controls-position="right" :min="0" :max="10000"> + </el-input-number> + </el-form-item> + + <!-- <el-form-item label="秒杀时段id" prop="timeId"> + <el-input v-model="form.timeId" placeholder="请输入秒杀时段id" /> + </el-form-item> + <el-form-item label="订单实付金额(分)" prop="totalPrice"> + <el-input v-model="form.totalPrice" placeholder="请输入订单实付金额(分)" /> + </el-form-item> --> + + <el-form-item label="备注" prop="remark"> + <el-input type="textarea" v-model="form.remark" placeholder="请输入备注" /> + </el-form-item> + <el-form-item label="场次选择"> + <el-select v-model="form.timeIds" placeholder="请选择参与场次" clearable size="small" multiple filterable + style="width: 880px"> + <el-option v-for="item in seckillTimeList" :key="item.id" :label="item.name" :value="item.id"> + <span style="float: left">{{ item.name + ': { ' }} {{ item.startTime }} -- {{ item.endTime + + ' }' + }}</span> + <span style="float: right; color: #8492a6; font-size: 13px"></span> + </el-option> + </el-select> + </el-form-item> + + <el-form-item label="商品选择"> + <el-select v-model="form.skuIds" placeholder="请选择活动商品" clearable size="small" multiple filterable + style="width: 880px" @change="changeFormSku"> + <el-option v-for="item in productSkus" :key="item.id" :label="item.spuName + ' ' + item.name" + :value="item.id"> + <span style="float: left">{{ item.spuName }} {{ item.name }}</span> + <span style="float: right; color: #8492a6; font-size: 13px">¥{{ (item.price / + 100.0).toFixed(2) + }}</span> + </el-option> + </el-select> + + <el-row> + <el-button type="primary" size="mini" @click="batchEditProduct('limitBuyCount')">限购</el-button> + <el-button type="primary" size="mini" @click="batchEditProduct('seckillPrice')">秒杀价</el-button> + <el-button type="primary" size="mini" @click="batchEditProduct('seckillStock')">秒杀库存</el-button> + </el-row> + + <el-table v-loading="loading" ref="productsTable" :data="form.products"> + <el-table-column type="selection" width="55"> + </el-table-column> + <el-table-column label="商品名称" align="center" width="200"> + <template slot-scope="scope"> + {{ scope.row.spuName }} {{ scope.row.name }} + </template> + </el-table-column> + <el-table-column label="商品价格" align="center" prop="price"> + <template slot-scope="scope"> + ¥{{ (scope.row.price / 100.0).toFixed(2) }} + </template> + </el-table-column> + <el-table-column label="库存" align="center" prop="productStock" /> + <el-table-column label="限购(0为不限购)" align="center" width="150"> + <template slot-scope="scope"> + <el-input-number v-model="scope.row.limitBuyCount" size="mini" controls-position="right" + :min="0" :max="10000"> + </el-input-number> + </template> + </el-table-column> + + <el-table-column label="秒杀价(元)" align="center" width="150"> + <template slot-scope="scope"> + <el-input-number v-model="scope.row.seckillPrice" size="mini" controls-position="right" + :precision="2" :min="0" :max="10000"> + </el-input-number> + </template> + </el-table-column> + + <el-table-column label="秒杀库存" align="center" width="150"> + <template slot-scope="scope"> + <el-input-number v-model="scope.row.seckillStock" size="mini" controls-position="right" + :min="0" :max="10000"> + </el-input-number> + </template> + </el-table-column> + + <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> + <template slot-scope="scope"> + <el-button size="mini" type="text" icon="el-icon-delete" + @click="removeFormSku(scope.row.skuId)">删除 + </el-button> + </template> + </el-table-column> + </el-table> + </el-form-item> + + + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="submitForm">确 定</el-button> + <el-button @click="cancel">取 消</el-button> + </div> + </el-dialog> + </div> +</template> + +<script> +import { getSkuOptionList } from "@/api/mall/product/sku"; +import { createSeckillActivity, updateSeckillActivity, deleteSeckillActivity, getSeckillActivity, getSeckillActivityPage, exportSeckillActivityExcel } from "@/api/promotion/seckillActivity"; +import { getSeckillTimeList } from "@/api/promotion/seckillTime"; +import router from '@/router'; +import { PromotionDiscountTypeEnum } from "@/utils/constants"; + +export default { + name: "SeckillActivity", + components: { + }, + data() { + return { + // 遮罩层 + loading: true, + // 导出遮罩层 + exportLoading: false, + // 显示搜索条件 + showSearch: true, + // 总条数 + total: 0, + // 秒杀活动列表 + list: [], + // 秒杀场次列表 + seckillTimeList: [], + // 弹出层标题 + title: "", + // 是否显示弹出层 + open: false, + // 查询参数 + queryParams: { + pageNo: 1, + pageSize: 10, + name: null, + status: null, + timeId: null, + createTime: [], + }, + // 表单参数 + form: { + skuIds: [], // 选中的 SKU + products: [], // 商品信息 + timeIds: [], //选中的秒杀场次id + }, + // 商品 SKU 列表 + productSkus: [], + // 表单校验 + rules: { + name: [{ required: true, message: "秒杀活动名称不能为空", trigger: "blur" }], + status: [{ required: true, message: "活动状态不能为空", trigger: "blur" }], + startAndEndTime: [{ required: true, message: "活动时间不能为空", trigger: "blur" }], + endTime: [{ required: true, message: "活动结束时间不能为空", trigger: "blur" }], + sort: [{ required: true, message: "排序不能为空", trigger: "blur" }], + timeIds: [{ required: true, message: "秒杀场次不能为空", trigger: "blur" }], + totalPrice: [{ required: true, message: "订单实付金额,单位:分不能为空", trigger: "blur" }], + } + }; + }, + created() { + this.getList(); + }, + methods: { + /** 查询列表 */ + getList() { + this.loading = true; + // 执行查询 + getSeckillActivityPage(this.queryParams).then(response => { + this.list = response.data.list; + console.log(response, "查询返回的秒杀活动列表"); + this.total = response.data.total; + this.loading = false; + }); + // 获得 SKU 商品列表 + getSkuOptionList().then(response => { + this.productSkus = response.data; + }); + // 获取参与场次列表 + getSeckillTimeList().then(response => { + this.seckillTimeList = response.data; + console.log(this.seckillTimeList, "最终获取的参与场次列表"); + }); + }, + /** 取消按钮 */ + cancel() { + this.open = false; + this.reset(); + }, + /** 表单重置 */ + reset() { + this.form = { + id: undefined, + name: undefined, + status: undefined, + remark: undefined, + startTime: undefined, + endTime: undefined, + sort: undefined, + timeId: undefined, + totalPrice: undefined, + skuIds: [], + products: [], + }; + this.resetForm("form"); + }, + /** 搜索按钮操作 */ + handleQuery() { + this.queryParams.pageNo = 1; + this.getList(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + /** 新增按钮操作 */ + handleAdd() { + this.reset(); + this.open = true; + this.title = "添加秒杀活动"; + }, + /** 修改按钮操作 */ + handleUpdate(row) { + console.log(row, "当前行数据"); + this.reset(); + const id = row.id; + getSeckillActivity(id).then(response => { + this.form = response.data; + this.open = true; + this.title = "修改秒杀活动"; + }); + }, + /** 提交按钮 */ + submitForm() { + this.$refs["form"].validate(valid => { + if (!valid) { + return; + } + // 处理数据 + const data = deepClone(this.form); + data.startTime = this.form.startAndEndTime[0]; + data.endTime = this.form.startAndEndTime[1]; + // 修改的提交 + if (this.form.id != null) { + updateSeckillActivity(data).then(response => { + this.$modal.msgSuccess("修改成功"); + this.open = false; + this.getList(); + }); + return; + } + // 添加的提交 + createSeckillActivity(data).then(response => { + this.$modal.msgSuccess("新增成功"); + this.open = false; + this.getList(); + }); + }); + }, + /** 删除按钮操作 */ + handleDelete(row) { + const id = row.id; + this.$modal.confirm('是否确认删除秒杀活动编号为"' + id + '"的数据项?').then(function () { + return deleteSeckillActivity(id); + }).then(() => { + this.getList(); + this.$modal.msgSuccess("删除成功"); + }).catch(() => { }); + }, + /** 导出按钮操作 */ + handleExport() { + // 处理查询参数 + let params = { ...this.queryParams }; + params.pageNo = undefined; + params.pageSize = undefined; + this.$modal.confirm('是否确认导出所有秒杀活动数据项?').then(() => { + this.exportLoading = true; + return exportSeckillActivityExcel(params); + }).then(response => { + this.$download.excel(response, '秒杀活动.xls'); + this.exportLoading = false; + }).catch(() => { }); + }, + /** 批量修改商品秒杀价,秒杀库存,每人限购数量 */ + batchEditProduct(editType) { + const selectProducts = this.$refs.productsTable.selection; + if (selectProducts.length === 0) { + this.$modal.msgError("请选择需要修改的商品"); + return; + } + let promptTitle = '请输入'; + let regularPattern = /^[\s\S]*.*[^\s][\s\S]*$/; // 判断非空,且非空格 + //限购数 + if (editType === 'limitBuyCount') { + promptTitle = '限购数'; + regularPattern = /^[0-9]*$/; //数字 + } + //秒杀价 + if (editType === 'seckillPrice') { + promptTitle = '秒杀价(元)'; + regularPattern = /^[0-9]+(\.[0-9]{1,2})?$/; // 有一位或两位小数的正数 + } + //秒杀库存 + if (editType === 'seckillStock') { + promptTitle = '秒杀库存'; + regularPattern = /^[0-9]*$/; //数字 + } + + this.$prompt(promptTitle, '提示', { + confirmButtonText: '保存', + cancelButtonText: '取消', + inputPattern: regularPattern, + inputErrorMessage: promptTitle + '格式不正确' + }).then(({ value }) => { + if (editType === 'limitBuyCount') { + selectProducts.forEach((item) => { + item.limitBuyCount = value; + }) + } + if (editType === 'seckillPrice') { + selectProducts.forEach((item) => { + item.seckillPrice = value; + }) + } + if (editType === 'seckillStock') { + selectProducts.forEach((item) => { + item.seckillStock = value; + }) + } + }).catch(); + }, + /** 当 Form 的 SKU 发生变化时 */ + changeFormSku(skuIds) { + // 处理【新增】 + skuIds.forEach(skuId => { + // 获得对应的 SKU 信息 + const sku = this.productSkus.find(item => item.id === skuId); + if (!sku) { + return; + } + // 判断已存在,直接跳过 + console.log(this.form, "当前form") + const product = this.form.products.find(item => item.skuId === skuId); + if (product) { + return; + } + this.form.products.push({ + skuId: sku.id, + name: sku.name, + price: sku.price, + productStock: sku.stock, + spuId: sku.spuId, + spuName: sku.spuName, + limitBuyCount: 1, + seckillStock: sku.stock, + seckillPrice: sku.price, + }); + }); + // 处理【移除】 + this.form.products.map((product, index) => { + if (!skuIds.includes(product.skuId)) { + this.form.products.splice(index, 1); + } + }); + }, + /** 移除 Form 的 SKU */ + removeFormSku(skuId) { + this.form.skuIds.map((id, index) => { + if (skuId === id) { + this.form.skuIds.splice(index, 1); + } + }); + this.changeFormSku(this.form.skuIds); + }, + } +}; +</script> From cd62c4d22094dddb9feb9bf3c9ae845d023c48ef Mon Sep 17 00:00:00 2001 From: halfninety <690534687@qq.com> Date: Sun, 20 Nov 2022 16:53:57 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E7=A7=92=E6=9D=80=E6=97=B6=E6=AE=B5?= =?UTF-8?q?=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/common/util/date/DateUtils.java | 2 + .../databind/LocalTimeDeserializable.java | 16 ++ .../core/databind/LocalTimeSerializable.java | 17 ++ .../promotion/enums/ErrorCodeConstants.java | 2 +- .../seckilltime/SeckillTimeController.java | 99 +++++++ .../seckilltime/vo/SeckillTimeBaseVO.java | 32 +++ .../vo/SeckillTimeCreateReqVO.java | 14 + .../seckilltime/vo/SeckillTimeExcelVO.java | 37 +++ .../vo/SeckillTimeExportReqVO.java | 30 +++ .../seckilltime/vo/SeckillTimePageReqVO.java | 40 +++ .../seckilltime/vo/SeckillTimeRespVO.java | 22 ++ .../vo/SeckillTimeSimpleRespVO.java | 4 + .../vo/SeckillTimeUpdateReqVO.java | 21 ++ .../seckilltime/SeckillTimeConvert.java | 33 +++ .../dataobject/seckilltime/SeckillTimeDO.java | 47 ++++ .../mysql/seckilltime/SeckillTimeMapper.java | 40 +++ .../seckilltime/SeckillTimeService.java | 69 +++++ .../seckilltime/SeckillTimeServiceImpl.java | 82 ++++++ .../mapper/seckilltime/SeckillTimeMapper.xml | 12 + .../SeckillTimeServiceImplTest.java | 196 ++++++++++++++ .../src/api/promotion/seckillTime.js | 62 +++++ .../src/views/promotion/seckillTime/index.vue | 243 ++++++++++++++++++ 22 files changed, 1119 insertions(+), 1 deletion(-) create mode 100644 yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeDeserializable.java create mode 100644 yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeSerializable.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeBaseVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeCreateReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExcelVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExportReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimePageReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeSimpleRespVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeUpdateReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.xml create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java create mode 100644 yudao-ui-admin/src/api/promotion/seckillTime.js create mode 100644 yudao-ui-admin/src/views/promotion/seckillTime/index.vue diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java index b4cb94e1f..466dfb050 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java @@ -25,6 +25,8 @@ public class DateUtils { public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + public static final String FORMAT_HOUR_MINUTE_SECOND = "HH:mm:ss"; + /** * 将 LocalDateTime 转换成 Date * diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeDeserializable.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeDeserializable.java new file mode 100644 index 000000000..9735438b1 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeDeserializable.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.framework.jackson.core.databind; + +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; + +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_HOUR_MINUTE_SECOND; + +public class LocalTimeDeserializable { + // TODO: 2022/11/15 修改名字 + public static final LocalTimeDeserializer INSTANCE = new LocalTimeDeserializer(DateTimeFormatter + .ofPattern(FORMAT_HOUR_MINUTE_SECOND) + .withZone(ZoneId.systemDefault())); + +} diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeSerializable.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeSerializable.java new file mode 100644 index 000000000..d6eaed819 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeSerializable.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.framework.jackson.core.databind; + +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; + +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_HOUR_MINUTE_SECOND; + +public class LocalTimeSerializable { + // TODO: 2022/11/15 修改名称 + + public static final LocalTimeSerializer INSTANCE = new LocalTimeSerializer(DateTimeFormatter + .ofPattern(FORMAT_HOUR_MINUTE_SECOND) + .withZone(ZoneId.systemDefault())); + +} diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java index b6ac66757..4f25810d3 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java @@ -47,5 +47,5 @@ public interface ErrorCodeConstants { // ========== 秒杀活动 1003008000 ========== ErrorCode SECKILL_ACTIVITY_NOT_EXISTS = new ErrorCode(1003008000, "秒杀活动不存在"); - + ErrorCode SECKILL_TIME_NOT_EXISTS = new ErrorCode(1003008001, "秒杀时段不存在"); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java new file mode 100644 index 000000000..1f66fb1c6 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java @@ -0,0 +1,99 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.module.promotion.convert.seckilltime.SeckillTimeConvert; +import cn.iocoder.yudao.module.promotion.service.seckilltime.SeckillTimeService; + +@Api(tags = "管理后台 - 秒杀时段") +@RestController +@RequestMapping("/promotion/seckill-time") +@Validated +public class SeckillTimeController { + + @Resource + private SeckillTimeService seckillTimeService; + + @PostMapping("/create") + @ApiOperation("创建秒杀时段") + @PreAuthorize("@ss.hasPermission('promotion:seckill-time:create')") + public CommonResult<Long> createSeckillTime(@Valid @RequestBody SeckillTimeCreateReqVO createReqVO) { + return success(seckillTimeService.createSeckillTime(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新秒杀时段") + @PreAuthorize("@ss.hasPermission('promotion:seckill-time:update')") + public CommonResult<Boolean> updateSeckillTime(@Valid @RequestBody SeckillTimeUpdateReqVO updateReqVO) { + seckillTimeService.updateSeckillTime(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除秒杀时段") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('promotion:seckill-time:delete')") + public CommonResult<Boolean> deleteSeckillTime(@RequestParam("id") Long id) { + seckillTimeService.deleteSeckillTime(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得秒杀时段") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @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") + @ApiOperation("获得所有秒杀时段列表") +// @PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')") + public CommonResult<List<SeckillTimeRespVO>> getSeckillTimeList() { + List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList(); + return success(SeckillTimeConvert.INSTANCE.convertList(list)); + } + +// @GetMapping("/page") +// @ApiOperation("获得秒杀时段分页") +// @PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')") +// public CommonResult<PageResult<SeckillTimeRespVO>> getSeckillTimePage(@Valid SeckillTimePageReqVO pageVO) { +// PageResult<SeckillTimeDO> pageResult = seckillTimeService.getSeckillTimePage(pageVO); +// return success(SeckillTimeConvert.INSTANCE.convertPage(pageResult)); +// } + + @GetMapping("/export-excel") + @ApiOperation("导出秒杀时段 Excel") + @PreAuthorize("@ss.hasPermission('promotion:seckill-time:export')") + @OperateLog(type = EXPORT) + public void exportSeckillTimeExcel(@Valid SeckillTimeExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList(exportReqVO); + // 导出 Excel + List<SeckillTimeExcelVO> datas = SeckillTimeConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "秒杀时段.xls", "数据", SeckillTimeExcelVO.class, datas); + } + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeBaseVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeBaseVO.java new file mode 100644 index 000000000..5d9e3e2b4 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeBaseVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; + +import lombok.*; + +import java.time.LocalTime; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 秒杀时段 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SeckillTimeBaseVO { + + @ApiModelProperty(value = "秒杀时段名称", required = true) + @NotNull(message = "秒杀时段名称不能为空") + private String name; + + @ApiModelProperty(value = "开始时间点", required = true) + @NotNull(message = "开始时间点不能为空") + private LocalTime startTime; + + @ApiModelProperty(value = "结束时间点", required = true) + @NotNull(message = "结束时间点不能为空") + private LocalTime endTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeCreateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeCreateReqVO.java new file mode 100644 index 000000000..f69d5ab8c --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeCreateReqVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 秒杀时段创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillTimeCreateReqVO extends SeckillTimeBaseVO { + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExcelVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExcelVO.java new file mode 100644 index 000000000..4b7f436da --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExcelVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; + +import lombok.*; + +import java.time.LocalTime; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 秒杀时段 Excel VO + * + * @author 芋道源码 + */ +@Data +public class SeckillTimeExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("秒杀时段名称") + private String name; + + @ExcelProperty("开始时间点") + private LocalTime startTime; + + @ExcelProperty("结束时间点") + private LocalTime endTime; + + @ExcelProperty("商品数量") + private Integer productCount; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExportReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExportReqVO.java new file mode 100644 index 000000000..f364db21d --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExportReqVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; + +import lombok.*; + +import java.time.LocalTime; +import java.util.*; +import io.swagger.annotations.*; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 秒杀时段 Excel 导出 Request VO", description = "参数和 SeckillTimePageReqVO 是一致的") +@Data +public class SeckillTimeExportReqVO { + + @ApiModelProperty(value = "秒杀时段名称") + private String name; + + @ApiModelProperty(value = "开始时间点") + private LocalTime[] startTime; + + @ApiModelProperty(value = "结束时间点") + private LocalTime[] endTime; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimePageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimePageReqVO.java new file mode 100644 index 000000000..6fe13e0ed --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimePageReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalTime; + +@ApiModel("管理后台 - 秒杀时段分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillTimePageReqVO extends PageParam { + + @ApiModelProperty(value = "秒杀时段名称") + private String name; + + @ApiModelProperty(value = "开始时间点") + @DateTimeFormat(pattern = "HH:mm:ss") + private LocalTime startTime; + + @ApiModelProperty(value = "结束时间点") + @DateTimeFormat(pattern = "HH:mm:ss") + private LocalTime endTime; + + + + + + + +// @ApiModelProperty(value = "创建时间") +// @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +// private Date[] createTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java new file mode 100644 index 000000000..09c01da55 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 秒杀时段 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillTimeRespVO extends SeckillTimeBaseVO { + + @ApiModelProperty(value = "编号", required = true) + private Long id; + + @ApiModelProperty(value = "商品数量", required = true) + private Integer productCount; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeSimpleRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeSimpleRespVO.java new file mode 100644 index 000000000..ae8288a26 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeSimpleRespVO.java @@ -0,0 +1,4 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; + +public class SeckillTimeSimpleRespVO { +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeUpdateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeUpdateReqVO.java new file mode 100644 index 000000000..84a5f0204 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeUpdateReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 秒杀时段更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillTimeUpdateReqVO extends SeckillTimeBaseVO { + + @ApiModelProperty(value = "编号", required = true) + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java new file mode 100644 index 000000000..a983485e5 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.promotion.convert.seckilltime; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.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); + + List<SeckillTimeExcelVO> convertList02(List<SeckillTimeDO> list); +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java new file mode 100644 index 000000000..4e06151d5 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime; + +import lombok.*; + +import java.time.LocalTime; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 秒杀时段 DO + * + * @author 芋道源码 + */ +@TableName("promotion_seckill_time") +@KeySequence("promotion_seckill_time_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SeckillTimeDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 秒杀时段名称 + */ + private String name; + /** + * 开始时间点 + */ + private LocalTime startTime; + /** + * 结束时间点 + */ + private LocalTime endTime; + /** + * 商品数量 + */ + private Integer productCount; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java new file mode 100644 index 000000000..d9a902c01 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; + +/** + * 秒杀时段 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> { + +// default PageResult<SeckillTimeDO> selectPage(SeckillTimePageReqVO reqVO) { +// return selectPage(reqVO, new LambdaQueryWrapperX<SeckillTimeDO>() +// .likeIfPresent(SeckillTimeDO::getName, reqVO.getName()) +// .geIfPresent(SeckillTimeDO::getStartTime, reqVO.getStartTime()) +// .leIfPresent(SeckillTimeDO::getEndTime, reqVO.getEndTime()) +//// .betweenIfPresent(SeckillTimeDO::getStartTime, reqVO.getStartTime()) +//// .betweenIfPresent(SeckillTimeDO::getEndTime, reqVO.getEndTime()) +//// .betweenIfPresent(SeckillTimeDO::getCreateTime, reqVO.getCreateTime()) +// .orderByDesc(SeckillTimeDO::getId)); +// } + + default List<SeckillTimeDO> selectList(SeckillTimeExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX<SeckillTimeDO>() + .likeIfPresent(SeckillTimeDO::getName, reqVO.getName()) + .betweenIfPresent(SeckillTimeDO::getStartTime, reqVO.getStartTime()) + .betweenIfPresent(SeckillTimeDO::getEndTime, reqVO.getEndTime()) + .betweenIfPresent(SeckillTimeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SeckillTimeDO::getId)); + } + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java new file mode 100644 index 000000000..5c5011dd0 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.promotion.service.seckilltime; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +/** + * 秒杀时段 Service 接口 + * + * @author 芋道源码 + */ +public interface SeckillTimeService { + + /** + * 创建秒杀时段 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSeckillTime(@Valid SeckillTimeCreateReqVO createReqVO); + + /** + * 更新秒杀时段 + * + * @param updateReqVO 更新信息 + */ + void updateSeckillTime(@Valid SeckillTimeUpdateReqVO updateReqVO); + + /** + * 删除秒杀时段 + * + * @param id 编号 + */ + void deleteSeckillTime(Long id); + + /** + * 获得秒杀时段 + * + * @param id 编号 + * @return 秒杀时段 + */ + SeckillTimeDO getSeckillTime(Long id); + + /** + * 获得所有秒杀时段列表 + * + * @return 所有秒杀时段列表 + */ + List<SeckillTimeDO> getSeckillTimeList(); + +// /** +// * 获得秒杀时段分页 +// * +// * @param pageReqVO 分页查询 +// * @return 秒杀时段分页 +// */ +// PageResult<SeckillTimeDO> getSeckillTimePage(SeckillTimePageReqVO pageReqVO); + + /** + * 获得秒杀时段列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 秒杀时段列表 + */ + List<SeckillTimeDO> getSeckillTimeList(SeckillTimeExportReqVO exportReqVO); + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java new file mode 100644 index 000000000..de4becc15 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java @@ -0,0 +1,82 @@ +package cn.iocoder.yudao.module.promotion.service.seckilltime; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import cn.iocoder.yudao.module.promotion.convert.seckilltime.SeckillTimeConvert; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime.SeckillTimeMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; + +/** + * 秒杀时段 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class SeckillTimeServiceImpl implements SeckillTimeService { + + @Resource + private SeckillTimeMapper seckillTimeMapper; + + @Override + public Long createSeckillTime(SeckillTimeCreateReqVO createReqVO) { + // 插入 + SeckillTimeDO seckillTime = SeckillTimeConvert.INSTANCE.convert(createReqVO); + seckillTimeMapper.insert(seckillTime); + // 返回 + return seckillTime.getId(); + } + + @Override + public void updateSeckillTime(SeckillTimeUpdateReqVO updateReqVO) { + // 校验存在 + this.validateSeckillTimeExists(updateReqVO.getId()); + // 更新 + 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); + } + } + + @Override + public SeckillTimeDO getSeckillTime(Long id) { + return seckillTimeMapper.selectById(id); + } + + @Override + public List<SeckillTimeDO> getSeckillTimeList() { + return seckillTimeMapper.selectList(); + } + +// @Override +// public PageResult<SeckillTimeDO> getSeckillTimePage(SeckillTimePageReqVO pageReqVO) { +// return seckillTimeMapper.selectPage(pageReqVO); +// } + + @Override + public List<SeckillTimeDO> getSeckillTimeList(SeckillTimeExportReqVO exportReqVO) { + return seckillTimeMapper.selectList(exportReqVO); + } + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.xml b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.xml new file mode 100644 index 000000000..eef757f86 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime.SeckillTimeMapper"> + + <!-- + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。 + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ + --> + +</mapper> diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java new file mode 100644 index 000000000..d5379212d --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java @@ -0,0 +1,196 @@ +package cn.iocoder.yudao.module.promotion.service.seckilltime; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime.SeckillTimeMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; + +import java.time.LocalTime; +import java.util.*; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** +* {@link SeckillTimeServiceImpl} 的单元测试类 +* +* @author 芋道源码 +*/ +@Import(SeckillTimeServiceImpl.class) +public class SeckillTimeServiceImplTest extends BaseDbUnitTest { + + @Resource + private SeckillTimeServiceImpl seckillTimeService; + + @Resource + private SeckillTimeMapper seckillTimeMapper; + + @Resource + private ObjectMapper objectMapper; + + @Test + public void testJacksonSerializ(){ + + // 准备参数 + SeckillTimeCreateReqVO reqVO = randomPojo(SeckillTimeCreateReqVO.class); +// ObjectMapper objectMapper = new ObjectMapper(); + try { + String string = objectMapper.writeValueAsString(reqVO); + System.out.println(string); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + + + } + + @Test + public void testCreateSeckillTime_success() { + // 准备参数 + SeckillTimeCreateReqVO reqVO = randomPojo(SeckillTimeCreateReqVO.class); + + // 调用 + Long seckillTimeId = seckillTimeService.createSeckillTime(reqVO); + // 断言 + assertNotNull(seckillTimeId); + // 校验记录的属性是否正确 + SeckillTimeDO seckillTime = seckillTimeMapper.selectById(seckillTimeId); + assertPojoEquals(reqVO, seckillTime); + } + + @Test + public void testUpdateSeckillTime_success() { + // mock 数据 + SeckillTimeDO dbSeckillTime = randomPojo(SeckillTimeDO.class); + seckillTimeMapper.insert(dbSeckillTime);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SeckillTimeUpdateReqVO reqVO = randomPojo(SeckillTimeUpdateReqVO.class, o -> { + o.setId(dbSeckillTime.getId()); // 设置更新的 ID + }); + + // 调用 + seckillTimeService.updateSeckillTime(reqVO); + // 校验是否更新正确 + SeckillTimeDO seckillTime = seckillTimeMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, seckillTime); + } + + @Test + public void testUpdateSeckillTime_notExists() { + // 准备参数 + SeckillTimeUpdateReqVO reqVO = randomPojo(SeckillTimeUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> seckillTimeService.updateSeckillTime(reqVO), SECKILL_TIME_NOT_EXISTS); + } + + @Test + public void testDeleteSeckillTime_success() { + // mock 数据 + SeckillTimeDO dbSeckillTime = randomPojo(SeckillTimeDO.class); + seckillTimeMapper.insert(dbSeckillTime);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSeckillTime.getId(); + + // 调用 + seckillTimeService.deleteSeckillTime(id); + // 校验数据不存在了 + assertNull(seckillTimeMapper.selectById(id)); + } + + @Test + public void testDeleteSeckillTime_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> seckillTimeService.deleteSeckillTime(id), SECKILL_TIME_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetSeckillTimePage() { + // mock 数据 +// SeckillTimeDO dbSeckillTime = randomPojo(SeckillTimeDO.class, o -> { // 等会查询到 +// o.setName(null); +// o.setStartTime(null); +// o.setEndTime(null); +// o.setCreateTime(null); +// }); +// seckillTimeMapper.insert(dbSeckillTime); +// // 测试 name 不匹配 +// seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setName(null))); +// // 测试 startTime 不匹配 +// seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setStartTime(null))); +// // 测试 endTime 不匹配 +// seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setEndTime(null))); +// // 测试 createTime 不匹配 +// seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setCreateTime(null))); +// // 准备参数 +// SeckillTimePageReqVO reqVO = new SeckillTimePageReqVO(); +// reqVO.setName(null); +//// reqVO.setStartTime((new LocalTime())); +//// reqVO.setEndTime((new LocalTime[]{})); +//// reqVO.setCreateTime((new Date[]{})); +// +// // 调用 +// PageResult<SeckillTimeDO> pageResult = seckillTimeService.getSeckillTimePage(reqVO); +// // 断言 +// assertEquals(1, pageResult.getTotal()); +// assertEquals(1, pageResult.getList().size()); +// assertPojoEquals(dbSeckillTime, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetSeckillTimeList() { + // mock 数据 + SeckillTimeDO dbSeckillTime = randomPojo(SeckillTimeDO.class, o -> { // 等会查询到 + o.setName(null); + o.setStartTime(null); + o.setEndTime(null); + o.setCreateTime(null); + }); + seckillTimeMapper.insert(dbSeckillTime); + // 测试 name 不匹配 + seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setName(null))); + // 测试 startTime 不匹配 + seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setStartTime(null))); + // 测试 endTime 不匹配 + seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setEndTime(null))); + // 测试 createTime 不匹配 + seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setCreateTime(null))); + // 准备参数 + SeckillTimeExportReqVO reqVO = new SeckillTimeExportReqVO(); + reqVO.setName(null); + reqVO.setStartTime((new LocalTime[]{})); + reqVO.setEndTime((new LocalTime[]{})); + reqVO.setCreateTime((new Date[]{})); + + // 调用 + List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbSeckillTime, list.get(0)); + } + +} diff --git a/yudao-ui-admin/src/api/promotion/seckillTime.js b/yudao-ui-admin/src/api/promotion/seckillTime.js new file mode 100644 index 000000000..ae3c8a8ca --- /dev/null +++ b/yudao-ui-admin/src/api/promotion/seckillTime.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 创建秒杀时段 +export function createSeckillTime(data) { + return request({ + url: '/promotion/seckill-time/create', + method: 'post', + data: data + }) +} + +// 更新秒杀时段 +export function updateSeckillTime(data) { + return request({ + url: '/promotion/seckill-time/update', + method: 'put', + data: data + }) +} + +// 删除秒杀时段 +export function deleteSeckillTime(id) { + return request({ + url: '/promotion/seckill-time/delete?id=' + id, + method: 'delete' + }) +} + +// 获得秒杀时段 +export function getSeckillTime(id) { + return request({ + url: '/promotion/seckill-time/get?id=' + id, + method: 'get' + }) +} + +// 获得秒杀时段分页 +export function getSeckillTimePage(query) { + return request({ + url: '/promotion/seckill-time/page', + method: 'get', + params: query + }) +} + +// 获取所有的秒杀时段 +export function getSeckillTimeList() { + return request({ + url: '/promotion/seckill-time/list', + method: 'get' + }) +} + +// 导出秒杀时段 Excel +export function exportSeckillTimeExcel(query) { + return request({ + url: '/promotion/seckill-time/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/yudao-ui-admin/src/views/promotion/seckillTime/index.vue b/yudao-ui-admin/src/views/promotion/seckillTime/index.vue new file mode 100644 index 000000000..c41dba309 --- /dev/null +++ b/yudao-ui-admin/src/views/promotion/seckillTime/index.vue @@ -0,0 +1,243 @@ +<template> + <div class="app-container"> + + <!-- 搜索工作栏 --> + <!-- <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px"> + <el-form-item label="秒杀时段名称" prop="name"> + <el-input v-model="queryParams.name" placeholder="请输入秒杀时段名称" clearable @keyup.enter.native="handleQuery" /> + </el-form-item> + + <el-form-item label="开始时间点" prop="startTime"> + <el-time-picker v-model="queryParams.startTime" placeholder="选择开始时间" value-format="HH:mm:ss" /> + </el-form-item> + + <el-form-item label="结束时间点" prop="endTime"> + <el-time-picker v-model="queryParams.endTime" placeholder="选择结束时间" value-format="HH:mm:ss" /> + </el-form-item> + + <el-form-item> + <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> + <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button> + </el-form-item> + </el-form> --> + + <!-- 操作工具栏 --> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" + v-hasPermi="['promotion:seckill-time:create']">新增</el-button> + </el-col> + <!-- <el-col :span="1.5"> + <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" + :loading="exportLoading" v-hasPermi="['promotion:seckill-time:export']">导出</el-button> + </el-col> --> + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> + </el-row> + + <!-- 列表 --> + <el-table v-loading="loading" :data="list"> + <el-table-column label="秒杀时段名称" align="center" prop="name" /> + <el-table-column label="开始时间点" align="center" prop="startTime" width="180"> + <template slot-scope="scope"> + <span>{{ scope.row.startTime }}</span> + </template> + </el-table-column> + <el-table-column label="结束时间点" align="center" prop="endTime" width="180"> + <template slot-scope="scope"> + <span>{{ scope.row.endTime }}</span> + </template> + </el-table-column> + <el-table-column label="商品数量" align="center" prop="productCount" /> + <el-table-column label="创建时间" align="center" prop="createTime" width="180"> + <template slot-scope="scope"> + <span>{{ parseTime(scope.row.createTime) }}</span> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> + <template slot-scope="scope"> + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" + v-hasPermi="['promotion:seckill-time:update']">修改</el-button> + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" + v-hasPermi="['promotion:seckill-time:delete']">删除</el-button> + </template> + </el-table-column> + </el-table> + <!-- 分页组件 --> + <!-- <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" + @pagination="getList" /> --> + + <!-- 对话框(添加 / 修改) --> + <el-dialog :title="title" :visible.sync="open" width="600px" v-dialogDrag append-to-body> + <el-form ref="form" :model="form" :rules="rules" label-width="140px"> + <el-form-item label="秒杀场次名称" prop="name"> + <el-input v-model="form.name" placeholder="请输入秒杀时段名称" clearable /> + </el-form-item> + <el-form-item label="秒杀时间段" prop="startAndEndTime"> + <el-time-picker is-range v-model="form.startAndEndTime" range-separator="至" start-placeholder="开始时间" + end-placeholder="结束时间" placeholder="选择时间范围" value-format="HH:mm:ss"> + </el-time-picker> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="submitForm">确 定</el-button> + <el-button @click="cancel">取 消</el-button> + </div> + </el-dialog> + </div> +</template> + +<script> +import { createSeckillTime, updateSeckillTime, deleteSeckillTime, getSeckillTime, getSeckillTimePage, exportSeckillTimeExcel, getSeckillTimeList } from "@/api/promotion/seckillTime"; +import { deepClone } from "@/utils"; + +export default { + name: "SeckillTime", + components: { + }, + data() { + return { + // 遮罩层 + loading: true, + // 导出遮罩层 + exportLoading: false, + // 显示搜索条件 + showSearch: true, + // 总条数 + // total: 0, + // 秒杀时段列表 + list: [], + // 弹出层标题 + title: "", + // 是否显示弹出层 + open: false, + // 查询参数 + // queryParams: { + // pageNo: 1, + // pageSize: 10, + // name: null, + // startTime: null, + // endTime: null, + // }, + // 表单参数 + form: {}, + // 表单校验 + rules: { + name: [{ required: true, message: "秒杀时段名称不能为空", trigger: "blur" }], + startAndEndTime: [{ required: true, message: "秒杀时间段不能为空", trigger: "blur" }], + } + }; + }, + created() { + this.getList(); + }, + methods: { + /** 查询列表 */ + getList() { + this.loading = true; + // 执行查询 + getSeckillTimeList().then(response => { + console.log(response, "返回的数据") + this.list = response.data; + // this.total = response.data.total; + this.loading = false; + }); + }, + /** 取消按钮 */ + cancel() { + this.open = false; + this.reset(); + }, + /** 表单重置 */ + reset() { + this.form = { + id: undefined, + name: undefined, + startAndEndTime: undefined, + startTime: undefined, + endTime: undefined, + }; + this.resetForm("form"); + }, + /** 搜索按钮操作 */ + handleQuery() { + // this.queryParams.pageNo = 1; + this.getList(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + /** 新增按钮操作 */ + handleAdd() { + this.reset(); + console.log(this.form, "点击新增时的form"); + this.open = true; + this.title = "添加秒杀时段"; + }, + /** 修改按钮操作 */ + handleUpdate(row) { + this.reset(); + const id = row.id; + getSeckillTime(id).then(response => { + response.data.startAndEndTime = [response.data.startTime, response.data.endTime] + this.form = response.data; + this.open = true; + this.title = "修改秒杀时段"; + }); + }, + /** 提交按钮 */ + submitForm() { + this.$refs["form"].validate(valid => { + console.log(valid, "是否通过"); + if (!valid) { + return; + } + // 处理数据 + const data = deepClone(this.form); + data.startTime = this.form.startAndEndTime[0]; + data.endTime = this.form.startAndEndTime[1]; + // 修改的提交 + if (this.form.id != null) { + updateSeckillTime(data).then(response => { + this.$modal.msgSuccess("修改成功"); + this.open = false; + this.getList(); + }); + return; + } + // 添加的提交 + createSeckillTime(data).then(response => { + this.$modal.msgSuccess("新增成功"); + this.open = false; + this.getList(); + }); + }); + }, + /** 删除按钮操作 */ + handleDelete(row) { + const id = row.id; + this.$modal.confirm('是否确认删除秒杀时段编号为"' + id + '"的数据项?').then(function () { + return deleteSeckillTime(id); + }).then(() => { + this.getList(); + this.$modal.msgSuccess("删除成功"); + }).catch(() => { }); + }, + /** 导出按钮操作 */ + // handleExport() { + // // 处理查询参数 + // let params = { ...this.queryParams }; + // params.pageNo = undefined; + // params.pageSize = undefined; + // this.$modal.confirm('是否确认导出所有秒杀时段数据项?').then(() => { + // this.exportLoading = true; + // return exportSeckillTimeExcel(params); + // }).then(response => { + // this.$download.excel(response, '秒杀时段.xls'); + // this.exportLoading = false; + // }).catch(() => { }); + // } + } +}; +</script> From 7bc1ae5f35e3e095a0950020658772421b701cc8 Mon Sep 17 00:00:00 2001 From: halfninety <690534687@qq.com> Date: Mon, 28 Nov 2022 20:45:54 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E7=A7=92=E6=9D=80=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/enums/ErrorCodeConstants.java | 5 + .../SeckillActivityController.java | 65 ++++---- .../vo/SeckillActivityBaseVO.java | 53 +++++-- .../vo/SeckillActivityCreateReqVO.java | 24 ++- .../vo/SeckillActivityDetailRespVO.java | 21 +++ .../vo/SeckillActivityExcelVO.java | 46 ------ .../vo/SeckillActivityExportReqVO.java | 28 ---- .../vo/SeckillActivityPageReqVO.java | 15 +- .../vo/SeckillActivityRespVO.java | 21 ++- .../vo/SeckillActivityUpdateReqVO.java | 21 ++- .../SeckillActivityConvert.java | 55 ++++++- .../seckillactivity/SeckillActivityDO.java | 18 ++- .../seckillactivity/SeckillProductDO.java | 60 ++++++++ .../SeckillActivityMapper.java | 20 +-- .../seckillactivity/SeckillProductMapper.java | 21 +++ .../SeckillActivityService.java | 17 +- .../SeckillActivityServiceImpl.java | 145 +++++++++++++++--- .../SeckillActivityServiceImplTest.java | 56 ++++--- .../src/api/promotion/seckillActivity.js | 18 +-- 19 files changed, 473 insertions(+), 236 deletions(-) create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityDetailRespVO.java delete mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExcelVO.java delete mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillProductDO.java create mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillProductMapper.java diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java index 4f25810d3..5e21b568c 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java @@ -48,4 +48,9 @@ public interface ErrorCodeConstants { // ========== 秒杀活动 1003008000 ========== ErrorCode SECKILL_ACTIVITY_NOT_EXISTS = new ErrorCode(1003008000, "秒杀活动不存在"); ErrorCode SECKILL_TIME_NOT_EXISTS = new ErrorCode(1003008001, "秒杀时段不存在"); + ErrorCode SECKILL_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1003008001, "存在商品参加了其它秒杀活动"); + ErrorCode SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1003006002, "秒杀活动已关闭,不能修改"); + ErrorCode SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1003006003, "秒杀活动未关闭,不能删除"); + ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1003006004, "秒杀活动已关闭,不能重复关闭"); + ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_END = new ErrorCode(1003006004, "秒杀活动已结束,不能关闭"); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java index 419ae8e61..a6434a501 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java @@ -1,35 +1,26 @@ package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.convert.seckillactivity.SeckillActivityConvert; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; +import cn.iocoder.yudao.module.promotion.service.seckillactivity.SeckillActivityService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; - -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.annotations.*; - -import javax.validation.constraints.*; -import javax.validation.*; -import javax.servlet.http.*; -import java.util.*; -import java.io.IOException; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; - -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; - -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; - -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; -import cn.iocoder.yudao.module.promotion.convert.seckillactivity.SeckillActivityConvert; -import cn.iocoder.yudao.module.promotion.service.seckillactivity.SeckillActivityService; - @Api(tags = "管理后台 - 秒杀活动") @RestController @RequestMapping("/promotion/seckill-activity") @@ -54,6 +45,15 @@ public class SeckillActivityController { return success(true); } + @PutMapping("/close") + @ApiOperation("关闭秒杀活动") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:close')") + public CommonResult<Boolean> closeSeckillActivity(@RequestParam("id") Long id) { + seckillActivityService.closeSeckillActivity(id); + return success(true); + } + @DeleteMapping("/delete") @ApiOperation("删除秒杀活动") @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) @@ -67,12 +67,13 @@ public class SeckillActivityController { @ApiOperation("获得秒杀活动") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:query')") - public CommonResult<SeckillActivityRespVO> getSeckillActivity(@RequestParam("id") Long id) { + public CommonResult<SeckillActivityDetailRespVO> getSeckillActivity(@RequestParam("id") Long id) { SeckillActivityDO seckillActivity = seckillActivityService.getSeckillActivity(id); if (seckillActivity == null) { return success(null); } - return success(SeckillActivityConvert.INSTANCE.convert(seckillActivity)); + List<SeckillProductDO> seckillProducts = seckillActivityService.getSeckillProductListByActivityId(id); + return success(SeckillActivityConvert.INSTANCE.convert(seckillActivity,seckillProducts)); } @GetMapping("/list") @@ -92,16 +93,4 @@ public class SeckillActivityController { return success(SeckillActivityConvert.INSTANCE.convertPage(pageResult)); } - @GetMapping("/export-excel") - @ApiOperation("导出秒杀活动 Excel") - @PreAuthorize("@ss.hasPermission('promotion:seckill-activity:export')") - @OperateLog(type = EXPORT) - public void exportSeckillActivityExcel(@Valid SeckillActivityExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List<SeckillActivityDO> list = seckillActivityService.getSeckillActivityList(exportReqVO); - // 导出 Excel - List<SeckillActivityExcelVO> datas = SeckillActivityConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "秒杀活动.xls", "数据", SeckillActivityExcelVO.class, datas); - } - } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java index 88f0d2cc7..62ed1fa2d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java @@ -1,13 +1,17 @@ package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; -import lombok.*; -import java.util.*; -import java.math.BigDecimal; -import io.swagger.annotations.*; -import javax.validation.constraints.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; /** * 秒杀活动 Base VO,提供给添加、修改、详细的子 VO 使用 @@ -20,22 +24,43 @@ public class SeckillActivityBaseVO { @NotNull(message = "秒杀活动名称不能为空") private String name; - @ApiModelProperty(value = "活动状态", required = true, example = "进行中") - @NotNull(message = "活动状态不能为空") - private Integer status; - @ApiModelProperty(value = "活动开始时间", required = true) @NotNull(message = "活动开始时间不能为空") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date startTime; + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private LocalDateTime startTime; @ApiModelProperty(value = "活动结束时间", required = true) @NotNull(message = "活动结束时间不能为空") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date endTime; + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private LocalDateTime endTime; - @ApiModelProperty(value = "订单实付金额,单位:分", required = true) - @NotNull(message = "订单实付金额,单位:分不能为空") - private BigDecimal totalPrice; + + @ApiModel("商品") + @Data + public static class Product { + + @ApiModelProperty(value = "商品 SPU 编号", required = true, example = "1") + @NotNull(message = "商品 SPU 编号不能为空") + private Long spuId; + + @ApiModelProperty(value = "商品 SKU 编号", required = true, example = "1") + @NotNull(message = "商品 SKU 编号不能为空") + private Long skuId; + + @ApiModelProperty(value = "秒杀金额", required = true, example = "12.00") + @NotNull(message = "秒杀金额不能为空") + private Integer seckillPrice; + + @ApiModelProperty(value = "秒杀库存", example = "80") + @Min(value = 0, message = "秒杀库存需要大于等于 0") + private Integer stock; + + @ApiModelProperty(value = "每人限购", example = "10", notes = "如果为0则不限购") + @Min(value = 0, message = "每人限购需要大于等于 0") + private Integer limitBuyCount; + + } } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java index e397bd57c..2cd21af9e 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java @@ -1,9 +1,16 @@ package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import javax.validation.constraints.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; @ApiModel("管理后台 - 秒杀活动创建 Request VO") @Data @@ -19,7 +26,14 @@ public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO { private Integer sort; @ApiModelProperty(value = "秒杀时段id", required = true) - @NotNull(message = "秒杀时段id不能为空") + @NotBlank(message = "参与场次不能为空") private String timeId; + /** + * 商品列表 + */ + @NotEmpty(message = "商品列表不能为空") + @Valid + private List<Product> products; + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityDetailRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityDetailRespVO.java new file mode 100644 index 000000000..97da65df8 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityDetailRespVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@ApiModel("管理后台 - 秒杀活动的详细 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SeckillActivityDetailRespVO extends SeckillActivityRespVO{ + + /** + * 商品列表 + */ + private List<Product> products; + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExcelVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExcelVO.java deleted file mode 100644 index ea0d5f49f..000000000 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExcelVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; - -import lombok.*; -import java.util.*; -import java.math.BigDecimal; -import io.swagger.annotations.*; - -import com.alibaba.excel.annotation.ExcelProperty; -import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; -import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; - - -/** - * 秒杀活动 Excel VO - * - * @author 芋道源码 - */ -@Data -public class SeckillActivityExcelVO { - - @ExcelProperty("秒杀活动名称") - private String name; - - @ExcelProperty(value = "活动状态", converter = DictConvert.class) - @DictFormat("promotion_activity_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 - private Integer status; - - @ExcelProperty("活动开始时间") - private Date startTime; - - @ExcelProperty("活动结束时间") - private Date endTime; - - @ExcelProperty("付款订单数") - private Integer orderCount; - - @ExcelProperty("付款人数") - private Integer userCount; - - @ExcelProperty("订单实付金额,单位:分") - private BigDecimal totalPrice; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java deleted file mode 100644 index e8a5e459b..000000000 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityExportReqVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; - -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "管理后台 - 秒杀活动 Excel 导出 Request VO", description = "参数和 SeckillActivityPageReqVO 是一致的") -@Data -public class SeckillActivityExportReqVO { - - @ApiModelProperty(value = "秒杀活动名称", example = "晚九点限时秒杀") - private String name; - - @ApiModelProperty(value = "活动状态", example = "进行中") - private Integer status; - - @ApiModelProperty(value = "秒杀时段id") - private String timeId; - - @ApiModelProperty(value = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date[] createTime; - -} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java index ebfb9bb2a..102877d2b 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java @@ -1,12 +1,18 @@ package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +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; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; @ApiModel("管理后台 - 秒杀活动分页 Request VO") @Data @@ -25,6 +31,7 @@ public class SeckillActivityPageReqVO extends PageParam { @ApiModelProperty(value = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date[] createTime; + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private LocalDateTime[] createTime; } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java index 3e75f5c16..91db8565b 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java @@ -1,10 +1,12 @@ package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; -import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; @ApiModel("管理后台 - 秒杀活动 Response VO") @Data @@ -22,9 +24,18 @@ public class SeckillActivityRespVO extends SeckillActivityBaseVO { private Integer userCount; @ApiModelProperty(value = "创建时间", required = true) - private Date createTime; + private LocalDateTime createTime; @ApiModelProperty(value = "秒杀时段id", required = true) private String timeId; + @ApiModelProperty(value = "排序", required = true) + private Integer sort; + + @ApiModelProperty(value = "备注", example = "限时秒杀活动") + private String remark; + + @ApiModelProperty(value = "活动状态", example = "进行中") + private Integer status; + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java index f75a5294a..d8471594c 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java @@ -1,9 +1,15 @@ package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; -import lombok.*; -import java.util.*; -import io.swagger.annotations.*; -import javax.validation.constraints.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; @ApiModel("管理后台 - 秒杀活动更新 Request VO") @Data @@ -26,4 +32,11 @@ public class SeckillActivityUpdateReqVO extends SeckillActivityBaseVO { @NotNull(message = "秒杀时段id不能为空") private String timeId; + /** + * 商品列表 + */ + @NotEmpty(message = "商品列表不能为空") + @Valid + private List<Product> products; + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java index 8e416aef4..90db545c2 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java @@ -1,13 +1,16 @@ package cn.iocoder.yudao.module.promotion.convert.seckillactivity; -import java.util.*; - +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.util.List; /** * 秒杀活动 Convert @@ -19,8 +22,15 @@ public interface SeckillActivityConvert { SeckillActivityConvert INSTANCE = Mappers.getMapper(SeckillActivityConvert.class); + SeckillProductDO convert(SeckillActivityBaseVO.Product product); + + SeckillActivityDO convert(SeckillActivityCreateReqVO bean); + default String map(Long[] value){ + return value.toString(); + } + SeckillActivityDO convert(SeckillActivityUpdateReqVO bean); SeckillActivityRespVO convert(SeckillActivityDO bean); @@ -29,6 +39,39 @@ public interface SeckillActivityConvert { PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page); - List<SeckillActivityExcelVO> convertList02(List<SeckillActivityDO> list); + @Mappings({@Mapping(target = "products",source = "seckillProducts")}) + SeckillActivityDetailRespVO convert(SeckillActivityDO seckillActivity,List<SeckillProductDO> seckillProducts); + + /** + * 比较两个秒杀商品对象是否相等 + * + * @param productDO 数据库中的商品 + * @param productVO 前端传入的商品 + * @return 是否匹配 + */ + default boolean isEquals(SeckillProductDO productDO, SeckillActivityBaseVO.Product productVO) { + return ObjectUtil.equals(productDO.getSpuId(), productVO.getSpuId()) + && ObjectUtil.equals(productDO.getSkuId(), productVO.getSkuId()) + && ObjectUtil.equals(productDO.getSeckillPrice(), productVO.getSeckillPrice()) + && ObjectUtil.equals(productDO.getStock(), productVO.getStock()) + && ObjectUtil.equals(productDO.getLimitBuyCount(), productVO.getLimitBuyCount()); + + } + + /** + * 比较两个秒杀商品对象是否相等 + * + * @param productDO 商品1 + * @param productVO 商品2 + * @return 是否匹配 + */ + default boolean isEquals(SeckillProductDO productDO, SeckillProductDO productVO) { + return ObjectUtil.equals(productDO.getSpuId(), productVO.getSpuId()) + && ObjectUtil.equals(productDO.getSkuId(), productVO.getSkuId()) + && ObjectUtil.equals(productDO.getSeckillPrice(), productVO.getSeckillPrice()) + && ObjectUtil.equals(productDO.getStock(), productVO.getStock()) + && ObjectUtil.equals(productDO.getLimitBuyCount(), productVO.getLimitBuyCount()); + + } } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java index 69edb1ff6..2ff3b1b4c 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java @@ -1,10 +1,14 @@ package cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity; -import lombok.*; -import java.util.*; -import java.math.BigDecimal; -import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; /** * 秒杀活动 DO @@ -33,7 +37,7 @@ public class SeckillActivityDO extends BaseDO { /** * 活动状态 * - * 枚举 {@link TODO promotion_activity_status 对应的类} + * 枚举 {@link PromotionActivityStatusEnum 对应的类} */ private Integer status; /** @@ -43,11 +47,11 @@ public class SeckillActivityDO extends BaseDO { /** * 活动开始时间 */ - private Date startTime; + private LocalDateTime startTime; /** * 活动结束时间 */ - private Date endTime; + private LocalDateTime endTime; /** * 排序 */ diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillProductDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillProductDO.java new file mode 100644 index 000000000..e6e8f6a9f --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillProductDO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 秒杀参与商品 + * @TableName promotion_seckill_product + */ +@TableName(value ="promotion_seckill_product") +@Data +public class SeckillProductDO extends BaseDO { + /** + * 秒杀参与商品编号 + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 秒杀活动id + */ + private Long activityId; + + /** + * 秒杀时段id + */ + private Long timeId; + + /** + * 商品id + */ + private Long spuId; + + /** + * 商品sku_id + */ + private Long skuId; + + /** + * 秒杀金额 + */ + private Integer seckillPrice; + + /** + * 秒杀库存 + */ + private Integer stock; + + /** + * 每人限购 + */ + private Integer limitBuyCount; +} \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java index 6b3319361..12cc179b3 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java @@ -1,13 +1,11 @@ package cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity; -import java.util.*; - import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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.seckillactivity.vo.SeckillActivityPageReqVO; import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; /** * 秒杀活动 Mapper @@ -16,21 +14,13 @@ import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; */ @Mapper public interface SeckillActivityMapper extends BaseMapperX<SeckillActivityDO> { - +// TODO: 2022/11/28 halfninety 秒杀活动通过场次查询使用like会出现问题,查询活动场次编号为1,则活动场次编号为 1,11,......的都会被查出来 default PageResult<SeckillActivityDO> selectPage(SeckillActivityPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX<SeckillActivityDO>() .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) - .eqIfPresent(SeckillActivityDO::getTimeId, reqVO.getTimeId()) - .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(SeckillActivityDO::getId)); - } - - default List<SeckillActivityDO> selectList(SeckillActivityExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX<SeckillActivityDO>() - .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) - .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) - .eqIfPresent(SeckillActivityDO::getTimeId, reqVO.getTimeId()) + .likeIfPresent(SeckillActivityDO::getTimeId, reqVO.getTimeId()) +// .like(StringUtils.hasText(reqVO.getTimeId()),SeckillActivityDO::getTimeId, reqVO.getTimeId() + ",") .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(SeckillActivityDO::getId)); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillProductMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillProductMapper.java new file mode 100644 index 000000000..d1d609982 --- /dev/null +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillProductMapper.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface SeckillProductMapper extends BaseMapperX<SeckillProductDO> { + + default List<SeckillProductDO> selectListByActivityId(Long id){ + return selectList(SeckillProductDO::getActivityId,id); + } + + default List<SeckillProductDO> selectListBySkuIds(Collection<Long> skuIds){ + return selectList(SeckillProductDO::getSkuId,skuIds); + } + +} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java index 6ff337fe4..1b3060d52 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java @@ -5,6 +5,7 @@ import javax.validation.*; import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; /** * 秒杀活动 Service 接口 @@ -28,6 +29,12 @@ public interface SeckillActivityService { */ void updateSeckillActivity(@Valid SeckillActivityUpdateReqVO updateReqVO); + /** + * 关闭秒杀活动 + * @param id 编号 + */ + void closeSeckillActivity(Long id); + /** * 删除秒杀活动 * @@ -60,11 +67,9 @@ public interface SeckillActivityService { PageResult<SeckillActivityDO> getSeckillActivityPage(SeckillActivityPageReqVO pageReqVO); /** - * 获得秒杀活动列表, 用于 Excel 导出 - * - * @param exportReqVO 查询条件 - * @return 秒杀活动列表 + * 通过活动编号获取活动商品 + * @param id 活动编号 + * @return 活动商品列表 */ - List<SeckillActivityDO> getSeckillActivityList(SeckillActivityExportReqVO exportReqVO); - + List<SeckillProductDO> getSeckillProductListByActivityId(Long id); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java index 9e23e0e29..63c1bd13d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java @@ -1,19 +1,29 @@ package cn.iocoder.yudao.module.promotion.service.seckillactivity; +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityBaseVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityPageReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityUpdateReqVO; +import cn.iocoder.yudao.module.promotion.convert.seckillactivity.SeckillActivityConvert; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillProductMapper; +import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; +import cn.iocoder.yudao.module.promotion.util.PromotionUtils; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; -import java.util.*; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; - -import cn.iocoder.yudao.module.promotion.convert.seckillactivity.SeckillActivityConvert; -import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper; +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; +import static java.util.Arrays.asList; /** * 秒杀活动 Service 实现类 @@ -27,11 +37,24 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @Resource private SeckillActivityMapper seckillActivityMapper; + @Resource + private SeckillProductMapper seckillProductMapper; + @Override public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) { - // 插入 - SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO); +// validateSeckillActivityProductConflicts(null,createReqVO.getProducts()); + List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus()); + // 校验商品是否冲突 + validateSeckillActivityProductConflicts(null, createReqVO.getProducts()); + // 插入秒杀活动 + SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO) + .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));; seckillActivityMapper.insert(seckillActivity); + + // 插入商品 + List<SeckillProductDO> productDOS = CollectionUtils.convertList(createReqVO.getProducts(), + product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(seckillActivity.getId())); + seckillProductMapper.insertBatch(productDOS); // 返回 return seckillActivity.getId(); } @@ -39,24 +62,110 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @Override public void updateSeckillActivity(SeckillActivityUpdateReqVO updateReqVO) { // 校验存在 - this.validateSeckillActivityExists(updateReqVO.getId()); - // 更新 - SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO); + SeckillActivityDO seckillActivity = this.validateSeckillActivityExists(updateReqVO.getId()); + if (PromotionActivityStatusEnum.CLOSE.getStatus().equals(seckillActivity.getStatus())) { + throw exception(SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED); + } + List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus()); + // 校验商品是否冲突 + validateSeckillActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); + // 更新活动 + SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO) + .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); seckillActivityMapper.updateById(updateObj); + // 更新商品 + updateSeckillProduct(updateReqVO); + } + + /** + * 更新秒杀商品 + */ + private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) { + List<SeckillProductDO> seckillProductDOS = seckillProductMapper.selectListByActivityId(updateReqVO.getId()); + List<SeckillActivityBaseVO.Product> products = updateReqVO.getProducts(); + //对后台查出的数据和前台查出的数据进行遍历, + //1.对前台数据进行遍历:如果不存在于后台的sku中需要新增 + //2.对后台数据进行遍历:如果不存在于前台的sku中需要删除 + //计算需要删除的数据 + List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOS, SeckillProductDO::getId, + seckillProductDO -> products.stream() + .noneMatch(product -> SeckillActivityConvert.INSTANCE.isEquals(seckillProductDO, product))); + if (CollUtil.isNotEmpty(deleteIds)) { + seckillProductMapper.deleteBatchIds(deleteIds); + } + //计算需要新增的数据 + List<SeckillProductDO> newSeckillProductDOs = CollectionUtils.convertList(products, + product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId())); + newSeckillProductDOs.removeIf(product -> seckillProductDOS.stream() + .anyMatch(seckillProduct -> SeckillActivityConvert.INSTANCE.isEquals(seckillProduct, product))); + if (CollUtil.isNotEmpty(newSeckillProductDOs)) { + seckillProductMapper.insertBatch(newSeckillProductDOs); + } + } + + /** + * 校验商品是否冲突 + * + * @param id 秒杀活动编号 + * @param products 商品列表 + */ + public void validateSeckillActivityProductConflicts(Long id, List<SeckillActivityBaseVO.Product> products) { + if (CollUtil.isEmpty(products)) { + return; + } + List<SeckillProductDO> seckillProductDOS = seckillProductMapper + .selectListBySkuIds(CollectionUtils.convertSet(products, SeckillActivityBaseVO.Product::getSkuId)); + if (CollUtil.isEmpty(seckillProductDOS)) { + return; + } + List<SeckillActivityDO> seckillActivityDOS = seckillActivityMapper + .selectBatchIds(CollectionUtils.convertSet(seckillProductDOS, SeckillProductDO::getActivityId)); + if (id != null) {// 排除自己这个活动 + 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())); + //如果非空,则说明冲突 + if (CollUtil.isNotEmpty(seckillActivityDOS)) { + throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS); + } + + } + + @Override + public void closeSeckillActivity(Long id) { + // 校验存在 + SeckillActivityDO seckillActivity = this.validateSeckillActivityExists(id); + if (PromotionActivityStatusEnum.CLOSE.getStatus().equals(seckillActivity.getStatus())) { + throw exception(SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED); + } + if (PromotionActivityStatusEnum.END.getStatus().equals(seckillActivity.getStatus())) { + throw exception(SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_END); + } + // 更新 + SeckillActivityDO updateObj = new SeckillActivityDO().setId(id).setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); + seckillActivityMapper.updateById(updateObj); + } @Override public void deleteSeckillActivity(Long id) { // 校验存在 - this.validateSeckillActivityExists(id); + SeckillActivityDO seckillActivity = this.validateSeckillActivityExists(id); + if (!PromotionActivityStatusEnum.CLOSE.getStatus().equals(seckillActivity.getStatus())) { + throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED); + } // 删除 seckillActivityMapper.deleteById(id); } - private void validateSeckillActivityExists(Long id) { - if (seckillActivityMapper.selectById(id) == null) { + private SeckillActivityDO validateSeckillActivityExists(Long id) { + SeckillActivityDO seckillActivity = seckillActivityMapper.selectById(id); + if (seckillActivity == null) { throw exception(SECKILL_ACTIVITY_NOT_EXISTS); } + return seckillActivity; } @Override @@ -75,8 +184,8 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { } @Override - public List<SeckillActivityDO> getSeckillActivityList(SeckillActivityExportReqVO exportReqVO) { - return seckillActivityMapper.selectList(exportReqVO); + public List<SeckillProductDO> getSeckillProductListByActivityId(Long id) { + return seckillProductMapper.selectListByActivityId(id); } } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java index b95c8a0e4..2492fb0ac 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java @@ -1,30 +1,26 @@ package cn.iocoder.yudao.module.promotion.service.seckillactivity; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; - -import javax.annotation.Resource; - +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; - -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityPageReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityUpdateReqVO; import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; import javax.annotation.Resource; -import org.springframework.context.annotation.Import; -import java.util.*; +import java.time.LocalDateTime; -import static cn.hutool.core.util.RandomUtil.*; -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_ACTIVITY_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; /** * {@link SeckillActivityServiceImpl} 的单元测试类 @@ -127,7 +123,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { reqVO.setName(null); reqVO.setStatus(null); reqVO.setTimeId(null); - reqVO.setCreateTime((new Date[]{})); + reqVO.setCreateTime((new LocalDateTime[]{})); // 调用 PageResult<SeckillActivityDO> pageResult = seckillActivityService.getSeckillActivityPage(reqVO); @@ -157,17 +153,17 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { // 测试 createTime 不匹配 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null))); // 准备参数 - SeckillActivityExportReqVO reqVO = new SeckillActivityExportReqVO(); - reqVO.setName(null); - reqVO.setStatus(null); - reqVO.setTimeId(null); - reqVO.setCreateTime((new Date[]{})); - - // 调用 - List<SeckillActivityDO> list = seckillActivityService.getSeckillActivityList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbSeckillActivity, list.get(0)); +// SeckillActivityExportReqVO reqVO = new SeckillActivityExportReqVO(); +// reqVO.setName(null); +// reqVO.setStatus(null); +// reqVO.setTimeId(null); +// reqVO.setCreateTime((new Date[]{})); +// +// // 调用 +// List<SeckillActivityDO> list = seckillActivityService.getSeckillActivityList(reqVO); +// // 断言 +// assertEquals(1, list.size()); +// assertPojoEquals(dbSeckillActivity, list.get(0)); } } diff --git a/yudao-ui-admin/src/api/promotion/seckillActivity.js b/yudao-ui-admin/src/api/promotion/seckillActivity.js index 9b74081c0..fa67a739c 100644 --- a/yudao-ui-admin/src/api/promotion/seckillActivity.js +++ b/yudao-ui-admin/src/api/promotion/seckillActivity.js @@ -18,6 +18,14 @@ export function updateSeckillActivity(data) { }) } +// 关闭限时折扣活动 +export function closeSeckillActivity(id) { + return request({ + url: '/promotion/seckill-activity/close?id=' + id, + method: 'put' + }) +} + // 删除秒杀活动 export function deleteSeckillActivity(id) { return request({ @@ -42,13 +50,3 @@ export function getSeckillActivityPage(query) { params: query }) } - -// 导出秒杀活动 Excel -export function exportSeckillActivityExcel(query) { - return request({ - url: '/promotion/seckill-activity/export-excel', - method: 'get', - params: query, - responseType: 'blob' - }) -} From 54baad165de937ac4853bd4470ca92205b62dd1d Mon Sep 17 00:00:00 2001 From: halfninety <690534687@qq.com> Date: Mon, 28 Nov 2022 23:32:23 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E7=A7=92=E6=9D=80=E6=97=B6=E6=AE=B5?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9=E6=97=B6=E9=97=B4=E6=AE=B5?= =?UTF-8?q?=E5=86=B2=E7=AA=81=E6=A0=A1=E9=AA=8C=E3=80=82=20=E7=A7=92?= =?UTF-8?q?=E6=9D=80=E6=B4=BB=E5=8A=A8=E6=96=B0=E5=A2=9E=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E5=88=A0=E9=99=A4=E6=97=B6=E5=AF=B9=E7=A7=92?= =?UTF-8?q?=E6=9D=80=E6=97=B6=E6=AE=B5=E7=9A=84=E7=A7=92=E6=9D=80=E6=B4=BB?= =?UTF-8?q?=E5=8A=A8=E6=95=B0=E9=87=8F=E8=BF=9B=E8=A1=8C=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/enums/ErrorCodeConstants.java | 16 ++++-- .../seckilltime/SeckillTimeController.java | 50 ++++++---------- .../seckilltime/vo/SeckillTimeExcelVO.java | 37 ------------ .../vo/SeckillTimeExportReqVO.java | 30 ---------- .../seckilltime/vo/SeckillTimeRespVO.java | 4 +- .../seckilltime/SeckillTimeConvert.java | 1 - .../dataobject/seckilltime/SeckillTimeDO.java | 11 ++-- .../mysql/seckilltime/SeckillTimeMapper.java | 57 +++++++++++++------ .../SeckillActivityServiceImpl.java | 48 +++++++++++++--- .../seckilltime/SeckillTimeService.java | 31 +++++----- .../seckilltime/SeckillTimeServiceImpl.java | 48 +++++++++++++--- .../SeckillTimeServiceImplTest.java | 22 +++---- .../src/views/promotion/seckillTime/index.vue | 2 +- 13 files changed, 181 insertions(+), 176 deletions(-) delete mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExcelVO.java delete mode 100644 yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExportReqVO.java diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java index 5e21b568c..47ce28b4b 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java +++ b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java @@ -47,10 +47,14 @@ public interface ErrorCodeConstants { // ========== 秒杀活动 1003008000 ========== ErrorCode SECKILL_ACTIVITY_NOT_EXISTS = new ErrorCode(1003008000, "秒杀活动不存在"); - ErrorCode SECKILL_TIME_NOT_EXISTS = new ErrorCode(1003008001, "秒杀时段不存在"); - ErrorCode SECKILL_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1003008001, "存在商品参加了其它秒杀活动"); - ErrorCode SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1003006002, "秒杀活动已关闭,不能修改"); - ErrorCode SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1003006003, "秒杀活动未关闭,不能删除"); - ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1003006004, "秒杀活动已关闭,不能重复关闭"); - ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_END = new ErrorCode(1003006004, "秒杀活动已结束,不能关闭"); + ErrorCode SECKILL_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1003008002, "存在商品参加了其它秒杀活动"); + ErrorCode SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1003008003, "秒杀活动已关闭,不能修改"); + ErrorCode SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1003008004, "秒杀活动未关闭或未结束,不能删除"); + ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1003008005, "秒杀活动已关闭,不能重复关闭"); + ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_END = new ErrorCode(1003008006, "秒杀活动已结束,不能关闭"); + + // ========== 秒杀时段 1003009000 ========== + ErrorCode SECKILL_TIME_NOT_EXISTS = new ErrorCode(1003009000, "秒杀时段不存在"); + ErrorCode SECKILL_TIME_CONFLICTS = new ErrorCode(1003009001, "秒杀时段冲突"); + } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java index 1f66fb1c6..96524c65d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java @@ -1,30 +1,24 @@ package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime; -import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.annotations.*; - -import javax.validation.constraints.*; -import javax.validation.*; -import javax.servlet.http.*; -import java.util.*; -import java.io.IOException; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; - -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; - -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeRespVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeUpdateReqVO; import cn.iocoder.yudao.module.promotion.convert.seckilltime.SeckillTimeConvert; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; import cn.iocoder.yudao.module.promotion.service.seckilltime.SeckillTimeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +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; @Api(tags = "管理后台 - 秒杀时段") @RestController @@ -84,16 +78,4 @@ public class SeckillTimeController { // return success(SeckillTimeConvert.INSTANCE.convertPage(pageResult)); // } - @GetMapping("/export-excel") - @ApiOperation("导出秒杀时段 Excel") - @PreAuthorize("@ss.hasPermission('promotion:seckill-time:export')") - @OperateLog(type = EXPORT) - public void exportSeckillTimeExcel(@Valid SeckillTimeExportReqVO exportReqVO, - HttpServletResponse response) throws IOException { - List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList(exportReqVO); - // 导出 Excel - List<SeckillTimeExcelVO> datas = SeckillTimeConvert.INSTANCE.convertList02(list); - ExcelUtils.write(response, "秒杀时段.xls", "数据", SeckillTimeExcelVO.class, datas); - } - } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExcelVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExcelVO.java deleted file mode 100644 index 4b7f436da..000000000 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExcelVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; - -import lombok.*; - -import java.time.LocalTime; -import java.util.*; -import io.swagger.annotations.*; - -import com.alibaba.excel.annotation.ExcelProperty; - -/** - * 秒杀时段 Excel VO - * - * @author 芋道源码 - */ -@Data -public class SeckillTimeExcelVO { - - @ExcelProperty("编号") - private Long id; - - @ExcelProperty("秒杀时段名称") - private String name; - - @ExcelProperty("开始时间点") - private LocalTime startTime; - - @ExcelProperty("结束时间点") - private LocalTime endTime; - - @ExcelProperty("商品数量") - private Integer productCount; - - @ExcelProperty("创建时间") - private Date createTime; - -} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExportReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExportReqVO.java deleted file mode 100644 index f364db21d..000000000 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeExportReqVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; - -import lombok.*; - -import java.time.LocalTime; -import java.util.*; -import io.swagger.annotations.*; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import org.springframework.format.annotation.DateTimeFormat; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@ApiModel(value = "管理后台 - 秒杀时段 Excel 导出 Request VO", description = "参数和 SeckillTimePageReqVO 是一致的") -@Data -public class SeckillTimeExportReqVO { - - @ApiModelProperty(value = "秒杀时段名称") - private String name; - - @ApiModelProperty(value = "开始时间点") - private LocalTime[] startTime; - - @ApiModelProperty(value = "结束时间点") - private LocalTime[] endTime; - - @ApiModelProperty(value = "创建时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private Date[] createTime; - -} diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java index 09c01da55..b7b679a5d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java @@ -13,8 +13,8 @@ public class SeckillTimeRespVO extends SeckillTimeBaseVO { @ApiModelProperty(value = "编号", required = true) private Long id; - @ApiModelProperty(value = "商品数量", required = true) - private Integer productCount; + @ApiModelProperty(value = "秒杀活动数量", required = true) + private Integer seckillActivityCount; @ApiModelProperty(value = "创建时间", required = true) private Date createTime; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java index a983485e5..9c61206c7 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java @@ -29,5 +29,4 @@ public interface SeckillTimeConvert { PageResult<SeckillTimeRespVO> convertPage(PageResult<SeckillTimeDO> page); - List<SeckillTimeExcelVO> convertList02(List<SeckillTimeDO> list); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java index 4e06151d5..b9f4d4bc0 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalTime; -import java.util.*; -import com.baomidou.mybatisplus.annotation.*; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; /** * 秒杀时段 DO @@ -40,8 +41,8 @@ public class SeckillTimeDO extends BaseDO { */ private LocalTime endTime; /** - * 商品数量 + * 秒杀活动数量 */ - private Integer productCount; + private Integer seckillActivityCount; } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java index d9a902c01..30af96a85 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java @@ -1,11 +1,17 @@ package cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime; +import java.time.LocalTime; import java.util.*; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; import org.apache.ibatis.annotations.Mapper; import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; @@ -16,25 +22,42 @@ import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; */ @Mapper public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> { + default List<SeckillTimeDO> selectListWithTime(LocalTime time){ + if (time == null) { + return Collections.emptyList(); + } + return selectList(new LambdaQueryWrapper<SeckillTimeDO>() + .le(SeckillTimeDO::getStartTime,time) + .ge(SeckillTimeDO::getEndTime,time)); + } + + default List<SeckillTimeDO> selectListWithTime(LocalTime startTime, LocalTime endTime){ + if (startTime == null && endTime == null) { + return Collections.emptyList(); + } + return selectList(new LambdaQueryWrapper<SeckillTimeDO>() + .ge(SeckillTimeDO::getStartTime,startTime) + .le(SeckillTimeDO::getEndTime,endTime)); + } -// default PageResult<SeckillTimeDO> selectPage(SeckillTimePageReqVO reqVO) { -// return selectPage(reqVO, new LambdaQueryWrapperX<SeckillTimeDO>() -// .likeIfPresent(SeckillTimeDO::getName, reqVO.getName()) -// .geIfPresent(SeckillTimeDO::getStartTime, reqVO.getStartTime()) -// .leIfPresent(SeckillTimeDO::getEndTime, reqVO.getEndTime()) -//// .betweenIfPresent(SeckillTimeDO::getStartTime, reqVO.getStartTime()) -//// .betweenIfPresent(SeckillTimeDO::getEndTime, reqVO.getEndTime()) -//// .betweenIfPresent(SeckillTimeDO::getCreateTime, reqVO.getCreateTime()) -// .orderByDesc(SeckillTimeDO::getId)); -// } + default void sekillActivityCountAdd(List<Long> ids){ + if (CollUtil.isEmpty(ids)){ + return; + } + new LambdaUpdateChainWrapper<SeckillTimeDO>(this) + .in(SeckillTimeDO::getId,ids) + .setSql("`seckill_activity_count` = `seckill_activity_count` + 1 ") + .update(); + } - default List<SeckillTimeDO> selectList(SeckillTimeExportReqVO reqVO) { - return selectList(new LambdaQueryWrapperX<SeckillTimeDO>() - .likeIfPresent(SeckillTimeDO::getName, reqVO.getName()) - .betweenIfPresent(SeckillTimeDO::getStartTime, reqVO.getStartTime()) - .betweenIfPresent(SeckillTimeDO::getEndTime, reqVO.getEndTime()) - .betweenIfPresent(SeckillTimeDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(SeckillTimeDO::getId)); + default void sekillActivityCountReduce(List<Long> ids){ + if (CollUtil.isEmpty(ids)){ + return; + } + new LambdaUpdateChainWrapper<SeckillTimeDO>(this) + .in(SeckillTimeDO::getId,ids) + .setSql("`seckill_activity_count` = `seckill_activity_count` - 1 ") + .update(); } } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java index 63c1bd13d..d49655a54 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.promotion.service.seckillactivity; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityBaseVO; import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityCreateReqVO; import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityPageReqVO; @@ -13,6 +14,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillP import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper; import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillProductMapper; import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; +import cn.iocoder.yudao.module.promotion.service.seckilltime.SeckillTimeService; import cn.iocoder.yudao.module.promotion.util.PromotionUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -20,6 +22,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; @@ -40,22 +43,24 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @Resource private SeckillProductMapper seckillProductMapper; + @Resource + private SeckillTimeService seckillTimeService; + @Override public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) { -// validateSeckillActivityProductConflicts(null,createReqVO.getProducts()); List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus()); // 校验商品是否冲突 validateSeckillActivityProductConflicts(null, createReqVO.getProducts()); + // 更新秒杀时段的秒杀活动数量 + seckillTimeService.sekillActivityCountAdd(StrUtils.splitToLong(createReqVO.getTimeId(),",")); // 插入秒杀活动 SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO) - .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));; + .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime())); seckillActivityMapper.insert(seckillActivity); - // 插入商品 List<SeckillProductDO> productDOS = CollectionUtils.convertList(createReqVO.getProducts(), product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(seckillActivity.getId())); seckillProductMapper.insertBatch(productDOS); - // 返回 return seckillActivity.getId(); } @@ -66,9 +71,10 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { if (PromotionActivityStatusEnum.CLOSE.getStatus().equals(seckillActivity.getStatus())) { throw exception(SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED); } - List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus()); // 校验商品是否冲突 validateSeckillActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); + // 更新秒杀时段的秒杀活动数量 + updateSeckillTimeActivityCount(updateReqVO.getId(), updateReqVO.getTimeId()); // 更新活动 SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO) .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); @@ -77,6 +83,28 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { updateSeckillProduct(updateReqVO); } + /** + * 更新秒杀时段的秒杀活动数量 + * + * @param id + * @param timeId + */ + private void updateSeckillTimeActivityCount(Long id, String timeId) { + List<Long> updateTimeIds = StrUtils.splitToLong(timeId, ","); + // 查出自己的timeIds + SeckillActivityDO seckillActivityDO = seckillActivityMapper.selectById(id); + List<Long> existsTimeIds = StrUtils.splitToLong(seckillActivityDO.getTimeId(), ","); + //需要减少的时间段 + List<Long> reduceIds = existsTimeIds.stream() + .filter(existsTimeId -> !updateTimeIds.contains(existsTimeId)) + .collect(Collectors.toList()); + //需要添加的时间段 + updateTimeIds.removeIf(updateTimeId -> existsTimeIds.contains(updateTimeId)); + //更新减少时间段和增加时间段 + seckillTimeService.sekillActivityCountAdd(updateTimeIds); + seckillTimeService.sekillActivityCountReduce(reduceIds); + } + /** * 更新秒杀商品 */ @@ -109,7 +137,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { * @param id 秒杀活动编号 * @param products 商品列表 */ - public void validateSeckillActivityProductConflicts(Long id, List<SeckillActivityBaseVO.Product> products) { + private void validateSeckillActivityProductConflicts(Long id, List<SeckillActivityBaseVO.Product> products) { if (CollUtil.isEmpty(products)) { return; } @@ -146,16 +174,18 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { // 更新 SeckillActivityDO updateObj = new SeckillActivityDO().setId(id).setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); seckillActivityMapper.updateById(updateObj); - } @Override public void deleteSeckillActivity(Long id) { // 校验存在 SeckillActivityDO seckillActivity = this.validateSeckillActivityExists(id); - if (!PromotionActivityStatusEnum.CLOSE.getStatus().equals(seckillActivity.getStatus())) { - throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED); + List<Integer> statuses = asList(PromotionActivityStatusEnum.CLOSE.getStatus(), PromotionActivityStatusEnum.END.getStatus()); + if (!statuses.contains(seckillActivity.getStatus())) { + throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END); } + // 更新秒杀时段的秒杀活动数量 + seckillTimeService.sekillActivityCountReduce(StrUtils.splitToLong(seckillActivity.getTimeId(),",")); // 删除 seckillActivityMapper.deleteById(id); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java index 5c5011dd0..da12983d3 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java @@ -1,10 +1,11 @@ package cn.iocoder.yudao.module.promotion.service.seckilltime; -import java.util.*; -import javax.validation.*; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeUpdateReqVO; import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import javax.validation.Valid; +import java.util.List; /** * 秒杀时段 Service 接口 @@ -50,20 +51,18 @@ public interface SeckillTimeService { */ List<SeckillTimeDO> getSeckillTimeList(); -// /** -// * 获得秒杀时段分页 -// * -// * @param pageReqVO 分页查询 -// * @return 秒杀时段分页 -// */ -// PageResult<SeckillTimeDO> getSeckillTimePage(SeckillTimePageReqVO pageReqVO); + /** + * 秒杀时段列表的秒杀活动数量加 1 + * + * @param ids 秒杀时段id列表 + */ + void sekillActivityCountAdd(List<Long> ids); + /** - * 获得秒杀时段列表, 用于 Excel 导出 + * 秒杀时段列表的秒杀活动数量减 1 * - * @param exportReqVO 查询条件 - * @return 秒杀时段列表 + * @param ids 秒杀时段id列表 */ - List<SeckillTimeDO> getSeckillTimeList(SeckillTimeExportReqVO exportReqVO); - + void sekillActivityCountReduce(List<Long> ids); } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java index de4becc15..687e81b7a 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java @@ -1,13 +1,17 @@ package cn.iocoder.yudao.module.promotion.service.seckilltime; +import cn.hutool.core.collection.CollUtil; import org.springframework.stereotype.Service; + import javax.annotation.Resource; + import org.springframework.validation.annotation.Validated; +import java.time.LocalTime; import java.util.*; + import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.promotion.convert.seckilltime.SeckillTimeConvert; import cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime.SeckillTimeMapper; @@ -24,11 +28,14 @@ import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; @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); @@ -40,6 +47,8 @@ public class SeckillTimeServiceImpl implements SeckillTimeService { 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); @@ -59,6 +68,31 @@ public class SeckillTimeServiceImpl implements SeckillTimeService { } } + /** + * 校验时间是否存在冲突 + * + * @param startTime 开始时间 + * @param endTime 结束时间 + */ + private void validateSeckillTimeConflict(Long id, LocalTime startTime, LocalTime endTime) { + //查询开始时间,结束时间,是否在别人的时间段内 + List<SeckillTimeDO> startTimeList = seckillTimeMapper.selectListWithTime(startTime); + List<SeckillTimeDO> endTimeList = seckillTimeMapper.selectListWithTime(endTime); + //查询自己时间段内是否有时间段 + List<SeckillTimeDO> startEndTimeList = seckillTimeMapper.selectListWithTime(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); @@ -69,14 +103,14 @@ public class SeckillTimeServiceImpl implements SeckillTimeService { return seckillTimeMapper.selectList(); } -// @Override -// public PageResult<SeckillTimeDO> getSeckillTimePage(SeckillTimePageReqVO pageReqVO) { -// return seckillTimeMapper.selectPage(pageReqVO); -// } + @Override + public void sekillActivityCountAdd(List<Long> ids) { + seckillTimeMapper.sekillActivityCountAdd(ids); + } @Override - public List<SeckillTimeDO> getSeckillTimeList(SeckillTimeExportReqVO exportReqVO) { - return seckillTimeMapper.selectList(exportReqVO); + public void sekillActivityCountReduce(List<Long> ids) { + seckillTimeMapper.sekillActivityCountReduce(ids); } } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java index d5379212d..8afb5dda5 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java @@ -180,17 +180,17 @@ public class SeckillTimeServiceImplTest extends BaseDbUnitTest { // 测试 createTime 不匹配 seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setCreateTime(null))); // 准备参数 - SeckillTimeExportReqVO reqVO = new SeckillTimeExportReqVO(); - reqVO.setName(null); - reqVO.setStartTime((new LocalTime[]{})); - reqVO.setEndTime((new LocalTime[]{})); - reqVO.setCreateTime((new Date[]{})); - - // 调用 - List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(dbSeckillTime, list.get(0)); +// SeckillTimeExportReqVO reqVO = new SeckillTimeExportReqVO(); +// reqVO.setName(null); +// reqVO.setStartTime((new LocalTime[]{})); +// reqVO.setEndTime((new LocalTime[]{})); +// reqVO.setCreateTime((new Date[]{})); +// +// // 调用 +// List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList(reqVO); +// // 断言 +// assertEquals(1, list.size()); +// assertPojoEquals(dbSeckillTime, list.get(0)); } } diff --git a/yudao-ui-admin/src/views/promotion/seckillTime/index.vue b/yudao-ui-admin/src/views/promotion/seckillTime/index.vue index c41dba309..df829582b 100644 --- a/yudao-ui-admin/src/views/promotion/seckillTime/index.vue +++ b/yudao-ui-admin/src/views/promotion/seckillTime/index.vue @@ -47,7 +47,7 @@ <span>{{ scope.row.endTime }}</span> </template> </el-table-column> - <el-table-column label="商品数量" align="center" prop="productCount" /> + <el-table-column label="秒杀活动数量" align="center" prop="seckillActivityCount" /> <el-table-column label="创建时间" align="center" prop="createTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.createTime) }}</span> From fc3245a06b618640d28f9bffa603a205113d58e2 Mon Sep 17 00:00:00 2001 From: halfninety <690534687@qq.com> Date: Tue, 29 Nov 2022 22:51:31 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=A7=92=E6=9D=80?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=96=87=E4=BB=B6=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SeckillActivityController.java | 12 +++++----- .../vo/SeckillActivityBaseVO.java | 2 +- .../vo/SeckillActivityCreateReqVO.java | 2 +- .../vo/SeckillActivityDetailRespVO.java | 2 +- .../vo/SeckillActivityPageReqVO.java | 2 +- .../vo/SeckillActivityRespVO.java | 2 +- .../vo/SeckillActivityUpdateReqVO.java | 2 +- .../seckilltime/SeckillTimeController.java | 14 ++++++------ .../seckilltime/vo/SeckillTimeBaseVO.java | 2 +- .../vo/SeckillTimeCreateReqVO.java | 4 +--- .../seckilltime/vo/SeckillTimePageReqVO.java | 2 +- .../seckilltime/vo/SeckillTimeRespVO.java | 2 +- .../vo/SeckillTimeSimpleRespVO.java | 2 +- .../vo/SeckillTimeUpdateReqVO.java | 2 +- .../SeckillActivityConvert.java | 10 ++++----- .../seckilltime/SeckillTimeConvert.java | 8 ++++--- .../seckillactivity/SeckillActivityDO.java | 2 +- .../seckillactivity/SeckillProductDO.java | 2 +- .../seckilltime/SeckillTimeDO.java | 2 +- .../SeckillActivityMapper.java | 6 ++--- .../seckillactivity/SeckillProductMapper.java | 4 ++-- .../seckilltime/SeckillTimeMapper.java | 9 ++------ .../SeckillActivityService.java | 11 ++++++---- .../SeckillActivityServiceImpl.java | 22 +++++++++---------- .../seckilltime/SeckillTimeService.java | 8 +++---- .../seckilltime/SeckillTimeServiceImpl.java | 11 +++++----- .../seckillactivity/SeckillActivityMapper.xml | 2 +- .../mapper/seckilltime/SeckillTimeMapper.xml | 2 +- .../SeckillActivityServiceImplTest.java | 11 +++++----- .../SeckillTimeServiceImplTest.java | 17 +++++--------- 30 files changed, 86 insertions(+), 93 deletions(-) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckillactivity/SeckillActivityController.java (90%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckillactivity/vo/SeckillActivityBaseVO.java (99%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckillactivity/vo/SeckillActivityCreateReqVO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckillactivity/vo/SeckillActivityDetailRespVO.java (95%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckillactivity/vo/SeckillActivityPageReqVO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckillactivity/vo/SeckillActivityRespVO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckillactivity/vo/SeckillActivityUpdateReqVO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckilltime/SeckillTimeController.java (89%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckilltime/vo/SeckillTimeBaseVO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckilltime/vo/SeckillTimeCreateReqVO.java (81%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckilltime/vo/SeckillTimePageReqVO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckilltime/vo/SeckillTimeRespVO.java (96%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckilltime/vo/SeckillTimeSimpleRespVO.java (84%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/{ => seckill}/seckilltime/vo/SeckillTimeUpdateReqVO.java (96%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/{ => seckill}/seckillactivity/SeckillActivityConvert.java (88%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/{ => seckill}/seckilltime/SeckillTimeConvert.java (63%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/{ => seckill}/seckillactivity/SeckillActivityDO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/{ => seckill}/seckillactivity/SeckillProductDO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/{ => seckill}/seckilltime/SeckillTimeDO.java (98%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/{ => seckill}/seckillactivity/SeckillActivityMapper.java (85%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/{ => seckill}/seckillactivity/SeckillProductMapper.java (75%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/{ => seckill}/seckilltime/SeckillTimeMapper.java (80%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/{ => seckill}/seckillactivity/SeckillActivityService.java (74%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/{ => seckill}/seckillactivity/SeckillActivityServiceImpl.java (92%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/{ => seckill}/seckilltime/SeckillTimeService.java (84%) rename yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/{ => seckill}/seckilltime/SeckillTimeServiceImpl.java (88%) diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/SeckillActivityController.java similarity index 90% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/SeckillActivityController.java index a6434a501..1efeb387e 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/SeckillActivityController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/SeckillActivityController.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; -import cn.iocoder.yudao.module.promotion.convert.seckillactivity.SeckillActivityConvert; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; -import cn.iocoder.yudao.module.promotion.service.seckillactivity.SeckillActivityService; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; +import cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity.SeckillActivityService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityBaseVO.java similarity index 99% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityBaseVO.java index 62ed1fa2d..66128212a 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityBaseVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityCreateReqVO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityCreateReqVO.java index 2cd21af9e..1291da6c7 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityCreateReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityCreateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityDetailRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityDetailRespVO.java similarity index 95% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityDetailRespVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityDetailRespVO.java index 97da65df8..aa6343137 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityDetailRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityDetailRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; import io.swagger.annotations.ApiModel; import lombok.Data; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityPageReqVO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityPageReqVO.java index 102877d2b..5aa32fac8 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityPageReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityPageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import com.fasterxml.jackson.annotation.JsonFormat; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityRespVO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityRespVO.java index 91db8565b..220f4df6f 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityUpdateReqVO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityUpdateReqVO.java index d8471594c..f53bb50d8 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckillactivity/vo/SeckillActivityUpdateReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckillactivity/vo/SeckillActivityUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/SeckillTimeController.java similarity index 89% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/SeckillTimeController.java index 96524c65d..fad5300be 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/SeckillTimeController.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/SeckillTimeController.java @@ -1,12 +1,12 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeCreateReqVO; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeRespVO; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeUpdateReqVO; -import cn.iocoder.yudao.module.promotion.convert.seckilltime.SeckillTimeConvert; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; -import cn.iocoder.yudao.module.promotion.service.seckilltime.SeckillTimeService; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeRespVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.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.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeBaseVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeBaseVO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeBaseVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeBaseVO.java index 5d9e3e2b4..fd2ea5480 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeBaseVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeBaseVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; import lombok.*; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeCreateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeCreateReqVO.java similarity index 81% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeCreateReqVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeCreateReqVO.java index f69d5ab8c..e00ad7a63 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeCreateReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeCreateReqVO.java @@ -1,9 +1,7 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; import lombok.*; -import java.util.*; import io.swagger.annotations.*; -import javax.validation.constraints.*; @ApiModel("管理后台 - 秒杀时段创建 Request VO") @Data diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimePageReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimePageReqVO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimePageReqVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimePageReqVO.java index 6fe13e0ed..7fe5b07d5 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimePageReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimePageReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.annotations.ApiModel; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeRespVO.java similarity index 96% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeRespVO.java index b7b679a5d..c40f189d9 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; import lombok.*; import java.util.*; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeSimpleRespVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeSimpleRespVO.java similarity index 84% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeSimpleRespVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeSimpleRespVO.java index ae8288a26..25714595f 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeSimpleRespVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeSimpleRespVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; public class SeckillTimeSimpleRespVO { } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeUpdateReqVO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeUpdateReqVO.java similarity index 96% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeUpdateReqVO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeUpdateReqVO.java index 84a5f0204..16b786c7d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckilltime/vo/SeckillTimeUpdateReqVO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/seckilltime/vo/SeckillTimeUpdateReqVO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo; +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java similarity index 88% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java index 90db545c2..fda7b6e1d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckillactivity/SeckillActivityConvert.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.module.promotion.convert.seckillactivity; +package cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.*; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; @@ -40,7 +40,7 @@ public interface SeckillActivityConvert { PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page); @Mappings({@Mapping(target = "products",source = "seckillProducts")}) - SeckillActivityDetailRespVO convert(SeckillActivityDO seckillActivity,List<SeckillProductDO> seckillProducts); + SeckillActivityDetailRespVO convert(SeckillActivityDO seckillActivity, List<SeckillProductDO> seckillProducts); /** diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckilltime/SeckillTimeConvert.java similarity index 63% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckilltime/SeckillTimeConvert.java index 9c61206c7..dda7d2c9d 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckilltime/SeckillTimeConvert.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckilltime/SeckillTimeConvert.java @@ -1,13 +1,15 @@ -package cn.iocoder.yudao.module.promotion.convert.seckilltime; +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.seckilltime.vo.SeckillTimeCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeRespVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; /** * 秒杀时段 Convert diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java index 2ff3b1b4c..fc1341862 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillActivityDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity; +package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillProductDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillProductDO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java index e6e8f6a9f..3ed54efa4 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckillactivity/SeckillProductDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity; +package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.IdType; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckilltime/SeckillTimeDO.java similarity index 98% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckilltime/SeckillTimeDO.java index b9f4d4bc0..56dc0eb93 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckilltime/SeckillTimeDO.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckilltime/SeckillTimeDO.java @@ -1,4 +1,4 @@ -package cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime; +package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java similarity index 85% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java index 12cc179b3..41b7cafdc 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillActivityMapper.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java @@ -1,10 +1,10 @@ -package cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity; +package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity; 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.seckillactivity.vo.SeckillActivityPageReqVO; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityPageReqVO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; import org.apache.ibatis.annotations.Mapper; /** diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillProductMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java similarity index 75% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillProductMapper.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java index d1d609982..3c76b45df 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckillactivity/SeckillProductMapper.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java @@ -1,7 +1,7 @@ -package cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity; +package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java similarity index 80% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java index 30af96a85..83242f18b 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckilltime/SeckillTimeMapper.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java @@ -1,19 +1,14 @@ -package cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime; +package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime; import java.time.LocalTime; import java.util.*; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +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 com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; /** * 秒杀时段 Mapper diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityService.java similarity index 74% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityService.java index 1b3060d52..6b45330ba 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityService.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityService.java @@ -1,11 +1,14 @@ -package cn.iocoder.yudao.module.promotion.service.seckillactivity; +package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; import java.util.*; import javax.validation.*; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.*; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; + +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityPageReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.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.seckillactivity.SeckillProductDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; /** * 秒杀活动 Service 接口 diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityServiceImpl.java similarity index 92% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityServiceImpl.java index d49655a54..d10fd607f 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityServiceImpl.java @@ -1,20 +1,20 @@ -package cn.iocoder.yudao.module.promotion.service.seckillactivity; +package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.string.StrUtils; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityBaseVO; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityCreateReqVO; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityPageReqVO; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityUpdateReqVO; -import cn.iocoder.yudao.module.promotion.convert.seckillactivity.SeckillActivityConvert; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillProductDO; -import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper; -import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillProductMapper; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityBaseVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityPageReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityUpdateReqVO; +import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; +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.seckilltime.SeckillTimeService; +import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeService; import cn.iocoder.yudao.module.promotion.util.PromotionUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeService.java similarity index 84% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeService.java index da12983d3..0256c873a 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeService.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeService.java @@ -1,8 +1,8 @@ -package cn.iocoder.yudao.module.promotion.service.seckilltime; +package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeCreateReqVO; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.SeckillTimeUpdateReqVO; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; import javax.validation.Valid; import java.util.List; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeServiceImpl.java similarity index 88% rename from yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java rename to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeServiceImpl.java index 687e81b7a..44e959835 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeServiceImpl.java @@ -1,6 +1,8 @@ -package cn.iocoder.yudao.module.promotion.service.seckilltime; +package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime; import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -10,11 +12,10 @@ import org.springframework.validation.annotation.Validated; import java.time.LocalTime; import java.util.*; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; -import cn.iocoder.yudao.module.promotion.convert.seckilltime.SeckillTimeConvert; -import cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime.SeckillTimeMapper; +import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime.SeckillTimeMapper; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.xml b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.xml index a9134c696..0f0d7c6cf 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.xml +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckillactivity/SeckillActivityMapper.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper"> +<mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper"> <!-- 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.xml b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.xml index eef757f86..c15423798 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.xml +++ b/yudao-module-mall/yudao-module-promotion-biz/src/main/resources/mapper/seckilltime/SeckillTimeMapper.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime.SeckillTimeMapper"> +<mapper namespace="cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime.SeckillTimeMapper"> <!-- 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java index 2492fb0ac..2ea767e97 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java @@ -2,11 +2,12 @@ package cn.iocoder.yudao.module.promotion.service.seckillactivity; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityCreateReqVO; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityPageReqVO; -import cn.iocoder.yudao.module.promotion.controller.admin.seckillactivity.vo.SeckillActivityUpdateReqVO; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckillactivity.SeckillActivityDO; -import cn.iocoder.yudao.module.promotion.dal.mysql.seckillactivity.SeckillActivityMapper; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityPageReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckillactivity.vo.SeckillActivityUpdateReqVO; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; +import cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity.SeckillActivityServiceImpl; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java index 8afb5dda5..439bcf03e 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java +++ b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java @@ -1,34 +1,27 @@ package cn.iocoder.yudao.module.promotion.service.seckilltime; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeCreateReqVO; +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.seckilltime.vo.SeckillTimeUpdateReqVO; +import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeServiceImpl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; import javax.annotation.Resource; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; -import cn.iocoder.yudao.module.promotion.controller.admin.seckilltime.vo.*; -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckilltime.SeckillTimeDO; -import cn.iocoder.yudao.module.promotion.dal.mysql.seckilltime.SeckillTimeMapper; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; +import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime.SeckillTimeMapper; -import javax.annotation.Resource; import org.springframework.context.annotation.Import; -import java.time.LocalTime; -import java.util.*; - -import static cn.hutool.core.util.RandomUtil.*; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; /** * {@link SeckillTimeServiceImpl} 的单元测试类 From 61c4053cbb3c81419d9e549be16e7254d14a6d6b Mon Sep 17 00:00:00 2001 From: halfninety <690534687@qq.com> Date: Tue, 29 Nov 2022 22:58:00 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=A7=92=E6=9D=80=E7=9B=B8=E5=85=B3=E6=96=87=E4=BB=B6=E5=AD=98?= =?UTF-8?q?=E6=94=BE=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => mall}/promotion/seckillActivity.js | 0 .../api/{ => mall}/promotion/seckillTime.js | 0 .../seckill}/seckillActivity/index.vue | 143 +++++++++--------- .../promotion/seckill}/seckillTime/index.vue | 64 ++------ 4 files changed, 77 insertions(+), 130 deletions(-) rename yudao-ui-admin/src/api/{ => mall}/promotion/seckillActivity.js (100%) rename yudao-ui-admin/src/api/{ => mall}/promotion/seckillTime.js (100%) rename yudao-ui-admin/src/views/{promotion => mall/promotion/seckill}/seckillActivity/index.vue (83%) rename yudao-ui-admin/src/views/{promotion => mall/promotion/seckill}/seckillTime/index.vue (71%) diff --git a/yudao-ui-admin/src/api/promotion/seckillActivity.js b/yudao-ui-admin/src/api/mall/promotion/seckillActivity.js similarity index 100% rename from yudao-ui-admin/src/api/promotion/seckillActivity.js rename to yudao-ui-admin/src/api/mall/promotion/seckillActivity.js diff --git a/yudao-ui-admin/src/api/promotion/seckillTime.js b/yudao-ui-admin/src/api/mall/promotion/seckillTime.js similarity index 100% rename from yudao-ui-admin/src/api/promotion/seckillTime.js rename to yudao-ui-admin/src/api/mall/promotion/seckillTime.js diff --git a/yudao-ui-admin/src/views/promotion/seckillActivity/index.vue b/yudao-ui-admin/src/views/mall/promotion/seckill/seckillActivity/index.vue similarity index 83% rename from yudao-ui-admin/src/views/promotion/seckillActivity/index.vue rename to yudao-ui-admin/src/views/mall/promotion/seckill/seckillActivity/index.vue index 7fff0106f..3805def34 100644 --- a/yudao-ui-admin/src/views/promotion/seckillActivity/index.vue +++ b/yudao-ui-admin/src/views/mall/promotion/seckill/seckillActivity/index.vue @@ -18,8 +18,6 @@ <el-select v-model="queryParams.timeId" placeholder="请选择参与场次" clearable size="small"> <el-option v-for="item in seckillTimeList" :key="item.id" :label="item.name" :value="item.id" /> </el-select> - <!-- <el-option v-for="seckill in seckillTimeList" :key="seckill.id" :lable="seckill.name" :value="seckill.id" /> --> - <!-- <el-input v-model="queryParams.timeId" placeholder="请输入秒杀时段id" clearable @keyup.enter.native="handleQuery" /> --> </el-form-item> <el-form-item label="创建时间" prop="createTime"> <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" @@ -39,8 +37,8 @@ v-hasPermi="['promotion:seckill-activity:create']">新增秒杀活动</el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" - :loading="exportLoading" v-hasPermi="['promotion:seckill-activity:export']">导出</el-button> + <el-button type="primary" plain icon="el-icon-menu" size="mini" @click="openSeckillTime" + v-hasPermi="['promotion:seckill-activity:create']">管理参与场次</el-button> </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> </el-row> @@ -70,11 +68,6 @@ <el-table-column label="付款订单数" align="center" prop="orderCount" /> <el-table-column label="付款人数" align="center" prop="userCount" /> - <el-table-column label="订单实付金额" align="center"> - <template slot-scope="scope"> - ¥{{ (scope.row.totalPrice / 100.0).toFixed(2) }} - </template> - </el-table-column> <el-table-column label="创建时间" align="center" prop="createTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.createTime) }}</span> @@ -84,6 +77,8 @@ <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['promotion:seckill-activity:update']">修改</el-button> + <el-button size="mini" type="text" icon="el-icon-close" @click="handleClose(scope.row)" + v-hasPermi="['promotion:seckill-activity:delete']">关闭</el-button> <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['promotion:seckill-activity:delete']">删除</el-button> </template> @@ -99,40 +94,20 @@ <el-form-item label="活动名称" prop="name"> <el-input v-model="form.name" placeholder="请输入秒杀活动名称" /> </el-form-item> - <!-- <el-form-item label="活动状态" prop="status"> - <el-radio-group v-model="form.status"> - <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.PROMOTION_ACTIVITY_STATUS)" - :key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio> - </el-radio-group> - </el-form-item> --> - <el-form-item label="活动时间" prop="startAndEndTime"> <el-date-picker clearable v-model="form.startAndEndTime" type="datetimerange" value-format="timestamp" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" style="width: 1080px" /> </el-form-item> - <!-- - <el-form-item label="活动结束时间" prop="endTime"> - <el-date-picker clearable v-model="form.endTime" type="date" value-format="timestamp" placeholder="选择活动结束时间" /> - </el-form-item> --> - <el-form-item label="排序" prop="sort"> <el-input-number v-model="form.sort" controls-position="right" :min="0" :max="10000"> </el-input-number> </el-form-item> - - <!-- <el-form-item label="秒杀时段id" prop="timeId"> - <el-input v-model="form.timeId" placeholder="请输入秒杀时段id" /> - </el-form-item> - <el-form-item label="订单实付金额(分)" prop="totalPrice"> - <el-input v-model="form.totalPrice" placeholder="请输入订单实付金额(分)" /> - </el-form-item> --> - <el-form-item label="备注" prop="remark"> <el-input type="textarea" v-model="form.remark" placeholder="请输入备注" /> </el-form-item> <el-form-item label="场次选择"> - <el-select v-model="form.timeIds" placeholder="请选择参与场次" clearable size="small" multiple filterable + <el-select v-model="form.timeId" placeholder="请选择参与场次" clearable size="small" multiple filterable style="width: 880px"> <el-option v-for="item in seckillTimeList" :key="item.id" :label="item.name" :value="item.id"> <span style="float: left">{{ item.name + ': { ' }} {{ item.startTime }} -- {{ item.endTime + @@ -142,7 +117,6 @@ </el-option> </el-select> </el-form-item> - <el-form-item label="商品选择"> <el-select v-model="form.skuIds" placeholder="请选择活动商品" clearable size="small" multiple filterable style="width: 880px" @change="changeFormSku"> @@ -154,13 +128,11 @@ }}</span> </el-option> </el-select> - <el-row> <el-button type="primary" size="mini" @click="batchEditProduct('limitBuyCount')">限购</el-button> <el-button type="primary" size="mini" @click="batchEditProduct('seckillPrice')">秒杀价</el-button> <el-button type="primary" size="mini" @click="batchEditProduct('seckillStock')">秒杀库存</el-button> </el-row> - <el-table v-loading="loading" ref="productsTable" :data="form.products"> <el-table-column type="selection" width="55"> </el-table-column> @@ -177,28 +149,23 @@ <el-table-column label="库存" align="center" prop="productStock" /> <el-table-column label="限购(0为不限购)" align="center" width="150"> <template slot-scope="scope"> - <el-input-number v-model="scope.row.limitBuyCount" size="mini" controls-position="right" - :min="0" :max="10000"> + <el-input-number v-model="scope.row.limitBuyCount" size="mini" :min="0" :max="10000"> </el-input-number> </template> </el-table-column> - <el-table-column label="秒杀价(元)" align="center" width="150"> <template slot-scope="scope"> - <el-input-number v-model="scope.row.seckillPrice" size="mini" controls-position="right" - :precision="2" :min="0" :max="10000"> + <el-input-number v-model="scope.row.seckillPrice" size="mini" :precision="2" :min="0" + :max="10000"> </el-input-number> </template> </el-table-column> - - <el-table-column label="秒杀库存" align="center" width="150"> + <el-table-column label="秒杀库存" align="center" width="150" prop="seckillStock"> <template slot-scope="scope"> - <el-input-number v-model="scope.row.seckillStock" size="mini" controls-position="right" - :min="0" :max="10000"> + <el-input-number v-model="scope.row.seckillStock" size="mini" :min="0" :max="10000"> </el-input-number> </template> </el-table-column> - <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-delete" @@ -208,8 +175,6 @@ </el-table-column> </el-table> </el-form-item> - - </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitForm">确 定</el-button> @@ -221,10 +186,9 @@ <script> import { getSkuOptionList } from "@/api/mall/product/sku"; -import { createSeckillActivity, updateSeckillActivity, deleteSeckillActivity, getSeckillActivity, getSeckillActivityPage, exportSeckillActivityExcel } from "@/api/promotion/seckillActivity"; -import { getSeckillTimeList } from "@/api/promotion/seckillTime"; -import router from '@/router'; -import { PromotionDiscountTypeEnum } from "@/utils/constants"; +import { createSeckillActivity, updateSeckillActivity, closeSeckillActivity,deleteSeckillActivity, getSeckillActivity, getSeckillActivityPage, exportSeckillActivityExcel } from "@/api/mall/promotion/seckillActivity"; +import { getSeckillTimeList } from "@/api/mall/promotion/seckillTime"; +import { deepClone } from "@/utils"; export default { name: "SeckillActivity", @@ -234,8 +198,6 @@ export default { return { // 遮罩层 loading: true, - // 导出遮罩层 - exportLoading: false, // 显示搜索条件 showSearch: true, // 总条数 @@ -261,7 +223,7 @@ export default { form: { skuIds: [], // 选中的 SKU products: [], // 商品信息 - timeIds: [], //选中的秒杀场次id + timeId: [], //选中的秒杀场次id }, // 商品 SKU 列表 productSkus: [], @@ -270,9 +232,8 @@ export default { name: [{ required: true, message: "秒杀活动名称不能为空", trigger: "blur" }], status: [{ required: true, message: "活动状态不能为空", trigger: "blur" }], startAndEndTime: [{ required: true, message: "活动时间不能为空", trigger: "blur" }], - endTime: [{ required: true, message: "活动结束时间不能为空", trigger: "blur" }], sort: [{ required: true, message: "排序不能为空", trigger: "blur" }], - timeIds: [{ required: true, message: "秒杀场次不能为空", trigger: "blur" }], + timeId: [{ required: true, message: "秒杀场次不能为空", trigger: "blur" }], totalPrice: [{ required: true, message: "订单实付金额,单位:分不能为空", trigger: "blur" }], } }; @@ -280,17 +241,26 @@ export default { created() { this.getList(); }, + watch:{ + $route: 'getList' + }, methods: { /** 查询列表 */ getList() { + const timeId = this.$route.params && this.$route.params.timeId; + if (timeId) { + this.queryParams.timeId = timeId + } this.loading = true; // 执行查询 getSeckillActivityPage(this.queryParams).then(response => { this.list = response.data.list; - console.log(response, "查询返回的秒杀活动列表"); this.total = response.data.total; this.loading = false; }); + if (timeId) { + this.$route.params.timeId = undefined + } // 获得 SKU 商品列表 getSkuOptionList().then(response => { this.productSkus = response.data; @@ -298,7 +268,6 @@ export default { // 获取参与场次列表 getSeckillTimeList().then(response => { this.seckillTimeList = response.data; - console.log(this.seckillTimeList, "最终获取的参与场次列表"); }); }, /** 取消按钮 */ @@ -316,7 +285,7 @@ export default { startTime: undefined, endTime: undefined, sort: undefined, - timeId: undefined, + timeId: [], totalPrice: undefined, skuIds: [], products: [], @@ -333,6 +302,10 @@ export default { this.resetForm("queryForm"); this.handleQuery(); }, + /**打开秒杀场次管理页面 */ + openSeckillTime() { + this.$tab.openPage("秒杀场次管理", "/promotion/seckill-time"); + }, /** 新增按钮操作 */ handleAdd() { this.reset(); @@ -341,14 +314,34 @@ export default { }, /** 修改按钮操作 */ handleUpdate(row) { - console.log(row, "当前行数据"); this.reset(); const id = row.id; getSeckillActivity(id).then(response => { + var timeIdList = response.data.timeId.split(',') this.form = response.data; + // 修改数据 + this.form.startAndEndTime = [response.data.startTime, response.data.endTime]; + this.form.timeId = timeIdList.map(item => parseInt(item)) + this.form.skuIds = response.data.products.map(item => item.skuId); + this.form.products.forEach(product => { + // 获得对应的 SKU 信息 + const sku = this.productSkus.find(item => item.id === product.skuId); + if (!sku) { + return; + } + // 设置商品信息 + product.name = sku.name; + product.spuName = sku.spuName; + product.price = sku.price; + product.productStock = sku.stock; + this.$set(product,'seckillStock',product.stock); + product.seckillPrice = product.seckillPrice !== undefined ? product.seckillPrice / 100 : undefined; + + }); + // 打开弹窗 this.open = true; - this.title = "修改秒杀活动"; - }); + this.title = "修改限时折扣活动"; + }) }, /** 提交按钮 */ submitForm() { @@ -360,6 +353,11 @@ export default { const data = deepClone(this.form); data.startTime = this.form.startAndEndTime[0]; data.endTime = this.form.startAndEndTime[1]; + data.timeId = data.timeId.toString(); + data.products.forEach(product => { + product.stock = product.seckillStock; + product.seckillPrice = product.seckillPrice !== undefined ? product.seckillPrice * 100 : undefined; + }); // 修改的提交 if (this.form.id != null) { updateSeckillActivity(data).then(response => { @@ -377,6 +375,16 @@ export default { }); }); }, + /** 关闭按钮操作 */ + handleClose(row) { + const id = row.id; + this.$modal.confirm('是否确认关闭秒杀活动编号为"' + id + '"的数据项?').then(function () { + return closeSeckillActivity(id); + }).then(() => { + this.getList(); + this.$modal.msgSuccess("关闭成功"); + }).catch(() => { }); + }, /** 删除按钮操作 */ handleDelete(row) { const id = row.id; @@ -387,20 +395,6 @@ export default { this.$modal.msgSuccess("删除成功"); }).catch(() => { }); }, - /** 导出按钮操作 */ - handleExport() { - // 处理查询参数 - let params = { ...this.queryParams }; - params.pageNo = undefined; - params.pageSize = undefined; - this.$modal.confirm('是否确认导出所有秒杀活动数据项?').then(() => { - this.exportLoading = true; - return exportSeckillActivityExcel(params); - }).then(response => { - this.$download.excel(response, '秒杀活动.xls'); - this.exportLoading = false; - }).catch(() => { }); - }, /** 批量修改商品秒杀价,秒杀库存,每人限购数量 */ batchEditProduct(editType) { const selectProducts = this.$refs.productsTable.selection; @@ -459,7 +453,6 @@ export default { return; } // 判断已存在,直接跳过 - console.log(this.form, "当前form") const product = this.form.products.find(item => item.skuId === skuId); if (product) { return; diff --git a/yudao-ui-admin/src/views/promotion/seckillTime/index.vue b/yudao-ui-admin/src/views/mall/promotion/seckill/seckillTime/index.vue similarity index 71% rename from yudao-ui-admin/src/views/promotion/seckillTime/index.vue rename to yudao-ui-admin/src/views/mall/promotion/seckill/seckillTime/index.vue index df829582b..aa7df7200 100644 --- a/yudao-ui-admin/src/views/promotion/seckillTime/index.vue +++ b/yudao-ui-admin/src/views/mall/promotion/seckill/seckillTime/index.vue @@ -1,36 +1,12 @@ <template> <div class="app-container"> - <!-- 搜索工作栏 --> - <!-- <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px"> - <el-form-item label="秒杀时段名称" prop="name"> - <el-input v-model="queryParams.name" placeholder="请输入秒杀时段名称" clearable @keyup.enter.native="handleQuery" /> - </el-form-item> - - <el-form-item label="开始时间点" prop="startTime"> - <el-time-picker v-model="queryParams.startTime" placeholder="选择开始时间" value-format="HH:mm:ss" /> - </el-form-item> - - <el-form-item label="结束时间点" prop="endTime"> - <el-time-picker v-model="queryParams.endTime" placeholder="选择结束时间" value-format="HH:mm:ss" /> - </el-form-item> - - <el-form-item> - <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> - <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button> - </el-form-item> - </el-form> --> - <!-- 操作工具栏 --> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" - v-hasPermi="['promotion:seckill-time:create']">新增</el-button> + v-hasPermi="['promotion:seckill-time:create']">新增秒杀时段</el-button> </el-col> - <!-- <el-col :span="1.5"> - <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" - :loading="exportLoading" v-hasPermi="['promotion:seckill-time:export']">导出</el-button> - </el-col> --> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> </el-row> @@ -55,6 +31,8 @@ </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> + <el-button size="mini" type="text" icon="el-icon-view" @click="handleOpenSeckillActivity(scope.row)"> + 查看秒杀活动</el-button> <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['promotion:seckill-time:update']">修改</el-button> <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" @@ -62,9 +40,6 @@ </template> </el-table-column> </el-table> - <!-- 分页组件 --> - <!-- <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" - @pagination="getList" /> --> <!-- 对话框(添加 / 修改) --> <el-dialog :title="title" :visible.sync="open" width="600px" v-dialogDrag append-to-body> @@ -87,7 +62,8 @@ </template> <script> -import { createSeckillTime, updateSeckillTime, deleteSeckillTime, getSeckillTime, getSeckillTimePage, exportSeckillTimeExcel, getSeckillTimeList } from "@/api/promotion/seckillTime"; +import { createSeckillTime, updateSeckillTime, deleteSeckillTime, getSeckillTime, getSeckillTimePage, exportSeckillTimeExcel, getSeckillTimeList } from "@/api/mall/promotion/seckillTime"; +import router from "@/router"; import { deepClone } from "@/utils"; export default { @@ -110,14 +86,6 @@ export default { title: "", // 是否显示弹出层 open: false, - // 查询参数 - // queryParams: { - // pageNo: 1, - // pageSize: 10, - // name: null, - // startTime: null, - // endTime: null, - // }, // 表单参数 form: {}, // 表单校验 @@ -136,9 +104,7 @@ export default { this.loading = true; // 执行查询 getSeckillTimeList().then(response => { - console.log(response, "返回的数据") this.list = response.data; - // this.total = response.data.total; this.loading = false; }); }, @@ -160,7 +126,6 @@ export default { }, /** 搜索按钮操作 */ handleQuery() { - // this.queryParams.pageNo = 1; this.getList(); }, /** 重置按钮操作 */ @@ -168,10 +133,13 @@ export default { this.resetForm("queryForm"); this.handleQuery(); }, + /**查看当前秒杀时段的秒杀活动 */ + handleOpenSeckillActivity(row) { + router.push({ name: 'SeckillActivity', params: { timeId: row.id } }) + }, /** 新增按钮操作 */ handleAdd() { this.reset(); - console.log(this.form, "点击新增时的form"); this.open = true; this.title = "添加秒杀时段"; }, @@ -224,20 +192,6 @@ export default { this.$modal.msgSuccess("删除成功"); }).catch(() => { }); }, - /** 导出按钮操作 */ - // handleExport() { - // // 处理查询参数 - // let params = { ...this.queryParams }; - // params.pageNo = undefined; - // params.pageSize = undefined; - // this.$modal.confirm('是否确认导出所有秒杀时段数据项?').then(() => { - // this.exportLoading = true; - // return exportSeckillTimeExcel(params); - // }).then(response => { - // this.$download.excel(response, '秒杀时段.xls'); - // this.exportLoading = false; - // }).catch(() => { }); - // } } }; </script> From d6b426970b6e0fd86712ecbdecd201cd9f7d89aa Mon Sep 17 00:00:00 2001 From: halfninety <690534687@qq.com> Date: Tue, 29 Nov 2022 23:21:51 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BF=AE=E6=94=B9=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/YudaoJacksonAutoConfiguration.java | 9 ++++++-- .../databind/LocalTimeDeserializable.java | 16 -------------- .../jackson/core/databind/LocalTimeJson.java | 21 +++++++++++++++++++ .../core/databind/LocalTimeSerializable.java | 17 --------------- 4 files changed, 28 insertions(+), 35 deletions(-) delete mode 100644 yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeDeserializable.java create mode 100644 yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeJson.java delete mode 100644 yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeSerializable.java diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java index c44e770a1..f3cad8d79 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java @@ -1,8 +1,9 @@ package cn.iocoder.yudao.framework.jackson.config; +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.jackson.core.databind.LocalDateTimeDeserializer; import cn.iocoder.yudao.framework.jackson.core.databind.LocalDateTimeSerializer; -import cn.iocoder.yudao.framework.common.util.json.JsonUtils; +import cn.iocoder.yudao.framework.jackson.core.databind.LocalTimeJson; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import lombok.extern.slf4j.Slf4j; @@ -12,6 +13,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.LocalDateTime; +import java.time.LocalTime; @Configuration(proxyBeanMethods = false) @Slf4j @@ -30,12 +32,15 @@ public class YudaoJacksonAutoConfiguration { /* * 1. 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型 * 2. 新增LocalDateTime序列化、反序列化规则 + * 3. 新增LocalTime序列化、反序列化规则 */ simpleModule // .addSerializer(Long.class, ToStringSerializer.instance) // .addSerializer(Long.TYPE, ToStringSerializer.instance) .addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE) - .addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); + .addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE) + .addSerializer(LocalTime.class, LocalTimeJson.SERIALIZER) + .addDeserializer(LocalTime.class, LocalTimeJson.DESERIALIZABLE); objectMapper.registerModules(simpleModule); diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeDeserializable.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeDeserializable.java deleted file mode 100644 index 9735438b1..000000000 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeDeserializable.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.iocoder.yudao.framework.jackson.core.databind; - -import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; - -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_HOUR_MINUTE_SECOND; - -public class LocalTimeDeserializable { - // TODO: 2022/11/15 修改名字 - public static final LocalTimeDeserializer INSTANCE = new LocalTimeDeserializer(DateTimeFormatter - .ofPattern(FORMAT_HOUR_MINUTE_SECOND) - .withZone(ZoneId.systemDefault())); - -} diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeJson.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeJson.java new file mode 100644 index 000000000..f9ff37511 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeJson.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.framework.jackson.core.databind; + +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; + +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_HOUR_MINUTE_SECOND; + +public class LocalTimeJson { + + public static final LocalTimeSerializer SERIALIZER = new LocalTimeSerializer(DateTimeFormatter + .ofPattern(FORMAT_HOUR_MINUTE_SECOND) + .withZone(ZoneId.systemDefault())); + + public static final LocalTimeDeserializer DESERIALIZABLE = new LocalTimeDeserializer(DateTimeFormatter + .ofPattern(FORMAT_HOUR_MINUTE_SECOND) + .withZone(ZoneId.systemDefault())); + +} diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeSerializable.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeSerializable.java deleted file mode 100644 index d6eaed819..000000000 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/core/databind/LocalTimeSerializable.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.iocoder.yudao.framework.jackson.core.databind; - -import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; - -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_HOUR_MINUTE_SECOND; - -public class LocalTimeSerializable { - // TODO: 2022/11/15 修改名称 - - public static final LocalTimeSerializer INSTANCE = new LocalTimeSerializer(DateTimeFormatter - .ofPattern(FORMAT_HOUR_MINUTE_SECOND) - .withZone(ZoneId.systemDefault())); - -}