Pārlūkot izejas kodu

复制链接切换小程序

wangxy 1 nedēļu atpakaļ
vecāks
revīzija
cf88d39d17

+ 5 - 4
fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java

@@ -338,16 +338,17 @@ public class FsCompanyController extends BaseController {
         if (CollectionUtils.isEmpty(company.getIds())) {
             return R.error("请选择需要修改的企业ID");
         }
-        if (isNNull(company.getCourseMiniAppId())&&isListNull(company.getMiniAppMaster()) && isListNull(company.getMiniAppServer())) {
+        if (isListNull(company.getMiniAppMaster())) {
             return R.error("请选择要修改的小程序");
         } else {
             for (Long id : company.getIds()) {
                 Company c = companyService.selectCompanyById(id);
                 c.setMoney(null);
                 c.setUpdateMiniApp(true);
-                if (company.getCourseMiniAppId()!= null&&!company.getCourseMiniAppId().isEmpty()) c.setCourseMiniAppId(company.getCourseMiniAppId());
-                if (company.getMiniAppMaster()!=null&&!company.getMiniAppMaster().isEmpty()) c.setMiniAppMaster(company.getMiniAppMaster());
-                if (company.getMiniAppServer()!=null&&!company.getMiniAppServer().isEmpty()) c.setMiniAppServer(company.getMiniAppServer());
+                if (company.getCourseMiniAppId() != null && !company.getCourseMiniAppId().isEmpty())
+                    c.setCourseMiniAppId(company.getCourseMiniAppId());
+                if (company.getMiniAppMaster() != null && !company.getMiniAppMaster().isEmpty())
+                    c.setMiniAppMaster(company.getMiniAppMaster());
                 companyService.updateCompany(c);
             }
             return R.ok();

+ 4 - 2
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -289,8 +289,6 @@ public class FsUserCourseVideoController extends AppBaseController {
         String appid;
         if (CollectionUtils.isNotEmpty(company.getMiniAppMaster())){
             appid = company.getMiniAppMaster().get(0);
-        }else if (CollectionUtils.isNotEmpty(company.getMiniAppServer())){
-            appid = company.getMiniAppServer().get(0);
         }else {
             return ResponseResult.fail(500,"请在后台配置主备小程序!");
         }
@@ -400,6 +398,10 @@ public class FsUserCourseVideoController extends AppBaseController {
         List<CompanyMiniapp> miniApps = companyMiniAppService.selectCompanyMiniappList(params);
         if (miniApps != null) {
             appId = miniApps.stream().min(Comparator.comparing(CompanyMiniapp::getSortNum)).map(CompanyMiniapp::getAppId).orElse(appId);
+            if ( StringUtils.isNotBlank(appId)) {
+                String[] appIds = appId.split(",");
+                appId = appIds[0].trim();
+            }
         }
 
         return R.ok().put("data", appId);

+ 13 - 11
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -102,15 +102,13 @@ public class IpadSendServer {
                                 // 获取用户的创建时间
                                 LocalDateTime createTime = DateUtil.dateToLocalDateTime(fsUser.getCreateTime());
                                 log.info("ID:{}, qwUserId:{},externalId:{},已绑定小程序,判断时间:{}", vo.getId(), vo.getQwUserId(), vo.getExId(), createTime);
-                                // 这个时间是写死的,目前判断的芳华封禁的时间,可以更具项目调整
-                                LocalDateTime lastTime = LocalDateTime.of(2025, 11, 6, 23, 59, 59);
-                                // 判断客户创建时间是在这个之前还是之后
-                                int listIndex = createTime.isAfter(lastTime) ? 1 : 0 ;
-                                // 获取公司里面的主备小程序,根据用户创建时间来发送主备,如果创建时间大于上看的时间就发送备用小程序,如果小于就发送主要小程序
-                                List<CompanyMiniapp> collect2 = list.stream().filter(e -> e.getType().equals(listIndex)).collect(Collectors.toList());
-                                // 判断是否获取到了配置
-                                if(!collect2.isEmpty() && collect2.get(0) != null && StringUtils.isNotEmpty(collect2.get(0).getAppId())){
-                                    appid = collect2.get(0).getAppId();
+                                // 获取公司绑定的小程序(appId为逗号分隔的多个值)
+                                if(!list.isEmpty() && list.get(0) != null && StringUtils.isNotEmpty(list.get(0).getAppId())){
+                                    String appIdStr = list.get(0).getAppId();
+                                    String[] appIds = appIdStr.split(",");
+                                    if(appIds.length > 0){
+                                        appid = appIds[0].trim();
+                                    }
                                     log.info("ID:{}, qwUserId:{},externalId:{},发送小程序:{}", vo.getId(), vo.getQwUserId(), vo.getExId(), appid);
                                 }
                             }
@@ -127,9 +125,13 @@ public class IpadSendServer {
         }
         FsCoursePlaySourceConfig courseMaConfig = miniMap.get(appid);
         if(courseMaConfig == null){
-            List<CompanyMiniapp> list = companyMiniappService.list(new QueryWrapper<CompanyMiniapp>().eq("company_id", companyId).eq("type", 1));
+            List<CompanyMiniapp> list = companyMiniappService.list(new QueryWrapper<CompanyMiniapp>().eq("company_id", companyId));
             if(!list.isEmpty() && list.get(0) != null && StringUtils.isNotEmpty(list.get(0).getAppId())){
-                courseMaConfig = miniMap.get(list.get(0).getAppId());
+                String appIdStr = list.get(0).getAppId();
+                String[] appIds = appIdStr.split(",");
+                if(appIds.length > 0){
+                    courseMaConfig = miniMap.get(appIds[0].trim());
+                }
             }
         }
         if(courseMaConfig == null){

+ 0 - 2
fs-service/src/main/java/com/fs/company/domain/Company.java

@@ -123,8 +123,6 @@ public class Company extends BaseEntity
     private String groupName;
     @TableField(exist = false)
     private List<String> miniAppMaster;
-    @TableField(exist = false)
-    private List<String> miniAppServer;
 
     @TableField(exist = false)
     private boolean updateMiniApp;

+ 1 - 2
fs-service/src/main/java/com/fs/company/domain/CompanyMiniapp.java

@@ -25,7 +25,7 @@ public class CompanyMiniapp extends BaseEntity{
     @Excel(name = "客服公司ID")
     private Long companyId;
 
-    /** 小程序appid */
+    /** 小程序appid(多个逗号分隔) */
     @Excel(name = "小程序appid")
     private String appId;
 
@@ -37,5 +37,4 @@ public class CompanyMiniapp extends BaseEntity{
     @Excel(name = "排序")
     private Integer sortNum;
 
-
 }

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyMiniappMapper.java

@@ -65,4 +65,6 @@ public interface CompanyMiniappMapper extends BaseMapper<CompanyMiniapp>{
      * 获取公司配置小程序名称
      */
     String getFirstWatchMiniAppNameByCompanyId(@Param("companyId") Long companyId);
+
+
 }

+ 6 - 1
fs-service/src/main/java/com/fs/company/service/ICompanyMiniappService.java

@@ -61,7 +61,12 @@ public interface ICompanyMiniappService extends IService<CompanyMiniapp>{
      */
     int deleteCompanyMiniappById(Long id);
 
-    void insertBatch(List<String> appIds, Long companyId, Integer type);
+    /**
+     * 保存公司小程序配置(appId为逗号分隔的多个值)
+     * @param appIds 多个appId,逗号分隔
+     * @param companyId 公司ID
+     */
+    void saveAppIds(String appIds, Long companyId);
 
     void removeByCompanyId(Long companyId);
 

+ 20 - 18
fs-service/src/main/java/com/fs/company/service/impl/CompanyMiniappServiceImpl.java

@@ -6,18 +6,16 @@ import com.fs.common.annotation.Log;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.PubFun;
+import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.mapper.CompanyMiniappMapper;
 import com.fs.company.service.ICompanyMiniappService;
 import com.fs.company.vo.CompanyVO;
 import org.springframework.stereotype.Service;
 
-import java.util.Comparator;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.BiFunction;
 import java.util.stream.Collectors;
 
 /**
@@ -29,9 +27,6 @@ import java.util.stream.Collectors;
 @Service
 public class CompanyMiniappServiceImpl extends ServiceImpl<CompanyMiniappMapper, CompanyMiniapp> implements ICompanyMiniappService {
 
-    public static BiFunction<Integer, List<CompanyMiniapp>, List<String>> GET_MINI_APP_STR = (type, list) -> list.stream().filter(m -> Objects.equals(m.getType(), type)).sorted(Comparator.comparing(CompanyMiniapp::getSortNum)).map(CompanyMiniapp::getAppId).collect(Collectors.toList());
-
-
     /**
      * 查询客服公司小程序
      * 
@@ -106,18 +101,22 @@ public class CompanyMiniappServiceImpl extends ServiceImpl<CompanyMiniappMapper,
         return baseMapper.deleteCompanyMiniappById(id);
     }
 
+    /**
+     * 保存公司小程序配置(appId为逗号分隔的多个值)
+     * @param appIds 多个appId,逗号分隔
+     * @param companyId 公司ID
+     */
     @Override
-    public void insertBatch(List<String> appIds, Long companyId, Integer type) {
-        AtomicInteger i = new AtomicInteger();
-        List<CompanyMiniapp> list = appIds.stream().map(e -> {
+    public void saveAppIds(String appIds, Long companyId) {
+        removeByCompanyId(companyId);
+        if (StringUtils.isNotBlank(appIds)) {
             CompanyMiniapp miniapp = new CompanyMiniapp();
             miniapp.setCompanyId(companyId);
-            miniapp.setAppId(e);
-            miniapp.setType(type);
-            miniapp.setSortNum(i.getAndIncrement());
-            return miniapp;
-        }).collect(Collectors.toList());
-        super.saveBatch(list);
+            miniapp.setAppId(appIds);
+            miniapp.setSortNum(0);
+            miniapp.setCreateTime(DateUtils.getNowDate());
+            save(miniapp);
+        }
     }
 
     @Override
@@ -132,8 +131,11 @@ public class CompanyMiniappServiceImpl extends ServiceImpl<CompanyMiniappMapper,
         Map<Long, List<CompanyMiniapp>> miniAppMap = PubFun.listToMapByGroupList(miniAppList, CompanyMiniapp::getCompanyId);
         companyVOS.stream().filter(e -> miniAppMap.containsKey(e.getCompanyId())).forEach(e -> {
             List<CompanyMiniapp> list = miniAppMap.get(e.getCompanyId());
-            e.setMiniAppMaster(GET_MINI_APP_STR.apply(0, list));
-            e.setMiniAppServer(GET_MINI_APP_STR.apply(1, list));
+            if (!list.isEmpty()) {
+                String appIdStr = list.get(0).getAppId();
+                List<String> appIdList = Arrays.asList(appIdStr.split(","));
+                e.setMiniAppMaster(appIdList);
+            }
         });
     }
 

+ 9 - 11
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -55,8 +55,6 @@ import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionTemplate;
 
-import static com.fs.company.service.impl.CompanyMiniappServiceImpl.GET_MINI_APP_STR;
-
 /**
  * 企业Service业务层处理
  *
@@ -230,8 +228,11 @@ public class CompanyServiceImpl implements ICompanyService
         Company company = companyMapper.selectCompanyById(companyId);
         if(company != null) {
             List<CompanyMiniapp> miniApp = companyMiniappService.getMiniAppListByCompanyList(Collections.singletonList(company.getCompanyId()));
-            company.setMiniAppMaster(GET_MINI_APP_STR.apply(0, miniApp));
-            company.setMiniAppServer(GET_MINI_APP_STR.apply(1, miniApp));
+            if (!miniApp.isEmpty()) {
+                String appIdStr = miniApp.get(0).getAppId();
+                List<String> appIdList = Arrays.asList(appIdStr.split(","));
+                company.setMiniAppMaster(appIdList);
+            }
         }
         return company;
     }
@@ -393,16 +394,13 @@ public class CompanyServiceImpl implements ICompanyService
     }
     // 绑定小程序
     public void bindMiniApp(Company company){
-        companyMiniappService.removeByCompanyId(company.getCompanyId());
         List<String> miniAppMaster = company.getMiniAppMaster();
         if(miniAppMaster != null && !miniAppMaster.isEmpty()){
-            companyMiniappService.insertBatch(miniAppMaster, company.getCompanyId(), 0);
-        }
-        List<String> miniAppServer = company.getMiniAppServer();
-        if(miniAppServer != null && !miniAppServer.isEmpty()){
-            companyMiniappService.insertBatch(miniAppServer, company.getCompanyId(), 1);
+            String appIds = String.join(",", miniAppMaster);
+            companyMiniappService.saveAppIds(appIds, company.getCompanyId());
+        } else {
+            companyMiniappService.removeByCompanyId(company.getCompanyId());
         }
-
     }
 
     /**

+ 0 - 1
fs-service/src/main/java/com/fs/company/vo/CompanyVO.java

@@ -90,7 +90,6 @@ public class CompanyVO implements Serializable
 
     private String restartTime;
     private List<String> miniAppMaster;
-    private List<String> miniAppServer;
     /** 已占用 */
     private Integer usedNum;
     /** 所属部门id */

+ 4 - 3
fs-service/src/main/java/com/fs/course/service/IFsCourseLinkService.java

@@ -88,10 +88,11 @@ public interface IFsCourseLinkService
 
     /**
      * 获取跳转微信小程序的链接地址
-     * @param linkStr
-     * @return
+     * @param linkStr 链接字符串
+     * @param appId 小程序appId(起始appId,可为空)
+     * @return 小程序链接
      */
-    String getGotoWxAppLink(String linkStr,String appid);
+    String getGotoWxAppLink(String linkStr, String appId);
 
     R getWxaCodeGenerateScheme(String linkStr,String appId);
 

+ 191 - 44
fs-service/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java

@@ -11,7 +11,11 @@ import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.PubFun;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.company.service.ICompanyMiniappService;
+import com.fs.company.service.ICompanyService;
 import com.fs.config.cloud.CloudHostProper;
 import com.fs.core.config.WxMaConfig;
 import com.fs.core.config.WxMaConfiguration;
@@ -70,6 +74,8 @@ import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.*;
 
 import static com.fs.course.utils.LinkUtil.generateRandomStringWithLock;
@@ -125,6 +131,12 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
     @Autowired
     private SysConfigMapper sysConfigMapper;
 
+    @Autowired
+    private ICompanyMiniappService companyMiniappService;
+
+    @Autowired
+    private ICompanyService companyService;
+
     private static String TOKEN_VALID_CODE = "40001";
 
     private volatile Integer version = 0;
@@ -765,18 +777,129 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
 
     /**
      * 获取跳转微信小程序的链接地址
-     * @param linkStr
-     * @return
+     * 逻辑:
+     * 1. 从linkStr解析companyId
+     * 2. 通过companyId获取公司绑定的小程序appId列表
+     * 3. 如果微信API调用失败,自动切换到下一个appId重试
+     * @param linkStr 链接字符串
+     * @param appId 小程序appId(起始appId,可为空)
+     * @return 小程序链接
      */
     @Override
-    public String getGotoWxAppLink(String linkStr,String appId) {
+    public String getGotoWxAppLink(String linkStr, String appId) {
+        Long companyId = parseCompanyIdFromLink(linkStr);
+        
+        List<String> appIdList = getAppIdListByCompanyId(companyId);
+        
+        if (appIdList == null || appIdList.isEmpty()) {
+            return "未配置小程序,获取失败";
+        }
+        
+        int currentIndex = 0;
+        if (StringUtils.isNotBlank(appId) && appIdList.contains(appId)) {
+            currentIndex = appIdList.indexOf(appId);
+        }
+        
+        return generateWxAppLinkWithRetry(linkStr, appIdList, currentIndex);
+    }
+
+    /**
+     * 从链接字符串中解析companyId
+     * @param linkStr 链接字符串,格式如:/pages_course/videovip?course={"companyId":123,...}
+     * @return companyId
+     */
+    private Long parseCompanyIdFromLink(String linkStr) {
+        try {
+            String decodedStr = URLDecoder.decode(linkStr, StandardCharsets.UTF_8.toString());
+            log.info("解析linkStr,解码后:{}", decodedStr);
+            
+            int companyIdIndex = decodedStr.indexOf("companyId");
+            if (companyIdIndex == -1) {
+                log.warn("linkStr中未找到companyId参数");
+                return null;
+            }
+            
+            int valueStart = decodedStr.indexOf(":", companyIdIndex);
+            if (valueStart == -1) {
+                return null;
+            }
+            valueStart++;
+            
+            while (valueStart < decodedStr.length() && 
+                   (decodedStr.charAt(valueStart) == ' ' || decodedStr.charAt(valueStart) == '"')) {
+                valueStart++;
+            }
+            
+            StringBuilder numStr = new StringBuilder();
+            while (valueStart < decodedStr.length() && Character.isDigit(decodedStr.charAt(valueStart))) {
+                numStr.append(decodedStr.charAt(valueStart));
+                valueStart++;
+            }
+            
+            if (numStr.length() > 0) {
+                return Long.parseLong(numStr.toString());
+            }
+        } catch (Exception e) {
+            log.error("解析companyId失败", e);
+        }
+        return null;
+    }
+
+    /**
+     * 根据companyId获取小程序appId列表
+     * @param companyId 公司ID
+     * @return appId列表(从company_miniapp表的appId字段解析,逗号分隔)
+     */
+    private List<String> getAppIdListByCompanyId(Long companyId) {
+        if (companyId == null) {
+            return Collections.emptyList();
+        }
+
+        List<CompanyMiniapp> miniappList = companyMiniappService.list(
+            new QueryWrapper<CompanyMiniapp>().eq("company_id", companyId)
+        );
+        
+        if (miniappList == null || miniappList.isEmpty()) {
+            log.warn("公司{}未配置小程序appId", companyId);
+            return Collections.emptyList();
+        }
+        
+        String appIdStr = miniappList.get(0).getAppId();
+        if (StringUtils.isEmpty(appIdStr)) {
+            log.warn("公司{}未配置小程序appId", companyId);
+            return Collections.emptyList();
+        }
+        
+        String[] appIdArray = appIdStr.split(",");
+        List<String> appIdList = new ArrayList<>();
+        for (String appId : appIdArray) {
+            String trimmed = appId.trim();
+            if (StringUtils.isNotBlank(trimmed)) {
+                appIdList.add(trimmed);
+            }
+        }
+        
+        log.info("公司{}绑定的小程序列表:{}", companyId, appIdList);
+        return appIdList;
+    }
+
+    private String generateWxAppLinkWithRetry(String linkStr, List<String> appIdList, int currentIndex) {
+        if (currentIndex >= appIdList.size()) {
+            log.error("所有appId都已尝试失败");
+            return "所有小程序均调用失败,获取失败";
+        }
+        
+        String currentAppId = appIdList.get(currentIndex);
+        log.info("尝试使用appId[{}]:{}", currentIndex, currentAppId);
+        
         CloseableHttpClient client = null;
         try {
             client = HttpClients.createDefault();
             int queryIndex = linkStr.indexOf("?");
             if (queryIndex == -1 || queryIndex == linkStr.length() - 1) {
-                return "链接格式错误,缺少参数";
+                return "页面链接错误,获取失败";
             }
+            
             String pageUrl = linkStr.substring(0, queryIndex);
             String queryString = linkStr.substring(queryIndex + 1);
             if (pageUrl.startsWith("/")) {
@@ -802,54 +925,78 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
                 }
             }
             String query = encodedQuery.toString();
-//                String json = configService.selectConfigByKey("course.config");
-//                CourseConfig config = JSON.parseObject(json, CourseConfig.class);
-//                String miniprogramAppid = config.getMiniprogramAppid();
-//                if (StringUtils.isBlank(miniprogramAppid)) {
-//                    return "未配置点播小程序id";
-//                }
-                //获取微信token
-                final WxMaService wxService = WxMaConfiguration.getMaService(appId);
-                String token = wxService.getAccessToken();
-                log.info("小程序TOKEN值-------->刷新前TOKEN:{}", token);
-                HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + token);
-                JSONObject bodyObj = new JSONObject();
-                bodyObj.put("path", pageUrl);
-                bodyObj.put("query", query);
-                log.info("微信小程序请求参数打印:{}", bodyObj.toJSONString());
-                StringEntity entity = new StringEntity(bodyObj.toJSONString(),"UTF-8");
-                httpPost.setEntity(entity);
-                httpPost.setHeader("Content-type", "application/json");
-                httpPost.setHeader("cache-control","max-age=0");
-                HttpEntity response = client.execute(httpPost).getEntity();
-                String responseString = EntityUtils.toString(response);
-                log.info("微信小程序接口响应数据:{}", responseString);
-                JSONObject jsonObject = JSONObject.parseObject(responseString);
-
-                if(TOKEN_VALID_CODE.equals(jsonObject.getString("errcode"))){
-                    Integer curVersion =  Integer.valueOf(version);
-                    synchronized (TOKEN_VALID_CODE){
-                        if(curVersion.equals(version)){
-                            log.info("小程序TOKEN:40001进入强制刷新-------->刷新前TOKEN:{}", token);
-                            wxService.getAccessToken(true);
-                            version = version.equals(Integer.MAX_VALUE) ? 0 : curVersion + 1;
-                            log.info("小程序TOKEN:40001进入强制刷新-------->刷新后TOKEN:{}", wxService.getAccessToken());
-                        }
-                        return getGotoWxAppLink(linkStr,appId);
+            
+            final WxMaService wxService = WxMaConfiguration.getMaService(currentAppId);
+            String token = wxService.getAccessToken();
+            log.info("小程序TOKEN值-------->刷新前TOKEN:{}", token);
+            HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + token);
+            JSONObject bodyObj = new JSONObject();
+            bodyObj.put("path", pageUrl);
+            bodyObj.put("query", query);
+            log.info("微信小程序请求参数打印:{}", bodyObj.toJSONString());
+            StringEntity entity = new StringEntity(bodyObj.toJSONString(),"UTF-8");
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-type", "application/json");
+            httpPost.setHeader("cache-control","max-age=0");
+            HttpEntity response = client.execute(httpPost).getEntity();
+            String responseString = EntityUtils.toString(response);
+            log.info("微信小程序接口响应数据:{}", responseString);
+            JSONObject jsonObject = JSONObject.parseObject(responseString);
+
+            if(TOKEN_VALID_CODE.equals(jsonObject.getString("errcode"))){
+                Integer curVersion = Integer.valueOf(version);
+                synchronized (TOKEN_VALID_CODE){
+                    if(curVersion.equals(version)){
+                        log.info("小程序TOKEN:40001进入强制刷新-------->刷新前TOKEN:{}", token);
+                        wxService.getAccessToken(true);
+                        version = version.equals(Integer.MAX_VALUE) ? 0 : curVersion + 1;
+                        log.info("小程序TOKEN:40001进入强制刷新-------->刷新后TOKEN:{}", wxService.getAccessToken());
                     }
+                    return generateWxAppLinkWithRetry(linkStr, appIdList, currentIndex);
                 }
+            }
 
-                if(null != jsonObject && !jsonObject.isEmpty() && jsonObject.containsKey("url_link")){
-                    return jsonObject.getString("url_link");
+            if(null != jsonObject && !jsonObject.isEmpty() && jsonObject.containsKey("url_link")){
+                return jsonObject.getString("url_link");
+            }
+            
+            if(jsonObject != null && jsonObject.containsKey("errcode")) {
+                Integer errcode = jsonObject.getInteger("errcode");
+                String errmsg = jsonObject.getString("errmsg");
+                log.error("微信小程序生成链接失败,appId:{},错误码:{},错误信息:{}", currentAppId, errcode, errmsg);
+                
+                if (currentIndex + 1 < appIdList.size()) {
+                    log.info("切换到下一个appId重试,下一个索引:{}", currentIndex + 1);
+                    return generateWxAppLinkWithRetry(linkStr, appIdList, currentIndex + 1);
                 }
-                return "页面链接错误,获取失败";
+                
+                return "微信错误:" + errcode + "|" + errmsg;
+            }
+
+            log.error("微信小程序响应格式异常");
+            return "微信小程序响应格式异常";
 
         } catch (WxErrorException e) {
-            throw new RuntimeException(e);
+            log.error("微信API调用异常,appId:{}", currentAppId, e);
+            if (currentIndex + 1 < appIdList.size()) {
+                log.info("异常切换到下一个appId重试,下一个索引:{}", currentIndex + 1);
+                return generateWxAppLinkWithRetry(linkStr, appIdList, currentIndex + 1);
+            }
+            return "微信API异常";
         } catch (ClientProtocolException e) {
-            throw new RuntimeException(e);
+            log.error("HTTP协议错误", e);
+            return "网络请求失败";
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            log.error("IO异常", e);
+            return "网络连接失败";
+        } finally {
+            if (client != null) {
+                try {
+                    client.close();
+                } catch (IOException e) {
+                    log.error("关闭HttpClient失败", e);
+                }
+            }
         }
     }
 

+ 28 - 40
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -488,7 +488,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
         // 查询公司关联小程序数据
         List<CompanyMiniapp> miniList = companyMiniappService.list(new QueryWrapper<CompanyMiniapp>().orderByAsc("sort_num"));
 
-        Map<Long, Map<Integer, List<CompanyMiniapp>>> miniMap = miniList.stream().collect(Collectors.groupingBy(CompanyMiniapp::getCompanyId, Collectors.groupingBy(CompanyMiniapp::getType)));
+        Map<Long, CompanyMiniapp> miniMap = miniList.stream().collect(Collectors.toMap(CompanyMiniapp::getCompanyId, m -> m, (a, b) -> a));
         QwCompany qwCompany = iQwCompanyService.getQwCompanyByRedis(param.getCorpId());
         if (qwCompany == null ) {
             return  R.error().put("msg","企业不存在,请联系管理员");
@@ -634,15 +634,12 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
                                 int listIndex = 1;
                                 if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
-                                    Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(qwUser.getCompanyId());
-                                    if (integerListMap != null) {
-                                        List<CompanyMiniapp> miniapps = integerListMap.get(listIndex);
-
-                                        if (miniapps != null && !miniapps.isEmpty()) {
-                                            CompanyMiniapp companyMiniapp = miniapps.get(0);
-                                            if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
-                                                miniAppId = companyMiniapp.getAppId();
-                                            }
+                                    CompanyMiniapp companyMiniapp = miniMap.get(qwUser.getCompanyId());
+                                    if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
+                                        String appIdStr = companyMiniapp.getAppId();
+                                        String[] appIds = appIdStr.split(",");
+                                        if (appIds.length > 0) {
+                                            miniAppId = appIds[0].trim();
                                         }
                                     }
                                 }
@@ -776,15 +773,12 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
                                 int listIndex = 1;
                                 if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
-                                    Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(qwUser.getCompanyId());
-                                    if (integerListMap != null) {
-                                        List<CompanyMiniapp> miniapps = integerListMap.get(listIndex);
-
-                                        if (miniapps != null && !miniapps.isEmpty()) {
-                                            CompanyMiniapp companyMiniapp = miniapps.get(0);
-                                            if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
-                                                miniAppId = companyMiniapp.getAppId();
-                                            }
+                                    CompanyMiniapp companyMiniapp = miniMap.get(qwUser.getCompanyId());
+                                    if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
+                                        String appIdStr = companyMiniapp.getAppId();
+                                        String[] appIds = appIdStr.split(",");
+                                        if (appIds.length > 0) {
+                                            miniAppId = appIds[0].trim();
                                         }
                                     }
                                 }
@@ -953,15 +947,12 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             int effectiveGrade = (item.getGrade() == null) ? 5 : item.getGrade();
                             int listIndex = (effectiveGrade == 1 || effectiveGrade == 2) ? 0 : 1;
                             if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
-                                Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
-                                if (integerListMap != null) {
-                                    List<CompanyMiniapp> miniapps = integerListMap.get(listIndex);
-
-                                    if (miniapps != null && !miniapps.isEmpty()) {
-                                        CompanyMiniapp companyMiniapp = miniapps.get(0);
-                                        if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
-                                            miniAppId = companyMiniapp.getAppId();
-                                        }
+                                CompanyMiniapp companyMiniapp = miniMap.get(Long.valueOf(companyId));
+                                if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
+                                    String appIdStr = companyMiniapp.getAppId();
+                                    String[] appIds = appIdStr.split(",");
+                                    if (appIds.length > 0) {
+                                        miniAppId = appIds[0].trim();
                                     }
                                 }
                             }
@@ -1156,7 +1147,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
 
         // 查询公司关联小程序数据
         List<CompanyMiniapp> miniList = companyMiniappService.list(new QueryWrapper<CompanyMiniapp>().orderByAsc("sort_num"));
-        Map<Long, Map<Integer, List<CompanyMiniapp>>> miniMap = miniList.stream().collect(Collectors.groupingBy(CompanyMiniapp::getCompanyId, Collectors.groupingBy(CompanyMiniapp::getType)));
+        Map<Long, CompanyMiniapp> miniMap = miniList.stream().collect(Collectors.toMap(CompanyMiniapp::getCompanyId, m -> m, (a, b) -> a));
 
 
         List<Company> companies = companyMapper.selectCompanyAllList();
@@ -1225,7 +1216,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
     private List<QwSopLogs> processInsertSopUserLogsInfo(List<SopUserLogsInfo> sopUserLogsInfos,QwUser qwUser,
                                                          SendUserLogsInfoMsgParam param,List<FastGptChatReplaceWords> words,
                                                          CourseConfig config,QwCompany qwCompany,int finalSort,int finalSendType,
-                                                         Map<Long, Map<Integer, List<CompanyMiniapp>>> miniMap,List<Company> companies ){
+                                                         Map<Long, CompanyMiniapp> miniMap,List<Company> companies ){
 
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
@@ -1343,7 +1334,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                                                       SendUserLogsInfoMsgParam param,List<FastGptChatReplaceWords> words,
                                                                       CourseConfig config,QwCompany qwCompany,String companyUserId, String companyId,
                                                                       QwExternalContact contact,Date dataTime,String domainName,
-                                                                      Map<Long, Map<Integer, List<CompanyMiniapp>>> miniMap,
+                                                                      Map<Long, CompanyMiniapp> miniMap,
                                                                       List<Company> companies ){
         List<QwSopCourseFinishTempSetting.Setting> list = JSONArray.parseArray(param.getSetting(),QwSopCourseFinishTempSetting.Setting.class);
 
@@ -1416,15 +1407,12 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                     int effectiveGrade = (item.getGrade() == null) ? 5 : item.getGrade();
                     int listIndex = (effectiveGrade == 1 || effectiveGrade == 2) ? 0 : 1;
                     if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
-                        Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
-                        if (integerListMap != null) {
-                            List<CompanyMiniapp> miniapps = integerListMap.get(listIndex);
-
-                            if (miniapps != null && !miniapps.isEmpty()) {
-                                CompanyMiniapp companyMiniapp = miniapps.get(0);
-                                if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
-                                    miniAppId = companyMiniapp.getAppId();
-                                }
+                        CompanyMiniapp companyMiniapp = miniMap.get(Long.valueOf(companyId));
+                        if (companyMiniapp != null && !StringUtil.strIsNullOrEmpty(companyMiniapp.getAppId())) {
+                            String appIdStr = companyMiniapp.getAppId();
+                            String[] appIds = appIdStr.split(",");
+                            if (appIds.length > 0) {
+                                miniAppId = appIds[0].trim();
                             }
                         }
                     }

+ 2 - 2
fs-service/src/main/resources/mapper/CompanyMiniappMapper.xml

@@ -39,9 +39,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="getFirstWatchMiniAppNameByCompanyId" resultType="java.lang.String">
         select fcpsc.name
         from company_miniapp cm
-        inner join fs_course_play_source_config fcpsc on cm.app_id = fcpsc.appid
+        inner join fs_course_play_source_config fcpsc on FIND_IN_SET(fcpsc.appid, cm.app_id) > 0
         where cm.company_id = #{companyId}
-        order by cm.type desc
+        order by cm.sort_num asc
         limit 1
     </select>