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); } }