From 5dfc1d9e5c891225a69ec88a74ba7f83153adaf6 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期三, 22 五月 2024 20:00:48 +0800
Subject: [PATCH] 1.提交【管理后台】团购管理模块接口 2.延时任务部分代码

---
 ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml                                          |   16 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java                                |   53 ++++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/RuoYiGoodsApplication.java                                 |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java                          |   11 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeckillController.java       |    6 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/DelayTaskEnum.java                         |   42 +++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java            |   89 ++++++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java                              |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsGroupPurchaseController.java |   64 ++++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/VO/GoodsGroupPurchaseVO.java         |   68 +++++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseDTO.java       |   50 +++
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DelayTaskServiceImpl.java                   |   67 +++++
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/DelayTaskService.java                            |   44 +++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsSkuQuery.java               |    7 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java                                 |    8 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsGroupPurchaseMapper.java                       |   10 
 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsSeckillMapper.xml                                   |   11 
 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/DelayTaskMapper.xml                                    |    6 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java                      |   35 ++
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java                    |    5 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java                  |   22 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java                         |   26 +
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java                    |    3 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseQuery.java     |   24 +
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java                         |    9 
 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java                            |   12 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java                    |   34 ++
 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsGroupPurchaseMapper.xml                             |   14 +
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/GoodsGroupPurchase.java                             |    4 
 29 files changed, 715 insertions(+), 29 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/DelayTaskEnum.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/DelayTaskEnum.java
new file mode 100644
index 0000000..fcdc58a
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/DelayTaskEnum.java
@@ -0,0 +1,42 @@
+package com.ruoyi.system.api.constants;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.HashMap;
+import java.util.Map;
+import lombok.Getter;
+
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+@Getter
+public enum DelayTaskEnum {
+
+    ORDER_AUTOMATIC_CANCEL("订单延时任务-自动关闭", "超时订单自动关闭"),
+    SECKILL_START_TASK("秒杀商品延时任务", "定时开始任务"),
+    SECKILL_END_TASK("秒杀商品延时任务", "定时结束任务"),
+    GROUP_PURCHASES_START_TASK("团购商品延时任务", "定时开始任务"),
+    GROUP_PURCHASES_END_TASK("团购商品延时任务", "定时结束任务"),
+    ;
+
+    String name;
+    String code;
+
+    private static Map<String, DelayTaskEnum> valueMap = new HashMap<>();
+
+    static {
+        for (DelayTaskEnum gender : DelayTaskEnum.values()) {
+            valueMap.put(gender.name, gender);
+        }
+    }
+
+    DelayTaskEnum(String name, String code) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public static String getByName(String name) {
+        DelayTaskEnum result = valueMap.get(name);
+        if (result == null) {
+            throw new IllegalArgumentException("No element matches " + name);
+        }
+        return result.code;
+    }
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
new file mode 100644
index 0000000..9078c6b
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
@@ -0,0 +1,53 @@
+package com.ruoyi.system.api.domain;
+
+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.util.Date;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-05-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_delay_task")
+public class DelayTask implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 延时任务id
+     */
+    @TableId(value = "task_id", type = IdType.AUTO)
+    private Long taskId;
+    /**
+     * 删除标记
+     */
+    @TableField("del_flag")
+    private Integer delFlag;
+    /**
+     * 键值
+     */
+    @TableField("redis_key")
+    private String redisKey;
+    /**
+     * 执行时间
+     */
+    @TableField("end_time")
+    private Date endTime;
+
+    @TableField("create_time")
+    private Date createTime;
+    
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java
index 135b40b..de129fb 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java
@@ -30,6 +30,11 @@
             public R<Integer> getSeckillMembers(Long id) {
                 return R.fail("获取秒杀商品已购会员数失败:" + cause.getMessage());
             }
+
+            @Override
+            public R<Integer> getGroupPurchasesGoodsNum(Long id) {
+                return R.fail("获取团购商品已购数量失败:" + cause.getMessage());
+            }
         };
 
     }
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java
index c5012aa..9612ed5 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java
@@ -29,4 +29,13 @@
      */
     @GetMapping("/order/seckill-members/{id}")
     R<Integer> getSeckillMembers(@PathVariable("id") Long id);
+
+    /**
+     * 获取团购商品已购数量
+     *
+     * @param id 团购商品id
+     * @return 团购商品已购数量
+     */
+    @GetMapping("/order/group-purchase-num/{id}")
+    R<Integer> getGroupPurchasesGoodsNum(@PathVariable("id") Long id);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/RuoYiGoodsApplication.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/RuoYiGoodsApplication.java
index 2b9bca3..9422961 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/RuoYiGoodsApplication.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/RuoYiGoodsApplication.java
@@ -6,6 +6,7 @@
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 系统模块
@@ -16,6 +17,7 @@
 @MapperScan({"com.ruoyi.goods.mapper"})
 @EnableCustomSwagger2
 @EnableRyFeignClients
+@EnableScheduling
 @SpringBootApplication
 public class RuoYiGoodsApplication
 {
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseDTO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseDTO.java
new file mode 100644
index 0000000..a6b6421
--- /dev/null
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseDTO.java
@@ -0,0 +1,50 @@
+package com.ruoyi.goods.controller.management.DTO;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/5/22
+ */
+@Data
+@ApiModel(value = "团购商品数据传输对象", description = "团购商品数据传输对象")
+public class GoodsGroupPurchaseDTO {
+
+    @ApiModelProperty(value = "团购商品id", notes = "添加不传,更新必传")
+    private Long id;
+
+    @ApiModelProperty(value = "商品id", notes = "添加必传,更新不传")
+    private Long goodsSkuId;
+
+    @ApiModelProperty(value = "分享标题")
+    private String shareTitle;
+
+    @ApiModelProperty(value = "分享图片")
+    private String sharePic;
+
+    @ApiModelProperty(value = "团购价格")
+    private BigDecimal groupPurchasePrice;
+
+    @ApiModelProperty(value = "成团人数")
+    private Integer groupSize;
+
+    @ApiModelProperty(value = "限购数量")
+    private Integer limitNumber;
+
+    @ApiModelProperty(value = "团购开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty(value = "团购结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty(value = "参团说明")
+    private String description;
+
+}
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseQuery.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseQuery.java
new file mode 100644
index 0000000..c2dcda3
--- /dev/null
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseQuery.java
@@ -0,0 +1,24 @@
+package com.ruoyi.goods.controller.management.DTO;
+
+
+import com.ruoyi.common.core.web.page.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author mitao
+ * @date 2024/5/22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "团购商品查询对象", description = "团购商品查询对象")
+public class GoodsGroupPurchaseQuery extends BasePage {
+
+    private static final long serialVersionUID = -5336934411126155565L;
+
+    @ApiModelProperty("商品名称")
+    private String goodsSkuName;
+    
+}
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsSkuQuery.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsSkuQuery.java
index af83848..0788b95 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsSkuQuery.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsSkuQuery.java
@@ -4,8 +4,10 @@
 import com.ruoyi.common.core.web.page.BasePage;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Range;
 
 /**
  * @author mitao
@@ -23,4 +25,9 @@
 
     @ApiModelProperty(value = "上架状态 上架中 已下架", notes = "参数传文字")
     private ListingStatusEnum listingStatus;
+
+    @ApiModelProperty(value = "查询类型 1=仅上架商品 2=全部")
+    @NotNull(message = "查询类型不能为空")
+    @Range(min = 1, max = 2, message = "查询类型必须为1或2")
+    private Integer queryType;
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsGroupPurchaseController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsGroupPurchaseController.java
index 18fdf83..dea8bed 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsGroupPurchaseController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsGroupPurchaseController.java
@@ -1,9 +1,23 @@
 package com.ruoyi.goods.controller.management;
 
 
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.page.PageDTO;
+import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseDTO;
+import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseQuery;
+import com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO;
+import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
+import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -22,4 +36,54 @@
 @Api(value = "管理后台商品团购相关接口", tags = {"管理后台接口"})
 public class MgtGoodsGroupPurchaseController {
 
+    private final IGoodsGroupPurchaseService goodsGroupPurchaseService;
+
+    /**
+     * 获取团购商品列表的分页数据
+     *
+     * @param query 团购商品查询对象
+     * @return PageDTO < GoodsGroupPurchaseVO>
+     */
+    @ApiOperation(value = "获取团购商品列表的分页数据", notes = "获取团购商品列表的分页数据")
+    @PostMapping("/page")
+    public R<PageDTO<GoodsGroupPurchaseVO>> getGoodsGroupPurchasePage(
+            GoodsGroupPurchaseQuery query) {
+        return R.ok(goodsGroupPurchaseService.getGoodsGroupPurchasePage(query));
+    }
+
+    /**
+     * 添加/编辑 团购商品
+     *
+     * @param dto 团购商品数据传输对象
+     */
+    @ApiOperation(value = "添加/编辑 团购商品", notes = "添加/编辑 团购商品")
+    @PostMapping("/save")
+    public R<Void> saveGoodsGroupPurchase(GoodsGroupPurchaseDTO dto) {
+        goodsGroupPurchaseService.saveGoodsGroupPurchase(dto);
+        return R.ok();
+    }
+
+    /**
+     * 查看详情
+     *
+     * @param id 团购商品id
+     * @return GoodsGroupPurchaseVO
+     */
+    @ApiOperation(value = " 查看详情", notes = "查看详情")
+    @GetMapping("/detail/{id}")
+    public R<GoodsGroupPurchaseVO> getGoodsGroupPurchaseDetail(@PathVariable("id") Long id) {
+        return R.ok(goodsGroupPurchaseService.getGoodsGroupPurchaseDetail(id));
+    }
+
+    /**
+     * 下架/上架 团购商品
+     *
+     * @param dto 商品上下架状态对象
+     */
+    @ApiOperation(value = "下架/上架 团购商品", notes = "下架 /上架 团购商品")
+    @PutMapping("/upd-status")
+    public R<Void> updStatus(@Validated @RequestBody ListStatusDTO dto) {
+        goodsGroupPurchaseService.updStatus(dto);
+        return R.ok();
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeckillController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeckillController.java
index cd9caa8..976e2ed 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeckillController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeckillController.java
@@ -88,6 +88,12 @@
         return R.ok();
     }
 
+    /**
+     * 查看详情
+     *
+     * @param id 秒杀商品id
+     * @return GoodsSeckillVO 商品秒杀视图对象
+     */
     @ApiOperation("查看详情")
     @GetMapping("/detail/{id}")
     public R<GoodsSeckillVO> getDetail(@PathVariable("id") Long id) {
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/VO/GoodsGroupPurchaseVO.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/VO/GoodsGroupPurchaseVO.java
new file mode 100644
index 0000000..ff5d7d1
--- /dev/null
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/VO/GoodsGroupPurchaseVO.java
@@ -0,0 +1,68 @@
+package com.ruoyi.goods.controller.management.VO;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ruoyi.common.core.enums.GroupStatusEnum;
+import com.ruoyi.common.core.enums.ListingStatusEnum;
+import com.ruoyi.common.core.enums.StartStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/5/22
+ */
+@Data
+@ApiModel(value = "团购商品视图对象", description = "团购商品视图对象")
+public class GoodsGroupPurchaseVO {
+
+    @ApiModelProperty(value = "商品团购id")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsSkuName;
+
+    @ApiModelProperty(value = "团购价格")
+    private BigDecimal groupPurchasePrice;
+
+    @ApiModelProperty(value = "成团人数")
+    private Integer groupSize;
+
+    @ApiModelProperty(value = "当前人数")
+    private Integer currentNumber;
+
+    @ApiModelProperty(value = "限购数量")
+    private Integer limitNumber;
+
+    @ApiModelProperty(value = "已购商品数")
+    private Integer buyNumber;
+
+    @ApiModelProperty(value = "团购开始时间")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty(value = "团购结束时间")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty(value = "参团说明")
+    private String description;
+
+    @ApiModelProperty(value = "分享标题")
+    private String shareTitle;
+
+    @ApiModelProperty(value = "分享图片")
+    private String sharePic;
+
+    @ApiModelProperty(value = "开始状态 0=未开始 1=已开始 2=已结束 ")
+    private StartStatusEnum startStatus;
+
+    @ApiModelProperty(value = "上架状态 0=已上架 1=已下架")
+    private ListingStatusEnum listingStatus;
+
+    @ApiModelProperty(value = "成团状态 0=待成团 1=已成团 2=成团失败")
+    private GroupStatusEnum groupStatus;
+    
+}
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/GoodsGroupPurchase.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/GoodsGroupPurchase.java
index 015ddbb..66e10de 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/GoodsGroupPurchase.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/GoodsGroupPurchase.java
@@ -67,6 +67,10 @@
     @TableField("limit_number")
     private Integer limitNumber;
 
+    @ApiModelProperty(value = "当前人数")
+    @TableField("current_number")
+    private Integer currentNumber;
+
     @ApiModelProperty(value = "团购开始时间")
     @TableField("start_time")
     private LocalDateTime startTime;
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsGroupPurchaseMapper.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsGroupPurchaseMapper.java
index d09c12f..4189e3a 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsGroupPurchaseMapper.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsGroupPurchaseMapper.java
@@ -1,7 +1,10 @@
 package com.ruoyi.goods.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO;
 import com.ruoyi.goods.domain.GoodsGroupPurchase;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -13,4 +16,11 @@
  */
 public interface GoodsGroupPurchaseMapper extends BaseMapper<GoodsGroupPurchase> {
 
+    /**
+     * @param goodsSkuName 商品名称
+     * @param page         分页参数
+     * @return Page<GoodsGroupPurchaseVO>
+     */
+    Page<GoodsGroupPurchaseVO> getGoodsGroupPurchasePage(@Param("goodsSkuName") String goodsSkuName,
+            @Param("page") Page<GoodsGroupPurchaseVO> page);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
index 812ac44..eebd533 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
@@ -1,7 +1,12 @@
 package com.ruoyi.goods.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.utils.page.PageDTO;
+import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseDTO;
+import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseQuery;
+import com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO;
 import com.ruoyi.goods.domain.GoodsGroupPurchase;
+import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 
 /**
  * <p>
@@ -13,4 +18,33 @@
  */
 public interface IGoodsGroupPurchaseService extends IService<GoodsGroupPurchase> {
 
+    /**
+     * 获取团购商品列表的分页数据
+     *
+     * @param query 团购商品查询对象
+     * @return PageDTO < GoodsGroupPurchaseVO>
+     */
+    PageDTO<GoodsGroupPurchaseVO> getGoodsGroupPurchasePage(GoodsGroupPurchaseQuery query);
+
+    /**
+     * 添加/编辑 团购商品
+     *
+     * @param dto 团购商品数据传输对象
+     */
+    void saveGoodsGroupPurchase(GoodsGroupPurchaseDTO dto);
+
+    /**
+     * 查看详情
+     *
+     * @param id 团购商品id
+     * @return GoodsGroupPurchaseVO 团购商品视图对象
+     */
+    GoodsGroupPurchaseVO getGoodsGroupPurchaseDetail(Long id);
+
+    /**
+     * 下架/上架 团购商品
+     *
+     * @param dto 商品上下架状态对象
+     */
+    void updStatus(ListStatusDTO dto);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java
index 8b52fbf..71ffec0 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java
@@ -41,7 +41,18 @@
      */
     void updGoodsSeckill(GoodsSeckillUpd upd);
 
+    /**
+     * 上架/下架 秒杀商品
+     *
+     * @param dto 商品上下架状态对象
+     */
     void updStatus(ListStatusDTO dto);
 
+    /**
+     * 查看详情
+     *
+     * @param id 秒杀商品id
+     * @return GoodsSeckillVO 商品秒杀视图对象
+     */
     GoodsSeckillVO getDetail(Long id);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java
index b14f61a..94cf0d9 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java
@@ -41,6 +41,6 @@
      * @param dto 数据传输对象,包含需要更新的SKU的ID和新的上架状态。 其中,ID用于指定要更新的具体SKU,listingStatus用于指定新的上架状态。
      * @return 无返回值。
      */
-    void updStatus(ListStatusDTO dto);
+    void updStatus(ListStatusDTO dto) throws Exception;
 
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java
index 0537e97..722fcbc 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java
@@ -50,7 +50,7 @@
         Page<GoodsBrand> page = this.lambdaQuery()
                 .like(StringUtils.isNotEmpty(query.getBrandName()), GoodsBrand::getBrandName,
                         query.getBrandName())
-                .page(new Page<GoodsBrand>(query.getPageCurr(), query.getPageSize()));
+                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
         if (StringUtils.isEmpty(page.getRecords())) {
             return PageDTO.empty(page.getTotal(), page.getPages());
         }
@@ -63,7 +63,6 @@
      *
      * @param dto 商品品牌数据传输对象,包含商品品牌的信息。 如果dto中的id为空,则认为是新品牌,调用save方法保存;
      *            如果id不为空,则认为是更新已有品牌,调用updateById方法更新。
-     * @return 无返回值
      */
     @Override
     public void saveGoodsBrand(GoodsBrandDTO dto) {
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
index 0e5c883..905f7d9 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -1,9 +1,22 @@
 package com.ruoyi.goods.service.impl;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.enums.ListingStatusEnum;
+import com.ruoyi.common.core.enums.StartStatusEnum;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.utils.page.BeanUtils;
+import com.ruoyi.common.core.utils.page.PageDTO;
+import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseDTO;
+import com.ruoyi.goods.controller.management.DTO.GoodsGroupPurchaseQuery;
+import com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO;
 import com.ruoyi.goods.domain.GoodsGroupPurchase;
 import com.ruoyi.goods.mapper.GoodsGroupPurchaseMapper;
 import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
+import com.ruoyi.system.api.domain.dto.ListStatusDTO;
+import com.ruoyi.system.api.feignClient.OrderClient;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 /**
@@ -15,6 +28,82 @@
  * @since 2024-05-16
  */
 @Service
+@RequiredArgsConstructor
 public class GoodsGroupPurchaseServiceImpl extends ServiceImpl<GoodsGroupPurchaseMapper, GoodsGroupPurchase> implements IGoodsGroupPurchaseService {
 
+    private final OrderClient orderClient;
+
+    /**
+     * 获取团购商品列表的分页数据
+     *
+     * @param query 团购商品查询对象
+     * @return PageDTO < GoodsGroupPurchaseVO>
+     */
+    @Override
+    public PageDTO<GoodsGroupPurchaseVO> getGoodsGroupPurchasePage(GoodsGroupPurchaseQuery query) {
+        return PageDTO.of(
+                baseMapper.getGoodsGroupPurchasePage(query.getGoodsSkuName(),
+                        new Page<>(query.getPageCurr(), query.getPageSize())));
+    }
+
+    /**
+     * 添加/编辑 团购商品
+     *
+     * @param dto 团购商品数据传输对象
+     */
+    @Override
+    public void saveGoodsGroupPurchase(GoodsGroupPurchaseDTO dto) {
+        GoodsGroupPurchase goodsGroupPurchase = BeanUtils.copyBean(dto, GoodsGroupPurchase.class);
+        if (StringUtils.isNull(dto.getId())) {
+            this.save(goodsGroupPurchase);
+        } else {
+            GoodsGroupPurchase groupPurchase = this.getById(dto.getId());
+            if (StringUtils.isNull(groupPurchase)) {
+                throw new ServiceException("团购商品不存在");
+            }
+            this.updateById(goodsGroupPurchase);
+        }
+        //TODO 添加调度任务 处理团购商品开始结束
+    }
+
+    /**
+     * 查看详情
+     *
+     * @param id 团购商品id
+     * @return GoodsGroupPurchaseVO 团购商品视图对象
+     */
+    @Override
+    public GoodsGroupPurchaseVO getGoodsGroupPurchaseDetail(Long id) {
+        GoodsGroupPurchase groupPurchase = this.getById(id);
+        if (StringUtils.isNull(groupPurchase)) {
+            throw new ServiceException("团购商品不存在");
+        }
+        GoodsGroupPurchaseVO vo = BeanUtils.copyBean(groupPurchase,
+                GoodsGroupPurchaseVO.class);
+        //远程调用订单服务查询商品购买总数
+        Integer num = orderClient.getGroupPurchasesGoodsNum(groupPurchase.getId()).getData();
+        vo.setBuyNumber(num);
+        return vo;
+    }
+
+    /**
+     * 下架/上架 团购商品
+     *
+     * @param dto 商品上下架状态对象
+     */
+    @Override
+    public void updStatus(ListStatusDTO dto) {
+        GoodsGroupPurchase groupPurchase = this.getById(dto.getId());
+        if (StringUtils.isNull(groupPurchase)) {
+            throw new ServiceException("团购商品不存在");
+        }
+        //判断商品状态
+        if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF)
+                && groupPurchase.getStartStatus().equals(StartStatusEnum.STARTED)) {
+            throw new ServiceException("该商品已开始团购,不能下架");
+        }
+        //修改状态
+        groupPurchase.setListingStatus(dto.getListingStatus());
+        this.updateById(groupPurchase);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
index 2f8268b..e39abe7 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -9,7 +9,6 @@
 import com.ruoyi.goods.controller.management.DTO.GoodsSeckillDTO;
 import com.ruoyi.goods.controller.management.DTO.GoodsSeckillQuery;
 import com.ruoyi.goods.controller.management.DTO.GoodsSeckillUpd;
-import com.ruoyi.goods.controller.management.DTO.GoodsSkuInfoDTO;
 import com.ruoyi.goods.controller.management.VO.GoodsSeckillVO;
 import com.ruoyi.goods.domain.GoodsSeckill;
 import com.ruoyi.goods.domain.GoodsSku;
@@ -44,7 +43,6 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void addGoodsSeckill(GoodsSeckillDTO dto) {
-        List<GoodsSkuInfoDTO> goodsSkuList = dto.getGoodsSkuList();
         List<GoodsSeckill> goodsSeckills = BeanUtils.copyList(dto.getGoodsSkuList(),
                 GoodsSeckill.class);
         for (GoodsSeckill goodsSeckill : goodsSeckills) {
@@ -55,20 +53,20 @@
             goodsSeckill.setStartStatus(StartStatusEnum.NOT_STARTED);
         }
         this.saveBatch(goodsSeckills);
+        //TODO 添加调度任务控制开始结束
     }
 
     /**
      * 获取秒杀商品列表的分页数据
      *
      * @param query 秒杀商品查询对象
-     * @return
+     * @return PageDTO<GoodsSeckillVO>
      */
     @Override
     public PageDTO<GoodsSeckillVO> getGoodsSeckillPage(GoodsSeckillQuery query) {
-        Page<GoodsSeckillVO> page = baseMapper.getGoodsSeckillPage(query.getGoodsSkuName(),
-                new Page<GoodsSeckillVO>(query.getPageCurr(), query.getPageSize())
-        );
-        return PageDTO.of(page);
+        return PageDTO.of(baseMapper.getGoodsSeckillPage(query.getGoodsSkuName(),
+                new Page<>(query.getPageCurr(), query.getPageSize())
+        ));
     }
 
     /**
@@ -100,6 +98,12 @@
                 .update();
     }
 
+    /**
+     * 查看详情
+     *
+     * @param id 秒杀商品id
+     * @return GoodsSeckillVO 商品秒杀视图对象
+     */
     @Override
     public GoodsSeckillVO getDetail(Long id) {
         GoodsSeckill goodsSeckill = this.getById(id);
@@ -108,9 +112,7 @@
         }
         GoodsSeckillVO vo = BeanUtils.copyBean(goodsSeckill, GoodsSeckillVO.class);
         GoodsSku goods = goodsSkuService.getById(goodsSeckill.getGoodsSkuId());
-        Optional.of(goods).ifPresent(goodsSku -> {
-            vo.setGoodsSkuName(goodsSku.getSkuName());
-        });
+        Optional.of(goods).ifPresent(goodsSku -> vo.setGoodsSkuName(goodsSku.getSkuName()));
         Integer num = orderClient.getSeckillMembers(goodsSeckill.getGoodsSkuId()).getData();
         vo.setNumberOfPurchasedMembers(num);
         return vo;
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
index 7503e73..41eaf12 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.core.enums.ListingStatusEnum;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.page.BeanUtils;
@@ -14,10 +15,14 @@
 import com.ruoyi.goods.controller.management.DTO.GoodsSkuDTO;
 import com.ruoyi.goods.controller.management.DTO.GoodsSkuQuery;
 import com.ruoyi.goods.controller.management.VO.GoodsSkuVO;
+import com.ruoyi.goods.domain.GoodsGroupPurchase;
 import com.ruoyi.goods.domain.GoodsInfoTitleValue;
+import com.ruoyi.goods.domain.GoodsSeckill;
 import com.ruoyi.goods.domain.GoodsSku;
 import com.ruoyi.goods.mapper.GoodsSkuMapper;
+import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
 import com.ruoyi.goods.service.IGoodsInfoTitleValueService;
+import com.ruoyi.goods.service.IGoodsSeckillService;
 import com.ruoyi.goods.service.IGoodsSkuService;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 import java.util.List;
@@ -25,6 +30,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -41,6 +47,8 @@
 public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> implements IGoodsSkuService {
 
     private final IGoodsInfoTitleValueService goodsInfoTitleValueService;
+    private final IGoodsSeckillService goodsSeckillService;
+    private final IGoodsGroupPurchaseService goodsGroupPurchaseService;
     private static final ObjectMapper objectMapper = new ObjectMapper();
 
     /**
@@ -140,8 +148,9 @@
                         query.getSkuName())
                 .eq(StringUtils.isNotNull(query.getListingStatus()
                 ), GoodsSku::getListingStatus, query.getListingStatus())
-                .page(new Page<GoodsSku>(query.getPageCurr(), query.getPageSize()));
-
+                .eq(query.getQueryType().equals(1), GoodsSku::getListingStatus,
+                        ListingStatusEnum.ON_SHELVES)
+                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
         return PageDTO.of(page, GoodsSkuVO.class);
     }
 
@@ -149,13 +158,31 @@
      * 更新商品SKU的状态。
      *
      * @param dto 数据传输对象,包含需要更新的SKU的ID和新的上架状态。 其中,ID用于指定要更新的具体SKU,listingStatus用于指定新的上架状态。
-     * @return 无返回值。
      */
     @Override
-    public void updStatus(ListStatusDTO dto) {
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    public void updStatus(ListStatusDTO dto) throws Exception {
         this.lambdaUpdate()
                 .eq(GoodsSku::getId, dto.getId())
                 .set(GoodsSku::getListingStatus, dto.getListingStatus())
                 .update();
+        //关联的秒杀商品和团购商品同步下架
+        if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF)) {
+            updateGoodsStatus(dto);
+        }
+    }
+
+    private void updateGoodsStatus(ListStatusDTO dto) {
+        goodsSeckillService.lambdaUpdate()
+                .set(GoodsSeckill::getListingStatus,
+                        ListingStatusEnum.REMOVED_FROM_THE_SHELF)
+                .eq(GoodsSeckill::getListingStatus, ListingStatusEnum.ON_SHELVES)
+                .eq(GoodsSeckill::getGoodsSkuId, dto.getId()).update();
+        goodsGroupPurchaseService.lambdaUpdate()
+                .set(GoodsGroupPurchase::getListingStatus,
+                        ListingStatusEnum.REMOVED_FROM_THE_SHELF)
+                .eq(GoodsGroupPurchase::getListingStatus,
+                        ListingStatusEnum.ON_SHELVES)
+                .eq(GoodsGroupPurchase::getGoodsSkuId, dto.getId()).update();
     }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsGroupPurchaseMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsGroupPurchaseMapper.xml
index 50539ba..bdb2669 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsGroupPurchaseMapper.xml
+++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsGroupPurchaseMapper.xml
@@ -2,4 +2,18 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.goods.mapper.GoodsGroupPurchaseMapper">
 
+  <select id="getGoodsGroupPurchasePage"
+    resultType="com.ruoyi.goods.controller.management.VO.GoodsGroupPurchaseVO">
+    SELECT
+    tgp.*,
+    tgs.goods_sku_name
+    FROM
+    t_goods_group_purchase tgp
+    LEFT JOIN t_goods_sku tgs ON tgp.goods_sku_id = tgs.id
+    <where>
+      <if test="goodsSkuName != null and goodsSkuName != ''">
+        AND tgs.goods_sku_name LIKE CONCAT('%',#{goodsSkuName},'%')
+      </if>
+    </where>
+  </select>
 </mapper>
diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsSeckillMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsSeckillMapper.xml
index ea6cddb..992ef00 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsSeckillMapper.xml
+++ b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsSeckillMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.ruoyi.goods.mapper.GoodsSeckillMapper">
   <select id="getGoodsSeckillPage"
     resultType="com.ruoyi.goods.controller.management.VO.GoodsSeckillVO">
-    select
+    SELECT
     gs.id,
     gsku.goods_sku_name,
     gs.seckill_price,
@@ -16,13 +16,14 @@
     gs.start_time,
     gs.end_time,
     gs.start_status
-    from t_goods_seckill gs
-    left join t_goods_sku gsku on gs.goods_sku_id = gsku.id
+    FROM
+    t_goods_seckill gs
+    LEFT JOIN t_goods_sku gsku ON gs.goods_sku_id = gsku.id
     <where>
       <if test="goodsSkuName != null and goodsSkuName != ''">
-        and gsku.goods_sku_name like concat('%',#{goodsSkuName},'%')
+        AND gsku.goods_sku_name LIKE CONCAT('%',#{goodsSkuName},'%')
       </if>
     </where>
-    order by gs.create_time desc
+    ORDER BY gs.create_time DESC
   </select>
 </mapper>
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
index 6ec68f8..a8dcc67 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -52,4 +52,16 @@
     R<Integer> getSeckillMembers(@PathVariable("id") Long id) {
         return R.ok(orderService.getSeckillMembers(id));
     }
+
+    /**
+     * 获取团购商品已购数量
+     *
+     * @param id 团购商品id
+     * @return 团购商品已购数量
+     */
+    @InnerAuth
+    @GetMapping("/group-purchase-num/{id}")
+    R<Integer> getGroupPurchasesGoodsNum(@PathVariable("id") Long id) {
+        return R.ok(orderService.getGroupPurchasesGoodsNum(id));
+    }
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java
index 0e25900..37a1954 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java
@@ -17,4 +17,12 @@
     void saveOrderOne(OrderDTO OrderDTO);
 
     Integer getSeckillMembers(Long id);
+
+    /**
+     * 获取团购商品已购数量
+     *
+     * @param id 团购商品id
+     * @return 团购商品已购数量
+     */
+    Integer getGroupPurchasesGoodsNum(Long id);
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
index 07cb825..520643c 100644
--- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
+++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -3,10 +3,15 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.enums.OrderStatusEnum;
 import com.ruoyi.order.domain.pojo.Order;
+import com.ruoyi.order.domain.pojo.OrderMall;
 import com.ruoyi.order.mapper.OrderMapper;
+import com.ruoyi.order.service.IOrderMallService;
 import com.ruoyi.order.service.IOrderService;
 import com.ruoyi.order.util.OrderUtil;
 import com.ruoyi.system.api.domain.dto.OrderDTO;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import org.springframework.stereotype.Service;
 
@@ -24,6 +29,8 @@
 
     @Resource
     private  IOrderService orderService;
+    @Resource
+    private IOrderMallService orderMallService;
     @Override
     public void saveOrderOne(OrderDTO OrderDTO) {
         Order order=new Order();
@@ -47,5 +54,22 @@
     public Integer getSeckillMembers(Long id) {
         return baseMapper.getSeckillMembers(id);
     }
-    
+
+    /**
+     * 获取团购商品已购数量
+     *
+     * @param id 团购商品id
+     * @return 团购商品已购数量
+     */
+    @Override
+    public Integer getGroupPurchasesGoodsNum(Long id) {
+        Set<Long> orderIdSet = orderMallService.lambdaQuery().eq(OrderMall::getActivityId, id)
+                .list()
+                .stream().map(OrderMall::getOrderId).collect(
+                        Collectors.toSet());
+        List<Order> list = this.lambdaQuery().in(Order::getId, orderIdSet)
+                .in(Order::getOrderStatus, OrderStatusEnum.TO_BE_SHIPPED,
+                        OrderStatusEnum.GOODS_TO_BE_RECEIVED, OrderStatusEnum.FINISHED).list();
+        return list.stream().map(Order::getGoodsQuantity).reduce(0, Integer::sum);
+    }
 }
diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
index 5e5619a..e86ecaf 100644
--- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
+++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -3,11 +3,15 @@
 <mapper namespace="com.ruoyi.order.mapper.OrderMapper">
 
   <select id="getSeckillMembers" resultType="java.lang.Integer">
-    select ifnull(count(1), 0)
-             form t_order_mall left om join t_order o
-    on om.order_id = o.id
-    where om.goods_sku_id = #{id}
-    group by o.member_id
+    SELECT ifnull(count(1), 0) form t_order_mall LEFT om
+	JOIN t_order o
+    ON om.order_id = o.id
+    WHERE
+      om.goods_sku_id = #{id}
+      AND o.order_status IN (2
+        , 3
+        , 4)
+    GROUP BY
+      o.member_id
   </select>
-</select>
 </mapper>
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/DelayTaskService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/DelayTaskService.java
new file mode 100644
index 0000000..d819d27
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/DelayTaskService.java
@@ -0,0 +1,44 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.api.domain.DelayTask;
+
+;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-05-29
+ */
+public interface DelayTaskService extends IService<DelayTask> {
+
+    /**
+     * @param key
+     * @return DelayTask
+     * @description
+     * @author jqs
+     * @date 2023/7/12 11:39
+     */
+    DelayTask getDelayTask(String key);
+
+    /**
+     * @param delayTask
+     * @return void
+     * @description
+     * @author jqs
+     * @date 2023/7/12 11:37
+     */
+    void addDelayTask(DelayTask delayTask);
+
+    /**
+     * @param key
+     * @return DelayTask
+     * @description
+     * @author jqs
+     * @date 2023/7/12 11:39
+     */
+    void deleteDelayTask(String key);
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DelayTaskServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DelayTaskServiceImpl.java
new file mode 100644
index 0000000..dadfc19
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DelayTaskServiceImpl.java
@@ -0,0 +1,67 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.api.domain.DelayTask;
+import com.ruoyi.system.mapper.DelayTaskMapper;
+import com.ruoyi.system.service.DelayTaskService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-05-29
+ */
+@Service
+public class DelayTaskServiceImpl extends ServiceImpl<DelayTaskMapper, DelayTask> implements
+        DelayTaskService {
+
+
+    /**
+     * @param key
+     * @return DelayTask
+     * @description
+     * @author jqs
+     * @date 2023/7/12 11:38
+     */
+    @Override
+    public DelayTask getDelayTask(String key) {
+        LambdaQueryWrapper<DelayTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DelayTask::getDelFlag, 0);
+        queryWrapper.eq(DelayTask::getRedisKey, key);
+        DelayTask delayTask = this.getOne(queryWrapper, false);
+        return delayTask;
+    }
+
+    /**
+     * @param delayTask
+     * @return void
+     * @description
+     * @author jqs
+     * @date 2023/7/12 11:37
+     */
+    @Override
+    public void addDelayTask(DelayTask delayTask) {
+        this.saveOrUpdate(delayTask);
+    }
+
+    /**
+     * @param key
+     * @return DelayTask
+     * @description
+     * @author jqs
+     * @date 2023/7/12 11:39
+     */
+    @Override
+    public void deleteDelayTask(String key) {
+        LambdaUpdateWrapper<DelayTask> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(DelayTask::getDelFlag, 0);
+        updateWrapper.eq(DelayTask::getRedisKey, key);
+        updateWrapper.set(DelayTask::getDelFlag, 1);
+        this.update(updateWrapper);
+    }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/DelayTaskMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/DelayTaskMapper.xml
new file mode 100644
index 0000000..5ff1188
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/DelayTaskMapper.xml
@@ -0,0 +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="com.ruoyi.system.mapper.config.DelayTaskMapper">
+
+
+</mapper>

--
Gitblit v1.7.1