Browse Source

判断群开关打开时间,内置的防误踢规则从开启开关时生效

刘立冬 1 month ago
parent
commit
e9549f5c1d

+ 23 - 8
risk-control-core/src/main/java/com/tzld/piaoquan/risk/control/service/impl/RiskRuleConfigService.java

@@ -2,6 +2,9 @@ package com.tzld.piaoquan.risk.control.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.tzld.piaoquan.risk.control.config.QywxConfig;
+import com.tzld.piaoquan.risk.control.dao.mapper.WorkWechatRoomInfoMapper;
+import com.tzld.piaoquan.risk.control.model.po.WorkWechatRoomInfo;
+import com.tzld.piaoquan.risk.control.model.po.WorkWechatRoomInfoExample;
 import com.tzld.piaoquan.risk.control.model.qywx.RoomListResponse;
 import com.tzld.piaoquan.risk.control.model.qywx.UserListFromAdPlatformModel;
 import com.tzld.piaoquan.risk.control.util.HttpClientUtil;
@@ -21,18 +24,18 @@ public class RiskRuleConfigService {
     private static final int USER_COUNT_THRESHOLD = 1; //生效人数阈值
     private static final int USER_COUNT_THRESHOLD_FOR_ANOMALY_USER_RATIO = 30; //大于30人才触发是否关闭判断
     private static final float ANOMALY_USER_RATIO = 0.2f; //异常用户比例20%
+    @Autowired
+    private WorkWechatRoomInfoMapper mapper;
 
     @Autowired
     private QywxConfig config;
     @Value("${qywx.corpid}")
     private long corpid;
     private static final HttpPoolClient httpPoolClientDefault = HttpClientUtil.create(10000, 10000, 2000, 5000, 5, 10000);
-
     @Value("${getUserList.url:https://api.piaoquantv.com/ad/platform/wechat/group/groupUserDetailData}")
     private String getUserList;
     Map<String, List<RoomListResponse.RoomInfo>> getKickOpenedRoom(Map<String, List<RoomListResponse.RoomInfo>> tobeOperate) {
         Map<String, List<RoomListResponse.RoomInfo>> filteredMap = new HashMap<>();
-
         for (Map.Entry<String, List<RoomListResponse.RoomInfo>> entry : tobeOperate.entrySet()) {
             List<RoomListResponse.RoomInfo> filteredRooms = new ArrayList<>();
 
@@ -53,17 +56,31 @@ public class RiskRuleConfigService {
 
 
     //防止误踢,只有满足存在五个正常群人数才会生效
-    public FixedRuleResult getFixedRulesForThisChat(String chatId) {
+    public FixedRuleResult getFixedRulesForThisChat(String chatId, String roomId) {
         FixedRuleResult ruleResult = new FixedRuleResult();
+        WorkWechatRoomInfoExample example = new WorkWechatRoomInfoExample();
+        example.createCriteria().andRoomIdEqualTo(roomId);
+        List<WorkWechatRoomInfo> examples = mapper.selectByExample(example);
+        if (examples == null || examples.isEmpty()) {
+            log.error("getFixedRulesForThisChat, no room found for roomId: {}", roomId);
+            return ruleResult;
+        }
+        WorkWechatRoomInfo roomInfo = examples.get(0);
+        long roomUpdateTime = roomInfo.getUpdateTime().getTime()/1000;
+        log.info("getFixedRulesForThisChat, roomId: {}, roomUpdateTime: {}", roomId, roomUpdateTime);
         List<UserListFromAdPlatformModel.ChatMember> memberList = getUserListFromAdPlatform(chatId);
         if (memberList == null || memberList.isEmpty()) {
             log.error("checkIfOpenedForFixedRules, memberList is empty for chatId: {}", chatId);
             return ruleResult;
         } else {
-            int size = memberList.size();//群总数,包括异常和正常
-            //memberList中isAbnormal是0代表正常用户
+            //开关开启后的加入的数量
+            int size = (int) memberList.stream()
+                    .filter(member -> member.getJoinTime() != null && member.getJoinTime() > roomUpdateTime)
+                    .count();;//群总数,包括异常和正常
+            //memberList中isAbnormal是0代表正常用户,判断joinTime是否大于updateTime
             int normalSize = (int) memberList.stream()
-                    .filter(member -> member.getIsAbnormal() == 0)
+                    .filter(member -> member.getIsAbnormal() == 0).filter(
+                            member -> member.getJoinTime() != null && member.getJoinTime() > roomUpdateTime)
                     .count();
             ruleResult.normalCount = normalSize;
             ruleResult.abnormalCount = size - normalSize;
@@ -88,9 +105,7 @@ public class RiskRuleConfigService {
                 log.info("checkIfOpenedForFixedRules, chatId: {}, size: {}, normalSize: {}, not enough normal users", chatId, size, normalSize);
                 return ruleResult;
             }
-
         }
-
     }
 
 

+ 41 - 10
risk-control-core/src/main/java/com/tzld/piaoquan/risk/control/service/impl/RiskUserHandleService.java

@@ -57,18 +57,29 @@ public class RiskUserHandleService {
                 log.info("handleRiskUser, externalId2Vid error, staff: {}, riskUserInfo: {}", staff, riskUserInfo);
                 continue;
             }
-
+            //这里的room都是已经打开的
             for (RoomListResponse.RoomInfo roomInfo : roomInfoList) {
-                RiskRuleConfigService.FixedRuleResult ruleResult = riskRuleConfigService.getFixedRulesForThisChat(riskUserInfo.getChatId());
-                log.info("handleRiskUser, ruleResult: {}, roomInfo: {}", ruleResult, roomInfo);
-                if(ruleResult.isNormalCountEnough && !ruleResult.isAbnormalRatioHighEnough) {//正常进入用户满足需求,且异常率符合阈值
-                    boolean success = riskUserOperateService.checkAndKickExternalUser(staff, riskUserInfo, externalVid,Long.parseLong(roomInfo.getRoomId()));
-                    if (success) {
-                        log.info("handleRiskUser to be kick user, vid: {},name: {}", externalVid,riskUserInfo.getExternalNickname());
-                        return 1;
+                if (riskUserOperateService.isInRoom(staff, externalVid,Long.parseLong(roomInfo.getRoomId()))){//risk用户在这个群内,且开关打开
+                    //固定规则校验,chatId转化到roomId
+                    long roomId = chatIdToRoomId(staff.getUuid(), riskUserInfo.getChatId());
+                    if ((roomInfo + "").equals(roomInfo.getRoomId())) {//匹配群
+                        log.info("handleRiskUser, chatIdToRoomId , staff: {}, riskUserInfo: {}", staff, riskUserInfo);
+                        RiskRuleConfigService.FixedRuleResult ruleResult = riskRuleConfigService.getFixedRulesForThisChat(riskUserInfo.getChatId(),roomId +"");
+                        log.info("handleRiskUser, ruleResult: {}, roomInfo: {}", ruleResult, roomInfo);
+                        if(ruleResult.isNormalCountEnough && !ruleResult.isAbnormalRatioHighEnough) {//正常进入用户满足需求,且异常率符合阈值
+                            boolean success = riskUserOperateService.checkAndKickExternalUser(staff, riskUserInfo, externalVid,Long.parseLong(roomInfo.getRoomId()));
+                            if (success) {
+                                log.info("handleRiskUser to be kick user, vid: {},name: {},chatId: {},chatName:{} ", externalVid,riskUserInfo.getExternalNickname(),riskUserInfo.getChatId(),riskUserInfo.getGroupName());
+                                return 1;
+                            }
+                        } else {
+                            if(ruleResult.isAbnormalRatioHighEnough) {//关闭群开关,写入展示提示信息字段
+                                riskUserOperateService.forceCloseRoomSwitch(roomId +"");
+                            }
+                            log.info("handleRiskUser, ruleResult not enough, isNormalCountEnough: {}, isAnomalyUserRatioEnough: {}", ruleResult.isNormalCountEnough, ruleResult.isAbnormalRatioHighEnough);
+                        }
                     }
-                } else {
-                    log.info("handleRiskUser, ruleResult not enough, isNormalCountEnough: {}, isAnomalyUserRatioEnough: {}", ruleResult.isNormalCountEnough, ruleResult.isAbnormalRatioHighEnough);
+
                 }
 
             }
@@ -200,4 +211,24 @@ public class RiskUserHandleService {
         return -1;
     }
 
+    public long chatIdToRoomId(String uuid,String chatId) {
+        long room_id = -1;
+        String url = qywxConfig.getDomain() + qywxConfig.getPath("chatIdToRoomId");
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("uuid", uuid);
+        requestBody.put("corpid", corpid);
+        requestBody.put("chatid", chatId);
+        Optional<String> result = httpPoolClientDefault.postJson(url,JSON.toJSONString(requestBody));
+        log.info("chatIdToRoomId, url: {}, requestBody: {}, result: {}", url, requestBody, result);
+        if (result.isPresent()) {
+            try {
+                room_id = JSON.parseObject(result.get()).getJSONObject("data").getLong("room_id");
+            } catch (Exception e) {
+                log.error("findRoomAndClosed, error parsing response: {}", result.get(), e);
+            }
+        }
+        log.info("chatIdToRoomId, room_id: {}", room_id);
+        return room_id;
+    }
+
 }

+ 17 - 27
risk-control-core/src/main/java/com/tzld/piaoquan/risk/control/service/impl/RiskUserOperateService.java

@@ -2,7 +2,10 @@ package com.tzld.piaoquan.risk.control.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.tzld.piaoquan.risk.control.config.QywxConfig;
+import com.tzld.piaoquan.risk.control.dao.mapper.WorkWechatRoomInfoMapper;
 import com.tzld.piaoquan.risk.control.model.po.UserBase;
+import com.tzld.piaoquan.risk.control.model.po.WorkWechatRoomInfo;
+import com.tzld.piaoquan.risk.control.model.po.WorkWechatRoomInfoExample;
 import com.tzld.piaoquan.risk.control.model.qywx.QwCommonResModel;
 import com.tzld.piaoquan.risk.control.model.qywx.RiskUserInfo;
 import com.tzld.piaoquan.risk.control.model.qywx.RoomListResponse;
@@ -10,13 +13,13 @@ import com.tzld.piaoquan.risk.control.model.qywx.RoomMemberListInfo;
 import com.tzld.piaoquan.risk.control.util.HttpClientUtil;
 import com.tzld.piaoquan.risk.control.util.HttpPoolClient;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.lang.reflect.Array;
 import java.util.*;
 
 @Slf4j
@@ -25,10 +28,10 @@ public class RiskUserOperateService {
     @Autowired
     private QywxConfig qywxConfig; // 注入配置类
 
+    @Autowired
+    private WorkWechatRoomInfoMapper workWechatRoomInfoMapper;
     @Value("${qywx.corpid}")
     private long corpid;
-    @Autowired
-    private QywxUserDataService qwUserService;
     private static final HttpPoolClient httpPoolClientDefault = HttpClientUtil.create(10000, 10000, 2000, 5000, 5, 10000);
     private static final Logger LOGGER = LoggerFactory.getLogger(RiskUserHandleService.class);
 
@@ -45,7 +48,7 @@ public class RiskUserOperateService {
         return true;
     }
 
-    private void kick(UserBase staff, long roomId, long vid) {
+    public void kick(UserBase staff, long roomId, long vid) {
         Map<String, Object> requestBody = new HashMap<>();
         requestBody.put("uuid", staff.getUuid());
         requestBody.put("oprType", 1);
@@ -100,29 +103,16 @@ public class RiskUserOperateService {
         return memberList;
     }
 
-    public void findRoomAndClosed(List<RoomListResponse.RoomInfo> filerRooms, String chatId, UserBase staff) {
-        if (filerRooms == null || filerRooms.isEmpty()) {
-            log.info("findRoomAndClosed, filerRooms is empty for chatId: {}", chatId);
-            return;
-        }
-        String url = qywxConfig.getDomain() + qywxConfig.getPath("chatIdToRoomId");
-        Map<String, Object> requestBody = new HashMap<>();
-        requestBody.put("uuid", staff.getUuid());
-        requestBody.put("corpid", corpid);
-        requestBody.put("chatid", chatId);
-        Optional<String> result = httpPoolClientDefault.postJson(url,JSON.toJSONString(requestBody));
-        if (!result.isPresent()) {
-            log.error("findRoomAndClosed, result is empty for chatId: {}", chatId);
-            return;
-        } else {
-            String roomId = "";
-            try {
-                roomId = JSON.parseObject(result.get()).getJSONObject("data").getString("room_id");
-            } catch (Exception e) {
-                log.error("findRoomAndClosed, error parsing response: {}", result.get(), e);
-                return;
-            }
+    public void forceCloseRoomSwitch(String roomId) {
+        WorkWechatRoomInfoExample example = new WorkWechatRoomInfoExample();
+        example.createCriteria().andRoomIdEqualTo(roomId);
+        List<WorkWechatRoomInfo> workWechatRoomInfos = workWechatRoomInfoMapper.selectByExample(example);
+        if (CollectionUtils.isNotEmpty(workWechatRoomInfos)) {
+            WorkWechatRoomInfo workWechatRoomInfo = workWechatRoomInfos.get(0);
+            workWechatRoomInfo.setAutoRemoveUserSwitch(0);
+            workWechatRoomInfo.setUpdateTime(new Date());
+            workWechatRoomInfoMapper.updateByPrimaryKeySelective(workWechatRoomInfo);
+            log.info("forceCloseRoomSwitch, roomId: {}, autoRemoveUserSwitch set to 0", roomId);
         }
-
     }
 }

+ 1 - 0
risk-control-core/src/main/java/com/tzld/piaoquan/risk/control/service/impl/WorkWechatServiceImpl.java

@@ -135,6 +135,7 @@ public class WorkWechatServiceImpl implements WorkWechatService {
             WorkWechatRoomInfo workWechatRoomInfo = workWechatRoomInfos.get(0);
             workWechatRoomInfo.setAutoRemoveUserSwitch(param.getAutoRemoveUserSwitch());
             workWechatRoomInfo.setUpdateUser(userId);
+            workWechatRoomInfo.setUpdateTime(new Date());
             workWechatRoomInfoMapper.updateByPrimaryKeySelective(workWechatRoomInfo);
         } else {
             WorkWechatRoomInfo workWechatRoomInfo = new WorkWechatRoomInfo();

+ 2 - 1
risk-control-server/src/test/java/com/tzld/piaoquan/risk/control/service/DemoServiceTest.java

@@ -33,6 +33,7 @@ public class DemoServiceTest extends BaseTest {
 //        Map<String,Object> map = new HashMap<>();
 //        map.put("video_id",1);
 //        mongoTemplate.insert(map, "content_understanding_info");
-        riskRuleConfigService.getFixedRulesForThisChat("wrreQkBgAAK-2WCnCa7BWIWoGskw7faQ");
+//        riskRuleConfigService.getFixedRulesForThisChat("wrreQkBgAAK-2WCnCa7BWIWoGskw7faQ");
+        riskUserHandleService.chatIdToRoomId("2f8c87fd08bd25abdf6b34db7f798d89", "wrreQkBgAAK-2WCnCa7BWIWoGskw7faQ");
     }
 }