4 Achegas 2c96ffc25a ... aea3d36144

Autor SHA1 Mensaxe Data
  wangyunpeng aea3d36144 Merge branch '20251119-wyp-weCom' into test hai 1 día
  wangyunpeng 7540effa28 check configSync hai 2 días
  wangyunpeng 3844709410 Merge branch 'master' into 20251119-wyp-weCom hai 2 días
  wangyunpeng 6166c7ffbf fix hai 2 días

+ 33 - 0
api-module/src/main/java/com/tzld/piaoquan/api/common/enums/wecom/ConfigSyncEnum.java

@@ -0,0 +1,33 @@
+package com.tzld.piaoquan.api.common.enums.wecom;
+
+import lombok.Getter;
+
+@Getter
+public enum ConfigSyncEnum {
+    NEW(0, "仅对新建群生效"),
+    ALL(1, "所有群"),
+    SPECIFY(2, "指定群生效"),
+
+    other(999, "其他");
+
+    // 0-仅对新建群生效 1-所有群 2-指定群生效
+    private final int val;
+    private final String description;
+
+    ConfigSyncEnum(int val, String description) {
+        this.val = val;
+        this.description = description;
+    }
+
+    public static ConfigSyncEnum from(int val) {
+        for (ConfigSyncEnum statusEnum : ConfigSyncEnum.values()) {
+            if (statusEnum.getVal() == val) {
+                return statusEnum;
+            }
+        }
+
+        return other;
+    }
+
+
+}

+ 32 - 0
api-module/src/main/java/com/tzld/piaoquan/api/common/enums/wecom/ConfigTaskContentTypeEnum.java

@@ -0,0 +1,32 @@
+package com.tzld.piaoquan.api.common.enums.wecom;
+
+import lombok.Getter;
+
+@Getter
+public enum ConfigTaskContentTypeEnum {
+    TEXT(0, "文案"),
+    MINI_PROGRAM(1, "小程序"),
+
+    other(999, "其他");
+
+    // 0-文案 1-小程序
+    private final int val;
+    private final String description;
+
+    ConfigTaskContentTypeEnum(int val, String description) {
+        this.val = val;
+        this.description = description;
+    }
+
+    public static ConfigTaskContentTypeEnum from(int val) {
+        for (ConfigTaskContentTypeEnum typeEnum : ConfigTaskContentTypeEnum.values()) {
+            if (typeEnum.getVal() == val) {
+                return typeEnum;
+            }
+        }
+
+        return other;
+    }
+
+
+}

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

@@ -1,8 +1,10 @@
 package com.tzld.piaoquan.api.service.wecom.thirdparty;
 
+import com.tzld.piaoquan.api.model.param.wecom.thirdpart.ThirdPartyAccountConfigParam;
 import com.tzld.piaoquan.api.model.param.wecom.thirdpart.ThirdPartyConfigGetParam;
 import com.tzld.piaoquan.api.model.param.wecom.thirdpart.ThirdPartyRoomConfigParam;
 import com.tzld.piaoquan.api.model.param.wecom.thirdpart.ThirdPartyRoomListParam;
+import com.tzld.piaoquan.api.model.po.wecom.thirdpart.ThirdPartWeComRoom;
 import com.tzld.piaoquan.api.model.vo.IdNameVO;
 import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyRoomConfigVO;
 import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyRoomVO;
@@ -19,4 +21,6 @@ public interface WeComThirdPartyRoomService {
     ThirdPartyRoomConfigVO getRoomConfig(ThirdPartyConfigGetParam param);
 
     void saveRoomConfig(ThirdPartyRoomConfigParam param);
+
+    void saveRoomConfig(ThirdPartWeComRoom room, ThirdPartyAccountConfigParam param);
 }

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

@@ -53,7 +53,9 @@ public interface WeComThirdPartyService {
 
     CommonResponse<String> invitationToRoom(InvitationToRoomRequest request);
 
-    ThirdPartWeComRoom getRoomByRoomId(Long roomid);
+    ThirdPartWeComRoom getRoomByThirdRoomId(Long roomId);
+
+    List<ThirdPartWeComRoom> getRoomByRoomIds(List<Long> roomIds);
 
     ThirdPartWeComStaff getStaffById(Long id);
 

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

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.tzld.piaoquan.api.common.Constant;
 import com.tzld.piaoquan.api.common.enums.ExceptionEnum;
+import com.tzld.piaoquan.api.common.enums.wecom.ConfigSyncEnum;
+import com.tzld.piaoquan.api.common.enums.wecom.ConfigTaskContentTypeEnum;
 import com.tzld.piaoquan.api.common.enums.wecom.ThirdPartWeComStaffStatusEnum;
 import com.tzld.piaoquan.api.common.exception.CommonException;
 import com.tzld.piaoquan.api.component.WeComThirdPartyApiClient;
@@ -21,11 +23,14 @@ import com.tzld.piaoquan.api.model.vo.wecom.thirdpart.ThirdPartyAccountConfigTas
 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;
+import com.tzld.piaoquan.api.service.wecom.thirdparty.WeComThirdPartyRoomService;
 import com.tzld.piaoquan.api.service.wecom.thirdparty.WeComThirdPartyService;
 import com.tzld.piaoquan.growth.common.utils.DistributedIdGenerator;
 import com.tzld.piaoquan.growth.common.utils.RedisUtils;
 import com.tzld.piaoquan.growth.common.utils.page.Page;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -42,6 +47,8 @@ public class WeComThirdPartyAccountServiceImpl implements WeComThirdPartyAccount
     @Autowired
     private WeComThirdPartyService weComThirdPartyService;
     @Autowired
+    private WeComThirdPartyRoomService roomService;
+    @Autowired
     private ThirdPartWeComStaffMapper staffMapper;
     @Autowired
     private ThirdPartWeComStaffConfigMapper staffConfigMapper;
@@ -229,7 +236,8 @@ public class WeComThirdPartyAccountServiceImpl implements WeComThirdPartyAccount
 
     @Override
     public void saveAccountConfig(ThirdPartyAccountConfigParam param) {
-        // todo check param
+        // check param
+        checkAccountConfigParam(param);
         ThirdPartWeComStaffConfig config = getStaffConfig(param.getAccountId());
         if (Objects.nonNull(config)) {
             config.setStatus(0);
@@ -271,8 +279,77 @@ public class WeComThirdPartyAccountServiceImpl implements WeComThirdPartyAccount
                 newContent.setUpdateTime(new Date());
                 staffConfigTaskContentMapper.insert(newContent);
             }
+            // 任务开关关闭,账号下的群,任务同步关闭
+
+        }
+        // 配置同步
+        new Thread(() -> syncStaffConfigToRoom(param)).start();
+    }
+
+    private void syncStaffConfigToRoom(ThirdPartyAccountConfigParam param) {
+        List<ThirdPartWeComRoom> roomList;
+        if (param.getConfigSync() == ConfigSyncEnum.ALL.getVal()) {
+            // 所有群
+            roomList = weComThirdPartyService.getStaffRoomList(param.getAccountId());
+        } else if (param.getConfigSync() == ConfigSyncEnum.SPECIFY.getVal()) {
+            // 指定群生效
+            roomList = weComThirdPartyService.getRoomByRoomIds(param.getConfigSyncRoomIdList());
+        } else {
+            roomList = new ArrayList<>();
         }
-        // todo 配置同步
+        syncConfig(param, roomList);
+    }
+
+    private void syncConfig(ThirdPartyAccountConfigParam param, List<ThirdPartWeComRoom> roomList) {
+        if (CollectionUtils.isEmpty(roomList)) {
+            return;
+        }
+        for (ThirdPartWeComRoom room : roomList) {
+            roomService.saveRoomConfig(room, param);
+        }
+    }
+
+    private void checkAccountConfigParam(ThirdPartyAccountConfigParam param) {
+        if (Objects.isNull(param.getAccountId())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "账号id不能为空");
+        }
+        if (StringUtils.isBlank(param.getPutScene())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "推送场景不能为空");
+        }
+        if (Objects.isNull(param.getPrimaryThirdStaffId())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "主推送人员不能为空");
+        }
+        if (CollectionUtils.isEmpty(param.getTaskList())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "任务列表不能为空");
+        }
+        if (param.getConfigSync() == ConfigSyncEnum.SPECIFY.getVal() && CollectionUtils.isEmpty(param.getConfigSyncRoomIdList())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "指定群生效时,选定群列表不能为空");
+        }
+        for (ThirdPartyAccountConfigTaskParam task : param.getTaskList()) {
+            if (Objects.nonNull(task.getRandomMin())) {
+                if (task.getRandomMin() < 0) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "随机浮动分钟不能小于0");
+                } else if (task.getRandomMin() > 30) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "随机浮动分钟不能大于30");
+                }
+            }
+            if (CollectionUtils.isEmpty(task.getContentList()) || task.getContentList().size() > 3) {
+                throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "任务内容不能为空,最多3条");
+            }
+            for (ThirdPartyAccountConfigTaskContentParam content : task.getContentList()) {
+                if (Objects.isNull(content.getType())) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "任务内容类型不能为空");
+                }
+                if (content.getType() == ConfigTaskContentTypeEnum.TEXT.getVal()
+                        && StringUtils.isBlank(content.getContent())) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "文案不能为空");
+                } else if (content.getType() == ConfigTaskContentTypeEnum.MINI_PROGRAM.getVal()
+                        && Objects.isNull(content.getSource())) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "小程序来源不能为空");
+                }
+            }
+        }
+
     }
 
     @Override

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

@@ -1,6 +1,9 @@
 package com.tzld.piaoquan.api.service.wecom.thirdparty.impl;
 
 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;
@@ -18,6 +21,8 @@ import com.tzld.piaoquan.api.service.wecom.thirdparty.WeComThirdPartyService;
 import com.tzld.piaoquan.growth.common.utils.DistributedIdGenerator;
 import com.tzld.piaoquan.growth.common.utils.page.Page;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -196,7 +201,8 @@ public class WeComThirdPartyRoomServiceImpl implements WeComThirdPartyRoomServic
 
     @Override
     public void saveRoomConfig(ThirdPartyRoomConfigParam param) {
-        // todo check param
+        // check param
+        checkRoomConfigParam(param);
         ThirdPartWeComRoomConfig config = getRoomConfig(param.getRoomId());
         if (Objects.nonNull(config)) {
             config.setStatus(0);
@@ -238,4 +244,85 @@ public class WeComThirdPartyRoomServiceImpl implements WeComThirdPartyRoomServic
             }
         }
     }
+
+    private void checkRoomConfigParam(ThirdPartyRoomConfigParam param) {
+        if (Objects.isNull(param.getRoomId())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "群id不能为空");
+        }
+        if (StringUtils.isBlank(param.getPutScene())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "推送场景不能为空");
+        }
+        if (Objects.isNull(param.getPrimaryThirdStaffId())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "主推送人员不能为空");
+        }
+        if (CollectionUtils.isEmpty(param.getTaskList())) {
+            throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "任务列表不能为空");
+        }
+        for (ThirdPartyRoomConfigTaskParam task : param.getTaskList()) {
+            if (Objects.nonNull(task.getRandomMin())) {
+                if (task.getRandomMin() < 0) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "随机浮动分钟不能小于0");
+                } else if (task.getRandomMin() > 30) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "随机浮动分钟不能大于30");
+                }
+            }
+            if (CollectionUtils.isEmpty(task.getContentList()) || task.getContentList().size() > 3) {
+                throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "任务内容不能为空,最多3条");
+            }
+            for (ThirdPartyRoomConfigTaskContentParam content : task.getContentList()) {
+                if (Objects.isNull(content.getType())) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "任务内容类型不能为空");
+                }
+                if (content.getType() == ConfigTaskContentTypeEnum.TEXT.getVal()
+                        && StringUtils.isBlank(content.getContent())) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "文案不能为空");
+                } else if (content.getType() == ConfigTaskContentTypeEnum.MINI_PROGRAM.getVal()
+                        && Objects.isNull(content.getSource())) {
+                    throw new CommonException(ExceptionEnum.PARAM_ERROR.getCode(), "小程序来源不能为空");
+                }
+            }
+        }
+
+    }
+
+    @Override
+    public void saveRoomConfig(ThirdPartWeComRoom room, ThirdPartyAccountConfigParam param) {
+        ThirdPartyRoomConfigParam roomConfigParam = buildRoomConfigParam(room, param);
+        saveRoomConfig(roomConfigParam);
+    }
+
+    private ThirdPartyRoomConfigParam buildRoomConfigParam(ThirdPartWeComRoom room, ThirdPartyAccountConfigParam param) {
+        ThirdPartyRoomConfigParam roomConfigParam = new ThirdPartyRoomConfigParam();
+        roomConfigParam.setRoomId(room.getId());
+        roomConfigParam.setPutScene(param.getPutScene());
+        roomConfigParam.setChannel(param.getChannel());
+        roomConfigParam.setSwitchFlag(param.getSwitchFlag());
+        roomConfigParam.setOpenRoomSendSwitchNum(param.getOpenRoomSendSwitchNum());
+        roomConfigParam.setPrimaryThirdStaffId(param.getPrimaryThirdStaffId());
+        roomConfigParam.setPrimaryThirdStaffName(param.getPrimaryThirdStaffName());
+        roomConfigParam.setSecondThirdStaffId(param.getSecondThirdStaffId());
+        roomConfigParam.setSecondThirdStaffName(param.getSecondThirdStaffName());
+        List<ThirdPartyRoomConfigTaskParam> taskList = new ArrayList<>();
+        for (ThirdPartyAccountConfigTaskParam taskParam : param.getTaskList()) {
+            ThirdPartyRoomConfigTaskParam task = new ThirdPartyRoomConfigTaskParam();
+            task.setSwitchFlag(taskParam.getSwitchFlag());
+            task.setSendTime(taskParam.getSendTime());
+            task.setRandomMin(taskParam.getRandomMin());
+            task.setSeq(taskParam.getSeq());
+            List<ThirdPartyRoomConfigTaskContentParam> contentList = new ArrayList<>();
+            for (ThirdPartyRoomConfigTaskContentParam taskContentParam : task.getContentList()) {
+                ThirdPartyRoomConfigTaskContentParam content = new ThirdPartyRoomConfigTaskContentParam();
+                content.setType(taskContentParam.getType());
+                content.setContent(taskContentParam.getContent());
+                content.setSource(taskContentParam.getSource());
+                content.setSourceContent(taskContentParam.getSourceContent());
+                content.setSeq(taskContentParam.getSeq());
+                contentList.add(content);
+            }
+            task.setContentList(contentList);
+            taskList.add(task);
+        }
+        roomConfigParam.setTaskList(taskList);
+        return roomConfigParam;
+    }
 }

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

@@ -468,7 +468,7 @@ public class WeComThirdPartyServiceImpl implements WeComThirdPartyService {
             log.error("WeComThirdPartyService invitationToRoom error, roomId: {}, vids: {}, errMsg: {}",
                     request.getRoomid(), request.getVids(), commonResponse.getErrmsg());
             ThirdPartWeComStaff staff = getStaffByUuid(request.getUuid());
-            ThirdPartWeComRoom room = getRoomByRoomId(request.getRoomid());
+            ThirdPartWeComRoom room = getRoomByThirdRoomId(request.getRoomid());
             LarkRobotUtil.sendWeComThirdPartMessage(
                     "【邀请群成员失败通知】\n" +
                             "账号UUID:" + request.getUuid() + "\n" +
@@ -483,9 +483,9 @@ public class WeComThirdPartyServiceImpl implements WeComThirdPartyService {
     }
 
     @Override
-    public ThirdPartWeComRoom getRoomByRoomId(Long roomid) {
+    public ThirdPartWeComRoom getRoomByThirdRoomId(Long roomId) {
         ThirdPartWeComRoomExample example = new ThirdPartWeComRoomExample();
-        example.createCriteria().andThirdRoomIdEqualTo(String.valueOf(roomid));
+        example.createCriteria().andThirdRoomIdEqualTo(String.valueOf(roomId));
         List<ThirdPartWeComRoom> roomList = thirdPartWeComRoomMapper.selectByExample(example);
         if (CollectionUtils.isEmpty(roomList)) {
             return null;
@@ -493,6 +493,13 @@ public class WeComThirdPartyServiceImpl implements WeComThirdPartyService {
         return roomList.get(0);
     }
 
+    @Override
+    public List<ThirdPartWeComRoom> getRoomByRoomIds(List<Long> roomIds) {
+        ThirdPartWeComRoomExample example = new ThirdPartWeComRoomExample();
+        example.createCriteria().andIdIn(roomIds);
+        return thirdPartWeComRoomMapper.selectByExample(example);
+    }
+
     @Override
     public ThirdPartWeComStaff getStaffById(Long id) {
         return thirdPartWeComStaffMapper.selectByPrimaryKey(id);

+ 2 - 2
api-module/src/main/resources/mapper/wecom/thirdpart/ext/ThirdPartWeComMapperExt.xml

@@ -247,12 +247,12 @@
 
     <insert id="batchInsertThirdPartWeComRoom">
         insert into third_part_we_com_room (id, corp_id, staff_id, third_room_id, third_create_user_id, member_count,
-        `name`, room_url, room_create_time, add_user_status, send_status, send_time, is_delete, create_time, update_time)
+        `name`, room_url, room_create_time, add_user_status, send_status, create_time, update_time)
         values
         <foreach collection="records" item="item" separator=",">
             (#{item.id}, #{item.corpId}, #{item.staffId}, #{item.thirdRoomId}, #{item.thirdCreateUserId},
              #{item.memberCount}, #{item.name}, #{item.roomUrl}, #{item.roomCreateTime}, #{item.addUserStatus},
-             #{item.sendStatus}, #{item.sendTime}, #{item.isDelete}, #{item.createTime}, #{item.updateTime})
+             #{item.sendStatus}, #{item.createTime}, #{item.updateTime})
         </foreach>
     </insert>