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 }} &nbsp; {{ 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 }} &nbsp; {{ 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()));
-
-}