Browse Source

消息、通知、交易

qrs 2 days ago
parent
commit
798e036c81

+ 8 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/WebsocketVo.java → alien-entity/src/main/java/shop/alien/entity/store/vo/WebSocketVo.java

@@ -1,12 +1,15 @@
 package shop.alien.entity.store.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 @Data
 @JsonInclude
-public class WebsocketVo {
+public class WebSocketVo {
 
     @ApiModelProperty(value = "发送者id")
     private String senderId;
@@ -31,4 +34,8 @@ public class WebsocketVo {
 
     @ApiModelProperty(value = "消息id")
     private Integer messageId;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
 }

+ 0 - 3
alien-job/src/main/java/shop/alien/job/second/SecondGoodsTradeXxlJob.java

@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -14,7 +13,6 @@ import shop.alien.entity.second.SecondTradeRecord;
 import shop.alien.entity.store.LifeMessage;
 import shop.alien.entity.store.LifeNotice;
 import shop.alien.entity.store.LifeUser;
-import shop.alien.entity.store.vo.WebsocketVo;
 import shop.alien.job.feign.AlienStoreFeign;
 import shop.alien.mapper.LifeMessageMapper;
 import shop.alien.mapper.LifeNoticeMapper;
@@ -24,7 +22,6 @@ import shop.alien.mapper.second.SecondTradeRecordMapper;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Component

+ 15 - 0
alien-second/src/main/java/shop/alien/second/feign/AlienStoreFeign.java

@@ -13,6 +13,16 @@ public interface AlienStoreFeign {
                               @RequestParam(value = "friendType") int friendType,
                               @RequestParam(value = "search") String search);
 
+    /**
+     *
+     * @param messageReceiverId  消息接收者
+     * @param senderId           发送人
+     * @param receiverId         接收人
+     * @param category           消息类别(message-聊一聊消息  notice-通知)
+     * @param type               消息类型  1-文本  2-图片 3-链接分享  4-二手交易(确认/拒绝/取消)  5-二手交易签到提醒  6-二手交易已签到
+     * @param text               消息内容
+     * @param messageId          消息表存入的主键id
+     */
     @GetMapping("/websocket/sendMsgToClientByPhoneId")
     JSONObject sendMsgToClientByPhoneId(@RequestParam(value = "messageReceiverId") String messageReceiverId,
                                         @RequestParam(value = "senderId") String senderId,
@@ -22,4 +32,9 @@ public interface AlienStoreFeign {
                                         @RequestParam(value = "text") String text,
                                         @RequestParam(value = "messageId") Integer messageId);
 
+    @GetMapping("/websocket/sendMsgToClientByPhoneIdaaaa")
+    JSONObject sendMsgToClientByPhoneIdaaaa(
+                                        @RequestParam(value = "messageReceiverId") String messageReceiverId,
+                                        @RequestParam(value = "webSocketVoStr") String webSocketVoStr);
+
 }

+ 20 - 1
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -1,7 +1,7 @@
 package shop.alien.second.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
-import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -20,9 +20,11 @@ import shop.alien.entity.second.vo.SecondGoodsVo;
 import shop.alien.entity.second.vo.SellGoodsVo;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifeUserVo;
+import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.*;
 import shop.alien.mapper.second.SecondGoodsAuditMapper;
 import shop.alien.mapper.second.SecondGoodsMapper;
+import shop.alien.second.feign.AlienStoreFeign;
 import shop.alien.second.service.SecondGoodsService;
 import shop.alien.util.common.Constants;
 import shop.alien.util.common.VideoUtils;
@@ -92,6 +94,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
      * 收藏Mapper
      */
     private final LifeCollectMapper lifeCollectMapper;
+
+    private final AlienStoreFeign alienStoreFeign;
     /**
      * 保存商品为草稿状态
      * @param goods 商品实体
@@ -154,6 +158,9 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
                 return true; // 审核不通过时已设置状态,返回成功但标记为审核失败
             }
 
+
+
+
             return true;
         } catch (Exception e) {
             // 记录异常日志
@@ -305,8 +312,19 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         lifeNotice.setNoticeType(Constants.Notice.SYSTEM_NOTICE); // 系统通知
         lifeNotice.setIsRead(0);
         lifeNoticeMapper.insert(lifeNotice);
+        sendNotice("user_"+ phone, lifeNotice);
     }
 
+    private void sendNotice(String receiverId, LifeNotice lifeNotice) {
+        WebSocketVo webSocketVo = new WebSocketVo();
+        webSocketVo.setSenderId("system");
+        webSocketVo.setReceiverId(receiverId);
+        webSocketVo.setCategory("notice");
+        webSocketVo.setNoticeType("1");
+        webSocketVo.setIsRead(0);
+        webSocketVo.setText(JSONObject.from(lifeNotice).toJSONString());
+        alienStoreFeign.sendMsgToClientByPhoneIdaaaa(receiverId, JSONObject.from(webSocketVo).toJSONString());
+    }
 
     /**
      * 发送审核失败消息
@@ -331,6 +349,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         lifeNotice.setNoticeType(Constants.Notice.SYSTEM_NOTICE); // 系统通知
         lifeNotice.setIsRead(0);
         lifeNoticeMapper.insert(lifeNotice);
+        sendNotice("user_"+ phone, lifeNotice);
     }
 
 

+ 9 - 0
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -331,15 +331,24 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             SecondTradeRecord tradeRecord = secondTradeRecordMapper.selectById(tradeId);
             SecondTradeRecord record = new SecondTradeRecord();
             record.setId(tradeId);
+            // 买家
             if (userId == tradeRecord.getBuyerId()) {
                 if (0 != tradeRecord.getBuyerTransactionStatus()) return false;
                 record.setBuyerTransactionStatus(type);
                 record.setBuyerEvaluate(evaluate);
+            // 卖家
             } else if (userId == tradeRecord.getSellerId()) {
                 if (0 != tradeRecord.getSellerTransactionStatus()) return false;
                 record.setSellerTransactionStatus(type);
                 record.setSellerEvaluate(evaluate);
                 record.setTradeStatus(type);
+                // 卖家如果选择交易成功  同步修改商品表
+                if (1 == tradeRecord.getBuyerTransactionStatus()) {
+                    SecondGoods goods = new SecondGoods();
+                    goods.setId(tradeRecord.getGoodsId());
+                    goods.setGoodsStatus(5);
+                    secondGoodsMapper.updateById(goods);
+                }
             } else {
                 return false;
             }

+ 7 - 14
alien-store/src/main/java/shop/alien/store/config/WebSocketProcess.java

@@ -3,22 +3,14 @@ package shop.alien.store.config;
 import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import io.swagger.models.auth.In;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
 import shop.alien.entity.store.LifeBlacklist;
 import shop.alien.entity.store.LifeMessage;
-import shop.alien.entity.store.LifeUser;
-import shop.alien.entity.store.StoreUser;
-import shop.alien.entity.store.vo.WebsocketVo;
+import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.LifeBlacklistMapper;
 import shop.alien.mapper.LifeMessageMapper;
-import shop.alien.mapper.LifeUserMapper;
-import shop.alien.mapper.StoreUserMapper;
-import shop.alien.util.common.JwtUtil;
 
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
@@ -37,13 +29,12 @@ import java.util.stream.Collectors;
 @Slf4j
 @Component
 @ServerEndpoint(value = "/socket/{sendId}")
-@RequiredArgsConstructor
 public class WebSocketProcess {
 
 
-    private final LifeMessageMapper lifeMessageMapper;
-    private final BaseRedisService baseRedisService;
-    private final LifeBlacklistMapper lifeBlacklistMapper;
+    private final LifeMessageMapper lifeMessageMapper = SpringContext.getBean(LifeMessageMapper.class);
+    private final BaseRedisService baseRedisService = SpringContext.getBean(BaseRedisService.class);
+    private final LifeBlacklistMapper lifeBlacklistMapper = SpringContext.getBean(LifeBlacklistMapper.class);
 
     /*
      * 持有每个webSocket对象,以key-value存储到线程安全ConcurrentHashMap,
@@ -100,7 +91,7 @@ public class WebSocketProcess {
     public void onMessage(String message) throws Exception {
         try {
             // 过滤心跳
-            WebsocketVo websocketVo = JSONObject.parseObject(message, WebsocketVo.class);
+            WebSocketVo websocketVo = JSONObject.parseObject(message, WebSocketVo.class);
             if (null == websocketVo || "heartbeat".equals(websocketVo.getCategory())) return;
 
             // 记录已读消息id
@@ -130,6 +121,8 @@ public class WebSocketProcess {
             // 发送消息
             websocketVo.setMessageId(lifeMessage.getId());
             websocketVo.setCategory("message");
+            websocketVo.setCreatedTime(lifeMessage.getCreatedTime());
+            sendMessage(websocketVo.getSenderId(), JSONObject.from(websocketVo).toJSONString());
             sendMessage(websocketVo.getReceiverId(), JSONObject.from(websocketVo).toJSONString());
         } catch (Exception e) {
             log.error("WebSocketProcess.onMessage() Error Mgs={}", e.getMessage());

+ 21 - 5
alien-store/src/main/java/shop/alien/store/controller/WebSocketController.java

@@ -1,15 +1,17 @@
 package shop.alien.store.controller;
 
 import com.alibaba.fastjson2.JSONObject;
-import io.swagger.annotations.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.LifeMessage;
-import shop.alien.entity.store.vo.WebsocketVo;
 import shop.alien.store.config.WebSocketProcess;
-import shop.alien.mapper.LifeMessageMapper;
 
 /**
  * websocket消息推送
@@ -47,6 +49,7 @@ public class WebSocketController {
         jsonObject.put("type", type);
         jsonObject.put("text", text);
         jsonObject.put("messageId", messageId);
+        jsonObject.put("isRead", 0);
         try {
             webSocketProcess.sendMessage(messageReceiverId, jsonObject.toJSONString());
             return R.success("发送成功");
@@ -56,6 +59,19 @@ public class WebSocketController {
         return R.fail("发送失败");
     }
 
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("向指定客户端发消息")
+    @GetMapping(value = "/sendMsgToClientByPhoneIdaaaa")
+    public R<Boolean> sendMsgToClientByPhoneIdaaaa(String messageReceiverId, String webSocketVoStr) {
+        try {
+            webSocketProcess.sendMessage(messageReceiverId, webSocketVoStr);
+            return R.success("发送成功");
+        } catch (Exception e) {
+            log.error("WebSocketController_sendMsgToClientById Error Mgs={}", e.getMessage());
+        }
+        return R.fail("发送失败");
+    }
+
 //    /**
 //     * 向指定客户端发消息
 //     */

+ 2 - 2
alien-store/src/main/java/shop/alien/store/service/impl/LifeUserViolationServiceImpl.java

@@ -19,7 +19,7 @@ import shop.alien.entity.store.dto.LifeUserViolationDto;
 import shop.alien.entity.store.excelVo.LifeUserViolationExcelVO;
 import shop.alien.entity.store.excelVo.util.ExcelGenerator;
 import shop.alien.entity.store.vo.LifeUserViolationVo;
-import shop.alien.entity.store.vo.WebsocketVo;
+import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.*;
 import shop.alien.store.config.WebSocketProcess;
 import shop.alien.store.service.*;
@@ -91,7 +91,7 @@ public class LifeUserViolationServiceImpl extends ServiceImpl<LifeUserViolationM
                     LifeNotice lifeNotice = getLifeNotice(lifeuserViolation);
                     lifeNoticeMapper.insert(lifeNotice);
 
-                    WebsocketVo websocketVo = new WebsocketVo();
+                    WebSocketVo websocketVo = new WebSocketVo();
                     websocketVo.setSenderId("system");
                     websocketVo.setReceiverId(phoneId);
                     websocketVo.setCategory("notice");

+ 7 - 7
alien-store/src/main/java/shop/alien/store/task/ScheduledTask.java

@@ -11,7 +11,7 @@ import org.springframework.stereotype.Component;
 import shop.alien.entity.second.SecondGoods;
 import shop.alien.entity.second.SecondTradeRecord;
 import shop.alien.entity.store.*;
-import shop.alien.entity.store.vo.WebsocketVo;
+import shop.alien.entity.store.vo.WebSocketVo;
 import shop.alien.mapper.*;
 import shop.alien.mapper.second.SecondGoodsMapper;
 import shop.alien.mapper.second.SecondTradeRecordMapper;
@@ -338,7 +338,7 @@ public class ScheduledTask {
                 lifeMessageMapper.insert(lifeMessage);
 
                 // 给买家推送消息
-                WebsocketVo websocketVo = new WebsocketVo();
+                WebSocketVo websocketVo = new WebSocketVo();
                 websocketVo.setSenderId(sellerPhoneId);
                 websocketVo.setReceiverId(buyerPhoneId);
                 websocketVo.setCategory("message");
@@ -366,7 +366,7 @@ public class ScheduledTask {
                 lifeNoticeMapper.insert(lifeNotice);
 
                 // 给买家推送通知
-                websocketVo = new WebsocketVo();
+                websocketVo = new WebSocketVo();
                 websocketVo.setSenderId("system");
                 websocketVo.setReceiverId(buyerPhoneId);
                 websocketVo.setCategory("notice");
@@ -385,7 +385,7 @@ public class ScheduledTask {
                 lifeMessageMapper.insert(lifeMessage);
 
                 // 给卖家推送消息
-                websocketVo = new WebsocketVo();
+                websocketVo = new WebSocketVo();
                 websocketVo.setSenderId(buyerPhoneId);
                 websocketVo.setReceiverId(sellerPhoneId);
                 websocketVo.setCategory("message");
@@ -413,7 +413,7 @@ public class ScheduledTask {
                 lifeNoticeMapper.insert(lifeNotice);
 
                 // 给卖家推送通知
-                websocketVo = new WebsocketVo();
+                websocketVo = new WebSocketVo();
                 websocketVo.setSenderId("system");
                 websocketVo.setReceiverId(sellerPhoneId);
                 websocketVo.setCategory("notice");
@@ -473,7 +473,7 @@ public class ScheduledTask {
                 lifeNoticeMapper.insert(lifeNotice);
 
                 // 给买家推送通知
-                WebsocketVo websocketVo = new WebsocketVo();
+                WebSocketVo websocketVo = new WebSocketVo();
                 websocketVo.setSenderId("system");
                 websocketVo.setReceiverId(buyerPhoneId);
                 websocketVo.setCategory("notice");
@@ -493,7 +493,7 @@ public class ScheduledTask {
                 lifeNoticeMapper.insert(lifeNotice);
 
                 // 给卖家推送通知
-                websocketVo = new WebsocketVo();
+                websocketVo = new WebSocketVo();
                 websocketVo.setSenderId("system");
                 websocketVo.setReceiverId(sellerPhoneId);
                 websocketVo.setCategory("notice");