Ver Fonte

1、去配置的统一调整

yys há 1 mês atrás
pai
commit
739d8dd791
25 ficheiros alterados com 119 adições e 156 exclusões
  1. 2 6
      fs-admin/src/main/java/com/fs/company/controller/CompanyUserAllController.java
  2. 2 2
      fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java
  3. 3 3
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java
  4. 2 2
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  5. 1 4
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  6. 3 3
      fs-admin/src/main/java/com/fs/live/controller/LiveAfterSalesController.java
  7. 2 5
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  8. 1 4
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java
  9. 5 6
      fs-company/src/main/java/com/fs/company/controller/course/qw/FsQwCourseWatchLogController.java
  10. 3 3
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java
  11. 2 8
      fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java
  12. 17 8
      fs-service/src/main/java/com/fs/config/cloud/CloudHostProper.java
  13. 2 27
      fs-service/src/main/java/com/fs/config/mq/RocketmqConfig.java
  14. 32 3
      fs-service/src/main/java/com/fs/config/saas/ProjectConfig.java
  15. 2 9
      fs-service/src/main/java/com/fs/config/tencent/TencentProperties.java
  16. 2 9
      fs-service/src/main/java/com/fs/core/config/WxMpProperties.java
  17. 2 9
      fs-service/src/main/java/com/fs/core/config/WxPayProperties.java
  18. 3 3
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseFinishTempParentServiceImpl.java
  19. 4 6
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  20. 2 9
      fs-service/src/main/java/com/fs/his/config/WxMiniappTempConfig.java
  21. 2 8
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  22. 8 0
      fs-service/src/main/java/com/fs/system/service/ISysConfigService.java
  23. 13 0
      fs-service/src/main/java/com/fs/system/service/impl/SysConfigServiceImpl.java
  24. 2 9
      fs-service/src/main/java/com/fs/wx/cp/config/WxCpProperties.java
  25. 2 10
      fs-service/src/main/java/com/fs/wx/miniapp/config/WxMaProperties.java

+ 2 - 6
fs-admin/src/main/java/com/fs/company/controller/CompanyUserAllController.java

@@ -508,12 +508,8 @@ public class CompanyUserAllController extends BaseController {
     @PostMapping("/accountCheck")
     public R accountCheck(@RequestBody Map<String, String> userIdMap){
 
-        String configKey = "projectConfig";
-        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-        ProjectConfig projectConfig = com.alibaba.fastjson.JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
-
-        ProjectConfig.OpenIM im = projectConfig.getOpenIM();
+        ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+        ProjectConfig.OpenIM im = projectConfig != null ? projectConfig.getOpenIM() : null;
 
         //获取管理员token
         String userId = userIdMap.get("userId");

+ 2 - 2
fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java

@@ -9,7 +9,6 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.config.saas.ProjectConfig;
 import com.fs.core.config.TenantConfigContext;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.param.FsCourseOverParam;
@@ -43,7 +42,7 @@ import java.util.List;
 public class QwFsCourseWatchLogController extends BaseController
 {
     @Autowired
-    private ProjectConfig projectConfig;
+    private com.fs.system.mapper.SysConfigMapper sysConfigMapper;
     @Autowired
     private IFsCourseWatchLogService fsCourseWatchLogService;
 
@@ -130,6 +129,7 @@ public class QwFsCourseWatchLogController extends BaseController
         if (fromTenant != null) {
             return fromTenant;
         }
+        com.fs.config.saas.ProjectConfig projectConfig = com.fs.config.saas.ProjectConfig.getFromDB(sysConfigMapper);
         if (projectConfig != null && projectConfig.getCloudHost() != null) {
             return projectConfig.getCloudHost().getCompanyName();
         }

+ 3 - 3
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java

@@ -12,7 +12,6 @@ import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.config.saas.ProjectConfig;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsUserService;
@@ -67,7 +66,8 @@ public class FsStoreAfterSalesScrmController extends BaseController
     private TokenService tokenService;
 
     @Autowired
-    private ProjectConfig projectConfig;
+    private com.fs.system.mapper.SysConfigMapper sysConfigMapper;
+
     /**
      * 查询售后记录列表
      */
@@ -101,7 +101,7 @@ public class FsStoreAfterSalesScrmController extends BaseController
         }
 
         List<FsStoreAfterSalesVO> list = fsStoreAfterSalesService.selectFsStoreAfterSalesListVOExport(fsStoreAfterSales);
-        if("北京卓美".equals(projectConfig.getCloudHost().getCompanyName())){
+        if("北京卓美".equals(com.fs.config.saas.ProjectConfig.getFromDB(sysConfigMapper).getCloudHost().getCompanyName())){
             List<FsStoreOrderItemExportRefundZMVO> zmvoList = list.stream()
                     .map(vo -> {
                         FsStoreOrderItemExportRefundZMVO zmvo = new FsStoreOrderItemExportRefundZMVO();

+ 2 - 2
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java

@@ -76,7 +76,7 @@ public class FsStoreHealthOrderScrmController extends BaseController {
     private static final long MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
 
     @Autowired
-    private ProjectConfig projectConfig;
+    private com.fs.system.mapper.SysConfigMapper sysConfigMapper;
 
     /**
      * 查询健康商城订单列表
@@ -353,7 +353,7 @@ public class FsStoreHealthOrderScrmController extends BaseController {
         }
         param.setIsHealth("1");
         List<FsStoreOrderItemExportVO> list = orderItemService.selectFsStoreOrderItemListExportVO(param);
-        if("北京卓美".equals(projectConfig.getCloudHost().getCompanyName())){
+        if("北京卓美".equals(com.fs.config.saas.ProjectConfig.getFromDB(sysConfigMapper).getCloudHost().getCompanyName())){
             List<FsStoreOrderItemExportZMVO> zmvoList = list.stream()
                     .map(vo -> {
                         FsStoreOrderItemExportZMVO zmvo = new FsStoreOrderItemExportZMVO();

+ 1 - 4
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -23,7 +23,6 @@ import com.fs.company.param.CompanyStoreOrderMoneyLogsListParam;
 import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.vo.CompanyStoreOrderMoneyLogsVO;
 import com.fs.config.cloud.CloudHostProper;
-import com.fs.config.saas.ProjectConfig;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpOrderQuery;
 import com.fs.erp.dto.ErpOrderQueryRequert;
@@ -147,8 +146,6 @@ public class FsStoreOrderScrmController extends BaseController {
     @Autowired
     private IFsStoreOrderLogsScrmService fsStoreOrderLogsService;
 
-    @Autowired
-    private ProjectConfig projectConfig;
     private IErpOrderService getErpService(){
         //判断是否开启erp
         IErpOrderService erpOrderService = null;
@@ -549,7 +546,7 @@ public class FsStoreOrderScrmController extends BaseController {
         }
         param.setNotHealth(1);
         List<FsStoreOrderItemExportVO> list = orderItemService.selectFsStoreOrderItemListExportVO(param);
-        if("北京卓美".equals(projectConfig.getCloudHost().getCompanyName())){
+        if("北京卓美".equals(com.fs.config.saas.ProjectConfig.getFromDB(sysConfigMapper).getCloudHost().getCompanyName())){
             List<FsStoreOrderItemExportZMVO> zmvoList = list.stream()
                     .map(vo -> {
                         FsStoreOrderItemExportZMVO zmvo = new FsStoreOrderItemExportZMVO();

+ 3 - 3
fs-admin/src/main/java/com/fs/live/controller/LiveAfterSalesController.java

@@ -11,8 +11,8 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.config.saas.ProjectConfig;
 import com.fs.framework.web.service.TokenService;
+import com.fs.system.service.ISysConfigService;
 import com.fs.his.domain.FsStoreAfterSalesLogs;
 import com.fs.his.domain.FsUser;
 import com.fs.his.enums.FsStoreAfterSalesStatusEnum;
@@ -66,7 +66,7 @@ public class LiveAfterSalesController extends BaseController
     private ILiveOrderService orderService;
 
     @Autowired
-    private ProjectConfig projectConfig;
+    private ISysConfigService sysConfigService;
 
     /**
      * 获取售后记录详细信息
@@ -116,7 +116,7 @@ public class LiveAfterSalesController extends BaseController
         PageHelper.clearPage();
         PageHelper.startPage(1, 10000, "");
         List<LiveAfterSalesVo> list = liveAfterSalesService.selectLiveAfterSalesVoListExport(liveAfterSales);
-        if("北京卓美".equals(projectConfig.getCloudHost().getCompanyName())){
+        if("北京卓美".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())){
             List<FsStoreOrderItemExportRefundZMVO> zmvoList = list.stream()
                     .map(vo -> {
                         FsStoreOrderItemExportRefundZMVO zmvo = new FsStoreOrderItemExportRefundZMVO();

+ 2 - 5
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -779,11 +779,8 @@ public class CompanyUserController extends BaseController {
     @PostMapping("/accountCheck")
     public R accountCheck(@RequestBody Map<String, String> userIdMap){
 
-        String configKey = "projectConfig";
-        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-        ProjectConfig projectConfig = com.alibaba.fastjson.JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
-        ProjectConfig.OpenIM im = projectConfig.getOpenIM();
+        ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+        ProjectConfig.OpenIM im = projectConfig != null ? projectConfig.getOpenIM() : null;
         //获取管理员token
         String userId = userIdMap.get("userId");
         String adminToken = openIMService.getAdminToken();

+ 1 - 4
fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java

@@ -11,7 +11,6 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.config.saas.ProjectConfig;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.domain.FsUserCoursePeriod;
@@ -58,8 +57,6 @@ public class FsCourseRedPacketLogController extends BaseController
 
     @Autowired
     private IFsUserCoursePeriodService fsUserCoursePeriodService;
-    @Autowired
-    private ProjectConfig  projectConfig;
 
     /**
      * 查询短链课程看课记录列表
@@ -81,7 +78,7 @@ public class FsCourseRedPacketLogController extends BaseController
             fsCourseRedPacketLog.setCompanyId( loginUser.getCompany().getCompanyId());
         }
 
-        if("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())){
+        if("济南联志健康".equals(configService.getProjectConfig().getCloudHost().getCompanyName())){
             fsCourseRedPacketLog.setCompanyId( loginUser.getCompany().getCompanyId());
         }
 

+ 5 - 6
fs-company/src/main/java/com/fs/company/controller/course/qw/FsQwCourseWatchLogController.java

@@ -7,7 +7,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.config.saas.ProjectConfig;
+import com.fs.system.service.ISysConfigService;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.param.*;
 import com.fs.course.service.IFsCourseWatchLogService;
@@ -48,9 +48,8 @@ public class FsQwCourseWatchLogController extends BaseController
     private SopUserLogsMapper sopUserLogsMapper;
     @Autowired
     private IQwWatchLogService qwWatchLogService;
-
     @Autowired
-    private ProjectConfig projectConfig;
+    private ISysConfigService sysConfigService;
     /**
      * 查询短链课程看课记录列表
      */
@@ -111,7 +110,7 @@ public class FsQwCourseWatchLogController extends BaseController
             return getDataTable(new ArrayList<>());
         }
         //济南联志健康 数据排除转接用户
-        if ("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())) {
+        if ("济南联志健康".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())) {
             return qwWatchLogService.selectQwWatchLogStatisticsListVOExcludeTransfer(param);
         } else {
             return qwWatchLogService.selectQwWatchLogStatisticsListVO(param);
@@ -127,7 +126,7 @@ public class FsQwCourseWatchLogController extends BaseController
             return getDataTable(new ArrayList<>());
         }
         //济南联志健康 数据排除转接用户
-        if ("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())) {
+        if ("济南联志健康".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())) {
             return qwWatchLogService.selectQwWatchLogStatisticsListVOExcludeTransfer(param);
         } else {
             return qwWatchLogService.selectQwWatchLogStatisticsListVO(param);
@@ -228,7 +227,7 @@ public class FsQwCourseWatchLogController extends BaseController
         param.setCompanyId( loginUser.getCompany().getCompanyId());
         List<QwWatchLogStatisticsListVO> list = new ArrayList<>();
 
-        if ("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())) {
+        if ("济南联志健康".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())) {
             list = qwWatchLogService.selectQwWatchLogStatisticsListVOExportExcludeTransfer(param);
         }else{
             list = qwWatchLogService.selectQwWatchLogStatisticsListVOExport(param);

+ 3 - 3
fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java

@@ -13,9 +13,9 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.company.service.impl.CompanyUserServiceImpl;
 import com.fs.company.vo.DocCompanyUserVO;
-import com.fs.config.saas.ProjectConfig;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
+import com.fs.system.service.ISysConfigService;
 import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.SortDayVo;
 import com.fs.sop.domain.QwSop;
@@ -54,7 +54,7 @@ public class QwSopTempController extends BaseController
     @Autowired
     private IQwUserService iQwUserService;
     @Autowired
-    private ProjectConfig projectConfig;
+    private ISysConfigService sysConfigService;
     @Autowired
     private CompanyDeptServiceImpl companyDeptService;
 
@@ -145,7 +145,7 @@ public class QwSopTempController extends BaseController
     public TableDataInfo deptList(QwSopTemp qwSopTemp)
     {
 
-        if (!"今正科技".equals(projectConfig.getCloudHost().getCompanyName())) {
+        if (!"今正科技".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())) {
             return list(qwSopTemp);
         }
 

+ 2 - 8
fs-doctor-app/src/main/java/com/fs/app/controller/DoctorController.java

@@ -79,14 +79,8 @@ public class DoctorController extends  AppBaseController {
      * @return
      */
     private ProjectConfig.OpenIM getImConfig(){
-
-        String configKey = "projectConfig";
-        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-        ProjectConfig projectConfig = com.alibaba.fastjson.JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
-
-        ProjectConfig.OpenIM im = projectConfig.getOpenIM();
-        return im;
+        ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+        return projectConfig != null ? projectConfig.getOpenIM() : null;
     }
 
     @ApiOperation("登录")

+ 17 - 8
fs-service/src/main/java/com/fs/config/cloud/CloudHostProper.java

@@ -2,9 +2,9 @@ package com.fs.config.cloud;
 
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.utils.StringUtils;
-import com.fs.common.utils.spring.SpringUtils;
 import com.fs.config.saas.ProjectConfig;
 import com.fs.core.config.TenantConfigContext;
+import com.fs.system.mapper.SysConfigMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -14,19 +14,23 @@ import java.util.Arrays;
  * 云托管相关配置访问器。
  *
  * 优先从当前租户的 {@link TenantConfigContext} 中读取 cloud_host/headerImg,
- * 若租户未配置,则回退到全局 {@link ProjectConfig}
+ * 若租户未配置,则回退到从数据库查询的全局 ProjectConfig。
  */
 @Component
 public class CloudHostProper {
 
-    /**
-     * 全局配置(application-*.yml 中的 projectConfig),用于租户未配置时兜底。
-     */
-    private final ProjectConfig globalProjectConfig;
+    private final SysConfigMapper sysConfigMapper;
 
     @Autowired
-    public CloudHostProper(ProjectConfig projectConfig) {
-        this.globalProjectConfig = projectConfig;
+    public CloudHostProper(SysConfigMapper sysConfigMapper) {
+        this.sysConfigMapper = sysConfigMapper;
+    }
+
+    /**
+     * 获取全局配置(从数据库查询)
+     */
+    private ProjectConfig getGlobalProjectConfig() {
+        return ProjectConfig.getFromDB(sysConfigMapper);
     }
 
     private JSONObject currentTenantCfg() {
@@ -49,6 +53,7 @@ public class CloudHostProper {
             }
         }
         // 租户未配置时回退到全局配置
+        ProjectConfig globalProjectConfig = getGlobalProjectConfig();
         if (globalProjectConfig != null && globalProjectConfig.getCloudHost() != null) {
             return globalProjectConfig.getCloudHost().getCompanyName();
         }
@@ -66,6 +71,7 @@ public class CloudHostProper {
                 }
             }
         }
+        ProjectConfig globalProjectConfig = getGlobalProjectConfig();
         if (globalProjectConfig != null && globalProjectConfig.getHeaderImg() != null) {
             return globalProjectConfig.getHeaderImg().getImgUrl();
         }
@@ -87,6 +93,7 @@ public class CloudHostProper {
                 }
             }
         }
+        ProjectConfig globalProjectConfig = getGlobalProjectConfig();
         if (globalProjectConfig != null && globalProjectConfig.getCloudHost() != null) {
             return globalProjectConfig.getCloudHost().getProjectCode();
         }
@@ -107,6 +114,7 @@ public class CloudHostProper {
                 }
             }
         }
+        ProjectConfig globalProjectConfig = getGlobalProjectConfig();
         if (globalProjectConfig != null && globalProjectConfig.getCloudHost() != null) {
             return globalProjectConfig.getCloudHost().getSpaceName();
         }
@@ -127,6 +135,7 @@ public class CloudHostProper {
                 }
             }
         }
+        ProjectConfig globalProjectConfig = getGlobalProjectConfig();
         if (globalProjectConfig != null && globalProjectConfig.getCloudHost() != null) {
             return globalProjectConfig.getCloudHost().getVolcengineUrl();
         }

+ 2 - 27
fs-service/src/main/java/com/fs/config/mq/RocketmqConfig.java

@@ -3,7 +3,6 @@ package com.fs.config.mq;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.config.saas.ProjectConfig;
-import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -87,33 +86,9 @@ public class RocketmqConfig {
                 }
 
                 // 查询数据库
-                String configKey = "projectConfig";
-                SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-                if (sysConfig == null) {
-                    log.warn("数据库中没有找到配置: {}", configKey);
-                    return null;
-                }
-
-                if (StringUtils.isBlank(sysConfig.getConfigValue())) {
-                    log.warn("数据库配置值为空: {}", configKey);
-                    return null;
-                }
-
-                // 解析JSON
-                ProjectConfig projectConfig;
-                try {
-                    projectConfig = JSONObject.parseObject(
-                            sysConfig.getConfigValue(),
-                            ProjectConfig.class
-                    );
-                } catch (Exception e) {
-                    log.error("解析JSON失败", e);
-                    return null;
-                }
-
+                ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
                 if (projectConfig == null) {
-                    log.warn("项目配置解析失败");
+                    log.warn("从数据库加载RocketMQ配置失败");
                     return null;
                 }
 

+ 32 - 3
fs-service/src/main/java/com/fs/config/saas/ProjectConfig.java

@@ -2,11 +2,13 @@ package com.fs.config.saas;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baidu.dev2.thirdparty.jackson.databind.PropertyNamingStrategies;
-import com.baidu.dev2.thirdparty.jackson.databind.annotation.JsonNaming;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fs.core.config.TenantConfigContext;
+import com.fs.system.mapper.SysConfigMapper;
+import com.fs.system.domain.SysConfig;
 import lombok.Data;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -26,6 +28,34 @@ import java.util.List;
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class ProjectConfig {
 
+    private static final Logger log = LoggerFactory.getLogger(ProjectConfig.class);
+
+    /** 配置Key常量 */
+    public static final String CONFIG_KEY = "projectConfig";
+
+    /**
+     * 通过 SysConfigMapper 从数据库获取 ProjectConfig
+     * 适用于无法注入 ISysConfigService 但持有 SysConfigMapper 的场景(如配置类初始化)
+     *
+     * @param sysConfigMapper 系统配置Mapper
+     * @return ProjectConfig 对象,如果不存在或解析失败返回 null
+     */
+    public static ProjectConfig getFromDB(SysConfigMapper sysConfigMapper) {
+        if (sysConfigMapper == null) {
+            return null;
+        }
+        try {
+            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(CONFIG_KEY);
+            if (sysConfig == null || sysConfig.getConfigValue() == null || sysConfig.getConfigValue().isEmpty()) {
+                return null;
+            }
+            return JSONObject.parseObject(sysConfig.getConfigValue(), ProjectConfig.class);
+        } catch (Exception e) {
+            log.error("从数据库解析ProjectConfig失败", e);
+            return null;
+        }
+    }
+
     @JsonProperty("wx")
     private Wx wx;
 
@@ -229,7 +259,6 @@ public class ProjectConfig {
     }
 
     @Data
-    @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
     public static class TencentCloudConfig {
         @JsonProperty("secret_id")
         private String secretId;

+ 2 - 9
fs-service/src/main/java/com/fs/config/tencent/TencentProperties.java

@@ -40,19 +40,12 @@ public class TencentProperties {
                 return cachedConfig.getTencentCloudConfig();
             }
 
-            String configKey = "projectConfig";
-            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-            if (sysConfig == null || sysConfig.getConfigValue() == null) {
+            ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+            if (projectConfig == null) {
                 log.warn("未找到腾讯云配置");
                 return null;
             }
 
-            ProjectConfig projectConfig = JSONObject.parseObject(
-                    sysConfig.getConfigValue(),
-                    ProjectConfig.class
-            );
-
             if (projectConfig == null) {
                 log.warn("配置解析失败");
                 return null;

+ 2 - 9
fs-service/src/main/java/com/fs/core/config/WxMpProperties.java

@@ -49,19 +49,12 @@ public class WxMpProperties {
                 log.debug("从Redis缓存中获取ProjectConfig配置");
                 return cachedConfig.getWx().getMp();
             }
-            String configKey = "projectConfig";
-            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-            if (sysConfig == null || sysConfig.getConfigValue() == null) {
+            ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+            if (projectConfig == null) {
                 log.warn("未找到公众号配置");
                 return null;
             }
 
-            ProjectConfig projectConfig = JSONObject.parseObject(
-                    sysConfig.getConfigValue(),
-                    ProjectConfig.class
-            );
-
             if (projectConfig == null || projectConfig.getWx() == null) {
                 log.warn("配置中未找到wx节点");
                 return null;

+ 2 - 9
fs-service/src/main/java/com/fs/core/config/WxPayProperties.java

@@ -41,19 +41,12 @@ public class WxPayProperties {
         return cachedConfig.getWx().getPay();
       }
 
-      String configKey = "projectConfig";
-      SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-      if (sysConfig == null || sysConfig.getConfigValue() == null) {
+      ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+      if (projectConfig == null) {
         log.warn("未找到微信支付配置");
         return null;
       }
 
-      ProjectConfig projectConfig = JSONObject.parseObject(
-              sysConfig.getConfigValue(),
-              ProjectConfig.class
-      );
-
       if (projectConfig == null || projectConfig.getWx() == null) {
         log.warn("配置中未找到wx节点");
         return null;

+ 3 - 3
fs-service/src/main/java/com/fs/course/service/impl/FsCourseFinishTempParentServiceImpl.java

@@ -9,13 +9,13 @@ import com.alibaba.fastjson.JSONObject;
 import com.fs.common.utils.DateUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.utils.StringUtils;
-import com.fs.config.saas.ProjectConfig;
 import com.fs.course.domain.FsCourseFinishTemp;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.domain.FsUserCourseVideo;
 import com.fs.course.service.IFsCourseFinishTempService;
 import com.fs.course.service.IFsUserCourseService;
 import com.fs.course.service.IFsUserCourseVideoService;
+import com.fs.system.service.ISysConfigService;
 import lombok.AllArgsConstructor;
 import lombok.NoArgsConstructor;
 import lombok.RequiredArgsConstructor;
@@ -37,7 +37,7 @@ import com.fs.course.service.IFsCourseFinishTempParentService;
 public class FsCourseFinishTempParentServiceImpl extends ServiceImpl<FsCourseFinishTempParentMapper, FsCourseFinishTempParent> implements IFsCourseFinishTempParentService {
 
     @Autowired
-    private ProjectConfig projectConfig;
+    private ISysConfigService sysConfigService;
 
     private final IFsUserCourseService fsUserCourseService;
     private final IFsUserCourseVideoService fsUserCourseVideoService;
@@ -81,7 +81,7 @@ public class FsCourseFinishTempParentServiceImpl extends ServiceImpl<FsCourseFin
         List<FsUserCourseVideo> videoList = fsUserCourseVideoService.selectFsUserCourseVideoListByCourseId(fsUserCourseVideo);
         int insert = baseMapper.insert(fsCourseFinishTempParent);
         fsCourseFinishTempParent.setCreateTime(DateUtils.getNowDate());
-        Long currentStatus = "济南联志健康".equals(projectConfig.getCloudHost().getCompanyName()) ? fsCourseFinishTempParent.getStatus() : 0L;
+        Long currentStatus = "济南联志健康".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName()) ? fsCourseFinishTempParent.getStatus() : 0L;
         videoList.forEach(e -> {
             FsCourseFinishTemp temp = new FsCourseFinishTemp();
             temp.setName(e.getFileName());

+ 4 - 6
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -126,7 +126,7 @@ import static com.fs.course.utils.LinkUtil.generateRandomStringWithLock;
 public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoMapper, FsUserCourseVideo> implements IFsUserCourseVideoService {
 
     @Autowired
-    private ProjectConfig projectConfig;
+    private ISysConfigService sysConfigService;
     @Autowired
     private OpenIMService openIMService;
     @Autowired
@@ -195,8 +195,6 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     private FsCourseLinkMapper courseLinkMapper;
     @Autowired
     RedisCache redisCache;
-    @Autowired
-    private ISysConfigService sysConfigService;
 
     @Autowired
     private CompanyUserMapper companyUserMapper;
@@ -1175,7 +1173,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     }
 
     private R addCustomerService(String qwUserById,String msg){
-        if ("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())){
+        if ("济南联志健康".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())){
             return R.error(400,msg).put("qrcode", "");
         }
         String json = configService.selectConfigByKey("course.config");
@@ -1710,7 +1708,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
 
         //判断是否走服务号openId发红包
-        if (config.getMiniAppAuthType() == 2 && user.getMpOpenId() != null && !projectConfig.getIsNewWxMerchant()) {
+        if (config.getMiniAppAuthType() == 2 && user.getMpOpenId() != null && !sysConfigService.getProjectConfig().getIsNewWxMerchant()) {
             packetParam.setOpenId(user.getMpOpenId());
         } else {
             //查询是否绑定小程序
@@ -2616,7 +2614,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         }
 
         if (userCompanyUser.getStatus() == 2) {
-            if ("福本源".equals(projectConfig.getCloudHost().getCompanyName())) {
+            if ("福本源".equals(sysConfigService.getProjectConfig().getCloudHost().getCompanyName())) {
                 return ResponseResult.fail(ExceptionCodeEnum.SERVICE_UNAVAILABLE.getCode(), ExceptionCodeEnum.SERVICE_UNAVAILABLE.getDescription());
             } else {
                 return ResponseResult.fail(ExceptionCodeEnum.USER_BLACKLISTED.getCode(), ExceptionCodeEnum.USER_BLACKLISTED.getDescription());

+ 2 - 9
fs-service/src/main/java/com/fs/his/config/WxMiniappTempConfig.java

@@ -40,19 +40,12 @@ public class WxMiniappTempConfig implements Serializable {
                 log.debug("从Redis缓存中获取ProjectConfig配置");
                 return cachedConfig.getWxMiniappTemp();
             }
-            String configKey = "projectConfig";
-            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-            if (sysConfig == null || sysConfig.getConfigValue() == null) {
+            ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+            if (projectConfig == null) {
                 log.warn("未找到微信小程序模板消息配置");
                 return null;
             }
 
-            ProjectConfig projectConfig = JSONObject.parseObject(
-                    sysConfig.getConfigValue(),
-                    ProjectConfig.class
-            );
-
             if (projectConfig == null) {
                 log.warn("配置解析失败");
                 return null;

+ 2 - 8
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -111,14 +111,8 @@ public class OpenIMServiceImpl implements OpenIMService {
      * @return
      */
     private ProjectConfig.OpenIM getImConfig(){
-
-        String configKey = "projectConfig";
-        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-        ProjectConfig projectConfig = com.alibaba.fastjson.JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
-
-        ProjectConfig.OpenIM im = projectConfig.getOpenIM();
-        return im;
+        ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+        return projectConfig != null ? projectConfig.getOpenIM() : null;
     }
 //    @Value("${openIM.prefix}")
 //    private String openImPrefix;

+ 8 - 0
fs-service/src/main/java/com/fs/system/service/ISysConfigService.java

@@ -89,4 +89,12 @@ public interface ISysConfigService
     public String checkConfigKeyUnique(SysConfig config);
 
     SysConfig selectConfigByConfigKey(String configKey);
+
+    /**
+     * 从数据库获取 ProjectConfig 配置对象
+     * 通过 sys_config 表中 config_key = "projectConfig" 的记录反序列化得到
+     *
+     * @return ProjectConfig 对象,如果不存在或解析失败返回 null
+     */
+    com.fs.config.saas.ProjectConfig getProjectConfig();
 }

+ 13 - 0
fs-service/src/main/java/com/fs/system/service/impl/SysConfigServiceImpl.java

@@ -238,6 +238,19 @@ public class SysConfigServiceImpl implements ISysConfigService
         return configMapper.selectConfigByConfigKey(configKey);
     }
 
+    @Override
+    public com.fs.config.saas.ProjectConfig getProjectConfig() {
+        SysConfig sysConfig = configMapper.selectConfigByConfigKey("projectConfig");
+        if (sysConfig == null || StringUtils.isEmpty(sysConfig.getConfigValue())) {
+            return null;
+        }
+        try {
+            return com.alibaba.fastjson.JSONObject.parseObject(sysConfig.getConfigValue(), com.fs.config.saas.ProjectConfig.class);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
     /**
      * 设置cache key
      *

+ 2 - 9
fs-service/src/main/java/com/fs/wx/cp/config/WxCpProperties.java

@@ -44,19 +44,12 @@ public class WxCpProperties {
                 log.debug("从Redis缓存中获取ProjectConfig配置");
                 return cachedConfig.getWx().getCp();
             }
-            String configKey = "projectConfig";
-            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-            if (sysConfig == null || sysConfig.getConfigValue() == null) {
+            ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+            if (projectConfig == null) {
                 log.warn("未找到企业微信配置");
                 return null;
             }
 
-            ProjectConfig projectConfig = JSONObject.parseObject(
-                    sysConfig.getConfigValue(),
-                    ProjectConfig.class
-            );
-
             if (projectConfig == null || projectConfig.getWx() == null) {
                 log.warn("配置中未找到wx节点");
                 return null;

+ 2 - 10
fs-service/src/main/java/com/fs/wx/miniapp/config/WxMaProperties.java

@@ -44,19 +44,11 @@ public class WxMaProperties {
                 return cachedConfig.getWx().getMiniapp().getConfigs();
             }
 
-            String configKey = "projectConfig";
-            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
-
-            if (sysConfig == null || StringUtils.isBlank(sysConfig.getConfigValue())) {
+            ProjectConfig projectConfig = ProjectConfig.getFromDB(sysConfigMapper);
+            if (projectConfig == null) {
                 return new ArrayList<>();
             }
 
-            // 解析JSON配置
-            ProjectConfig projectConfig = JSONObject.parseObject(
-                    sysConfig.getConfigValue(),
-                    ProjectConfig.class
-            );
-
             if (projectConfig == null || projectConfig.getWx() == null ||
                     projectConfig.getWx().getMiniapp() == null) {
                 return new ArrayList<>();