ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/WebsocketMessageDTO.java
New file @@ -0,0 +1,32 @@ package com.ruoyi.system.api.domain; import com.ruoyi.common.core.enums.ClientTypeEnum; import io.swagger.annotations.ApiModel; import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * @author mitao * @date 2024/6/21 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor @ApiModel(value = "websocket消息传输对象", description = "websocket消息传输对象") public class WebsocketMessageDTO implements Serializable { private static final long serialVersionUID = 5118829583970565292L; /** * 客户端类型 */ private ClientTypeEnum clientType; /** * 消息 */ private String message; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
@@ -5,6 +5,7 @@ import com.ruoyi.system.api.domain.DelayTask; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.WebsocketMessageDTO; import com.ruoyi.system.api.domain.dto.MgtAfterSaleSettingDTO; import com.ruoyi.system.api.feignClient.SysUserClient; import java.util.List; @@ -94,6 +95,19 @@ public R<MgtAfterSaleSettingDTO> getAfterSaleSetting() { return R.fail("获取售后设置失败:" + cause.getMessage()); } @Override public R<?> pushByClientType(WebsocketMessageDTO dto, String source) { return R.fail("向" + dto.getClientType().getDesc() + "发送websocket消息失败:" + cause.getMessage()); } @Override public R<?> pushAll(String message, String source) { return R.fail("向所有用户发送websocket消息失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
@@ -7,6 +7,7 @@ import com.ruoyi.system.api.domain.DelayTask; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.WebsocketMessageDTO; import com.ruoyi.system.api.domain.dto.MgtAfterSaleSettingDTO; import com.ruoyi.system.api.factory.SysUserFallbackFactory; import java.util.List; @@ -100,4 +101,12 @@ @GetMapping("/custom-config/get-after-sale-setting") R<MgtAfterSaleSettingDTO> getAfterSaleSetting(); @PostMapping("/websocket/push-by-client-type") R<?> pushByClientType(@RequestBody WebsocketMessageDTO dto, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @GetMapping("/websocket/push-all/{message}") R<?> pushAll(@PathVariable("message") String message, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
@@ -45,6 +45,7 @@ import com.ruoyi.system.api.domain.MemberAddress; import com.ruoyi.system.api.domain.Order; import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.WebsocketMessageDTO; import com.ruoyi.system.api.domain.dto.AuctionGoodsListDTO; import com.ruoyi.system.api.domain.dto.AuctionGoodsListPageDTO; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; @@ -59,7 +60,6 @@ import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.OrderClient; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.util.WebSocketUsers; import io.seata.spring.annotation.GlobalTransactional; import java.time.LocalDateTime; import java.util.ArrayList; @@ -608,7 +608,8 @@ map.put("target_id", id); map.put("message_type", "end"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(msg) .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER); log.info("===================>发送websocket通知,消息体{}", msg); } } @@ -627,7 +628,8 @@ map.put("target_id", id); map.put("message_type", "start"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(msg) .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER); log.info("===================>发送websocket通知,消息体{}", msg); } } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java
@@ -20,8 +20,8 @@ import com.ruoyi.common.core.enums.AuctionOrderTypeEnum; import com.ruoyi.common.core.enums.AuctionStartStatusEnum; import com.ruoyi.common.core.enums.BidStatusEnum; import com.ruoyi.common.core.enums.ClientTypeEnum; import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.system.api.constants.NotificationTypeConstant; import com.ruoyi.system.api.domain.AuctionSalesroom; import com.ruoyi.system.api.domain.CustomConfig; @@ -46,7 +46,6 @@ import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.OrderClient; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.util.WebSocketUsers; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.ArrayList; @@ -337,7 +336,7 @@ msg = objectMapper.writeValueAsString(map); } catch (JsonProcessingException e) { } WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushAll(msg, SecurityConstants.INNER); } @@ -401,7 +400,7 @@ msg = objectMapper.writeValueAsString(map); } catch (JsonProcessingException e) { } WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushAll(msg, SecurityConstants.INNER); } @@ -447,7 +446,7 @@ } catch (JsonProcessingException e) { throw new RuntimeException(e); } WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushAll(msg, SecurityConstants.INNER); } @@ -517,7 +516,7 @@ } catch (JsonProcessingException e) { throw new RuntimeException(e); } WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushAll(msg, SecurityConstants.INNER); } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
@@ -53,7 +53,6 @@ import com.ruoyi.common.core.utils.page.Checker; import com.ruoyi.common.core.utils.page.CollUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.RemoteFileService; import com.ruoyi.system.api.constants.NotificationTypeConstant; import com.ruoyi.system.api.domain.AppMiniLoginVO; @@ -64,6 +63,7 @@ import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.PromotionVideo; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.WebsocketMessageDTO; import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO; import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO; import com.ruoyi.system.api.domain.dto.BidDTO; @@ -85,7 +85,6 @@ import com.ruoyi.system.api.feignClient.OrderClient; import com.ruoyi.system.api.feignClient.PromotionClient; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.util.WebSocketUsers; import io.seata.spring.annotation.GlobalTransactional; import java.io.IOException; import java.math.BigDecimal; @@ -103,8 +102,6 @@ import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Resource; import lombok.Data; import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; import org.apache.http.util.EntityUtils; @@ -655,7 +652,8 @@ Thread socketSender=new Thread(()->{ try { Thread.sleep(1000);//先休眠1秒 WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), finalMsg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(finalMsg) .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER); } catch (Exception e) { e.printStackTrace(); } @@ -724,7 +722,8 @@ Thread socketSender=new Thread(()->{ try { Thread.sleep(1000);//先休眠1秒 WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), finalMsg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(finalMsg) .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER); } catch (Exception e) { e.printStackTrace(); } @@ -1368,7 +1367,8 @@ map.put("auctionSalesroomId", auctionSalesroom.getId()); map.put("message_type", "start"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.AUCTIONEER.getCode(), msg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(msg) .clientType(ClientTypeEnum.AUCTIONEER).build(), SecurityConstants.INNER); } @Override @@ -1418,7 +1418,8 @@ map.put("auctionSalesroomId", auctionSalesroom.getId()); map.put("message_type", "end"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.AUCTIONEER.getCode(), msg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(msg) .clientType(ClientTypeEnum.AUCTIONEER).build(), SecurityConstants.INNER); } @Override ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -33,6 +33,7 @@ import com.ruoyi.system.api.domain.GoodsGroupPurchase; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.Order; import com.ruoyi.system.api.domain.WebsocketMessageDTO; import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; import com.ruoyi.system.api.domain.dto.ListStatusDTO; import com.ruoyi.system.api.domain.dto.OrderUpdDTO; @@ -41,13 +42,12 @@ import com.ruoyi.system.api.domain.vo.OrderVO; import com.ruoyi.system.api.domain.vo.WdGoodsGroupPurchaseVO; import com.ruoyi.system.api.feignClient.OrderClient; import com.ruoyi.system.api.util.WebSocketUsers; import com.ruoyi.system.api.feignClient.SysUserClient; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import javax.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -65,14 +65,12 @@ @RequiredArgsConstructor public class GoodsGroupPurchaseServiceImpl extends ServiceImpl<GoodsGroupPurchaseMapper, GoodsGroupPurchase> implements IGoodsGroupPurchaseService { @Resource private OrderClient orderClient; private final OrderClient orderClient; private final IGoodsSkuService goodsSkuService; private final AsyncMethodService asyncMethodService; private final RedisService redisService; @Resource private IMemberGoodsCollectionService iMemberGoodsCollectionService; private final IMemberGoodsCollectionService iMemberGoodsCollectionService; private final SysUserClient sysUserClient; // 创建一个静态共享的ObjectMapper实例以重用 private static final ObjectMapper objectMapper = new ObjectMapper(); /** @@ -216,7 +214,9 @@ map.put("target_id", groupPurchaseId); map.put("message_type", "start"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(msg) .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER); log.info("===================>发送websocket通知,消息体{}", msg); } } @@ -240,7 +240,8 @@ map.put("target_id", groupPurchaseId); map.put("message_type", "end"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(msg) .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER); log.info("===================>发送websocket通知,消息体{}", msg); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -36,6 +36,7 @@ import com.ruoyi.system.api.domain.GoodsSeckill; import com.ruoyi.system.api.domain.GoodsSeries; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.WebsocketMessageDTO; import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; import com.ruoyi.system.api.domain.dto.ListStatusDTO; import com.ruoyi.system.api.domain.vo.HomeGoodsSeckillInfoVO; @@ -43,7 +44,6 @@ import com.ruoyi.system.api.feignClient.GoodsSkuClient; import com.ruoyi.system.api.feignClient.OrderClient; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.util.WebSocketUsers; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -221,7 +221,8 @@ map.put("target_id", seckillId); map.put("message_type", "start"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(msg) .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER); log.info("===================>发送websocket通知,消息体{}", msg); } @@ -248,7 +249,8 @@ map.put("target_id", seckillId); map.put("message_type", "end"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); sysUserClient.pushByClientType(WebsocketMessageDTO.builder().message(msg) .clientType(ClientTypeEnum.MEMBER).build(), SecurityConstants.INNER); log.info("===================>发送websocket通知,消息体{}", msg); } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WebSocketController.java
New file @@ -0,0 +1,43 @@ package com.ruoyi.system.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.system.api.domain.WebsocketMessageDTO; import com.ruoyi.system.websocket.WebSocketUsers; 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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/websocket") public class WebSocketController { @GetMapping("/push") public R<?> push() { WebSocketUsers.sendMessageToUsersByText("长江长江,我是黄河!"); return R.ok(); } @GetMapping("/push/{type}/{msg}") public R<?> push(@PathVariable("type") Integer type, @PathVariable("msg") String msg) { WebSocketUsers.sendMessageToUsersByType(type, msg); return R.ok(); } @InnerAuth @PostMapping("/push-by-client-type") public R<?> pushByClientType(@RequestBody WebsocketMessageDTO dto) { WebSocketUsers.sendMessageToUsersByType(dto.getClientType().getCode(), dto.getMessage()); return R.ok(); } @InnerAuth @GetMapping("/push-all/{message}") public R<?> pushAll(@PathVariable("message") String message) { WebSocketUsers.sendMessageToUsersByText(message); return R.ok(); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WebSocketTestController.java
File was deleted ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer.java
@@ -1,6 +1,5 @@ package com.ruoyi.system.websocket; import com.ruoyi.system.api.util.WebSocketUsers; import java.util.concurrent.Semaphore; import javax.websocket.OnClose; import javax.websocket.OnError; ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketUsers.java
File was renamed from ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers.java @@ -1,4 +1,4 @@ package com.ruoyi.system.api.util; package com.ruoyi.system.websocket; import java.io.IOException; import java.util.Collection;