mitao
2024-05-22 c217a5094b0c0aa308d960c0b2e8b8295a5361a3
Merge branch 'dev-mitao'
21个文件已修改
8个文件已添加
742 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/DelayTaskEnum.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/RuoYiGoodsApplication.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseDTO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseQuery.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsSkuQuery.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsGroupPurchaseController.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsSeckillController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/VO/GoodsGroupPurchaseVO.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/GoodsGroupPurchase.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsGroupPurchaseMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrandServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsGroupPurchaseMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsSeckillMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/DelayTaskService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DelayTaskServiceImpl.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/DelayTaskMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/DelayTaskEnum.java
New file
@@ -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;
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/DelayTask.java
New file
@@ -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;
}
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());
            }
        };
    }
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);
}
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
{
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseDTO.java
New file
@@ -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;
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/DTO/GoodsGroupPurchaseQuery.java
New file
@@ -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;
}
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;
}
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();
    }
}
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) {
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/VO/GoodsGroupPurchaseVO.java
New file
@@ -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;
}
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;
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);
}
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);
}
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);
}
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;
}
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) {
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);
    }
}
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;
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();
    }
}
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>
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>
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));
    }
}
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);
}
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();
@@ -48,4 +55,21 @@
        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);
    }
}
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>
    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>
</mapper>
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/DelayTaskService.java
New file
@@ -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);
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DelayTaskServiceImpl.java
New file
@@ -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);
    }
}
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/DelayTaskMapper.xml
New file
@@ -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>