xgb 3 дней назад
Родитель
Сommit
f3a0ddfe85

+ 32 - 0
fs-company/src/main/java/com/fs/app/controller/im/FsImMsgSendLogController.java

@@ -1,5 +1,6 @@
 package com.fs.app.controller.im;
 
+import com.fs.app.service.param.BatchSendImTextRequest;
 import com.fs.app.service.param.FsImMsgSendLogRequest;
 import com.fs.app.service.param.FsImMsgSendLogResponse;
 import com.fs.common.core.controller.BaseController;
@@ -11,9 +12,12 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.im.domain.FsImMsgSendLog;
+import com.fs.im.dto.OpenImResponseDTO;
 import com.fs.im.service.IFsImMsgSendLogService;
+import com.fs.im.service.OpenIMService;
 import com.github.pagehelper.PageHelper;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -30,6 +34,9 @@ public class FsImMsgSendLogController extends BaseController {
     @Autowired
     private IFsImMsgSendLogService fsImMsgSendLogService;
 
+    @Autowired
+    private OpenIMService openIMService;
+
     @Autowired
     private TokenService tokenService;
 
@@ -65,4 +72,29 @@ public class FsImMsgSendLogController extends BaseController {
         request.setCompanyId(loginUser.getCompany().getCompanyId());
         return fsImMsgSendLogService.getFsImMsgSendStatistics(request);
     }
+
+    /**
+     * 批量发送文本消息
+     */
+
+    @PostMapping("/batchSendText")
+    public R batchSendText(@Validated @RequestBody BatchSendImTextRequest request) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        request.setSenderId("C"+loginUser.getUser().getUserId());
+        if(request.getUserIds().size() > 100){
+            return R.error("一次最多只能发送100个用户");
+        }
+        // 前面加一个U
+        List<String> userIds = request.getUserIds();
+        userIds.replaceAll(userId -> "U"+userId);
+        request.setUserIds(userIds);
+        request.setPushDesc(request.getPushDesc() == null ? request.getTextContent() : request.getPushDesc());
+        OpenImResponseDTO openImResponseDTO =openIMService.batchSendTextMessage( request.getSenderId(), request.getUserIds(), request.getTextContent(), request.getPushTitle(), request.getPushDesc(), request.getEx());
+        if(openImResponseDTO.getErrCode() == 0){
+            return R.ok("发送成功");
+        }else {
+            return R.error(openImResponseDTO.getErrMsg());
+        }
+    }
+
 }

+ 55 - 0
fs-service/src/main/java/com/fs/app/service/param/BatchSendImTextRequest.java

@@ -0,0 +1,55 @@
+package com.fs.app.service.param;
+
+import lombok.Data;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 批量发送IM文本消息请求参数
+ */
+@Data
+public class BatchSendImTextRequest implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String SenderId;
+
+    /**
+     * 接收用户ID列表
+     */
+    @NotEmpty(message = "接收用户ID列表不能为空")
+    private List<String> userIds;
+
+    /**
+     * 发送的文本内容
+     */
+    @NotBlank(message = "发送内容不能为空")
+    private String textContent;
+
+    /**
+     * 发送人昵称(可选,不填则使用默认)
+     */
+    private String senderNickname;
+
+    /**
+     * 发送人头像(可选,不填则使用默认)
+     */
+    private String senderFaceURL;
+
+    /**
+     * 离线推送标题
+     */
+    private String pushTitle;
+
+    /**
+     * 离线推送描述
+     */
+    private String pushDesc;
+
+    /**
+     * 扩展字段(可选)
+     */
+    private String ex;
+}

+ 12 - 0
fs-service/src/main/java/com/fs/im/service/OpenIMService.java

@@ -116,4 +116,16 @@ public interface OpenIMService {
     void sendSystemMsgAsync(String userId, String text, String title);
 
     OpenImResponseDTO getUserInfo(String id);
+
+    /**
+     * 批量发送纯文本消息(不存库,仅发送)
+     * @param senderId 发送人ID
+     * @param receiverIds 接收人ID列表
+     * @param textContent 文本内容
+     * @param pushTitle 离线推送标题(可选)
+     * @param pushDesc 离线推送描述(可选)
+     * @param ex 扩展字段(可选)
+     * @return 发送结果
+     */
+     OpenImResponseDTO batchSendTextMessage(String senderId, List<String> receiverIds, String textContent, String pushTitle, String pushDesc, String ex);
 }

+ 70 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1978,4 +1978,74 @@ public class OpenIMServiceImpl implements OpenIMService {
             OpenImResponseDTO responseDTO= JSONUtil.toBean(body,OpenImResponseDTO.class);
             return responseDTO;
     }
+
+
+    /**
+     * 批量发送纯文本消息(不存库,仅发送)
+     * @param senderId 发送人ID
+     * @param receiverIds 接收人ID列表
+     * @param textContent 文本内容
+     * @param pushTitle 离线推送标题(可选)
+     * @param pushDesc 离线推送描述(可选)
+     * @param ex 扩展字段(可选)
+     * @return 发送结果
+     */
+    @Override
+    public OpenImResponseDTO batchSendTextMessage(String senderId, List<String> receiverIds, String textContent,
+                                                  String pushTitle, String pushDesc, String ex) {
+        try {
+            log.info("批量发送文本消息 - 发送人: {}, 接收人数: {}, 内容: {}", senderId, receiverIds.size(), textContent);
+
+            // 构建批量发送消息DTO
+            OpenImBatchMsgDTO batchMsgDTO = new OpenImBatchMsgDTO();
+
+            // 必填字段
+            batchMsgDTO.setSendID(senderId);
+            batchMsgDTO.setRecvIDs(receiverIds);
+            batchMsgDTO.setContentType(101); // 101表示文本消息
+            batchMsgDTO.setSessionType(1);   // 1表示单聊
+
+            // 设置消息内容
+            OpenImBatchMsgDTO.Content content = new OpenImBatchMsgDTO.Content();
+            content.setContent(textContent);
+            batchMsgDTO.setContent(content);
+
+
+            // 可选字段 - 离线推送
+            if (StringUtils.isNotEmpty(pushTitle) || StringUtils.isNotEmpty(pushDesc)) {
+                OpenImBatchMsgDTO.OfflinePushInfo pushInfo = new OpenImBatchMsgDTO.OfflinePushInfo();
+                pushInfo.setTitle(StringUtils.isNotEmpty(pushTitle) ? pushTitle : "新消息");
+                pushInfo.setDesc(StringUtils.isNotEmpty(pushDesc) ? pushDesc : textContent);
+                batchMsgDTO.setOfflinePushInfo(pushInfo);
+            }
+
+            // 可选字段 - 扩展信息
+            if (StringUtils.isNotEmpty(ex)) {
+                batchMsgDTO.setEx(ex);
+            }
+
+            // 设置默认值
+            batchMsgDTO.setIsOnlineOnly(false);       // 非仅在线发送
+            batchMsgDTO.setNotOfflinePush(false);     // 允许离线推送
+            batchMsgDTO.setSendTime(System.currentTimeMillis()); // 当前时间
+
+            log.info("批量发送文本消息请求: {}", JSON.toJSONString(batchMsgDTO));
+
+            // 调用批量发送接口
+            OpenImResponseDTO response = this.openIMBatchSendMsg(batchMsgDTO);
+
+            log.info("批量发送文本消息结果 - errCode: {}, errMsg: {}",
+                    response != null ? response.getErrCode() : "null",
+                    response != null ? response.getErrMsg() : "null");
+
+            return response;
+
+        } catch (Exception e) {
+            log.error("批量发送文本消息异常 - 发送人: {}, 接收人数: {}", senderId, receiverIds.size(), e);
+            OpenImResponseDTO errorResponse = new OpenImResponseDTO();
+            errorResponse.setErrCode(500);
+            errorResponse.setErrMsg("发送失败: " + e.getMessage());
+            return errorResponse;
+        }
+    }
 }