Przeglądaj źródła

im发送直播卡片

yuhongqi 1 tydzień temu
rodzic
commit
981b65869b

+ 4 - 0
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -777,6 +777,10 @@ public class IpadSendServer {
                     // 发送直播短链
                     sendLiveShortLink(vo, content, miniMap);
                     break;
+                case "20":
+                    content.setSendStatus(0);
+                    content.setSendRemarks("APP直播待发送");
+                    break;
                 case "21":
                     content.setSendStatus(0);
                     content.setSendRemarks("短信待发送");

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

@@ -367,6 +367,10 @@ public class SendMsg {
                             if (!settings.isEmpty()) {
                                 asyncSopTestService.asyncSendMsgBySopAppMP3NormalIM(settings, qwSopLogs.getCorpId(), qwUser.getCompanyUserId(), qwSopLogs.getFsUserId());
                             }
+                            List<QwSopCourseFinishTempSetting.Setting> liveSettings = JSON.parseArray(JSON.toJSONString(setting.getSetting()), QwSopCourseFinishTempSetting.Setting.class).stream().filter(e -> "20".equals(e.getContentType())).collect(Collectors.toList());
+                            if (!liveSettings.isEmpty()) {
+                                asyncSopTestService.asyncSendMsgBySopAppLiveIM(liveSettings, qwSopLogs.getCorpId(), qwUser.getCompanyUserId(), qwSopLogs.getFsUserId(), qwSopLogs.getId(), qwUser.getCompanyId());
+                            }
                         } catch (Exception e) {
                             log.error("推送APP失败", e);
                         }
@@ -405,6 +409,18 @@ public class SendMsg {
                             successCount++;
                         }
                     }
+
+                    // app直播卡片
+                    settings = setting.getSetting().stream().filter(e -> "20".equals(e.getContentType())).collect(Collectors.toList());
+                    if (!settings.isEmpty()) {
+                        actualCount++;
+                        hasAppSend = true;
+                        boolean sendFlag = asyncSopTestService.asyncSendMsgBySopAppLiveIM(
+                                settings, qwSopLogs.getCorpId(), qwUser.getCompanyUserId(), qwSopLogs.getFsUserId(), qwSopLogs.getId(), qwUser.getCompanyId());
+                        if (sendFlag) {
+                            successCount++;
+                        }
+                    }
                 }
             }
             qwSopLogs.setSend(true);

+ 30 - 0
fs-service/src/main/java/com/fs/gtPush/service/impl/uniPush2ServiceImpl.java

@@ -277,6 +277,36 @@ public class uniPush2ServiceImpl implements uniPush2Service {
         return openIMService.sendCourse(fsUserId, companyUserId, appLinkUrl, linkDescribe, linkImageUrl, cropId);
     }
 
+    @Override
+    public OpenImResponseDTO pushSopAppLinkMsgByLiveIM(String cropId, String linkTile, String linkDescribe, Long liveId, String link, Long companyUserId, Long fsUserId, Long companyId) throws JsonProcessingException {
+        if (companyUserId == null || fsUserId == null || fsUserId == 0) {
+            OpenImResponseDTO errorResponse = new OpenImResponseDTO();
+            errorResponse.setErrCode(-1);
+            errorResponse.setErrMsg("参数错误:用户未绑定销售");
+            errorResponse.setErrDlt("缺少必要参数");
+            return errorResponse;
+        }
+
+        FsUser fsUser = fsUserMapper.selectFsUserByUserId(fsUserId);
+        if (fsUser == null) {
+            OpenImResponseDTO errorResponse = new OpenImResponseDTO();
+            errorResponse.setErrCode(-2);
+            errorResponse.setErrMsg("未找到对应的用户信息");
+            errorResponse.setErrDlt("用户ID: " + fsUserId);
+            return errorResponse;
+        }
+
+        if (StringUtils.isEmpty(fsUser.getHistoryApp())) {
+            OpenImResponseDTO errorResponse = new OpenImResponseDTO();
+            errorResponse.setErrCode(-3);
+            errorResponse.setErrMsg("用户未绑定APP");
+            errorResponse.setErrDlt("用户历史APP信息为空");
+            return errorResponse;
+        }
+
+        return openIMService.sendLive(fsUserId, companyUserId, link, linkTile, liveId, cropId, companyId);
+    }
+
     /**
      * 专用于 pushIm 的参数构建方法
      */

+ 2 - 0
fs-service/src/main/java/com/fs/gtPush/service/uniPush2Service.java

@@ -16,4 +16,6 @@ public interface uniPush2Service {
     void pushIm(Long userId, Long businessId, String purl, String title, String content, Float type, Integer desType,String imJsonString);
 
     OpenImResponseDTO pushSopAppLinkMsgByExternalIMV2(String cropId, String linkTitle, String linkDescribe, String linkImageUrl, String appLinkUrl, Long companyUserId, Long fsUserId) throws JsonProcessingException;
+
+    OpenImResponseDTO pushSopAppLinkMsgByLiveIM(String cropId, String linkTile, String linkDescribe, Long liveId, String link, Long companyUserId, Long fsUserId, Long companyId) throws JsonProcessingException;
 }

+ 3 - 0
fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java

@@ -1,6 +1,7 @@
 package com.fs.his.dto;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fs.live.domain.Live;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -36,6 +37,8 @@ public class PayloadDTO implements Serializable {
         private Long companyUserId;
         private Long doctorId;
         private Long userInformationId;
+        private Long liveId;
+        private Live live;
     }
 
 }

+ 2 - 0
fs-service/src/main/java/com/fs/im/service/OpenIMService.java

@@ -34,6 +34,8 @@ public interface OpenIMService {
     R accountCheck(String userId, String type);
     void checkAndImportFriend(Long companyUserId,String fsUserId);
     OpenImResponseDTO sendCourse(Long userId,Long companyUserId,String url,String title,String linkImageUrl,String cropId) throws JsonProcessingException;
+
+    OpenImResponseDTO sendLive(Long userId, Long companyUserId, String url, String title, Long liveId, String cropId, Long companyId) throws JsonProcessingException;
     void checkAndImportFriendByDianBo(Long companyUserId,String fsUserId,String cropId, boolean isUpdate);
 
     OpenImResponseDTO updateUserInfo(CompanyUser companyUser);

+ 49 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -33,6 +33,8 @@ import com.fs.his.dto.PayloadDTO;
 import com.fs.his.mapper.FsDoctorMapper;
 import com.fs.his.mapper.FsFollowMapper;
 import com.fs.his.mapper.FsUserMapper;
+import com.fs.live.domain.Live;
+import com.fs.live.mapper.LiveMapper;
 import com.fs.im.config.IMConfig;
 import com.fs.im.domain.FsImMsgSendDetail;
 import com.fs.im.domain.FsImMsgSendLog;
@@ -80,6 +82,8 @@ public class OpenIMServiceImpl implements OpenIMService {
     @Autowired
     private CompanyMapper companyMapper;
     @Autowired
+    private LiveMapper liveMapper;
+    @Autowired
     private FsFollowMapper fsFollowMapper;
     @Autowired
     private QwExternalContactMapper qwExternalContactMapper;
@@ -558,6 +562,51 @@ public class OpenIMServiceImpl implements OpenIMService {
         content = null;
         return openImResponseDTO;
     }
+
+    @Override
+    public OpenImResponseDTO sendLive(Long userId, Long companyUserId, String url, String title, Long liveId, String cropId, Long companyId) throws JsonProcessingException {
+        Live live = liveMapper.selectLiveByLiveId(liveId);
+        Company company = companyMapper.selectCompanyById(companyId);
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(companyUserId);
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        checkAndImportFriendByDianBo(companyUserId, userId.toString(), cropId, true);
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+        PayloadDTO payload = new PayloadDTO();
+        PayloadDTO.Extension extension = new PayloadDTO.Extension();
+        payload.setData("live");
+        extension.setTitle(title);
+        extension.setAppRealLink(url);
+        extension.setSendTime(new Date());
+        extension.setLiveId(liveId);
+        if (company != null) {
+            extension.setCompanyId(company.getCompanyId());
+        }
+        extension.setCompanyUserId(companyUserId);
+        extension.setLive(live);
+        payload.setExtension(extension);
+        imData.setPayload(payload);
+        String imJson = objectMapper.writeValueAsString(imData);
+        content.setData(imJson);
+
+        OpenImMsgDTO.OfflinePushInfo offlinePushInfo = new OpenImMsgDTO.OfflinePushInfo();
+        offlinePushInfo.setDesc(title);
+        if (companyUser != null) {
+            offlinePushInfo.setTitle(StringUtils.isNotEmpty(companyUser.getNickName()) ? companyUser.getNickName() : companyUser.getUserName());
+        }
+
+        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        openImMsgDTO.setOfflinePushInfo(offlinePushInfo);
+        openImMsgDTO.setContent(content);
+        openImMsgDTO.setSendID("C" + companyUserId);
+        openImMsgDTO.setRecvID("U" + userId);
+        openImMsgDTO.setContentType(110);
+        openImMsgDTO.setSessionType(1);
+        log.info("app直播消息: {}", JSON.toJSONString(openImMsgDTO));
+        return openIMSendMsg(openImMsgDTO);
+    }
+
     @Override
     public OpenImResponseDTO sendPackageUtil(String sendID, String recvID, Integer contentType, String payloadData,String packageName,String packageId){
         try {

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

@@ -745,4 +745,45 @@ public class AsyncSopTestService {
         log.info("APP语音发送完成,logId={}", logId);
         return success;
     }
+
+    public boolean asyncSendMsgBySopAppLiveIM(
+            List<QwSopCourseFinishTempSetting.Setting> setting,
+            String cropId,
+            Long companyUserId,
+            Long fsUserId,
+            String logId,
+            Long companyId) {
+        boolean success = true;
+        for (QwSopCourseFinishTempSetting.Setting item : setting) {
+            item.setSendStatus(2);
+            item.setSendRemarks("APP直播发送失败");
+            try {
+                OpenImResponseDTO resp = push2Service.pushSopAppLinkMsgByLiveIM(
+                        cropId,
+                        item.getMiniprogramTitle(),
+                        item.getMiniprogramTitle(),
+                        Long.valueOf(item.getLiveId()),
+                        item.getMiniprogramPicUrl(),
+                        companyUserId,
+                        fsUserId,
+                        companyId
+                );
+                if (resp != null && resp.getErrCode() != null && resp.getErrCode() == 0) {
+                    item.setSendStatus(1);
+                    item.setSendRemarks("APP直播发送成功");
+                } else {
+                    success = false;
+                    if (resp != null) {
+                        item.setSendRemarks(resp.getErrMsg());
+                    }
+                }
+            } catch (Exception e) {
+                success = false;
+                item.setSendRemarks("异常:" + e.getMessage());
+                log.error("APP直播发送异常 logId={}", logId, e);
+            }
+        }
+        log.info("APP直播发送完成,logId={},结果={}", logId, success);
+        return success;
+    }
 }

+ 54 - 0
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -916,6 +916,24 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                     log.error("跳转app直播模板解析失败:" + e);
                                 }
                                 break;
+                            // APP直播卡片
+                            case "20":
+                                try {
+                                    String jsonLive = configService.selectConfigByKey("his.config");
+                                    FSSysConfig sysConfigLive = JSON.parseObject(jsonLive, FSSysConfig.class);
+                                    createLiveWatchLogAndInsert(
+                                            qwUser.getCompanyId().toString(),
+                                            qwUser.getCompanyUserId().toString(),
+                                            groupUser.getId().toString(),
+                                            Long.valueOf(st.getLiveId()),
+                                            sysConfigLive.getAppId(),
+                                            2,
+                                            String.valueOf(qwUser.getId()),
+                                            param.getCorpId());
+                                } catch (Exception e) {
+                                    log.error("APP直播模板解析失败:" + e);
+                                }
+                                break;
                             //群公告
                             case "11":
                                 sopLogs.setSendType(21); // 设置为群公告类型
@@ -1703,6 +1721,24 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                 log.error("跳转app直播模板解析失败:" + e);
                             }
                             break;
+                        // APP直播卡片
+                        case "20":
+                            try {
+                                String jsonLive = configService.selectConfigByKey("his.config");
+                                FSSysConfig sysConfigLive = JSON.parseObject(jsonLive, FSSysConfig.class);
+                                createLiveWatchLogAndInsert(
+                                        qwUser.getCompanyId().toString(),
+                                        qwUser.getCompanyUserId().toString(),
+                                        item.getExternalId().toString(),
+                                        Long.valueOf(st.getLiveId()),
+                                        sysConfigLive.getAppId(),
+                                        2,
+                                        String.valueOf(qwUser.getId()),
+                                        param.getCorpId());
+                            } catch (Exception e) {
+                                log.error("APP直播模板解析失败:" + e);
+                            }
+                            break;
                         //群公告(仅用于一键群发,个人不应该有群公告)
                         case "11":
                             log.warn("群公告不能发给个人,跳过处理,sopId:{}, externalId:{}", param.getSopId(), item.getExternalId());
@@ -2613,6 +2649,24 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                         log.error("跳转app直播模板解析失败:" + e);
                     }
                     break;
+                // APP直播卡片
+                case "20":
+                    try {
+                        String jsonLive = configService.selectConfigByKey("his.config");
+                        FSSysConfig sysConfigLive = JSON.parseObject(jsonLive, FSSysConfig.class);
+                        createLiveWatchLogAndInsert(
+                                qwUser.getCompanyId().toString(),
+                                qwUser.getCompanyUserId().toString(),
+                                item.getExternalId().toString(),
+                                Long.valueOf(st.getLiveId()),
+                                sysConfigLive.getAppId(),
+                                2,
+                                String.valueOf(qwUser.getId()),
+                                param.getCorpId());
+                    } catch (Exception e) {
+                        log.error("APP直播模板解析失败:" + e);
+                    }
+                    break;
                 default:
                     break;
             }

+ 1 - 1
fs-service/src/main/resources/application-druid-bjzm-test.yml

@@ -153,7 +153,7 @@ rocketmq:
 openIM:
     secret: openIM123
     userID: imAdmin
-    url: https://localhost/api
+    url: https://webim.klbycp.com/api
 #是否为新商户,新商户不走mpOpenId
 isNewWxMerchant: true
 #是否使用新im

+ 1 - 1
fs-service/src/main/resources/application-druid-bjzm.yml

@@ -230,7 +230,7 @@ rocketmq:
 openIM:
     secret: openIM123
     userID: imAdmin
-    url: https://localhost/api
+    url: https://webim.klbycp.com/api
 #是否为新商户,新商户不走mpOpenId
 isNewWxMerchant: true
 #是否使用新im