Explorar o código

Merge remote-tracking branch 'origin/Payment-Configuration' into Payment-Configuration

yys hai 3 semanas
pai
achega
058d2222c5

+ 2 - 2
fs-admin/src/main/java/com/fs/his/task/CompanyBalanceTask.java

@@ -152,9 +152,9 @@ public class CompanyBalanceTask {
      * @Author xgb
      * @Date 2025/12/30 10:59
      */
-     private void deleteRedPacketLogBatch() {
+    public void deleteRedPacketLogBatch() {
          companyService.deleteRedPacketLogBatch();
-     }
+    }
 
 
 

+ 2 - 2
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -367,7 +367,7 @@ public class CompanyServiceImpl implements ICompanyService
     @Override
     public void deleteRedPacketLogBatch() {
         // 获取三个月前的时间 格式 2025-08-01 00:00:00
-        LocalDateTime threeMonthsAgo = LocalDateTime.now().minusMonths(3).withDayOfMonth(1).with(LocalTime.MIN);
+        LocalDateTime threeMonthsAgo = LocalDateTime.now().minusMonths(3);
         String formattedDate = threeMonthsAgo.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
 
         int totalDeleted = 0;
@@ -400,7 +400,7 @@ public class CompanyServiceImpl implements ICompanyService
 
 
     public static void main(String[] args) {
-        LocalDateTime threeMonthsAgo = LocalDateTime.now().minusMonths(3).withDayOfMonth(1).with(LocalTime.MIN);
+        LocalDateTime threeMonthsAgo = LocalDateTime.now().minusMonths(3);
         String formattedDate = threeMonthsAgo.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
         System.out.println(formattedDate);
     }

+ 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();
     }
 

+ 20 - 52
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,41 +1280,15 @@ public class OpenIMServiceImpl implements OpenIMService {
                 // 保存最后一个批次的响应
                 finalResponseDTO = responseDTO;
 
-            } catch (Exception e) {
-                failCount += batchUserIds.size();
-                log.error("批次 {}/{} 发送异常:{}", i, end, e.getMessage(), e);
-            }
-        }
+                //是否催课
+                if(batchSendCourseDTO.getIsUrgeCourse()){
+                    // 组装催课消息数据
+                    OpenImBatchMsgDTO openImBatchUrgeCourse = makeOpenImBatchMsgDTO(batchSendCourseDTO, courseUrl, objectMapper, batchUserIds, planSendTimeStamp, "催课");
 
-        // 设置汇总结果
-        if (sendType == 2) { // 只有实时发送需要返回统计
-            finalResponseDTO.setErrMsg(String.format("发送完成:总数=%d, 成功=%d, 失败=%d", totalSent, successCount, failCount));
-        }
-
-        //是否催课
-        if(batchSendCourseDTO.getIsUrgeCourse()){
-            // 组装催课消息数据
-            OpenImBatchMsgDTO openImBatchUrgeCourse = makeOpenImBatchMsgDTO(batchSendCourseDTO, courseUrl, objectMapper, userIds, planSendTimeStamp, "催课");
-
-            //缓存定时催课消息
-            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);
-
-                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);
-
-                    OpenImBatchMsgDTO batchUrgeMsgDTO = makeOpenImBatchMsgDTO(batchSendCourseDTO, courseUrl, objectMapper, batchUserIds, planSendTimeStamp, "催课");
-                    List<FsImMsgSendDetail> imMsgSendDetailUrgeList = createImMsgSendLog("催课", batchSendCourseDTO, planSendTimeStamp, urgSendType, batchUserIds, UUID.randomUUID().toString());
+                    // 催课使用与发课相同的批次(batchUserIds),不需要再次拆分
+                    List<FsImMsgSendDetail> imMsgSendDetailUrgeList = createImMsgSendLog("催课", batchSendCourseDTO, planSendTimeStamp, 1, batchUserIds, sendUnionId);
 
+                    // 定时催课 - 缓存到 Redis
                     String redisKey = "openIm:batchSendMsg:urgeCourse";
                     Map<String, Object> redisMap = redisCache.getCacheMap(redisKey);
                     if (redisMap == null) {
@@ -1321,10 +1296,10 @@ public class OpenIMServiceImpl implements OpenIMService {
                     }
 
                     BatchSendCourseAllDTO batchSendCourseAllDTO = new BatchSendCourseAllDTO();
-                    batchSendCourseAllDTO.setOpenImBatchMsgDTO(batchUrgeMsgDTO)
+                    batchSendCourseAllDTO.setOpenImBatchMsgDTO(openImBatchUrgeCourse)
                             .setImMsgSendDetailList(imMsgSendDetailUrgeList);
 
-                    // 使用唯一的 key
+                    // 使用唯一的 key:课程 ID+ 视频 ID+ 时间戳+logId
                     String batchKey = batchSendCourseDTO.getCourseId() + ":" +
                             batchSendCourseDTO.getVideoId() + ":" +
                             batchSendCourseDTO.getUrgeTime().getTime() + ":" +
@@ -1332,30 +1307,23 @@ public class OpenIMServiceImpl implements OpenIMService {
 
                     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);
+            } 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 {

+ 1 - 0
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -54,6 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="appOpenId"    column="app_open_id"    />
         <result property="appleKey"    column="apple_key"    />
         <result property="rechargeBalance"    column="recharge_balance"    />
+        <result property="appCreateTime" column="app_create_time"/>
     </resultMap>
 
     <sql id="selectFsUserVo">

+ 5 - 0
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -114,6 +114,9 @@ public class AppLoginController extends AppBaseController{
             user.setUserId(fsUser.getUserId());
             user.setPassword(Md5Utils.hash(param.getPassword()));
             user.setUpdateTime(new DateTime());
+            if(fsUser.getAppCreateTime() == null){
+                user.setAppCreateTime(new Date());
+            }
             userService.updateFsUser(user);
             return R.ok("注册成功");
         } else {
@@ -124,6 +127,7 @@ public class AppLoginController extends AppBaseController{
             user.setAvatar("https://cos.his.cdwjyyh.com/fs/20240926/420728ee06e54575ba82665dedb4756b.png");
             user.setPassword(Md5Utils.hash(param.getPassword()));
             user.setCreateTime(new Date());
+            user.setAppCreateTime(new Date());
 
             if (userService.insertFsUser(user) > 0) {
                 return R.ok("注册成功");
@@ -217,6 +221,7 @@ public class AppLoginController extends AppBaseController{
         user.setAvatar("https://cos.his.cdwjyyh.com/fs/20240926/420728ee06e54575ba82665dedb4756b.png");
         user.setPassword(Md5Utils.hash(password));
         user.setCreateTime(new Date());
+        user.setAppCreateTime(new Date());
         if (userService.insertFsUser(user) > 0) {
             return R.ok("注册成功");
         } else {