From 8d9eca3f5e9f884a14f41d04d1898e2ee7bf9078 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期二, 11 六月 2024 16:08:08 +0800 Subject: [PATCH] 1.提交【管理后台】-营销管理-积分管理相关接口 2.修改websocket代码,增加用户端、拍卖师端类型区分 --- ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomConfigController.java | 21 + ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml | 7 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java | 5 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java | 40 +- ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java | 92 ++++-- ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/CouponReceiveDetailVO.java | 20 + ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomConfigService.java | 2 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java | 5 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/dto/MgtMemberPointsQuery.java | 12 ruoyi-modules/ruoyi-order/pom.xml | 6 ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponReceiveQuery.java | 2 ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java | 8 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ClientTypeEnum.java | 23 + ruoyi-modules/ruoyi-system/pom.xml | 6 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MemberPointsController.java | 46 +++ ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers.java | 61 +-- ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/ICouponService.java | 9 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers_Bak.java | 118 +++++++ ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java | 5 ruoyi-modules/ruoyi-member/pom.xml | 5 ruoyi-modules/ruoyi-promotion/pom.xml | 18 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/PointsConfigDTO.java | 27 + ruoyi-modules/ruoyi-goods/pom.xml | 6 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomConfigServiceImpl.java | 37 ++ ruoyi-modules/ruoyi-article/pom.xml | 6 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java | 83 +++++ ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer_Bak.java | 97 ++++++ ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer.java | 43 -- ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtCouponController.java | 27 + ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/IMemberPointsService.java | 9 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/vo/MgtMemberPointsVO.java | 9 31 files changed, 698 insertions(+), 157 deletions(-) diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers.java index 5d8a44b..c69232e 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers.java @@ -16,34 +16,17 @@ */ public class WebSocketUsers { - /** - * WebSocketUsers 日志控制器 - */ private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketUsers.class); - /** - * 用户集 - */ - private static Map<String, Session> USERS = new ConcurrentHashMap<String, Session>(); + private static Map<String, Session> USERS = new ConcurrentHashMap<>(); + private static Map<String, Integer> USER_TYPES = new ConcurrentHashMap<>(); - /** - * 存储用户 - * - * @param key 唯一键 - * @param session 用户信息 - */ - public static void put(String key, Session session) + public static void put(String key, Session session, Integer clientType) { USERS.put(key, session); + USER_TYPES.put(key, clientType); } - /** - * 移除用户 - * - * @param session 用户信息 - * - * @return 移除结果 - */ public static boolean remove(Session session) { String key = null; @@ -68,15 +51,11 @@ return remove(key); } - /** - * 移出用户 - * - * @param key 键 - */ public static boolean remove(String key) { LOGGER.info("\n 正在移出用户 - {}", key); Session remove = USERS.remove(key); + USER_TYPES.remove(key); if (remove != null) { boolean containsValue = USERS.containsValue(remove); @@ -89,21 +68,15 @@ } } - /** - * 获取在线用户列表 - * - * @return 返回用户集合 - */ public static Map<String, Session> getUsers() { return USERS; } - /** - * 群发消息文本消息 - * - * @param message 消息内容 - */ + public static Integer getUserType(String key) { + return USER_TYPES.get(key); + } + public static void sendMessageToUsersByText(String message) { Collection<Session> values = USERS.values(); @@ -113,12 +86,6 @@ } } - /** - * 发送文本消息 - * - * @param session 自己的用户名 - * @param message 消息内容 - */ public static void sendMessageToUserByText(Session session, String message) { if (session != null) @@ -137,4 +104,14 @@ LOGGER.info("\n[你已离线]"); } } + + public static void sendMessageToUsersByType(Integer clientType, String message) { + for (Map.Entry<String, Session> entry : USERS.entrySet()) { + String key = entry.getKey(); + Session session = entry.getValue(); + if (clientType.equals(USER_TYPES.get(key))) { + sendMessageToUserByText(session, message); + } + } + } } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers_Bak.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers_Bak.java new file mode 100644 index 0000000..da42f2b --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/util/WebSocketUsers_Bak.java @@ -0,0 +1,118 @@ +package com.ruoyi.system.api.util; + +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import javax.websocket.Session; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * websocket 客户端用户集 + * + * @author ruoyi + */ +public class WebSocketUsers_Bak { + + /** + * WebSocketUsers 日志控制器 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketUsers_Bak.class); + + /** + * 用户集 + */ + private static Map<String, Session> USERS = new ConcurrentHashMap<String, Session>(); + + /** + * 存储用户 + * + * @param key 唯一键 + * @param session 用户信息 + */ + public static void put(String key, Session session) { + USERS.put(key, session); + } + + /** + * 移除用户 + * + * @param session 用户信息 + * @return 移除结果 + */ + public static boolean remove(Session session) { + String key = null; + boolean flag = USERS.containsValue(session); + if (flag) { + Set<Map.Entry<String, Session>> entries = USERS.entrySet(); + for (Map.Entry<String, Session> entry : entries) { + Session value = entry.getValue(); + if (value.equals(session)) { + key = entry.getKey(); + break; + } + } + } else { + return true; + } + return remove(key); + } + + /** + * 移出用户 + * + * @param key 键 + */ + public static boolean remove(String key) { + LOGGER.info("\n 正在移出用户 - {}", key); + Session remove = USERS.remove(key); + if (remove != null) { + boolean containsValue = USERS.containsValue(remove); + LOGGER.info("\n 移出结果 - {}", containsValue ? "失败" : "成功"); + return containsValue; + } else { + return true; + } + } + + /** + * 获取在线用户列表 + * + * @return 返回用户集合 + */ + public static Map<String, Session> getUsers() { + return USERS; + } + + /** + * 群发消息文本消息 + * + * @param message 消息内容 + */ + public static void sendMessageToUsersByText(String message) { + Collection<Session> values = USERS.values(); + for (Session value : values) { + sendMessageToUserByText(value, message); + } + } + + /** + * 发送文本消息 + * + * @param session 自己的用户名 + * @param message 消息内容 + */ + public static void sendMessageToUserByText(Session session, String message) { + if (session != null) { + try { + session.getBasicRemote().sendText(message); + } catch (IOException e) { + LOGGER.error("\n[发送消息异常]", e); + } + } else { + LOGGER.info("\n[你已离线]"); + } + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ClientTypeEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ClientTypeEnum.java new file mode 100644 index 0000000..33fd51f --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ClientTypeEnum.java @@ -0,0 +1,23 @@ +package com.ruoyi.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ClientTypeEnum { + MEMBER(1, "会员小程序"), + AUCTIONEER(2, "拍卖师小程序"); + + private final Integer code; + private final String desc; + + public static ClientTypeEnum getEnumByCode(Integer code) { + for (ClientTypeEnum e : ClientTypeEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java index 78a5393..07129e0 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java @@ -1,13 +1,13 @@ package com.ruoyi.common.security.utils; -import javax.servlet.http.HttpServletRequest; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.TokenConstants; import com.ruoyi.common.core.context.SecurityContextHolder; import com.ruoyi.common.core.utils.ServletUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.system.api.model.LoginUser; +import javax.servlet.http.HttpServletRequest; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * 权限获取工具类 @@ -63,6 +63,10 @@ { // 从header获取token标识 String token = request.getHeader(TokenConstants.AUTHENTICATION); + if (StringUtils.isBlank(token)) { + // 如果Authorization为空,那么尝试读取Sec-Websocket-Protocol的内容 + token = request.getHeader("Sec-Websocket-Protocol"); + } return replaceTokenPrefix(token); } diff --git a/ruoyi-modules/ruoyi-article/pom.xml b/ruoyi-modules/ruoyi-article/pom.xml index dab77ce..ae8ca0c 100644 --- a/ruoyi-modules/ruoyi-article/pom.xml +++ b/ruoyi-modules/ruoyi-article/pom.xml @@ -112,7 +112,11 @@ </exclusion> </exclusions> </dependency> - + <!-- 分布式事务 --> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common-seata</artifactId> + </dependency> </dependencies> <build> diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java index 20aee30..d5c1267 100644 --- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java +++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java @@ -25,6 +25,7 @@ import com.ruoyi.common.core.enums.AuctionStartStatusEnum; import com.ruoyi.common.core.enums.BidStatusEnum; import com.ruoyi.common.core.enums.BondStatusEnum; +import com.ruoyi.common.core.enums.ClientTypeEnum; import com.ruoyi.common.core.enums.ListingStatusEnum; import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.exception.ServiceException; @@ -576,7 +577,7 @@ map.put("target_id", id); map.put("message_type", "end"); String msg = objectMapper.writeValueAsString(map); - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(1, msg); log.info("===================>发送websocket通知,消息体{}", msg); } } @@ -595,7 +596,7 @@ map.put("target_id", id); map.put("message_type", "start"); String msg = objectMapper.writeValueAsString(map); - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); log.info("===================>发送websocket通知,消息体{}", msg); } } diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java index fed4c43..d622b47 100644 --- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java +++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java @@ -6,16 +6,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; -import com.ruoyi.system.api.constants.NotificationTypeConstant; -import com.ruoyi.system.api.domain.*; -import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO; -import com.ruoyi.system.api.domain.dto.AuctionSalesroomGoodsInfoDTO; -import com.ruoyi.system.api.domain.vo.AuctionBidRecordVO; -import com.ruoyi.system.api.domain.vo.AuctionSalesroomGoodsInfoVO; -import com.ruoyi.system.api.domain.vo.AuctionSalesroomVO; -import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO; import com.ruoyi.auction.domain.AuctionBidRecord; -import com.ruoyi.auction.domain.AuctionBrowseRecord; import com.ruoyi.auction.domain.AuctionSalesroomGoods; import com.ruoyi.auction.mapper.AuctionBidRecordMapper; import com.ruoyi.auction.mapper.AuctionSalesroomGoodsMapper; @@ -29,24 +20,39 @@ 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.system.api.constants.NotificationTypeConstant; +import com.ruoyi.system.api.domain.AuctionSalesroom; +import com.ruoyi.system.api.domain.CustomConfig; +import com.ruoyi.system.api.domain.GoodsBrand; +import com.ruoyi.system.api.domain.GoodsCategory; +import com.ruoyi.system.api.domain.GoodsFlavorType; +import com.ruoyi.system.api.domain.GoodsSeries; +import com.ruoyi.system.api.domain.GoodsSku; +import com.ruoyi.system.api.domain.Member; +import com.ruoyi.system.api.domain.MemberAddress; +import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO; +import com.ruoyi.system.api.domain.dto.AuctionSalesroomGoodsInfoDTO; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO; import com.ruoyi.system.api.domain.dto.OrderDTO; +import com.ruoyi.system.api.domain.vo.AuctionBidRecordVO; +import com.ruoyi.system.api.domain.vo.AuctionSalesroomGoodsInfoVO; +import com.ruoyi.system.api.domain.vo.AuctionSalesroomVO; +import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO; import com.ruoyi.system.api.feignClient.GoodsSkuClient; 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.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Resource; - -import com.ruoyi.system.api.feignClient.SysUserClient; -import com.ruoyi.system.api.util.WebSocketUsers; import org.springframework.stereotype.Service; @@ -292,7 +298,7 @@ msg = objectMapper.writeValueAsString(map); } catch (JsonProcessingException e) { } - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.AUCTIONEER.getCode(), msg); } @@ -354,7 +360,7 @@ msg = objectMapper.writeValueAsString(map); } catch (JsonProcessingException e) { } - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.AUCTIONEER.getCode(), msg); } @@ -398,7 +404,7 @@ } catch (JsonProcessingException e) { throw new RuntimeException(e); } - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.AUCTIONEER.getCode(), msg); } @@ -467,7 +473,7 @@ } catch (JsonProcessingException e) { throw new RuntimeException(e); } - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.AUCTIONEER.getCode(), msg); } diff --git a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml index 689be79..5363b29 100644 --- a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml @@ -2,13 +2,18 @@ server: port: 9300 # Spring -spring: +spring: application: # 应用名称 name: ruoyi-file profiles: # 环境配置 active: dev + servlet: + multipart: + max-file-size: 100MB + max-request-size: 200MB + location: /data/tmp --- spring: config: diff --git a/ruoyi-modules/ruoyi-goods/pom.xml b/ruoyi-modules/ruoyi-goods/pom.xml index 6036e46..250b7fc 100644 --- a/ruoyi-modules/ruoyi-goods/pom.xml +++ b/ruoyi-modules/ruoyi-goods/pom.xml @@ -111,7 +111,11 @@ </exclusion> </exclusions> </dependency> - + <!-- 分布式事务 --> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common-seata</artifactId> + </dependency> </dependencies> <build> diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java index b5c3e66..ab9d32a 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import com.ruoyi.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.enums.ClientTypeEnum; import com.ruoyi.common.core.enums.GroupStatusEnum; import com.ruoyi.common.core.enums.ListingStatusEnum; import com.ruoyi.common.core.enums.OrderStatusEnum; @@ -210,7 +211,7 @@ map.put("target_id", groupPurchaseId); map.put("message_type", "start"); String msg = objectMapper.writeValueAsString(map); - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); log.info("===================>发送websocket通知,消息体{}", msg); } } @@ -234,7 +235,7 @@ map.put("target_id", groupPurchaseId); map.put("message_type", "end"); String msg = objectMapper.writeValueAsString(map); - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); log.info("===================>发送websocket通知,消息体{}", msg); } } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java index 943b083..553a71f 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java @@ -9,6 +9,7 @@ import com.google.common.collect.Lists; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.enums.ClientTypeEnum; import com.ruoyi.common.core.enums.ListingStatusEnum; import com.ruoyi.common.core.enums.StartStatusEnum; import com.ruoyi.common.core.exception.ServiceException; @@ -212,7 +213,7 @@ map.put("target_id", seckillId); map.put("message_type", "start"); String msg = objectMapper.writeValueAsString(map); - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); log.info("===================>发送websocket通知,消息体{}", msg); } @@ -239,7 +240,7 @@ map.put("target_id", seckillId); map.put("message_type", "end"); String msg = objectMapper.writeValueAsString(map); - WebSocketUsers.sendMessageToUsersByText(msg); + WebSocketUsers.sendMessageToUsersByType(ClientTypeEnum.MEMBER.getCode(), msg); log.info("===================>发送websocket通知,消息体{}", msg); } diff --git a/ruoyi-modules/ruoyi-member/pom.xml b/ruoyi-modules/ruoyi-member/pom.xml index 03146e4..fbf1d52 100644 --- a/ruoyi-modules/ruoyi-member/pom.xml +++ b/ruoyi-modules/ruoyi-member/pom.xml @@ -137,6 +137,11 @@ </exclusions> </dependency> + <!-- 分布式事务 --> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common-seata</artifactId> + </dependency> </dependencies> <build> diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MemberPointsController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MemberPointsController.java new file mode 100644 index 0000000..5da24b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MemberPointsController.java @@ -0,0 +1,46 @@ +package com.ruoyi.member.controller.management; + + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.page.PageDTO; +import com.ruoyi.member.controller.management.dto.MgtMemberPointsQuery; +import com.ruoyi.member.controller.management.vo.MgtMemberPointsVO; +import com.ruoyi.member.service.IMemberPointsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +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; + +/** + * <p> + * 会员积分表 前端控制器 + * </p> + * + * @author mitao + * @since 2024-05-23 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/mgt/member-points") +@Api(value = "管理后台-会员积分管理相关接口", tags = "管理后台-会员积分管理相关接口") +public class MemberPointsController { + + private final IMemberPointsService iMemberPointsService; + + /** + * 获取会员积分列表的分页数据 + * + * @param query 会员积分明细查询对象 + * @return PageDTO<MgtMemberPointsVO> + */ + @ApiOperation(value = "获取会员积分列表的分页数据", notes = "会员积分列表的分页数据") + @PostMapping("/page") + public R<PageDTO<MgtMemberPointsVO>> getMemberPointsPage( + @Validated @RequestBody MgtMemberPointsQuery query) { + return R.ok(iMemberPointsService.getMemberPointsPage(query)); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/dto/MgtMemberPointsQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/dto/MgtMemberPointsQuery.java index 6cad328..395a2e8 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/dto/MgtMemberPointsQuery.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/dto/MgtMemberPointsQuery.java @@ -1,5 +1,6 @@ package com.ruoyi.member.controller.management.dto; +import com.ruoyi.common.core.enums.PointStatusEnum; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -18,6 +19,15 @@ private static final long serialVersionUID = -5584030212572003337L; - @ApiModelProperty(value = "积分id") + @ApiModelProperty(value = "会员id", notes = "会员管理-查看详情必传,积分管理不传") private Long id; + + @ApiModelProperty(value = "会员姓名") + private String nickname; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "变动类型 增加 减少") + private PointStatusEnum pointsStatus; } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/vo/MgtMemberPointsVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/vo/MgtMemberPointsVO.java index 165a448..de7ec8d 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/vo/MgtMemberPointsVO.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/vo/MgtMemberPointsVO.java @@ -35,4 +35,13 @@ @ApiModelProperty(value = "时间") private LocalDateTime createTime; + + @ApiModelProperty(value = "会员id") + private Long memberId; + + @ApiModelProperty(value = "会员姓名") + private String nickname; + + @ApiModelProperty(value = "联系电话") + private String phone; } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/IMemberPointsService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/IMemberPointsService.java index a5f27d2..f1bf9c7 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/IMemberPointsService.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/IMemberPointsService.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.utils.page.PageDTO; +import com.ruoyi.member.controller.management.dto.MgtMemberPointsQuery; +import com.ruoyi.member.controller.management.vo.MgtMemberPointsVO; import com.ruoyi.system.api.domain.MemberPoints; import com.ruoyi.system.api.domain.dto.MemberDTO; @@ -17,4 +19,11 @@ PageDTO<MemberPoints> getMemberPoints(MemberDTO memberDTO); + /** + * 获取会员积分列表的分页数据 + * + * @param query 会员积分明细查询对象 + * @return PageDTO<MgtMemberPointsVO> + */ + PageDTO<MgtMemberPointsVO> getMemberPointsPage(MgtMemberPointsQuery query); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java index 0cd4e91..05e3d6d 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java @@ -4,11 +4,23 @@ 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.common.core.constant.SecurityConstants; +import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.PageDTO; -import com.ruoyi.system.api.domain.MemberPoints; -import com.ruoyi.system.api.domain.dto.MemberDTO; +import com.ruoyi.member.controller.management.dto.MgtMemberPointsQuery; +import com.ruoyi.member.controller.management.vo.MgtMemberPointsVO; import com.ruoyi.member.mapper.MemberPointsMapper; import com.ruoyi.member.service.IMemberPointsService; +import com.ruoyi.system.api.domain.Member; +import com.ruoyi.system.api.domain.MemberPoints; +import com.ruoyi.system.api.domain.dto.MemberDTO; +import com.ruoyi.system.api.feignClient.MemberClient; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -20,8 +32,10 @@ * @since 2024-05-23 */ @Service +@RequiredArgsConstructor public class MemberPointsServiceImpl extends ServiceImpl<MemberPointsMapper, MemberPoints> implements IMemberPointsService { + private final MemberClient memberClient; @Override public PageDTO<MemberPoints> getMemberPoints(MemberDTO memberDTO) { @@ -31,4 +45,69 @@ Page<MemberPoints> page1 = this.page(page, wrapper); return PageDTO.of(page1); } + + /** + * 获取会员积分列表的分页数据 + * + * @param query 会员积分明细查询对象 + * @return PageDTO<MgtMemberPointsVO> + */ + @Override + public PageDTO<MgtMemberPointsVO> getMemberPointsPage(MgtMemberPointsQuery query) { + Set<Long> memberIdSet = null; + MemberDTO memberDTO = getMemberQueryParam(query); + if (StringUtils.isNotNull(memberDTO)) { + memberIdSet = getMemberIdSet(memberDTO); + } + // 分页查询积分 + Page<MemberPoints> page = this.lambdaQuery() + .eq(StringUtils.isNotNull(query.getPointsStatus()), MemberPoints::getPointsStatus, + query.getPointsStatus()) + .in(StringUtils.isNotEmpty(memberIdSet), MemberPoints::getMemberId, memberIdSet) + .page(new Page<>(query.getPageCurr(), query.getPageSize())); + if (StringUtils.isEmpty(page.getRecords())) { + return PageDTO.empty(page); + } + // 封装VO + PageDTO<MgtMemberPointsVO> pageVO = PageDTO.of(page, + MgtMemberPointsVO.class); + List<MgtMemberPointsVO> list = pageVO.getList(); + Set<Long> memIdSet = list.stream().map(MgtMemberPointsVO::getMemberId) + .collect(Collectors.toSet()); + List<Member> memberList = memberClient.getMemberListByIds(memIdSet, SecurityConstants.INNER) + .getData(); + Map<Long, Member> memberMap = memberList.stream() + .collect(Collectors.toMap(Member::getId, Function.identity())); + if (StringUtils.isNotEmpty(memberList)) { + for (MgtMemberPointsVO mgtMemberPointsVO : list) { + Member member = memberMap.get(mgtMemberPointsVO.getMemberId()); + if (StringUtils.isNotNull(member)) { + mgtMemberPointsVO.setNickname(member.getNickname()); + mgtMemberPointsVO.setPhone(member.getPhone()); + } + } + } + return pageVO; + } + + private Set<Long> getMemberIdSet(MemberDTO memberDTO) { + Set<Long> memberIdSet = null; + if (StringUtils.isNotNull(memberDTO)) { + List<Member> data = memberClient.getMemberListByCondition(memberDTO, + SecurityConstants.INNER).getData(); + memberIdSet = data.stream().map(Member::getId).collect(Collectors.toSet()); + } + return memberIdSet; + } + + private static MemberDTO getMemberQueryParam(MgtMemberPointsQuery query) { + MemberDTO memberDTO = null; + if (StringUtils.isNotBlank(query.getNickname()) || StringUtils.isNotBlank( + query.getPhone())) { + memberDTO = new MemberDTO(); + memberDTO.setNickname(query.getNickname()); + memberDTO.setPhone(query.getPhone()); + } + return memberDTO; + } } diff --git a/ruoyi-modules/ruoyi-order/pom.xml b/ruoyi-modules/ruoyi-order/pom.xml index 627780c..65bed5a 100644 --- a/ruoyi-modules/ruoyi-order/pom.xml +++ b/ruoyi-modules/ruoyi-order/pom.xml @@ -145,7 +145,11 @@ <scope>compile</scope> </dependency> - + <!-- 分布式事务 --> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common-seata</artifactId> + </dependency> </dependencies> <build> diff --git a/ruoyi-modules/ruoyi-promotion/pom.xml b/ruoyi-modules/ruoyi-promotion/pom.xml index 35961a0..152e530 100644 --- a/ruoyi-modules/ruoyi-promotion/pom.xml +++ b/ruoyi-modules/ruoyi-promotion/pom.xml @@ -101,18 +101,18 @@ <version>1.2.47</version> </dependency> + <!--EasyExcel--> <dependency> - <groupId>cn.afterturn</groupId> - <artifactId>easypoi-spring-boot-starter</artifactId> - <version>4.0.0</version> - <exclusions> - <exclusion> - <artifactId>guava</artifactId> - <groupId>com.google.guava</groupId> - </exclusion> - </exclusions> + <groupId>com.alibaba</groupId> + <artifactId>easyexcel</artifactId> + <version>3.3.4</version> </dependency> + <!-- 分布式事务 --> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common-seata</artifactId> + </dependency> </dependencies> <build> diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtCouponController.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtCouponController.java index af8bba0..fe1e4e4 100644 --- a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtCouponController.java +++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtCouponController.java @@ -1,6 +1,10 @@ package com.ruoyi.promotion.controller.management; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.util.DateUtils; +import com.alibaba.excel.write.metadata.WriteSheet; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.promotion.controller.management.dto.MgtCouponDTO; @@ -14,6 +18,8 @@ import com.ruoyi.system.api.validate.ModifyGroup; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import java.util.Date; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; @@ -99,4 +105,25 @@ @Validated @RequestBody MgtCouponReceiveQuery query) { return R.ok(couponService.getReceiveDetail(query)); } + + /** + * 导出优惠券领取详情 + * + * @param query 管理后台-优惠券领取详情查询对象 + */ + @ApiOperation("领取详情-导出") + @PostMapping("/receive-detail/export") + public void exportReceiveDetail(@RequestBody MgtCouponReceiveQuery query) { + List<CouponReceiveDetailVO> couponReceiveDetailVOList = couponService.getCouponReceiveDetailList( + query); + String fileName = + "优惠券领取明细" + DateUtils.format(new Date(), "yyyyMMddHHmmss") + ".xlsx"; + + try (ExcelWriter excelWriter = EasyExcel.write(fileName, CouponReceiveDetailVO.class) + .build()) { + WriteSheet writeSheet = EasyExcel.writerSheet("优惠券领取详情").build(); + excelWriter.write(couponReceiveDetailVOList, writeSheet); + } + } + } diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponReceiveQuery.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponReceiveQuery.java index 547886e..ead7151 100644 --- a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponReceiveQuery.java +++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponReceiveQuery.java @@ -23,7 +23,7 @@ private Long id; @ApiModelProperty(value = "会员姓名") - private String realName; + private String nickname; @ApiModelProperty(value = "联系电话") private String phone; diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/CouponReceiveDetailVO.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/CouponReceiveDetailVO.java index 61c80c1..53bcf10 100644 --- a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/CouponReceiveDetailVO.java +++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/CouponReceiveDetailVO.java @@ -1,9 +1,12 @@ package com.ruoyi.promotion.controller.management.vo; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.enums.CouponUseEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; import java.time.LocalDateTime; import lombok.Data; @@ -13,28 +16,37 @@ */ @Data @ApiModel(value = "管理后台-优惠券领取详情视图对象", description = "管理后台-优惠券领取详情视图对象") -public class CouponReceiveDetailVO { +public class CouponReceiveDetailVO implements Serializable { + + private static final long serialVersionUID = 7898162954825380293L; @ApiModelProperty(value = "优惠券id") + @ExcelIgnore private Long couponId; @ApiModelProperty(value = "优惠券id") + @ExcelIgnore private Long memberId; @ApiModelProperty(value = "会员姓名") - private String realName; + @ExcelProperty("会员姓名") + private String nickname; @ApiModelProperty(value = "联系电话") + @ExcelProperty("联系电话") private String phone; - @ApiModelProperty(value = "订单编号") + @ApiModelProperty(value = "使用订单") + @ExcelProperty("使用订单") private String orderNo; @ApiModelProperty(value = "使用时间") + @ExcelProperty("使用时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; - @ApiModelProperty(value = "优惠券状态 0:未使用, 1:已使用") + @ApiModelProperty(value = "使用状态 0:未使用, 1:已使用") + @ExcelProperty("使用状态") private CouponUseEnum couponStatus; } diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/ICouponService.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/ICouponService.java index eb05110..6b5a0bb 100644 --- a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/ICouponService.java +++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/ICouponService.java @@ -9,6 +9,7 @@ import com.ruoyi.promotion.controller.management.vo.CouponReceiveDetailVO; import com.ruoyi.promotion.controller.management.vo.MgtCouponVO; import com.ruoyi.promotion.domain.Coupon; +import java.util.List; /** * <p> @@ -51,4 +52,12 @@ * @return PageDTO<CouponReceiveDetailVO> */ PageDTO<CouponReceiveDetailVO> getReceiveDetail(MgtCouponReceiveQuery query); + + /** + * 查询领取详情列表 + * + * @param query 管理后台-优惠券领取详情查询对象 + * @return List<CouponReceiveDetailVO> + */ + List<CouponReceiveDetailVO> getCouponReceiveDetailList(MgtCouponReceiveQuery query); } diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java index a7455d7..ec17393 100644 --- a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java +++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java @@ -175,19 +175,8 @@ */ @Override public PageDTO<CouponReceiveDetailVO> getReceiveDetail(MgtCouponReceiveQuery query) { - MemberDTO memberDTO = null; - Set<Long> memberIdSet = null; - if (StringUtils.isNotBlank(query.getRealName()) || StringUtils.isNotBlank( - query.getPhone())) { - memberDTO = new MemberDTO(); - memberDTO.setRealName(query.getRealName()); - memberDTO.setPhone(query.getPhone()); - } - if (StringUtils.isNotNull(memberDTO)) { - List<Member> data = memberClient.getMemberListByCondition(memberDTO, - SecurityConstants.INNER).getData(); - memberIdSet = data.stream().map(Member::getId).collect(Collectors.toSet()); - } + MemberDTO memberDTO = getMemberQueryParam(query); + Set<Long> memberIdSet = getMemberIdSet(memberDTO); Page<CouponMember> page = couponMemberService.lambdaQuery() .eq(StringUtils.isNotNull(query.getCouponStatus()), CouponMember::getCouponStatus, query.getCouponStatus()) @@ -199,22 +188,15 @@ } PageDTO<CouponReceiveDetailVO> couponReceiveDetailVOPageDTO = PageDTO.of(page, CouponReceiveDetailVO.class); - // 远程调用会员服务,获取会员信息 - List<Long> memberIdList = page.getRecords().stream().map(CouponMember::getMemberId) - .collect(Collectors.toList()); - if (StringUtils.isNotEmpty(memberIdList)) { - List<Member> memberList = memberClient.getMemberListByIds(memberIdList, - SecurityConstants.INNER).getData(); - Map<Long, Member> memberMap = memberList.stream() - .collect(Collectors.toMap(Member::getId, Function.identity())); - couponReceiveDetailVOPageDTO.getList().forEach(item -> { - Member member = memberMap.get(item.getMemberId()); - item.setRealName(member.getRealName()); - item.setPhone(member.getPhone()); - }); - } + List<CouponReceiveDetailVO> couponReceiveDetailVOList = couponReceiveDetailVOPageDTO.getList(); + handleCouponReceiveDetailVO(couponReceiveDetailVOList); + return couponReceiveDetailVOPageDTO; + } + + private void handleCouponReceiveDetailVO( + List<CouponReceiveDetailVO> couponReceiveDetailVOList) { // 远程调用订单服务,获取订单信息 - List<CouponReceiveDetailVO> usedCouponList = couponReceiveDetailVOPageDTO.getList().stream() + List<CouponReceiveDetailVO> usedCouponList = couponReceiveDetailVOList.stream() .filter(item -> item.getCouponStatus().equals( CouponUseEnum.USED)).collect(Collectors.toList()); Set<Long> couponIdSet = usedCouponList.stream().map(CouponReceiveDetailVO::getCouponId) @@ -229,7 +211,8 @@ Function.identity())); } - Set<Long> memberSet = couponReceiveDetailVOPageDTO.getList().stream() + // 远程调用会员服务,获取会员信息 + Set<Long> memberSet = couponReceiveDetailVOList.stream() .map(CouponReceiveDetailVO::getMemberId).collect( Collectors.toSet()); if (StringUtils.isNotEmpty(memberSet)) { @@ -239,11 +222,11 @@ Collectors.toMap(Member::getId, Function.identity())); } // 封装VO - for (CouponReceiveDetailVO couponReceiveDetailVO : couponReceiveDetailVOPageDTO.getList()) { + for (CouponReceiveDetailVO couponReceiveDetailVO : couponReceiveDetailVOList) { if (StringUtils.isNotEmpty(memberMap)) { Member member = memberMap.get(couponReceiveDetailVO.getMemberId()); if (StringUtils.isNotNull(member)) { - couponReceiveDetailVO.setRealName(member.getRealName()); + couponReceiveDetailVO.setNickname(member.getNickname()); couponReceiveDetailVO.setPhone(member.getPhone()); } } else if (StringUtils.isNotEmpty(orderMap)) { @@ -257,6 +240,51 @@ break; } } - return couponReceiveDetailVOPageDTO; + } + + private Set<Long> getMemberIdSet(MemberDTO memberDTO) { + Set<Long> memberIdSet = null; + if (StringUtils.isNotNull(memberDTO)) { + List<Member> data = memberClient.getMemberListByCondition(memberDTO, + SecurityConstants.INNER).getData(); + memberIdSet = data.stream().map(Member::getId).collect(Collectors.toSet()); + } + return memberIdSet; + } + + private static MemberDTO getMemberQueryParam(MgtCouponReceiveQuery query) { + MemberDTO memberDTO = null; + if (StringUtils.isNotBlank(query.getNickname()) || StringUtils.isNotBlank( + query.getPhone())) { + memberDTO = new MemberDTO(); + memberDTO.setNickname(query.getNickname()); + memberDTO.setPhone(query.getPhone()); + } + return memberDTO; + } + + /** + * 查询领取详情列表 + * + * @param query 管理后台-优惠券领取详情查询对象 + * @return List<CouponReceiveDetailVO> + */ + @Override + public List<CouponReceiveDetailVO> getCouponReceiveDetailList(MgtCouponReceiveQuery query) { + MemberDTO memberDTO = getMemberQueryParam(query); + Set<Long> memberIdSet = getMemberIdSet(memberDTO); + List<CouponMember> couponMemberList = couponMemberService.lambdaQuery() + .eq(StringUtils.isNotNull(query.getCouponStatus()), + CouponMember::getCouponStatus, query.getCouponStatus()) + .in(StringUtils.isNotEmpty(memberIdSet), CouponMember::getMemberId, memberIdSet) + .eq(CouponMember::getCouponId, query.getId()) + .list(); + if (StringUtils.isEmpty(couponMemberList)) { + throw new ServiceException("没有符合条件的数据导出"); + } + List<CouponReceiveDetailVO> couponReceiveDetailVOList = BeanUtils.copyList(couponMemberList, + CouponReceiveDetailVO.class); + handleCouponReceiveDetailVO(couponReceiveDetailVOList); + return couponReceiveDetailVOList; } } diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml index 0b6c48a..579270f 100644 --- a/ruoyi-modules/ruoyi-system/pom.xml +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -95,6 +95,12 @@ <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> + + <!-- 分布式事务 --> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common-seata</artifactId> + </dependency> </dependencies> <build> diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomConfigController.java index 3299eba..e6a8e54 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomConfigController.java @@ -5,14 +5,17 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.CustomConfig; +import com.ruoyi.system.domain.dto.PointsConfigDTO; import com.ruoyi.system.service.ICustomConfigService; +import io.swagger.annotations.ApiOperation; +import javax.annotation.Resource; +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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; - import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; /** * <p> @@ -35,4 +38,16 @@ CustomConfig one = iCustomConfigService.getOne(wrapper); return R.ok(one); } + + /** + * 保存积分设置 + * + * @param dto 积分配置数据传输对象 + */ + @ApiOperation(value = "保存积分设置") + @PostMapping("/save-points") + public R<?> savePointsSettings(@Validated @RequestBody PointsConfigDTO dto) { + iCustomConfigService.savePointsSettings(dto); + return R.ok(); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/PointsConfigDTO.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/PointsConfigDTO.java new file mode 100644 index 0000000..0b693a7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/PointsConfigDTO.java @@ -0,0 +1,27 @@ +package com.ruoyi.system.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.math.BigDecimal; +import javax.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author mitao + * @date 2024/6/11 + */ +@Data +@ApiModel(value = "积分配置数据传输对象", description = "积分配置数据传输对象") +public class PointsConfigDTO implements Serializable { + + private static final long serialVersionUID = 8009805126467325247L; + + @ApiModelProperty(value = "消费金额") + @NotNull(message = "消费金额不能为空") + private BigDecimal consumeAmount; + + @ApiModelProperty(value = "积分") + @NotNull(message = "积分不能为空") + private Integer points; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomConfigService.java index bb5dcec..c0318fc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomConfigService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomConfigService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.api.domain.CustomConfig; +import com.ruoyi.system.domain.dto.PointsConfigDTO; /** * <p> @@ -13,4 +14,5 @@ */ public interface ICustomConfigService extends IService<CustomConfig> { + void savePointsSettings(PointsConfigDTO dto); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomConfigServiceImpl.java index caf3178..b144cf6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomConfigServiceImpl.java @@ -1,10 +1,16 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.ruoyi.system.api.constants.ConfigEnum; import com.ruoyi.system.api.domain.CustomConfig; +import com.ruoyi.system.domain.dto.PointsConfigDTO; import com.ruoyi.system.mapper.CustomConfigMapper; import com.ruoyi.system.service.ICustomConfigService; +import java.util.Optional; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; /** * <p> @@ -17,4 +23,35 @@ @Service public class CustomConfigServiceImpl extends ServiceImpl<CustomConfigMapper, CustomConfig> implements ICustomConfigService { + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void savePointsSettings(PointsConfigDTO dto) { + Optional<CustomConfig> customConfigOptional = getCustomConfigByKey( + ConfigEnum.MEMBER_POINTS_MONEY.getKey()); + CustomConfig moneyConfig = customConfigOptional.orElseGet(() -> { + CustomConfig config = new CustomConfig(); + config.setConfigKey(ConfigEnum.MEMBER_POINTS_MONEY.getKey()); + config.setConfigType(ConfigEnum.MEMBER_POINTS_MONEY.getKeyType()); + config.setConfigName(ConfigEnum.MEMBER_POINTS_MONEY.getKeyName()); + return config; + }); + moneyConfig.setConfigValue(dto.getConsumeAmount().toString()); + Optional<CustomConfig> customConfigByKey = getCustomConfigByKey( + ConfigEnum.MEMBER_POINTS_POINTS.getKey()); + CustomConfig pointsConfig = customConfigByKey.orElseGet(() -> { + CustomConfig config = new CustomConfig(); + config.setConfigKey(ConfigEnum.MEMBER_POINTS_POINTS.getKey()); + config.setConfigType(ConfigEnum.MEMBER_POINTS_POINTS.getKeyType()); + config.setConfigName(ConfigEnum.MEMBER_POINTS_POINTS.getKeyName()); + return config; + }); + pointsConfig.setConfigValue(dto.getPoints().toString()); + this.saveOrUpdateBatch(Lists.newArrayList(moneyConfig, pointsConfig)); + } + + private Optional<CustomConfig> getCustomConfigByKey(String key) { + return this.lambdaQuery() + .eq(CustomConfig::getConfigType, key) + .eq(CustomConfig::getDelFlag, 0).oneOpt(); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer.java index aa555c0..33ae939 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer.java @@ -7,6 +7,7 @@ import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; +import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,83 +16,57 @@ /** * websocket 消息处理 * - * @author ruoyi + * @作者 ruoyi */ @Component -@ServerEndpoint("/websocket/message") +@ServerEndpoint("/websocket/message/{clientType}") public class WebSocketServer { - /** - * WebSocketServer 日志控制器 - */ private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class); - - /** - * 默认最多允许同时在线人数100 - */ - public static int socketMaxOnlineCount = 100; - + public static int socketMaxOnlineCount = 1000; private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount); - /** - * 连接建立成功调用的方法 - */ @OnOpen - public void onOpen(Session session) throws Exception { + public void onOpen(Session session, @PathParam("clientType") Integer clientType) + throws Exception { boolean semaphoreFlag = false; - // 尝试获取信号量 semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore); if (!semaphoreFlag) { - // 未获取到信号量 LOGGER.error("\n 当前在线人数超过限制数- {}", socketMaxOnlineCount); WebSocketUsers.sendMessageToUserByText(session, "当前在线人数超过限制数:" + socketMaxOnlineCount); session.close(); } else { - // 添加用户 - WebSocketUsers.put(session.getId(), session); + WebSocketUsers.put(session.getId(), session, clientType); LOGGER.info("\n 建立连接 - {}", session); LOGGER.info("\n 当前人数 - {}", WebSocketUsers.getUsers().size()); WebSocketUsers.sendMessageToUserByText(session, "连接成功"); } } - /** - * 连接关闭时处理 - */ @OnClose public void onClose(Session session) { LOGGER.info("\n 关闭连接 - {}", session); - // 移除用户 WebSocketUsers.remove(session.getId()); - // 获取到信号量则需释放 SemaphoreUtils.release(socketSemaphore); } - /** - * 抛出异常时处理 - */ @OnError public void onError(Session session, Throwable exception) throws Exception { if (session.isOpen()) { - // 关闭连接 session.close(); } String sessionId = session.getId(); LOGGER.info("\n 连接异常 - {}", sessionId); LOGGER.info("\n 异常信息 - {}", exception); - // 移出用户 WebSocketUsers.remove(sessionId); - // 获取到信号量则需释放 SemaphoreUtils.release(socketSemaphore); } - /** - * 服务器接收到客户端消息时调用的方法 - */ @OnMessage public void onMessage(String message, Session session) { - String msg = message.replace("你", "我").replace("吗", ""); + String msg = message.replace("你", "我").replace("吗", "").replace("PING", "PONG") + .replace("ping", "pong"); WebSocketUsers.sendMessageToUserByText(session, msg); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer_Bak.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer_Bak.java new file mode 100644 index 0000000..8e8fafc --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/websocket/WebSocketServer_Bak.java @@ -0,0 +1,97 @@ +package com.ruoyi.system.websocket; + +import com.ruoyi.system.api.util.WebSocketUsers_Bak; +import java.util.concurrent.Semaphore; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * websocket 消息处理 + * + * @author ruoyi + */ +@Component +@ServerEndpoint("/websocket/message") +public class WebSocketServer_Bak { + + /** + * WebSocketServer 日志控制器 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer_Bak.class); + + /** + * 默认最多允许同时在线人数100 + */ + public static int socketMaxOnlineCount = 100; + + private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount); + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session) throws Exception { + boolean semaphoreFlag = false; + // 尝试获取信号量 + semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore); + if (!semaphoreFlag) { + // 未获取到信号量 + LOGGER.error("\n 当前在线人数超过限制数- {}", socketMaxOnlineCount); + WebSocketUsers_Bak.sendMessageToUserByText(session, + "当前在线人数超过限制数:" + socketMaxOnlineCount); + session.close(); + } else { + // 添加用户 + WebSocketUsers_Bak.put(session.getId(), session); + LOGGER.info("\n 建立连接 - {}", session); + LOGGER.info("\n 当前人数 - {}", WebSocketUsers_Bak.getUsers().size()); + WebSocketUsers_Bak.sendMessageToUserByText(session, "连接成功"); + } + } + + /** + * 连接关闭时处理 + */ + @OnClose + public void onClose(Session session) { + LOGGER.info("\n 关闭连接 - {}", session); + // 移除用户 + WebSocketUsers_Bak.remove(session.getId()); + // 获取到信号量则需释放 + SemaphoreUtils.release(socketSemaphore); + } + + /** + * 抛出异常时处理 + */ + @OnError + public void onError(Session session, Throwable exception) throws Exception { + if (session.isOpen()) { + // 关闭连接 + session.close(); + } + String sessionId = session.getId(); + LOGGER.info("\n 连接异常 - {}", sessionId); + LOGGER.info("\n 异常信息 - {}", exception); + // 移出用户 + WebSocketUsers_Bak.remove(sessionId); + // 获取到信号量则需释放 + SemaphoreUtils.release(socketSemaphore); + } + + /** + * 服务器接收到客户端消息时调用的方法 + */ + @OnMessage + public void onMessage(String message, Session session) { + String msg = message.replace("你", "我").replace("吗", ""); + WebSocketUsers_Bak.sendMessageToUserByText(session, msg); + } +} -- Gitblit v1.7.1