|
|
@@ -37,9 +37,11 @@ import io.swagger.annotations.Api;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.json.JSONObject;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.Executor;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
@@ -82,6 +84,9 @@ public class QwMsgController {
|
|
|
private IFsExpressService expressService;
|
|
|
@Autowired
|
|
|
private IFsStoreOrderService storeOrderService;
|
|
|
+ @Autowired
|
|
|
+ @Qualifier("threadPoolTaskExecutor")
|
|
|
+ private Executor executor;
|
|
|
|
|
|
@GetMapping("/sendExpressInfo/{orderId}")
|
|
|
public R sendExpressInfo(@PathVariable Long orderId){
|
|
|
@@ -310,29 +315,21 @@ public class QwMsgController {
|
|
|
if (wxWorkMessageDTO.getReferid()!=0){
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ try {
|
|
|
+ executor.execute(() -> processImMessage(wxWorkMsgResp, wxWorkMessageDTO, id, serverId));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("接收处理群消息失败 info: {} err: {}", json, e.getMessage(), e);
|
|
|
+ }
|
|
|
+
|
|
|
if (wxWorkMessageDTO.getIs_room()!=0){
|
|
|
- try {
|
|
|
- // 接收处理群消息
|
|
|
- processRoomMessage(wxWorkMsgResp, wxWorkMessageDTO, id, serverId);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("接收处理群消息失败 info: {} err: {}", json, e.getMessage(), e);
|
|
|
- }
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
Long receiver = wxWorkMessageDTO.getReceiver();
|
|
|
Long sender = wxWorkMessageDTO.getSender();
|
|
|
|
|
|
- // 1客户 2销售
|
|
|
- int sendType = 2;
|
|
|
-
|
|
|
- // 消息发送者用户ID
|
|
|
- Long userId = receiver;
|
|
|
- if (2000000000000000L - receiver > 0){
|
|
|
- sendType = 1;
|
|
|
- userId = sender;
|
|
|
- }
|
|
|
- if (wxWorkMessageDTO.getMsgtype()==2||wxWorkMessageDTO.getMsgtype()==0||wxWorkMessageDTO.getMsgtype()==16||wxWorkMessageDTO.getMsgtype() == 101||wxWorkMessageDTO.getMsgtype() == 104){
|
|
|
+ if (wxWorkMessageDTO.getMsgtype()==2||wxWorkMessageDTO.getMsgtype()==0||wxWorkMessageDTO.getMsgtype()==16||wxWorkMessageDTO.getMsgtype() == 101||wxWorkMessageDTO.getMsgtype() == 104||wxWorkMessageDTO.getMsgtype()==141){
|
|
|
|
|
|
String content = wxWorkMessageDTO.getContent();
|
|
|
log.info("id:{}, 接收人:"+wxWorkMessageDTO.getReceiver(), id);
|
|
|
@@ -458,30 +455,6 @@ public class QwMsgController {
|
|
|
qwUserVoiceLogService.addQuUserVoiceByIpadCallback(id,extId,recordType,totalSeconds,wxWorkMsgResp.getUuid());
|
|
|
}
|
|
|
|
|
|
- try {
|
|
|
- // 处理文本消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 2 || wxWorkMessageDTO.getMsgtype() == 0) {
|
|
|
- processTextMessage(id, sender, receiver, serverId, wxWorkMessageDTO.getContent(), wxWorkMsgResp, false, null, null);
|
|
|
- }
|
|
|
- // 语音消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 16) {
|
|
|
- processVoiceMessage(id, sender, receiver, serverId, wxWorkMessageDTO.getContent(), wxWorkMessageDTO, wxWorkMsgResp, false, null, null);
|
|
|
- }
|
|
|
- // 图片消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 101){
|
|
|
- processImageMessage(id, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, false, null, null);
|
|
|
- }
|
|
|
- // gif 表情消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 104){
|
|
|
- processEmotionDynamicMessage(id, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, false, null, null);
|
|
|
- }
|
|
|
- // 小程序消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 78) {
|
|
|
- processMiniAppMessage(id, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, false, null, null);
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("接收处理个微消息失败 info: {} err: {}", json, e.getMessage(), e);
|
|
|
- }
|
|
|
|
|
|
break;
|
|
|
|
|
|
@@ -493,6 +466,62 @@ public class QwMsgController {
|
|
|
return map;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Im消息存档回显
|
|
|
+ */
|
|
|
+ private void processImMessage(WxWorkMsgResp wxWorkMsgResp, WxWorkMessageDTO wxWorkMessageDTO, Long qwUserId, Long serverId) {
|
|
|
+ log.debug("接收到消息 msg: {}", JSON.toJSONString(wxWorkMessageDTO));
|
|
|
+ Long receiver = wxWorkMessageDTO.getReceiver();
|
|
|
+ Long sender = wxWorkMessageDTO.getSender();
|
|
|
+ boolean isRoom = wxWorkMessageDTO.getIs_room() != 0;
|
|
|
+ String chatId = null;
|
|
|
+ String chatAvatar = null;
|
|
|
+ if (isRoom) {
|
|
|
+ WxWorkRoomId2ChatIdDTO roomId2ChatIdDTO = new WxWorkRoomId2ChatIdDTO();
|
|
|
+ roomId2ChatIdDTO.setUuid(wxWorkMsgResp.getUuid());
|
|
|
+ roomId2ChatIdDTO.setRoom_id(wxWorkMessageDTO.getRoom_conversation_id());
|
|
|
+ WxWorkResponseDTO<WxWorkChatId2RoomIdResp> roomId2ChatIdResp = wxWorkService.roomId2ChatId(roomId2ChatIdDTO, serverId);
|
|
|
+ if (roomId2ChatIdResp.getErrcode() != 0) {
|
|
|
+ log.warn("接收群消息 rooId2ChatId失败: {}", roomId2ChatIdResp.getErrmsg());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ chatId = roomId2ChatIdResp.getData().getChatid();
|
|
|
+ WxRoomHeaderDTO roomHeaderDTO = new WxRoomHeaderDTO();
|
|
|
+ roomHeaderDTO.setRoomid(roomId2ChatIdResp.getData().getRoom_id());
|
|
|
+ roomHeaderDTO.setUuid(wxWorkMsgResp.getUuid());
|
|
|
+ WxWorkResponseDTO<WxRoomHeaderResp> roomHeaderResp = wxWorkService.wxRoomHeader(roomHeaderDTO, serverId);
|
|
|
+ if (roomHeaderResp.getErrcode() == 0) {
|
|
|
+ chatAvatar = roomHeaderResp.getData().getImage_url();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理文本消息
|
|
|
+ if (wxWorkMessageDTO.getMsgtype() == 2 || wxWorkMessageDTO.getMsgtype() == 0) {
|
|
|
+ processTextMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, isRoom, chatId, chatAvatar);
|
|
|
+ }
|
|
|
+ // 语音消息
|
|
|
+ if (wxWorkMessageDTO.getMsgtype() == 16) {
|
|
|
+ processVoiceMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, isRoom, chatId, chatAvatar);
|
|
|
+ }
|
|
|
+ // 图片消息
|
|
|
+ if (wxWorkMessageDTO.getMsgtype() == 101){
|
|
|
+ processImageMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, isRoom, chatId, chatAvatar);
|
|
|
+ }
|
|
|
+ // gif 表情消息
|
|
|
+ if (wxWorkMessageDTO.getMsgtype() == 104){
|
|
|
+ processEmotionDynamicMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, isRoom, chatId, chatAvatar);
|
|
|
+ }
|
|
|
+ // 小程序消息
|
|
|
+ if (wxWorkMessageDTO.getMsgtype() == 78) {
|
|
|
+ processMiniAppMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, isRoom, chatId, chatAvatar);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 撤回消息
|
|
|
+ if (wxWorkMessageDTO.getMsgtype() == 2063) {
|
|
|
+ processCancelMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, isRoom, chatId, chatAvatar);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 处理被拉黑的用户
|
|
|
* @param qwUserId
|
|
|
@@ -613,15 +642,15 @@ public class QwMsgController {
|
|
|
* @param senderVid 消息发送者ID
|
|
|
* @param receiverVid 消息接收者ID
|
|
|
* @param serverId 服务器ID
|
|
|
- * @param content 消息内容
|
|
|
+ * @param wxWorkMessageDTO 消息内容
|
|
|
* @param wxWorkMsgResp 回调信息对象
|
|
|
* @param isRoom 是否群聊
|
|
|
* @param chatId 会话ID(群聊才有)
|
|
|
* @param chatAvatar 群头像(群聊才有)
|
|
|
*/
|
|
|
- private void processTextMessage(Long qwUserId, Long senderVid, Long receiverVid, Long serverId, String content, WxWorkMsgResp wxWorkMsgResp, boolean isRoom, String chatId, String chatAvatar) {
|
|
|
+ private void processTextMessage(Long qwUserId, Long senderVid, Long receiverVid, Long serverId, WxWorkMessageDTO wxWorkMessageDTO, WxWorkMsgResp wxWorkMsgResp, boolean isRoom, String chatId, String chatAvatar) {
|
|
|
// 保存聊天消息
|
|
|
- QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, content, wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 1, isRoom, chatId, chatAvatar);
|
|
|
+ QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, wxWorkMessageDTO.getContent(), wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 1, isRoom, chatId, chatAvatar, wxWorkMessageDTO.getMsg_id(), wxWorkMessageDTO.getApp_info());
|
|
|
QwImSocket.broadcast(message);
|
|
|
}
|
|
|
|
|
|
@@ -632,13 +661,12 @@ public class QwMsgController {
|
|
|
* @param receiverVid 消息接收者ID
|
|
|
* @param serverId 服务器ID
|
|
|
* @param wxWorkMessageDTO 消息DTO
|
|
|
- * @param content 翻译后的内容
|
|
|
* @param wxWorkMsgResp 回调信息对象
|
|
|
* @param isRoom 是否群聊
|
|
|
* @param chatId 会话ID(群聊才有)
|
|
|
* @param chatAvatar 群头像(群聊才有)
|
|
|
*/
|
|
|
- private void processVoiceMessage(Long qwUserId, Long senderVid, Long receiverVid, Long serverId, String content, WxWorkMessageDTO wxWorkMessageDTO, WxWorkMsgResp wxWorkMsgResp, boolean isRoom, String chatId, String chatAvatar) {
|
|
|
+ private void processVoiceMessage(Long qwUserId, Long senderVid, Long receiverVid, Long serverId, WxWorkMessageDTO wxWorkMessageDTO, WxWorkMsgResp wxWorkMsgResp, boolean isRoom, String chatId, String chatAvatar) {
|
|
|
String voiceFileName = IdUtils.fastSimpleUUID() + ".silk";
|
|
|
WxWorkResponseDTO<String> fileUrlResp =
|
|
|
aiHookService.getFileUrl(wxWorkMsgResp.getUuid(), wxWorkMessageDTO.getVoice_id(), wxWorkMessageDTO.getAes_key(), 5, voiceFileName, wxWorkMessageDTO.getVoice_size(), serverId);
|
|
|
@@ -655,6 +683,7 @@ public class QwMsgController {
|
|
|
}
|
|
|
|
|
|
// 转换内容为空时再尝试一次
|
|
|
+ String content = wxWorkMessageDTO.getContent();
|
|
|
if (StringUtils.isBlank(content)) {
|
|
|
WxwSpeechToTextEntityDTO ste = new WxwSpeechToTextEntityDTO();
|
|
|
ste.setMsgid(wxWorkMessageDTO.getMsg_id());
|
|
|
@@ -670,7 +699,7 @@ public class QwMsgController {
|
|
|
json.put("content", content);
|
|
|
|
|
|
// 保存聊天消息
|
|
|
- QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, json.toString(), wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 4, isRoom, chatId, chatAvatar);
|
|
|
+ QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, json.toString(), wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 4, isRoom, chatId, chatAvatar, wxWorkMessageDTO.getMsg_id(), wxWorkMessageDTO.getApp_info());
|
|
|
QwImSocket.broadcast(message);
|
|
|
}
|
|
|
|
|
|
@@ -697,7 +726,7 @@ public class QwMsgController {
|
|
|
|
|
|
String content = fileUrlResp.getData();
|
|
|
// 保存聊天消息
|
|
|
- QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, content, wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 2, isRoom, chatId, chatAvatar);
|
|
|
+ QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, content, wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 2, isRoom, chatId, chatAvatar, wxWorkMessageDTO.getMsg_id(), wxWorkMessageDTO.getApp_info());
|
|
|
QwImSocket.broadcast(message);
|
|
|
}
|
|
|
|
|
|
@@ -716,7 +745,7 @@ public class QwMsgController {
|
|
|
private void processEmotionDynamicMessage(Long qwUserId, Long senderVid, Long receiverVid, Long serverId, WxWorkMessageDTO wxWorkMessageDTO, WxWorkMsgResp wxWorkMsgResp, boolean isRoom, String chatId, String chatAvatar) {
|
|
|
String content = wxWorkMessageDTO.getUrl();
|
|
|
// 保存聊天消息
|
|
|
- QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, content, wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 3, isRoom, chatId, chatAvatar);
|
|
|
+ QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, content, wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 3, isRoom, chatId, chatAvatar, wxWorkMessageDTO.getMsg_id(), wxWorkMessageDTO.getApp_info());
|
|
|
QwImSocket.broadcast(message);
|
|
|
}
|
|
|
|
|
|
@@ -751,57 +780,31 @@ public class QwMsgController {
|
|
|
json.put("thumbnail", fileUrlResp.getData());
|
|
|
|
|
|
// 保存聊天消息
|
|
|
- QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, json.toString(), wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 5, isRoom, chatId, chatAvatar);
|
|
|
+ QwMessageListVO message = aiHookService.saveQwMsg(qwUserId, senderVid, receiverVid, serverId, json.toString(), wxWorkMsgResp.getUuid(), wxWorkMsgResp.getJson(), 5, isRoom, chatId, chatAvatar, wxWorkMessageDTO.getMsg_id(), wxWorkMessageDTO.getApp_info());
|
|
|
QwImSocket.broadcast(message);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 处理群消息
|
|
|
+ * 小程序消息处理
|
|
|
+ * @param qwUserId 企微用户ID
|
|
|
+ * @param senderVid 消息发送者ID
|
|
|
+ * @param receiverVid 消息接收者ID
|
|
|
+ * @param serverId 服务器ID
|
|
|
+ * @param wxWorkMessageDTO 消息DTO
|
|
|
+ * @param wxWorkMsgResp 回调信息对象
|
|
|
+ * @param isRoom 是否群聊
|
|
|
+ * @param chatId 会话ID(群聊才有)
|
|
|
+ * @param chatAvatar 群头像(群聊才有)
|
|
|
*/
|
|
|
- private void processRoomMessage(WxWorkMsgResp wxWorkMsgResp, WxWorkMessageDTO wxWorkMessageDTO, Long qwUserId, Long serverId) {
|
|
|
- log.debug("接收群消息 msg: {}", JSON.toJSONString(wxWorkMessageDTO));
|
|
|
- Long receiver = wxWorkMessageDTO.getReceiver();
|
|
|
- Long sender = wxWorkMessageDTO.getSender();
|
|
|
-
|
|
|
- WxWorkRoomId2ChatIdDTO roomId2ChatIdDTO = new WxWorkRoomId2ChatIdDTO();
|
|
|
- roomId2ChatIdDTO.setUuid(wxWorkMsgResp.getUuid());
|
|
|
- roomId2ChatIdDTO.setRoom_id(wxWorkMessageDTO.getRoom_conversation_id());
|
|
|
- WxWorkResponseDTO<WxWorkChatId2RoomIdResp> roomId2ChatIdResp = wxWorkService.roomId2ChatId(roomId2ChatIdDTO, serverId);
|
|
|
- if (roomId2ChatIdResp.getErrcode() != 0) {
|
|
|
- log.warn("接收群消息 rooId2ChatId失败: {}", roomId2ChatIdResp.getErrmsg());
|
|
|
- return;
|
|
|
- }
|
|
|
- String chatId = roomId2ChatIdResp.getData().getChatid();
|
|
|
-
|
|
|
- String chatAvatar = "";
|
|
|
- WxRoomHeaderDTO roomHeaderDTO = new WxRoomHeaderDTO();
|
|
|
- roomHeaderDTO.setRoomid(roomId2ChatIdResp.getData().getRoom_id());
|
|
|
- roomHeaderDTO.setUuid(wxWorkMsgResp.getUuid());
|
|
|
- WxWorkResponseDTO<WxRoomHeaderResp> roomHeaderResp = wxWorkService.wxRoomHeader(roomHeaderDTO, serverId);
|
|
|
- if (roomHeaderResp.getErrcode() == 0) {
|
|
|
- chatAvatar = roomHeaderResp.getData().getImage_url();
|
|
|
- }
|
|
|
+ private void processCancelMessage(Long qwUserId, Long senderVid, Long receiverVid, Long serverId, WxWorkMessageDTO wxWorkMessageDTO, WxWorkMsgResp wxWorkMsgResp, boolean isRoom, String chatId, String chatAvatar) {
|
|
|
+ // 修改聊天消息
|
|
|
+ QwMessageListVO message = aiHookService.updateQwMsg(qwUserId, senderVid, receiverVid, serverId, wxWorkMsgResp.getUuid(), isRoom, chatId, wxWorkMessageDTO.getRevoke_ref_appinfo());
|
|
|
+ QwImSocket.broadcast(message);
|
|
|
+ }
|
|
|
|
|
|
- // 处理文本消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 2 || wxWorkMessageDTO.getMsgtype() == 0) {
|
|
|
- processTextMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO.getContent(), wxWorkMsgResp, true, chatId, chatAvatar);
|
|
|
- }
|
|
|
- // 语音消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 16) {
|
|
|
- processVoiceMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO.getContent(), wxWorkMessageDTO, wxWorkMsgResp, true, chatId, chatAvatar);
|
|
|
- }
|
|
|
- // 图片消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 101){
|
|
|
- processImageMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, true, chatId, chatAvatar);
|
|
|
- }
|
|
|
- // gif 表情消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 104){
|
|
|
- processEmotionDynamicMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, true, chatId, chatAvatar);
|
|
|
- }
|
|
|
- // 小程序消息
|
|
|
- if (wxWorkMessageDTO.getMsgtype() == 78) {
|
|
|
- processMiniAppMessage(qwUserId, sender, receiver, serverId, wxWorkMessageDTO, wxWorkMsgResp, true, chatId, chatAvatar);
|
|
|
- }
|
|
|
+ @PostMapping("/sendQwImMsg")
|
|
|
+ public void sendQwImMsg(@RequestBody QwMessageListVO message) {
|
|
|
+ QwImSocket.broadcast(message);
|
|
|
}
|
|
|
|
|
|
}
|