|
|
@@ -67,6 +67,8 @@ import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import static com.fs.course.utils.LinkUtil.generateRandomStringWithLock;
|
|
|
+
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
@AllArgsConstructor
|
|
|
@@ -110,6 +112,8 @@ public class IpadSendServer {
|
|
|
private final IFsCourseLinkService linkService;
|
|
|
|
|
|
private static final List<String> PROJECT_NAMES = Arrays.asList("济南联志健康", "北京存在文化","宽益堂");
|
|
|
+ private static final String H5_LIVE_SHORT_LINK_PREFIX = "/pages_course/livingInvite.html?s=";
|
|
|
+ private static final String APP_LIVE_SHORT_LINK_PREFIX = "/pages_live/livingList?link=";
|
|
|
private final LiveWatchLogMapper liveWatchLogMapper;
|
|
|
|
|
|
/**
|
|
|
@@ -816,39 +820,117 @@ public class IpadSendServer {
|
|
|
|
|
|
|
|
|
private void sendAppShortLink(BaseVo vo, QwSopCourseFinishTempSetting.Setting content, Map<String, FsCoursePlaySourceConfig> miniMap) {
|
|
|
-// //发送短链前,先发送一个介绍语
|
|
|
-// TxtVo introduction = TxtVo.builder().content("请复制以下短链内容").build();
|
|
|
-// introduction.setBase(vo);
|
|
|
-// ipadSendUtils.sendTxt(introduction);
|
|
|
- //发送短链内容
|
|
|
- String miniProgramPage = content.getMiniprogramPage();
|
|
|
- String sendShortLink = null;
|
|
|
- //解析直播短链信息
|
|
|
- String livePrefix = "/pages_live/livingList?link=";
|
|
|
- if (miniProgramPage.startsWith(livePrefix)) {
|
|
|
- com.alibaba.fastjson.JSONObject obj = com.alibaba.fastjson.JSONObject.parseObject(miniProgramPage.substring(livePrefix.length()));
|
|
|
- sendShortLink = livePrefix + obj.getString("link");
|
|
|
- }
|
|
|
- //解析课程短链信息
|
|
|
+ try {
|
|
|
+ String miniProgramPage = content.getMiniprogramPage();
|
|
|
+ if (StringUtils.isBlank(miniProgramPage) && StringUtils.isNotBlank(content.getLiveId())) {
|
|
|
+ miniProgramPage = buildAppLiveShortLinkPage(vo, content);
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(miniProgramPage)) {
|
|
|
+ log.error("ID:{}-APP短链页面路径为空, liveId:{}", vo.getId(), content.getLiveId());
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:APP短链页面路径为空");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ String sendShortLink = resolveAppShortLink(miniProgramPage);
|
|
|
+ if (StringUtils.isBlank(sendShortLink)) {
|
|
|
+ log.error("ID:{}-APP短链解析失败, page:{}", vo.getId(), miniProgramPage);
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:APP短链解析失败");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ sendShortLink = sendShortLink.replace(".html", "");
|
|
|
+ String invitationCode = LinkUtil.encryptLink(sendShortLink);
|
|
|
+ if (StringUtils.isBlank(invitationCode)) {
|
|
|
+ log.error("ID:{}-APP短链加密失败, link:{}", vo.getId(), sendShortLink);
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:短链加密失败");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ TxtVo txtVo = TxtVo.builder().content("太乙云养" + invitationCode).build();
|
|
|
+ txtVo.setBase(vo);
|
|
|
+ WxWorkResponseDTO<WxWorkSendTextMsgRespDTO> resp = ipadSendUtils.sendTxt(txtVo);
|
|
|
+ if (resp.getErrcode() != 0) {
|
|
|
+ log.debug("ID:{}-ipad接口请求返回异常:{}", vo.getId(), resp.getErrmsg());
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:" + resp.getErrmsg());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ID:{}-发送APP短链异常, liveId:{}", vo.getId(), content.getLiveId(), e);
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析APP短链,兼容直播/看课及 livingInvite 格式
|
|
|
+ */
|
|
|
+ private String resolveAppShortLink(String miniProgramPage) {
|
|
|
+ if (miniProgramPage.startsWith(APP_LIVE_SHORT_LINK_PREFIX)) {
|
|
|
+ com.alibaba.fastjson.JSONObject obj = com.alibaba.fastjson.JSONObject.parseObject(
|
|
|
+ miniProgramPage.substring(APP_LIVE_SHORT_LINK_PREFIX.length()));
|
|
|
+ return APP_LIVE_SHORT_LINK_PREFIX + obj.getString("link");
|
|
|
+ }
|
|
|
String coursePrefix = "/courseH5/pages/course/learning?course=";
|
|
|
if (miniProgramPage.startsWith(coursePrefix)) {
|
|
|
- com.alibaba.fastjson.JSONObject obj = com.alibaba.fastjson.JSONObject.parseObject(miniProgramPage.substring(coursePrefix.length()));
|
|
|
- sendShortLink = coursePrefix + obj.getString("link");
|
|
|
+ com.alibaba.fastjson.JSONObject obj = com.alibaba.fastjson.JSONObject.parseObject(
|
|
|
+ miniProgramPage.substring(coursePrefix.length()));
|
|
|
+ return coursePrefix + obj.getString("link");
|
|
|
}
|
|
|
- if (null == sendShortLink) {
|
|
|
- log.warn("发送链接为空");
|
|
|
- return;
|
|
|
+ if (miniProgramPage.contains("livingInvite") && miniProgramPage.contains("s=")) {
|
|
|
+ String jsonPart = miniProgramPage.substring(miniProgramPage.indexOf("s=") + 2);
|
|
|
+ com.alibaba.fastjson.JSONObject obj = com.alibaba.fastjson.JSONObject.parseObject(jsonPart);
|
|
|
+ String linkId = obj.getString("link");
|
|
|
+ if (StringUtils.isNotBlank(linkId)) {
|
|
|
+ return APP_LIVE_SHORT_LINK_PREFIX + linkId;
|
|
|
+ }
|
|
|
}
|
|
|
- sendShortLink = sendShortLink.replace(".html","");
|
|
|
- String InvitationCode = LinkUtil.encryptLink(sendShortLink);
|
|
|
- TxtVo txtVo = TxtVo.builder().content("康好健康"+InvitationCode).build();
|
|
|
- txtVo.setBase(vo);
|
|
|
- WxWorkResponseDTO<WxWorkSendTextMsgRespDTO> resp = ipadSendUtils.sendTxt(txtVo);
|
|
|
- if (resp.getErrcode() != 0) {
|
|
|
- log.debug("ID:{}-ipad接口请求返回异常:{}", vo.getId(), resp.getErrmsg());
|
|
|
- content.setSendStatus(2);
|
|
|
- content.setSendRemarks("发送失败:" + resp.getErrmsg());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 兜底构建APP直播短链页面路径
|
|
|
+ */
|
|
|
+ private String buildAppLiveShortLinkPage(BaseVo vo, QwSopCourseFinishTempSetting.Setting content) {
|
|
|
+ if (StringUtils.isBlank(content.getLiveId()) || vo.getQwUserId() == null || StringUtils.isBlank(vo.getExId())) {
|
|
|
+ return null;
|
|
|
}
|
|
|
+ QwUser qwUser = qwUserMapper.selectById(vo.getQwUserId());
|
|
|
+ if (qwUser == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ QwExternalContact externalContact = qwExternalContactMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<QwExternalContact>()
|
|
|
+ .eq(QwExternalContact::getQwUserId, vo.getQwUserId())
|
|
|
+ .eq(QwExternalContact::getExternalUserId, vo.getExId())
|
|
|
+ .last(" limit 1"));
|
|
|
+ if (externalContact == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ FsCourseLink link = new FsCourseLink();
|
|
|
+ link.setCompanyId(qwUser.getCompanyId());
|
|
|
+ link.setQwUserId(qwUser.getId());
|
|
|
+ link.setCompanyUserId(qwUser.getCompanyUserId());
|
|
|
+ link.setLiveId(Long.valueOf(content.getLiveId()));
|
|
|
+ link.setCorpId(StringUtils.isNotBlank(vo.getCorpId()) ? vo.getCorpId() : vo.getCorpCode());
|
|
|
+ link.setUNo(UUID.randomUUID().toString());
|
|
|
+ link.setQwExternalId(externalContact.getId());
|
|
|
+
|
|
|
+ String randomString = generateRandomStringWithLock();
|
|
|
+ if (StringUtils.isBlank(randomString)) {
|
|
|
+ link.setLink(UUID.randomUUID().toString().replace("-", ""));
|
|
|
+ } else {
|
|
|
+ link.setLink(randomString);
|
|
|
+ }
|
|
|
+
|
|
|
+ String courseJson = JSON.toJSONString(link);
|
|
|
+ String realLinkFull = APP_LIVE_SHORT_LINK_PREFIX + courseJson;
|
|
|
+ link.setRealLink(realLinkFull);
|
|
|
+ linkService.insertFsCourseLink(link);
|
|
|
+ return realLinkFull;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -858,19 +940,105 @@ public class IpadSendServer {
|
|
|
* @param miniMap
|
|
|
*/
|
|
|
private void sendLiveShortLink(BaseVo vo, QwSopCourseFinishTempSetting.Setting content, Map<String, FsCoursePlaySourceConfig> miniMap) {
|
|
|
- FsCoursePlaySourceConfig courseMaConfig = miniMap.get(content.getMiniprogramAppid());
|
|
|
- String miniProgramPage = content.getMiniprogramPage();
|
|
|
- miniProgramPage = miniProgramPage.replace(".html","");
|
|
|
- String link = linkService.getGotoWxAppLink(miniProgramPage, courseMaConfig.getAppid());
|
|
|
+ try {
|
|
|
+ String miniProgramPage = content.getMiniprogramPage();
|
|
|
+ if (StringUtils.isBlank(miniProgramPage)) {
|
|
|
+ miniProgramPage = buildLiveShortLinkPage(vo, content);
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(miniProgramPage)) {
|
|
|
+ log.error("ID:{}-直播短链页面路径为空, liveId:{}", vo.getId(), content.getLiveId());
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:直播短链页面路径为空");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- TxtVo txtVo = TxtVo.builder().content(link).build();
|
|
|
- txtVo.setBase(vo);
|
|
|
- WxWorkResponseDTO<WxWorkSendTextMsgRespDTO> resp = ipadSendUtils.sendTxt(txtVo);
|
|
|
- if (resp.getErrcode() != 0) {
|
|
|
- log.debug("ID:{}-ipad接口请求返回异常:{}", vo.getId(), resp.getErrmsg());
|
|
|
+ String appId = content.getMiniprogramAppid();
|
|
|
+ FsCoursePlaySourceConfig courseMaConfig = miniMap.get(appId);
|
|
|
+ if (courseMaConfig == null && StringUtils.isNotBlank(appId)) {
|
|
|
+ List<FsCoursePlaySourceConfig> configs = playSourceConfigService.list(
|
|
|
+ new QueryWrapper<FsCoursePlaySourceConfig>().eq("appid", appId).eq("is_del", 0));
|
|
|
+ if (configs != null && !configs.isEmpty()) {
|
|
|
+ courseMaConfig = configs.get(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (courseMaConfig == null) {
|
|
|
+ log.error("ID:{}-未找到小程序配置, appId:{}", vo.getId(), appId);
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:未找到小程序配置");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ miniProgramPage = miniProgramPage.replace(".html", "");
|
|
|
+ String link = linkService.getGotoWxAppLink(miniProgramPage, courseMaConfig.getAppid());
|
|
|
+ if (StringUtils.isBlank(link)) {
|
|
|
+ log.error("ID:{}-获取直播微信短链失败, page:{}", vo.getId(), miniProgramPage);
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:获取微信短链失败");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ TxtVo txtVo = TxtVo.builder().content(link).build();
|
|
|
+ txtVo.setBase(vo);
|
|
|
+ WxWorkResponseDTO<WxWorkSendTextMsgRespDTO> resp = ipadSendUtils.sendTxt(txtVo);
|
|
|
+ if (resp.getErrcode() != 0) {
|
|
|
+ log.debug("ID:{}-ipad接口请求返回异常:{}", vo.getId(), resp.getErrmsg());
|
|
|
+ content.setSendStatus(2);
|
|
|
+ content.setSendRemarks("发送失败:" + resp.getErrmsg());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ID:{}-发送直播短链异常, liveId:{}", vo.getId(), content.getLiveId(), e);
|
|
|
content.setSendStatus(2);
|
|
|
- content.setSendRemarks("发送失败:" + resp.getErrmsg());
|
|
|
+ content.setSendRemarks("发送失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 兜底构建直播H5短链页面路径(SOP入库时未写入 miniprogramPage 时使用)
|
|
|
+ */
|
|
|
+ private String buildLiveShortLinkPage(BaseVo vo, QwSopCourseFinishTempSetting.Setting content) {
|
|
|
+ if (StringUtils.isBlank(content.getLiveId()) || vo.getQwUserId() == null || StringUtils.isBlank(vo.getExId())) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ QwUser qwUser = qwUserMapper.selectById(vo.getQwUserId());
|
|
|
+ if (qwUser == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ QwExternalContact externalContact = qwExternalContactMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<QwExternalContact>()
|
|
|
+ .eq(QwExternalContact::getQwUserId, vo.getQwUserId())
|
|
|
+ .eq(QwExternalContact::getExternalUserId, vo.getExId())
|
|
|
+ .last(" limit 1"));
|
|
|
+ if (externalContact == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ FsCourseLink link = new FsCourseLink();
|
|
|
+ link.setCompanyId(qwUser.getCompanyId());
|
|
|
+ link.setQwUserId(qwUser.getId());
|
|
|
+ link.setCompanyUserId(qwUser.getCompanyUserId());
|
|
|
+ link.setLiveId(Long.valueOf(content.getLiveId()));
|
|
|
+ link.setCorpId(StringUtils.isNotBlank(vo.getCorpId()) ? vo.getCorpId() : vo.getCorpCode());
|
|
|
+ link.setUNo(UUID.randomUUID().toString());
|
|
|
+ link.setQwExternalId(externalContact.getId());
|
|
|
+
|
|
|
+ String randomString = generateRandomStringWithLock();
|
|
|
+ if (StringUtils.isBlank(randomString)) {
|
|
|
+ link.setLink(UUID.randomUUID().toString().replace("-", ""));
|
|
|
+ } else {
|
|
|
+ link.setLink(randomString);
|
|
|
+ }
|
|
|
+
|
|
|
+ String courseJson = JSON.toJSONString(link);
|
|
|
+ String realLinkFull = H5_LIVE_SHORT_LINK_PREFIX + courseJson;
|
|
|
+ realLinkFull = realLinkFull.substring(0, realLinkFull.length() - 1);
|
|
|
+ realLinkFull += ",\"externalId\":\"" + externalContact.getId() + "\"";
|
|
|
+ if (StringUtils.isNotBlank(content.getChatId())) {
|
|
|
+ realLinkFull += ",\"chatId\":\"" + content.getChatId() + "\"";
|
|
|
}
|
|
|
+ realLinkFull += "}";
|
|
|
+ link.setRealLink(realLinkFull);
|
|
|
+ linkService.insertFsCourseLink(link);
|
|
|
+ return link.getRealLink();
|
|
|
}
|
|
|
|
|
|
/**
|