|
|
@@ -61,6 +61,7 @@ import com.fs.sop.params.SopUserLogsParamByDate;
|
|
|
import com.fs.sop.service.IQwSopLogsService;
|
|
|
import com.fs.sop.service.IQwSopService;
|
|
|
import com.fs.sop.service.IQwSopTempVoiceService;
|
|
|
+import com.fs.sop.service.ISopGenerationFailedLogService;
|
|
|
import com.fs.sop.service.ISopUserLogsInfoService;
|
|
|
import com.fs.sop.service.ISopUserLogsService;
|
|
|
import com.fs.sop.vo.ExtCourseSopWatchLogVO;
|
|
|
@@ -104,6 +105,8 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
|
|
|
private static final String appLink = "https://jump.ylrztop.com/jumpapp/pages/index/index?link=";
|
|
|
private static final String registeredRealLink = "/pages_course/register.html?link=";
|
|
|
private static final String feishuMiniappLink = "/pages_course/video?course=";
|
|
|
+ private static final DateTimeFormatter FEISHU_FAIL_SEND_TIME_FORMATTER =
|
|
|
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
// private static final String miniappRealLink = "/pages/index/index?course=";
|
|
|
|
|
|
@Autowired
|
|
|
@@ -205,6 +208,9 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
|
|
|
@Autowired
|
|
|
private FeiShuService feiShuService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ISopGenerationFailedLogService sopGenerationFailedLogService;
|
|
|
+
|
|
|
|
|
|
@Override
|
|
|
public void save(SopUserLogsInfo sopUserLogsInfo) {
|
|
|
@@ -767,11 +773,13 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
|
|
|
}
|
|
|
Map<String, String> feishuH5Link = createFeishuH5Link(st, param.getCorpId(), createTime, courseId18, videoId18, String.valueOf(qwUser.getId()), companyUserId, String.valueOf(companyIdLong), externalUserId, config);
|
|
|
String shortCode = feishuH5Link.get("link");
|
|
|
- String feishuLink = feiShuService.resolveFeishuSendLink(videoId18.longValue(), companyIdLong, courseId18.longValue(), companyUserIdLong, shortCode, st.getFeishuAccountId(), st.getFeishuNeedAuth());
|
|
|
+ String feishuLink = resolveFeishuSendLinkSafely(videoId18.longValue(), companyIdLong, courseId18.longValue(),
|
|
|
+ companyUserIdLong, shortCode, st.getFeishuAccountId(), st.getFeishuNeedAuth(),
|
|
|
+ param.getSopId(), null, externalUserId, vo.getFsUserId(),
|
|
|
+ qwUser.getQwUserId(), qwUser.getQwUserName(), companyUserId, companyId,
|
|
|
+ param.getCorpId(), createTime, param.getStartTime());
|
|
|
if (StringUtils.isNotEmpty(feishuLink)) {
|
|
|
st.setLinkUrl(feishuLink);
|
|
|
- } else {
|
|
|
- log.error("生成飞书注册链接失败,sopId={}", param.getSopId());
|
|
|
}
|
|
|
break;
|
|
|
//群公告
|
|
|
@@ -994,11 +1002,13 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
|
|
|
}
|
|
|
Map<String, String> feishuH5LinkGroup = createFeishuH5Link(st, param.getCorpId(), createTime, courseId18Group, videoId18Group, String.valueOf(qwUser.getId()), String.valueOf(companyUserIdLongGroup), String.valueOf(companyIdLongGroup), null, config, groupChat.getChatId());
|
|
|
String shortCodeGroup = feishuH5LinkGroup.get("link");
|
|
|
- String feishuLinkGroup = feiShuService.resolveFeishuSendLink(videoId18Group.longValue(), companyIdLongGroup, courseId18Group.longValue(), companyUserIdLongGroup, shortCodeGroup, st.getFeishuAccountId(), st.getFeishuNeedAuth());
|
|
|
+ String feishuLinkGroup = resolveFeishuSendLinkSafely(videoId18Group.longValue(), companyIdLongGroup, courseId18Group.longValue(),
|
|
|
+ companyUserIdLongGroup, shortCodeGroup, st.getFeishuAccountId(), st.getFeishuNeedAuth(),
|
|
|
+ param.getSopId(), null, null, null,
|
|
|
+ qwUser.getQwUserId(), qwUser.getQwUserName(), String.valueOf(companyUserIdLongGroup), String.valueOf(companyIdLongGroup),
|
|
|
+ param.getCorpId(), createTime, param.getStartTime());
|
|
|
if (StringUtils.isNotEmpty(feishuLinkGroup)) {
|
|
|
st.setLinkUrl(feishuLinkGroup);
|
|
|
- } else {
|
|
|
- log.error("生成飞书注册链接失败,sopId={}", param.getSopId());
|
|
|
}
|
|
|
break;
|
|
|
//群公告
|
|
|
@@ -1337,11 +1347,13 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
|
|
|
}
|
|
|
Map<String, String> feishuH5Link = createFeishuH5Link(st, param.getCorpId(), createTime, courseId18, videoId18, qwUserId, companyUserId, companyId, item.getExternalId(), config);
|
|
|
String shortCode = feishuH5Link.get("link");
|
|
|
- String feishuLink = feiShuService.resolveFeishuSendLink(videoId18.longValue(), companyIdLong, courseId18.longValue(), companyUserIdLong, shortCode, st.getFeishuAccountId(), st.getFeishuNeedAuth());
|
|
|
+ String feishuLink = resolveFeishuSendLinkSafely(videoId18.longValue(), companyIdLong, courseId18.longValue(),
|
|
|
+ companyUserIdLong, shortCode, st.getFeishuAccountId(), st.getFeishuNeedAuth(),
|
|
|
+ param.getSopId(), item.getUserLogsId(), item.getExternalId(), item.getFsUserId(),
|
|
|
+ qwUserId, qwUser.getQwUserName(), companyUserId, companyId,
|
|
|
+ param.getCorpId(), createTime, param.getStartTime());
|
|
|
if (StringUtils.isNotEmpty(feishuLink)) {
|
|
|
st.setLinkUrl(feishuLink);
|
|
|
- } else {
|
|
|
- log.error("生成飞书注册链接失败,sopId={}", param.getSopId());
|
|
|
}
|
|
|
break;
|
|
|
//群公告(仅用于一键群发,个人不应该有群公告)
|
|
|
@@ -1961,7 +1973,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
|
|
|
}
|
|
|
Map<String, String> feishuH5Link = createFeishuH5Link(st, param.getCorpId(), dataTime, courseId18, videoId18, String.valueOf(qwUser.getId()), companyUserId, companyId, externalId, config);
|
|
|
String shortLink = feishuH5Link.get("link");
|
|
|
- String feishuLink = feiShuService.resolveFeishuSendLink(videoId18.longValue(), companyIdLong, courseId18.longValue(), companyUserIdLong, shortLink, st.getFeishuAccountId(), st.getFeishuNeedAuth());
|
|
|
+ String feishuLink = resolveFeishuSendLinkSafely(videoId18.longValue(), companyIdLong, courseId18.longValue(),
|
|
|
+ companyUserIdLong, shortLink, st.getFeishuAccountId(), st.getFeishuNeedAuth(),
|
|
|
+ item.getSopId(), item.getUserLogsId(), externalId, item.getFsUserId(),
|
|
|
+ String.valueOf(qwUser.getId()), qwUser.getQwUserName(), companyUserId, companyId,
|
|
|
+ param.getCorpId(), dataTime, item.getStartTime());
|
|
|
if (StringUtils.isNotEmpty(feishuLink)) {
|
|
|
String txt18 = StringUtil.strIsNullOrEmpty(qwUser.getWelcomeText()) ? "" : qwUser.getWelcomeText();
|
|
|
String customerTitle = contact == null ? "同学" :
|
|
|
@@ -1977,8 +1993,6 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
|
|
|
.replaceAll("#客户称呼#", customerTitle));
|
|
|
}
|
|
|
st.setLinkUrl(feishuLink);
|
|
|
- } else {
|
|
|
- log.error("生成飞书注册链接失败,sopId={}", item.getSopId());
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -2497,4 +2511,66 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
|
|
|
return miniAppId;
|
|
|
}
|
|
|
|
|
|
+ private String resolveFeishuSendLinkSafely(Long videoId, Long companyId, Long courseId,
|
|
|
+ Long companyUserId, String shortLink, Long feishuAccountId,
|
|
|
+ Integer feishuNeedAuth, String sopId, String userLogsId,
|
|
|
+ Long externalId, Long fsUserId, String qwUserId, String qwUserName,
|
|
|
+ String companyUserIdStr, String companyIdStr, String corpId,
|
|
|
+ Date sendTime, String elementTime) {
|
|
|
+ try {
|
|
|
+ String feishuLink = feiShuService.resolveFeishuSendLink(videoId, companyId, courseId, companyUserId,
|
|
|
+ shortLink, feishuAccountId, feishuNeedAuth);
|
|
|
+ if (StringUtils.isEmpty(feishuLink)) {
|
|
|
+ log.error("生成飞书注册链接失败,跳过本条: sopId={}, videoId={}, externalId={}",
|
|
|
+ sopId, videoId, externalId);
|
|
|
+ recordFeishuLinkGenerationFailed(sopId, userLogsId, externalId, fsUserId, qwUserId, qwUserName,
|
|
|
+ companyUserIdStr, companyIdStr, corpId, sendTime, elementTime, videoId,
|
|
|
+ "生成飞书注册链接失败");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return feishuLink;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("生成飞书注册链接异常,跳过本条: sopId={}, videoId={}, externalId={}",
|
|
|
+ sopId, videoId, externalId, e);
|
|
|
+ recordFeishuLinkGenerationFailed(sopId, userLogsId, externalId, fsUserId, qwUserId, qwUserName,
|
|
|
+ companyUserIdStr, companyIdStr, corpId, sendTime, elementTime, videoId,
|
|
|
+ "生成飞书注册链接失败: " + e.getMessage());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void recordFeishuLinkGenerationFailed(String sopId, String userLogsId, Long externalId, Long fsUserId,
|
|
|
+ String qwUserId, String qwUserName, String companyUserId,
|
|
|
+ String companyId, String corpId, Date sendTime, String elementTime,
|
|
|
+ Long videoId, String failReason) {
|
|
|
+ try {
|
|
|
+ SopGenerationFailedLog failedLog = new SopGenerationFailedLog();
|
|
|
+ failedLog.setSopId(sopId);
|
|
|
+ failedLog.setUserLogsId(userLogsId);
|
|
|
+ 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(FEISHU_FAIL_SEND_TIME_FORMATTER));
|
|
|
+ }
|
|
|
+ failedLog.setElementTime(elementTime);
|
|
|
+ sopGenerationFailedLogService.batchInsert(Collections.singletonList(failedLog));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("记录飞书链接生成失败日志异常: sopId={}, externalId={}, error={}",
|
|
|
+ sopId, externalId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|