Browse Source

Merge branch 'master' into 20250912-wyp-illegalNotice

wangyunpeng 6 days ago
parent
commit
4176901cf8

+ 75 - 58
api-module/src/main/java/com/tzld/piaoquan/api/job/wecom/thirdpart/WeComCreateRoomJob.java

@@ -2,7 +2,6 @@ package com.tzld.piaoquan.api.job.wecom.thirdpart;
 
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import com.tzld.piaoquan.api.component.WeComThirdPartyApiClient;
-import com.tzld.piaoquan.api.controller.GetRoomUserListResponse;
 import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.ThirdPartWeComRoomMapper;
 import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.ext.ThirdPartWeComMapperExt;
 import com.tzld.piaoquan.api.model.param.wecom.thirdpart.*;
@@ -11,6 +10,8 @@ import com.tzld.piaoquan.api.model.po.wecom.thirdpart.ThirdPartWeComRoomUser;
 import com.tzld.piaoquan.api.model.po.wecom.thirdpart.ThirdPartWeComStaff;
 import com.tzld.piaoquan.api.model.po.wecom.thirdpart.ThirdPartWeComStaffUser;
 import com.tzld.piaoquan.api.service.WeComThirdPartyService;
+import com.tzld.piaoquan.growth.common.utils.DateUtil;
+import com.tzld.piaoquan.growth.common.utils.RedisUtils;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.extern.slf4j.Slf4j;
@@ -38,21 +39,19 @@ public class WeComCreateRoomJob {
     @Autowired
     ThirdPartWeComMapperExt thirdPartWeComMapperExt;
 
-    @Value("${create.room.send.msg.status.nums:20}")
-    private Integer sendMsgStatusNums;
+    @Autowired
+    private RedisUtils redisUtils;
 
-    @Value("${create.room.member.max.nums:40}")
+    @Value("${create.room.member.max.nums:39}")
     private Integer memberMaxNums;
-
-    @Value("${create.room.auto.send.msg:false}")
-    private Boolean autoSendMsg;
-
-    @Value("${create.room.daily.max.num:50}")
+    @Value("${create.room.daily.max.num:5}")
     private Integer dailyMaxNum;
+    @Value("${create.room.daily.max.add.user.times:5}")
+    private Integer dailyMaxAddUserTimes;
 
     private final static ExecutorService pool = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.SECONDS,
             new LinkedBlockingQueue<>(1000),
-            new ThreadFactoryBuilder().setNameFormat("AutoCreateRoomJob-%d").build(),
+            new ThreadFactoryBuilder().setNameFormat("WeComCreateRoomJob-%d").build(),
             new ThreadPoolExecutor.AbortPolicy());
 
     @XxlJob("autoCreateRoom")
@@ -89,7 +88,7 @@ public class WeComCreateRoomJob {
             return;
         }
         // 已创建群添加群成员
-        List<ThirdPartWeComRoom> roomList = weComThirdPartyService.getStaffRoomList(staff.getId());
+        List<ThirdPartWeComRoom> roomList = weComThirdPartyService.getAllStaffRoomList(staff.getId());
         List<Integer> roomNums = roomList.stream()
                 .map(o -> {
                     try {
@@ -106,23 +105,6 @@ public class WeComCreateRoomJob {
                 .sorted(Comparator.comparing(Integer::intValue).reversed())
                 .collect(Collectors.toList());
         Integer maxRoomNum = CollectionUtils.isNotEmpty(roomNums) ? roomNums.get(0) : 0;
-        for (ThirdPartWeComRoom room : roomList) {
-            if (room.getAddUserStatus() != 1) {
-                continue;
-            }
-            List<Long> vids = new ArrayList<>();
-            List<ThirdPartWeComStaffUser> addUserList = new ArrayList<>();
-            Iterator<ThirdPartWeComStaffUser> iterator = staffUserList.iterator();
-            int size = memberMaxNums - room.getMemberCount();
-            while (iterator.hasNext() && size > 0) {
-                ThirdPartWeComStaffUser item = iterator.next();
-                vids.add(item.getUserId());
-                size--;
-                iterator.remove();
-                addUserList.add(item);
-            }
-            addRoomUser(staff, room, vids, room, addUserList);
-        }
         // 获取当日新创建群 达到上限 不创建
         Long roomCount = weComThirdPartyService.getTodayCreateRoomCount(staff.getId());
         if (roomCount >= dailyMaxNum) {
@@ -132,17 +114,22 @@ public class WeComCreateRoomJob {
         if (CollectionUtils.isNotEmpty(staffUserList)) {
             createNewRoom(staff, staffUserList, maxRoomNum);
         }
-        userDetailJob.syncRoomList(staff.getThirdUuid(), staff);
+        userDetailJob.syncRoomList(staff);
     }
 
     private CommonResponse<String> addRoomUser(ThirdPartWeComStaff staff,
                                                ThirdPartWeComRoom room,
                                                List<Long> vids,
-                                               ThirdPartWeComRoom roomDetail,
                                                List<ThirdPartWeComStaffUser> addUserList) {
         if (room.getAddUserStatus() != 1 || room.getMemberCount() >= memberMaxNums) {
             return null;
         }
+        String dateStr = DateUtil.getCurrentDateStr("yyyyMMdd");
+        String key = "addRoomUserTimes:" + dateStr + ":" + staff.getThirdStaffId() + ":" + room.getThirdRoomId();
+        int addRoomUserTimes = redisUtils.getInteger(key);
+        if (addRoomUserTimes >= dailyMaxAddUserTimes) {
+            return null;
+        }
         InvitationToRoomRequest request = new InvitationToRoomRequest();
         request.setUuid(staff.getThirdUuid());
         request.setRoomid(Long.parseLong(room.getThirdRoomId()));
@@ -150,8 +137,9 @@ public class WeComCreateRoomJob {
         CommonResponse<String> commonResponse = weComThirdPartyService.invitationToRoom(request);
         if (Objects.nonNull(commonResponse)) {
             // 群成员添加存储
-            saveRoomUser(roomDetail, addUserList);
+            saveRoomUser(room, addUserList);
         }
+        redisUtils.setIncrementValue(key, 1, 24 * 60 * 60L);
         return commonResponse;
     }
 
@@ -195,31 +183,6 @@ public class WeComCreateRoomJob {
         roomMapper.insertSelective(roomDetail);
         // 群成员添加存储
         saveRoomUser(roomDetail, addUserList);
-        // 循环添加群成员
-        while (true) {
-            GetRoomUserListRequest roomUserListRequest = new GetRoomUserListRequest(staff.getThirdUuid(),
-                    Long.valueOf(createRoomWxResponse.getRoomid()));
-            List<GetRoomUserListResponse.Member> userList = weComThirdPartyService.getRoomUserList(roomUserListRequest);
-            roomDetail.setMemberCount(userList.size());
-            roomDetail.setAddUserStatus(userList.size() == memberMaxNums ? 0 : 1);
-            roomDetail.setSendStatus(userList.size() > sendMsgStatusNums && autoSendMsg ? 1 : 0);
-            roomMapper.updateByPrimaryKeySelective(roomDetail);
-            if (!iterator.hasNext() || userList.size() == memberMaxNums) {
-                break;
-            }
-            vids = new ArrayList<>();
-            size = Math.min(staffUserList.size(), memberMaxNums - userList.size());
-            while (iterator.hasNext() && size > 0) {
-                ThirdPartWeComStaffUser item = iterator.next();
-                vids.add(item.getUserId());
-                size--;
-                iterator.remove();
-            }
-            CommonResponse<String> commonResponse = addRoomUser(staff, roomDetail, vids, roomDetail, addUserList);
-            if (Objects.isNull(commonResponse)) {
-                break;
-            }
-        }
         //}
     }
 
@@ -245,7 +208,7 @@ public class WeComCreateRoomJob {
         //apiClient.addRoomAdmins();
     }
 
-    private void saveRoomUser(ThirdPartWeComRoom roomDetail,
+    private void saveRoomUser(ThirdPartWeComRoom room,
                               List<ThirdPartWeComStaffUser> addUserList) {
         if (CollectionUtils.isEmpty(addUserList)) {
             return;
@@ -253,7 +216,7 @@ public class WeComCreateRoomJob {
         List<ThirdPartWeComRoomUser> saveList = new ArrayList<>();
         for (ThirdPartWeComStaffUser staffUser : addUserList) {
             ThirdPartWeComRoomUser roomUser = new ThirdPartWeComRoomUser();
-            roomUser.setThirdRoomId(roomDetail.getThirdRoomId());
+            roomUser.setThirdRoomId(room.getThirdRoomId());
             roomUser.setCreateTime(new Date());
             roomUser.setUpdateTime(new Date());
             roomUser.setUin(staffUser.getUserId());
@@ -264,4 +227,58 @@ public class WeComCreateRoomJob {
         }
     }
 
+    @XxlJob("autoAddRoomUser")
+    public ReturnT<String> autoAddRoomUserJob(String param) {
+        List<ThirdPartWeComStaff> activeStaffList = weComThirdPartyService.getActiveStaffList();
+        CountDownLatch cdl = new CountDownLatch(activeStaffList.size());
+        for (ThirdPartWeComStaff staff : activeStaffList) {
+            if (staff.getAutoCreateRoom() != 1) {
+                cdl.countDown();
+                continue;
+            }
+            pool.execute(() -> {
+                try {
+                    addStaffRoomUser(staff);
+                } catch (Exception e) {
+                    log.error("addStaffRoomUser error", e);
+                } finally {
+                    cdl.countDown();
+                }
+            });
+        }
+        try {
+            cdl.await();
+        } catch (InterruptedException e) {
+            log.error("autoAddRoomUserJob error", e);
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    private void addStaffRoomUser(ThirdPartWeComStaff staff) {
+        // 获取所有未加群客户
+        List<ThirdPartWeComStaffUser> staffUserList = thirdPartWeComMapperExt.getNoGroupStaffUserList(staff.getThirdStaffId());
+        if (CollectionUtils.isEmpty(staffUserList)) {
+            return;
+        }
+        List<ThirdPartWeComRoom> roomList = weComThirdPartyService.getStaffRoomList(staff.getId());
+        for (ThirdPartWeComRoom room : roomList) {
+            if (room.getAddUserStatus() != 1) {
+                continue;
+            }
+            List<Long> vids = new ArrayList<>();
+            List<ThirdPartWeComStaffUser> addUserList = new ArrayList<>();
+            Iterator<ThirdPartWeComStaffUser> iterator = staffUserList.iterator();
+            int size = memberMaxNums - room.getMemberCount();
+            while (iterator.hasNext() && size > 0) {
+                ThirdPartWeComStaffUser item = iterator.next();
+                vids.add(item.getUserId());
+                size--;
+                iterator.remove();
+                addUserList.add(item);
+            }
+            addRoomUser(staff, room, vids, addUserList);
+        }
+        userDetailJob.syncRoomList(staff);
+    }
+
 }

+ 9 - 10
api-module/src/main/java/com/tzld/piaoquan/api/job/wecom/thirdpart/WeComUserDetailJob.java

@@ -76,8 +76,7 @@ public class WeComUserDetailJob {
                     }
                     String response = apiClient.getRunClientByUuid(new UuidRequest(uuid));
                     CommonResponse<LoginInfo> commonResponse =
-                            JSONObject.parseObject(response, new TypeReference<CommonResponse<LoginInfo>>() {
-                            });
+                            JSONObject.parseObject(response, new TypeReference<CommonResponse<LoginInfo>>() {});
                     if (commonResponse.getErrcode() == 0) {
                         LoginInfo loginInfo = commonResponse.getData();
                         staff.setAvatar(loginInfo.getUser_info().getObject().getAvatar());
@@ -85,8 +84,8 @@ public class WeComUserDetailJob {
                         staff.setUpdateTime(new Date());
                         staffMapper.updateByPrimaryKeySelective(staff);
                     }
-                    syncRoomList(uuid, staff);
-                    syncStaffUserList(uuid, staff);
+                    syncRoomList(staff);
+                    syncStaffUserList(staff);
                 } catch (Exception e) {
                     log.error("syncUserDetail error", e);
                 } finally {
@@ -102,9 +101,9 @@ public class WeComUserDetailJob {
         return ReturnT.SUCCESS;
     }
 
-    private void syncStaffUserList(String uuid, ThirdPartWeComStaff staff) {
+    private void syncStaffUserList(ThirdPartWeComStaff staff) {
         List<ExternalContactsResponse.ContactItem> contactItemList = thirdPartyService.getExternalContacts(
-                new GetExternalContactsRequest(uuid, 100, 0));
+                new GetExternalContactsRequest(staff.getThirdUuid(), 100, 0));
         if (CollectionUtils.isEmpty(contactItemList)) {
             return;
         }
@@ -187,7 +186,7 @@ public class WeComUserDetailJob {
         for (ThirdPartWeComStaff staff : activeStaffList) {
             pool.execute(() -> {
                 try {
-                    syncRoomList(staff.getThirdUuid(), staff);
+                    syncRoomList(staff);
                 } finally {
                     cdl.countDown();
                 }
@@ -201,9 +200,9 @@ public class WeComUserDetailJob {
         return ReturnT.SUCCESS;
     }
 
-    public void syncRoomList(String uuid, ThirdPartWeComStaff staff) {
+    public void syncRoomList(ThirdPartWeComStaff staff) {
         List<GetChatroomMembersResponse.RoomInfo> roomInfoList =
-                thirdPartyService.getChatroomMembers(new GetChatroomMembersRequest(uuid, 100, 0));
+                thirdPartyService.getChatroomMembers(new GetChatroomMembersRequest(staff.getThirdUuid(), 100, 0));
         List<ThirdPartWeComRoom> roomList = thirdPartyService.getStaffRoomList(staff.getId());
         Map<String, ThirdPartWeComRoom> roomMap = roomList.stream()
                 .collect(Collectors.toMap(ThirdPartWeComRoom::getThirdRoomId, room -> room));
@@ -241,7 +240,7 @@ public class WeComUserDetailJob {
                 }
                 roomMapper.updateByPrimaryKeySelective(roomDetail);
             }
-            syncRoomUserList(uuid, roomDetail.getThirdRoomId());
+            syncRoomUserList(staff.getThirdUuid(), roomDetail.getThirdRoomId());
         }
         List<String> roomIds = roomInfoList.stream().map(GetChatroomMembersResponse.RoomInfo::getRoom_id).collect(Collectors.toList());
         roomList.removeIf(room -> roomIds.contains(room.getThirdRoomId()));

+ 2 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/WeComThirdPartyService.java

@@ -35,6 +35,8 @@ public interface WeComThirdPartyService {
 
     List<ThirdPartWeComStaff> getActiveStaffList();
 
+    List<ThirdPartWeComRoom> getAllStaffRoomList(Long staffId);
+
     List<ThirdPartWeComRoom> getStaffRoomList(Long staffId);
 
     CreateRoomWxResponse createRoom(CreateRoomWxRequest request);

+ 9 - 3
api-module/src/main/java/com/tzld/piaoquan/api/service/impl/WeComThirdPartyServiceImpl.java

@@ -309,12 +309,19 @@ public class WeComThirdPartyServiceImpl implements WeComThirdPartyService {
     }
 
     @Override
-    public List<ThirdPartWeComRoom> getStaffRoomList(Long staffId) {
+    public List<ThirdPartWeComRoom> getAllStaffRoomList(Long staffId) {
         ThirdPartWeComRoomExample example = new ThirdPartWeComRoomExample();
         example.createCriteria().andStaffIdEqualTo(staffId);
         return thirdPartWeComRoomMapper.selectByExample(example);
     }
 
+    @Override
+    public List<ThirdPartWeComRoom> getStaffRoomList(Long staffId) {
+        ThirdPartWeComRoomExample example = new ThirdPartWeComRoomExample();
+        example.createCriteria().andStaffIdEqualTo(staffId).andIsDeleteEqualTo(0);
+        return thirdPartWeComRoomMapper.selectByExample(example);
+    }
+
     @Override
     public CreateRoomWxResponse createRoom(CreateRoomWxRequest request) {
         String response = apiClient.createRoomWx(request);
@@ -343,8 +350,7 @@ public class WeComThirdPartyServiceImpl implements WeComThirdPartyService {
             request.setLastIndexInfo(lastIndexInfo);
             String response = apiClient.queryCRMAntiSpamRule(request);
             CommonResponse<AntiSpamRuleResponse> commonResponse =
-                    JSONObject.parseObject(response, new TypeReference<CommonResponse<AntiSpamRuleResponse>>() {
-                    });
+                    JSONObject.parseObject(response, new TypeReference<CommonResponse<AntiSpamRuleResponse>>() {});
             if (commonResponse.getErrcode() != 0) {
                 log.error("WeComThirdPartyService query crm AntiSpamRule failed, request: {}, response: {}", request, response);
                 return result;

+ 5 - 0
api-module/src/test/java/com/tzld/piaoquan/api/WeComThirdPartTest.java

@@ -47,4 +47,9 @@ public class WeComThirdPartTest {
         weComCreateRoomJob.autoCreateRoomJob("");
     }
 
+    @Test
+    public void autoAddRoomUserJob() {
+        weComCreateRoomJob.autoAddRoomUserJob("");
+    }
+
 }

+ 10 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/utils/RedisUtils.java

@@ -78,6 +78,16 @@ public class RedisUtils {
         }
     }
 
+    public void setIncrementValue(String key, Integer value, Long expireTime) {
+        // 只在第一次进行设置过期时间
+        if (!containsKey(key)) {
+            redisTemplate.opsForValue().increment(key, value);
+            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
+        } else {
+            redisTemplate.opsForValue().increment(key, value);
+        }
+    }
+
     public void setDecrementValue(String key, double value) {
         redisTemplate.opsForValue().increment(key, -value);
     }