Преглед на файлове

失败仅记录日志并跳过本条,不阻塞整批 SOP 生成

xw преди 4 дни
родител
ревизия
e4dd84d76d
променени са 1 файла, в които са добавени 74 реда и са изтрити 21 реда
  1. 74 21
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

+ 74 - 21
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -1594,36 +1594,44 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
 
                     break;
                 case "17":
-                    // 飞书看课链接
-                    Long companyIdLong = Long.parseLong(companyId);
-                    Long companyUserIdLong = Long.parseLong(companyUserId);
-                    Long externalIdLong = null;
-                    String chatIdForFeishu = null;
-                    if (isGroupChat) {
-                        chatIdForFeishu = externalId;
-                    } else if (FeiShuService.isAuthRequired(setting.getFeishuNeedAuth())) {
-                        externalIdLong = Long.parseLong(externalId);
-                        addWatchLogIfNeeded(sopLogs, videoId, courseId, sendTime, qwUserId, companyUserId, companyId, externalId, logVo, 2);
-                    } else {
-                        externalIdLong = Long.parseLong(externalId);
-                    }
+                    // 飞书看课链接:失败仅记录日志并跳过本条,不阻塞整批 SOP 生成
+                    try {
+                        Long companyIdLong = Long.parseLong(companyId);
+                        Long companyUserIdLong = Long.parseLong(companyUserId);
+                        Long externalIdLong = null;
+                        String chatIdForFeishu = null;
+                        if (isGroupChat) {
+                            chatIdForFeishu = externalId;
+                        } else if (FeiShuService.isAuthRequired(setting.getFeishuNeedAuth())) {
+                            externalIdLong = Long.parseLong(externalId);
+                            addWatchLogIfNeeded(sopLogs, videoId, courseId, sendTime, qwUserId, companyUserId, companyId, externalId, logVo, 2);
+                        } else {
+                            externalIdLong = Long.parseLong(externalId);
+                        }
 
-                    Map<String, String> feiShuLinkMap = createFeiShuLinkByMiniApp(setting, sopLogs.getCorpId(), sendTime, courseId, videoId,
-                            qwUserId, companyUserId, companyId, externalIdLong, chatIdForFeishu, cachedCourseConfig);
-                    String shortLink = feiShuLinkMap.get("link");
+                        Map<String, String> feiShuLinkMap = createFeiShuLinkByMiniApp(setting, sopLogs.getCorpId(), sendTime, courseId, videoId,
+                                qwUserId, companyUserId, companyId, externalIdLong, chatIdForFeishu, cachedCourseConfig);
+                        String shortLink = feiShuLinkMap.get("link");
 
-                    try {
                         String feishuLink = feiShuService.resolveFeishuSendLink(videoId, companyIdLong, courseId, companyUserIdLong,
                                 shortLink, setting.getFeishuAccountId(), setting.getFeishuNeedAuth());
                         if (StringUtils.isEmpty(feishuLink)) {
-                            log.error("生成飞书注册链接失败,sopId={}, videoId={}, externalId={}", logVo.getSopId(), videoId, externalId);
-                            throw new RuntimeException("生成飞书注册链接失败");
+                            log.error("生成飞书注册链接失败,跳过本条: sopId={}, videoId={}, externalId={}",
+                                    logVo.getSopId(), videoId, externalId);
+                            recordFeishuLinkGenerationFailed(logVo, sendTime, content.getTime(), qwUserId, qwUserName,
+                                    companyUserId, companyId, logVo.getCorpId(), sopLogs.getExternalId(), fsUserId, videoId,
+                                    "生成飞书注册链接失败");
+                            return;
                         }
                         setting.setLinkUrl(feishuLink);
                         setting.setIsBindUrl("2");
                     } catch (Exception e) {
-                        log.error("生成飞书注册链接异常,sopId={}, videoId={}, externalId={}", logVo.getSopId(), videoId, externalId, e);
-                        throw new RuntimeException("生成飞书注册链接失败: " + e.getMessage(), e);
+                        log.error("生成飞书注册链接异常,跳过本条: sopId={}, videoId={}, externalId={}",
+                                logVo.getSopId(), videoId, externalId, e);
+                        recordFeishuLinkGenerationFailed(logVo, sendTime, content.getTime(), qwUserId, qwUserName,
+                                companyUserId, companyId, logVo.getCorpId(), sopLogs.getExternalId(), fsUserId, videoId,
+                                "生成飞书注册链接失败: " + e.getMessage());
+                        return;
                     }
                     break;
                 default:
@@ -3276,4 +3284,49 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
             }
         }
     }
+
+    /**
+     * 飞书看课链接生成失败时写入 sop_generation_failed_log
+     */
+    private void recordFeishuLinkGenerationFailed(SopUserLogsVo logVo,
+                                                  Date sendTime,
+                                                  String elementTime,
+                                                  String qwUserId,
+                                                  String qwUserName,
+                                                  String companyUserId,
+                                                  String companyId,
+                                                  String corpId,
+                                                  Long externalId,
+                                                  Long fsUserId,
+                                                  Long videoId,
+                                                  String failReason) {
+        try {
+            SopGenerationFailedLog failedLog = new SopGenerationFailedLog();
+            failedLog.setSopId(logVo.getSopId());
+            failedLog.setUserLogsId(logVo.getId());
+            failedLog.setExternalId(externalId);
+            failedLog.setFsUserId(fsUserId);
+            failedLog.setQwUserId(qwUserId);
+            failedLog.setQwUserName(qwUserName);
+            failedLog.setCompanyUserId(companyUserId);
+            failedLog.setCompanyId(companyId);
+            failedLog.setCorpId(corpId);
+            failedLog.setFailType(SopGenerationFailedLog.FailType.OTHER.getCode());
+            String reason = failReason;
+            if (videoId != null) {
+                reason = failReason + " (videoId=" + videoId + ")";
+            }
+            failedLog.setFailReason(reason);
+            failedLog.setIsRetry(SopGenerationFailedLog.RetryStatus.NOT_RETRY.getCode());
+            failedLog.setDayNum(0L);
+            if (sendTime != null) {
+                failedLog.setSendTime(sendTime.toInstant().atZone(ZoneId.systemDefault()).format(DATE_TIME_FORMATTER));
+            }
+            failedLog.setElementTime(elementTime);
+            sopGenerationFailedLogService.batchInsert(Collections.singletonList(failedLog));
+        } catch (Exception e) {
+            log.error("记录飞书链接生成失败日志异常: sopId={}, externalId={}, error={}",
+                    logVo.getSopId(), externalId, e.getMessage(), e);
+        }
+    }
 }