Ver código fonte

Merge remote-tracking branch 'origin/bjcz_his_scrm' into bjcz_his_scrm

yjwang 3 semanas atrás
pai
commit
13d1183e17

+ 72 - 1
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -226,6 +226,18 @@ public class IpadSendServer {
         }
     }
 
+    /**
+     * 发送群公告
+     */
+    public void sendNotice(BaseVo vo, QwSopCourseFinishTempSetting.Setting content) {
+        WxWorkResponseDTO<WxwSendNoticeMsgRespDTO> resp = ipadSendUtils.sendNotice(vo, content.getValue());
+        if (resp.getErrcode() != 0) {
+            log.debug("ID:{}-ipad接口请求返回异常:{}", vo.getId(), resp.getErrmsg());
+            content.setSendStatus(2);
+            content.setSendRemarks("发送失败:" + resp.getErrmsg());
+        }
+    }
+
     public void sendImg(BaseVo vo, QwSopCourseFinishTempSetting.Setting content) {
         FileVo imgVo = FileVo.builder().url(content.getImgUrl()).build();
         imgVo.setBase(vo);
@@ -602,10 +614,64 @@ public class IpadSendServer {
         return true;
     }
 
+    /**
+     * 群公告判定消息
+     * @param qwSopLogs
+     * @param setting
+     * @param qwUser
+     * @return
+     */
+    public boolean isSendLogsGroupNotice(QwSopLogs qwSopLogs, QwSopCourseFinishTempSetting setting, QwUser qwUser){
+        // 群公告只能发给群聊
+        if(qwSopLogs.getSendType() != 6 && qwSopLogs.getSendType() != 21){
+            log.warn("群公告SOP_LOG_ID:{}, 不是群聊消息,不发送", qwSopLogs.getId());
+            qwSopLogsService.updateQwSopLogsByWatchLogType(qwSopLogs.getId(), "群公告只能发给群聊,不发送");
+            return false;
+        }
+        
+        if(qwSopLogs.getSendStatus() != 3){
+            log.info("群公告状态异常不发送:{}, LOGID: {}", qwUser.getQwUserName(), qwSopLogs.getId());
+            return false;
+        }
+        if(redisCache.getCacheObject("qw:user:id:" + qwUser.getId()) != null){
+            log.info("群公告频率异常不发送:{}", qwUser.getQwUserName());
+            return false;
+        }
+
+        boolean noSop = qwSopLogs.getSendType() != 3 && qwSopLogs.getSendType() != 7 && qwSopLogs.getSendType() != 21;
+
+        if (qwSopLogs.getExpiryTime() == null && noSop) {
+            // 作废消息
+            log.warn("群公告SOP_LOG_ID:{}, SOP任务被删除", qwSopLogs.getId());
+            qwSopLogsService.updateQwSopLogsByWatchLogType(qwSopLogs.getId(), "SOP任务被删除");
+            return false;
+        }
+
+        LocalDateTime sendTime = DateUtil.stringToLocalDateTime(qwSopLogs.getSendTime());
+        LocalDateTime expiryDateTime;
+
+        // 判断是否过期
+        if(qwSopLogs.getSendType() == 3 || qwSopLogs.getSendType() == 7 || qwSopLogs.getSendType() == 21){
+            expiryDateTime = sendTime.plusHours(12);
+        }else{
+            expiryDateTime = sendTime.plusHours(qwSopLogs.getExpiryTime());
+        }
+
+        if (LocalDateTime.now().isAfter(expiryDateTime)) {
+            // 作废消息
+            log.warn("群公告SOP_LOG_ID:{}, 已过期,不发送", qwSopLogs.getId());
+            qwSopLogsService.updateQwSopLogsByWatchLogType(qwSopLogs.getId(), "已过期,不发送");
+            return false;
+        }
+
+        return true;
+    }
+
     public void send(QwSopCourseFinishTempSetting.Setting content, QwUser qwUser, QwSopLogs qwSopLogs, Map<String, FsCoursePlaySourceConfig> miniMap, BaseVo parentVo) {
         BaseVo vo = new BaseVo();
         vo.setId(Long.parseLong(qwSopLogs.getId()));
-        vo.setRoom(qwSopLogs.getSendType() == 6);
+        // sendType=6为群聊,sendType=21为群公告(也是群聊)
+        vo.setRoom(qwSopLogs.getSendType() == 6 || qwSopLogs.getSendType() == 21);
         vo.setUuid(qwUser.getUid());
         vo.setExId(qwSopLogs.getExternalUserId());
         vo.setServerId(qwUser.getServerId());
@@ -614,6 +680,11 @@ public class IpadSendServer {
         vo.setQwUserId(qwUser.getId());
         try {
             content.setSendStatus(1);
+            // 如果是群公告,使用SendNotice接口
+            if(qwSopLogs.getSendType() == 21 && "11".equals(content.getContentType())){
+                sendNotice(vo, content);
+                return;
+            }
             switch (content.getContentType()) {
                 case "1":
                     // 文本

+ 7 - 0
fs-ipad-task/src/main/java/com/fs/app/task/SendMsg.java

@@ -197,12 +197,19 @@ public class SendMsg {
             QwSopCourseFinishTempSetting setting = JSON.parseObject(qwSopLogs.getContentJson(), QwSopCourseFinishTempSetting.class);
             //直播的sendType:20单独走判断 其他的走以前的逻辑
             boolean isSendLive = Integer.valueOf(20).equals(qwSopLogs.getSendType());
+            boolean isSendGroupNotice = Integer.valueOf(21).equals(qwSopLogs.getSendType());
             if(isSendLive){
                 if (!sendServer.isSendLogsLive(qwSopLogs, setting, user)) {
                     log.info("销售:{}, 直播消息发送条件未满足:{}", user.getQwUserName(), qwSopLogs.getId());
                     continue;
                 }
             }
+            else if(isSendGroupNotice){
+                if (!sendServer.isSendLogsGroupNotice(qwSopLogs, setting, user)) {
+                    log.info("销售:{}, 群公告消息发送条件未满足:{}", user.getQwUserName(), qwSopLogs.getId());
+                    continue;
+                }
+            }
             else{
                 // 判断消息状态是否满足发送条件
                 if (!sendServer.isSendLogs(qwSopLogs, setting, user)) {

+ 24 - 0
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -1081,6 +1081,11 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
             //直播间发送类型
             case 20:
                 handleLiveMessage(sopLogs, content,companyUserId,companyId,isGroupChat,qwUserId,groupChat,externalId,logVo,liveId);
+                break;
+            //群公告发送类型
+            case 21:
+                handleGroupNoticeMessage(sopLogs, content, isGroupChat);
+                break;
             default:
                 log.error("未知的消息类型 {},跳过处理。", type);
                 break;
@@ -1091,6 +1096,25 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         enqueueQwSopLogs(sopLogs);
     }
 
+    /**
+     * 处理群公告消息
+     * @param sopLogs 日志对象
+     * @param content 内容对象
+     * @param isGroupChat 是否为群聊
+     */
+    private void handleGroupNoticeMessage(QwSopLogs sopLogs, QwSopTempSetting.Content content, boolean isGroupChat) {
+        // 群公告只能发给群聊
+        if (!isGroupChat) {
+            log.warn("群公告只能发给群聊,跳过处理");
+            return;
+        }
+
+        // 设置发送类型为21(群公告)
+        sopLogs.setSendType(21);
+        sopLogs.setContentJson(JSON.toJSONString(content));
+        enqueueQwSopLogs(sopLogs);
+    }
+
     private void handleNormalMessage(QwSopLogs sopLogs, QwSopTempSetting.Content content, String companyUserId, String companyId,
                                      boolean isGroupChat,String qwUserId,QwGroupChat groupChat,String externalId,SopUserLogsVo logVo) {
 

+ 11 - 0
fs-service/src/main/java/com/fs/ipad/IpadSendUtils.java

@@ -216,6 +216,17 @@ public class IpadSendUtils {
         return wxWorkService.SendAppMsg(dto, vo.getServerId());
     }
 
+    /**
+     * 发送群公告
+     */
+    public WxWorkResponseDTO<WxwSendNoticeMsgRespDTO> sendNotice(BaseVo vo, String content){
+        WxwSendNoticeMsgDTO dto = new WxwSendNoticeMsgDTO();
+        dto.setUuid(vo.getUuid());
+        dto.setRoomid(chatIds(vo));
+        dto.setMsg(content);
+        return wxWorkService.SendNotice(dto, vo.getServerId());
+    }
+
 
 
 

+ 19 - 0
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -755,6 +755,10 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             case "16":
                                 createVoiceUrl(st, companyUserId, qwSop);
                                 break;
+                            //群公告
+                            case "11":
+                                sopLogs.setSendType(21); // 设置为群公告类型
+                                break;
                             default:
                                 break;
                         }
@@ -802,6 +806,13 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                     QwSopCourseFinishTempSetting setting = new QwSopCourseFinishTempSetting();
 
                     List<QwSopCourseFinishTempSetting.Setting> list = JSONArray.parseArray(param.getSetting(), QwSopCourseFinishTempSetting.Setting.class);
+                    
+                    // 检查是否有群公告类型,如果有则设置sendType=21
+                    boolean hasGroupNotice = list.stream().anyMatch(st -> "11".equals(st.getContentType()));
+                    if(hasGroupNotice){
+                        sopLogs.setSendType(21);
+                        log.info("检测到群公告类型,设置sendType=21, sopId:{}, chatId:{}", param.getSopId(), groupChat.getChatId());
+                    }
 
                     for (QwSopCourseFinishTempSetting.Setting st : list) {
 
@@ -975,6 +986,10 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                     throw new RuntimeException(e);
                                 }
                                 break;
+                            //群公告
+                            case "11":
+                                sopLogs.setSendType(21); // 设置为群公告类型
+                                break;
                         }
                     }
                     setting.setSetting(list);
@@ -1305,6 +1320,10 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                 throw new RuntimeException(e);
                             }
                             break;
+                        //群公告(仅用于一键群发,个人不应该有群公告)
+                        case "11":
+                            log.warn("群公告不能发给个人,跳过处理,sopId:{}, externalId:{}", param.getSopId(), item.getExternalId());
+                            break;
                         default:
                             break;
 

+ 22 - 0
fs-service/src/main/java/com/fs/wxwork/dto/WxwSendNoticeMsgDTO.java

@@ -0,0 +1,22 @@
+package com.fs.wxwork.dto;
+
+import lombok.Data;
+
+/**
+ * 发送群公告请求DTO
+ */
+@Data
+public class WxwSendNoticeMsgDTO {
+    /**
+     * 消息的唯一标识符 (UUID)
+     */
+    private String uuid;
+    /**
+     * 群聊room_id
+     */
+    private Long roomid;
+    /**
+     * 群公告内容
+     */
+    private String msg;
+}

+ 22 - 0
fs-service/src/main/java/com/fs/wxwork/dto/WxwSendNoticeMsgRespDTO.java

@@ -0,0 +1,22 @@
+package com.fs.wxwork.dto;
+
+import lombok.Data;
+
+/**
+ * 发送群公告响应DTO
+ */
+@Data
+public class WxwSendNoticeMsgRespDTO {
+    /**
+     * 数据(通常为null)
+     */
+    private Object data;
+    /**
+     * 错误码
+     */
+    private Integer errcode;
+    /**
+     * 错误信息
+     */
+    private String errmsg;
+}

+ 6 - 0
fs-service/src/main/java/com/fs/wxwork/service/WxWorkServiceNew.java

@@ -93,6 +93,12 @@ public class WxWorkServiceNew {
         return WxWorkHttpUtilNew.postWithType(url, param, new TypeReference<WxWorkResponseDTO<WxwSendCDNVideoMsgRespDTO>>() {}, serverId);
     }
 
+
+    public WxWorkResponseDTO<WxwSendNoticeMsgRespDTO> SendNotice(WxwSendNoticeMsgDTO param,Long serverId) {
+        String url = getUrl(serverId) + "/SendNotice";
+        return WxWorkHttpUtilNew.postWithType(url, param, new TypeReference<WxWorkResponseDTO<WxwSendNoticeMsgRespDTO>>() {}, serverId);
+    }
+
     public WxWorkResponseDTO<WxwSendVideoNumberRespDTO> SendVideoNumber(WxwSendVideoNumberMsgDTO param,Long serverId) {
         String url = getUrl(serverId) + "/SendVideoNumber";
         return WxWorkHttpUtilNew.postWithType(url, param, new TypeReference<WxWorkResponseDTO<WxwSendVideoNumberRespDTO>>() {}, serverId);