Parcourir la source

小程序走订阅号

xw il y a 1 jour
Parent
commit
ca7fdab88e

+ 2 - 6
fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java

@@ -72,12 +72,8 @@ public class FsCourseRedPacketLogController extends BaseController
         }
 
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        Long userId = loginUser.getUser().getUserId();
-        String json = configService.selectConfigByKey("course.config");
-        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if (ObjectUtil.isNotEmpty(config.getIsBound())&&config.getIsBound()){
-            fsCourseRedPacketLog.setCompanyId( loginUser.getCompany().getCompanyId());
-        }
+        // 销售端列表强制只查询当前登录公司的数据
+        fsCourseRedPacketLog.setCompanyId(loginUser.getCompany().getCompanyId());
 
         List<FsCourseRedPacketLogListPVO> list = fsCourseRedPacketLogService.selectFsCourseRedPacketLogListVO(fsCourseRedPacketLog);
         for (FsCourseRedPacketLogListPVO fsCourseRedPacketLogListPVO : list) {

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

@@ -68,6 +68,9 @@ public class IpadSendServer {
     private final LiveWatchLogMapper liveWatchLogMapper;
 
     private void sendMiniProgram(BaseVo vo, QwSopCourseFinishTempSetting.Setting content, Map<String, FsCoursePlaySourceConfig> miniMap, Long companyId) {
+        log.info("ID:{} 小程序发送前关键字段 - miniprogramPage:{}, miniprogramTitle:{}, miniprogramAppid:{}, articleUrl:{}",
+            vo.getId(), content.getMiniprogramPage(), content.getMiniprogramTitle(), content.getMiniprogramAppid(), content.getArticleUrl());
+
         // 发送参数原本的appid
         String appid = content.getMiniprogramAppid();
         // 判断销售工时ID不为空并且有小程序类型
@@ -190,6 +193,8 @@ public class IpadSendServer {
                 .pagepath(content.getMiniprogramPage())
                 .appid(courseMaConfig.getAppid())
                 .build();
+        log.info("ID:{} 构造小程序消息体 - desc:{}, title:{}, imgUrl:{}, pagepath:{}, appid:{}",
+            vo.getId(), miniProgramVo.getDesc(), miniProgramVo.getTitle(), miniProgramVo.getImgUrl(), miniProgramVo.getPagepath(), miniProgramVo.getAppid());
         miniProgramVo.setBase(vo);
         WxWorkResponseDTO<WxWorkSendAppMsgRespDTO> resp = ipadSendUtils.sendMiniProgram(miniProgramVo);
         if (resp.getErrcode() != 0) {
@@ -700,6 +705,7 @@ public class IpadSendServer {
                     break;
                 case "4":
                 case "10":
+                case "13":
                     sendMiniProgram(vo, content, miniMap, qwUser.getCompanyId());
                     break;
                 case "5":

+ 44 - 2
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -58,6 +58,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import java.net.URLEncoder;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -844,7 +845,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         if (StringUtils.isNotEmpty(logVo.getChatId())) {
             QwGroupChat groupChat = groupChatMap.get(logVo.getChatId());
             if (groupChat.getChatUserList() != null && !groupChat.getChatUserList().isEmpty()) {
-            
+
             // 检查是否有群公告类型,如果有则设置sendType=21
             boolean hasGroupNotice = content.getSetting() != null && content.getSetting().stream()
                     .anyMatch(st -> "11".equals(st.getContentType()));
@@ -854,7 +855,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
             } else {
                 ruleTimeVO.setSendType(6);
             }
-            
+
             ruleTimeVO.setType(2);
             QwSopLogs sopLogs = createBaseLog(formattedSendTime, logVo, ruleTimeVO, groupChat.getChatId(), groupChat.getName(), null, isOfficial, null,null);
             handleLogBasedOnType(sopLogs, content, logVo, sendTime, courseId, videoId,
@@ -1516,6 +1517,47 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                         log.error("赋值-小程序封面地址失败-" + e);
                     }
 
+                    break;
+                case "13":
+                    log.info("处理订阅号文章 - sopId:{}, articleUrl:{}", logVo.getSopId(), setting.getArticleUrl());
+
+                    // 获取小程序配置
+                    String articleConfigJson = configService.selectConfigByKey("his.config");
+                    FSSysConfig articleSysConfig = JSON.parseObject(articleConfigJson, FSSysConfig.class);
+
+                    if(sopLogs.getSendType()==1){
+                        setting.setMiniprogramAppid(miniAppId);
+                    }else {
+                        int miniType = getLevel(grade);
+                        String finalAppId = getAppIdFromMiniMap(miniMap, companyId, sendMsgType, grade);
+
+                        if (StringUtil.strIsNullOrEmpty(finalAppId)) {
+                            finalAppId = articleSysConfig.getAppId();
+                        }
+
+                        setting.setMiniType(miniType);
+                        if (!StringUtil.strIsNullOrEmpty(finalAppId)) {
+                            setting.setMiniprogramAppid(finalAppId);
+                        } else {
+                            log.error("公司的小程序id为空:采用了his.config配置的固定值, sopId:" + sopLogs.getSopId());
+                            setting.setMiniprogramAppid(articleSysConfig.getAppId());
+                        }
+                    }
+
+                    if (StringUtil.strIsNullOrEmpty(setting.getMiniprogramPage()) && !StringUtil.strIsNullOrEmpty(setting.getArticleUrl())) {
+                        String articleUrlJson = "{\"articleUrl\":\"" + setting.getArticleUrl() + "\"}";
+                        setting.setMiniprogramPage("/pages_course/webArticle.html?url=" + articleUrlJson);
+                        log.info("订阅号文章类型,使用articleUrl生成miniprogramPage: {}", setting.getMiniprogramPage());
+                    }
+
+                    if (StringUtil.strIsNullOrEmpty(setting.getMiniprogramPicUrl())) {
+                        setting.setMiniprogramPicUrl("https://cos.his.cdwjyyh.com/fs/20250331/ec2b4e73be8048afbd526124a655ad56.png");
+                    }
+
+                    log.info("订阅号文章消息体构造完成 - sopId:{}, contentType:{}, miniType:{}, appid:{}, page:{}, title:{}, picUrl:{}, articleUrl:{}",
+                        logVo.getSopId(), setting.getContentType(), setting.getMiniType(), setting.getMiniprogramAppid(), setting.getMiniprogramPage(),
+                        setting.getMiniprogramTitle(), setting.getMiniprogramPicUrl(), setting.getArticleUrl());
+
                     break;
                 default:
                     break;

+ 10 - 0
fs-service/src/main/java/com/fs/qw/vo/QwSopCourseFinishTempSetting.java

@@ -137,13 +137,23 @@ public class QwSopCourseFinishTempSetting implements Serializable,Cloneable{
          * 业务id
          */
         private String businessId;
+
+        private String articleUrl;
+
         @Override
         public Setting clone() {
             try {
                 Setting clone = (Setting) super.clone();
+                clone.setContentType(this.getContentType());
                 clone.setValue(this.getValue());
                 clone.setLinkUrl(this.getLinkUrl());
                 clone.setAppLinkUrl(this.getAppLinkUrl());
+                clone.setArticleUrl(this.getArticleUrl());
+                clone.setMiniprogramAppid(this.getMiniprogramAppid());
+                clone.setMiniType(this.getMiniType());
+                clone.setMiniprogramTitle(this.getMiniprogramTitle());
+                clone.setMiniprogramPicUrl(this.getMiniprogramPicUrl());
+                clone.setMiniprogramPage(this.getMiniprogramPage());
                 return clone;
             } catch (CloneNotSupportedException e) {
                 throw new AssertionError();

+ 11 - 0
fs-service/src/main/java/com/fs/qw/vo/QwSopTempSetting.java

@@ -162,14 +162,25 @@ public class QwSopTempSetting implements Serializable{
              */
             private String businessId;
 
+            /** 订阅号文章链接(contentType=13时使用,透传给小程序端用于跳转) */
+            private String articleUrl;
+
 
             @Override
             public Setting clone() {
                 try {
                     Setting clone = (Setting) super.clone();
+                    clone.setContentType(this.getContentType());
                     clone.setValue(this.getValue());
                     clone.setLinkUrl(this.getLinkUrl());
                     clone.setAppLinkUrl(this.getAppLinkUrl());
+                    clone.setArticleUrl(this.getArticleUrl());
+                    // 小程序相关字段(contentType=4/12/13 必须)
+                    clone.setMiniprogramAppid(this.getMiniprogramAppid());
+                    clone.setMiniType(this.getMiniType());
+                    clone.setMiniprogramTitle(this.getMiniprogramTitle());
+                    clone.setMiniprogramPicUrl(this.getMiniprogramPicUrl());
+                    clone.setMiniprogramPage(this.getMiniprogramPage());
                     return clone;
                 } catch (CloneNotSupportedException e) {
                     throw new AssertionError();

+ 31 - 1
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -759,6 +759,16 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             case "11":
                                 sopLogs.setSendType(21); // 设置为群公告类型
                                 break;
+                            //订阅号文章(contentType=13)透传articleUrl和miniprogramPicUrl等字段
+                            case "13":
+                                if (StringUtil.strIsNullOrEmpty(st.getMiniprogramPage()) && !StringUtil.strIsNullOrEmpty(st.getArticleUrl())) {
+                                    String articleUrlJson = "{\"articleUrl\":\"" + st.getArticleUrl() + "\"}";
+                                    st.setMiniprogramPage("/pages_course/webArticle.html?url=" + articleUrlJson);
+                                    log.info("订阅号文章类型,使用articleUrl生成miniprogramPage: {}", st.getMiniprogramPage());
+                                }
+                                log.info("处理订阅号文章类型,保留字段: articleUrl={}, miniprogramPicUrl={}, miniprogramPage={}",
+                                        st.getArticleUrl(), st.getMiniprogramPicUrl(), st.getMiniprogramPage());
+                                break;
                             default:
                                 break;
                         }
@@ -806,7 +816,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                     QwSopCourseFinishTempSetting setting = new QwSopCourseFinishTempSetting();
 
                     List<QwSopCourseFinishTempSetting.Setting> list = JSONArray.parseArray(param.getSetting(), QwSopCourseFinishTempSetting.Setting.class);
-                    
+
                     // 检查是否有群公告类型,如果有则设置sendType=21
                     boolean hasGroupNotice = list.stream().anyMatch(st -> "11".equals(st.getContentType()));
                     if(hasGroupNotice){
@@ -990,6 +1000,17 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             case "11":
                                 sopLogs.setSendType(21); // 设置为群公告类型
                                 break;
+                            //订阅号文章(contentType=13)透传articleUrl和miniprogramPicUrl等字段
+                            case "13":
+
+                                if (StringUtil.strIsNullOrEmpty(st.getMiniprogramPage()) && !StringUtil.strIsNullOrEmpty(st.getArticleUrl())) {
+                                    String articleUrlJson = "{\"articleUrl\":\"" + st.getArticleUrl() + "\"}";
+                                    st.setMiniprogramPage("/pages_course/webArticle.html?url=" + articleUrlJson);
+                                    log.info("订阅号文章类型(群聊群发),使用articleUrl生成miniprogramPage: {}", st.getMiniprogramPage());
+                                }
+                                log.info("处理订阅号文章类型(群聊群发),保留articleUrl等字段: articleUrl={}, miniprogramPicUrl={}",
+                                        st.getArticleUrl(), st.getMiniprogramPicUrl());
+                                break;
                         }
                     }
                     setting.setSetting(list);
@@ -1937,6 +1958,15 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
                     st.setMiniprogramPage(linkByMiniApp);
                     break;
+                case "13":
+                    if (StringUtil.strIsNullOrEmpty(st.getMiniprogramPage()) && !StringUtil.strIsNullOrEmpty(st.getArticleUrl())) {
+                        String articleUrlJson = "{\"articleUrl\":\"" + st.getArticleUrl() + "\"}";
+                        st.setMiniprogramPage("/pages_course/webArticle.html?url=" + articleUrlJson);
+                        log.info("订阅号文章类型(processSetting),使用articleUrl生成miniprogramPage: {}", st.getMiniprogramPage());
+                    }
+                    log.info("处理订阅号文章类型(processSetting),保留字段: articleUrl={}, miniprogramPicUrl={}, miniprogramPage={}",
+                            st.getArticleUrl(), st.getMiniprogramPicUrl(), st.getMiniprogramPage());
+                    break;
 
                 default:
                     break;

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

@@ -158,7 +158,7 @@ openIM:
     userID: imAdmin
     url: https://web.im.fbylive.com/api
 #是否为新商户,新商户不走mpOpenId
-isNewWxMerchant: false
+isNewWxMerchant: true
 #是否使用新im
 im:
     type: NONE