Răsfoiți Sursa

消息、通知、交易

qrs 1 săptămână în urmă
părinte
comite
88c2ba693d

+ 10 - 2
alien-entity/src/main/java/shop/alien/entity/store/LifeBlacklist.java

@@ -35,7 +35,7 @@ public class LifeBlacklist extends Model<LifeBlacklist> {
     @TableId("id")
     private Integer id;
 
-    @ApiModelProperty(value = "拉黑方类型")
+    @ApiModelProperty(value = "拉黑方类型(1:商户,2:用户)")
     @TableField("blocker_type")
     private String blockerType;
 
@@ -43,7 +43,11 @@ public class LifeBlacklist extends Model<LifeBlacklist> {
     @TableField("blocker_id")
     private String blockerId;
 
-    @ApiModelProperty(value = "被拉黑方类型")
+    @ApiModelProperty(value = "拉黑方phoneId")
+    @TableField("blocker_phone_id")
+    private String blockerPhoneId;
+
+    @ApiModelProperty(value = "被拉黑方类型(1:商户,2:用户)")
     @TableField("blocked_type")
     private String blockedType;
 
@@ -51,6 +55,10 @@ public class LifeBlacklist extends Model<LifeBlacklist> {
     @TableField("blocked_id")
     private String blockedId;
 
+    @ApiModelProperty(value = "被拉黑方phoneId")
+    @TableField("blocked_phone_id")
+    private String blockedPhoneId;
+
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
     @TableField("delete_flag")
     @TableLogic

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

@@ -87,6 +87,7 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
         // 封装交易信息
         JSONObject message = new JSONObject();
         message.put("title", goods.getTitle());
+        message.put("goodsId", goods.getId());
         message.put("homeImage", goods.getHomeImage());
         message.put("tradeId", trade.getId());
         message.put("transactionAmount", trade.getTransactionAmount());

+ 46 - 0
alien-store/src/main/java/shop/alien/store/config/BaseRedisService.java

@@ -49,6 +49,52 @@ public class BaseRedisService {
         return stringRedisTemplate.execute(script, Collections.singletonList(key));
     }
 
+    private static final String SAVE_OR_OVERWRITE_SCRIPT =
+            "if redis.call('EXISTS', KEYS[1]) == 1 then " +
+                    "   redis.call('DEL', KEYS[1]) " +
+                    "end " +
+                    "return redis.call('RPUSH', KEYS[1], unpack(ARGV))";
+
+    /**
+     * 如果key不存在则存入,存在则覆盖
+     * @param key
+     * @param values
+     */
+    public void setSaveOrOverwriteScriptList(String key, List<String> values) {
+
+        // 创建DefaultRedisScript对象
+        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
+        redisScript.setScriptText(SAVE_OR_OVERWRITE_SCRIPT);
+        redisScript.setResultType(Long.class);
+
+        // 执行脚本
+        stringRedisTemplate.execute(
+                redisScript,
+                Collections.singletonList(key),
+                values.toArray()
+        );
+    }
+
+    /**
+     * 判断是否存在指定key
+     * @param key
+     * @return
+     */
+    public boolean hasKey(String key) {
+        Boolean exists = stringRedisTemplate.hasKey(key);
+        return exists != null && exists;
+    }
+
+    /**
+     * 从List中删除所有匹配的字符串
+     * @param key Redis key
+     * @param value 要删除的值
+     * @return 删除的元素数量
+     */
+    public Long removeAllOccurrences(String key, String value) {
+        return stringRedisTemplate.opsForList().remove(key, 0, value);
+    }
+
     /**
      * 添加List, 所有
      *

+ 34 - 2
alien-store/src/main/java/shop/alien/store/config/WebSocketProcess.java

@@ -1,19 +1,32 @@
 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.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.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;
 import javax.websocket.server.ServerEndpoint;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
  * @author ssk
@@ -26,8 +39,8 @@ import java.util.concurrent.ConcurrentHashMap;
 public class WebSocketProcess {
 
     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,
@@ -48,8 +61,16 @@ public class WebSocketProcess {
         this.session = session;
         concurrentHashMap.put(id, this);
         log.info("WebSocketProcess.onOpen() Open a websocket. id={}", id);
+
+        // 获取拉黑自己的用户信息
+        LambdaQueryWrapper<LifeBlacklist> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(LifeBlacklist::getBlockedPhoneId, id);
+        List<String> blackList = lifeBlacklistMapper.selectList(wrapper).stream().map(LifeBlacklist::getBlockerPhoneId).collect(Collectors.toList());
+        if (CollectionUtil.isNotEmpty(blackList)) baseRedisService.setSaveOrOverwriteScriptList("blackList_" + id, blackList);
     }
 
+
+
     /**
      * 客户端连接关闭时触发
      **/
@@ -58,6 +79,7 @@ public class WebSocketProcess {
         //客户端连接关闭时,移除map中存储的键值对
         concurrentHashMap.remove(id);
         log.info("WebSocketProcess.onClose() close a websocket, concurrentHashMap remove sessionId= {}", id);
+        baseRedisService.delete("blackList_" + id);
     }
 
     /**
@@ -90,7 +112,17 @@ public class WebSocketProcess {
             lifeMessage.setReceiverId(websocketVo.getReceiverId());
             lifeMessage.setContent(websocketVo.getText());
             lifeMessage.setType(websocketVo.getType());
-            lifeMessageMapper.insert(lifeMessage);
+            // 查询自己是否在对方的黑名单中
+            if (baseRedisService.hasKey("blackList_" + websocketVo.getSenderId())) {
+                List<String> blackList = baseRedisService.getList("blackList_" + websocketVo.getSenderId());
+                if (blackList.contains(websocketVo.getReceiverId())) {
+                    lifeMessage.setDeletePhoneId(websocketVo.getReceiverId());
+                    lifeMessageMapper.insert(lifeMessage);
+                    return;
+                }
+            } else {
+                lifeMessageMapper.insert(lifeMessage);
+            }
 
             // 发送消息
             websocketVo.setMessageId(lifeMessage.getId());

+ 43 - 7
alien-store/src/main/java/shop/alien/store/service/impl/LifeBlacklistServiceImpl.java

@@ -14,9 +14,11 @@ import shop.alien.mapper.LifeBlacklistMapper;
 import shop.alien.mapper.LifeUserMapper;
 import shop.alien.mapper.StoreImgMapper;
 import shop.alien.mapper.StoreUserMapper;
+import shop.alien.store.config.BaseRedisService;
 import shop.alien.store.service.LifeBlacklistService;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -36,6 +38,7 @@ public class LifeBlacklistServiceImpl extends ServiceImpl<LifeBlacklistMapper, L
     private final StoreUserMapper storeUserMapper;
     private final LifeUserMapper lifeUserMapper;
     private final StoreImgMapper storeImgMapper;
+    private final BaseRedisService baseRedisService;
 
     @Override
     public int blackList(LifeBlacklist lifeBlacklist) {
@@ -48,7 +51,35 @@ public class LifeBlacklistServiceImpl extends ServiceImpl<LifeBlacklistMapper, L
         if (lifeBlacklist1 != null) {
             return 2;
         }
-        return lifeBlacklistMapper.insert(lifeBlacklist);
+
+        // 获取拉黑方phoneId
+        String blockerPhoneId = "";
+        if ("1".equals(lifeBlacklist.getBlockerType())) {
+            StoreUser storeUser = storeUserMapper.selectById(lifeBlacklist.getBlockerId());
+            if (storeUser != null) blockerPhoneId = "store_" + storeUser.getPhone();
+        } else {
+            LifeUser lifeUser = lifeUserMapper.selectById(lifeBlacklist.getBlockerId());
+            if (lifeUser != null) blockerPhoneId = "user_" + lifeUser.getUserPhone();
+        }
+
+        // 获取被拉黑方phoneId
+        String blockedPhoneId = "";
+        if ("1".equals(lifeBlacklist.getBlockedType())) {
+            StoreUser storeUser = storeUserMapper.selectById(lifeBlacklist.getBlockedId());
+            if (storeUser != null) blockedPhoneId = "store_" + storeUser.getPhone();
+        } else {
+            LifeUser lifeUser = lifeUserMapper.selectById(lifeBlacklist.getBlockedId());
+            if (lifeUser != null) blockedPhoneId = "user_" + lifeUser.getUserPhone();
+        }
+        lifeBlacklist.setBlockerPhoneId(blockerPhoneId);
+        lifeBlacklist.setBlockedPhoneId(blockedPhoneId);
+        int num = lifeBlacklistMapper.insert(lifeBlacklist);
+        if (baseRedisService.hasKey("blackList_" + blockedPhoneId)) {
+            baseRedisService.setListRight("blackList_" + blockedPhoneId, blockerPhoneId);
+        } else {
+            baseRedisService.setSaveOrOverwriteScriptList("blackList_" + blockedPhoneId, Arrays.asList(blockerPhoneId));
+        }
+        return num;
     }
 
     @Override
@@ -107,12 +138,17 @@ public class LifeBlacklistServiceImpl extends ServiceImpl<LifeBlacklistMapper, L
 
     @Override
     public int cancelBlacklist(LifeBlacklist lifeBlacklist) {
-        LambdaUpdateWrapper<LifeBlacklist> wrapper = new LambdaUpdateWrapper<>();
-        wrapper.eq(LifeBlacklist::getBlockedId, lifeBlacklist.getBlockedId());
-        wrapper.eq(LifeBlacklist::getBlockerId, lifeBlacklist.getBlockerId());
-        wrapper.eq(LifeBlacklist::getBlockedType, lifeBlacklist.getBlockedType());
-        wrapper.eq(LifeBlacklist::getBlockerType, lifeBlacklist.getBlockerType());
-        return lifeBlacklistMapper.delete(wrapper);
+        LifeBlacklist black = lifeBlacklistMapper.selectById(lifeBlacklist.getId());
+        if (black == null) return 0;
+//        LambdaUpdateWrapper<LifeBlacklist> wrapper = new LambdaUpdateWrapper<>();
+//        wrapper.eq(LifeBlacklist::getBlockedId, lifeBlacklist.getBlockedId());
+//        wrapper.eq(LifeBlacklist::getBlockerId, lifeBlacklist.getBlockerId());
+//        wrapper.eq(LifeBlacklist::getBlockedType, lifeBlacklist.getBlockedType());
+//        wrapper.eq(LifeBlacklist::getBlockerType, lifeBlacklist.getBlockerType());
+        if (baseRedisService.hasKey("blackList_" + black.getBlockedPhoneId())) {
+            baseRedisService.removeAllOccurrences("blackList_" + black.getBlockedPhoneId(), black.getBlockerPhoneId());
+        }
+        return lifeBlacklistMapper.deleteById(black.getId());
     }