rentaiming
2024-05-27 05fe558f722590aa706c2296c8a9a619d12b42be
Merge remote-tracking branch 'origin/master'

# Conflicts:
# ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/ArticleController.java
# ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleCommentsService.java
# ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleCommentsServiceImpl.java
# ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java
3 文件已重命名
7个文件已添加
20个文件已修改
325 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/ArticleController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/MemberLikeController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/SensitiveWordsController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/Article.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/ArticleComments.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/MemberLike.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/SensitiveWords.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleCommentsMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/MemberLikeMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/SensitiveWordsMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleCommentsService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IMemberLikeService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/ISensitiveWordsService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/MemberLikeServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/SensitiveWordsServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-article/src/main/resources/mapper/article/MemberLikeMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsGroupPurchaseController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSeckillController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.system.api.constants;
/**
 * @author mitao
 * @date 2024/5/27
 */
public interface NotificationTypeConstant {
    String SECKILL = "seckill";
    String GROUP_PURCHASE = "group_purchase";
}
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/ArticleController.java
@@ -1,7 +1,7 @@
package com.ruoyi.article.controller;
import com.ruoyi.article.domain.pojo.Article;
import com.ruoyi.article.domain.Article;
import com.ruoyi.article.dto.ArticleDTO;
import com.ruoyi.article.service.IArticleService;
import com.ruoyi.article.vo.ArticleCommentsVO;
@@ -12,9 +12,9 @@
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.formula.functions.T;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/MemberLikeController.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.article.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * 用户点赞关联表 前端控制器
 * </p>
 *
 * @author mitao
 * @since 2024-05-27
 */
@RestController
@RequestMapping("/member-like")
public class MemberLikeController {
}
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/SensitiveWordsController.java
@@ -1,21 +1,16 @@
package com.ruoyi.article.controller;
import com.ruoyi.article.domain.pojo.Article;
import com.ruoyi.article.domain.pojo.SensitiveWords;
import com.ruoyi.article.dto.ArticleDTO;
import com.ruoyi.article.domain.SensitiveWords;
import com.ruoyi.article.service.ISensitiveWordsService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.page.PageDTO;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/Article.java
File was renamed from ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/Article.java
@@ -1,4 +1,4 @@
package com.ruoyi.article.domain.pojo;
package com.ruoyi.article.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/ArticleComments.java
File was renamed from ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/ArticleComments.java
@@ -1,4 +1,4 @@
package com.ruoyi.article.domain.pojo;
package com.ruoyi.article.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/MemberLike.java
New file
@@ -0,0 +1,62 @@
package com.ruoyi.article.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 * 用户点赞关联表
 * </p>
 *
 * @author mitao
 * @since 2024-05-27
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_member_like")
@ApiModel(value = "MemberLike对象", description = "用户点赞关联表")
public class MemberLike implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "会员id")
    private Long memberId;
    @ApiModelProperty(value = "资讯id/评论id/回复id")
    private Long articleId;
    @ApiModelProperty(value = "1 点赞资讯,2 点赞评论, 3 点赞回复")
    private Long type;
    @ApiModelProperty(value = "创建者")
    private String createBy;
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新者")
    private String updateBy;
    @ApiModelProperty(value = "更新时间")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
    private Integer delFlag;
    @ApiModelProperty(value = "点赞数")
    private Long likeNum;
}
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/SensitiveWords.java
File was renamed from ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/SensitiveWords.java
@@ -1,4 +1,4 @@
package com.ruoyi.article.domain.pojo;
package com.ruoyi.article.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleCommentsMapper.java
@@ -1,7 +1,7 @@
package com.ruoyi.article.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.article.domain.pojo.ArticleComments;
import com.ruoyi.article.domain.ArticleComments;
/**
 * <p>
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleMapper.java
@@ -1,7 +1,7 @@
package com.ruoyi.article.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.article.domain.pojo.Article;
import com.ruoyi.article.domain.Article;
/**
 * <p>
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/MemberLikeMapper.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.article.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.article.domain.MemberLike;
/**
 * <p>
 * 用户点赞关联表 Mapper 接口
 * </p>
 *
 * @author mitao
 * @since 2024-05-27
 */
public interface MemberLikeMapper extends BaseMapper<MemberLike> {
}
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/SensitiveWordsMapper.java
@@ -1,7 +1,7 @@
package com.ruoyi.article.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.article.domain.pojo.SensitiveWords;
import com.ruoyi.article.domain.SensitiveWords;
/**
 * <p>
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleCommentsService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.article.domain.pojo.ArticleComments;
import com.ruoyi.article.dto.ArticleCommentsDTO;
import com.ruoyi.article.domain.ArticleComments;
/**
 * <p>
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleService.java
@@ -1,11 +1,10 @@
package com.ruoyi.article.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.article.domain.pojo.Article;
import com.ruoyi.article.domain.Article;
import com.ruoyi.article.dto.ArticleDTO;
import com.ruoyi.article.vo.ArticleCommentsVO;
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.system.api.domain.MemberAddress;
/**
 * <p>
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IMemberLikeService.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.article.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.article.domain.MemberLike;
/**
 * <p>
 * 用户点赞关联表 服务类
 * </p>
 *
 * @author mitao
 * @since 2024-05-27
 */
public interface IMemberLikeService extends IService<MemberLike> {
}
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/ISensitiveWordsService.java
@@ -1,8 +1,7 @@
package com.ruoyi.article.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.article.domain.pojo.SensitiveWords;
import com.ruoyi.article.domain.SensitiveWords;
import java.util.List;
/**
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.article.domain.pojo.Article;
import com.ruoyi.article.domain.pojo.ArticleComments;
import com.ruoyi.article.domain.Article;
import com.ruoyi.article.dto.ArticleDTO;
import com.ruoyi.article.mapper.ArticleMapper;
import com.ruoyi.article.service.IArticleCommentsService;
@@ -23,6 +24,7 @@
import util.HuaWeiOBSUtil;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/MemberLikeServiceImpl.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.article.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.article.domain.MemberLike;
import com.ruoyi.article.mapper.MemberLikeMapper;
import com.ruoyi.article.service.IMemberLikeService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 用户点赞关联表 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2024-05-27
 */
@Service
public class MemberLikeServiceImpl extends ServiceImpl<MemberLikeMapper, MemberLike> implements
        IMemberLikeService {
}
ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/SensitiveWordsServiceImpl.java
@@ -2,17 +2,13 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.article.domain.pojo.Article;
import com.ruoyi.article.domain.pojo.SensitiveWords;
import com.ruoyi.article.domain.SensitiveWords;
import com.ruoyi.article.mapper.SensitiveWordsMapper;
import com.ruoyi.article.service.ISensitiveWordsService;
import com.ruoyi.common.core.utils.page.PageDTO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
/**
 * <p>
ruoyi-modules/ruoyi-article/src/main/resources/mapper/article/MemberLikeMapper.xml
New file
@@ -0,0 +1,5 @@
<?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.article.mapper.MemberLikeMapper">
</mapper>
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java
@@ -29,6 +29,12 @@
    private final IAuctionGoodsService auctionGoodsService;
    /**
     * 获取拍卖商品列表的分页数据
     *
     * @param query 拍卖商品查询对象
     * @return PageDTO<AuctionGoodsVO>
     */
    @ApiOperation(value = "获取拍卖商品列表的分页数据", notes = "获取拍卖商品列表的分页数据")
    @PostMapping("/page")
    public R<PageDTO<AuctionGoodsVO>> getAuctionGoodsPage(
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java
@@ -15,6 +15,11 @@
 * @since 2024-05-16
 */
public interface IAuctionGoodsService extends IService<AuctionGoods> {
    /**
     * 获取拍卖商品列表的分页数据
     *
     * @param query 拍卖商品查询对象
     * @return PageDTO<AuctionGoodsVO>
     */
    PageDTO<AuctionGoodsVO> getAuctionGoodsPage(AuctionGoodsQuery query);
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
@@ -36,6 +36,12 @@
    @Resource
    private GoodsSkuClient goodsSkuClient;
    /**
     * 获取拍卖商品列表的分页数据
     *
     * @param query 拍卖商品查询对象
     * @return PageDTO<AuctionGoodsVO>
     */
    @Override
    public PageDTO<AuctionGoodsVO> getAuctionGoodsPage(AuctionGoodsQuery query) {
        Set<Long> goodsSkuIdList = null;
@@ -45,7 +51,8 @@
            goodsSkuIdList = goodsSku.stream().map(GoodsSku::getId)
                    .collect(Collectors.toSet());
        }
        this.lambdaQuery().select(AuctionGoods::getId, AuctionGoods::getGoodsSkuId,
        Page<AuctionGoods> page = this.lambdaQuery()
                .select(AuctionGoods::getId, AuctionGoods::getGoodsSkuId,
                        AuctionGoods::getListingStatus, AuctionGoods::getStartStatus,
                        AuctionGoods::getStartTime, AuctionGoods::getEndTime,
                        AuctionGoods::getAuctionStock, AuctionGoods::getMinimumMarkupAmount).in(
@@ -57,6 +64,6 @@
                .eq(StringUtils.isNotNull(query.getStartStatus()), AuctionGoods::getStartStatus,
                        query.getStartStatus())
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        return null;
        return PageDTO.of(page, AuctionGoodsVO.class);
    }
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsGroupPurchaseController.java
@@ -1,6 +1,7 @@
package com.ruoyi.goods.controller.inner;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.annotation.InnerAuth;
import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
@@ -35,7 +36,12 @@
    @InnerAuth
    @GetMapping("/start/{groupPurchaseId}")
    R<?> startGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId) {
        try {
        goodsGroupPurchaseService.startGroupPurchase(groupPurchaseId);
        } catch (JsonProcessingException e) {
            log.error("团购商品开始团购失败", e);
            return R.fail("团购商品开始团购失败");
        }
        return R.ok();
    }
@@ -47,7 +53,12 @@
    @InnerAuth
    @GetMapping("/end/{groupPurchaseId}")
    R<?> endGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId) {
        try {
        goodsGroupPurchaseService.endGroupPurchase(groupPurchaseId);
        } catch (JsonProcessingException e) {
            log.error("团购商品开始团购失败", e);
            return R.fail("团购商品结束团购失败");
        }
        return R.ok();
    }
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSeckillController.java
@@ -1,6 +1,7 @@
package com.ruoyi.goods.controller.inner;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.annotation.InnerAuth;
import com.ruoyi.goods.service.IGoodsSeckillService;
@@ -45,7 +46,12 @@
    @InnerAuth
    @GetMapping("/start/{seckillId}")
    R<?> startSeckill(@PathVariable("seckillId") Long seckillId) {
        try {
        goodsSeckillService.startSeckill(seckillId);
        } catch (JsonProcessingException e) {
            log.error("秒杀开始异常", e);
            return R.fail();
        }
        return R.ok();
    }
@@ -57,7 +63,12 @@
    @InnerAuth
    @GetMapping("/end/{seckillId}")
    R<?> endSeckill(@PathVariable("seckillId") Long seckillId) {
        try {
        goodsSeckillService.endSeckill(seckillId);
        } catch (JsonProcessingException e) {
            log.error("秒杀结束异常", e);
            return R.fail();
        }
        return R.ok();
    }
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
@@ -1,6 +1,7 @@
package com.ruoyi.goods.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.goods.controller.management.dto.GoodsGroupPurchaseDTO;
import com.ruoyi.goods.controller.management.dto.GoodsGroupPurchaseQuery;
@@ -53,14 +54,14 @@
     *
     * @param groupPurchaseId 团购商品id
     */
    void startGroupPurchase(Long groupPurchaseId);
    void startGroupPurchase(Long groupPurchaseId) throws JsonProcessingException;
    /**
     * 团购商品结束团购
     *
     * @param groupPurchaseId 团购商品id
     */
    void endGroupPurchase(Long groupPurchaseId);
    void endGroupPurchase(Long groupPurchaseId) throws JsonProcessingException;
    /**
     * 立即结束团购
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java
@@ -1,6 +1,7 @@
package com.ruoyi.goods.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.goods.controller.management.dto.GoodsSeckillDTO;
import com.ruoyi.goods.controller.management.dto.GoodsSeckillQuery;
@@ -61,12 +62,12 @@
     *
     * @param seckillId 秒杀id
     */
    void startSeckill(Long seckillId);
    void startSeckill(Long seckillId) throws JsonProcessingException;
    /**
     * 结束秒杀
     *
     * @param seckillId 秒杀id
     */
    void endSeckill(Long seckillId);
    void endSeckill(Long seckillId) throws JsonProcessingException;
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java
@@ -13,13 +13,14 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * @author mitao
 * @date 2024/5/24
 */
@Component
@Service
@Slf4j
@RequiredArgsConstructor
public class AsyncMethodService {
@@ -28,6 +29,7 @@
    private final SysUserClient sysUserClient;
    @Async
    @Transactional(rollbackFor = Exception.class)
    public void seckillScheduleTask(GoodsSeckill goodsSeckill) {
        LocalDateTime startTime = goodsSeckill.getStartTime();
        LocalDateTime endTime = goodsSeckill.getEndTime();
@@ -50,6 +52,7 @@
    }
    @Async
    @Transactional(rollbackFor = Exception.class)
    public void groupPurchaseScheduleTask(GoodsGroupPurchase groupPurchase) {
        LocalDateTime startTime = groupPurchase.getStartTime();
        LocalDateTime endTime = groupPurchase.getEndTime();
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.GroupStatusEnum;
import com.ruoyi.common.core.enums.ListingStatusEnum;
import com.ruoyi.common.core.enums.PaymentMethodEnum;
@@ -18,15 +20,19 @@
import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
import com.ruoyi.goods.service.IGoodsSkuService;
import com.ruoyi.goods.service.async.AsyncMethodService;
import com.ruoyi.system.api.WebSocketUsers;
import com.ruoyi.system.api.constants.NotificationTypeConstant;
import com.ruoyi.system.api.domain.GoodsSku;
import com.ruoyi.system.api.domain.Order;
import com.ruoyi.system.api.domain.dto.ListStatusDTO;
import com.ruoyi.system.api.feignClient.OrderClient;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import util.WebSocketUsers;
/**
 * <p>
@@ -44,6 +50,8 @@
    private final OrderClient orderClient;
    private final IGoodsSkuService goodsSkuService;
    private final AsyncMethodService asyncMethodService;
    // 创建一个静态共享的ObjectMapper实例以重用
    private static final ObjectMapper objectMapper = new ObjectMapper();
    /**
     * 获取团购商品列表的分页数据
     *
@@ -148,15 +156,19 @@
     * @param groupPurchaseId 团购商品id
     */
    @Override
    public void startGroupPurchase(Long groupPurchaseId) {
    public void startGroupPurchase(Long groupPurchaseId) throws JsonProcessingException {
        log.info(">>>>>>>>>>>>>>>>>>>>{}团购商品开始团购<<<<<<<<<<<<<<<<<<<<", groupPurchaseId);
        GoodsGroupPurchase groupPurchase = this.getById(groupPurchaseId);
        if (StringUtils.isNotNull(groupPurchase)) {
            this.lambdaUpdate().set(GoodsGroupPurchase::getStartStatus, StartStatusEnum.STARTED)
                    .eq(GoodsGroupPurchase::getId, groupPurchaseId).update();
            //TODO 通知小程序
            WebSocketUsers.sendMessageToUsersByText(
                    "团购商品" + groupPurchase.getGoodsSkuName() + "开始团购");
            Map<String, Object> map = new ConcurrentHashMap<>();
            map.put("notification_type", NotificationTypeConstant.GROUP_PURCHASE);
            map.put("notification_time", LocalDateTime.now());
            map.put("message_type", "start");
            String msg = objectMapper.writeValueAsString(map);
            WebSocketUsers.sendMessageToUsersByText(msg);
            log.info("===================>发送websocket通知,消息体{}", msg);
        }
    }
@@ -166,15 +178,19 @@
     * @param groupPurchaseId 团购商品id
     */
    @Override
    public void endGroupPurchase(Long groupPurchaseId) {
    public void endGroupPurchase(Long groupPurchaseId) throws JsonProcessingException {
        log.info(">>>>>>>>>>>>>>>>>>>>{}团购商品结束团购<<<<<<<<<<<<<<<<<<<<", groupPurchaseId);
        GoodsGroupPurchase groupPurchase = this.getById(groupPurchaseId);
        if (StringUtils.isNotNull(groupPurchase)) {
            this.lambdaUpdate().set(GoodsGroupPurchase::getStartStatus, StartStatusEnum.ENDED)
                    .eq(GoodsGroupPurchase::getId, groupPurchaseId).update();
            //TODO 通知小程序
            WebSocketUsers.sendMessageToUsersByText(
                    "团购商品" + groupPurchase.getGoodsSkuName() + "结束团购");
            Map<String, Object> map = new ConcurrentHashMap<>();
            map.put("notification_type", NotificationTypeConstant.GROUP_PURCHASE);
            map.put("notification_time", LocalDateTime.now());
            map.put("message_type", "end");
            String msg = objectMapper.writeValueAsString(map);
            WebSocketUsers.sendMessageToUsersByText(msg);
            log.info("===================>发送websocket通知,消息体{}", msg);
        }
    }
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.constant.CacheConstants;
import com.ruoyi.common.core.enums.StartStatusEnum;
import com.ruoyi.common.core.exception.ServiceException;
@@ -17,18 +19,22 @@
import com.ruoyi.goods.service.IGoodsSeckillService;
import com.ruoyi.goods.service.IGoodsSkuService;
import com.ruoyi.goods.service.async.AsyncMethodService;
import com.ruoyi.system.api.WebSocketUsers;
import com.ruoyi.system.api.constants.NotificationTypeConstant;
import com.ruoyi.system.api.domain.GoodsSeckill;
import com.ruoyi.system.api.domain.GoodsSku;
import com.ruoyi.system.api.domain.dto.ListStatusDTO;
import com.ruoyi.system.api.feignClient.OrderClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import util.WebSocketUsers;
/**
 * <p>
@@ -48,6 +54,8 @@
    private final RedisService redisService;
    private final SysUserClient sysUserClient;
    private final AsyncMethodService asyncMethodService;
    // 创建一个静态共享的ObjectMapper实例以重用
    private static final ObjectMapper objectMapper = new ObjectMapper();
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addGoodsSeckill(GoodsSeckillDTO dto) {
@@ -147,7 +155,7 @@
     * @param seckillId 秒杀id
     */
    @Override
    public void startSeckill(Long seckillId) {
    public void startSeckill(Long seckillId) throws JsonProcessingException {
        log.info(">>>>>>>>>>>>>>>>>>>>{}秒杀开始<<<<<<<<<<<<<<<<<<<<", seckillId);
        GoodsSeckill goodsSeckill = this.getById(seckillId);
        //秒杀商品不能为空且状态为未开始
@@ -162,7 +170,13 @@
                    goodsSeckill.getSeckillStock());
        }
        //推送秒杀开始消息
        WebSocketUsers.sendMessageToUsersByText("秒杀活动已开始");
        Map<String, Object> map = new ConcurrentHashMap<>();
        map.put("notification_type", NotificationTypeConstant.SECKILL);
        map.put("notification_time", LocalDateTime.now());
        map.put("message_type", "start");
        String msg = objectMapper.writeValueAsString(map);
        WebSocketUsers.sendMessageToUsersByText(msg);
        log.info("===================>发送websocket通知,消息体{}", msg);
    }
    /**
@@ -171,7 +185,7 @@
     * @param seckillId 秒杀id
     */
    @Override
    public void endSeckill(Long seckillId) {
    public void endSeckill(Long seckillId) throws JsonProcessingException {
        log.info(">>>>>>>>>>>>>>>>>>>>{}秒杀结束<<<<<<<<<<<<<<<<<<<<", seckillId);
        GoodsSeckill goodsSeckill = this.getById(seckillId);
        if (StringUtils.isNotNull(goodsSeckill)
@@ -182,7 +196,12 @@
//            将秒杀商品从缓存中移除
            redisService.deleteObject(CacheConstants.SECKILL_GOODS + goodsSeckill.getId());
        }
        //TODO websocket 推送秒杀结束消息
        WebSocketUsers.sendMessageToUsersByText("秒杀活动已结束");
        Map<String, Object> map = new ConcurrentHashMap<>();
        map.put("notification_type", NotificationTypeConstant.SECKILL);
        map.put("notification_time", LocalDateTime.now());
        map.put("message_type", "end");
        String msg = objectMapper.writeValueAsString(map);
        WebSocketUsers.sendMessageToUsersByText(msg);
        log.info("===================>发送websocket通知,消息体{}", msg);
    }
}