2 Achegas 6ea957a06a ... 5b702eae5e

Autor SHA1 Mensaxe Data
  xw 5b702eae5e 增加qwtask生成待执行记录的日志 hai 1 semana
  xw 6b8ba9f490 chatid hai 1 semana

+ 90 - 9
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -846,6 +846,20 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
             // 处理每个 externalContactId
             sopUserLogsInfos.forEach(contactId -> {
                 try {
+                    // 空值检查
+                    if (contactId == null) {
+                        log.error("contactId 为 null,跳过处理");
+                        return;
+                    }
+                    if (contactId.getExternalId() == null) {
+                        log.error("contactId.getExternalId() 为 null,contactId: {}", contactId);
+                        return;
+                    }
+                    if (contactId.getExternalContactId() == null) {
+                        log.error("contactId.getExternalContactId() 为 null,contactId: {}", contactId);
+                        return;
+                    }
+                    
                     String externalId = contactId.getExternalId().toString();
                     String externalUserName = contactId.getExternalUserName();
                     Long fsUserId = contactId.getFsUserId();
@@ -855,7 +869,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                             type, qwUserId, companyUserId, companyId, externalId, welcomeText, qwUserName, fsUserId, false, miniAppId,
                             null,config, miniMap, grade, sendMsgType,companies);
                 } catch (Exception e) {
-                    log.error("处理 externalContactId {} 时发生异常: {}", contactId, e.getMessage(), e);
+                    log.error("处理 externalContactId {} 时发生异常", contactId, e);
                 }
             });
         }
@@ -949,10 +963,23 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         }
         sopLogs.setReceivingStatus(0L);
 
+        // 增加空值检查
+        if (logVo.getUserId() == null) {
+            log.error("logVo.getUserId() 为 null,logVo: {}", JSON.toJSONString(logVo));
+            throw new RuntimeException("logVo.getUserId() 为 null");
+        }
+        
         String[] userKey = logVo.getUserId().split("\\|");
         log.info("sopLogVo:{}", JSON.toJSONString(logVo));
         log.info("sop_logs -》 userId:{}", logVo.getUserId());
         log.info("sop_logs -》 userId -》 split:{}", Arrays.asList(userKey));
+        
+        // 检查 userKey 数组长度
+        if (userKey.length < 3) {
+            log.error("userKey 数组长度不足,userKey: {}, logVo: {}", Arrays.asList(userKey), JSON.toJSONString(logVo));
+            throw new RuntimeException("userKey 数组长度不足");
+        }
+        
         sopLogs.setCompanyId(Long.valueOf(userKey[2].trim()));
         if (StringUtils.isNotEmpty(userKey[0].trim())){
             sopLogs.setQwUserKey(Long.valueOf(userKey[0].trim()));
@@ -1409,6 +1436,12 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
             return "";
         }
 
+        // 防止 externalId 为 null 或空
+        if (StringUtils.isEmpty(externalId)) {
+            log.error("externalId 为空,无法生成短链接,logVo: {}", JSON.toJSONString(logVo));
+            return "";
+        }
+
         // 手动创建 FsCourseLink 对象,避免使用 BeanUtils.copyProperties
         FsCourseLink link = new FsCourseLink();
         link.setCompanyId(Long.parseLong(companyId));
@@ -1417,7 +1450,12 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         link.setVideoId(videoId.longValue());
         link.setCorpId(logVo.getCorpId());
         link.setCourseId(courseId.longValue());
-        link.setQwExternalId(Long.parseLong(externalId));
+        try {
+            link.setQwExternalId(Long.parseLong(externalId));
+        } catch (NumberFormatException e) {
+            log.error("externalId 格式错误: {}", externalId, e);
+            return "";
+        }
 
         if (StringUtil.strIsNullOrEmpty(isOfficial)){
             link.setLinkType(0);
@@ -1487,7 +1525,12 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         link.setUpdateTime(updateTime);
 
         //取销售绑定的二级域名
-        String sortLink = logVo.getDomain() + SHORT_LINK_PREFIX + link.getLink();
+        String domain = logVo.getDomain();
+        if (domain == null) {
+            log.error("logVo.getDomain() 为 null,使用空字符串替代");
+            domain = "";
+        }
+        String sortLink = domain + SHORT_LINK_PREFIX + link.getLink();
         enqueueCourseLink(link);
         return sortLink.replaceAll("^[\\s\\u2005]+", "");
     }
@@ -1559,8 +1602,14 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         sopAppLink.setVideoId(videoId);
         sopAppLink.setVideoTitle(linkDescribe);
         sopAppLink.setAppRealLink(appMsgLink);
-        sopAppLink.setQwExternalId(Long.parseLong(externalId));
-
+        // 防止 externalId 为 null 或空
+        if (StringUtils.isNotEmpty(externalId)) {
+            try {
+                sopAppLink.setQwExternalId(Long.parseLong(externalId));
+            } catch (NumberFormatException e) {
+                log.error("createFsCourseSopAppLink - externalId 格式错误: {}", externalId, e);
+            }
+        }
 
         return sopAppLink;
     }
@@ -1575,7 +1624,14 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         link.setVideoId(videoId.longValue());
         link.setCorpId(corpId);
         link.setCourseId(courseId.longValue());
-        link.setQwExternalId(Long.parseLong(externalId));
+        // 防止 externalId 为 null 或空
+        if (StringUtils.isNotEmpty(externalId)) {
+            try {
+                link.setQwExternalId(Long.parseLong(externalId));
+            } catch (NumberFormatException e) {
+                log.error("createFsCourseLink - externalId 格式错误: {}", externalId, e);
+            }
+        }
         link.setLinkType(type); //小程序
 
         String randomString = generateRandomStringWithLock();
@@ -1634,7 +1690,14 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         link.setCorpId(logVo.getCorpId());
         link.setCourseId(courseId);
         if(StringUtils.isEmpty(chatId)){
-            link.setQwExternalId(Long.parseLong(externalId));
+            // 防止 externalId 为 null 或空导致异常
+            if (StringUtils.isNotEmpty(externalId)) {
+                try {
+                    link.setQwExternalId(Long.parseLong(externalId));
+                } catch (NumberFormatException e) {
+                    log.error("externalId 格式错误: {}", externalId, e);
+                }
+            }
         }
         link.setProjectCode(cloudHostProper.getProjectCode());
         link.setChatId(chatId);
@@ -1693,7 +1756,14 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                                      String companyId, String externalId,SopUserLogsVo logsVo,Integer watchType) {
         FsCourseWatchLog watchLog = new FsCourseWatchLog();
         watchLog.setVideoId(videoId != null ? videoId.longValue() : null);
-        watchLog.setQwExternalContactId(externalId != null ? Long.valueOf(externalId) : null);
+        // 防止 externalId 为 null 或空
+        if (StringUtils.isNotEmpty(externalId)) {
+            try {
+                watchLog.setQwExternalContactId(Long.valueOf(externalId));
+            } catch (NumberFormatException e) {
+                log.error("addWatchLogIfNeeded - externalId 格式错误: {}", externalId, e);
+            }
+        }
         watchLog.setSendType(2);
         watchLog.setQwUserId(Long.parseLong(qwUserId));
         watchLog.setSopId(sopLogs.getSopId());
@@ -1722,6 +1792,12 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
      * @param corpId
      */
     public void createLiveWatchLogAndEnQueue(String companyId,String companyUserId,String externalId,Long liveId,String appId,Integer logSource,String qwUserId,String corpId){
+        // 防止 externalId 为 null 或空
+        if (StringUtils.isEmpty(externalId)) {
+            log.error("createLiveWatchLogAndEnQueue - externalId 为空,跳过生成直播看课记录");
+            return;
+        }
+        
         // 写入对应数据源的记录表
         LiveWatchLog itemLiveWatchLog = new LiveWatchLog();
         itemLiveWatchLog.setLiveId(liveId);
@@ -1732,7 +1808,12 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         itemLiveWatchLog.setSendAppId(appId);
         itemLiveWatchLog.setLogSource(logSource);
         itemLiveWatchLog.setQwUserId(qwUserId);
-        itemLiveWatchLog.setExternalContactId(Long.valueOf(externalId));
+        try {
+            itemLiveWatchLog.setExternalContactId(Long.valueOf(externalId));
+        } catch (NumberFormatException e) {
+            log.error("createLiveWatchLogAndEnQueue - externalId 格式错误: {}", externalId, e);
+            return;
+        }
         itemLiveWatchLog.setCorpId(corpId);
         enqueueZmLiveWatchLog(itemLiveWatchLog);
     }

+ 3 - 0
fs-service/src/main/java/com/fs/course/domain/FsCourseWatchLog.java

@@ -95,4 +95,7 @@ public class FsCourseWatchLog extends BaseEntity
 
     private Integer watchType;//看课方式:1 app  2 小程序
 
+    /** 群聊ID */
+    private String chatId;
+
 }

+ 4 - 2
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -402,7 +402,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 project,
                 period_id,
                 im_msg_send_detail_id,
-                watch_type
+                watch_type,
+                chat_id
                 )
                 VALUES
                 <foreach collection="watchLogs" item="log" separator=",">
@@ -425,7 +426,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     #{log.project},
                     #{log.periodId},
                     #{log.imMsgSendDetailId},
-                    #{log.watchType}
+                    #{log.watchType},
+                    #{log.chatId}
                     )
                 </foreach>
                 ON DUPLICATE KEY UPDATE