Forráskód Böngészése

Merge branch '20251119-wyp-weCom' into test

wangyunpeng 4 hete
szülő
commit
f791ca2aca

+ 7 - 0
api-module/src/main/java/com/tzld/piaoquan/api/controller/wecom/thirdpart/WeComThirdPartyAccountController.java

@@ -3,6 +3,7 @@ package com.tzld.piaoquan.api.controller.wecom.thirdpart;
 import com.tzld.piaoquan.api.model.param.wecom.thirdpart.*;
 import com.tzld.piaoquan.api.model.vo.IdNameVO;
 import com.tzld.piaoquan.api.model.vo.contentplatform.AccountQrCodeVO;
+import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.CheckPushAccountExistVO;
 import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountConfigVO;
 import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountVO;
 import com.tzld.piaoquan.api.service.wecom.thirdparty.WeComThirdPartyAccountService;
@@ -61,6 +62,12 @@ public class WeComThirdPartyAccountController {
         return CommonResponse.success(service.getAccountConfig(param));
     }
 
+    @ApiOperation(value = "检查推送人员是否在所有群内")
+    @PostMapping("/checkPushAccountExist")
+    public CommonResponse<CheckPushAccountExistVO> checkPushAccountExist(@RequestBody ThirdPartyAccountConfigParam param) {
+        return CommonResponse.success(service.checkPushAccountExist(param));
+    }
+
     @ApiOperation(value = "账号配置保存")
     @PostMapping("/saveAccountConfig")
     public CommonResponse<Void> saveAccountConfig(@RequestBody ThirdPartyAccountConfigParam param) {

+ 25 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/wecom/thirdpart/CheckPushAccountExistVO.java

@@ -0,0 +1,25 @@
+package com.tzld.piaoquan.api.model.vo.wecom.thirdpart;
+
+import com.tzld.piaoquan.api.model.vo.IdNameVO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CheckPushAccountExistVO {
+    @ApiModelProperty(value = "校验是否通过 ,true 校验通过,false 校验不通过")
+    private Boolean pass = true;
+    @ApiModelProperty(value = "校验不通过的群列表")
+    private List<Room> notExistRooms;
+
+    @Data
+    public static class Room {
+        @ApiModelProperty(value = "群ID")
+        private Long roomId;
+        @ApiModelProperty(value = "群名称")
+        private String name;
+        @ApiModelProperty(value = "校验不通过的推送人员列表")
+        private List<IdNameVO<Long>> notExistPushAccounts;
+    }
+}

+ 3 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/thirdparty/WeComThirdPartyAccountService.java

@@ -4,6 +4,7 @@ import com.tzld.piaoquan.api.model.param.wecom.thirdpart.*;
 import com.tzld.piaoquan.api.model.po.wecom.thirdpart.ThirdPartWeComStaffConfig;
 import com.tzld.piaoquan.api.model.vo.IdNameVO;
 import com.tzld.piaoquan.api.model.vo.contentplatform.AccountQrCodeVO;
+import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.CheckPushAccountExistVO;
 import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountConfigVO;
 import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountVO;
 import com.tzld.piaoquan.growth.common.utils.page.Page;
@@ -24,6 +25,8 @@ public interface WeComThirdPartyAccountService {
 
     ThirdPartyAccountConfigVO getAccountConfig(ThirdPartyConfigGetParam param);
 
+    CheckPushAccountExistVO checkPushAccountExist(ThirdPartyAccountConfigParam param);
+
     void saveAccountConfig(ThirdPartyAccountConfigParam param);
 
     void logout(ThirdPartyAccountLogOutParam param);

+ 4 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/thirdparty/WeComThirdPartyRoomService.java

@@ -29,6 +29,10 @@ public interface WeComThirdPartyRoomService {
 
     void saveRoomConfig(ThirdPartyRoomConfigParam param, String accountConfigId);
 
+    List<ThirdPartWeComRoomUser> getRoomUserListByRoomId(String thirdRoomId);
+
+    List<ThirdPartWeComRoomUser> getRoomUserListByRoomIds(List<String> thirdRoomIds);
+
     void saveRoomConfig(ThirdPartWeComRoom room, String accountConfigId, ThirdPartyAccountConfigParam param);
 
     void saveRoomConfig(ThirdPartWeComRoom room, String accountConfigId, ThirdPartyAccountConfigVO configVO);

+ 61 - 6
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/thirdparty/impl/WeComThirdPartyAccountServiceImpl.java

@@ -21,10 +21,7 @@ import com.tzld.piaoquan.api.model.param.wecom.thirdpart.*;
 import com.tzld.piaoquan.api.model.po.wecom.thirdpart.*;
 import com.tzld.piaoquan.api.model.vo.IdNameVO;
 import com.tzld.piaoquan.api.model.vo.contentplatform.AccountQrCodeVO;
-import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountConfigTaskContentVO;
-import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountConfigTaskVO;
-import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountConfigVO;
-import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountVO;
+import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.*;
 import com.tzld.piaoquan.api.service.wecom.thirdparty.WeComThirdPartyAccountService;
 import com.tzld.piaoquan.api.service.wecom.thirdparty.WeComThirdPartyRoomService;
 import com.tzld.piaoquan.api.service.wecom.thirdparty.WeComThirdPartyService;
@@ -277,6 +274,44 @@ public class WeComThirdPartyAccountServiceImpl implements WeComThirdPartyAccount
         return staffConfigTaskContentMapper.selectByExample(example);
     }
 
+    @Override
+    public CheckPushAccountExistVO checkPushAccountExist(ThirdPartyAccountConfigParam param) {
+        List<ThirdPartWeComRoom> roomList = getNeedSyncRoomList(param);
+        if (CollectionUtils.isEmpty(roomList)) {
+            return new CheckPushAccountExistVO();
+        }
+        List<String> thirdRoomIds = roomList.stream().map(ThirdPartWeComRoom::getThirdRoomId).collect(Collectors.toList());
+        List<ThirdPartWeComRoomUser> roomUserList = roomService.getRoomUserListByRoomIds(thirdRoomIds);
+        Map<String, List<ThirdPartWeComRoomUser>> roomUserMap = roomUserList.stream().collect(Collectors.groupingBy(ThirdPartWeComRoomUser::getThirdRoomId));
+
+        CheckPushAccountExistVO result = new CheckPushAccountExistVO();
+        result.setNotExistRooms(new ArrayList<>());
+        for (ThirdPartWeComRoom room : roomList) {
+            List<IdNameVO<Long>> notExistPushAccounts = new ArrayList<>();
+            List<ThirdPartWeComRoomUser> roomUsers = roomUserMap.get(room.getThirdRoomId());
+            if (CollectionUtils.isNotEmpty(roomUsers)) {
+                List<Long> thirdStaffIds = roomUsers.stream().map(ThirdPartWeComRoomUser::getUin).collect(Collectors.toList());
+                if (!thirdStaffIds.contains(param.getPrimaryThirdStaffId())) {
+                    notExistPushAccounts.add(new IdNameVO<>(param.getPrimaryThirdStaffId(), param.getPrimaryThirdStaffName()));
+                }
+                if (Objects.nonNull(param.getSecondThirdStaffId()) && !thirdStaffIds.contains(param.getSecondThirdStaffId())) {
+                    notExistPushAccounts.add(new IdNameVO<>(param.getSecondThirdStaffId(), param.getSecondThirdStaffName()));
+                }
+            }
+            if (CollectionUtils.isNotEmpty(notExistPushAccounts)) {
+                CheckPushAccountExistVO.Room roomVO = new CheckPushAccountExistVO.Room();
+                roomVO.setRoomId(room.getId());
+                roomVO.setName(room.getName());
+                roomVO.setNotExistPushAccounts(notExistPushAccounts);
+                result.getNotExistRooms().add(roomVO);
+            }
+        }
+        if (CollectionUtils.isNotEmpty(result.getNotExistRooms())) {
+            result.setPass(false);
+        }
+        return result;
+    }
+
     @Override
     public void saveAccountConfig(ThirdPartyAccountConfigParam param) {
         // check param
@@ -333,6 +368,11 @@ public class WeComThirdPartyAccountServiceImpl implements WeComThirdPartyAccount
     }
 
     private void syncStaffConfigToRoom(ThirdPartyAccountConfigParam param, String accountConfigId) {
+        List<ThirdPartWeComRoom> roomList = getNeedSyncRoomList(param);
+        syncConfig(param, accountConfigId, roomList);
+    }
+
+    private List<ThirdPartWeComRoom> getNeedSyncRoomList(ThirdPartyAccountConfigParam param) {
         List<ThirdPartWeComRoom> roomList;
         if (param.getConfigSync() == ConfigSyncEnum.ALL.getVal()) {
             // 所有群
@@ -348,7 +388,7 @@ public class WeComThirdPartyAccountServiceImpl implements WeComThirdPartyAccount
         List<ThirdPartWeComRoom> noConfigRoomList = roomMapperExt.getNoConfigRoomList(param.getAccountId());
         noConfigRoomList.removeIf(room -> roomIds.contains(room.getId()));
         roomList.addAll(noConfigRoomList);
-        syncConfig(param, accountConfigId, roomList);
+        return roomList;
     }
 
     private void syncConfig(ThirdPartyAccountConfigParam param, String accountConfigId, List<ThirdPartWeComRoom> roomList) {
@@ -356,7 +396,11 @@ public class WeComThirdPartyAccountServiceImpl implements WeComThirdPartyAccount
             return;
         }
         for (ThirdPartWeComRoom room : roomList) {
-            roomService.saveRoomConfig(room, accountConfigId, param);
+            try {
+                roomService.saveRoomConfig(room, accountConfigId, param);
+            } catch (Exception e) {
+                log.error("同步群配置失败, roomId: {}, accountConfigId: {}, errorMsg: {}", room.getId(), accountConfigId, e.getMessage());
+            }
         }
     }
 
@@ -376,7 +420,18 @@ public class WeComThirdPartyAccountServiceImpl implements WeComThirdPartyAccount
         if (param.getConfigSync() == ConfigSyncEnum.SPECIFY.getVal() && CollectionUtils.isEmpty(param.getConfigSyncRoomIdList())) {
             throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "指定群生效时,选定群列表不能为空");
         }
+        List<String> timeList = new ArrayList<>();
         for (ThirdPartyAccountConfigTaskParam task : param.getTaskList()) {
+            if (CollectionUtils.isEmpty(task.getSendTime())) {
+                throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "推送时间不能为空");
+            }
+            for (String sendTime : task.getSendTime()) {
+                if (timeList.contains(sendTime)) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "推送时间不能重复: " + sendTime);
+                } else {
+                    timeList.add(sendTime);
+                }
+            }
             if (Objects.nonNull(task.getRandomMin())) {
                 if (task.getRandomMin() < 0) {
                     throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "随机浮动分钟不能小于0");

+ 45 - 7
api-module/src/main/java/com/tzld/piaoquan/api/service/wecom/thirdparty/impl/WeComThirdPartyRoomServiceImpl.java

@@ -4,10 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.api.common.enums.ExceptionEnum;
 import com.tzld.piaoquan.api.common.enums.wecom.ConfigTaskContentTypeEnum;
 import com.tzld.piaoquan.api.common.exception.CommonException;
-import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.ThirdPartWeComRoomConfigMapper;
-import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.ThirdPartWeComRoomConfigTaskContentMapper;
-import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.ThirdPartWeComRoomConfigTaskMapper;
-import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.ThirdPartWeComRoomMapper;
+import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.*;
 import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.ext.ThirdPartWeComRoomMapperExt;
 import com.tzld.piaoquan.api.dao.mapper.wecom.thirdpart.ext.ThirdPartWeComStaffMapperExt;
 import com.tzld.piaoquan.api.job.wecom.thirdpart.WeComSendMsgJob;
@@ -40,6 +37,8 @@ public class WeComThirdPartyRoomServiceImpl implements WeComThirdPartyRoomServic
     @Autowired
     private ThirdPartWeComRoomMapper roomMapper;
     @Autowired
+    private ThirdPartWeComRoomUserMapper roomUserMapper;
+    @Autowired
     private ThirdPartWeComRoomConfigMapper roomConfigMapper;
     @Autowired
     private ThirdPartWeComRoomConfigTaskMapper roomConfigTaskMapper;
@@ -225,14 +224,17 @@ public class WeComThirdPartyRoomServiceImpl implements WeComThirdPartyRoomServic
     @Override
     public void saveRoomConfig(ThirdPartyRoomConfigParam param, String accountConfigId) {
         // check param
-        checkRoomConfigParam(param);
+        ThirdPartWeComRoom room = weComThirdPartyService.getRoomById(param.getRoomId());
+        if (Objects.isNull(room)) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "群不存在");
+        }
+        checkRoomConfigParam(param, room);
         ThirdPartWeComRoomConfig config = getRoomConfig(param.getRoomId());
         if (Objects.nonNull(config)) {
             config.setStatus(0);
             config.setUpdateTime(new Date());
             roomConfigMapper.updateByPrimaryKey(config);
         }
-        ThirdPartWeComRoom room = weComThirdPartyService.getRoomById(param.getRoomId());
         ThirdPartWeComRoomConfig newConfig = new ThirdPartWeComRoomConfig();
         newConfig.setId(DistributedIdGenerator.generate());
         newConfig.setAccountConfigId(accountConfigId);
@@ -276,7 +278,7 @@ public class WeComThirdPartyRoomServiceImpl implements WeComThirdPartyRoomServic
         weComSendMsgJob.randomRoomSendTime(room, newConfig, taskList, now);
     }
 
-    private void checkRoomConfigParam(ThirdPartyRoomConfigParam param) {
+    private void checkRoomConfigParam(ThirdPartyRoomConfigParam param, ThirdPartWeComRoom room) {
         if (Objects.isNull(param.getRoomId())) {
             throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "群id不能为空");
         }
@@ -289,7 +291,26 @@ public class WeComThirdPartyRoomServiceImpl implements WeComThirdPartyRoomServic
         if (CollectionUtils.isEmpty(param.getTaskList())) {
             throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "任务列表不能为空");
         }
+        List<ThirdPartWeComRoomUser> roomUserList = getRoomUserListByRoomId(room.getThirdRoomId());
+        List<Long> roomUserIdList = roomUserList.stream().map(ThirdPartWeComRoomUser::getUin).collect(Collectors.toList());
+        if (!roomUserIdList.contains(param.getPrimaryThirdStaffId())) {
+            param.setPrimaryThirdStaffId(room.getThirdCreateUserId());
+        }
+        if (Objects.nonNull(param.getSecondThirdStaffId()) && !roomUserIdList.contains(param.getSecondThirdStaffId())) {
+            param.setSecondThirdStaffId(room.getThirdCreateUserId());
+        }
+        List<String> timeList = new ArrayList<>();
         for (ThirdPartyRoomConfigTaskParam task : param.getTaskList()) {
+            if (CollectionUtils.isEmpty(task.getSendTime())) {
+                throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "推送时间不能为空");
+            }
+            for (String sendTime : task.getSendTime()) {
+                if (timeList.contains(sendTime)) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "推送时间不能重复: " + sendTime);
+                } else {
+                    timeList.add(sendTime);
+                }
+            }
             if (Objects.nonNull(task.getRandomMin())) {
                 if (task.getRandomMin() < 0) {
                     throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "随机浮动分钟不能小于0");
@@ -316,6 +337,23 @@ public class WeComThirdPartyRoomServiceImpl implements WeComThirdPartyRoomServic
 
     }
 
+    @Override
+    public List<ThirdPartWeComRoomUser> getRoomUserListByRoomId(String thirdRoomId) {
+        ThirdPartWeComRoomUserExample example = new ThirdPartWeComRoomUserExample();
+        example.createCriteria().andThirdRoomIdEqualTo(thirdRoomId);
+        return roomUserMapper.selectByExample(example);
+    }
+
+    @Override
+    public List<ThirdPartWeComRoomUser> getRoomUserListByRoomIds(List<String> thirdRoomIds) {
+        if (CollectionUtils.isEmpty(thirdRoomIds)) {
+            return new ArrayList<>();
+        }
+        ThirdPartWeComRoomUserExample example = new ThirdPartWeComRoomUserExample();
+        example.createCriteria().andThirdRoomIdIn(thirdRoomIds);
+        return roomUserMapper.selectByExample(example);
+    }
+
     @Override
     public void saveRoomConfig(ThirdPartWeComRoom room, String accountConfigId, ThirdPartyAccountConfigParam param) {
         ThirdPartyRoomConfigParam roomConfigParam = buildRoomConfigParam(room, param);