From ce0403c1d94ba031ecc832d0acfcb3650c33ef6b Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期五, 14 二月 2025 17:02:23 +0800 Subject: [PATCH] 管理后台:会员管理、心愿求管理 --- ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java | 10 + ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuthClient.java | 7 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java | 3 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java | 145 ++++++++++++++- ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java | 113 +++++++++++- ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuthFallbackFactory.java | 6 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtMemberController.java | 8 ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml | 2 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/WebsocketMessageDTO.java | 4 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/SmsSendDTO.java | 29 +++ ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java | 107 +++++++++++ ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java | 6 ruoyi-auth/src/main/java/com/ruoyi/auth/utils/JuTongDaSMSUtil.java | 37 ++++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java | 3 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java | 5 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java | 4 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java | 2 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java | 4 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java | 8 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomController.java | 2 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java | 2 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WebSocketController.java | 11 + ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java | 2 23 files changed, 472 insertions(+), 48 deletions(-) diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java index 1d36a1f..e6be21c 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java @@ -13,4 +13,8 @@ String AUCTION_SALESROOM = "auction_salesroom"; String AUCTION_SALESROOM_GOODS = "auction_salesroom_goods"; + /** + * 拍卖弹窗 + */ + String AUCTION_POPUP = "auction_popup"; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java index 8710c60..74d8b73 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Member.java @@ -111,6 +111,7 @@ @ApiModelProperty(value = "用户消费金额") private BigDecimal money; - - + + @ApiModelProperty(value = "会员分类(1:普通用户;2:会员用户;3:超级会员用户;)") + private Integer vipClassify; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/WebsocketMessageDTO.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/WebsocketMessageDTO.java index 75c9c16..81fcd90 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/WebsocketMessageDTO.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/WebsocketMessageDTO.java @@ -29,4 +29,8 @@ * 消息 */ private String message; + /** + * 用户id + */ + private Long userId; } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/SmsSendDTO.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/SmsSendDTO.java new file mode 100644 index 0000000..1aa9fae --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/SmsSendDTO.java @@ -0,0 +1,29 @@ +package com.ruoyi.system.api.domain.dto; + +import io.swagger.annotations.ApiModel; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author mitao + * @date 2025/2/11 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel("短信发送数据传输对象") +public class SmsSendDTO { + + /** + * 电话列表 + */ + private List<String> mobileList; + /** + * 发送内容 + */ + private String content; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuthFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuthFallbackFactory.java index fcdf00d..f1ffc4e 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuthFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuthFallbackFactory.java @@ -1,6 +1,7 @@ package com.ruoyi.system.api.factory; import com.ruoyi.common.core.domain.R; +import com.ruoyi.system.api.domain.dto.SmsSendDTO; import com.ruoyi.system.api.feignClient.AuthClient; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; @@ -15,6 +16,11 @@ public R<?> logout(String token, String source) { return R.fail("强制下线失败:" + cause.getMessage()); } + + @Override + public R<?> sendSms(SmsSendDTO smsSendDTO, String source) { + return R.fail("批量发送短信失败" + cause.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java index d175514..b72738d 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java @@ -35,7 +35,7 @@ @Override - public R<Boolean> saveOrderOne(OrderDTO orderDTO, String source) { + public R<Long> saveOrderOne(OrderDTO orderDTO, String source) { return R.fail("保存订单失败:" + cause.getMessage()); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java index 12410c9..e9b28eb 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java @@ -113,6 +113,12 @@ return R.fail("向所有用户发送websocket消息失败:" + cause.getMessage()); } + + @Override + public R<?> pushBatch(WebsocketMessageDTO dto, String source) { + return R.fail("批量向指定用户发送websocket消息失败:" + + cause.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuthClient.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuthClient.java index 1cd1b98..8c28069 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuthClient.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuthClient.java @@ -3,9 +3,12 @@ import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; +import com.ruoyi.system.api.domain.dto.SmsSendDTO; import com.ruoyi.system.api.factory.AuthFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestParam; @@ -19,4 +22,8 @@ @GetMapping("/inner/logout") R<?> logout(@RequestParam("token") String token, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + @PostMapping("/sms/send") + R<?> sendSms(@RequestBody SmsSendDTO smsSendDTO, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java index 2e7746f..2fde7c8 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java @@ -36,7 +36,7 @@ public interface OrderClient { @PostMapping("/order/saveOrderOne") - R<Boolean> saveOrderOne(@RequestBody OrderDTO orderDTO, + R<Long> saveOrderOne(@RequestBody OrderDTO orderDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java index 7b415c2..8e0397b 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java @@ -112,4 +112,14 @@ @GetMapping("/websocket/push-all/{message}") R<?> pushAll(@PathVariable("message") String message, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 批量向指定用户推送消息 + * @param dto + * @return + */ + @PostMapping("/websocket/push-batch") + R<?> pushBatch(@RequestBody WebsocketMessageDTO dto, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + } diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java index 7857a8d..7d97da1 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java @@ -25,6 +25,7 @@ import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO; +import com.ruoyi.system.api.domain.dto.SmsSendDTO; import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.LoginUser; @@ -241,6 +242,13 @@ } return AjaxResult.success(memberList); } + + @InnerAuth + @PostMapping("/sms/send") + public R<?> sendSms(@RequestBody SmsSendDTO smsSendDTO) { + JuTongDaSMSUtil.smsSendBatch(smsSendDTO.getMobileList(), smsSendDTO.getContent(), "", ""); + return R.ok(); + } } diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/utils/JuTongDaSMSUtil.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/utils/JuTongDaSMSUtil.java index 621e6a1..b598a38 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/utils/JuTongDaSMSUtil.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/utils/JuTongDaSMSUtil.java @@ -10,6 +10,8 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Base64; +import java.util.List; +import lombok.extern.slf4j.Slf4j; /** * 聚通达短信发送工具类 @@ -17,6 +19,7 @@ * @author mitao * @date 2024/6/17 */ +@Slf4j public class JuTongDaSMSUtil { private static final String UID = "201000"; @@ -67,7 +70,41 @@ return errMess; } + public static void smsSendBatch(List<String> mobileList, String content, + String ext, String attime) { + for (String mobile : mobileList) { + String errMess = ""; + StringBuffer sendData = new StringBuffer(""); + try { + sendData.append("uid=").append(UID); // 用户名 + String pwd = getMD5(PWD);// 原始密码做MD5加密,32位大写格式 + sendData.append("&password=").append(pwd); // 密码 + sendData.append("&encode=").append("GBK"); // encode=GBK或者encode=utf8 + content = template.replace("${code}", content); + String contentBase64 = Base64.getEncoder() + .encodeToString(content.getBytes("gbk"));// 先用encode中定义的格式编码,再用base64加密内容 + sendData.append("&encodeType=base64"); // 固定 + sendData.append("&content=").append(contentBase64); // base64加密后的内容 + + sendData.append("&mobile=").append(mobile); // 手机号 +// sendData.append("&cid=").append("45955855252252555"); // 唯一标识,选填,如果不填系统自动生成作为当前批次的唯一标识 + if (!StringUtils.isNotBlank(ext)) { + sendData.append("&extNumber=").append(ext); // 扩展 + } + + if (!StringUtils.isNotBlank(attime)) { + sendData.append("&schtime=").append(attime); // 定时时间,选填,格式2008-06-09 12:00:00 + } + errMess = sendPost("https://sms3api.jvtd.cn/jtdsms/smsSend", + sendData.toString());// 普通短信 +// errMess =sendPost("http://ip:8090/jtdsms/sendData.do", sendData.toString());//个性短信 + } catch (Exception e) { + log.error("发送短信异常:", e); + errMess = "-601"; + } + } + } public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomController.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomController.java index 2ec17bf..6f770d5 100644 --- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomController.java +++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomController.java @@ -220,7 +220,7 @@ auctionSalesroom.setIsState(1); auctionBondJlMapper.updateById(auctionSalesroom); } - return R.ok( ); + return R.ok(); } /** diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java index c23f9f1..52554ed 100644 --- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java +++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBidRecord.java @@ -88,5 +88,6 @@ @ApiModelProperty(value = "用户名") private String nickname; - + @ApiModelProperty("关联订单id") + private Long orderId; } 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 080abca..8924c2b 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 @@ -1,5 +1,6 @@ package com.ruoyi.auction.service.impl; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -57,11 +58,13 @@ import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO; import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; +import com.ruoyi.system.api.domain.dto.SmsSendDTO; import com.ruoyi.system.api.domain.vo.AuctionGoodsListVO; import com.ruoyi.system.api.domain.vo.AuctionGoodsinfoVO; import com.ruoyi.system.api.domain.vo.GoodsInfoTitleValueVO; import com.ruoyi.system.api.domain.vo.getHomeGoodsSkuXxiVO; import com.ruoyi.system.api.feignClient.AuctionClient; +import com.ruoyi.system.api.feignClient.AuthClient; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.OrderClient; @@ -73,6 +76,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -120,6 +124,10 @@ @Resource private AuctionBondJlMapper auctionBondJlMapper; + @Resource + private AuthClient authClient; + private static final String SUCCESS_TEMPLATE = "【酒鼎老酒】恭喜!您参与的“content”竞拍已中拍!"; + private static final String FAILED_TEMPLATE = "【酒鼎老酒】很遗憾!您参与的”content“竞拍未中拍!"; /** * 获取拍卖商品列表的分页数据 @@ -358,13 +366,12 @@ SecurityConstants.INNER); } - auctionBidRecordService.updateBatchById(auctionBidRecordList); - // 创建待支付订单 CustomConfig moneyConfig = sysUserClient.getconfig( ConfigEnum.MEMBER_POINTS_MONEY.getKey()).getData(); CustomConfig pointsConfig = sysUserClient.getconfig( ConfigEnum.MEMBER_POINTS_POINTS.getKey()).getData(); + Map<Long, String> orderIdMap = new HashMap<>(); for (AuctionBidRecord auctionBidRecord : auctionBidRecordList) { BigDecimal lastBidAmount = auctionBidRecord.getLastBidAmount(); BigDecimal divide = lastBidAmount.divide( @@ -397,7 +404,52 @@ } orderDTO.setOrderTimeSx(auctionGoods.getEndTime()); orderDTO.setGoodsId(auctionGoods.getGoodsSkuId()); - orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER); + Long orderId = orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER) + .getData(); + if (Objects.nonNull(orderId)) { + orderIdMap.put(auctionBidRecord.getMemberId(), orderId.toString()); + auctionBidRecord.setOrderId(orderId); + } + } + // 更新出价记录 + auctionBidRecordService.updateBatchById(auctionBidRecordList); + List<Long> successMemberIdList = auctionBidRecords.stream() + .filter(auctionBidRecord -> auctionBidRecord.getStatus() + .equals(BidStatusEnum.SUCCESSFUL)) + .map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + List<Long> failedMemberIdList = auctionBidRecords.stream() + .filter(auctionBidRecord -> !auctionBidRecord.getStatus() + .equals(BidStatusEnum.SUCCESSFUL)) + .map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + if (CollUtils.isNotEmpty(successMemberIdList)) { + List<Member> successMemberList = memberClient.getMemberListByIds( + successMemberIdList, SecurityConstants.INNER).getData(); + if (CollUtils.isNotEmpty(successMemberList)) { + // 推送websocket消息 + sendWebsocketMsg(id, successMemberList, goodsSku, 1, orderIdMap); + // 发送短信通知 + List<String> mobileList = successMemberList.stream().map(Member::getPhone) + .collect(Collectors.toList()); + authClient.sendSms(SmsSendDTO.builder().mobileList(mobileList) + .content(SUCCESS_TEMPLATE.replace("content", goodsSku.getSkuName())) + .build(), SecurityConstants.INNER); + } + } + if (CollUtils.isNotEmpty(failedMemberIdList)) { + List<Member> failedMemberList = memberClient.getMemberListByIds( + failedMemberIdList, SecurityConstants.INNER).getData(); + if (CollUtils.isNotEmpty(failedMemberList)) { + // 推送websocket消息 + sendWebsocketMsg(id, failedMemberList, goodsSku, 0, orderIdMap); + // 发送短信通知 + List<String> mobileList = failedMemberList.stream().map(Member::getPhone) + .collect(Collectors.toList()); + authClient.sendSms(SmsSendDTO.builder().mobileList(mobileList) + .content(FAILED_TEMPLATE.replace("content", goodsSku.getSkuName())) + .build(), SecurityConstants.INNER); + } } } else { // 没有人出价,退回拍卖商品库存 @@ -460,6 +512,31 @@ SecurityConstants.INNER); } } + } + } + + /** + * 发送websocket通知 + * @param id + * @param memberList + * @param goodsSku + * @param successFlag // 中标状态 1:中标 0:未中标 + */ + private void sendWebsocketMsg(Long id, List<Member> memberList, GoodsSku goodsSku, + Integer successFlag, Map<Long, String> userIdMap) { + for (Member member : memberList) { + Map<String, Object> map = new ConcurrentHashMap<>(); + map.put("notification_type", NotificationTypeConstant.AUCTION_POPUP); + map.put("notification_time", DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); + map.put("target_id", id); + map.put("goods_name", goodsSku.getSkuName()); + map.put("success_flag", successFlag); + map.put("order_id", successFlag == 1 ? userIdMap.getOrDefault(member.getId(), "") : ""); + String msg = JSONObject.toJSONString(map); + sysUserClient.pushBatch( + WebsocketMessageDTO.builder().message(msg).userId(member.getUserId()).build(), + SecurityConstants.INNER); + log.info("===================>发送websocket通知,消息体{}", msg); } } @@ -793,13 +870,12 @@ SecurityConstants.INNER); } - auctionBidRecordService.updateBatchById(auctionBidRecordList); - // 创建待支付订单 CustomConfig moneyConfig = sysUserClient.getconfig( ConfigEnum.MEMBER_POINTS_MONEY.getKey()).getData(); CustomConfig pointsConfig = sysUserClient.getconfig( ConfigEnum.MEMBER_POINTS_POINTS.getKey()).getData(); + Map<Long, String> orderIdMap = new HashMap<>(); for (AuctionBidRecord auctionBidRecord : auctionBidRecordList) { BigDecimal lastBidAmount = auctionBidRecord.getLastBidAmount(); BigDecimal divide = lastBidAmount.divide( @@ -832,7 +908,56 @@ } orderDTO.setOrderTimeSx(auctionGoods.getEndTime()); orderDTO.setGoodsId(auctionGoods.getGoodsSkuId()); - orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER); + Long orderId = orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER) + .getData(); + if (Objects.nonNull(orderId)) { + orderIdMap.put(auctionBidRecord.getMemberId(), orderId.toString()); + auctionBidRecord.setOrderId(orderId); + } + } + // 更新出价记录 + auctionBidRecordService.updateBatchById(auctionBidRecordList); + List<Long> successMemberIdList = auctionBidRecords.stream() + .filter(auctionBidRecord -> auctionBidRecord.getStatus() + .equals(BidStatusEnum.SUCCESSFUL)) + .map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + List<Long> failedMemberIdList = auctionBidRecords.stream() + .filter(auctionBidRecord -> !auctionBidRecord.getStatus() + .equals(BidStatusEnum.SUCCESSFUL)) + .map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + if (CollUtils.isNotEmpty(successMemberIdList)) { + List<Member> successMemberList = memberClient.getMemberListByIds( + successMemberIdList, SecurityConstants.INNER).getData(); + if (CollUtils.isNotEmpty(successMemberList)) { + // 推送websocket消息 + sendWebsocketMsg(id, successMemberList, goodsSku, 1, orderIdMap); + // 发送短信通知 + List<String> mobileList = successMemberList.stream() + .map(Member::getPhone) + .collect(Collectors.toList()); + authClient.sendSms(SmsSendDTO.builder().mobileList(mobileList) + .content(SUCCESS_TEMPLATE.replace("content", + goodsSku.getSkuName())) + .build(), SecurityConstants.INNER); + } + } + if (CollUtils.isNotEmpty(failedMemberIdList)) { + List<Member> failedMemberList = memberClient.getMemberListByIds( + failedMemberIdList, SecurityConstants.INNER).getData(); + if (CollUtils.isNotEmpty(failedMemberList)) { + // 推送websocket消息 + sendWebsocketMsg(id, failedMemberList, goodsSku, 0, orderIdMap); + // 发送短信通知 + List<String> mobileList = failedMemberList.stream() + .map(Member::getPhone) + .collect(Collectors.toList()); + authClient.sendSms(SmsSendDTO.builder().mobileList(mobileList) + .content(FAILED_TEMPLATE.replace("content", + goodsSku.getSkuName())) + .build(), SecurityConstants.INNER); + } } } else { // 没有人出价,退回拍卖商品库存 @@ -954,13 +1079,7 @@ } public static void main(String[] args) throws JsonProcessingException { - Map<String, Object> map = new ConcurrentHashMap<>(); - map.put("notification_type", NotificationTypeConstant.AUCTION_GOODS); - map.put("notification_time", DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); - map.put("target_id", 1); - map.put("message_type", "end"); - String msg = objectMapper.writeValueAsString(map); - System.out.println(msg); + System.out.println(SUCCESS_TEMPLATE.replace("content", "剑南春")); } @Override 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 e13d1e1..c1fa6e4 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 @@ -1,5 +1,6 @@ package com.ruoyi.auction.service.impl; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -23,6 +24,7 @@ import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.page.CollUtils; import com.ruoyi.system.api.constants.NotificationTypeConstant; import com.ruoyi.system.api.domain.AuctionBondJl; import com.ruoyi.system.api.domain.AuctionSalesroom; @@ -36,17 +38,20 @@ import com.ruoyi.system.api.domain.Member; import com.ruoyi.system.api.domain.MemberAddress; import com.ruoyi.system.api.domain.Order; +import com.ruoyi.system.api.domain.WebsocketMessageDTO; 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.dto.SmsSendDTO; 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.domain.vo.GoodsInfoTitleValueVO; import com.ruoyi.system.api.domain.vo.getHomeGoodsSkuXxiVO; +import com.ruoyi.system.api.feignClient.AuthClient; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.OrderClient; @@ -57,12 +62,16 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -74,6 +83,7 @@ * @author mitao * @since 2024-05-16 */ +@Slf4j @Service public class AuctionSalesroomGoodsServiceImpl extends ServiceImpl<AuctionSalesroomGoodsMapper, AuctionSalesroomGoods> implements IAuctionSalesroomGoodsService { @Resource @@ -86,7 +96,7 @@ private AuctionBidRecordMapper auctionBidRecordMapper; @Resource - private MemberClient emberClient; + private MemberClient memberClient; @Resource private OrderClient orderClient; @@ -104,11 +114,12 @@ @Resource private AuctionBondJlMapper auctionBondJlMapper; - + @Resource + private AuthClient authClient; private static final ObjectMapper objectMapper = new ObjectMapper(); - - + private static final String SUCCESS_TEMPLATE = "【酒鼎老酒】恭喜!您参与的“content”竞拍已中拍!"; + private static final String FAILED_TEMPLATE = "【酒鼎老酒】很遗憾!您参与的”content“竞拍未中拍!"; /** @@ -504,15 +515,21 @@ wrapper.orderByDesc(AuctionBidRecord::getLastBidAmount); wrapper.orderByAsc(AuctionBidRecord::getLastBidTime); auctionBidRecordList = auctionBidRecordMapper.selectList(wrapper); + Map<Long, String> orderIdMap = new HashMap<>(); if(auctionBidRecordList.size()>0){ //判断 if (auctionBidRecordList.size() >= auctionSalesroomGoods.getSalesroomStock()) { for (int i = 0; i < auctionSalesroomGoods.getSalesroomStock(); i++) { AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i); auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL); - auctionBidRecordMapper.updateById(auctionBidRecord); - AddOrder(auctionBidRecord.getTargetId(), auctionBidRecord.getMemberId(), + Long orderId = AddOrder(auctionBidRecord.getTargetId(), + auctionBidRecord.getMemberId(), auctionBidRecord.getLastBidAmount(), auctionSalesroom.getBond()); + if (Objects.nonNull(orderId)) { + orderIdMap.put(auctionBidRecord.getMemberId(), orderId.toString()); + auctionBidRecord.setOrderId(orderId); + } + auctionBidRecordMapper.updateById(auctionBidRecord); } } else { GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); @@ -525,10 +542,57 @@ for (int i = 0; i < auctionBidRecordList.size(); i++) { AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i); auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL); - auctionBidRecordMapper.updateById(auctionBidRecord); - AddOrder(auctionBidRecord.getTargetId(), auctionBidRecord.getMemberId(), + Long orderId = AddOrder(auctionBidRecord.getTargetId(), + auctionBidRecord.getMemberId(), auctionBidRecord.getLastBidAmount(), auctionSalesroom.getBond()); + if (Objects.nonNull(orderId)) { + orderIdMap.put(auctionBidRecord.getMemberId(), orderId.toString()); + auctionBidRecord.setOrderId(orderId); + } + auctionBidRecordMapper.updateById(auctionBidRecord); } + } + } + GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne(auctionSalesroomGoods.getGoodsSkuId(), + SecurityConstants.INNER).getData(); + List<Long> successMemberIdList = auctionBidRecordList.stream() + .filter(auctionBidRecord -> auctionBidRecord.getStatus() + .equals(BidStatusEnum.SUCCESSFUL)) + .map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + List<Long> failedMemberIdList = auctionBidRecordList.stream() + .filter(auctionBidRecord -> !auctionBidRecord.getStatus() + .equals(BidStatusEnum.SUCCESSFUL)) + .map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + if (CollUtils.isNotEmpty(successMemberIdList)) { + List<Member> successMemberList = memberClient.getMemberListByIds( + successMemberIdList, SecurityConstants.INNER).getData(); + if (CollUtils.isNotEmpty(successMemberList)) { + // 推送websocket消息 + sendWebsocketMsg(auctionSalesroomGoods.getId(), successMemberList, goodsSku, 1, + orderIdMap); + // 发送短信通知 + List<String> mobileList = successMemberList.stream().map(Member::getPhone) + .collect(Collectors.toList()); + authClient.sendSms(SmsSendDTO.builder().mobileList(mobileList) + .content(SUCCESS_TEMPLATE.replace("content", goodsSku.getSkuName())) + .build(), SecurityConstants.INNER); + } + } + if (CollUtils.isNotEmpty(failedMemberIdList)) { + List<Member> failedMemberList = memberClient.getMemberListByIds( + failedMemberIdList, SecurityConstants.INNER).getData(); + if (CollUtils.isNotEmpty(failedMemberList)) { + // 推送websocket消息 + sendWebsocketMsg(auctionSalesroomGoods.getId(), failedMemberList, goodsSku, 0, + orderIdMap); + // 发送短信通知 + List<String> mobileList = failedMemberList.stream().map(Member::getPhone) + .collect(Collectors.toList()); + authClient.sendSms(SmsSendDTO.builder().mobileList(mobileList) + .content(FAILED_TEMPLATE.replace("content", goodsSku.getSkuName())) + .build(), SecurityConstants.INNER); } } } @@ -554,6 +618,30 @@ } + /** + * 发送websocket通知 + * @param id + * @param memberList + * @param goodsSku + * @param successFlag // 中标状态 1:中标 0:未中标 + */ + private void sendWebsocketMsg(Long id, List<Member> memberList, GoodsSku goodsSku, + Integer successFlag, Map<Long, String> userIdMap) { + for (Member member : memberList) { + Map<String, Object> map = new ConcurrentHashMap<>(); + map.put("notification_type", NotificationTypeConstant.AUCTION_POPUP); + map.put("notification_time", DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); + map.put("target_id", id); + map.put("goods_name", Objects.nonNull(goodsSku) ? goodsSku.getSkuName() : ""); + map.put("success_flag", successFlag); + map.put("order_id", successFlag == 1 ? userIdMap.getOrDefault(member.getId(), "") : ""); + String msg = JSONObject.toJSONString(map); + sysUserClient.pushBatch( + WebsocketMessageDTO.builder().message(msg).userId(member.getUserId()).build(), + SecurityConstants.INNER); + log.info("===================>发送websocket通知,消息体{}", msg); + } + } @Override public AuctionSalesroomGoodsInfoVO getAuctionSalesroomGoodsInfo(AuctionSalesroomGoodsInfoDTO auctionSalesroomGoodsInfoDTO) { AuctionSalesroom byId = auctionSalesroomMapper.selectById(auctionSalesroomGoodsInfoDTO.getAuctionSalesroomId()); @@ -727,7 +815,7 @@ auctionBidRecordVO.setSort(Integer.valueOf(count.intValue())); auctionBidRecordVO.setLastBidAmount(auctionBidRecord.getLastBidAmount()); auctionBidRecordVO.setLastBidTime(auctionBidRecord.getLastBidTime()); - Member data = emberClient.getMembeOne(auctionBidRecord.getMemberId(), + Member data = memberClient.getMembeOne(auctionBidRecord.getMemberId(), SecurityConstants.INNER).getData(); if (data!=null){ auctionBidRecordVO.setMemberName(data.getNickname()); @@ -755,7 +843,8 @@ } - public void AddOrder(Long goodsSkuId, Long memberId, BigDecimal lastBidAmount,BigDecimal bound) { + public Long AddOrder(Long goodsSkuId, Long memberId, BigDecimal lastBidAmount, + BigDecimal bound) { OrderDTO order=new OrderDTO(); order.setGoodsSkuId(goodsSkuId); order.setOrderTime(LocalDateTime.now()); @@ -767,7 +856,7 @@ order.setTotalAmount(lastBidAmount); order.setAuctionSalesroomId(auctionSalesroomGoods.getAuctionSalesroomId()); - R<MemberAddress> memberAddressR = emberClient.getMemberAddressOne(memberId, + R<MemberAddress> memberAddressR = memberClient.getMemberAddressOne(memberId, SecurityConstants.INNER); MemberAddress memberAddress=memberAddressR.getData(); @@ -799,7 +888,7 @@ order.setCoverPic(goodsSku.getCoverPic()); order.setPrice(lastBidAmount); order.setGoodsId(auctionSalesroomGoods.getGoodsSkuId()); - orderClient.saveOrderOne(order,SecurityConstants.INNER); + return orderClient.saveOrderOne(order, SecurityConstants.INNER).getData(); } diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java index a5030d6..2a7eacb 100644 --- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java +++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java @@ -49,6 +49,7 @@ import com.ruoyi.common.core.enums.ClientTypeEnum; import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.IDhelper; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; @@ -82,12 +83,14 @@ import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO; import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; +import com.ruoyi.system.api.domain.dto.SmsSendDTO; import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO; import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomVO; import com.ruoyi.system.api.domain.vo.MemberAuctionSalesroomInfoVO; import com.ruoyi.system.api.domain.vo.MemberAuctionSalesroomVO; import com.ruoyi.system.api.domain.vo.PayInfoVO; import com.ruoyi.system.api.domain.vo.WdMemberAuctionSalesroomVO; +import com.ruoyi.system.api.feignClient.AuthClient; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.OrderClient; @@ -105,6 +108,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -182,6 +186,11 @@ @Resource private RedissonClient redissonClient; + @Resource + private AuthClient authClient; + + private static final String SUCCESS_TEMPLATE = "【酒鼎老酒】恭喜!您参与的“content”竞拍已中拍!"; + private static final String FAILED_TEMPLATE = "【酒鼎老酒】很遗憾!您参与的”content“竞拍未中拍!"; public static RequestConfig config = RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(5000).build(); // 配置您申请的KEY,在个人中心->我的数据,接口名称上方查看 public static final String APPKEY = ""; @@ -1490,19 +1499,32 @@ .orderByAsc(AuctionBidRecord::getLastBidTime)); if (CollUtils.isNotEmpty(auctionBidRecordList)) { List<AuctionBidRecord> auctionBidRecords = new ArrayList<>(); + Map<Long, String> orderIdMap = new HashMap<>(); if (auctionBidRecordList.size() >= auctionSalesroomGoods.getSalesroomStock()) { for (int i = 0; i < auctionSalesroomGoods.getSalesroomStock(); i++) { AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i); auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL); - auctionBidRecordMapper.updateById(auctionBidRecord); auctionBidRecords.add(auctionBidRecord); + Long orderId = addOrder(auctionBidRecord.getTargetId(), + auctionBidRecord.getMemberId(), + auctionBidRecord.getLastBidAmount(), + auctionSalesroom.getBond()); + orderIdMap.put(auctionBidRecord.getMemberId(), orderId.toString()); + auctionBidRecord.setOrderId(orderId); + auctionBidRecordMapper.updateById(auctionBidRecord); } } else { for (int i = 0; i < auctionBidRecordList.size(); i++) { AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i); auctionBidRecord.setStatus(BidStatusEnum.SUCCESSFUL); - auctionBidRecordMapper.updateById(auctionBidRecord); auctionBidRecords.add(auctionBidRecord); + Long orderId = addOrder(auctionBidRecord.getTargetId(), + auctionBidRecord.getMemberId(), + auctionBidRecord.getLastBidAmount(), + auctionSalesroom.getBond()); + orderIdMap.put(auctionBidRecord.getMemberId(), orderId.toString()); + auctionBidRecord.setOrderId(orderId); + auctionBidRecordMapper.updateById(auctionBidRecord); } // 没有出价记录,回退库存 GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); @@ -1513,10 +1535,54 @@ goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO), SecurityConstants.INNER); } - for (AuctionBidRecord auctionBidRecord : auctionBidRecords) { - addOrder(auctionBidRecord.getTargetId(), auctionBidRecord.getMemberId(), - auctionBidRecord.getLastBidAmount(), - auctionSalesroom.getBond()); + GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne( + auctionSalesroomGoods.getGoodsSkuId(), + SecurityConstants.INNER).getData(); + List<Long> successMemberIdList = auctionBidRecordList.stream() + .filter(auctionBidRecord -> auctionBidRecord.getStatus() + .equals(BidStatusEnum.SUCCESSFUL)) + .map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + List<Long> failedMemberIdList = auctionBidRecordList.stream() + .filter(auctionBidRecord -> !auctionBidRecord.getStatus() + .equals(BidStatusEnum.SUCCESSFUL)) + .map(AuctionBidRecord::getMemberId) + .collect(Collectors.toList()); + if (CollUtils.isNotEmpty(successMemberIdList)) { + List<Member> successMemberList = memberClient.getMemberListByIds( + successMemberIdList, SecurityConstants.INNER).getData(); + if (CollUtils.isNotEmpty(successMemberList)) { + // 推送websocket消息 + sendWebsocketMsg(auctionSalesroomGoods.getId(), successMemberList, + goodsSku, 1, + orderIdMap); + // 发送短信通知 + List<String> mobileList = successMemberList.stream() + .map(Member::getPhone) + .collect(Collectors.toList()); + authClient.sendSms(SmsSendDTO.builder().mobileList(mobileList) + .content(SUCCESS_TEMPLATE.replace("content", + goodsSku.getSkuName())) + .build(), SecurityConstants.INNER); + } + } + if (CollUtils.isNotEmpty(failedMemberIdList)) { + List<Member> failedMemberList = memberClient.getMemberListByIds( + failedMemberIdList, SecurityConstants.INNER).getData(); + if (CollUtils.isNotEmpty(failedMemberList)) { + // 推送websocket消息 + sendWebsocketMsg(auctionSalesroomGoods.getId(), failedMemberList, + goodsSku, 0, + orderIdMap); + // 发送短信通知 + List<String> mobileList = failedMemberList.stream() + .map(Member::getPhone) + .collect(Collectors.toList()); + authClient.sendSms(SmsSendDTO.builder().mobileList(mobileList) + .content(FAILED_TEMPLATE.replace("content", + goodsSku.getSkuName())) + .build(), SecurityConstants.INNER); + } } } else { // 没有出价记录,回退库存 @@ -1545,7 +1611,32 @@ } } - public void addOrder(Long goodsSkuId, Long memberId, BigDecimal lastBidAmount, + /** + * 发送websocket通知 + * @param id + * @param memberList + * @param goodsSku + * @param successFlag // 中标状态 1:中标 0:未中标 + */ + private void sendWebsocketMsg(Long id, List<Member> memberList, GoodsSku goodsSku, + Integer successFlag, Map<Long, String> userIdMap) { + for (Member member : memberList) { + Map<String, Object> map = new ConcurrentHashMap<>(); + map.put("notification_type", NotificationTypeConstant.AUCTION_POPUP); + map.put("notification_time", DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss")); + map.put("target_id", id); + map.put("goods_name", Objects.nonNull(goodsSku) ? goodsSku.getSkuName() : ""); + map.put("success_flag", successFlag); + map.put("order_id", successFlag == 1 ? userIdMap.getOrDefault(member.getId(), "") : ""); + String msg = com.alibaba.fastjson2.JSONObject.toJSONString(map); + sysUserClient.pushBatch( + WebsocketMessageDTO.builder().message(msg).userId(member.getUserId()).build(), + SecurityConstants.INNER); + log.info("===================>发送websocket通知,消息体{}", msg); + } + } + + public Long addOrder(Long goodsSkuId, Long memberId, BigDecimal lastBidAmount, BigDecimal bound) { OrderDTO order = new OrderDTO(); order.setGoodsSkuId(goodsSkuId); @@ -1596,7 +1687,7 @@ order.setCoverPic(goodsSku.getCoverPic()); order.setPrice(lastBidAmount); order.setGoodsId(auctionSalesroomGoods.getGoodsSkuId()); - orderClient.saveOrderOne(order, SecurityConstants.INNER); + return orderClient.saveOrderOne(order, SecurityConstants.INNER).getData(); } /** * 开始下一拍卖商品 diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtMemberController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtMemberController.java index ba156e2..ce0d722 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtMemberController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtMemberController.java @@ -10,6 +10,7 @@ import com.ruoyi.member.service.IMemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -23,6 +24,7 @@ * @author mitao * @date 2024/5/27 */ +@Validated @RestController @RequestMapping("/mgt/member") @RequiredArgsConstructor @@ -39,7 +41,7 @@ */ @ApiOperation(value = "获取会员管理分页列表", notes = "获取会员管理分页列表") @PostMapping("/page") - public R<PageDTO<MgtMemberVO>> getMemberPage(@Validated @RequestBody MgtMemberQuery query) { + public R<PageDTO<MgtMemberVO>> getMemberPage(@Valid @RequestBody MgtMemberQuery query) { return R.ok(memberService.getMemberPage(query)); } @@ -58,7 +60,7 @@ @ApiOperation("查看详情-积分明细") @PostMapping("/points/detail") public R<PageDTO<MgtMemberPointsVO>> getMemberPoints( - @Validated @RequestBody MgtMemberPointsQuery query) { + @Valid @RequestBody MgtMemberPointsQuery query) { return R.ok(memberService.getMemberPoints(query)); } @@ -69,7 +71,7 @@ */ @ApiOperation("编辑用户会员分类") @PostMapping("/update/vipClassify") - public R<?> updMemberClassify(@RequestBody MgtMemberDTO dto) { + public R<?> updMemberClassify(@Valid @RequestBody MgtMemberDTO dto) { memberService.updMemberClassify(dto); return R.ok(); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java index 0f06313..c425808 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java @@ -19,7 +19,6 @@ import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.formula.functions.T; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -49,7 +48,7 @@ @PostMapping("/saveOrderOne") @ResponseBody @InnerAuth - public R<T> saveOrderOne(@RequestBody OrderDTO OrderDTO) { + public R<Long> saveOrderOne(@RequestBody OrderDTO OrderDTO) { orderService.saveOrderOne(OrderDTO); return R.ok(); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java index 5fe5e37..400f7eb 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java @@ -32,7 +32,7 @@ */ public interface IOrderService extends IService<Order> { - void saveOrderOne(OrderDTO OrderDTO); + Long saveOrderOne(OrderDTO OrderDTO); /** * 获取某个商品的已购会员数 diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java index e4bd230..f090cfb 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java @@ -160,7 +160,7 @@ @Override - public void saveOrderOne(OrderDTO OrderDTO) { + public Long saveOrderOne(OrderDTO OrderDTO) { Order order=new Order(); if (OrderDTO.getOrderFrom().getCode()==1){ order.setOrderFrom(OrderFromEnum.COMMODITY_ORDER); @@ -234,7 +234,7 @@ } - + return order.getId(); } /** diff --git a/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml b/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml index ae93e69..f7be08d 100644 --- a/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml +++ b/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml @@ -41,7 +41,7 @@ FROM t_promotion_wish tpw INNER JOIN t_promotion_wish_list tpwl ON tpw.id = tpwl.wish_id <where> - tpw.del_flag = 0 AND tpw.recommend_status = 1 + tpw.del_flag = 0 AND tpw.recommend_status = 1 and tpw.show_flag = 1 </where> GROUP BY tpwl.wish_id,tpw.member_id </select> diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WebSocketController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WebSocketController.java index f2194cf..84aeed5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WebSocketController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/WebSocketController.java @@ -42,6 +42,17 @@ } /** + * 批量向指定用户推送消息 + * @param dto + * @return + */ + @InnerAuth + @PostMapping("/push-batch") + public R<?> pushBatch(@RequestBody WebsocketMessageDTO dto) { + WebSocketUsers.sendMessageToUserById(dto.getUserId(), dto.getMessage()); + return R.ok(); + } + /** * 通过用户id推送消息 * @param type * @param msg -- Gitblit v1.7.1