|
|
@@ -1,158 +1,113 @@
|
|
|
package com.fs.wxcid.service.impl;
|
|
|
|
|
|
-import com.fs.wxcid.dto.common.ApiResponse;
|
|
|
-import com.fs.wxcid.dto.message.GetMsgBigImgRequest;
|
|
|
+import com.alibaba.fastjson.TypeReference;
|
|
|
+import com.fs.common.exception.CustomException;
|
|
|
+import com.fs.wxcid.FileToBase64Util;
|
|
|
+import com.fs.wxcid.ServiceUtils;
|
|
|
+import com.fs.wxcid.dto.common.ApiResponseCommon;
|
|
|
+import com.fs.wxcid.dto.login.RequestBaseVo;
|
|
|
import com.fs.wxcid.dto.message.*;
|
|
|
import com.fs.wxcid.service.MessageService;
|
|
|
-import com.fs.wxwork.utils.WxWorkHttpUtil;
|
|
|
-import com.alibaba.fastjson.TypeReference;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
public class MessageServiceImpl implements MessageService {
|
|
|
-
|
|
|
- private static final String BASE_URL = "http://114.117.215.244:7006";
|
|
|
-
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse addMessageMgr(String key, AddMessageMgrRequest request) {
|
|
|
- return post("/message/AddMessageMgr", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse cdnUploadVideo(String key, CdnUploadVideoRequest request) {
|
|
|
- return post("/message/CdnUploadVideo", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse downloadEmojiGif(String key, DownloadEmojiGifRequest request) {
|
|
|
- return post("/message/DownloadEmojiGif", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse forwardEmoji(String key, ForwardEmojiRequest request) {
|
|
|
- return post("/message/ForwardEmoji", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse forwardImageMessage(String key, ForwardImageMessageRequest request) {
|
|
|
- return post("/message/ForwardImageMessage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse forwardVideoMessage(String key, ForwardVideoMessageRequest request) {
|
|
|
- return post("/message/ForwardVideoMessage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse getMsgBigImg(String key, GetMsgBigImgRequest request) {
|
|
|
- return post("/message/GetMsgBigImg", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse getMsgVideo(String key, GetMsgVideoRequest request) {
|
|
|
- return post("/message/GetMsgVideo", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse getMsgVoice(String key, GetMsgVoiceRequest request) {
|
|
|
- return post("/message/GetMsgVoice", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse groupMassMsgImage(String key, GroupMassMsgImageRequest request) {
|
|
|
- return post("/message/GroupMassMsgImage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse groupMassMsgText(String key, GroupMassMsgTextRequest request) {
|
|
|
- return post("/message/GroupMassMsgText", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse httpSyncMsg(String key, HttpSyncMsgRequest request) {
|
|
|
- return post("/message/HttpSyncMsg", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse newSyncHistoryMessage(String key) {
|
|
|
- return post("/message/NewSyncHistoryMessage", key, new Object()); // 无 body,传空对象或自定义
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse revokeMsg(String key, RevokeMsgRequest request) {
|
|
|
- return post("/message/RevokeMsg", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse revokeMsgNew(String key, RevokeMsgNewRequest request) {
|
|
|
- return post("/message/RevokeMsgNew", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse sendAppMessage(String key, SendAppMessageRequest request) {
|
|
|
- return post("/message/SendAppMessage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse sendEmojiMessage(String key, SendEmojiMessageRequest request) {
|
|
|
- return post("/message/SendEmojiMessage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse sendImageMessage(String key, SendImageMessageRequest request) {
|
|
|
- return post("/message/SendImageMessage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse sendImageNewMessage(String key, SendImageNewMessageRequest request) {
|
|
|
- return post("/message/SendImageNewMessage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse sendTextMessage(String key, SendTextMessageRequest request) {
|
|
|
- return post("/message/SendTextMessage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse sendVoice(String key, SendVoiceRequest request) {
|
|
|
- return post("/message/SendVoice", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public ApiResponse shareCardMessage(String key, ShareCardMessageRequest request) {
|
|
|
- return post("/message/ShareCardMessage", key, request);
|
|
|
- }
|
|
|
-
|
|
|
- // ------------------ 工具方法 ------------------
|
|
|
- /**
|
|
|
- * 通用 POST 请求方法
|
|
|
- *
|
|
|
- * @param path 接口路径,如 "/friend/AgreeAdd"
|
|
|
- * @param key 账号唯一标识(query 参数)
|
|
|
- * @param request 请求体对象
|
|
|
- * @return 统一响应结果
|
|
|
- */
|
|
|
- private ApiResponse post(String path, String key, Object request) {
|
|
|
- String url = BASE_URL + path + "?key=" + key;
|
|
|
- return WxWorkHttpUtil.postWithType(url, request, new TypeReference<ApiResponse>() {});
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 通用 GET 请求方法(无请求体)
|
|
|
- *
|
|
|
- * @param path 接口路径
|
|
|
- * @param key 账号唯一标识
|
|
|
- * @return 统一响应结果
|
|
|
- */
|
|
|
- private ApiResponse get(String path, String key) {
|
|
|
- String url = BASE_URL + path;
|
|
|
- Map<String, Object> params = new HashMap<>();
|
|
|
- params.put("key", key);
|
|
|
- String resp = WxWorkHttpUtil.get(url, params);
|
|
|
- return com.alibaba.fastjson.JSON.parseObject(resp, ApiResponse.class);
|
|
|
+ private final static String BASE_URL = "/message/";
|
|
|
+ @Autowired
|
|
|
+ private ServiceUtils serviceUtils;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<SendMessageResult> sendTextMessage(SendTextMessageParam param) {
|
|
|
+ SendTextMessageRequest request = new SendTextMessageRequest();
|
|
|
+ List<MsgItem> list = new ArrayList<>();
|
|
|
+ MsgItem msgItem = new MsgItem();
|
|
|
+ msgItem.setTextContent(param.getTxt());
|
|
|
+ list.add(msgItem);
|
|
|
+ request.setMsgItem(list);
|
|
|
+ ApiResponseCommon<List<SendMessageResult>> response = serviceUtils.sendPost(BASE_URL + "SendTextMessage", RequestBaseVo.builder().accountId(param.getAccountId()).data(request).build(), new TypeReference<ApiResponseCommon<List<SendMessageResult>>>() {});
|
|
|
+ // 第二层:检查每条消息是否真正发送成功
|
|
|
+ List<SendMessageResult> results = response.getData();
|
|
|
+ List<String> failedRecipients = new ArrayList<>();
|
|
|
+ for (SendMessageResult result : results) {
|
|
|
+ if (!result.isSendSuccess()) {
|
|
|
+ failedRecipients.add(result.getToUserName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!failedRecipients.isEmpty()) {
|
|
|
+ String errorMsg = "部分消息发送失败,失败接收人: " + String.join(", ", failedRecipients);
|
|
|
+ throw new CustomException("发送文本消息部分失败: " + errorMsg);
|
|
|
+ }
|
|
|
+ return response.getData();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<SendImageMessageResult> sendImageMessage(SendImageMessageParam param) {
|
|
|
+ SendTextMessageRequest request = new SendTextMessageRequest();
|
|
|
+ List<MsgItem> list = new ArrayList<>();
|
|
|
+ MsgItem msgItem = new MsgItem();
|
|
|
+ try {
|
|
|
+ msgItem.setMsgType(0);
|
|
|
+ msgItem.setImageContent(FileToBase64Util.convertImageUrlToBase64(param.getImgUrl()));
|
|
|
+ msgItem.setToUserName(param.getToUser());
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("发送消息时,图片转换base64错误", e);
|
|
|
+ throw new CustomException("图片消息发送失败");
|
|
|
+ }
|
|
|
+ list.add(msgItem);
|
|
|
+ request.setMsgItem(list);
|
|
|
+ ApiResponseCommon<List<SendImageMessageResult>> response = serviceUtils.sendPost(BASE_URL + "SendImageNewMessage", RequestBaseVo.builder().accountId(param.getAccountId()).data(request).build(), new TypeReference<ApiResponseCommon<List<SendImageMessageResult>>>() {});
|
|
|
+ // 第二层:检查每条消息是否真正发送成功(根据 resp.baseResponse.ret == 0 判断)
|
|
|
+ List<SendImageMessageResult> results = response.getData();
|
|
|
+ List<String> failedRecipients = new ArrayList<>();
|
|
|
+ for (SendImageMessageResult result : results) {
|
|
|
+ if (!result.isSendSuccess()) {
|
|
|
+ failedRecipients.add(result.getToUserName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!failedRecipients.isEmpty()) {
|
|
|
+ String errorMsg = "部分图片消息发送失败,失败接收人: " + String.join(", ", failedRecipients);
|
|
|
+ throw new CustomException("发送图片消息部分失败: " + errorMsg);
|
|
|
+ }
|
|
|
+ return response.getData();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public RevokeMsgResult revokeMessage(RevokeMsgRequest request) {
|
|
|
+ ApiResponseCommon<RevokeMsgResult> response = serviceUtils.sendPost(BASE_URL + "RevokeMsgNew", RequestBaseVo.builder().accountId(request.getAccountId()).data(request).build(), new TypeReference<ApiResponseCommon<RevokeMsgResult>>() {});
|
|
|
+ RevokeMsgResult result = response.getData();
|
|
|
+ if (result != null && !result.isSuccess()) {
|
|
|
+ String errorMsg = result.getSysWording() != null ? result.getSysWording() : "消息撤回失败";
|
|
|
+ throw new CustomException(errorMsg);
|
|
|
+ }
|
|
|
+ return response.getData();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public CdnUploadVideoResult sendVideoMessage(SendVideoMessageParam param) {
|
|
|
+ SendVideoMessageRequest request = new SendVideoMessageRequest();
|
|
|
+ request.setToUserName(param.getToUser());
|
|
|
+ try {
|
|
|
+ request.setThumbData(FileToBase64Util.downloadToBytes(param.getThumbUrl()));
|
|
|
+ request.setVideoData(FileToBase64Util.downloadToBytes(param.getVideoUrl()));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("发送视频消息时,文件下载失败", e);
|
|
|
+ throw new CustomException("视频消息发送失败");
|
|
|
+ }
|
|
|
+ ApiResponseCommon<CdnUploadVideoResult> response = serviceUtils.sendPost(
|
|
|
+ BASE_URL + "CdnUploadVideo",
|
|
|
+ RequestBaseVo.builder().accountId(param.getAccountId()).data(request).build(),
|
|
|
+ new TypeReference<ApiResponseCommon<CdnUploadVideoResult>>() {}
|
|
|
+ );
|
|
|
+ CdnUploadVideoResult result = response.getData();
|
|
|
+ if (result != null && result.getRetCode() != null && result.getRetCode() != 0) {
|
|
|
+ throw new CustomException("视频上传失败,RetCode=" + result.getRetCode());
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
}
|