Browse Source

修改删除催课任务 催课信息没有删除

xgb 3 weeks ago
parent
commit
d15dede86a

+ 20 - 19
fs-service/src/main/java/com/fs/im/service/impl/FsImMsgSendLogServiceImpl.java

@@ -148,30 +148,31 @@ public class FsImMsgSendLogServiceImpl extends ServiceImpl<FsImMsgSendLogMapper,
                 .in(FsImMsgSendDetail::getLogId, logIds));
 
         // 删除redis缓存
-//        if(fsImMsgSendLog.getMsgType() == 1){
-            String sendCourseRedisKey = "openIm:batchSendMsg:sendCourse";
-            Map<String, BatchSendCourseAllDTO> sendCourseMap = redisCache.getCacheMap(sendCourseRedisKey);
-
-            if(sendCourseMap != null && !sendCourseMap.isEmpty()){
-                // 组合key
-                if(fsImMsgSendLog.getPlanSendTime() != null) {
-                    String key = fsImMsgSendLog.getCourseId() + ":" + fsImMsgSendLog.getVideoId() + ":" + fsImMsgSendLog.getPlanSendTime().getTime()+ ":"+fsImMsgSendLog.getLogId();
-                    redisTemplate.opsForHash().delete(sendCourseRedisKey, key);
+        for(FsImMsgSendLog log : fsImMsgSendLogs){
+            if(log.getMsgType() == 1){
+                String sendCourseRedisKey = "openIm:batchSendMsg:sendCourse";
+                Map<String, BatchSendCourseAllDTO> sendCourseMap = redisCache.getCacheMap(sendCourseRedisKey);
+
+                if(sendCourseMap != null && !sendCourseMap.isEmpty()){
+                    // 组合key
+                    if(log.getPlanSendTime() != null) {
+                        String key = log.getCourseId() + ":" + log.getVideoId() + ":" + log.getPlanSendTime().getTime()+ ":"+log.getLogId();
+                        redisTemplate.opsForHash().delete(sendCourseRedisKey, key);
+                    }
                 }
-            }
-//        } else {
-            String urgeCourseRedisKey = "openIm:batchSendMsg:urgeCourse";
-            Map<String, BatchSendCourseAllDTO> urgeCourseMap = redisCache.getCacheMap(urgeCourseRedisKey);
-            if(urgeCourseMap != null && !urgeCourseMap.isEmpty()){
-                // 组合key
-                for (FsImMsgSendLog imMsgSendLog : fsImMsgSendLogs) {
-                    if(imMsgSendLog.getPlanSendTime() != null && imMsgSendLog.getMsgType() == 2) {
-                        String key = imMsgSendLog.getCourseId() + ":" + imMsgSendLog.getVideoId() + ":" + imMsgSendLog.getPlanSendTime().getTime()+ ":"+fsImMsgSendLog.getLogId();
+            } else if(log.getMsgType() == 2){
+                String urgeCourseRedisKey = "openIm:batchSendMsg:urgeCourse";
+                Map<String, BatchSendCourseAllDTO> urgeCourseMap = redisCache.getCacheMap(urgeCourseRedisKey);
+                if(urgeCourseMap != null && !urgeCourseMap.isEmpty()){
+                    // 组合key
+                    if(log.getPlanSendTime() != null ) {
+                        String key = log.getCourseId() + ":" + log.getVideoId() + ":" + log.getPlanSendTime().getTime()+ ":"+log.getLogId();
                         redisTemplate.opsForHash().delete(urgeCourseRedisKey, key);
                     }
                 }
             }
-//        }
+        }
+
         return ResponseResult.ok();
     }
 

+ 60 - 62
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1173,8 +1173,9 @@ public class OpenIMServiceImpl implements OpenIMService {
         return openImResponseDTO;
     }
 
+
     @Override
-    public OpenImResponseDTO batchSendCourseLimit(BatchSendCourseDTO batchSendCourseDTO) throws JsonProcessingException {
+    public OpenImResponseDTO batchSendCourseLimit(BatchSendCourseDTO batchSendCourseDTO) {
         ObjectMapper objectMapper = new ObjectMapper();
         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 忽略 null 字段
 
@@ -1279,83 +1280,80 @@ public class OpenIMServiceImpl implements OpenIMService {
                 // 保存最后一个批次的响应
                 finalResponseDTO = responseDTO;
 
-            } catch (Exception e) {
-                failCount += batchUserIds.size();
-                log.error("批次 {}/{} 发送异常:{}", i, end, e.getMessage(), e);
-            }
-        }
-
-        // 设置汇总结果
-        if (sendType == 2) { // 只有实时发送需要返回统计
-            finalResponseDTO.setErrMsg(String.format("发送完成:总数=%d, 成功=%d, 失败=%d", totalSent, successCount, failCount));
-        }
-
-        //是否催课
-        if(batchSendCourseDTO.getIsUrgeCourse()){
-            // 组装催课消息数据
-            OpenImBatchMsgDTO openImBatchUrgeCourse = makeOpenImBatchMsgDTO(batchSendCourseDTO, courseUrl, objectMapper, userIds, planSendTimeStamp, "催课");
+                //是否催课
+                if(batchSendCourseDTO.getIsUrgeCourse()){
+                    // 组装催课消息数据
+                    OpenImBatchMsgDTO openImBatchUrgeCourse = makeOpenImBatchMsgDTO(batchSendCourseDTO, courseUrl, objectMapper, batchUserIds, planSendTimeStamp, "催课");
 
-            //缓存定时催课消息
-            int urgSendType;
-            if(batchSendCourseDTO.getUrgeTime() != null && batchSendCourseDTO.getUrgeTime().compareTo(new Date()) > 0) {
-                urgSendType = 1; //定时
-            } else {
-                urgSendType = 2; //实时
-            }
+                    //缓存定时催课消息
+                    int urgSendType;
+                    if(batchSendCourseDTO.getUrgeTime() != null && batchSendCourseDTO.getUrgeTime().compareTo(new Date()) > 0) {
+                        urgSendType = 1; //定时
+                    } else {
+                        urgSendType = 2; //实时
+                    }
 
-            // 催课也按批次拆分
-            if (urgSendType == 1 && userIds.size() > BATCH_SIZE) {
-                log.info("定时催课消息接收人{}人,超过{}人,拆分缓存", userIds.size(), BATCH_SIZE);
+                    // 催课也按批次拆分,使用与发课相同的 sendUnionId
+                    if (urgSendType == 1 && batchUserIds.size() > BATCH_SIZE) {
+                        log.info("定时催课消息接收人{}人,超过{}人,拆分缓存", batchUserIds.size(), BATCH_SIZE);
 
-                for (int i = 0; i < userIds.size(); i += BATCH_SIZE) {
-                    int end = Math.min(i + BATCH_SIZE, userIds.size());
-                    List<String> batchUserIds = userIds.subList(i, end);
+                        // 进一步拆分催课批次(如果必要)
+                        for (int j = 0; j < batchUserIds.size(); j += BATCH_SIZE) {
+                            int urgeEnd = Math.min(j + BATCH_SIZE, batchUserIds.size());
+                            List<String> urgeBatchUserIds = batchUserIds.subList(j, urgeEnd);
 
-                    OpenImBatchMsgDTO batchUrgeMsgDTO = makeOpenImBatchMsgDTO(batchSendCourseDTO, courseUrl, objectMapper, batchUserIds, planSendTimeStamp, "催课");
-                    List<FsImMsgSendDetail> imMsgSendDetailUrgeList = createImMsgSendLog("催课", batchSendCourseDTO, planSendTimeStamp, urgSendType, batchUserIds, UUID.randomUUID().toString());
+                            OpenImBatchMsgDTO batchUrgeMsgDTO = makeOpenImBatchMsgDTO(batchSendCourseDTO, courseUrl, objectMapper, urgeBatchUserIds, planSendTimeStamp, "催课");
+                            List<FsImMsgSendDetail> imMsgSendDetailUrgeList = createImMsgSendLog("催课", batchSendCourseDTO, planSendTimeStamp, urgSendType, urgeBatchUserIds, sendUnionId);
 
-                    String redisKey = "openIm:batchSendMsg:urgeCourse";
-                    Map<String, Object> redisMap = redisCache.getCacheMap(redisKey);
-                    if (redisMap == null) {
-                        redisMap = new HashMap<>();
-                    }
+                            String redisKey = "openIm:batchSendMsg:urgeCourse";
+                            Map<String, Object> redisMap = redisCache.getCacheMap(redisKey);
+                            if (redisMap == null) {
+                                redisMap = new HashMap<>();
+                            }
 
-                    BatchSendCourseAllDTO batchSendCourseAllDTO = new BatchSendCourseAllDTO();
-                    batchSendCourseAllDTO.setOpenImBatchMsgDTO(batchUrgeMsgDTO)
-                            .setImMsgSendDetailList(imMsgSendDetailUrgeList);
+                            BatchSendCourseAllDTO batchSendCourseAllDTO = new BatchSendCourseAllDTO();
+                            batchSendCourseAllDTO.setOpenImBatchMsgDTO(batchUrgeMsgDTO)
+                                    .setImMsgSendDetailList(imMsgSendDetailUrgeList);
 
-                    // 使用唯一的 key
-                    String batchKey = batchSendCourseDTO.getCourseId() + ":" +
-                            batchSendCourseDTO.getVideoId() + ":" +
-                            batchSendCourseDTO.getUrgeTime().getTime() + ":" +
-                            imMsgSendDetailUrgeList.get(0).getLogId();
+                            // 使用唯一的 key
+                            String batchKey = batchSendCourseDTO.getCourseId() + ":" +
+                                    batchSendCourseDTO.getVideoId() + ":" +
+                                    batchSendCourseDTO.getUrgeTime().getTime() + ":" +
+                                    imMsgSendDetailUrgeList.get(0).getLogId();
 
-                    redisMap.put(batchKey, batchSendCourseAllDTO);
-                    redisCache.setCacheMap(redisKey, redisMap);
-                }
-            } else {
-                // 不超过 100 人或实时发送,按原逻辑
-                List<FsImMsgSendDetail> imMsgSendDetailUrgeList = createImMsgSendLog("催课", batchSendCourseDTO, planSendTimeStamp, urgSendType, userIds, UUID.randomUUID().toString());
-                String redisKey = "openIm:batchSendMsg:urgeCourse";
-                Map<String, Object> redisMap = new HashMap<>();
-                BatchSendCourseAllDTO batchSendCourseAllDTO = new BatchSendCourseAllDTO();
-                batchSendCourseAllDTO.setOpenImBatchMsgDTO(openImBatchUrgeCourse)
-                        .setImMsgSendDetailList(imMsgSendDetailUrgeList);
-
-                String batchKey = batchSendCourseDTO.getCourseId()+":"+batchSendCourseDTO.getVideoId()+":"+batchSendCourseDTO.getUrgeTime().getTime();
-                if (urgSendType == 1) {
-                    batchKey += ":0:" + imMsgSendDetailUrgeList.get(0).getLogId();
+                            redisMap.put(batchKey, batchSendCourseAllDTO);
+                            redisCache.setCacheMap(redisKey, redisMap);
+                        }
+                    } else {
+                        // 不超过 100 人或实时发送,按原逻辑,使用与发课相同的 sendUnionId
+                        List<FsImMsgSendDetail> imMsgSendDetailUrgeList = createImMsgSendLog("催课", batchSendCourseDTO, planSendTimeStamp, urgSendType, batchUserIds, sendUnionId);
+                        String redisKey = "openIm:batchSendMsg:urgeCourse";
+                        Map<String, Object> redisMap = new HashMap<>();
+                        BatchSendCourseAllDTO batchSendCourseAllDTO = new BatchSendCourseAllDTO();
+                        batchSendCourseAllDTO.setOpenImBatchMsgDTO(openImBatchUrgeCourse)
+                                .setImMsgSendDetailList(imMsgSendDetailUrgeList);
+
+                        String batchKey = batchSendCourseDTO.getCourseId()+":"+batchSendCourseDTO.getVideoId()+":"+batchSendCourseDTO.getUrgeTime().getTime()+imMsgSendDetailUrgeList.get(0).getLogId();
+
+                        redisMap.put(batchKey, batchSendCourseAllDTO);
+                        redisCache.setCacheMap(redisKey, redisMap);
+                    }
                 }
 
-                redisMap.put(batchKey, batchSendCourseAllDTO);
-                redisCache.setCacheMap(redisKey, redisMap);
+            } catch (Exception e) {
+                failCount += batchUserIds.size();
+                log.error("批次 {}/{} 发送异常:{}", i, end, e.getMessage(), e);
             }
         }
 
+        // 设置汇总结果
+        if (sendType == 2) { // 只有实时发送需要返回统计
+            finalResponseDTO.setErrMsg(String.format("发送完成:总数=%d, 成功=%d, 失败=%d", totalSent, successCount, failCount));
+        }
+
         return finalResponseDTO;
     }
 
-// ... existing code ...
 
 
     private OpenImBatchMsgDTO makeOpenImBatchMsgDTO(BatchSendCourseDTO batchSendCourseDTO, String courseUrl, ObjectMapper objectMapper, List<String> userIds, long planSendTimeStamp, String logType) throws JsonProcessingException {