소스 검색

1、调整初始配置动态更新,mq暂时没有调整

yfh 3 주 전
부모
커밋
8f0ff1dcc8
74개의 변경된 파일954개의 추가작업 그리고 750개의 파일을 삭제
  1. 2 2
      fs-ad-api/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java
  2. 1 1
      fs-admin/src/main/java/com/fs/FSApplication.java
  3. 20 5
      fs-admin/src/main/java/com/fs/company/controller/CompanyUserAllController.java
  4. 6 6
      fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java
  5. 4 4
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreAfterSalesScrmController.java
  6. 4 3
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreHealthOrderScrmController.java
  7. 4 4
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  8. 4 3
      fs-admin/src/main/java/com/fs/live/controller/LiveAfterSalesController.java
  9. 12 11
      fs-admin/src/main/java/com/fs/task/MiniProgramSubTask.java
  10. 1 1
      fs-common-api/src/main/java/com/fs/framework/config/SwaggerConfig.java
  11. 1 1
      fs-common-api/src/main/java/com/fs/framework/config/properties/DruidProperties.java
  12. 1 1
      fs-company-app/src/main/java/com/fs/core/config/FilterConfig.java
  13. 14 5
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  14. 3 3
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseRedPacketLogController.java
  15. 6 5
      fs-company/src/main/java/com/fs/company/controller/course/qw/FsQwCourseWatchLogController.java
  16. 4 5
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java
  17. 5 7
      fs-company/src/main/java/com/fs/framework/security/filter/JwtAuthenticationTokenFilter.java
  18. 1 1
      fs-doctor-app/src/main/java/com/fs/framework/config/SwaggerConfig.java
  19. 2 2
      fs-framework/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java
  20. 4 5
      fs-framework/src/main/java/com/fs/framework/security/filter/JwtAuthenticationTokenFilter.java
  21. 2 2
      fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java
  22. 1 1
      fs-qw-mq/src/main/java/com/fs/framework/config/SwaggerConfig.java
  23. 2 2
      fs-qwhook-msg/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java
  24. 2 2
      fs-qwhook/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java
  25. 2 2
      fs-redis/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java
  26. 2 2
      fs-repeat-api/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java
  27. 4 4
      fs-service/src/main/java/com/fs/config/ai/AiHostProper.java
  28. 21 21
      fs-service/src/main/java/com/fs/config/cloud/CloudHostProper.java
  29. 433 0
      fs-service/src/main/java/com/fs/config/saas/ProjectConfig.java
  30. 17 4
      fs-service/src/main/java/com/fs/config/tencent/TencentCOSClientConfig.java
  31. 0 22
      fs-service/src/main/java/com/fs/config/tencent/TencentProperties.java
  32. 13 4
      fs-service/src/main/java/com/fs/core/config/WxMpConfiguration.java
  33. 0 120
      fs-service/src/main/java/com/fs/core/config/WxMpProperties.java
  34. 1 1
      fs-service/src/main/java/com/fs/course/mapper/FsCoursePlaySourceConfigMapper.java
  35. 1 1
      fs-service/src/main/java/com/fs/course/mapper/FsVideoBarrageMapper.java
  36. 1 1
      fs-service/src/main/java/com/fs/course/service/HsyAssumeRoleService.java
  37. 4 4
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseFinishTempParentServiceImpl.java
  38. 9 10
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  39. 42 16
      fs-service/src/main/java/com/fs/course/service/impl/TencentCloudCosService.java
  40. 38 8
      fs-service/src/main/java/com/fs/event/WeixinTemplateService.java
  41. 19 19
      fs-service/src/main/java/com/fs/his/config/WxMiniappTempConfig.java
  42. 1 1
      fs-service/src/main/java/com/fs/his/mapper/MerchantAppConfigMapper.java
  43. 0 3
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  44. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsShippingTemplatesRegionScrmMapper.java
  45. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsShippingTemplatesScrmMapper.java
  46. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCouponUserScrmMapper.java
  47. 3 3
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductAttrValueScrmMapper.java
  48. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductPurchaseLimitScrmMapper.java
  49. 2 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  50. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsUserAddressScrmMapper.java
  51. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsUserScrmMapper.java
  52. 28 16
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  53. 57 57
      fs-service/src/main/java/com/fs/im/config/IMConfig.java
  54. 42 104
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  55. 1 1
      fs-service/src/main/java/com/fs/live/mapper/LiveCompletionPointsRecordMapper.java
  56. 2 2
      fs-service/src/main/java/com/fs/live/mapper/LiveCouponUserMapper.java
  57. 5 5
      fs-service/src/main/java/com/fs/live/mapper/LiveDataMapper.java
  58. 2 2
      fs-service/src/main/java/com/fs/live/mapper/LiveGoodsMapper.java
  59. 1 1
      fs-service/src/main/java/com/fs/live/mapper/LiveMapper.java
  60. 3 3
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java
  61. 1 1
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderPaymentMapper.java
  62. 4 4
      fs-service/src/main/java/com/fs/live/mapper/LiveUserFirstEntryMapper.java
  63. 1 1
      fs-service/src/main/java/com/fs/live/mapper/LiveWatchUserMapper.java
  64. 6 6
      fs-service/src/main/java/com/fs/statis/mapper/FsStatisSalerWatchMapper.java
  65. 16 8
      fs-service/src/main/java/com/fs/wx/cp/config/WxCpConfiguration.java
  66. 51 51
      fs-service/src/main/java/com/fs/wx/cp/config/WxCpProperties.java
  67. 0 90
      fs-service/src/main/java/com/fs/wx/miniapp/config/WxMaProperties.java
  68. 0 1
      fs-service/src/main/resources/META-INF/spring.facories
  69. 1 0
      fs-service/src/main/resources/META-INF/spring.factories
  70. 0 53
      fs-service/src/main/resources/application-dev.yml
  71. 1 1
      fs-store/src/main/java/com/fs/framework/config/properties/DruidProperties.java
  72. 3 3
      fs-store/src/main/java/com/fs/store/controller/common/CaptchaController.java
  73. 2 2
      fs-user-app/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java
  74. 2 2
      fs-watch/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

+ 2 - 2
fs-ad-api/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
@@ -38,7 +38,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;

+ 1 - 1
fs-admin/src/main/java/com/fs/FSApplication.java

@@ -13,7 +13,7 @@ import org.springframework.transaction.annotation.Transactional;
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
 @Transactional
 @EnableAsync
-@EnableScheduling
+//@EnableScheduling
 public class FSApplication {
     public static void main(String[] args) {
         // System.setProperty("spring.devtools.restart.enabled", "false");

+ 20 - 5
fs-admin/src/main/java/com/fs/company/controller/CompanyUserAllController.java

@@ -3,7 +3,9 @@ package com.fs.company.controller;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSONUtil;
+import com.baidu.dev2.thirdparty.jackson.databind.JsonMappingException;
 import com.baidu.dev2.thirdparty.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fs.common.annotation.Log;
 import com.fs.common.constant.UserConstants;
 import com.fs.common.core.controller.BaseController;
@@ -27,12 +29,12 @@ import com.fs.company.vo.BatchUserRolesVO;
 import com.fs.company.vo.CompanyUserImportVO;
 import com.fs.company.vo.CompanyUserQwListVO;
 import com.fs.company.vo.CompanyUserVO;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.course.config.CourseConfig;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.OptionsVO;
 import com.fs.hisStore.vo.FsStoreProductExportVO;
-import com.fs.im.config.IMConfig;
 import com.fs.im.dto.OpenImResponseDTO;
 import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.QwCompany;
@@ -40,6 +42,8 @@ import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwUserVO;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.utils.DomainUtil;
 import com.fs.utils.QwStatusEnum;
@@ -72,7 +76,8 @@ public class CompanyUserAllController extends BaseController {
 
     @Autowired
     private ICompanyRoleService roleService;
-
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
     @Autowired
     private ICompanyPostService postService;
 
@@ -502,6 +507,15 @@ public class CompanyUserAllController extends BaseController {
     @ApiOperation("校验客服是否注册新的im")
     @PostMapping("/accountCheck")
     public R accountCheck(@RequestBody Map<String, String> userIdMap){
+       ObjectMapper objectMapper = new ObjectMapper();
+
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+
+        ProjectConfig projectConfig = com.alibaba.fastjson.JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.OpenIM im = projectConfig.getOpenIM();
+
         //获取管理员token
         String userId = userIdMap.get("userId");
         String adminToken = openIMService.getAdminToken();
@@ -513,7 +527,8 @@ public class CompanyUserAllController extends BaseController {
             requestBody = new JSONObject();
             userIds.add(userId);
             requestBody.put("checkUserIDs", userIds);
-            String body = HttpRequest.post(IMConfig.URL+"/user/account_check")
+
+            String body = HttpRequest.post(im.getUrl()+"/user/account_check")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString())
@@ -540,7 +555,7 @@ public class CompanyUserAllController extends BaseController {
                     requestBody = new JSONObject();
                     //userIds.add(userId);
                     requestBody.put("users", users);
-                    String registerBody = HttpRequest.post(IMConfig.URL+"/user/user_register")
+                    String registerBody = HttpRequest.post(im.getUrl()+"/user/user_register")
                             .header("operationID", String.valueOf(System.currentTimeMillis()))
                             .header("token", adminToken).body(requestBody.toString()).execute().body();
                 }
@@ -553,7 +568,7 @@ public class CompanyUserAllController extends BaseController {
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);
-            String body1 = HttpRequest.post(IMConfig.URL+"/auth/get_user_token")
+            String body1 = HttpRequest.post(im.getUrl()+"/auth/get_user_token")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString()).execute().body();

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

@@ -9,6 +9,7 @@ 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.course.domain.FsCourseWatchLog;
 import com.fs.course.param.FsCourseOverParam;
 import com.fs.course.param.FsCourseWatchLogListParam;
@@ -40,9 +41,8 @@ import java.util.List;
 @RequestMapping("/qw/course/courseWatchLog")
 public class QwFsCourseWatchLogController extends BaseController
 {
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
-
+    @Autowired
+    private ProjectConfig projectConfig;
     @Autowired
     private IFsCourseWatchLogService fsCourseWatchLogService;
 
@@ -82,7 +82,7 @@ public class QwFsCourseWatchLogController extends BaseController
         }
         param.setSendType(2); //企微
         List<FsCourseWatchLogStatisticsListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogStatisticsListVO(param);
-        if("济南联志健康".equals(signProjectName)){
+        if("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())){
             FsCourseWatchLogStatisticsListVO totalData = fsCourseWatchLogService.getTotalDataAddItem(param);
             list.add(totalData);
         }
@@ -104,7 +104,7 @@ public class QwFsCourseWatchLogController extends BaseController
 
         param.setSendType(2); //企微
         List<FsCourseWatchLogStatisticsListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogStatisticsListVO(param);
-        if("济南联志健康".equals(signProjectName)){
+        if("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())){
             FsCourseWatchLogStatisticsListVO totalData = fsCourseWatchLogService.getTotalDataAddItem(param);
             list.add(totalData);
         }
@@ -118,7 +118,7 @@ public class QwFsCourseWatchLogController extends BaseController
 
     @GetMapping("/getSignProjectName")
     public R getSignProjectName(){
-        return R.ok().put("signProjectName", signProjectName);
+        return R.ok().put("signProjectName", projectConfig.getCloudHost().getCompanyName());
     }
 
     @GetMapping("/statisticsListByCompany")

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

@@ -12,6 +12,7 @@ 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;
@@ -65,9 +66,8 @@ public class FsStoreAfterSalesScrmController extends BaseController
     @Autowired
     private TokenService tokenService;
 
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
-
+    @Autowired
+    private ProjectConfig projectConfig;
     /**
      * 查询售后记录列表
      */
@@ -101,7 +101,7 @@ public class FsStoreAfterSalesScrmController extends BaseController
         }
 
         List<FsStoreAfterSalesVO> list = fsStoreAfterSalesService.selectFsStoreAfterSalesListVOExport(fsStoreAfterSales);
-        if("北京卓美".equals(signProjectName)){
+        if("北京卓美".equals(projectConfig.getCloudHost().getCompanyName())){
             List<FsStoreOrderItemExportRefundZMVO> zmvoList = list.stream()
                     .map(vo -> {
                         FsStoreOrderItemExportRefundZMVO zmvo = new FsStoreOrderItemExportRefundZMVO();

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

@@ -15,6 +15,7 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.service.ICompanyMoneyLogsService;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.framework.web.service.TokenService;
@@ -74,8 +75,8 @@ public class FsStoreHealthOrderScrmController extends BaseController {
     // 最大文件大小(5MB)
     private static final long MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
 
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
+    @Autowired
+    private ProjectConfig projectConfig;
 
     /**
      * 查询健康商城订单列表
@@ -352,7 +353,7 @@ public class FsStoreHealthOrderScrmController extends BaseController {
         }
         param.setIsHealth("1");
         List<FsStoreOrderItemExportVO> list = orderItemService.selectFsStoreOrderItemListExportVO(param);
-        if("北京卓美".equals(signProjectName)){
+        if("北京卓美".equals(projectConfig.getCloudHost().getCompanyName())){
             List<FsStoreOrderItemExportZMVO> zmvoList = list.stream()
                     .map(vo -> {
                         FsStoreOrderItemExportZMVO zmvo = new FsStoreOrderItemExportZMVO();

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

@@ -23,6 +23,7 @@ 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;
@@ -146,9 +147,8 @@ public class FsStoreOrderScrmController extends BaseController {
     @Autowired
     private IFsStoreOrderLogsScrmService fsStoreOrderLogsService;
 
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
-
+    @Autowired
+    private ProjectConfig projectConfig;
     private IErpOrderService getErpService(){
         //判断是否开启erp
         IErpOrderService erpOrderService = null;
@@ -549,7 +549,7 @@ public class FsStoreOrderScrmController extends BaseController {
         }
         param.setNotHealth(1);
         List<FsStoreOrderItemExportVO> list = orderItemService.selectFsStoreOrderItemListExportVO(param);
-        if("北京卓美".equals(signProjectName)){
+        if("北京卓美".equals(projectConfig.getCloudHost().getCompanyName())){
             List<FsStoreOrderItemExportZMVO> zmvoList = list.stream()
                     .map(vo -> {
                         FsStoreOrderItemExportZMVO zmvo = new FsStoreOrderItemExportZMVO();

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

@@ -11,6 +11,7 @@ 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.his.domain.FsStoreAfterSalesLogs;
 import com.fs.his.domain.FsUser;
@@ -63,9 +64,9 @@ public class LiveAfterSalesController extends BaseController
     private IFsUserService userService;
     @Autowired
     private ILiveOrderService orderService;
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
 
+    @Autowired
+    private ProjectConfig projectConfig;
 
     /**
      * 获取售后记录详细信息
@@ -115,7 +116,7 @@ public class LiveAfterSalesController extends BaseController
         PageHelper.clearPage();
         PageHelper.startPage(1, 10000, "");
         List<LiveAfterSalesVo> list = liveAfterSalesService.selectLiveAfterSalesVoListExport(liveAfterSales);
-        if("北京卓美".equals(signProjectName)){
+        if("北京卓美".equals(projectConfig.getCloudHost().getCompanyName())){
             List<FsStoreOrderItemExportRefundZMVO> zmvoList = list.stream()
                     .map(vo -> {
                         FsStoreOrderItemExportRefundZMVO zmvo = new FsStoreOrderItemExportRefundZMVO();

+ 12 - 11
fs-admin/src/main/java/com/fs/task/MiniProgramSubTask.java

@@ -2,7 +2,9 @@ package com.fs.task;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.live.domain.LiveMiniprogramSubNotifyTask;
 import com.fs.live.mapper.LiveMiniprogramSubNotifyTaskMapper;
 import com.fs.store.enums.MiniAppNotifyTaskStatusEnum;
@@ -11,7 +13,8 @@ import com.fs.store.dto.ClientCredGrantReqDTO;
 import com.fs.store.dto.MiniGramSubsMsgResultDTO;
 import com.fs.store.dto.TemplateMessageSendRequestDTO;
 import com.fs.store.dto.WeXinAccessTokenDTO;
-import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -34,20 +37,18 @@ public class MiniProgramSubTask {
 
     private final LiveMiniprogramSubNotifyTaskMapper notifyTaskMapper;
 
-    private WxMaProperties.Config config = null;
-
-    @Autowired
-    public void setConfig(WxMaProperties properties) {
-        if(ObjectUtil.isNotNull(properties)){
-            this.config = properties.getConfigs().get(0);
-        }
-    }
-
-
+    private final SysConfigMapper sysConfigMapper;
     /**
      * 小程序订阅通知
      */
     public void notifyMiniLiveAppSub(){
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.Wx.Miniapp.Config config= projectConfig.getWx().getMiniapp().getConfigs().get(0);
+
+
         log.info("小程序直播订阅通知定时任务");
         // 先获取所有可用待处理任务
         List<LiveMiniprogramSubNotifyTask> pendingData = notifyTaskMapper.selectLivePendingData();

+ 1 - 1
fs-common-api/src/main/java/com/fs/framework/config/SwaggerConfig.java

@@ -20,7 +20,7 @@ import java.util.List;
 
 /**
  * Swagger2的接口配置
- * 
+ *
 
  */
 @Configuration

+ 1 - 1
fs-common-api/src/main/java/com/fs/framework/config/properties/DruidProperties.java

@@ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration;
 
 /**
  * druid 配置属性
- * 
+ *
 
  */
 @Configuration

+ 1 - 1
fs-company-app/src/main/java/com/fs/core/config/FilterConfig.java

@@ -15,7 +15,7 @@ import java.util.Map;
 /**
  * Filter配置
  *
- 
+
  */
 @Configuration
 public class FilterConfig

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

@@ -29,6 +29,7 @@ import com.fs.company.vo.CompanyUserImportVO;
 import com.fs.company.vo.CompanyUserQwListVO;
 import com.fs.company.vo.CompanyUserVO;
 import com.fs.config.cloud.CloudHostProper;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.course.config.CourseConfig;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.security.SecurityUtils;
@@ -37,7 +38,6 @@ import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.OptionsVO;
 import com.fs.hisStore.service.IFsUserScrmService;
 import com.fs.hisStore.vo.FsStoreProductExportVO;
-import com.fs.im.config.IMConfig;
 import com.fs.im.dto.OpenImResponseDTO;
 import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.QwCompany;
@@ -45,6 +45,8 @@ import com.fs.qw.service.IQwCompanyService;
 import com.fs.qw.service.IQwUserService;
 import com.fs.qw.vo.CompanyUserQwVO;
 import com.fs.qw.vo.QwUserVO;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import com.github.pagehelper.PageHelper;
@@ -75,7 +77,8 @@ public class CompanyUserController extends BaseController {
 
     @Autowired
     private ICompanyRoleService roleService;
-
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
     @Autowired
     private ICompanyPostService postService;
 
@@ -775,6 +778,12 @@ public class CompanyUserController extends BaseController {
     @ApiOperation("校验客服是否注册新的im")
     @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();
         //获取管理员token
         String userId = userIdMap.get("userId");
         String adminToken = openIMService.getAdminToken();
@@ -786,7 +795,7 @@ public class CompanyUserController extends BaseController {
             requestBody = new JSONObject();
             userIds.add(userId);
             requestBody.put("checkUserIDs", userIds);
-            String body = HttpRequest.post(IMConfig.URL+"/user/account_check")
+            String body = HttpRequest.post(im.getUrl()+"/user/account_check")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString())
@@ -813,7 +822,7 @@ public class CompanyUserController extends BaseController {
                     requestBody = new JSONObject();
                     //userIds.add(userId);
                     requestBody.put("users", users);
-                    String registerBody = HttpRequest.post(IMConfig.URL+"/user/user_register")
+                    String registerBody = HttpRequest.post(im.getUrl()+"/user/user_register")
                             .header("operationID", String.valueOf(System.currentTimeMillis()))
                             .header("token", adminToken).body(requestBody.toString()).execute().body();
                 }
@@ -826,7 +835,7 @@ public class CompanyUserController extends BaseController {
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);
-            String body1 = HttpRequest.post(IMConfig.URL+"/auth/get_user_token")
+            String body1 = HttpRequest.post(im.getUrl()+"/auth/get_user_token")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString()).execute().body();

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

@@ -11,6 +11,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.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.domain.FsUserCoursePeriod;
@@ -57,8 +58,7 @@ public class FsCourseRedPacketLogController extends BaseController
 
     @Autowired
     private IFsUserCoursePeriodService fsUserCoursePeriodService;
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
+
     /**
      * 查询短链课程看课记录列表
      */
@@ -79,7 +79,7 @@ public class FsCourseRedPacketLogController extends BaseController
             fsCourseRedPacketLog.setCompanyId( loginUser.getCompany().getCompanyId());
         }
 
-        if("济南联志健康".equals(signProjectName)){
+        if("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())){
             fsCourseRedPacketLog.setCompanyId( loginUser.getCompany().getCompanyId());
         }
 

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

@@ -7,6 +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.course.domain.FsCourseWatchLog;
 import com.fs.course.param.*;
 import com.fs.course.service.IFsCourseWatchLogService;
@@ -48,8 +49,8 @@ public class FsQwCourseWatchLogController extends BaseController
     @Autowired
     private IQwWatchLogService qwWatchLogService;
 
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
+    @Autowired
+    private ProjectConfig projectConfig;
     /**
      * 查询短链课程看课记录列表
      */
@@ -110,7 +111,7 @@ public class FsQwCourseWatchLogController extends BaseController
             return getDataTable(new ArrayList<>());
         }
         //济南联志健康 数据排除转接用户
-        if ("济南联志健康".equals(signProjectName)) {
+        if ("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())) {
             return qwWatchLogService.selectQwWatchLogStatisticsListVOExcludeTransfer(param);
         } else {
             return qwWatchLogService.selectQwWatchLogStatisticsListVO(param);
@@ -126,7 +127,7 @@ public class FsQwCourseWatchLogController extends BaseController
             return getDataTable(new ArrayList<>());
         }
         //济南联志健康 数据排除转接用户
-        if ("济南联志健康".equals(signProjectName)) {
+        if ("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())) {
             return qwWatchLogService.selectQwWatchLogStatisticsListVOExcludeTransfer(param);
         } else {
             return qwWatchLogService.selectQwWatchLogStatisticsListVO(param);
@@ -227,7 +228,7 @@ public class FsQwCourseWatchLogController extends BaseController
         param.setCompanyId( loginUser.getCompany().getCompanyId());
         List<QwWatchLogStatisticsListVO> list = new ArrayList<>();
 
-        if ("济南联志健康".equals(signProjectName)) {
+        if ("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())) {
             list = qwWatchLogService.selectQwWatchLogStatisticsListVOExportExcludeTransfer(param);
         }else{
             list = qwWatchLogService.selectQwWatchLogStatisticsListVOExport(param);

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

@@ -13,6 +13,7 @@ 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.qw.service.IQwUserService;
@@ -52,10 +53,8 @@ public class QwSopTempController extends BaseController
 
     @Autowired
     private IQwUserService iQwUserService;
-
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
-
+    @Autowired
+    private ProjectConfig projectConfig;
     @Autowired
     private CompanyDeptServiceImpl companyDeptService;
 
@@ -146,7 +145,7 @@ public class QwSopTempController extends BaseController
     public TableDataInfo deptList(QwSopTemp qwSopTemp)
     {
 
-        if (!"今正科技".equals(signProjectName)) {
+        if (!"今正科技".equals(projectConfig.getCloudHost().getCompanyName())) {
             return list(qwSopTemp);
         }
 

+ 5 - 7
fs-company/src/main/java/com/fs/framework/security/filter/JwtAuthenticationTokenFilter.java

@@ -5,8 +5,8 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.enums.DataSourceType;
 import com.fs.common.utils.StringUtils;
 
+import com.fs.config.saas.ProjectConfig;
 import com.fs.core.config.TenantConfigContext;
-import com.fs.core.config.WxMpProperties;
 import com.fs.framework.datasource.DynamicDataSource;
 import com.fs.framework.datasource.DynamicDataSourceContextHolder;
 import com.fs.framework.security.LoginUser;
@@ -30,8 +30,8 @@ import java.util.List;
 
 /**
  * token过滤器 验证token有效性
- * 
- 
+ *
+
  */
 @Component
 public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
@@ -44,8 +44,6 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
     private DynamicDataSource dynamicDataSource;
     @Autowired
     private SysConfigMapper sysConfigMapper;
-    @Autowired
-    private WxMpProperties wxMpProperties;
 
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
@@ -73,7 +71,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
                         TenantConfigContext.set(null);
                     }
 
-                    WxMpProperties.loadTenantConfigsFromContext();
+                    ProjectConfig.loadTenantConfigsFromContext();
                 }
 
 
@@ -92,7 +90,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
 //                System.out.println("当前租户公众号 AesKey = " + cfg.getAesKey());
 //            }
 
-            WxMpProperties.clearTenantConfigs();
+            ProjectConfig.clearTenantConfigs();
             TenantConfigContext.clear();
             DynamicDataSourceContextHolder.clearDataSourceType();
         }

+ 1 - 1
fs-doctor-app/src/main/java/com/fs/framework/config/SwaggerConfig.java

@@ -20,7 +20,7 @@ import java.util.List;
 
 /**
  * Swagger2的接口配置
- * 
+ *
 
  */
 @Configuration

+ 2 - 2
fs-framework/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

@@ -18,7 +18,7 @@ import com.fs.framework.interceptor.RepeatSubmitInterceptor;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
@@ -37,7 +37,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;

+ 4 - 5
fs-framework/src/main/java/com/fs/framework/security/filter/JwtAuthenticationTokenFilter.java

@@ -5,9 +5,8 @@ import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.enums.DataSourceType;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.core.config.TenantConfigContext;
-import com.fs.core.config.WxMpProperties;
-import com.fs.core.config.WxPayProperties;
 import com.fs.framework.datasource.DynamicDataSource;
 import com.fs.framework.datasource.DynamicDataSourceContextHolder;
 import com.fs.framework.web.service.TokenService;
@@ -29,7 +28,7 @@ import java.util.List;
 
 /**
  * token过滤器 验证token有效性
- * 
+ *
 
  */
 @Component
@@ -70,7 +69,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
                         TenantConfigContext.set(null);
                     }
 
-                    WxMpProperties.loadTenantConfigsFromContext();
+                    ProjectConfig.loadTenantConfigsFromContext();
                 }
 
                 tokenService.verifyToken(loginUser);
@@ -89,7 +88,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
 //                System.out.println("当前租户公众号 Token = " + cfg.getToken());
 //                System.out.println("当前租户公众号 AesKey = " + cfg.getAesKey());
 //            }
-            WxMpProperties.clearTenantConfigs();
+            ProjectConfig.clearTenantConfigs();
             TenantConfigContext.clear();
             DynamicDataSourceContextHolder.clearDataSourceType();
         }

+ 2 - 2
fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java

@@ -50,8 +50,8 @@ public class ScheduleConfig
         // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
         factory.setOverwriteExistingJobs(true);
         // 设置自动启动,默认为true 切记调整为true
-        factory.setAutoStartup(true);
-//        factory.setAutoStartup(false);
+//        factory.setAutoStartup(true);
+        factory.setAutoStartup(false);
 
         return factory;
     }

+ 1 - 1
fs-qw-mq/src/main/java/com/fs/framework/config/SwaggerConfig.java

@@ -20,7 +20,7 @@ import java.util.List;
 
 /**
  * Swagger2的接口配置
- * 
+ *
 
  */
 @Configuration

+ 2 - 2
fs-qwhook-msg/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
@@ -38,7 +38,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;

+ 2 - 2
fs-qwhook/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
@@ -38,7 +38,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;

+ 2 - 2
fs-redis/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
@@ -38,7 +38,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;

+ 2 - 2
fs-repeat-api/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
@@ -38,7 +38,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;

+ 4 - 4
fs-service/src/main/java/com/fs/config/ai/AiHostProper.java

@@ -7,17 +7,17 @@ import org.springframework.stereotype.Component;
 @Component
 @Data
 public class AiHostProper {
-    @Value("${ipad.ipadUrl}")
+//    @Value("${ipad.ipadUrl}")
     private String ipadUrl;
 
-    @Value("${ipad.aiApi}")
+//    @Value("${ipad.aiApi}")
     private String aiApi;
 
-    @Value("${ipad.voiceApi}")
+//    @Value("${ipad.voiceApi}")
     private String voiceApi;
 
 
-    @Value("${ipad.commonApi}")
+//    @Value("${ipad.commonApi}")
     private String commonApi;
 
 

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

@@ -1,35 +1,35 @@
 package com.fs.config.cloud;
 
+import com.fs.config.saas.ProjectConfig;
 import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 @Component
 @Data
 public class CloudHostProper {
-    @Value("${cloud_host.company_name}")
-    private String companyName;
 
-    @Value("${headerImg.imgUrl}")
+    private String companyName;
     private String headerImg;
-
-    @Value("${cloud_host.projectCode}")
     private String projectCode;
+    private String spaceName;
+    private String volcengineUrl;
 
-    //火山云空间名称
-    @Value("${cloud_host.spaceName}")
-    public String spaceName;
-
-    //火山云空间绑定域名
-    @Value("${cloud_host.volcengineUrl}")
-    public String volcengineUrl;
-
-//    @Value("${cloud_host.accessKey}")
-//    public String accessKey;
-//
-//    @Value("${cloud_host.secretKey}")
-//    public String secretKey;
-//
-//    @Value("${cloud_host.region}")
-//    public String region;
+    @Autowired
+    public CloudHostProper(ProjectConfig projectConfig) {
+        // 从 ProjectConfig Bean 中初始化
+        if (projectConfig != null) {
+            if (projectConfig.getCloudHost() != null) {
+                this.companyName = projectConfig.getCloudHost().getCompanyName();
+                this.projectCode = projectConfig.getCloudHost().getProjectCode();
+                this.spaceName = projectConfig.getCloudHost().getSpaceName();
+                this.volcengineUrl = projectConfig.getCloudHost().getVolcengineUrl();
+            }
+            if (projectConfig.getHeaderImg() != null) {
+                this.headerImg = projectConfig.getHeaderImg().getImgUrl();
+            }
+        }
+    }
 }
+

+ 433 - 0
fs-service/src/main/java/com/fs/config/saas/ProjectConfig.java

@@ -0,0 +1,433 @@
+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 lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 项目配置类
+ * 使用@ConfigurationProperties绑定配置
+ * 注意:Spring Boot默认不支持@ConfigurationProperties从动态源加载
+ * 需要结合PropertySource使用
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "projectconfig")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProjectConfig {
+
+    @JsonProperty("wx")
+    private Wx wx;
+
+    @JsonProperty("aifabu")
+    private Aifabu aifabu;
+
+    @JsonProperty("watch")
+    private Watch watch;
+
+    @JsonProperty("fs")
+    private Fs fs;
+
+    @JsonProperty("nuonuo")
+    private Nuonuo nuonuo;
+
+    @JsonProperty("tencent_cloud_config")
+    private TencentCloudConfig tencentCloudConfig;
+
+    @JsonProperty("cloud_host")
+    private CloudHost cloudHost;
+
+    @JsonProperty("headerImg")
+    private HeaderImg headerImg;
+
+    @JsonProperty("ipad")
+    private Ipad ipad;
+
+    @JsonProperty("wx_miniapp_temp")
+    private WxMiniappTemp wxMiniappTemp;
+
+    @JsonProperty("jst")
+    private Jst jst;
+
+    @JsonProperty("rocketmq")
+    private Rocketmq rocketmq;
+
+    @JsonProperty("custom")
+    private Custom custom;
+
+    @JsonProperty("token")
+    private Token token;
+
+    @JsonProperty("openIM")
+    private OpenIM openIM;
+
+    @JsonProperty("isNewWxMerchant")
+    private Boolean isNewWxMerchant;
+
+    @JsonProperty("im")
+    private Im im;
+
+    @Data
+    public static class Wx {
+        private Miniapp miniapp;
+        private Cp cp;
+        private Pay pay;
+        private Mp mp;
+        private Open open; // 需要添加open配置
+
+        @Data
+        public static class Miniapp {
+            private List<Config> configs;
+
+            @Data
+            public static class Config {
+                private String appid;
+                private String secret;
+                private String token;
+                private String aesKey;
+                private String msgDataFormat;
+            }
+        }
+
+        @Data
+        public static class Cp {
+            private String corpId;
+            private List<AppConfig> appConfigs;
+
+            @Data
+            public static class AppConfig {
+                private Integer agentId;
+                private String secret;
+                private String token;
+                private String aesKey;
+            }
+        }
+
+        @Data
+        public static class Pay {
+            private String appId;
+            private String mchId;  // 改为String,因为您的JSON中是字符串"1611402045"
+            private String mchKey;
+            private String subAppId;
+            private String subMchId;
+            private String keyPath;
+            private String notifyUrl;
+        }
+
+        @Data
+        public static class Mp {
+            private Boolean useRedis;
+            private RedisConfig redisConfig;
+            private List<Config> configs;
+
+            @Data
+            public static class RedisConfig {
+                private String host;
+                private Integer port;
+                private Integer timeout;
+            }
+
+            @Data
+            public static class Config {
+                private String appId;
+                private String secret;
+                private String token;
+                private String aesKey;
+            }
+        }
+
+        @Data
+        public static class Open {
+            private String appId;
+            private String secret;
+        }
+    }
+
+    @Data
+    public static class Aifabu {
+        @JsonProperty("appKey")
+        private String appKey;
+    }
+
+    @Data
+    public static class Watch {
+        @JsonProperty("watchUrl")
+        private String watchUrl;
+
+        @JsonProperty("account1")
+        private String account1;
+
+        @JsonProperty("password1")
+        private String password1;
+
+        @JsonProperty("account2")
+        private String account2;
+
+        @JsonProperty("password2")
+        private String password2;
+
+        @JsonProperty("account3")
+        private String account3;
+
+        @JsonProperty("password3")
+        private String password3;
+    }
+
+    @Data
+    public static class Fs {
+        @JsonProperty("commonApi")
+        private String commonApi;
+
+        @JsonProperty("h5CommonApi")
+        private String h5CommonApi;
+
+        @JsonProperty("jwt")
+        private Jwt jwt;
+
+        @Data
+        public static class Jwt {
+            @JsonProperty("secret")
+            private String secret;
+
+            @JsonProperty("expire")
+            private Long expire;  // 改为Long
+
+            @JsonProperty("header")
+            private String header;
+        }
+    }
+
+    @Data
+    public static class Nuonuo {
+        @JsonProperty("key")
+        private String key;  // 改为String,JSON中是"10924508"
+
+        @JsonProperty("secret")
+        private String secret;
+    }
+
+    @Data
+    @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
+    public static class TencentCloudConfig {
+        @JsonProperty("secret_id")
+        private String secretId;
+
+        @JsonProperty("secret_key")
+        private String secretKey;
+
+        @JsonProperty("bucket")
+        private String bucket;
+
+        @JsonProperty("app_id")
+        private String appId;
+
+        @JsonProperty("region")
+        private String region;
+
+        @JsonProperty("proxy")
+        private String proxy;
+    }
+
+    @Data
+    public static class CloudHost {
+        @JsonProperty("company_name")
+        private String companyName;
+
+        @JsonProperty("projectCode")
+        private String projectCode;
+
+        @JsonProperty("spaceName")
+        private String spaceName;
+
+        @JsonProperty("volcengineUrl")
+        private String volcengineUrl;
+    }
+
+    @Data
+    public static class HeaderImg {
+        @JsonProperty("imgUrl")
+        private String imgUrl;
+    }
+
+    @Data
+    public static class Ipad {
+        @JsonProperty("url")
+        private String url;
+
+        @JsonProperty("ipadUrl")
+        private String ipadUrl;
+
+        @JsonProperty("aiApi")
+        private String aiApi;
+
+        @JsonProperty("voiceApi")
+        private String voiceApi;
+
+        @JsonProperty("commonApi")
+        private String commonApi;
+    }
+
+    @Data
+    public static class WxMiniappTemp {
+        @JsonProperty("pay_order_temp_id")
+        private String payOrderTempId;
+
+        @JsonProperty("inquiry_temp_id")
+        private String inquiryTempId;
+    }
+
+    @Data
+    public static class Jst {
+        @JsonProperty("app_key")
+        private String appKey;
+
+        @JsonProperty("app_secret")
+        private String appSecret;
+
+        @JsonProperty("authorization_code")
+        private Integer authorizationCode;
+
+        @JsonProperty("shop_code")
+        private String shopCode;
+    }
+
+    @Data
+    public static class Rocketmq {
+        @JsonProperty("name-server")
+        private String nameServer;
+
+        @JsonProperty("producer")
+        private Producer producer;
+
+        @Data
+        public static class Producer {
+            @JsonProperty("group")
+            private String group;
+
+            @JsonProperty("send-message-timeout")
+            private Integer sendMessageTimeout;
+
+            @JsonProperty("retry-times-when-send-failed")
+            private Integer retryTimesWhenSendFailed;
+
+            @JsonProperty("retry-times-when-send-async-failed")
+            private Integer retryTimesWhenSendAsyncFailed;
+
+            @JsonProperty("max-message-size")
+            private Integer maxMessageSize;
+
+            @JsonProperty("compress-message-body-threshold")
+            private Integer compressMessageBodyThreshold;
+
+            @JsonProperty("retry-next-server")
+            private Boolean retryNextServer;
+        }
+    }
+
+    @Data
+    public static class Custom {
+        @JsonProperty("token")
+        private String token;
+
+        @JsonProperty("encoding-aes-key")
+        private String encodingAesKey;
+
+        @JsonProperty("corp-id")
+        private String corpId;
+
+        @JsonProperty("secret")
+        private String secret;
+
+        @JsonProperty("private-key-path")
+        private String privateKeyPath;
+
+        @JsonProperty("webhook-url")
+        private String webhookUrl;
+    }
+
+    @Data
+    public static class Token {
+        @JsonProperty("header")
+        private String header;
+
+        @JsonProperty("secret")
+        private String secret;
+
+        @JsonProperty("expireTime")
+        private Integer expireTime;
+    }
+
+    @Data
+    public static class OpenIM {
+        @JsonProperty("secret")
+        private String secret;
+
+        @JsonProperty("userID")
+        private String userID;
+
+        @JsonProperty("url")
+        private String url;
+    }
+
+    @Data
+    public static class Im {
+        @JsonProperty("type")
+        private String type;
+    }
+    /**
+     * 当前请求租户的配置副本,ThreadLocal
+     */
+    private static final ThreadLocal<List<ProjectConfig.Wx.Mp.Config>> TENANT_CONFIGS = new ThreadLocal<>();
+
+    /**
+     * 设置当前请求租户配置
+     */
+    public static void setTenantConfigs(List<ProjectConfig.Wx.Mp.Config> tenantConfigs) {
+        TENANT_CONFIGS.set(tenantConfigs);
+    }
+
+    /**
+     * 清理 ThreadLocal
+     */
+    public static void clearTenantConfigs() {
+        TENANT_CONFIGS.remove();
+    }
+
+    /**
+     * 从 TenantConfigContext 生成当前请求租户 configs 副本
+     */
+    public static void loadTenantConfigsFromContext() {
+        JSONObject tenantCfg = TenantConfigContext.get();
+        List<ProjectConfig.Wx.Mp.Config> mpConfigs = new ArrayList<>();
+
+        if (tenantCfg != null) {
+            JSONObject mp = tenantCfg.getJSONObject("wx").getJSONObject("mp");
+            if (mp != null) {
+                JSONArray arr = mp.getJSONArray("configs");
+                if (arr != null) {
+                    for (int i = 0; i < arr.size(); i++) {
+                        JSONObject cfgJson = arr.getJSONObject(i);
+                        ProjectConfig.Wx.Mp.Config cfg = new ProjectConfig.Wx.Mp.Config();
+                        cfg.setAppId(cfgJson.getString("appId"));
+                        cfg.setSecret(cfgJson.getString("secret"));
+                        cfg.setToken(cfgJson.getString("token"));
+                        cfg.setAesKey(cfgJson.getString("aesKey"));
+                        mpConfigs.add(cfg);
+                    }
+                }
+            }
+        }
+
+        setTenantConfigs(mpConfigs);
+    }
+}

+ 17 - 4
fs-service/src/main/java/com/fs/config/tencent/TencentCOSClientConfig.java

@@ -1,25 +1,38 @@
 package com.fs.config.tencent;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baidu.dev2.thirdparty.jackson.core.JsonProcessingException;
+import com.baidu.dev2.thirdparty.jackson.databind.ObjectMapper;
+import com.fs.config.saas.ProjectConfig;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.ClientConfig;
 import com.qcloud.cos.auth.BasicCOSCredentials;
 import com.qcloud.cos.auth.COSCredentials;
 import com.qcloud.cos.region.Region;
 import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
 
 @Component
 @AllArgsConstructor
 public class TencentCOSClientConfig {
-    private final TencentProperties tencentProperties;
-
+@Autowired
+private SysConfigMapper sysConfigMapper;
     @Bean
     private COSClient createClient() {
+
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.TencentCloudConfig tencentProperties = projectConfig.getTencentCloudConfig();
         // 初始化用户身份信息(secretId, secretKey)
-        COSCredentials cred = new BasicCOSCredentials(tencentProperties.secretId, tencentProperties.secretKey);
+        COSCredentials cred = new BasicCOSCredentials(tencentProperties.getSecretId(), tencentProperties.getSecretKey());
         // 设置bucket的区域, COS地域的简称请参照 https://www.qcloud.com/document/product/436/6224
-        ClientConfig clientConfig = new ClientConfig(new Region(tencentProperties.region));
+        ClientConfig clientConfig = new ClientConfig(new Region(tencentProperties.getRegion()));
         // 生成cos客户端
         return new COSClient(cred, clientConfig);
     }

+ 0 - 22
fs-service/src/main/java/com/fs/config/tencent/TencentProperties.java

@@ -1,22 +0,0 @@
-package com.fs.config.tencent;
-
-import lombok.Data;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-@Component
-@Data
-public class TencentProperties {
-    @Value("${tencent_cloud_config.secret_id}")
-    public String secretId;
-    @Value("${tencent_cloud_config.secret_key}")
-    public String secretKey;
-    @Value("${tencent_cloud_config.bucket}")
-    public String bucket;
-    @Value("${tencent_cloud_config.app_id}")
-    public String appId;
-    @Value("${tencent_cloud_config.region}")
-    public String region;
-    @Value("${tencent_cloud_config.proxy}")
-    public String proxy;
-}

+ 13 - 4
fs-service/src/main/java/com/fs/core/config/WxMpConfiguration.java

@@ -1,11 +1,16 @@
 package com.fs.core.config;
 
+import com.alibaba.fastjson.JSONObject;
+import com.fs.config.saas.ProjectConfig;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.fs.wx.mp.handler.*;
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.mp.api.WxMpMessageRouter;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
 import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -25,7 +30,6 @@ import static me.chanjar.weixin.mp.constant.WxMpEventConstants.POI_CHECK_NOTIFY;
 
 @AllArgsConstructor
 @Configuration
-@EnableConfigurationProperties(WxMpProperties.class)
 public class WxMpConfiguration {
     private final LogHandler logHandler;
     private final NullHandler nullHandler;
@@ -37,13 +41,18 @@ public class WxMpConfiguration {
     private final UnsubscribeHandler unsubscribeHandler;
     private final SubscribeHandler subscribeHandler;
     private final ScanHandler scanHandler;
-    private final WxMpProperties properties;
-
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
     @Bean
     @Scope("prototype") // 每次获取新的 WxMpService 实例,避免单例缓存导致多租户问题
     public WxMpService wxMpService() {
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        List<ProjectConfig.Wx.Mp.Config> configs= projectConfig.getWx().getMp().getConfigs();
         // 从 WxMpProperties 获取当前请求租户配置
-        final List<WxMpProperties.MpConfig> configs = this.properties.getConfigs();
+//        final List<WxMpProperties.MpConfig> configs = this.properties.getConfigs();
 
         if (configs == null || configs.isEmpty()) {
             throw new RuntimeException("当前租户未配置微信公众号!请检查 TenantConfigContext 或 yml 配置");

+ 0 - 120
fs-service/src/main/java/com/fs/core/config/WxMpProperties.java

@@ -1,120 +0,0 @@
-package com.fs.core.config;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * wechat mp properties
- *
- * @author <a href="https://github.com/binarywang">Binary Wang</a>
- */
-@Data
-@ConfigurationProperties(prefix = "wx.mp")
-public class WxMpProperties {
-
-    /**
-     * 是否使用redis存储access token
-     */
-    private boolean useRedis;
-
-    /**
-     * redis 配置
-     */
-    private RedisConfig redisConfig;
-
-    /**
-     * 默认 yml 配置
-     */
-    private List<MpConfig> configs;
-
-    /**
-     * 当前请求租户的配置副本,ThreadLocal
-     */
-    private static final ThreadLocal<List<MpConfig>> TENANT_CONFIGS = new ThreadLocal<>();
-
-    /**
-     * 设置当前请求租户配置
-     */
-    public static void setTenantConfigs(List<MpConfig> tenantConfigs) {
-        TENANT_CONFIGS.set(tenantConfigs);
-    }
-
-    /**
-     * 清理 ThreadLocal
-     */
-    public static void clearTenantConfigs() {
-        TENANT_CONFIGS.remove();
-    }
-
-    /**
-     * 遍历 configs 时,优先返回当前请求租户配置
-     */
-    public List<MpConfig> getConfigs() {
-        List<MpConfig> tenantCfgs = TENANT_CONFIGS.get();
-        return tenantCfgs != null ? tenantCfgs : configs;
-    }
-
-    @Data
-    public static class RedisConfig {
-        /**
-         * redis服务器 主机地址
-         */
-        private String host;
-
-        /**
-         * redis服务器 端口号
-         */
-        private Integer port;
-
-        /**
-         * redis服务器 密码
-         */
-        private String password;
-
-        /**
-         * redis 服务连接超时时间
-         */
-        private Integer timeout;
-    }
-
-    @Data
-    public static class MpConfig {
-        private String appId;
-        private String secret;
-        private String token;
-        private String aesKey;
-    }
-
-    /**
-     * 从 TenantConfigContext 生成当前请求租户 configs 副本
-     */
-    public static void loadTenantConfigsFromContext() {
-        JSONObject tenantCfg = TenantConfigContext.get();
-        List<MpConfig> mpConfigs = new ArrayList<>();
-
-        if (tenantCfg != null) {
-            JSONObject mp = tenantCfg.getJSONObject("wx").getJSONObject("mp");
-            if (mp != null) {
-                JSONArray arr = mp.getJSONArray("configs");
-                if (arr != null) {
-                    for (int i = 0; i < arr.size(); i++) {
-                        JSONObject cfgJson = arr.getJSONObject(i);
-                        MpConfig cfg = new MpConfig();
-                        cfg.setAppId(cfgJson.getString("appId"));
-                        cfg.setSecret(cfgJson.getString("secret"));
-                        cfg.setToken(cfgJson.getString("token"));
-                        cfg.setAesKey(cfgJson.getString("aesKey"));
-                        mpConfigs.add(cfg);
-                    }
-                }
-            }
-        }
-
-        setTenantConfigs(mpConfigs);
-    }
-}

+ 1 - 1
fs-service/src/main/java/com/fs/course/mapper/FsCoursePlaySourceConfigMapper.java

@@ -17,6 +17,6 @@ public interface FsCoursePlaySourceConfigMapper extends BaseMapper<FsCoursePlayS
      */
     List<FsCoursePlaySourceConfigVO> selectCoursePlaySourceConfigVOListByMap(@Param("params") Map<String, Object> params);
 
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     FsCoursePlaySourceConfig selectCoursePlaySourceConfigByAppId(String appId);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/course/mapper/FsVideoBarrageMapper.java

@@ -34,7 +34,7 @@ public interface FsVideoBarrageMapper extends BaseMapper<FsVideoBarrage>{
      * @param fsVideoBarrage 视频弹幕
      * @return 视频弹幕集合
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<FsVideoBarrageVO> selectFsVideoBarrageList(FsVideoBarrageQueryParam fsVideoBarrage);
 
     /**

+ 1 - 1
fs-service/src/main/java/com/fs/course/service/HsyAssumeRoleService.java

@@ -33,7 +33,7 @@ public class HsyAssumeRoleService {
 //        stsService.setSecretKey("WXpjelpUYzFOakF5TUdObE5EZGtNR0ZsWXpKaU1tTmtZakk1WXpObE4yRQ==");
 
         AssumeRoleRequest request = new AssumeRoleRequest();
-        request.setRoleSessionName(cloudHostProper.spaceName);
+        request.setRoleSessionName(cloudHostProper.getSpaceName());
         request.setDurationSeconds(900);
         request.setRoleTrn(role_trn);
 

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

@@ -9,6 +9,7 @@ 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;
@@ -35,9 +36,8 @@ import com.fs.course.service.IFsCourseFinishTempParentService;
 @RequiredArgsConstructor
 public class FsCourseFinishTempParentServiceImpl extends ServiceImpl<FsCourseFinishTempParentMapper, FsCourseFinishTempParent> implements IFsCourseFinishTempParentService {
 
-
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
+    @Autowired
+    private ProjectConfig projectConfig;
 
     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(signProjectName) ? fsCourseFinishTempParent.getStatus() : 0L;
+        Long currentStatus = "济南联志健康".equals(projectConfig.getCloudHost().getCompanyName()) ? fsCourseFinishTempParent.getStatus() : 0L;
         videoList.forEach(e -> {
             FsCourseFinishTemp temp = new FsCourseFinishTemp();
             temp.setName(e.getFileName());

+ 9 - 10
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -30,6 +30,7 @@ import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.service.ICompanyService;
 import com.fs.config.cloud.CloudHostProper;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.config.RandomRedPacketConfig;
 import com.fs.course.config.RandomRedPacketRule;
@@ -122,11 +123,9 @@ import static com.fs.course.utils.LinkUtil.generateRandomStringWithLock;
 @Slf4j
 @Service
 public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoMapper, FsUserCourseVideo> implements IFsUserCourseVideoService {
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
-    @Value("${isNewWxMerchant}")
-    private Boolean isNewWxMerchant;
 
+    @Autowired
+    private ProjectConfig projectConfig;
     @Autowired
     private OpenIMService openIMService;
     @Autowired
@@ -1175,7 +1174,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     }
 
     private R addCustomerService(String qwUserById,String msg){
-        if ("济南联志健康".equals(signProjectName)){
+        if ("济南联志健康".equals(projectConfig.getCloudHost().getCompanyName())){
             return R.error(400,msg).put("qrcode", "");
         }
         String json = configService.selectConfigByKey("course.config");
@@ -1710,7 +1709,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
 
         //判断是否走服务号openId发红包
-        if (config.getMiniAppAuthType() == 2 && user.getMpOpenId() != null && !isNewWxMerchant) {
+        if (config.getMiniAppAuthType() == 2 && user.getMpOpenId() != null && !projectConfig.getIsNewWxMerchant()) {
             packetParam.setOpenId(user.getMpOpenId());
         } else {
             //查询是否绑定小程序
@@ -1993,7 +1992,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
 //            if (company.getCourseMiniAppId()==null){
 //                return R.error("销售公司参数错误,未绑定小程序");
 //            }
-            if (user.getMpOpenId() != null && !isNewWxMerchant) {
+            if (user.getMpOpenId() != null && !projectConfig.getIsNewWxMerchant()) {
                 packetParam.setOpenId(user.getMpOpenId());
             } else {
                 //查询是否绑定小程序
@@ -2615,7 +2614,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         }
 
         if (userCompanyUser.getStatus() == 2) {
-            if ("福本源".equals(signProjectName)) {
+            if ("福本源".equals(projectConfig.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());
@@ -2637,7 +2636,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
             }
         }
         // 项目看课数限制
-        if (!EXCLUDE_PROJECTS.contains(signProjectName) && !CloudHostUtils.hasCloudHostName("弘德堂")) {
+        if (!EXCLUDE_PROJECTS.contains(projectConfig.getCloudHost().getCompanyName()) && !CloudHostUtils.hasCloudHostName("弘德堂")) {
             log.error("进入了看课限制:传入参数:={},watchCourseVideo={}",param, watchCourseVideo);
             Integer logCount = fsUserCourseMapper.selectTodayCourseWatchLogCountByUserIdAndProjectId(param.getUserId(), courseProject);
             if (CloudHostUtils.hasCloudHostName("四川致医") ) {
@@ -4416,7 +4415,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
                 //更新视频资源
 //                String storeUri = resp.getResult().getMediaInfoList(0).getSourceInfo().getStoreUri();
 //                String uri = storeUri.substring(storeUri.indexOf("/") + 1);
-                String url = cloudHostProper.volcengineUrl+"/"+resp.getResult().getMediaInfoList(0).getSourceInfo().getFileName();
+                String url = cloudHostProper.getVolcengineUrl()+"/"+resp.getResult().getMediaInfoList(0).getSourceInfo().getFileName();
 
                 FsVideoResource fsVideoResource = new FsVideoResource();
                 fsVideoResource.setId(videoResource.getId());

+ 42 - 16
fs-service/src/main/java/com/fs/course/service/impl/TencentCloudCosService.java

@@ -1,12 +1,16 @@
 package com.fs.course.service.impl;
 
+import com.baidu.dev2.thirdparty.jackson.core.JsonProcessingException;
+import com.baidu.dev2.thirdparty.jackson.databind.ObjectMapper;
 import com.fs.common.core.domain.R;
-import com.fs.config.tencent.TencentProperties;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.course.domain.FsUserCourseVideo;
 import com.fs.course.domain.FsVideoResource;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.mapper.FsVideoResourceMapper;
 import com.fs.course.service.ITencentCloudCosService;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.exception.CosClientException;
 import com.qcloud.cos.exception.CosServiceException;
@@ -38,8 +42,8 @@ import java.util.*;
 @AllArgsConstructor
 public class TencentCloudCosService implements ITencentCloudCosService {
     private final COSClient cosClient;
-    private final TencentProperties tencentProperties;
-
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
 
     @Override
     public R getKeyAndCredentials() {
@@ -70,17 +74,36 @@ public class TencentCloudCosService implements ITencentCloudCosService {
         return cosKey;
     }
 
+    /**
+     * 查询配置文件
+     *
+     * @return
+     */
+    private ProjectConfig.TencentCloudConfig getTencentCloudConfig(){
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+
+        ProjectConfig projectConfig = com.alibaba.fastjson.JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.TencentCloudConfig tencentProperties = projectConfig.getTencentCloudConfig();
+        return tencentProperties;
+    }
+
     public TreeMap<String,Object> getConfig(){
 
-        String secretId = tencentProperties.secretId;//用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
-        String secretKey = tencentProperties.secretKey; ;//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
+        ProjectConfig.TencentCloudConfig tencentProperties =getTencentCloudConfig();
+
+        String secretId = tencentProperties.getSecretId();//用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
+        String secretKey = tencentProperties.getSecretKey(); ;//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
 
 //          String  secretId = YL_SECRET_ID;
 //            String  secretKey = YL_SECRET_KEY;
-        String bucket = tencentProperties.bucket;
-        String appId = tencentProperties.appId;
-        String region = tencentProperties.region;
-        String proxy = tencentProperties.proxy;
+        String bucket = tencentProperties.getBucket();
+        String appId = tencentProperties.getAppId();
+        String region = tencentProperties.getRegion();
+        String proxy = tencentProperties.getProxy();
 
 
         int durationSeconds = 1800;
@@ -221,8 +244,9 @@ public class TencentCloudCosService implements ITencentCloudCosService {
     }
 
     private byte[] getObjectInputStream() throws IOException {
+        ProjectConfig.TencentCloudConfig tencentProperties =getTencentCloudConfig();
         String key = "test/my_test.json";
-        GetObjectRequest getObjectRequest = new GetObjectRequest(tencentProperties.bucket, key);
+        GetObjectRequest getObjectRequest = new GetObjectRequest(tencentProperties.getBucket(), key);
         InputStream cosObjectInput = null;
 
         try {
@@ -276,12 +300,13 @@ public class TencentCloudCosService implements ITencentCloudCosService {
     }
 
     private MpsClient createMpsClient() {
-        Credential cred = new Credential(tencentProperties.secretId, tencentProperties.secretKey);
+        ProjectConfig.TencentCloudConfig tencentProperties =getTencentCloudConfig();
+        Credential cred = new Credential(tencentProperties.getSecretId(), tencentProperties.getSecretKey());
         HttpProfile httpProfile = new HttpProfile();
         httpProfile.setEndpoint("mps.tencentcloudapi.com");
         ClientProfile clientProfile = new ClientProfile();
         clientProfile.setHttpProfile(httpProfile);
-        return new MpsClient(cred, tencentProperties.region, clientProfile);
+        return new MpsClient(cred, tencentProperties.getRegion(), clientProfile);
     }
     public String replaceCourse(String input) {
         if (input == null) {
@@ -291,12 +316,13 @@ public class TencentCloudCosService implements ITencentCloudCosService {
     }
 
     public void submitTranscodeJob(String inputPath,String outputPath) {
+        ProjectConfig.TencentCloudConfig tencentProperties =getTencentCloudConfig();
         try {
             // 输入文件配置(COS路径)
             MpsClient client = createMpsClient();
             CosInputInfo cosInputInfo = new CosInputInfo();
-            cosInputInfo.setBucket(tencentProperties.bucket);
-            cosInputInfo.setRegion(tencentProperties.region);
+            cosInputInfo.setBucket(tencentProperties.getBucket());
+            cosInputInfo.setRegion(tencentProperties.getRegion());
             //文件key
             cosInputInfo.setObject(inputPath);
 
@@ -308,8 +334,8 @@ public class TencentCloudCosService implements ITencentCloudCosService {
 
             // 输出配置
             CosOutputStorage cosOutputStorage = new CosOutputStorage();
-            cosOutputStorage.setBucket(tencentProperties.bucket);
-            cosOutputStorage.setRegion(tencentProperties.region);
+            cosOutputStorage.setBucket(tencentProperties.getBucket());
+            cosOutputStorage.setRegion(tencentProperties.getRegion());
 
             TaskOutputStorage taskOutputStorage = new TaskOutputStorage();
             taskOutputStorage.setType("COS");

+ 38 - 8
fs-service/src/main/java/com/fs/event/WeixinTemplateService.java

@@ -4,11 +4,14 @@ package com.fs.event;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.core.config.WxMaConfiguration;
-import com.fs.his.config.WxMiniappTempConfig;
 import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -30,12 +33,18 @@ public class WeixinTemplateService {
     private ConfigUtil configUtil;
     @Autowired
     private IFsUserService userService;
-
     @Autowired
-    WxMiniappTempConfig wxMiniappTempConfig;
+    private SysConfigMapper sysConfigMapper;
+
 
 
     public void cancelOrderNotice(String orderId,String title,String remark,Long uid){
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.WxMiniappTemp wxMiniappTempConfig = projectConfig.getWxMiniappTemp();
+
         String openId = this.getUserOpenid(uid);
         if(StrUtil.isBlank(openId)) {
             return;
@@ -44,21 +53,27 @@ public class WeixinTemplateService {
         //订单号
         map.put("thing1",title);
         map.put("thing4",remark);
-        String tempId = wxMiniappTempConfig.getInquiryTempID();
+        String tempId = wxMiniappTempConfig.getInquiryTempId();
         if(StrUtil.isNotBlank(tempId)) {
             this.sendWxMpTemplateMessage(openId, tempId, "pages_order/inquiryOrderDetails?orderId=" + orderId, map);
         }
     }
     public void receiveOrderNotice(String orderId, String title, String remark, Long uid){
         String openId = this.getUserOpenid(uid);
+
         if(StrUtil.isBlank(openId)) {
             return;
         }
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.WxMiniappTemp wxMiniappTempConfig = projectConfig.getWxMiniappTemp();
         Map<String,String> map = new HashMap<>();
         //订单号
         map.put("thing1",title);
         map.put("thing4",remark);
-        String tempId = wxMiniappTempConfig.getInquiryTempID();;
+        String tempId = wxMiniappTempConfig.getInquiryTempId();;
         if(StrUtil.isNotBlank(tempId)) {
             this.sendWxMpTemplateMessage(openId, tempId, "pages_order/inquiryOrderDetails?orderId=" + orderId, map);
         }
@@ -69,13 +84,18 @@ public class WeixinTemplateService {
         if(StrUtil.isBlank(openId)) {
             return;
         }
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.WxMiniappTemp wxMiniappTempConfig = projectConfig.getWxMiniappTemp();
         Map<String,String> map = new HashMap<>();
         //订单号 2020年5月10日 14:35:40 2020年5月10日14:35:40
         SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
         map.put("time7",df.format(createTime));
         map.put("character_string9",orderCode);
         map.put("thing4",remark);
-        String tempId = wxMiniappTempConfig.getPayOrderTempID();
+        String tempId = wxMiniappTempConfig.getPayOrderTempId();
         if(StrUtil.isNotBlank(tempId)) {
             this.sendWxMpTemplateMessage(openId, tempId, "pages_order/packageOrderDetails?orderId=" + orderId, map);
         }
@@ -86,10 +106,15 @@ public class WeixinTemplateService {
         if(StrUtil.isBlank(openId)) {
             return;
         }
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.WxMiniappTemp wxMiniappTempConfig = projectConfig.getWxMiniappTemp();
         Map<String,String> map = new HashMap<>();
         map.put("thing1",title);
         map.put("thing4",remark);
-        String tempId = wxMiniappTempConfig.getInquiryTempID();
+        String tempId = wxMiniappTempConfig.getInquiryTempId();
         if(StrUtil.isNotBlank(tempId)) {
             this.sendWxMpTemplateMessage(openId, tempId, "pages_user/followList", map);
         }
@@ -100,10 +125,15 @@ public class WeixinTemplateService {
         if(StrUtil.isBlank(openId)) {
             return;
         }
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.WxMiniappTemp wxMiniappTempConfig = projectConfig.getWxMiniappTemp();
         Map<String,String> map = new HashMap<>();
         map.put("thing1",title);
         map.put("thing4",remark);
-        String tempId = wxMiniappTempConfig.getInquiryTempID();
+        String tempId = wxMiniappTempConfig.getInquiryTempId();
         if(StrUtil.isNotBlank(tempId)) {
             this.sendWxMpTemplateMessage(openId, tempId, "pages/TUIKit/TUIPages/TUIConversation/index" , map);
         }

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

@@ -1,19 +1,19 @@
-package com.fs.his.config;
-
-import lombok.Data;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.io.Serializable;
-
-@Data
-@Component
-public class WxMiniappTempConfig implements Serializable {
-
-
-    @Value("${wx_miniapp_temp.pay_order_temp_id}")
-    private String payOrderTempID;
-
-    @Value("${wx_miniapp_temp.inquiry_temp_id}")
-    private String inquiryTempID;
-}
+//package com.fs.his.config;
+//
+//import lombok.Data;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//
+//import java.io.Serializable;
+//
+//@Data
+//@Component
+//public class WxMiniappTempConfig implements Serializable {
+//
+//
+//    @Value("${wx_miniapp_temp.pay_order_temp_id}")
+//    private String payOrderTempID;
+//
+//    @Value("${wx_miniapp_temp.inquiry_temp_id}")
+//    private String inquiryTempID;
+//}

+ 1 - 1
fs-service/src/main/java/com/fs/his/mapper/MerchantAppConfigMapper.java

@@ -32,7 +32,7 @@ public interface MerchantAppConfigMapper extends BaseMapper<MerchantAppConfig>{
      * @param id 商户应用配置主键
      * @return 商户应用配置
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     MerchantAppConfig selectMerchantAppConfigById(Long id);
 
     /**

+ 0 - 3
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -214,9 +214,6 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     @Autowired
     private ICompanyDivItemService companyDivItemService;
 
-    @Value("${cloud_host.company_name}")
-    private String signProjectName;
-
     @Autowired
     private FsStorePaymentErrorMapper fsStorePaymentErrorMapper;
 

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsShippingTemplatesRegionScrmMapper.java

@@ -68,6 +68,6 @@ public interface FsShippingTemplatesRegionScrmMapper
     @Delete("delete from fs_shipping_templates_region where temp_id=#{tempId}")
     int deleteFsShippingTemplatesRegionByTempId(Long tempId);
     @Select("select * from fs_shipping_templates_region where find_in_set(temp_id,#{tempIds}) and find_in_set(city_id,#{cityIds})")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<FsShippingTemplatesRegionScrm> selectFsShippingTemplatesRegionListByTempIdsAndCityIds(@Param("tempIds") String tempIds, @Param("cityIds") String cityIds);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsShippingTemplatesScrmMapper.java

@@ -62,7 +62,7 @@ public interface FsShippingTemplatesScrmMapper
      * @return 结果
      */
     public int deleteFsShippingTemplatesByIds(Long[] id);
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     @Select("select * from fs_shipping_templates where find_in_set(id,#{ids})")
     List<FsShippingTemplatesScrm> selectFsShippingTemplatesByIds(String ids);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCouponUserScrmMapper.java

@@ -25,7 +25,7 @@ public interface FsStoreCouponUserScrmMapper
      * @param id 优惠券发放记录ID
      * @return 优惠券发放记录
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     public FsStoreCouponUserScrm selectFsStoreCouponUserById(Long id);
 
     /**

+ 3 - 3
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductAttrValueScrmMapper.java

@@ -31,7 +31,7 @@ public interface FsStoreProductAttrValueScrmMapper
      * @param id 商品属性值ID
      * @return 商品属性值
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
         public FsStoreProductAttrValueScrm selectFsStoreProductAttrValueById(Long id);
 
     /**
@@ -76,7 +76,7 @@ public interface FsStoreProductAttrValueScrmMapper
     @Delete("delete from fs_store_product_attr_value_scrm where product_id=#{productId}")
     int deleteFsStoreProductAttrValueByProductId(Long productId);
     @Select("select * from fs_store_product_attr_value_scrm where  product_id=#{productId}")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<FsStoreProductAttrValueScrm> selectFsStoreProductAttrValueByProductId(Long productId);
     @Select("select ifnull(stock,0) from fs_store_product_attr_value_scrm where  id=#{productAttrValueId}")
     int selectFsStoreProductStockById(Long productAttrValueId);
@@ -85,7 +85,7 @@ public interface FsStoreProductAttrValueScrmMapper
      * 使用行锁查询规格库存
      */
     @Select("select ifnull(stock,0) from fs_store_product_attr_value_scrm where id=#{productAttrValueId} for update")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     Integer selectProductAttrStockForUpdate(@Param("productAttrValueId") Long productAttrValueId);
 
     @Update("update fs_store_product_attr_value_scrm set stock=stock-#{num},sales=sales+#{num}" +

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductPurchaseLimitScrmMapper.java

@@ -38,7 +38,7 @@ public interface FsStoreProductPurchaseLimitScrmMapper
      * @param userId 用户ID
      * @return 商品限购
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     public FsStoreProductPurchaseLimitScrm selectByProductIdAndUserId(@Param("productId") Long productId, @Param("userId") Long userId);
 
     /**

+ 2 - 2
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java

@@ -36,7 +36,7 @@ public interface FsStoreProductScrmMapper
      * @param productId 商品ID
      * @return 商品
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     public FsStoreProductScrm selectFsStoreProductById(Long productId);
 
     /**
@@ -273,7 +273,7 @@ public interface FsStoreProductScrmMapper
      * 使用行锁查询商品库存
      */
     @Select("select stock from fs_store_product_scrm where product_id=#{productId} for update")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     Integer selectProductStockForUpdate(@Param("productId") Long productId);
     @Update("update fs_store_product_scrm set stock=stock+#{num}, sales=sales-#{num}" +
             " where product_id=#{productId}")

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsUserAddressScrmMapper.java

@@ -74,6 +74,6 @@ public interface FsUserAddressScrmMapper
     Integer delAllAddress(Long userId);
 
     @Select("select * from fs_user_address where user_id=#{uid} and is_default=1 and is_del=0 limit 1")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     FsUserAddress selectFsUserAddressByDefault(long userId);
 }

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/mapper/FsUserScrmMapper.java

@@ -43,7 +43,7 @@ public interface FsUserScrmMapper
      * @param userId 用户ID
      * @return 用户
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     public FsUserScrm selectFsUserById(Long userId);
 
     /**

+ 28 - 16
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -44,6 +44,7 @@ import com.fs.company.service.ICompanyDeptService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.config.cloud.CloudHostProper;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
@@ -106,9 +107,10 @@ import com.fs.hisStore.constants.StoreConstants;
 import com.fs.hisStore.domain.*;
 import com.fs.hisStore.enums.*;
 import com.fs.hisStore.service.*;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.system.service.ISysDictTypeService;
-import com.fs.wx.miniapp.config.WxMaProperties;
 import com.fs.wx.order.domain.FsWxExpressTask;
 import com.fs.wx.order.dto.*;
 import com.fs.wx.order.mapper.FsWxExpressTaskMapper;
@@ -180,7 +182,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     Logger logger = LoggerFactory.getLogger(getClass());
     @Autowired
     private CompanyMoneyLogsMapper moneyLogsMapper;
-
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
     @Autowired
     private CompanyUserUserMapper companyUserUserMapper;
     @Autowired
@@ -375,9 +378,6 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Autowired
     private FsPackageOrderMapper fsPackageOrderMapper;
 
-    @Autowired
-    private WxMaProperties properties;
-
     //ERP 类型到服务的映射
     private Map<Integer, IErpOrderService> erpServiceMap;
     @Autowired
@@ -1065,7 +1065,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             for (FsStoreCartQueryVO vo : carts) {
                 // 检查限购
                 checkAndRecordPurchaseLimit(userId, vo.getProductId(), vo.getCartNum());
-                
+
                 FsStoreCartDTO fsStoreCartDTO = new FsStoreCartDTO();
                 fsStoreCartDTO.setProductId(vo.getProductId());
                 fsStoreCartDTO.setPrice(vo.getPrice());
@@ -3179,25 +3179,25 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         if (product == null) {
             return;
         }
-        
+
         // 如果商品没有设置限购,直接返回
         if (product.getPurchaseLimit() == null || product.getPurchaseLimit() <= 0) {
             return;
         }
-        
+
         // 查询用户已购买的数量
         FsStoreProductPurchaseLimitScrm purchaseLimit = purchaseLimitService.selectByProductIdAndUserId(productId, userId);
         int purchasedNum = 0;
         if (purchaseLimit != null) {
             purchasedNum = purchaseLimit.getNum();
         }
-        
+
         // 检查是否超过限购数量
         if (purchasedNum + num > product.getPurchaseLimit()) {
             int productTotalNum = purchasedNum + num;
             throw new CustomException("该商品限购" + product.getPurchaseLimit() + "件,您已购买" + productTotalNum + "件,无法继续购买");
         }
-        
+
         // 记录限购数量(在订单创建成功后记录,这里先检查)
     }
 
@@ -3214,12 +3214,12 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             if (product == null) {
                 continue;
             }
-            
+
             // 如果商品没有设置限购,跳过
             if (product.getPurchaseLimit() == null || product.getPurchaseLimit() <= 0) {
                 continue;
             }
-            
+
             // 减少限购数量
             purchaseLimitService.decreasePurchaseLimit(vo.getProductId(), order.getUserId(), Math.toIntExact(vo.getNum()));
         }
@@ -4551,7 +4551,14 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Override
     @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
     public R otherPaymentRemain(FsStoreOrderOtherPayParam param) {
-        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.Wx.Miniapp.Config config= projectConfig.getWx().getMiniapp().getConfigs().get(0);
+
+        final WxMaService wxService = WxMaConfiguration.getMaService(config.getAppid());
         try {
             String ip = IpUtil.getRequestIp();
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
@@ -4564,7 +4571,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 user.setStatus(1);
                 user.setMaOpenId(session.getOpenid());
                 user.setUnionId(session.getUnionid());
-                user.setAppId(properties.getConfigs().get(0).getAppid());
+                user.setAppId(config.getAppid());
                 user.setIsWeixinAuth(0);
                 user.setLastIp(ip);
                 user.setCreateTime(new Date());
@@ -4683,7 +4690,12 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Override
     @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
     public R otherPayment(FsStoreOrderOtherPayParam param) {
-        final WxMaService wxService = WxMaConfiguration.getMaService(properties.getConfigs().get(0).getAppid());
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.Wx.Miniapp.Config config= projectConfig.getWx().getMiniapp().getConfigs().get(0);
+        final WxMaService wxService = WxMaConfiguration.getMaService(config.getAppid());
         try {
             String ip = IpUtil.getRequestIp();
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
@@ -4696,7 +4708,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 user.setStatus(1);
                 user.setMaOpenId(session.getOpenid());
                 user.setUnionId(session.getUnionid());
-                user.setAppId(properties.getConfigs().get(0).getAppid());
+                user.setAppId(config.getAppid());
                 user.setIsWeixinAuth(0);
                 user.setLastIp(ip);
                 user.setCreateTime(new Date());

+ 57 - 57
fs-service/src/main/java/com/fs/im/config/IMConfig.java

@@ -1,60 +1,60 @@
-package com.fs.im.config;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-
-@Component
-//@ConfigurationProperties(prefix = "openIM")
-public class IMConfig {
-    @Value("${openIM.secret}")
-    private String secret;
-    @Value("${openIM.userID}")
-    private String userID;
-    @Value("${openIM.url}")
-    private String url;
-//    @Value("${openIM.prefix}")
-//    private String prefix;
-    // 静态常量
-    public static String PREFIX;
-    public static String URL;
-
-    @PostConstruct
-    public void init() {
-//        PREFIX = this.prefix;
-        URL = this.url;
-    }
-
-    public String getSecret() {
-        return secret;
-    }
-
-    public void setSecret(String secret) {
-        this.secret = secret;
-    }
-
-    public String getUserID() {
-        return userID;
-    }
-
-    public void setUserID(String userID) {
-        this.userID = userID;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-//    public String getPrefix() {
-//        return prefix;
+//package com.fs.im.config;
+//
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//
+//import javax.annotation.PostConstruct;
+//
+//@Component
+////@ConfigurationProperties(prefix = "openIM")
+//public class IMConfig {
+////    @Value("${openIM.secret}")
+//    private String secret;
+////    @Value("${openIM.userID}")
+//    private String userID;
+////    @Value("${openIM.url}")
+//    private String url;
+////    @Value("${openIM.prefix}")
+////    private String prefix;
+//    // 静态常量
+//    public static String PREFIX;
+//    public static String URL;
+//
+//    @PostConstruct
+//    public void init() {
+////        PREFIX = this.prefix;
+//        URL = this.url;
+//    }
+//
+//    public String getSecret() {
+//        return secret;
+//    }
+//
+//    public void setSecret(String secret) {
+//        this.secret = secret;
 //    }
 //
-//    public void setPrefix(String scrm) {
-//        this.prefix = scrm;
+//    public String getUserID() {
+//        return userID;
 //    }
-}
+//
+//    public void setUserID(String userID) {
+//        this.userID = userID;
+//    }
+//
+//    public String getUrl() {
+//        return url;
+//    }
+//
+//    public void setUrl(String url) {
+//        this.url = url;
+//    }
+//
+////    public String getPrefix() {
+////        return prefix;
+////    }
+////
+////    public void setPrefix(String scrm) {
+////        this.prefix = scrm;
+////    }
+//}

+ 42 - 104
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.baidu.dev2.thirdparty.jackson.databind.JsonMappingException;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -16,6 +17,7 @@ import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyUserMapper;
+import com.fs.config.saas.ProjectConfig;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.domain.FsUserCompanyUser;
 import com.fs.course.domain.FsUserCourse;
@@ -33,7 +35,6 @@ import com.fs.his.dto.PayloadDTO;
 import com.fs.his.mapper.FsDoctorMapper;
 import com.fs.his.mapper.FsFollowMapper;
 import com.fs.his.mapper.FsUserMapper;
-import com.fs.im.config.IMConfig;
 import com.fs.im.domain.FsImMsgSendDetail;
 import com.fs.im.domain.FsImMsgSendLog;
 import com.fs.im.domain.ImSendLog;
@@ -45,6 +46,8 @@ import com.fs.im.service.OpenIMService;
 import com.fs.im.vo.OpenImMsgCallBackVO;
 import com.fs.im.vo.OpenImResponseDTOTest;
 import com.fs.qw.mapper.QwExternalContactMapper;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.github.pagehelper.util.StringUtil;
 import com.google.common.base.Joiner;
 import lombok.Data;
@@ -67,8 +70,6 @@ import java.util.stream.Collectors;
 @Service
 @Slf4j
 public class OpenIMServiceImpl implements OpenIMService {
-    @Autowired
-    IMConfig imConfig;
     @Autowired
     private RedisCache redisCache;
     @Autowired
@@ -102,14 +103,30 @@ public class OpenIMServiceImpl implements OpenIMService {
     private FsImMsgSendDetailServiceImpl fsImMsgSendDetailServiceImpl;
     @Autowired
     private FsCourseWatchLogMapper fsCourseWatchLogMapper;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    /**
+     * 查询配置文件
+     *
+     * @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;
+    }
 //    @Value("${openIM.prefix}")
 //    private String openImPrefix;
     /*@Autowired
     private IFsUserService fsUserService;*/
     @Override
     public String getAdminToken() {
+        ProjectConfig.OpenIM imConfig = getImConfig();
         Object cachedTokenObj = redisCache.getCacheObject("openImAdminToken:" + imConfig.getUserID());
         if (cachedTokenObj != null) {
             return cachedTokenObj.toString();
@@ -120,7 +137,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         String adminToken = null;
         // 发起 HTTP POST 请求,获取管理员 token
         try {
-            String response = HttpRequest.post(IMConfig.URL+"/auth/get_admin_token")
+            String response = HttpRequest.post(imConfig.getUrl()+"/auth/get_admin_token")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .body(requestBody.toString())
                     .execute()
@@ -288,6 +305,7 @@ public class OpenIMServiceImpl implements OpenIMService {
     }
 
     private  String getIMList( String recvID,String  conversationId)  {
+        ProjectConfig.OpenIM imConfig = getImConfig();
         int pageNumber = 1;
         int pageSize = 20;
         int maxPages = 10; // 最大搜索页数,防止无限循环
@@ -300,7 +318,7 @@ public class OpenIMServiceImpl implements OpenIMService {
                 pagination.put("pageNumber", pageNumber);
                 pagination.put("showNumber", pageSize);
                 requestBody.put("pagination", pagination);
-                String body = HttpRequest.post(IMConfig.URL+"/conversation/get_owner_conversation")
+                String body = HttpRequest.post(imConfig.getUrl()+"/conversation/get_owner_conversation")
                         .header("operationID", String.valueOf(System.currentTimeMillis()))
                         .header("token", adminToken)
                         .body(requestBody.toString())
@@ -338,93 +356,6 @@ public class OpenIMServiceImpl implements OpenIMService {
         }
         return null;
     }
-
-    //批量修改销售名称,由昵称-公司名,改为昵称
-    public static void main(String[] args) {
-        String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJpbUFkbWluIiwiUGxhdGZvcm1JRCI6MTAsImV4cCI6MTc1OTkxMDgwNywiaWF0IjoxNzUyMTM0ODAyfQ.y0akpb-TnOBqJewPUD13tnUeR1iF41A3CcgaXXsjyKE";
-        long time = System.currentTimeMillis();
-        int pageSize = 5000;
-        int pageNumber = 1;
-
-        while (true) {
-            // 构建分页查询请求体
-            JSONObject requestPage = new JSONObject();
-            JSONObject pagination = new JSONObject();
-            pagination.put("pageNumber", pageNumber);
-            pagination.put("showNumber", pageSize);
-            requestPage.put("pagination", pagination);
-
-            String result = HttpRequest.post(IMConfig.URL+"/user/get_all_users_uid")
-                    .header("operationID", String.valueOf(time))
-                    .header("token", token)
-                    .body(requestPage.toString())
-                    .execute()
-                    .body();
-
-            OpenImResponseDTO responseDTO = JSONUtil.toBean(result, OpenImResponseDTO.class);
-            List<String> userIDs = (List<String>) responseDTO.getData().get("userIDs");
-
-            if (CollectionUtil.isEmpty(userIDs)) {
-                System.out.println("数据为空,处理结束");
-                break;
-            }
-
-            // 过滤出以C开头的用户ID
-            List<String> userIds = userIDs.stream()
-                    .filter(uid -> uid.startsWith("C"))
-                    .collect(Collectors.toList());
-
-            if (CollectionUtil.isNotEmpty(userIds)) {
-                Map<String, Object> paramMap = new HashMap<>();
-                paramMap.put("userIDs", userIds);
-
-                String jsonBody = JSONUtil.toJsonStr(paramMap);
-                String result1 = HttpRequest.post(IMConfig.URL+"/user/get_users_info")
-                        .header("operationID", String.valueOf(time))
-                        .header("token", token)
-                        .body(jsonBody)
-                        .execute()
-                        .body();
-
-                OpenImResponseDTOTest responseDTO1 = JSONUtil.toBean(result1, OpenImResponseDTOTest.class);
-                List<UserInfo> users = responseDTO1.getData().getUsersInfo();
-
-                for (UserInfo user : users) {
-                    if (StringUtil.isNotEmpty(user.getNickname()) && user.getNickname().contains("-")) {
-                        UpdateUserInfo updateUserInfo = new UpdateUserInfo();
-                        updateUserInfo.setUserID(user.getUserID());
-                        updateUserInfo.setNickname(user.getNickname().split("-")[0]);
-                        updateUserInfo.setFaceURL(Optional.ofNullable(user.getFaceURL()).orElse(""));
-                        updateUserInfo.setEx(Optional.ofNullable(user.getEx()).orElse(""));
-
-                        Map<String, Object> bodyMap = new HashMap<>();
-                        bodyMap.put("userInfo", updateUserInfo);
-
-                        String jsonBody1 = JSONUtil.toJsonStr(bodyMap);
-                        String result2 = HttpRequest.post(IMConfig.URL+"/user/update_user_info_ex")
-                                .header("operationID", String.valueOf(System.currentTimeMillis()))
-                                .header("token", token)
-                                .body(jsonBody1)
-                                .execute()
-                                .body();
-
-                        OpenImResponseDTO responseDTO2 = JSONUtil.toBean(result2, OpenImResponseDTO.class);
-                        if (responseDTO2.getErrCode() != 0) {
-                            System.out.println("更新失败 userID=" + user.getUserID() + ",错误信息:" + responseDTO2.getErrMsg());
-                        }
-                    }
-                }
-            }
-
-            System.out.println("已处理第 " + pageNumber + " 页,共处理用户数:" + userIDs.size());
-            if (userIDs.size() < pageSize) {
-                System.out.println("已是最后一页,处理完毕!");
-                break;
-            }
-            pageNumber++; // 下一页
-        }
-    }
-
     /**
      * 修改im用户信息
      * @param companyUser
@@ -432,6 +363,7 @@ public class OpenIMServiceImpl implements OpenIMService {
      */
     @Override
     public OpenImResponseDTO updateUserInfo(CompanyUser companyUser){
+        ProjectConfig.OpenIM imConfig = getImConfig();
         String adminToken = getAdminToken();
         long time = System.currentTimeMillis();
         OpenImResponseDTO responseDTO = null;
@@ -441,7 +373,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         paramMap.put("userIDs", userIDs);
 
         String jsonBody = JSONUtil.toJsonStr(paramMap);
-        String result1 = HttpRequest.post(IMConfig.URL+"/user/get_users_info")
+        String result1 = HttpRequest.post(imConfig.getUrl()+"/user/get_users_info")
                 .header("operationID", String.valueOf(time))
                 .header("token", adminToken)
                 .body(jsonBody)
@@ -463,7 +395,7 @@ public class OpenIMServiceImpl implements OpenIMService {
             Map<String, Object> bodyMap = new HashMap<>();
             bodyMap.put("userInfo", updateUserInfo);
             String jsonBody1 = JSONUtil.toJsonStr(bodyMap);
-            String result2 = HttpRequest.post(IMConfig.URL+"/user/update_user_info_ex")
+            String result2 = HttpRequest.post(imConfig.getUrl()+"/user/update_user_info_ex")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(jsonBody1)
@@ -496,10 +428,11 @@ public class OpenIMServiceImpl implements OpenIMService {
 
     @Override
     public OpenImResponseDTO openIMSendMsg(OpenImMsgDTO openImMsgDTO) {
+        ProjectConfig.OpenIM imConfig = getImConfig();
         log.info("进入发消息的方法");
         String adminToken = getAdminToken();
         JSONObject jsonObject = new JSONObject(openImMsgDTO);
-        String url = IMConfig.URL+"/msg/send_msg";
+        String url = imConfig.getUrl()+"/msg/send_msg";
         log.info("请求url: {}",url);
         log.info("发送消息的请求体:\n{}", jsonObject.toString());
         long time = new Date().getTime();
@@ -811,7 +744,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         String adminToken = getAdminToken();
         ObjectMapper objectMapper = new ObjectMapper();
         String requestBody = objectMapper.writeValueAsString(dto);
-
+        ProjectConfig.OpenIM imConfig = getImConfig();
         int retryCount = 0;
         int maxRetries = 3;
         OpenImResponseDTO responseDTO = null;
@@ -819,7 +752,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         while (retryCount < maxRetries) {
             try {
                 JSONObject jsonObject = new JSONObject(dto);
-                String body = HttpRequest.post(IMConfig.URL+"/conversation/set_conversations")
+                String body = HttpRequest.post(imConfig.getUrl()+"/conversation/set_conversations")
                         .header("operationID", String.valueOf(System.currentTimeMillis()))
                         .header("token", adminToken)
                         .body(jsonObject.toString())
@@ -847,11 +780,12 @@ public class OpenIMServiceImpl implements OpenIMService {
      */
     @Override
     public OpenImResponseDTO isFriend(String userID1, String userID2) {
+        ProjectConfig.OpenIM imConfig = getImConfig();
         String adminToken = getAdminToken();
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("userID1",userID1);
         jsonObject.put("userID2",userID2);
-        String body = HttpRequest.post(IMConfig.URL+"/friend/is_friend")
+        String body = HttpRequest.post(imConfig.getUrl()+"/friend/is_friend")
                 .header("operationID", String.valueOf(System.currentTimeMillis()))
                 .header("token", adminToken)
                 .body(jsonObject.toString())
@@ -865,6 +799,7 @@ public class OpenIMServiceImpl implements OpenIMService {
      */
     @Override
     public OpenImResponseDTO importFriend(String ownerUserID, List<String> friendUserIDs) {
+        ProjectConfig.OpenIM imConfig = getImConfig();
         //先检查用户是否存在好友关系
         List<String> newFriendIds = new ArrayList<>();
         for (String friendUserID : friendUserIDs) {
@@ -888,7 +823,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("ownerUserID",ownerUserID);
         jsonObject.put("friendUserIDs",newFriendIds);
-        String body = HttpRequest.post(IMConfig.URL+"/friend/import_friend")
+        String body = HttpRequest.post(imConfig.getUrl()+"/friend/import_friend")
                 .header("operationID", String.valueOf(System.currentTimeMillis()))
                 .header("token", adminToken)
                 .body(jsonObject.toString())
@@ -905,6 +840,7 @@ public class OpenIMServiceImpl implements OpenIMService {
      * @return
      */@Override
     public R accountCheck(String userId,String type){
+        ProjectConfig.OpenIM imConfig = getImConfig();
         String adminToken = getAdminToken();
         JSONObject requestBody = new JSONObject();
         // 解析响应
@@ -925,7 +861,7 @@ public class OpenIMServiceImpl implements OpenIMService {
             requestBody = new JSONObject();
             userIds.add(userId);
             requestBody.put("checkUserIDs", userIds);
-            String body = HttpRequest.post(IMConfig.URL+"/user/account_check")
+            String body = HttpRequest.post(imConfig.getUrl()+"/user/account_check")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString())
@@ -986,7 +922,7 @@ public class OpenIMServiceImpl implements OpenIMService {
                     requestBody = new JSONObject();
                     userIds.add(userId);
                     requestBody.put("users", users);
-                    HttpRequest.post(IMConfig.URL+"/user/user_register")
+                    HttpRequest.post(imConfig.getUrl()+"/user/user_register")
                             .header("operationID", String.valueOf(System.currentTimeMillis()))
                             .header("token", adminToken).body(requestBody.toString()).execute().body();
                 }
@@ -1001,7 +937,7 @@ public class OpenIMServiceImpl implements OpenIMService {
             requestBody = new JSONObject();
             requestBody.put("platformID",5);
             requestBody.put("userID",userId);
-            String body1 = HttpRequest.post(IMConfig.URL+"/auth/get_user_token")
+            String body1 = HttpRequest.post(imConfig.getUrl()+"/auth/get_user_token")
                     .header("operationID", String.valueOf(System.currentTimeMillis()))
                     .header("token", adminToken)
                     .body(requestBody.toString()).execute().body();
@@ -1062,10 +998,11 @@ public class OpenIMServiceImpl implements OpenIMService {
     @Override
     @Transactional
     public OpenImResponseDTO openIMBatchSendMsg(OpenImBatchMsgDTO openImBatchMsgDTO) {
+        ProjectConfig.OpenIM imConfig = getImConfig();
         log.info("========================== 批量发送消息 ==========================");
         String adminToken = getAdminToken();
         JSONObject jsonObject = new JSONObject(openImBatchMsgDTO);
-        String url = IMConfig.URL+"/msg/batch_send_msg";
+        String url = imConfig.getUrl()+"/msg/batch_send_msg";
         log.info("请求url: {},\n请求参数:{}", url, jsonObject);
         long timestamp = System.currentTimeMillis();
         log.info("请求header,operationID:{},token:{}", timestamp, adminToken);
@@ -1479,6 +1416,7 @@ public class OpenIMServiceImpl implements OpenIMService {
      * @return
      */
     public OpenImResponseDTO updateFriendByDianBo(String ownerUserID, List<String> friendUserIDs,String cropId) {
+        ProjectConfig.OpenIM imConfig = getImConfig();
         //先检查用户是否存在好友关系
         //List<String> newFriendIds = new ArrayList<>();
         for (String friendUserID : friendUserIDs) {
@@ -1504,7 +1442,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         jsonObject.put("ownerUserID",ownerUserID);
         jsonObject.put("friendUserIDs",friendUserIDs);
         jsonObject.put("remark",remark.get(0));
-        String body = HttpRequest.post(IMConfig.URL+"/friend/update_friends")
+        String body = HttpRequest.post(imConfig.getUrl()+"/friend/update_friends")
                 .header("operationID", String.valueOf(System.currentTimeMillis()))
                 .header("token", adminToken)
                 .body(jsonObject.toString())

+ 1 - 1
fs-service/src/main/java/com/fs/live/mapper/LiveCompletionPointsRecordMapper.java

@@ -38,7 +38,7 @@ public interface LiveCompletionPointsRecordMapper {
     /**
      * 查询用户在某直播间最近一次完课记录(不限制日期)
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     LiveCompletionPointsRecord selectLatestByUserAndLiveId(@Param("liveId") Long liveId, 
                                                             @Param("userId") Long userId);
 

+ 2 - 2
fs-service/src/main/java/com/fs/live/mapper/LiveCouponUserMapper.java

@@ -23,7 +23,7 @@ public interface LiveCouponUserMapper
      * @param id 优惠券发放记录ID
      * @return 优惠券发放记录
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     public LiveCouponUser selectLiveCouponUserById(Long id);
 
     /**
@@ -75,6 +75,6 @@ public interface LiveCouponUserMapper
             " and (lcu.goods_id= #{coupon.goodsId} or lcu.goods_id is null or lcu.goods_id = 0)" +
             " </if>" +
             "</script>")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveCouponUser> curCoupon(@Param("coupon") CouponPO coupon);
 }

+ 5 - 5
fs-service/src/main/java/com/fs/live/mapper/LiveDataMapper.java

@@ -142,7 +142,7 @@ public interface LiveDataMapper {
             "FROM " +
             "    live_data ld " +
             "where ld.live_id=#{liveId}")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     Map<String, Integer> selectDashboardCount(@Param("liveId") Long liveId);
 
     /**
@@ -150,7 +150,7 @@ public interface LiveDataMapper {
      * @param liveIds 直播间ID列表
      * @return 统计数据
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     LiveDataStatisticsVo selectLiveDataStatistics(@Param("liveIds") List<Long> liveIds);
 
     /**
@@ -158,7 +158,7 @@ public interface LiveDataMapper {
      * @param liveIds 直播间ID列表
      * @return 列表数据
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveDataListVo> selectLiveDataListByLiveIds(@Param("liveIds") List<Long> liveIds);
 
     /**
@@ -166,7 +166,7 @@ public interface LiveDataMapper {
      * @param liveId 直播间ID
      * @return 详情数据
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     LiveDataDetailVo selectLiveDataDetailBySql(@Param("liveId") Long liveId);
 
     /**
@@ -174,6 +174,6 @@ public interface LiveDataMapper {
      * @param liveId 直播间ID
      * @return 用户详情列表
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveUserDetailVo> selectLiveUserDetailListBySql(@Param("liveId") Long liveId,@Param("companyId") Long companyId,@Param("companyUserId") Long companyUserId);
 }

+ 2 - 2
fs-service/src/main/java/com/fs/live/mapper/LiveGoodsMapper.java

@@ -93,7 +93,7 @@ public interface LiveGoodsMapper extends BaseMapper<LiveGoods> {
      * @param liveGoods 直播商品
      * @return 商品信息集合
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveGoodsVo> selectProductListByLiveId(LiveGoods liveGoods);
 
     /**
@@ -116,7 +116,7 @@ public interface LiveGoodsMapper extends BaseMapper<LiveGoods> {
     List<LiveGoodsVo> selectProductListByOrder(LiveOrder liveOrder);
 
     @Select("select * from live_goods where live_id = #{liveId} and product_id = #{productId}")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     LiveGoods selectLiveGoodsByProductId(@Param("liveId") Long liveId,@Param("productId") Long productId);
 
     /**

+ 1 - 1
fs-service/src/main/java/com/fs/live/mapper/LiveMapper.java

@@ -26,7 +26,7 @@ public interface LiveMapper
      * @param liveId 直播主键
      * @return 直播
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     public Live selectLiveByLiveId(Long liveId);
 
     /**

+ 3 - 3
fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java

@@ -43,7 +43,7 @@ public interface LiveOrderMapper {
      * @param liveOrder 订单
      * @return 订单集合
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveOrder> selectLiveOrderList(LiveOrder liveOrder);
 
     /**
@@ -107,14 +107,14 @@ public interface LiveOrderMapper {
             "</where> " +
             "order by create_time desc" +
             "</script>"})
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveOrderListVo> selectLiveOrderListVo(@Param("userId") String userId,@Param("status") Integer status);
 
     @Select("select * from live_order where `status` = 3 AND TIMESTAMPDIFF(HOUR, start_time, NOW()) >= 48  ")
     List<LiveOrder> selectLiveOrderByFinish();
 
     @Select("select * from live_order where `status` = 1 and extend_order_id is not null and (delivery_sn is null or delivery_code = '') and refund_status = 0 and is_pay = 1 order by update_time ")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveOrder> selectUpdateExpress();
 
 

+ 1 - 1
fs-service/src/main/java/com/fs/live/mapper/LiveOrderPaymentMapper.java

@@ -24,7 +24,7 @@ public interface LiveOrderPaymentMapper {
      * @param paymentId 支付明细主键
      * @return 支付明细
      */
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     LiveOrderPayment selectLiveOrderPaymentByPaymentId(Long paymentId);
 
     /**

+ 4 - 4
fs-service/src/main/java/com/fs/live/mapper/LiveUserFirstEntryMapper.java

@@ -73,11 +73,11 @@ public interface LiveUserFirstEntryMapper {
 
     @Select("select count(*) from live_user_first_entry where user_id=#{userId} and DATE(entry_date)=DATE(#{now})")
     int selectTodayEntry(@Param("userId") long userId,@Param("now") Date now);
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveUserFirstProfit> selectLiveProfitList();
 
     @Select("select * from live_user_first_entry where live_id=#{liveId} and user_id=#{userId}")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     LiveUserFirstEntry selectEntityByLiveIdUserId(@Param("liveId") long liveId,@Param("userId") long userId);
 
     @Select("SELECT  " +
@@ -93,7 +93,7 @@ public interface LiveUserFirstEntryMapper {
             "ORDER BY  " +
             "  invite_num DESC   " +
             "  LIMIT 10")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveUserFirstVo> selectDashboardInviteCount(@Param("liveId") Long liveId);
 
     @Select("SELECT  " +
@@ -108,7 +108,7 @@ public interface LiveUserFirstEntryMapper {
             "  lufe.company_user_id   " +
             "ORDER BY  " +
             "  invite_num DESC   ")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<LiveUserFirstVo> inviteList(@Param("liveId") Long liveId);
 
     @Select("SELECT  sum(case when company_user_id > 0 then 1 else 0 end ) as shareUrlNum, " +

+ 1 - 1
fs-service/src/main/java/com/fs/live/mapper/LiveWatchUserMapper.java

@@ -150,7 +150,7 @@ public interface LiveWatchUserMapper {
     @Select("select lufe.company_id,lufe.company_user_id,lwu.* from live_watch_user lwu" +
             " left join live_user_first_entry lufe on lwu.live_id = lufe.live_id and lwu.user_id = lufe.user_id" +
             " where lwu.live_id = #{liveId} and lwu.user_id = #{userId} and lwu.live_flag = #{liveFlag} and lwu.replay_flag = #{replayFlag} limit 1 ")
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     LiveWatchUserEntry selectLiveWatchAndCompanyUserByFlag(@Param("liveId") Long liveId,@Param("userId") Long userId,@Param("liveFlag") Integer liveFlag,@Param("replayFlag") Integer replayFlag);
 
     /**

+ 6 - 6
fs-service/src/main/java/com/fs/statis/mapper/FsStatisSalerWatchMapper.java

@@ -79,24 +79,24 @@ public interface FsStatisSalerWatchMapper {
     @Delete("DELETE FROM fs_statis_saler_watch WHERE id = #{id}")
     int deleteById(@Param("id") Integer id);
 
-//    @DataSource(DataSourceType.SLAVE)
+//    //@DataSource(DataSourceType.SLAVE)
     List<FsStatisSalerWatch> queryList(StatsWatchLogPageListDTO param);
 
     void batchSave(@Param("list") List<FsStatisSalerWatch> writeData);
 
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<FsStatisSalerWatch> queryPeriodList(StatsWatchLogPageListDTO param);
 
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<FsStatisSopWatch> queryPeriodListExport(StatsWatchLogPageListDTO param);
 
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<FsStatisSalerWatch> queryTodayList(StatsWatchLogPageListDTO param);
 
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<FsStatisSalerWatch> queryListExport(StatsWatchLogPageListDTO param);
 
-    @DataSource(DataSourceType.SLAVE)
+    //@DataSource(DataSourceType.SLAVE)
     List<FsStatisEveryDayWatch> queryEveryDayListExport(StatsWatchLogPageListDTO param);
 
     void generateData(@Param("date") String date);

+ 16 - 8
fs-service/src/main/java/com/fs/wx/cp/config/WxCpConfiguration.java

@@ -1,5 +1,9 @@
 package com.fs.wx.cp.config;
 
+import com.alibaba.fastjson.JSONObject;
+import com.fs.config.saas.ProjectConfig;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.fs.wx.cp.handler.*;
 import com.google.common.collect.Maps;
 import lombok.val;
@@ -19,7 +23,6 @@ import java.util.stream.Collectors;
 
 
 @Configuration
-@EnableConfigurationProperties(WxCpProperties.class)
 public class WxCpConfiguration {
     private LogHandler logHandler;
     private NullHandler nullHandler;
@@ -28,16 +31,15 @@ public class WxCpConfiguration {
     private MsgHandler msgHandler;
     private UnsubscribeHandler unsubscribeHandler;
     private SubscribeHandler subscribeHandler;
-
-    private WxCpProperties properties;
-
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
     private static Map<Integer, WxCpMessageRouter> routers = Maps.newHashMap();
     private static Map<Integer, WxCpService> cpServices = Maps.newHashMap();
 
     @Autowired
     public WxCpConfiguration(LogHandler logHandler, NullHandler nullHandler, LocationHandler locationHandler,
                              MenuHandler menuHandler, MsgHandler msgHandler, UnsubscribeHandler unsubscribeHandler,
-                             SubscribeHandler subscribeHandler, WxCpProperties properties) {
+                             SubscribeHandler subscribeHandler) {
         this.logHandler = logHandler;
         this.nullHandler = nullHandler;
         this.locationHandler = locationHandler;
@@ -45,7 +47,6 @@ public class WxCpConfiguration {
         this.msgHandler = msgHandler;
         this.unsubscribeHandler = unsubscribeHandler;
         this.subscribeHandler = subscribeHandler;
-        this.properties = properties;
     }
 
 
@@ -59,9 +60,16 @@ public class WxCpConfiguration {
 
     @PostConstruct
     public void initServices() {
-        cpServices = this.properties.getAppConfigs().stream().map(a -> {
+
+        String configKey = "projectConfig";
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey(configKey);
+        ProjectConfig projectConfig = JSONObject.parseObject(sysConfig.getConfigValue(),ProjectConfig.class);
+
+        ProjectConfig.Wx.Cp properties= projectConfig.getWx().getCp();
+
+        cpServices = properties.getAppConfigs().stream().map(a -> {
             val configStorage = new WxCpDefaultConfigImpl();
-            configStorage.setCorpId(this.properties.getCorpId());
+            configStorage.setCorpId(properties.getCorpId());
             configStorage.setAgentId(a.getAgentId());
             configStorage.setCorpSecret(a.getSecret());
             configStorage.setToken(a.getToken());

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

@@ -1,51 +1,51 @@
-package com.fs.wx.cp.config;
-
-
-import com.fs.wx.utils.JsonUtils;
-import lombok.Data;
-import lombok.Getter;
-import lombok.Setter;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.List;
-
-@Data
-@ConfigurationProperties(prefix = "wx.cp")
-public class WxCpProperties {
-  /**
-   * 设置企业微信的corpId
-   */
-  private String corpId;
-
-  private List<AppConfig> appConfigs;
-
-  @Getter
-  @Setter
-  public static class AppConfig {
-    /**
-     * 设置企业微信应用的AgentId
-     */
-    private Integer agentId;
-
-    /**
-     * 设置企业微信应用的Secret
-     */
-    private String secret;
-
-    /**
-     * 设置企业微信应用的token
-     */
-    private String token;
-
-    /**
-     * 设置企业微信应用的EncodingAESKey
-     */
-    private String aesKey;
-
-  }
-
-  @Override
-  public String toString() {
-    return JsonUtils.toJson(this);
-  }
-}
+//package com.fs.wx.cp.config;
+//
+//
+//import com.fs.wx.utils.JsonUtils;
+//import lombok.Data;
+//import lombok.Getter;
+//import lombok.Setter;
+//import org.springframework.boot.context.properties.ConfigurationProperties;
+//
+//import java.util.List;
+//
+//@Data
+//@ConfigurationProperties(prefix = "wx.cp")
+//public class WxCpProperties {
+//  /**
+//   * 设置企业微信的corpId
+//   */
+//  private String corpId;
+//
+//  private List<AppConfig> appConfigs;
+//
+//  @Getter
+//  @Setter
+//  public static class AppConfig {
+//    /**
+//     * 设置企业微信应用的AgentId
+//     */
+//    private Integer agentId;
+//
+//    /**
+//     * 设置企业微信应用的Secret
+//     */
+//    private String secret;
+//
+//    /**
+//     * 设置企业微信应用的token
+//     */
+//    private String token;
+//
+//    /**
+//     * 设置企业微信应用的EncodingAESKey
+//     */
+//    private String aesKey;
+//
+//  }
+//
+//  @Override
+//  public String toString() {
+//    return JsonUtils.toJson(this);
+//  }
+//}

+ 0 - 90
fs-service/src/main/java/com/fs/wx/miniapp/config/WxMaProperties.java

@@ -1,90 +0,0 @@
-package com.fs.wx.miniapp.config;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-
-@ConfigurationProperties(prefix = "wx.miniapp")
-@Component
-public class WxMaProperties {
-
-    private List<Config> configs;
-
-    public List<Config> getConfigs() {
-        return configs;
-    }
-
-    public void setConfigs(List<Config> configs) {
-        this.configs = configs;
-    }
-
-    public static class Config {
-        /**
-         * 设置微信小程序的appid
-         */
-        private String appid;
-
-        /**
-         * 设置微信小程序的Secret
-         */
-        private String secret;
-
-        /**
-         * 设置微信小程序消息服务器配置的token
-         */
-        private String token;
-
-        /**
-         * 设置微信小程序消息服务器配置的EncodingAESKey
-         */
-        private String aesKey;
-
-        /**
-         * 消息格式,XML或者JSON
-         */
-        private String msgDataFormat;
-
-        public String getAppid() {
-            return appid;
-        }
-
-        public void setAppid(String appid) {
-            this.appid = appid;
-        }
-
-        public String getSecret() {
-            return secret;
-        }
-
-        public void setSecret(String secret) {
-            this.secret = secret;
-        }
-
-        public String getToken() {
-            return token;
-        }
-
-        public void setToken(String token) {
-            this.token = token;
-        }
-
-        public String getAesKey() {
-            return aesKey;
-        }
-
-        public void setAesKey(String aesKey) {
-            this.aesKey = aesKey;
-        }
-
-        public String getMsgDataFormat() {
-            return msgDataFormat;
-        }
-
-        public void setMsgDataFormat(String msgDataFormat) {
-            this.msgDataFormat = msgDataFormat;
-        }
-    }
-
-}

+ 0 - 1
fs-service/src/main/resources/META-INF/spring.facories

@@ -1 +0,0 @@
-org.springframework.boot.env.EnvironmentPostProcessor=com.fs.framework.ConfEnvironmentPostProcessor

+ 1 - 0
fs-service/src/main/resources/META-INF/spring.factories

@@ -0,0 +1 @@
+org.springframework.boot.env.EnvironmentPostProcessor=\

+ 0 - 53
fs-service/src/main/resources/application-dev.yml

@@ -124,57 +124,4 @@ spring:
                         config:
                             multi-statement-allow: true
 
-# RocketMQ配置
-rocketmq:
-    name-server: 127.0.0.1:9876
-    producer:
-        group: event-feedback-producer
-        send-message-timeout: 3000
-        retry-times-when-send-failed: 2
-        retry-times-when-send-async-failed: 2
-        max-message-size: 4194304
-        compress-message-body-threshold: 4096
-        retry-next-server: true
-custom:
-    token: "1o62d3YxvdHd4LEUiltnu7sK"
-    encoding-aes-key: "UJfTQ5qKTKlegjkXtp1YuzJzxeHlUKvq5GyFbERN1iU"
-    corp-id: "ww51717e2b71d5e2d3"
-    secret: "6ODAmw-8W4t6h9mdzHh2Z4Apwj8mnsyRnjEDZOHdA7k"
-    private-key-path: "privatekey.pem"
-    webhook-url: "https://your-server.com/wecom/archive"
-# token配置
-token:
-    # 令牌自定义标识
-    header: Authorization
-    # 令牌密钥
-    secret: abcdefghijklmnopqrstuvwxyz
-    # 令牌有效期(默认30分钟)
-    expireTime: 180
-openIM:
-    secret: openIM123
-    userID: imAdmin
-    url: https://web.jnmyim.ylrzfs.com/api
-#是否为新商户,新商户不走mpOpenId
-isNewWxMerchant: true
-#是否使用新im
-im:
-    type: OPENIM
-
-cloud_host:
-    company_name: 济南联志健康
-    projectCode: LZJK
-    spaceName:
-    volcengineUrl: https://jnlzvolcengine.ylrztop.com
-#看课授权时显示的头像
-headerImg:
-    imgUrl: https://hzyy.obs.cn-north-4.myhuaweicloud.com/fs/20250616/1750067609692.png
-ipad:
-    ipadUrl: http://admin.test.ylrztop.com/ipad
-    aiApi: http://1.95.196.10:3000/api
-    voiceApi:
-    commonApi:
-    url:
-wx_miniapp_temp:
-    pay_order_temp_id:
-    inquiry_temp_id:
 

+ 1 - 1
fs-store/src/main/java/com/fs/framework/config/properties/DruidProperties.java

@@ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration;
 
 /**
  * druid 配置属性
- * 
+ *
 
  */
 @Configuration

+ 3 - 3
fs-store/src/main/java/com/fs/store/controller/common/CaptchaController.java

@@ -22,7 +22,7 @@ import java.util.concurrent.TimeUnit;
 
 /**
  * 验证码操作处理
- * 
+ *
 
  */
 @RestController
@@ -36,11 +36,11 @@ public class CaptchaController
 
     @Autowired
     private RedisCache redisCache;
-    
+
     // 验证码类型
     @Value("${fs.captchaType}")
     private String captchaType;
-    
+
     @Autowired
     private ISysConfigService configService;
     /**

+ 2 - 2
fs-user-app/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
@@ -38,7 +38,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;

+ 2 - 2
fs-watch/src/main/java/com/fs/framework/interceptor/impl/SameUrlDataInterceptor.java

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
 /**
  * 判断请求url和数据是否和上一次相同,
  * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
- * 
+ *
 
  */
 @Component
@@ -38,7 +38,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
 
     /**
      * 间隔时间,单位:秒 默认10秒
-     * 
+     *
      * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据
      */
     private int intervalTime = 10;