|
|
@@ -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);
|
|
|
}
|