浏览代码

1、sop发送app直播短链

yys 1 周之前
父节点
当前提交
da804cb1f6

+ 7 - 6
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -790,10 +790,8 @@ public class IpadSendServer {
                     content.setSendStatus(0);
                     content.setSendRemarks("短信待发送");
                     break;
-                    //跳转APP看课链接
+                    //跳转APP看课链接(企微文本短链)
                 case "23":
-                    //跳转APP直播链接
-                case "24":
                     sendAppShortLink(vo, content, miniMap);
                     break;
                 case "9":
@@ -802,6 +800,8 @@ public class IpadSendServer {
                     // APP文本
                 case "16":
                     // APP语音
+                case "24":
+                    // APP直播短链走 OpenIM IM 发送,企微侧跳过,交给 SendAppMsg
                 case "25":
                     // APP直播卡片走 OpenIM IM 发送,企微侧跳过,交给 SendAppMsg
                     content.setSendStatus(0);
@@ -1338,9 +1338,10 @@ public class IpadSendServer {
         }
         }
 
-        boolean hasAppLiveCard = setting.getSetting() != null
-                && setting.getSetting().stream().anyMatch(s -> "25".equals(s.getContentType()));
-        if (hasAppLiveCard) {
+        // APP直播短链(24)/卡片(25)走直播看课状态校验,避免落入课程看课逻辑
+        boolean hasAppLiveContent = setting.getSetting() != null
+                && setting.getSetting().stream().anyMatch(s -> "24".equals(s.getContentType()) || "25".equals(s.getContentType()));
+        if (hasAppLiveContent) {
             Long queryLiveId = setting.getLiveId();
             if (queryLiveId == null && setting.getSetting() != null) {
                 for (QwSopCourseFinishTempSetting.Setting a : setting.getSetting()) {

+ 12 - 3
fs-ipad-task/src/main/java/com/fs/app/task/SendAppMsg.java

@@ -211,7 +211,7 @@ public class SendAppMsg {
         if (qwSopLogList.isEmpty()) {
             return;
         }
-        List<String> typeList = Arrays.asList("9", "15", "16", "25");
+        List<String> typeList = Arrays.asList("9", "15", "16", "24", "25");
         // 获取企微用户
         QwUser user = qwUserMapper.selectById(qwUser.getId());
         long end1 = System.currentTimeMillis();
@@ -258,10 +258,15 @@ public class SendAppMsg {
                 boolean mp3SendStatus = true;
                 boolean courseSendStatus = true;
                 boolean liveCardSendStatus = true;
+                boolean liveShortLinkSendStatus = true;
                 boolean hasLiveCard = allContent.stream().anyMatch(e -> "25".equals(e.getContentType()));
                 if (hasLiveCard) {
                     liveCardSendStatus = false;
                 }
+                boolean hasLiveShortLink = allContent.stream().anyMatch(e -> "24".equals(e.getContentType()));
+                if (hasLiveShortLink) {
+                    liveShortLinkSendStatus = false;
+                }
 //                for (QwSopCourseFinishTempSetting.Setting content : allContent) {
 //                    String contentType = content.getContentType();
 //                    if (!typeList.contains(contentType)) {
@@ -317,6 +322,10 @@ public class SendAppMsg {
                         if (!voiceList.isEmpty()) {
                             mp3SendStatus = asyncSopTestService.asyncSendMsgBySopAppMP3NormalIM(voiceList, qwSopLogs.getCorpId(), resolvedCompanyUserId, fsUserId, qwSopLogs.getId());
                         }
+                        List<QwSopCourseFinishTempSetting.Setting> liveShortLinkList = allContent.stream().filter(e -> "24".equals(e.getContentType())).collect(Collectors.toList());
+                        if (!liveShortLinkList.isEmpty()) {
+                            liveShortLinkSendStatus = asyncSopTestService.asyncSendMsgBySopAppLiveShortLinkNormalIM(liveShortLinkList, qwSopLogs.getCorpId(), resolvedCompanyUserId, fsUserId, qwSopLogs.getId());
+                        }
                         List<QwSopCourseFinishTempSetting.Setting> liveCardList = allContent.stream().filter(e -> "25".equals(e.getContentType())).collect(Collectors.toList());
                         if (!liveCardList.isEmpty()) {
                             liveCardSendStatus = asyncSopTestService.asyncSendMsgBySopAppLiveCardNormalIM(liveCardList, qwSopLogs.getCorpId(), resolvedCompanyUserId, fsUserId, companyId, qwSopLogs.getExternalId(), user.getId(), qwSopLogs.getId());
@@ -350,10 +359,10 @@ public class SendAppMsg {
 //                qwSopLogs.setSend(true);
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                 QwSopLogs updateQwSop = new QwSopLogs();
-                if (courseSendStatus&&txtSendStatus&&mp3SendStatus&&liveCardSendStatus){
+                if (courseSendStatus&&txtSendStatus&&mp3SendStatus&&liveCardSendStatus&&liveShortLinkSendStatus){
                     updateQwSop.setAppSendRemark("APP全部发送成功");
                     updateQwSop.setAppSendStatus(1);
-                }else if(!courseSendStatus&&!txtSendStatus&&!mp3SendStatus&&!liveCardSendStatus){
+                }else if(!courseSendStatus&&!txtSendStatus&&!mp3SendStatus&&!liveCardSendStatus&&!liveShortLinkSendStatus){
                     updateQwSop.setAppSendRemark("APP全部发送失败");
                     updateQwSop.setAppSendStatus(2);
                 }else {

+ 1 - 1
fs-ipad-task/src/main/java/com/fs/app/task/SendMsg.java

@@ -208,7 +208,7 @@ public class SendMsg {
             }
             log.info("进入发送消息状态:{}", qwSopLogs.getId());
             // APP专属消息类型:由 SendAppMsg 处理,企微侧不占用待发送队列
-            List<String> appTypeList = Arrays.asList("9", "15", "16", "25");
+            List<String> appTypeList = Arrays.asList("9", "15", "16", "24", "25");
             boolean hasQwContent = setting.getSetting() != null && setting.getSetting().stream()
                     .anyMatch(e -> e.getContentType() != null && !appTypeList.contains(e.getContentType()));
             if (!hasQwContent) {

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

@@ -1208,16 +1208,19 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                     }
                     break;
                 }
-                //录播
+                //录播 / APP直播短链
                 case "24": {
                     String recordCorpId = logVo.getCorpId();
-                    String recordShortH5Link = createH5LiveShortLink(setting, recordCorpId,
+                    String appLiveLink = createAppLiveShortLink(setting, recordCorpId,
                             qwUserId, companyUserId, companyId);
 
                     sopLogs.setSendType(Integer.valueOf(setting.getContentType()));
                     clonedContent.setLiveId(setting.getLiveId());
 
-                    setting.setMiniprogramPage(recordShortH5Link);
+                    setting.setMiniprogramPage(appLiveLink);
+                    setting.setAppLinkUrl(appLiveLink);
+                    sopLogs.setIsHaveApp(1);
+                    sopLogs.setAppSendStatus(0);
                     break;
                 }
                 case "25": {
@@ -1479,16 +1482,19 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                     }
                     break;
                 }
-                //跳转app直播
+                //跳转app直播短链
                 case "24": {
                     String liveCorpId = logVo.getCorpId();
-                    String liveShortH5Link = createH5LiveShortLink(setting, liveCorpId,
+                    String appLiveLink = createAppLiveShortLink(setting, liveCorpId,
                             qwUserId, companyUserId, companyId);
 
                     sopLogs.setSendType(Integer.valueOf(setting.getContentType()));
                     clonedContent.setLiveId(setting.getLiveId());
 
-                    setting.setMiniprogramPage(liveShortH5Link);
+                    setting.setMiniprogramPage(appLiveLink);
+                    setting.setAppLinkUrl(appLiveLink);
+                    sopLogs.setIsHaveApp(1);
+                    sopLogs.setAppSendStatus(0);
                     break;
                 }
                 case "25": {
@@ -1853,16 +1859,19 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                         log.error("app看课模板解析失败:" + e);
                     }
                     break;
-                //app直播跳转
+                //app直播跳转短链
                 case "24":
                     String corpId = logVo.getCorpId();
-                    String shortH5Link = createH5LiveShortLink(setting, corpId,
+                    String shortAppLiveLink = createAppLiveShortLink(setting, corpId,
                             qwUserId, companyUserId, companyId);
 
                     sopLogs.setSendType(Integer.valueOf(setting.getContentType()));
                     clonedContent.setLiveId(setting.getLiveId());
 
-                    setting.setMiniprogramPage(shortH5Link);
+                    setting.setMiniprogramPage(shortAppLiveLink);
+                    setting.setAppLinkUrl(shortAppLiveLink);
+                    sopLogs.setIsHaveApp(1);
+                    sopLogs.setAppSendStatus(0);
 
                     break;
                 case "25":

+ 118 - 0
fs-service/src/main/java/com/fs/qw/service/impl/AsyncSopTestService.java

@@ -9,6 +9,7 @@ import com.fs.course.mapper.FsCourseSopAppLinkMapper;
 import com.fs.gtPush.service.uniPush2Service;
 import com.fs.his.domain.FsUser;
 import com.fs.his.mapper.FsUserMapper;
+import com.fs.his.utils.LinkUtil;
 import com.fs.im.dto.OpenImMsgDTO;
 import com.fs.im.dto.OpenImResponseDTO;
 import com.fs.im.service.OpenIMService;
@@ -559,6 +560,123 @@ public class AsyncSopTestService {
         return success;
     }
 
+    /**
+     * APP直播短链:加密为「太乙云养+码」后走 OpenIM 文本发送(与企微 pad 侧 sendAppShortLink 内容一致)
+     */
+    public boolean asyncSendMsgBySopAppLiveShortLinkNormalIM(
+            List<QwSopCourseFinishTempSetting.Setting> setting,
+            String cropId,
+            Long companyUserId,
+            Long fsUserId,
+            String logId) {
+
+        boolean success = true;
+        String remark = "APP直播短链发送成功";
+        final String appLiveShortLinkPrefix = "/pages_live/livingList?link=";
+
+        try {
+            FsUser fsUser = fsUserMapper.selectFsUserByUserId(fsUserId);
+
+            for (QwSopCourseFinishTempSetting.Setting item : setting) {
+                item.setSendStatus(2);
+                item.setSendRemarks("APP直播短链发送失败");
+
+                if (fsUser == null) {
+                    item.setSendRemarks("未找到对应的用户信息");
+                    success = false;
+                    remark = "APP直播短链发送失败";
+                    continue;
+                }
+
+                try {
+                    String miniProgramPage = StringUtils.isNotEmpty(item.getMiniprogramPage())
+                            ? item.getMiniprogramPage() : item.getAppLinkUrl();
+                    if (StringUtils.isEmpty(miniProgramPage)) {
+                        item.setSendRemarks("APP直播短链页面路径为空");
+                        success = false;
+                        remark = "APP直播短链发送失败";
+                        continue;
+                    }
+
+                    String sendShortLink = resolveAppLiveShortLink(miniProgramPage, appLiveShortLinkPrefix);
+                    if (StringUtils.isEmpty(sendShortLink)) {
+                        item.setSendRemarks("APP直播短链解析失败");
+                        success = false;
+                        remark = "APP直播短链发送失败";
+                        continue;
+                    }
+
+                    sendShortLink = sendShortLink.replace(".html", "");
+                    String invitationCode = LinkUtil.encryptLink(sendShortLink);
+                    if (StringUtils.isEmpty(invitationCode)) {
+                        item.setSendRemarks("APP直播短链加密失败");
+                        success = false;
+                        remark = "APP直播短链发送失败";
+                        continue;
+                    }
+
+                    OpenImMsgDTO dto = new OpenImMsgDTO();
+                    dto.setSendID("C" + companyUserId);
+                    dto.setRecvID("U" + fsUserId);
+                    dto.setContentType(101);
+                    dto.setSessionType(1);
+
+                    OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+                    content.setContent("太乙云养" + invitationCode);
+                    dto.setContent(content);
+
+                    OpenImResponseDTO resp = openIMService.openIMSendMsg(dto);
+                    if (resp != null && resp.getErrCode() != null && resp.getErrCode() == 0) {
+                        item.setSendStatus(1);
+                        item.setSendRemarks("发送成功");
+                    } else {
+                        success = false;
+                        remark = "APP直播短链发送失败";
+                        if (resp != null) {
+                            item.setSendRemarks(resp.getErrMsg());
+                        }
+                    }
+                } catch (Exception e) {
+                    success = false;
+                    remark = "APP直播短链发送失败";
+                    item.setSendRemarks("异常:" + e.getMessage());
+                    log.error("APP直播短链发送异常 logId={}", logId, e);
+                }
+            }
+        } catch (Exception e) {
+            success = false;
+            remark = "APP直播短链发送失败";
+            log.error("APP直播短链发送外层异常 logId={}", logId, e);
+        }
+
+        log.info("APP直播短链发送完成,logId={},结果={}", logId, remark);
+        return success;
+    }
+
+    private String resolveAppLiveShortLink(String miniProgramPage, String appLiveShortLinkPrefix) {
+        try {
+            if (miniProgramPage.startsWith(appLiveShortLinkPrefix)) {
+                com.alibaba.fastjson.JSONObject obj = com.alibaba.fastjson.JSONObject.parseObject(
+                        miniProgramPage.substring(appLiveShortLinkPrefix.length()));
+                String linkId = obj != null ? obj.getString("link") : null;
+                if (StringUtils.isNotEmpty(linkId)) {
+                    return appLiveShortLinkPrefix + linkId;
+                }
+            }
+            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 != null ? obj.getString("link") : null;
+                if (StringUtils.isNotEmpty(linkId)) {
+                    return appLiveShortLinkPrefix + linkId;
+                }
+            }
+        } catch (Exception e) {
+            log.error("解析APP直播短链失败 page={}", miniProgramPage, e);
+        }
+        return null;
+    }
+
     public boolean asyncSendMsgBySopAppLiveCardNormalIM(
             List<QwSopCourseFinishTempSetting.Setting> setting,
             String cropId,

+ 12 - 5
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -835,12 +835,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                 String appLiveLink = createAppLiveShortLink(st, param.getCorpId(), qwUser.getId(),
                                         companyUserId, companyId, vo.getId(), createTime);
                                 st.setMiniprogramPage(appLiveLink);
+                                st.setAppLinkUrl(appLiveLink);
                                 fillAppLiveSetting(st, param.getCorpId(), qwUser, vo.getId(), vo.getFsUserId());
-                                if ("25".equals(st.getContentType())) {
-                                    st.setAppLinkUrl(appLiveLink);
-                                    sopLogs.setIsHaveApp(1);
-                                    sopLogs.setAppSendStatus(0);
-                                }
+                                // APP直播短链(24)/卡片(25)均走 OpenIM,由 SendAppMsg 发送
+                                sopLogs.setIsHaveApp(1);
+                                sopLogs.setAppSendStatus(0);
                                 break;
                             }
                             default:
@@ -1454,7 +1453,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             String appLiveLink = createAppLiveShortLink(st, param.getCorpId(), qwUser.getId(),
                                     companyUserId, companyId, item.getExternalId(), createTime);
                             st.setMiniprogramPage(appLiveLink);
+                            st.setAppLinkUrl(appLiveLink);
                             fillAppLiveSetting(st, param.getCorpId(), qwUser, item);
+                            // APP直播短链走 OpenIM,由 SendAppMsg 发送
+                            sopLogs.setIsHaveApp(1);
+                            sopLogs.setAppSendStatus(0);
                             break;
                         }
                         case "25": {
@@ -2150,7 +2153,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                     String appLiveLink = createAppLiveShortLink(st, param.getCorpId(), qwUser.getId(),
                             companyUserId, companyId, item.getExternalId(), dataTime);
                     st.setMiniprogramPage(appLiveLink);
+                    st.setAppLinkUrl(appLiveLink);
                     fillAppLiveSetting(st, param.getCorpId(), qwUser, item);
+                    // APP直播短链走 OpenIM,由 SendAppMsg 发送
+                    sopLogs.setIsHaveApp(1);
+                    sopLogs.setAppSendStatus(0);
                     break;
                 }
                 case "25": {