Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

yys 2 месяцев назад
Родитель
Сommit
0c1785a80e

+ 0 - 8
fs-qw-api/src/main/java/com/fs/app/controller/QwController.java

@@ -146,10 +146,6 @@ public class QwController {
                              @RequestParam("nonce") String nonce,
                              @RequestParam("echostr") String echostr) {
         QwCompany qwCompany = qwCompanyMapper.selectQwCompanyByCorpId(corpId);
-        if (qwCompany == null || qwCompany.getTenantId() == null) {
-            logger.error("[QwCallback] 未找到企业配置或租户ID,corpId={}", corpId);
-            return "error";
-        }
 
         try {
             logger.info("[QwCallback] 数据回调URLServer-微信调用dataGet请求,corpId={}, tenantId={}",
@@ -170,10 +166,6 @@ public class QwController {
                              @RequestParam("nonce") String nonce,
                              @RequestParam(value = "corpid", required = false) String corpid) {
         QwCompany qwCompany = qwCompanyMapper.selectQwCompanyByCorpId(corpId);
-        if (qwCompany == null || qwCompany.getTenantId() == null) {
-            logger.error("[QwCallback] 未找到企业配置或租户ID,corpId={}", corpId);
-            return "error";
-        }
 
         try {
             logger.info("[QwCallback] 数据回调URLServer-dataPost,corpId={}, tenantId={}",

+ 3 - 73
fs-qw-api/src/main/java/com/fs/app/service/QwDataCallbackService.java

@@ -156,6 +156,7 @@ public class QwDataCallbackService {
 
         QwPermanentCodeParam qwPermanentCodeParam = new QwPermanentCodeParam();
         qwPermanentCodeParam.setAuth_code(authCode.trim());
+        // getPermanentCode 内部已处理:通过 corp_name 匹配主体、更新主库及租户库永久授权码、更新 Redis
         QwPermanentCodeResult permanentCode = qwApiService.getPermanentCode(qwPermanentCodeParam, suiteAccessToken);
         if (permanentCode == null) {
             logger.error("getPermanentCode 返回 null, corpId={}", corpId);
@@ -170,81 +171,10 @@ public class QwDataCallbackService {
             return;
         }
 
-        QwCompany map = new QwCompany();
-        map.setId(qwCompany.getId());
-        map.setPermanentCode(permanentCode.getPermanent_code());
-        int rows = qwCompanyMapper.updateQwCompany(map);
-        logger.info("已更新 qw_company 永久授权码, corpId={}, qwCompanyId={}, rows={}", corpId, qwCompany.getId(), rows);
-
-        // 同步到主库上绑定了 tenantId 的租户库对应主体
-        syncPermanentCodeToTenantDatabase(permanentCode.getPermanent_code());
-    }
-
-    /**
-     * 将主库 {@code qw_company.permanent_code} 同步到“主库绑定了 tenantId 的租户库”对应主体。
-     *
-     * <p>当同一服务商永久授权码在多个应用中相同,会触发多次回调;本方法会将最新 permanent_code 写回租户库对应 corpId 的那条记录。</p>
-     */
-    private void syncPermanentCodeToTenantDatabase(String permanentCodeValue) {
-
-        List<QwCompany> qwCompanies = qwCompanyMapper.selectQwCompanyList(new QwCompany());
-        if (qwCompanies == null || qwCompanies.isEmpty()) {
-            return;
-        }
-        for (QwCompany qwCompany : qwCompanies) {
-            Long tenantId = qwCompany.getTenantId();
-            if (tenantId == null) {
-                return;
-            }
-
-            TenantInfo tenantInfo;
-            try {
-                tenantInfo = tenantInfoMapper.selectTenantInfoById(tenantId.toString());
-            } catch (Exception e) {
-                logger.error("查询租户信息失败 tenantId={}", tenantId, e);
-                return;
-            }
-            if (tenantInfo == null) {
-                logger.warn("同步租户永久授权码失败:租户不存在 tenantId={}", tenantId);
-                return;
-            }
-
-            if (!switchToTenantDataSource(tenantInfo)) {
-                return;
-            }
-            String corpId = qwCompany.getCorpId();
-            try {
-                int tenantRows = qwCompanyMapper.updatePermanentCodeByCorpId(corpId, permanentCodeValue);
-                logger.info("已同步租户库 qw_company 永久授权码, tenantId={}, corpId={}, rows={}",
-                        tenantId, corpId, tenantRows);
-            } catch (Exception e) {
-                logger.error("同步租户库 qw_company 永久授权码失败 tenantId={}, corpId={}", tenantId, corpId, e);
-            } finally {
-                clearTenantDataSourceType();
-            }
-        }
-
+        logger.info("已通过 getPermanentCode 异步完成主体 {} 的永久授权码更新", 
+                permanentCode.getAuth_corp_info() != null ? permanentCode.getAuth_corp_info().getCorp_name() : corpId);
     }
 
-    private boolean switchToTenantDataSource(TenantInfo tenantInfo) {
-        try {
-            Class<?> mgrClass = Class.forName("com.fs.framework.datasource.TenantDataSourceManager");
-            Object manager = applicationContext.getBean(mgrClass);
-            mgrClass.getMethod("switchTenant", TenantInfo.class).invoke(manager, tenantInfo);
-            return true;
-        } catch (Exception e) {
-            logger.warn("无法切换租户数据源 tenantId={}, error={}", tenantInfo.getId(), e.toString());
-            return false;
-        }
-    }
-
-    private void clearTenantDataSourceType() {
-        try {
-            Class<?> holderClass = Class.forName("com.fs.framework.datasource.DynamicDataSourceContextHolder");
-            holderClass.getMethod("clearDataSourceType").invoke(null);
-        } catch (Exception ignore) {
-        }
-    }
     @Autowired
     private TenantDataSourceManager tenantDataSourceManager;
 

+ 3 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwCompanyMapper.java

@@ -73,6 +73,9 @@ public interface QwCompanyMapper
     @Select("SELECT * from qw_company where corp_id=#{corpId} limit 1")
     QwCompany selectQwCompanyByCorpId(String corpId);
 
+    @Select("SELECT * from qw_company where corp_name=#{corpName} limit 1")
+    QwCompany selectQwCompanyByCorpName(String corpName);
+
     /**
      * 按 corpId 更新永久授权码(用于租户库同步)。
      *

+ 54 - 1
fs-service/src/main/java/com/fs/qwApi/service/impl/QwApiServiceImpl.java

@@ -10,6 +10,9 @@ import com.fs.common.utils.StringUtils;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.param.QwUpdateContactWayParam;
 import com.fs.qw.service.IQwCompanyService;
+import com.fs.common.config.RedisTenantContext;
+import com.fs.common.utils.spring.SpringUtils;
+import com.fs.qw.mapper.QwCompanyMapper;
 import com.fs.qwApi.Result.*;
 import com.fs.qwApi.config.QwApiConfig;
 import com.fs.qwApi.domain.*;
@@ -36,6 +39,7 @@ import org.springframework.stereotype.Service;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Method;
 import java.net.URI;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
@@ -58,6 +62,9 @@ public class QwApiServiceImpl implements QwApiService {
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private QwCompanyMapper qwCompanyMapper;
+
     private static final OkHttpClient client = new OkHttpClient.Builder()
             .connectTimeout(30, TimeUnit.SECONDS)
             .readTimeout(30, TimeUnit.SECONDS)
@@ -1071,10 +1078,56 @@ public class QwApiServiceImpl implements QwApiService {
             HttpResponse response = httpClient.execute(httpPost);
             String reJson = EntityUtils.toString(response.getEntity());
             QwPermanentCodeResult qwPermanentCodeResult = JSON.parseObject(reJson, QwPermanentCodeResult.class);
+
+            if (qwPermanentCodeResult != null && qwPermanentCodeResult.getErrcode() == 0 && qwPermanentCodeResult.getAuth_corp_info() != null) {
+                String corpName = qwPermanentCodeResult.getAuth_corp_info().getCorp_name();
+//                String authCorpId = qwPermanentCodeResult.getAuth_corp_info().getCorpid();
+                String permanentCode = qwPermanentCodeResult.getPermanent_code();
+
+                // 1. 根据 corpName 匹配主库主体
+                QwCompany masterCompany = qwCompanyMapper.selectQwCompanyByCorpName(corpName);
+                if (masterCompany != null) {
+                    String corpId = masterCompany.getCorpId();
+                    masterCompany.setPermanentCode(permanentCode);
+                    qwCompanyMapper.updateQwCompany(masterCompany);
+
+                    // 2. 更新 Redis 缓存 (主库系统缓存)
+                    redisCache.setCacheObject("qwCompany:permanentCode" + corpId, permanentCode, 1, TimeUnit.HOURS);
+
+                    // 3. 同步到租户库及租户 Redis 缓存
+                    Long tenantId = masterCompany.getTenantId();
+                    if (tenantId != null) {
+                        try {
+                            // 切换 Redis 租户上下文
+                            RedisTenantContext.setTenantId(tenantId);
+                            redisCache.setCacheObject("qwCompany:permanentCode" + corpId, permanentCode, 1, TimeUnit.HOURS);
+
+                            // 通过反射切换租户数据库,避免循环依赖
+                            Object manager = SpringUtils.getBean("tenantDataSourceManager");
+                            Method method = manager.getClass().getMethod("ensureSwitchByTenantId", Long.class);
+                            method.invoke(manager, tenantId);
+
+                            qwCompanyMapper.updatePermanentCodeByCorpId(corpId, permanentCode);
+                            log.info("getPermanentCode: 已同步租户库及租户Redis永久授权码, tenantId={}, corpId={}", tenantId, corpId);
+                        } catch (Exception e) {
+                            log.error("getPermanentCode: 同步租户库永久授权码失败 tenantId={}", corpId, e);
+                        } finally {
+                            try {
+                                RedisTenantContext.clear();
+                                Object manager = SpringUtils.getBean("tenantDataSourceManager");
+                                Method method = manager.getClass().getMethod("clear");
+                                method.invoke(manager);
+                            } catch (Exception ignore) {}
+                        }
+                    }
+                } else {
+                    log.warn("getPermanentCode: 未在主库找到名称为 {} 的企微主体,跳过数据库更新", corpName);
+                }
+            }
             return qwPermanentCodeResult;
 
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("getPermanentCode error", e);
         }
         return null;
     }