|
|
@@ -2,28 +2,45 @@ package com.fs.ipad;
|
|
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.fs.common.core.redis.RedisCache;
|
|
|
import com.fs.common.core.redis.RedisCacheT;
|
|
|
import com.fs.common.exception.base.BaseException;
|
|
|
+import com.fs.common.utils.PubFun;
|
|
|
import com.fs.common.utils.StringUtils;
|
|
|
import com.fs.ipad.param.WxGetSessionRoomListParam;
|
|
|
import com.fs.ipad.param.WxRoomUserListParam;
|
|
|
import com.fs.ipad.param.WxSendAtMsgParam;
|
|
|
import com.fs.ipad.vo.*;
|
|
|
+import com.fs.qw.domain.QwExternalContact;
|
|
|
+import com.fs.qw.domain.QwGroupChat;
|
|
|
+import com.fs.qw.domain.QwUser;
|
|
|
+import com.fs.qw.mapper.QwExternalContactMapper;
|
|
|
+import com.fs.qw.mapper.QwGroupChatMapper;
|
|
|
+import com.fs.sop.domain.QwSop;
|
|
|
+import com.fs.sop.domain.SopUserLogs;
|
|
|
+import com.fs.sop.mapper.QwSopMapper;
|
|
|
+import com.fs.sop.mapper.SopUserLogsMapper;
|
|
|
import com.fs.wxwork.dto.*;
|
|
|
import com.fs.wxwork.service.WxWorkServiceNew;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.net.MalformedURLException;
|
|
|
import java.net.URI;
|
|
|
import java.net.URISyntaxException;
|
|
|
import java.net.URL;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.function.Supplier;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
@@ -32,6 +49,10 @@ public class IpadSendUtils {
|
|
|
|
|
|
private final WxWorkServiceNew wxWorkService;
|
|
|
private final RedisCacheT<String> redisCache;
|
|
|
+ private final QwGroupChatMapper qwGroupChatMapper;
|
|
|
+ private final QwSopMapper qwSopMapper;
|
|
|
+ private final QwExternalContactMapper qwExternalContactMapper;
|
|
|
+ private final SopUserLogsMapper sopUserLogsMapper;
|
|
|
private final RedisCache redisCacheUrl;
|
|
|
private final String FILE_KEY = "ipad:upload:";
|
|
|
|
|
|
@@ -379,4 +400,145 @@ public class IpadSendUtils {
|
|
|
log.info("发送返回数据:{}", result);
|
|
|
if(result.getErrcode() != 0) throw new BaseException("发送消息错误:" + result.getErrmsg());
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建群聊
|
|
|
+ * @param qwSop SOP
|
|
|
+ * @param groupName 群聊名称
|
|
|
+ * @param qwUser 创建企微账号
|
|
|
+ * @param list 客户列表
|
|
|
+ * @param maxGroupNum 最大拉群数量
|
|
|
+ * @param maxGroupUserNum 单个群聊最大拉取用户数量
|
|
|
+ */
|
|
|
+ public String createRoom(QwSop qwSop, String groupName, QwUser qwUser, List<QwExternalContact> list, Integer maxGroupNum, Integer maxGroupUserNum, int currentNum) {
|
|
|
+ // 最大支持的客户数量
|
|
|
+ int maxNum = maxGroupNum * maxGroupUserNum;
|
|
|
+ // 根据最大客户数量限制客户
|
|
|
+ List<QwExternalContact> joinList = list.stream().limit(maxNum).collect(Collectors.toList());
|
|
|
+ // 修改加群状态微 已加群
|
|
|
+ joinList.forEach(e -> e.setJoinGroup(1));
|
|
|
+ // 用外部联系人ID去换取企微对应的ID
|
|
|
+ List<Long> userIds = changeUserIds(qwUser, joinList);
|
|
|
+ // 添加的群ID
|
|
|
+ List<String> chatIds = new ArrayList<>();
|
|
|
+ // 筛选出来的客户可以创建多少个群聊
|
|
|
+ int groupNum = BigDecimal.valueOf((double) userIds.size() / maxGroupUserNum).setScale(0, RoundingMode.UP).intValue();
|
|
|
+ List<SopUserLogs> logsList = new ArrayList<>();
|
|
|
+ // 获取当前日期
|
|
|
+ Date currentDate = new Date();
|
|
|
+ // 创建格式化器,指定格式为"yyyy年MM月dd日"
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ // 格式化日期
|
|
|
+ String today = sdf.format(currentDate);
|
|
|
+ // 循环创建群聊添加客户
|
|
|
+ for (int i = 0; i < groupNum; i++) {
|
|
|
+ List<Long> collect = userIds.stream().skip((long) i * maxGroupUserNum).limit(maxGroupUserNum).collect(Collectors.toList());
|
|
|
+ // 如果人数为空 或者 人数不足最大群聊人数
|
|
|
+ if(collect.isEmpty() || collect.size() < maxGroupUserNum) continue;
|
|
|
+ // 设置新的群聊名称
|
|
|
+ String newGroupName = groupName + (i + 1 + currentNum);
|
|
|
+ // 创建群聊对象
|
|
|
+ WxCreateRoomMsgDTO dto = new WxCreateRoomMsgDTO();
|
|
|
+ // 设置UUID
|
|
|
+ dto.setUuid(qwUser.getUid());
|
|
|
+ // 设置群聊名称
|
|
|
+ dto.setRoomName(newGroupName);
|
|
|
+ // 客户ID列表,会自动拉取到群聊里面
|
|
|
+ dto.setVids(collect);
|
|
|
+ // 请求创建群聊方法
|
|
|
+ WxWorkResponseDTO<WxCreateRoomRespDTO> room = wxWorkService.createRoom(dto, qwUser.getServerId());
|
|
|
+ // 通过创建群聊接口返回的ID换取系统需要的群聊ID
|
|
|
+ String chatId = toChatIds(qwUser.getUid(), room.getData().getRoomid(), qwUser.getServerId());
|
|
|
+ // 群聊对象
|
|
|
+ QwGroupChat qwGroupChat = new QwGroupChat();
|
|
|
+ // 群聊ID
|
|
|
+ qwGroupChat.setChatId(chatId);
|
|
|
+ // 群聊名称
|
|
|
+ qwGroupChat.setName(newGroupName);
|
|
|
+ // 对应的SOPID
|
|
|
+ qwGroupChat.setSopId(qwSop.getId());
|
|
|
+ // 所属的企微ID
|
|
|
+ qwGroupChat.setQwUserId(qwUser.getId());
|
|
|
+ // 微信对应的群聊ID
|
|
|
+ qwGroupChat.setRoomid(room.getData().getRoomid());
|
|
|
+ // 创建活修改群聊
|
|
|
+ qwGroupChatMapper.insertOrUpdateQwGroupChat(qwGroupChat);
|
|
|
+ // 群聊ID添加
|
|
|
+ chatIds.add(chatId);
|
|
|
+ SopUserLogs sopUserLogs = new SopUserLogs();
|
|
|
+ sopUserLogs.setSopId(qwSop.getId());
|
|
|
+ sopUserLogs.setSopTempId(qwSop.getTempId());
|
|
|
+ sopUserLogs.setQwUserId(qwUser.getQwUserId());
|
|
|
+ sopUserLogs.setCorpId(qwSop.getCorpId());
|
|
|
+ sopUserLogs.setStartTime(today);
|
|
|
+ sopUserLogs.setStatus(1);
|
|
|
+ sopUserLogs.setUserId(qwUser.getId() + "|" + qwUser.getCompanyUserId() + "|" + qwUser.getCompanyId());
|
|
|
+ sopUserLogs.setChatId(chatId);
|
|
|
+ logsList.add(sopUserLogs);
|
|
|
+ }
|
|
|
+ // 更新客户信息
|
|
|
+ qwExternalContactMapper.updateJoinGroup(PubFun.listToNewList(joinList, QwExternalContact::getId));
|
|
|
+ // 组装群聊ID
|
|
|
+ String chatId = String.join(",", chatIds);
|
|
|
+ // 修改SOP对象
|
|
|
+ qwSopMapper.updateSopGroupIds(qwSop.getId(), chatId);
|
|
|
+ sopUserLogsMapper.batchInsertSopUserLogs(logsList);
|
|
|
+ return chatId;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String toChatIds(String uuid, Long roomid, Long serverId) {
|
|
|
+ WxWorkChatIdToRoomIdDTO tdo = new WxWorkChatIdToRoomIdDTO();
|
|
|
+ tdo.setRoom_id(roomid);
|
|
|
+ tdo.setUuid(uuid);
|
|
|
+ WxWorkResponseDTO<WxWorkChatIdToRoomIdResp> result = wxWorkService.RoomIdToChatId(tdo, serverId);
|
|
|
+ if(result.getErrcode() != 0){
|
|
|
+ throw new BaseException(result.getErrmsg());
|
|
|
+ }
|
|
|
+ WxWorkChatIdToRoomIdResp data = result.getData();
|
|
|
+ if(data == null || data.getRoom_id() == null) {
|
|
|
+ log.error("未找到群聊数据,请求数据:{},返回数据:{}", JSON.toJSONString(tdo), JSON.toJSONString(result));
|
|
|
+ throw new BaseException("未找到群聊:" + roomid);
|
|
|
+ }
|
|
|
+ return data.getChatid();
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Long> changeUserIds(QwUser qwUser, List<QwExternalContact> joinList) {
|
|
|
+ BaseVo vo = new BaseVo();
|
|
|
+ vo.setId(qwUser.getId());
|
|
|
+ vo.setRoom(false);
|
|
|
+ vo.setUuid(qwUser.getUid());
|
|
|
+ vo.setExIdList(joinList.stream().map(QwExternalContact::getExternalUserId).collect(Collectors.toList()));
|
|
|
+ vo.setServerId(qwUser.getServerId());
|
|
|
+ return userIdList(vo);
|
|
|
+ }
|
|
|
+ private List<Long> userIdList(BaseVo vo){
|
|
|
+ if(vo.isRoom()){
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ WxWorkUserId2VidDTO wxWorkUserId2VidDTO = new WxWorkUserId2VidDTO();
|
|
|
+ wxWorkUserId2VidDTO.setOpenid(vo.getExIdList());
|
|
|
+ wxWorkUserId2VidDTO.setCorpid(vo.getCorpId());
|
|
|
+ wxWorkUserId2VidDTO.setScorpid(vo.getCorpCode());
|
|
|
+ wxWorkUserId2VidDTO.setUuid(vo.getUuid());
|
|
|
+ WxWorkResponseDTO<List<WxWorkVid2UserIdRespDTO>> resutl = wxWorkService.UserId2Vid(wxWorkUserId2VidDTO, vo.getServerId());
|
|
|
+ List<?> rawData = resutl.getData(); // 先用一个泛型不确定的列表接收
|
|
|
+ if(rawData.isEmpty()) {
|
|
|
+ log.error("未找到用户数据,基础数据:{},请求数据:{},返回数据:{}", vo, JSON.toJSONString(wxWorkUserId2VidDTO), JSON.toJSONString(resutl));
|
|
|
+ throw new BaseException("未找到用户:" + vo.getId());
|
|
|
+ }
|
|
|
+ List<WxWorkVid2UserIdRespDTO> data = new ArrayList<>();
|
|
|
+ for (Object item : rawData) {
|
|
|
+ if (item instanceof WxWorkVid2UserIdRespDTO) {
|
|
|
+ data.add((WxWorkVid2UserIdRespDTO) item);
|
|
|
+ } else if (item instanceof JSONObject) {
|
|
|
+ // 如果是JSONObject,则需要将其转换为目标类型
|
|
|
+ WxWorkVid2UserIdRespDTO dto = ((JSONObject) item).toJavaObject(WxWorkVid2UserIdRespDTO.class);
|
|
|
+ data.add(dto);
|
|
|
+ } else {
|
|
|
+ log.warn("未知类型: {}", item.getClass());
|
|
|
+ // 根据实际情况处理,例如跳过或抛出更明确的异常
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return data.stream().map(WxWorkVid2UserIdRespDTO::getUser_id).collect(Collectors.toList());
|
|
|
+ }
|
|
|
}
|