Browse Source

代码合并

chenguo 3 weeks ago
parent
commit
2dfacc023b
71 changed files with 1789 additions and 382 deletions
  1. 29 5
      fs-admin/src/main/java/com/fs/api/controller/IndexStatisticsController.java
  2. 7 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyController.java
  3. 16 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyMoneyLogsController.java
  4. 22 7
      fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficController.java
  5. 19 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficLogController.java
  6. 7 0
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java
  7. 11 0
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyDeductController.java
  8. 40 0
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyRechargeController.java
  9. 10 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java
  10. 17 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreScrmController.java
  11. 103 0
      fs-admin/src/main/java/com/fs/web/controller/system/SysDeptConfigLogController.java
  12. 37 0
      fs-admin/src/main/java/com/fs/web/controller/system/SysDeptController.java
  13. 0 6
      fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java
  14. 6 1
      fs-common/src/main/java/com/fs/common/core/domain/entity/SysDept.java
  15. 14 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyDeptController.java
  16. 19 0
      fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java
  17. 22 0
      fs-qw-task/src/main/java/com/fs/app/task/qwTask.java
  18. 9 1
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/QwExternalContactRatingServiceImpl.java
  19. 6 0
      fs-service/src/main/java/com/fs/company/domain/Company.java
  20. 2 1
      fs-service/src/main/java/com/fs/company/domain/CompanyTrafficRecordLog.java
  21. 3 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyDeductMapper.java
  22. 3 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyDeptMapper.java
  23. 3 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyMoneyLogsMapper.java
  24. 3 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyRechargeMapper.java
  25. 4 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyTrafficRecordLogMapper.java
  26. 9 8
      fs-service/src/main/java/com/fs/company/mapper/CompanyTrafficRecordMapper.java
  27. 3 0
      fs-service/src/main/java/com/fs/company/param/CompanyMoneyLogsParam.java
  28. 5 0
      fs-service/src/main/java/com/fs/company/param/CompanyTrafficRecordChargeParam.java
  29. 1 0
      fs-service/src/main/java/com/fs/company/param/CompanyTrafficRecordLogQueryParam.java
  30. 1 0
      fs-service/src/main/java/com/fs/company/param/CompanyTrafficRecordQueryParam.java
  31. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanyDeptService.java
  32. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanyTrafficRecordLogService.java
  33. 6 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyDeptServiceImpl.java
  34. 50 3
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  35. 20 8
      fs-service/src/main/java/com/fs/company/service/impl/CompanyTrafficRecordLogServiceImpl.java
  36. 79 31
      fs-service/src/main/java/com/fs/company/service/impl/CompanyTrafficRecordServiceImpl.java
  37. 1 0
      fs-service/src/main/java/com/fs/company/vo/CompanyDeductVO.java
  38. 1 0
      fs-service/src/main/java/com/fs/company/vo/CompanyRechargeVO.java
  39. 2 0
      fs-service/src/main/java/com/fs/course/config/CourseConfig.java
  40. 1 3
      fs-service/src/main/java/com/fs/course/mapper/FsCourseTrafficLogMapper.java
  41. 3 0
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  42. 9 10
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  43. 3 21
      fs-service/src/main/java/com/fs/hisStore/config/MedicalMallConfig.java
  44. 10 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  45. 14 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreScrmMapper.java
  46. 2 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java
  47. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreScrmService.java
  48. 6 2
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java
  49. 7 2
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductAttrValueScrmServiceImpl.java
  50. 116 10
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  51. 42 8
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreScrmServiceImpl.java
  52. 2 2
      fs-service/src/main/java/com/fs/sop/mapper/SopUserLogsMapper.java
  53. 55 0
      fs-service/src/main/java/com/fs/system/domain/SysDeptConfig.java
  54. 49 0
      fs-service/src/main/java/com/fs/system/domain/SysDeptConfigLog.java
  55. 61 0
      fs-service/src/main/java/com/fs/system/mapper/SysDeptConfigLogMapper.java
  56. 61 0
      fs-service/src/main/java/com/fs/system/mapper/SysDeptConfigMapper.java
  57. 63 0
      fs-service/src/main/java/com/fs/system/service/ISysDeptConfigLogService.java
  58. 73 0
      fs-service/src/main/java/com/fs/system/service/ISysDeptConfigService.java
  59. 109 0
      fs-service/src/main/java/com/fs/system/service/impl/SysDeptConfigLogServiceImpl.java
  60. 173 0
      fs-service/src/main/java/com/fs/system/service/impl/SysDeptConfigServiceImpl.java
  61. 67 89
      fs-service/src/main/java/com/fs/system/service/impl/SysDeptServiceImpl.java
  62. 1 0
      fs-service/src/main/resources/application-config-dev-yjb.yml
  63. 2 2
      fs-service/src/main/resources/application-config-druid-jnlzjk.yml
  64. 6 16
      fs-service/src/main/resources/application-dev-yjb.yml
  65. 37 0
      fs-service/src/main/resources/mapper/company/CompanyTrafficRecordLogMapper.xml
  66. 10 0
      fs-service/src/main/resources/mapper/course/FsCourseTrafficLogMapper.xml
  67. 3 0
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  68. 101 0
      fs-service/src/main/resources/mapper/deptConfig/SysDeptConfigMapper.xml
  69. 101 0
      fs-service/src/main/resources/mapper/deptConfigLog/SysDeptConfigLogMapper.xml
  70. 3 1
      fs-service/src/main/resources/mapper/sop/SopUserLogsMapper.xml
  71. 0 145
      fs-user-app/src/main/java/com/fs/app/controller/store/FsStoreUserComplaintController.java

+ 29 - 5
fs-admin/src/main/java/com/fs/api/controller/IndexStatisticsController.java

@@ -1,5 +1,6 @@
 package com.fs.api.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.entity.SysDept;
 import com.fs.common.core.redis.RedisCache;
@@ -51,9 +52,6 @@ public class IndexStatisticsController {
 
     @Autowired
     private ICompanyService companyService;
-
-    @Autowired
-    private MedicalMallConfig medicalMallConfig;
     /**
      * 分析概览
      */
@@ -70,7 +68,9 @@ public class IndexStatisticsController {
         if(userType == null) {
             userType = 0;
         }
-        if(medicalMallConfig.isStatics()|| (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
+        if(!medicalMallConfig.isStatics()|| (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             analysisPreviewDTO = redisCache.getCacheObject(String.format("%s:%d:%d",DATA_OVERVIEW_DEALER_ANALYSISPREVIEW,type,userType));
         }else if(param.getCompanyId() != null){
             analysisPreviewDTO = redisCache.getCacheObject(String.format("%s:%d:%d:%d",DATA_OVERVIEW_DEALER_ANALYSISPREVIEW,type,userType,param.getCompanyId()));
@@ -144,7 +144,9 @@ public class IndexStatisticsController {
     @GetMapping("/rechargeComsumption")
     public R rechargeComsumption(StatisticsDeptCompanyParam param){
         ConsumptionBalanceDataDTO consumptionBalanceDataDTO = new ConsumptionBalanceDataDTO();
-        if(medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)) {
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
+        if(!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)) {
             consumptionBalanceDataDTO = redisCache.getCacheObject(StatisticsRedisConstant.DATA_OVERVIEW_DEALER_BALANCE);
         }else if(param.getCompanyId() != null){
             consumptionBalanceDataDTO = redisCache.getCacheObject(String.format("%s:%d",DATA_OVERVIEW_DEALER_BALANCE,param.getCompanyId()));
@@ -179,6 +181,8 @@ public class IndexStatisticsController {
     @GetMapping("/trafficLog")
     public R getTrafficLog(StatisticsDeptCompanyParam  param){
         TrafficLogDTO result = new TrafficLogDTO();
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         if(!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)) {
             result = redisCache.getCacheObject(DATA_OVERVIEW_TRAFFIC_LOG);
             if (!medicalMallConfig.isStatics()) {
@@ -246,6 +250,8 @@ public class IndexStatisticsController {
             userType = 0;
         }
         List<WatchEndPlayTrendDTO> watchEndPlayTrendDTOS;
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         // 参考watchCourseTopTen方法的处理逻辑
         if (!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             String key = String.format("%s:%d:%d", DATA_OVERVIEW_DEALER_CHARTS, type,userType);
@@ -330,6 +336,8 @@ public class IndexStatisticsController {
             userType = 0;
         }
         List<DeaMemberTopTenDTO> deaMemberTopTenDTOS = new ArrayList<>();
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         // 参考deaMemberTopTen方法处理逻辑
         if (!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             String key = String.format("%s:%d:%d:%d", CHARTS_MEMBER_TOP_TEN_WATCH, type, statisticalType,userType);
@@ -387,6 +395,8 @@ public class IndexStatisticsController {
         Integer dataType = param.getDataType();
         Integer userType = param.getUserType();
         List<RewardMoneyTopTenDTO> rewardMoneyTopTenDTOS = new ArrayList<>();
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         // 参考rewardMoneyTopTen方法处理逻辑
         if(!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             String key = String.format("%s:%d:%d:%d", CHARTS_REWARD_MONEY_TOP_TEN, type,dataType,userType);
@@ -441,6 +451,8 @@ public class IndexStatisticsController {
         Integer type = param.getType();
         Integer userType = param.getUserType();
         List<RewardMoneyTrendDTO> rewardMoneyTrendDTOS = new ArrayList<>();
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         // 参考rewardMoneyTrend方法处理逻辑
         if(!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             String key = String.format("%s:%d:%d", CHARTS_REWARD_MONEY_TREND, type,userType);
@@ -494,6 +506,8 @@ public class IndexStatisticsController {
         Integer statisticalType = param.getStatisticalType();
         Integer userType = param.getUserType();
         List<CourseStatsDTO> courseStatsDTOS;
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         if (!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             courseStatsDTOS = redisCache.getCacheObject(String.format("%s:%d:%d:%d:%s", CHARTS_WATCH_TOP_TEN, type,statisticalType,userType,sort));
         }else if(param.getCompanyId() != null){
@@ -611,6 +625,8 @@ public class IndexStatisticsController {
     @GetMapping("/dealerAggregated")
     public R dealerAggregated(StatisticsDeptCompanyParam param){
         DealerAggregatedDTO result = new DealerAggregatedDTO();
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         if (!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)) {
             result = redisCache.getCacheObject(StatisticsRedisConstant.DATA_OVERVIEW_DEALER_AGGREGATED);
         }else if (param.getCompanyId() != null) {
@@ -666,6 +682,8 @@ public class IndexStatisticsController {
      */
     @GetMapping("/smsBalance")
     public R smsBalance(StatisticsDeptCompanyParam param){
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         if (!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             return R.ok().put("data", redisCache.getCacheObject(StatisticsRedisConstant.DATA_OVERVIEW_DEALER_SMS_BALANCE));
         }else if(param.getCompanyId() != null){
@@ -692,6 +710,8 @@ public class IndexStatisticsController {
     @GetMapping("/authorizationInfo")
     public R authorizationInfo(StatisticsDeptCompanyParam  param){
         AuthorizationInfoDTO authorizationInfoDTO = new AuthorizationInfoDTO();
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         if (!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             return R.ok().put("data", redisCache.getCacheObject(StatisticsRedisConstant.DATA_OVERVIEW_DEALER_AUTHORIZATION_INFO));
         }else if(param.getCompanyId() != null){
@@ -728,6 +748,8 @@ public class IndexStatisticsController {
      */
     @GetMapping("/thisMonthOrderCount")
     public R thisMonthOrderCount(StatisticsDeptCompanyParam  param){
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         if (!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             return redisCache.getCacheObject(StatisticsRedisConstant.THIS_MONTH_ORDER_COUNT);
         }else if(param.getCompanyId() != null){
@@ -759,6 +781,8 @@ public class IndexStatisticsController {
 
     @GetMapping("/thisMonthRecvCount")
     public R thisMonthRecvCount(StatisticsDeptCompanyParam  param){
+        SysConfig config = sysConfigService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         if (!medicalMallConfig.isStatics() || (param.getCompanyId() == null && param.getDeptId() == null) || (param.getCompanyId() == null && param.getDeptId() == 1)){
             return redisCache.getCacheObject(StatisticsRedisConstant.THIS_MONTH_RECV_COUNT);
         }else if(param.getCompanyId() != null){

+ 7 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyController.java

@@ -119,6 +119,9 @@ public class CompanyController extends BaseController
         if(company.getDeptId() != null){
             company.setDeptId(loginUser.getDeptId());
         }
+        company.setCreateBy(loginUser.getUsername());
+        company.setOldDeptId(loginUser.getDeptId());
+        company.setAdmin(loginUser.isAdmin());
         company.setPassword(SecurityUtils.encryptPassword(company.getPassword()));
         company.setAppId(Md5Utils.hash(company.getUserName()));
         company.setAppKey(Md5Utils.hash(company.getPassword()));
@@ -134,6 +137,9 @@ public class CompanyController extends BaseController
     @PutMapping
     public AjaxResult edit(@RequestBody Company company)
     {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        company.setOldDeptId(loginUser.getDeptId());
+        company.setAdmin(loginUser.isAdmin());
         CompanyUser companyUser = new CompanyUser();
         if (company.getStatus()==0){
             companyUser.setStatus("1");
@@ -154,6 +160,7 @@ public class CompanyController extends BaseController
             }
         }
         company.setUpdateMiniApp(true);
+        company.setPageUpdate(true);
         return toAjax(companyService.updateCompany(company));
     }
 

+ 16 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyMoneyLogsController.java

@@ -1,12 +1,15 @@
 package com.fs.company.controller;
 
+import cn.hutool.json.JSONUtil;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.SecurityUtils;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.Company;
@@ -22,6 +25,8 @@ import com.fs.company.vo.CompanyMoneyLogsExport1VO;
 import com.fs.company.vo.CompanyMoneyLogsExport2VO;
 import com.fs.company.vo.CompanyMoneyLogsExportVO;
 import com.fs.company.vo.CompanyMoneyLogsVO;
+import com.fs.course.config.CourseConfig;
+import com.fs.framework.web.service.TokenService;
 import com.fs.his.domain.FsExportTask;
 import com.fs.his.domain.FsInquiryOrder;
 import com.fs.his.domain.FsStoreOrder;
@@ -32,6 +37,7 @@ import com.fs.his.service.IFsInquiryOrderService;
 import com.fs.his.service.IFsStoreOrderService;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.vo.FsStoreOrderExportVO;
+import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -59,6 +65,10 @@ public class CompanyMoneyLogsController extends BaseController
 
     @Autowired
     private IFsExportTaskService exportTaskService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private ISysConfigService configService;
 
     /**
      * 查询企业账户记录列表
@@ -68,6 +78,12 @@ public class CompanyMoneyLogsController extends BaseController
     public TableDataInfo list(CompanyMoneyLogsParam companyMoneyLogs)
     {
         startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound()){
+            companyMoneyLogs.setDeptId(loginUser.getDeptId());
+        }
         if(!StringUtils.isEmpty(companyMoneyLogs.getCreateTimeRange())){
             companyMoneyLogs.setCreateTimeList(companyMoneyLogs.getCreateTimeRange().split("--"));
         }

+ 22 - 7
fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficController.java

@@ -1,5 +1,7 @@
 package com.fs.company.controller;
 
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.R;
@@ -11,8 +13,11 @@ import com.fs.company.domain.CompanyTrafficRecord;
 import com.fs.company.param.CompanyTrafficRecordChargeParam;
 import com.fs.company.param.CompanyTrafficRecordQueryParam;
 import com.fs.company.service.ICompanyTrafficRecordService;
+import com.fs.course.config.CourseConfig;
 import com.fs.framework.web.service.TokenService;
 import com.fs.hisStore.config.MedicalMallConfig;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -32,23 +37,25 @@ public class CompanyTrafficController extends BaseController {
     private TokenService tokenService;
 
     @Autowired
-    private MedicalMallConfig medicalMallConfig;
+    private ISysConfigService configService;
 
     /**
      * 每天扣除流量余额
      * */
-    @Scheduled(cron = "0 1 0 * * ?")
-    public void refreshTraffic(){
-        if(medicalMallConfig.isStatics())
-            companyTrafficRecordService.refreshTraffic();
-    }
+//    @Scheduled(cron = "0 1 0 * * ?")
+//    public void refreshTraffic(){
+//        if(medicalMallConfig.isStatics())
+//            companyTrafficRecordService.refreshTraffic();
+//    }
 
     /**
      * 重启时重新计算并更新公司缓存
      * */
     @PostConstruct
     public void init() {
-        if(medicalMallConfig.isStatics())
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
+        if(medicalMallConfig !=null && medicalMallConfig.isStatics())
             companyTrafficRecordService.init();
     }
 
@@ -60,6 +67,8 @@ public class CompanyTrafficController extends BaseController {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         companyTrafficRecord.setUserId(loginUser.getUser().getUserId());
         companyTrafficRecord.setUserName(loginUser.getUser().getUserName());
+        companyTrafficRecord.setDeptId(loginUser.getUser().getDeptId());
+        companyTrafficRecord.setIsAdmin(loginUser.isAdmin());
         companyTrafficRecordService.recharge(companyTrafficRecord);
         return R.ok();
     }
@@ -69,6 +78,12 @@ public class CompanyTrafficController extends BaseController {
     @GetMapping(value = "/list")
     public TableDataInfo list(CompanyTrafficRecordQueryParam param) {
         startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound()){
+            param.setDeptId(loginUser.getDeptId());
+        }
         List<CompanyTrafficRecord> list = companyTrafficRecordService.selectList(param);
         return getDataTable(list);
     }

+ 19 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficLogController.java

@@ -1,15 +1,21 @@
 package com.fs.company.controller;
 
+import cn.hutool.json.JSONUtil;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.model.LoginUser;
 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.company.domain.CompanyTrafficRecordLog;
 import com.fs.company.param.CompanyTrafficRecordLogQueryParam;
 import com.fs.company.service.ICompanyTrafficRecordLogService;
+import com.fs.course.config.CourseConfig;
+import com.fs.framework.web.service.TokenService;
+import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -23,12 +29,25 @@ public class CompanyTrafficLogController extends BaseController {
     @Autowired
     private ICompanyTrafficRecordLogService companyTrafficRecordLogService;
 
+    @Autowired
+    private TokenService tokenService;
+
+
+    @Autowired
+    private ISysConfigService configService;
+
 
     /** 流量充值记录查询 */
     @PreAuthorize("@ss.hasPermi('company:trafficLog:list')")
     @GetMapping(value = "/list")
     public TableDataInfo list(CompanyTrafficRecordLogQueryParam param) {
         startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound()){
+            param.setDeptId(loginUser.getDeptId());
+        }
         List<CompanyTrafficRecordLog> list = companyTrafficRecordLogService.selectList(param);
         return getDataTable(list);
     }

+ 7 - 0
fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java

@@ -155,6 +155,9 @@ public class FsCompanyController extends BaseController
         if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
             company.setDeptId(loginUser.getDeptId());
         }
+        company.setAdmin(loginUser.isAdmin());
+        company.setOldDeptId(loginUser.getDeptId());
+        company.setCreateBy(loginUser.getUsername());
         return companyService.insertCompany(company);
     }
 
@@ -166,8 +169,12 @@ public class FsCompanyController extends BaseController
     @PutMapping
     public AjaxResult edit(@RequestBody Company company)
     {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        company.setOldDeptId(loginUser.getDeptId());
         company.setMoney(null);
         company.setUpdateMiniApp(true);
+        company.setPageUpdate(true);
+        company.setAdmin(loginUser.isAdmin());
         return toAjax(companyService.updateCompany(company));
     }
 

+ 11 - 0
fs-admin/src/main/java/com/fs/his/controller/FsCompanyDeductController.java

@@ -4,6 +4,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
+import cn.hutool.json.JSONUtil;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.model.LoginUser;
@@ -16,7 +17,9 @@ import com.fs.company.service.ICompanyDeductService;
 import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.vo.CompanyDeductVO;
+import com.fs.course.config.CourseConfig;
 import com.fs.framework.web.service.TokenService;
+import com.fs.system.service.ISysConfigService;
 import lombok.Synchronized;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,6 +55,8 @@ public class FsCompanyDeductController extends BaseController
     @Autowired
     private ICompanyService companyService;
     @Autowired
+    private ISysConfigService configService;
+    @Autowired
     private ICompanyMoneyLogsService moneyLogsService;
 
     /**
@@ -62,6 +67,12 @@ public class FsCompanyDeductController extends BaseController
     public TableDataInfo list(CompanyDeductVO companyDeduct)
     {
         startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound()){
+            companyDeduct.setDeptId(loginUser.getDeptId());
+        }
         List<CompanyDeductVO> list = companyDeductService.selectCompanyDeductListVO(companyDeduct);
 
         return getDataTable(list);

+ 40 - 0
fs-admin/src/main/java/com/fs/his/controller/FsCompanyRechargeController.java

@@ -1,10 +1,14 @@
 package com.fs.his.controller;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.domain.Company;
@@ -14,7 +18,14 @@ import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.service.ICompanyRechargeService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.vo.CompanyRechargeVO;
+import com.fs.course.config.CourseConfig;
 import com.fs.framework.web.service.TokenService;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.domain.SysDeptConfig;
+import com.fs.system.mapper.SysConfigMapper;
+import com.fs.system.service.ISysConfigService;
+import com.fs.system.service.ISysDeptConfigLogService;
+import com.fs.system.service.ISysDeptConfigService;
 import lombok.Synchronized;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,6 +62,14 @@ public class FsCompanyRechargeController extends BaseController
     private ICompanyService companyService;
     @Autowired
     private ICompanyMoneyLogsService moneyLogsService;
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private ISysDeptConfigService sysDeptConfigService;
+    @Autowired
+    private ISysDeptConfigLogService sysDeptConfigLogService;
 
     /**
      * 查询充值管理列表
@@ -60,6 +79,12 @@ public class FsCompanyRechargeController extends BaseController
     public TableDataInfo list(CompanyRechargeVO companyRecharge)
     {
         startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound()){
+            companyRecharge.setDeptId(loginUser.getDeptId());
+        }
         List<CompanyRechargeVO> list = companyRechargeService.selectCompanyRechargeListVO(companyRecharge);
         return getDataTable(list);
     }
@@ -152,6 +177,21 @@ public class FsCompanyRechargeController extends BaseController
             moneyLogsService.insertCompanyMoneyLogs(log);
             companyRecharge.setPayTime(new Date());
             companyRecharge.setStatus(1);
+            SysConfig courseConfig = sysConfigMapper.selectConfigByConfigKey("course.config");
+            CourseConfig config = JSON.parseObject(courseConfig.getConfigValue(), CourseConfig.class);
+            if(config.getDeptLimit() != null && config.getDeptLimit() && !loginUser.isAdmin()){
+                SysDeptConfig deptConfig = sysDeptConfigService.getDeptConfig(loginUser.getDeptId());
+                BigDecimal redPackage = deptConfig.getRedPackage();
+                BigDecimal nowMoney = redPackage.subtract(param.getMoney());
+                if(nowMoney.doubleValue() < 0){
+                    throw new BaseException("部门可用红包金额不足无法分配,请联系管理员充值");
+                }
+                deptConfig.setRedPackage(nowMoney);
+                deptConfig.setUpdateBy(loginUser.getUsername());
+                deptConfig.setUpdateTime(new Date());
+                sysDeptConfigLogService.addLog(deptConfig.getDeptId(), 2, 1, param.getMoney().toString(), redPackage.toString(), nowMoney.toString(), loginUser.getUsername(), "充值公司红包");
+                sysDeptConfigService.updateById(deptConfig);
+            }
         }
 
         companyRecharge.setAuditTime(new Date());

+ 10 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java

@@ -35,6 +35,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 商品Controller
@@ -222,4 +223,13 @@ public class FsStoreProductScrmController extends BaseController
         return R.ok().put("data",list);
     }
 
+    /**
+     * 获取店铺商品表字段
+     * */
+    @GetMapping("/getStoreProductColumns")
+    public R getStoreProductColumns() {
+        List<Map<String, String>> list = fsStoreProductService.getStoreProductColumns();
+        return R.ok().put("data", list);
+    }
+
 }

+ 17 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreScrmController.java

@@ -17,6 +17,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 店铺管理Controller
@@ -49,6 +50,13 @@ public class FsStoreScrmController extends BaseController
         return getDataTable(list);
     }
 
+    @GetMapping("/listOption")
+    public R listOption(FsStoreScrm fsStore)
+    {
+        List<FsStoreScrm> list = fsStoreService.selectFsStoreListOption(fsStore);
+        return R.ok().put("data", list);
+    }
+
     /**
      * 导出店铺管理列表
      */
@@ -148,4 +156,13 @@ public class FsStoreScrmController extends BaseController
     public R auditLog(@PathVariable Long storeId){
         return R.ok().put("auditLog",storeAuditLogUtil.selectOperLogByMainId(storeId));
     }
+
+    /**
+     * 获取店铺商品表字段
+     * */
+    @GetMapping("/getStoreColumns")
+    public R getStoreProductColumns() {
+        List<Map<String, String>> list = fsStoreService.getStoreColumns();
+        return R.ok().put("data", list);
+    }
 }

+ 103 - 0
fs-admin/src/main/java/com/fs/web/controller/system/SysDeptConfigLogController.java

@@ -0,0 +1,103 @@
+package com.fs.web.controller.system;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.system.domain.SysDeptConfigLog;
+import com.fs.system.service.ISysDeptConfigLogService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 系统部门资源配置使用记录Controller
+ * 
+ * @author fs
+ * @date 2025-09-22
+ */
+@RestController
+@RequestMapping("/deptConfigLog/sysDeptConfigLog")
+public class SysDeptConfigLogController extends BaseController
+{
+    @Autowired
+    private ISysDeptConfigLogService sysDeptConfigLogService;
+
+    /**
+     * 查询系统部门资源配置使用记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('deptConfigLog:sysDeptConfigLog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysDeptConfigLog sysDeptConfigLog)
+    {
+        startPage();
+        List<SysDeptConfigLog> list = sysDeptConfigLogService.selectSysDeptConfigLogList(sysDeptConfigLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出系统部门资源配置使用记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('deptConfigLog:sysDeptConfigLog:export')")
+    @Log(title = "系统部门资源配置使用记录", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysDeptConfigLog sysDeptConfigLog)
+    {
+        List<SysDeptConfigLog> list = sysDeptConfigLogService.selectSysDeptConfigLogList(sysDeptConfigLog);
+        ExcelUtil<SysDeptConfigLog> util = new ExcelUtil<SysDeptConfigLog>(SysDeptConfigLog.class);
+        return util.exportExcel(list, "系统部门资源配置使用记录数据");
+    }
+
+    /**
+     * 获取系统部门资源配置使用记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('deptConfigLog:sysDeptConfigLog:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(sysDeptConfigLogService.selectSysDeptConfigLogById(id));
+    }
+
+    /**
+     * 新增系统部门资源配置使用记录
+     */
+    @PreAuthorize("@ss.hasPermi('deptConfigLog:sysDeptConfigLog:add')")
+    @Log(title = "系统部门资源配置使用记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysDeptConfigLog sysDeptConfigLog)
+    {
+        return toAjax(sysDeptConfigLogService.insertSysDeptConfigLog(sysDeptConfigLog));
+    }
+
+    /**
+     * 修改系统部门资源配置使用记录
+     */
+    @PreAuthorize("@ss.hasPermi('deptConfigLog:sysDeptConfigLog:edit')")
+    @Log(title = "系统部门资源配置使用记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysDeptConfigLog sysDeptConfigLog)
+    {
+        return toAjax(sysDeptConfigLogService.updateSysDeptConfigLog(sysDeptConfigLog));
+    }
+
+    /**
+     * 删除系统部门资源配置使用记录
+     */
+    @PreAuthorize("@ss.hasPermi('deptConfigLog:sysDeptConfigLog:remove')")
+    @Log(title = "系统部门资源配置使用记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(sysDeptConfigLogService.deleteSysDeptConfigLogByIds(ids));
+    }
+}

+ 37 - 0
fs-admin/src/main/java/com/fs/web/controller/system/SysDeptController.java

@@ -1,7 +1,16 @@
 package com.fs.web.controller.system;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.Iterator;
 import java.util.List;
+
+import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.utils.ServletUtils;
+import com.fs.framework.web.service.TokenService;
+import com.fs.system.service.ISysConfigService;
+import com.fs.system.service.ISysDeptConfigService;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -34,6 +43,10 @@ public class SysDeptController extends BaseController
 {
     @Autowired
     private ISysDeptService deptService;
+    @Autowired
+    private ISysDeptConfigService sysDeptConfigService;
+    @Autowired
+    private TokenService tokenService;
 
     /**
      * 获取部门列表
@@ -160,4 +173,28 @@ public class SysDeptController extends BaseController
         }
         return toAjax(deptService.deleteDeptById(deptId));
     }
+    /**
+     * 删除部门
+     */
+    @Log(title = "部门PAD数量修改", businessType = BusinessType.UPDATE)
+    @GetMapping("/updatePadNum")
+    public R updatePadNum(Long deptId, Integer num, LocalDate padTime){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        sysDeptConfigService.updatePadNum(deptId, num, loginUser, padTime);
+        return R.ok();
+    }
+    @Log(title = "部门红包金额充值", businessType = BusinessType.UPDATE)
+    @GetMapping("/addRedMoney")
+    public R addRedMoney(Long deptId, BigDecimal money){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        sysDeptConfigService.addRedMoney(deptId, money, loginUser);
+        return R.ok();
+    }
+    @Log(title = "部门流量充值", businessType = BusinessType.UPDATE)
+    @GetMapping("/addFlowNum")
+    public R addFlowNum(Long deptId, BigDecimal money){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        sysDeptConfigService.addFlowNum(deptId, money, loginUser);
+        return R.ok();
+    }
 }

+ 0 - 6
fs-admin/src/main/java/com/fs/web/controller/system/SysLoginController.java

@@ -51,9 +51,6 @@ public class SysLoginController
     @Autowired
     private ConfigUtil configUtil;
 
-    @Autowired
-    private MedicalMallConfig medicalMallConfig;
-
     /**
      * 登录方法
      *
@@ -90,9 +87,6 @@ public class SysLoginController
         //药品商城参数
         AjaxResult ajax = AjaxResult.success();
 
-        if(medicalMallConfig!=null){
-            ajax.put("medicalMallConfig", medicalMallConfig);
-        }
         ajax.put("user", user);
         Integer isAdmin = 0;
         if (permissions.contains("*:*:*")){

+ 6 - 1
fs-common/src/main/java/com/fs/common/core/domain/entity/SysDept.java

@@ -5,6 +5,8 @@ import java.util.List;
 import javax.validation.constraints.Email;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.Size;
+
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.fs.common.core.domain.BaseEntity;
@@ -14,6 +16,7 @@ import com.fs.common.core.domain.BaseEntity;
  * 
 
  */
+@Data
 public class SysDept extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
@@ -50,7 +53,9 @@ public class SysDept extends BaseEntity
 
     /** 父部门名称 */
     private String parentName;
-    
+
+    private Object deptConfig;
+
     /** 子部门 */
     private List<SysDept> children = new ArrayList<SysDept>();
 

+ 14 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyDeptController.java

@@ -47,6 +47,20 @@ public class CompanyDeptController extends BaseController
         return AjaxResult.success(depts);
     }
 
+    /**
+     * 获取部门组列表
+     * */
+    @PreAuthorize("@ss.hasPermi('company:dept:list')")
+    @GetMapping("/groupList")
+    public AjaxResult groupList(CompanyDept dept)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        dept.setCompanyId(loginUser.getCompany().getCompanyId());
+        dept.setStatus("0");
+        List<CompanyDept> depts = deptService.selectCompanyDeptGroupList(dept);
+        return AjaxResult.success(depts);
+    }
+
 
     /**
      * 获取部门下拉树列表

+ 19 - 0
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -2,18 +2,21 @@ package com.fs.app.controller;
 
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.app.taskService.QwExternalContactRatingService;
 import com.fs.app.taskService.SopLogsChatTaskService;
 import com.fs.app.taskService.SopLogsTaskService;
 import com.fs.app.taskService.SopWxLogsService;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
+import com.fs.company.service.ICompanyTrafficRecordService;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.param.newfs.FsUserCourseAddCompanyUserParam;
 import com.fs.course.service.*;
 import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsInquiryOrderService;
 import com.fs.his.utils.qrcode.QRCodeUtils;
+import com.fs.hisStore.config.MedicalMallConfig;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.service.IQwCompanyService;
@@ -26,6 +29,8 @@ import com.fs.sop.mapper.SopUserLogsMapper;
 import com.fs.sop.service.*;
 import com.fs.sop.vo.QwSopLogsDoSendListTVO;
 import com.fs.store.service.IFsUserCourseCountService;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -108,6 +113,10 @@ public class CommonController {
 
     @Autowired
     private IFsCourseLinkService iFsCourseLinkService;
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private ICompanyTrafficRecordService companyTrafficRecordService;
 
     /**
     * 发官方通连
@@ -298,4 +307,14 @@ public class CommonController {
         }
         return R.ok();
     }
+    @PostMapping("/updateFlow")
+    public R updateFlow(){
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
+        log.info("是否更新流量:{}", medicalMallConfig.isStatics());
+        if(medicalMallConfig.isStatics()) {
+            companyTrafficRecordService.refreshTraffic();
+        }
+        return R.ok();
+    }
 }

+ 22 - 0
fs-qw-task/src/main/java/com/fs/app/task/qwTask.java

@@ -1,6 +1,9 @@
 package com.fs.app.task;
 
+import com.alibaba.fastjson.JSON;
 import com.fs.app.taskService.*;
+import com.fs.company.service.ICompanyTrafficRecordService;
+import com.fs.hisStore.config.MedicalMallConfig;
 import com.fs.qw.service.IQwExternalErrRetryService;
 import com.fs.qw.service.IQwGroupMsgService;
 import com.fs.qw.service.IQwWorkUserService;
@@ -11,6 +14,8 @@ import com.fs.sop.service.ISopUserLogsService;
 import com.fs.sop.service.impl.QwSopLogsServiceImpl;
 import com.fs.sop.service.impl.QwSopServiceImpl;
 import com.fs.sop.vo.QwSopLogsDoSendListTVO;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
@@ -77,6 +82,10 @@ public class qwTask {
 
     @Autowired
     private QwExternalContactRatingMoreSevenDaysService qwExternalContactRatingMoreSevenDaysService;
+    @Autowired
+    private ICompanyTrafficRecordService companyTrafficRecordService;
+    @Autowired
+    private ISysConfigService configService;
 
     /**
      * 定时任务:检查SOP规则时间
@@ -374,4 +383,17 @@ public class qwTask {
         long endTimeMillis = System.currentTimeMillis();
         log.info("====== 更新掉所有前一天的所有待发送,耗时 {} 毫秒 ======", (endTimeMillis - startTimeMillis));
     }
+
+    /**
+     * 每天扣除流量余额
+     * */
+    @Scheduled(cron = "0 2 * * * ?")
+    public void refreshTraffic(){
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
+        log.info("是否更新流量:{}", medicalMallConfig.isStatics());
+        if(medicalMallConfig.isStatics()) {
+            companyTrafficRecordService.refreshTraffic();
+        }
+    }
 }

+ 9 - 1
fs-qw-task/src/main/java/com/fs/app/taskService/impl/QwExternalContactRatingServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.fs.app.taskService.QwExternalContactRatingService;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.course.config.CourseConfig;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.mapper.QwExternalContactMapper;
@@ -14,6 +15,8 @@ import com.fs.sop.mapper.SopUserLogsMapper;
 import com.fs.sop.params.QwRatingConfig;
 import com.fs.sop.service.IQwSopTempDayService;
 import com.fs.sop.vo.QwRatingVO;
+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.google.common.util.concurrent.AtomicDouble;
@@ -71,6 +74,8 @@ public class QwExternalContactRatingServiceImpl implements QwExternalContactRati
     private final List<CompletableFuture<Void>> updateFutures = Collections.synchronizedList(new ArrayList<>());
 
     private final Object configLock = new Object();
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
 
     // 启动时初始化消费者线程
     @PostConstruct
@@ -106,13 +111,16 @@ public class QwExternalContactRatingServiceImpl implements QwExternalContactRati
     @Override
     public R ratingUserLogs() {
 
+        SysConfig courseConfig = sysConfigMapper.selectConfigByConfigKey("course.config");
+        CourseConfig config = JSON.parseObject(courseConfig.getConfigValue(), CourseConfig.class);
+
         // 分页加载并放入队列
         int pageSize = 1000;
         int offset = 0;
         List<SopUserLogs> sopUserLogs;
 
         do {
-            sopUserLogs = sopUserLogsMapper.meetsTheRatingByUserInfoWithPagination(offset, pageSize);
+            sopUserLogs = sopUserLogsMapper.meetsTheRatingByUserInfoWithPagination(offset, pageSize, config.getIsAllratingRating());
             if (!sopUserLogs.isEmpty()) {
                 sopUserLogs.forEach(item -> {
                     try {

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

@@ -135,5 +135,11 @@ public class Company extends BaseEntity
     private Integer maxPadNum;
     /** 所属部门id */
     private Long deptId;
+    @TableField(exist = false)
+    private Long oldDeptId;
+    @TableField(exist = false)
+    private boolean pageUpdate;
+    @TableField(exist = false)
+    private boolean isAdmin;
 
 }

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

@@ -1,5 +1,6 @@
 package com.fs.company.domain;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
@@ -21,7 +22,7 @@ import java.util.Date;
 public class CompanyTrafficRecordLog {
 
     @Excel(name = "id")
-    @TableId
+    @TableId(type = IdType.AUTO)
     private Long id;
     @Excel(name = "公司id")
     private Long companyId;

+ 3 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyDeductMapper.java

@@ -105,6 +105,9 @@ public interface CompanyDeductMapper
             "<if test = 'maps.isAudit != null  '> " +
             "and d.is_audit = #{maps.isAudit}" +
             "</if>" +
+            "<if test = 'maps.deptId != null  '> " +
+            "and c.dept_id = #{maps.deptId}" +
+            "</if>" +
             "<if test = 'maps.createTime != null  '> " +
             "and   DATE(d.create_time) = DATE(#{maps.createTime})" +
             "</if>" +

+ 3 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyDeptMapper.java

@@ -118,4 +118,7 @@ public interface CompanyDeptMapper
     CompanyDept selectDeptNameBydeptName(@Param("deptName") String deptName);
 
     void deleteCompanyDeptByCompanyIds(Long[] companyIds);
+
+    @Select("select t.dept_id,t.dept_name from company_dept t where t.ancestors REGEXP '^[^,]+,[^,]+$' ")
+    List<CompanyDept> selectCompanyDeptGroupList(CompanyDept dept);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyMoneyLogsMapper.java

@@ -78,6 +78,9 @@ public interface CompanyMoneyLogsMapper
             "<if test = 'maps.logsType != null  '> " +
             "and l.logs_type = #{maps.logsType}" +
             "</if>" +
+            "<if test = 'maps.deptId != null  '> " +
+            "and c.dept_id = #{maps.deptId}" +
+            "</if>" +
             "<if test = 'maps.businessId != null  '> " +
             "and l.business_id = #{maps.businessId}" +
             "</if>" +

+ 3 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyRechargeMapper.java

@@ -139,6 +139,9 @@ public interface CompanyRechargeMapper
             "<if test = 'maps.rechargeNo != null and maps.rechargeNo !=\"\" '> " +
             "and r.recharge_no = #{maps.rechargeNo}" +
             "</if>" +
+            "<if test = 'maps.deptId != null  '> " +
+            "and c.dept_id = #{maps.deptId}" +
+            "</if>" +
             "<if test = 'maps.status != null  '> " +
             "and r.status = #{maps.status}" +
             "</if>" +

+ 4 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyTrafficRecordLogMapper.java

@@ -2,9 +2,13 @@ package com.fs.company.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.company.domain.CompanyTrafficRecordLog;
+import com.fs.company.param.CompanyTrafficRecordLogQueryParam;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 @Mapper
 public interface CompanyTrafficRecordLogMapper extends BaseMapper<CompanyTrafficRecordLog> {
 
+    List<CompanyTrafficRecordLog> list(CompanyTrafficRecordLogQueryParam record);
 }

+ 9 - 8
fs-service/src/main/java/com/fs/company/mapper/CompanyTrafficRecordMapper.java

@@ -15,14 +15,15 @@ public interface CompanyTrafficRecordMapper extends BaseMapper<CompanyTrafficRec
     @Select("SELECT SUM(ctr.balance) FROM company_traffic_record ctr inner join company c on ctr.company_id = c.company_id and c.dept_id = #{deptId}")
     Long calculateTotalTrafficByDeptId(@Param("deptId") Long deptId);
 
-    @Select({"<script>"+
-                "SELECT ctr.id,c.company_id,c.company_name,ctr.balance from company c " +
-                "LEFT JOIN company_traffic_record ctr on ctr.company_id = c.company_id " +
-                "WHERE c.is_del = 0 "+
-                "<if test = 'maps.companyIds != null'> " +
-                "and c.company_id IN " +
-                "<foreach collection='maps.companyIds'  item='item' index='index'  open='(' separator=',' close=')'> #{item} </foreach> "+
-                "</if> " +
+    @Select({"<script>" +
+            "SELECT ctr.id,c.company_id,c.company_name,ctr.balance from company c " +
+            "LEFT JOIN company_traffic_record ctr on ctr.company_id = c.company_id " +
+            "WHERE c.is_del = 0 " +
+            "<if test='maps.deptId != null'> and c.dept_id = #{maps.deptId}</if> " +
+            "<if test = 'maps.companyIds != null'> " +
+            "and c.company_id IN " +
+            "<foreach collection='maps.companyIds'  item='item' index='index'  open='(' separator=',' close=')'> #{item} </foreach> " +
+            "</if> " +
             "</script>"})
     List<CompanyTrafficRecord> selectListWithUncharged(@Param("maps") CompanyTrafficRecordQueryParam record);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/company/param/CompanyMoneyLogsParam.java

@@ -1,5 +1,6 @@
 package com.fs.company.param;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fs.common.annotation.Excel;
@@ -62,6 +63,8 @@ public class CompanyMoneyLogsParam implements Serializable {
     private String createTimeRange;
 
     private String[] createTimeList;
+    @TableField(exist = false)
+    private Long deptId;
 
 
 

+ 5 - 0
fs-service/src/main/java/com/fs/company/param/CompanyTrafficRecordChargeParam.java

@@ -1,5 +1,6 @@
 package com.fs.company.param;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fs.company.domain.Company;
 import lombok.Data;
 
@@ -14,6 +15,10 @@ public class CompanyTrafficRecordChargeParam {
     private Long changeTraffic;
     private String remark;
     private Long userId;
+    private Long deptId;
+    @TableField(exist = false)
+    private Boolean isAdmin;
+    @TableField(exist = false)
     private String userName;
 
     /**

+ 1 - 0
fs-service/src/main/java/com/fs/company/param/CompanyTrafficRecordLogQueryParam.java

@@ -13,6 +13,7 @@ public class CompanyTrafficRecordLogQueryParam {
     private Long companyId;
     private List<Long> companyIds;
     private Long userId;
+    private Long deptId;
     private String userName;
     private Integer operationType; // 1-充值 2-扣费
     private Date createTime;

+ 1 - 0
fs-service/src/main/java/com/fs/company/param/CompanyTrafficRecordQueryParam.java

@@ -14,4 +14,5 @@ public class CompanyTrafficRecordQueryParam {
     private Long companyId;
     private List<Long> companyIds;
     private Long createBy;
+    private Long deptId;
 }

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

@@ -90,4 +90,6 @@ public interface ICompanyDeptService
      * @return 部门
      */
     CompanyDept getDefaultCompanyDeptByCompanyId(Long companyId);
+
+    List<CompanyDept> selectCompanyDeptGroupList(CompanyDept dept);
 }

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

@@ -12,5 +12,7 @@ public interface ICompanyTrafficRecordLogService {
     CompanyTrafficRecordLog selectById(Long id);
     //保存流量记录
     boolean save(CompanyTrafficRecordLog entity);
+    //查询当天的流量充扣记录
+    CompanyTrafficRecordLog selectTodayRecord(Long companyId);
 
 }

+ 6 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyDeptServiceImpl.java

@@ -244,6 +244,12 @@ public class CompanyDeptServiceImpl implements ICompanyDeptService
     public CompanyDept getDefaultCompanyDeptByCompanyId(Long companyId) {
         return companyDeptMapper.getTopCompanyDeptByCompanyId(companyId);
     }
+
+    @Override
+    public List<CompanyDept> selectCompanyDeptGroupList(CompanyDept dept) {
+        return companyDeptMapper.selectCompanyDeptGroupList(dept);
+    }
+
     /**
      * 递归列表
      */

+ 50 - 3
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.stream.Collectors;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
+import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.StringUtils;
@@ -20,6 +21,7 @@ import com.fs.company.vo.CompanyCrmVO;
 import com.fs.company.vo.CompanyNameVO;
 import com.fs.company.vo.CompanyVO;
 import com.fs.company.vo.DeptDataVO;
+import com.fs.course.config.CourseConfig;
 import com.fs.his.config.StoreConfig;
 import com.fs.his.domain.FsInquiryOrder;
 import com.fs.his.domain.FsStoreOrder;
@@ -32,8 +34,11 @@ import com.fs.hisStore.domain.FsStorePaymentScrm;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.store.config.CompanyMenuConfig;
 import com.fs.system.domain.SysConfig;
+import com.fs.system.domain.SysDeptConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
+import com.fs.system.service.ISysDeptConfigLogService;
+import com.fs.system.service.ISysDeptConfigService;
 import com.google.gson.Gson;
 import com.hc.openapi.tool.util.ObjectUtils;
 import org.apache.commons.collections4.CollectionUtils;
@@ -95,6 +100,10 @@ public class CompanyServiceImpl implements ICompanyService
 
     @Autowired
     private CompanyUserMapper companyUserMapper;
+    @Autowired
+    private ISysDeptConfigService sysDeptConfigService;
+    @Autowired
+    private ISysDeptConfigLogService sysDeptConfigLogService;
 
     @Override
     public List<OptionsVO> selectAllCompanyList(Long deptId) {
@@ -145,6 +154,22 @@ public class CompanyServiceImpl implements ICompanyService
             return R.error("管理员帐号已存在");
         }
         company.setCreateTime(DateUtils.getNowDate());
+        SysConfig courseConfig = sysConfigMapper.selectConfigByConfigKey("course.config");
+        CourseConfig config = JSON.parseObject(courseConfig.getConfigValue(), CourseConfig.class);
+        if(config.getDeptLimit() != null && config.getDeptLimit() && !company.isAdmin() && company.getMaxPadNum() != null && company.getMaxPadNum() != -1){
+            SysDeptConfig deptConfig = sysDeptConfigService.getDeptConfig(company.getOldDeptId());
+            Integer padNum = company.getMaxPadNum();
+            long first = deptConfig.getPadNumSub() == null ? 0 : deptConfig.getPadNumSub();
+            long subNum = first + padNum;
+            if(deptConfig.getPadNum() < subNum){
+                throw new BaseException("部门可用PAD数量不足无法分配,请联系管理员添加");
+            }
+            deptConfig.setPadNumSub(subNum);
+            deptConfig.setUpdateBy(company.getCreateBy());
+            deptConfig.setUpdateTime(new Date());
+            sysDeptConfigLogService.addLog(deptConfig.getDeptId(), 0, 1, padNum.toString(), first + "", subNum + "", deptConfig.getUpdateBy(), "设置公司PAD");
+            sysDeptConfigService.updateById(deptConfig);
+        }
         if(companyMapper.insertCompany(company)>0){
             //写入帐号信息
             //创建部门
@@ -208,9 +233,9 @@ public class CompanyServiceImpl implements ICompanyService
             try {
                 String json = configService.selectConfigByKey("companymenu.config");
                 if (StringUtils.isNotEmpty(json) && !json.equals("")) {
-                    CompanyMenuConfig config = JSONUtil.toBean(json, CompanyMenuConfig.class);
-                    salesRole.setMenuIds(config.getMenuIds());
-                    if(config.getMenuIds().length > 0){
+                    CompanyMenuConfig config1 = JSONUtil.toBean(json, CompanyMenuConfig.class);
+                    salesRole.setMenuIds(config1.getMenuIds());
+                    if(config1.getMenuIds().length > 0){
                         roleService.insertRole(salesRole);
                     }else {
                         roleService.insertDefaultRole(salesRole);
@@ -271,6 +296,28 @@ public class CompanyServiceImpl implements ICompanyService
         if(company.isUpdateMiniApp()){
             bindMiniApp(company);
         }
+        if(company.isPageUpdate()){
+            SysConfig courseConfig = sysConfigMapper.selectConfigByConfigKey("course.config");
+            CourseConfig config = JSON.parseObject(courseConfig.getConfigValue(), CourseConfig.class);
+            if(config.getDeptLimit() != null && config.getDeptLimit() && !company.isAdmin() && company.getMaxPadNum() != null && company.getMaxPadNum() != -1){
+                Company oldCompany = selectCompanyById(company.getCompanyId());
+                if(oldCompany.getMaxPadNum() == -1){
+                    oldCompany.setMaxPadNum(0);
+                }
+                int changeNum = company.getMaxPadNum() - oldCompany.getMaxPadNum();
+                SysDeptConfig deptConfig = sysDeptConfigService.getDeptConfig(company.getOldDeptId());
+                long first = deptConfig.getPadNumSub() == null ? 0 : deptConfig.getPadNumSub();
+                long subNum = first + changeNum;
+                if(deptConfig.getPadNum() < subNum){
+                    throw new BaseException("部门可用PAD数量不足无法分配,请联系管理员添加");
+                }
+                deptConfig.setPadNumSub(subNum);
+                deptConfig.setUpdateBy(company.getCreateBy());
+                deptConfig.setUpdateTime(new Date());
+                sysDeptConfigLogService.addLog(deptConfig.getDeptId(), 0, 1, changeNum + "", first + "", subNum + "", deptConfig.getUpdateBy(), "修改公司PAD");
+                sysDeptConfigService.updateById(deptConfig);
+            }
+        }
         return companyMapper.updateCompany(company);
     }
     // 绑定小程序

+ 20 - 8
fs-service/src/main/java/com/fs/company/service/impl/CompanyTrafficRecordLogServiceImpl.java

@@ -9,8 +9,11 @@ import com.fs.company.service.ICompanyTrafficRecordLogService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
 
+import static com.fs.common.utils.DateUtils.getNowDate;
+
 @Service
 @Slf4j
 public class CompanyTrafficRecordLogServiceImpl extends ServiceImpl<CompanyTrafficRecordLogMapper, CompanyTrafficRecordLog> implements ICompanyTrafficRecordLogService {
@@ -18,14 +21,15 @@ public class CompanyTrafficRecordLogServiceImpl extends ServiceImpl<CompanyTraff
 
     @Override
     public List<CompanyTrafficRecordLog> selectList(CompanyTrafficRecordLogQueryParam record) {
-        return baseMapper.selectList(new LambdaQueryWrapper<CompanyTrafficRecordLog>()
-                .eq(record.getCompanyId() != null ,CompanyTrafficRecordLog::getCompanyId, record.getCompanyId())
-                .in(record.getCompanyIds() != null,CompanyTrafficRecordLog::getCompanyId, record.getCompanyIds())
-                .eq(record.getUserId() != null ,CompanyTrafficRecordLog::getUserId, record.getUserId())
-                .eq(record.getOperationType() != null ,CompanyTrafficRecordLog::getOperationType, record.getOperationType())
-                .eq(record.getCreateTime() != null ,CompanyTrafficRecordLog::getCreateTime, record.getCreateTime())
-                .between(record.getCreateTimeStart() != null && record.getCreateTimeEnd() != null,CompanyTrafficRecordLog::getCreateTime, record.getCreateTimeStart(), record.getCreateTimeEnd())
-                .orderByDesc(CompanyTrafficRecordLog::getCreateTime));
+        return baseMapper.list(record);
+//        return baseMapper.selectList(new LambdaQueryWrapper<CompanyTrafficRecordLog>()
+//                .eq(record.getCompanyId() != null ,CompanyTrafficRecordLog::getCompanyId, record.getCompanyId())
+//                .in(record.getCompanyIds() != null,CompanyTrafficRecordLog::getCompanyId, record.getCompanyIds())
+//                .eq(record.getUserId() != null ,CompanyTrafficRecordLog::getUserId, record.getUserId())
+//                .eq(record.getOperationType() != null ,CompanyTrafficRecordLog::getOperationType, record.getOperationType())
+//                .eq(record.getCreateTime() != null ,CompanyTrafficRecordLog::getCreateTime, record.getCreateTime())
+//                .between(record.getCreateTimeStart() != null && record.getCreateTimeEnd() != null,CompanyTrafficRecordLog::getCreateTime, record.getCreateTimeStart(), record.getCreateTimeEnd())
+//                .orderByDesc(CompanyTrafficRecordLog::getCreateTime));
     }
 
     @Override
@@ -37,4 +41,12 @@ public class CompanyTrafficRecordLogServiceImpl extends ServiceImpl<CompanyTraff
     public boolean save(CompanyTrafficRecordLog entity) {
         return baseMapper.insert(entity)==1;
     }
+
+    @Override
+    public CompanyTrafficRecordLog selectTodayRecord(Long companyId) {
+        /*return baseMapper.selectOne(new LambdaQueryWrapper<CompanyTrafficRecordLog>()
+                .eq(CompanyTrafficRecordLog::getCompanyId, companyId)
+                .eq(CompanyTrafficRecordLog::getOperationType, 1)*/
+        return null;
+    }
 }

+ 79 - 31
fs-service/src/main/java/com/fs/company/service/impl/CompanyTrafficRecordServiceImpl.java

@@ -1,9 +1,12 @@
 package com.fs.company.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.base.BaseException;
+import com.fs.common.utils.date.DateUtil;
 import com.fs.company.constant.CompanyTrafficConstants;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyTrafficRecord;
@@ -14,15 +17,22 @@ import com.fs.company.param.CompanyTrafficRecordQueryParam;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyTrafficRecordLogService;
 import com.fs.company.service.ICompanyTrafficRecordService;
+import com.fs.course.config.CourseConfig;
 import com.fs.course.mapper.FsCourseTrafficLogMapper;
 import com.fs.system.domain.SysConfig;
+import com.fs.system.domain.SysDeptConfig;
+import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.service.ISysConfigService;
+import com.fs.system.service.ISysDeptConfigLogService;
+import com.fs.system.service.ISysDeptConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.YearMonth;
 import java.util.Date;
 import java.util.HashMap;
@@ -49,12 +59,18 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
 
     @Autowired
     private FsCourseTrafficLogMapper fsCourseTrafficLogMapper;
+    @Autowired
+    private ISysDeptConfigService sysDeptConfigService;
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+    @Autowired
+    private ISysDeptConfigLogService sysDeptConfigLogService;
 
     //启动时初始化部门流量缓存
     @Override
     public void init() {
         List<CompanyTrafficRecord> companyTrafficRecords = baseMapper.selectList(new LambdaQueryWrapper<>());
-        Map<Long,Long> deptTrafficMap = new HashMap<>();
+        Map<Long, Long> deptTrafficMap = new HashMap<>();
         for (CompanyTrafficRecord companyTrafficRecord : companyTrafficRecords) {
             // 获取公司ID
             Long companyId = companyTrafficRecord.getCompanyId();
@@ -64,8 +80,9 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
 
             // 公司流量 - 消耗流量
             Long balance = companyTrafficRecord.getBalance();
+            Long traffic = fsCourseTrafficLogMapper.sumTrafficByCompany(companyId);
             //消耗的流量
-            Long totalInternetTraffic = fsCourseTrafficLogMapper.sumTrafficByCompany(companyId) == null?0L:fsCourseTrafficLogMapper.sumTrafficByCompany(companyId);
+            long totalInternetTraffic = traffic == null ? 0L : traffic;
             balance -= totalInternetTraffic;
             //部门流量记录
             Long deptTrafficAdd = (deptTrafficMap.get(deptId) == null ? 0L : deptTrafficMap.get(deptId)) + totalInternetTraffic;
@@ -88,38 +105,49 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
         log.info("【定时更新流量】:{}", "开始");
         List<CompanyTrafficRecord> companyTrafficRecords = baseMapper.selectList(new LambdaQueryWrapper<>());
         for (CompanyTrafficRecord companyTrafficRecord : companyTrafficRecords) {
-            doReduce(companyTrafficRecord,"1");
+            doReduce(companyTrafficRecord);
         }
     }
 
     //通过redis更新表流量并添加扣除日志
-    private void doReduce(CompanyTrafficRecord companyTrafficRecord, String doType) {
-
+    private void doReduce(CompanyTrafficRecord companyTrafficRecord) {
+        LocalDateTime now = LocalDateTime.now();
+        // 获取上一个小时的开始时间
+        LocalDateTime startTime = now.minusHours(1)
+                .withMinute(0)
+                .withSecond(0);
+        // 获取上一个小时的结束时间
+        LocalDateTime endTime = startTime
+                .withMinute(59)
+                .withSecond(59);
         //根据fs_course_traffic_log表获取公司昨天流量
-        Long trafficAmountYesterday = fsCourseTrafficLogMapper.sumTrafficByCompanyYesterday(companyTrafficRecord.getCompanyId());
-        if(trafficAmountYesterday!=null) {
+        Long trafficAmountYesterday = fsCourseTrafficLogMapper.sumTrafficByCompanyYesterday(companyTrafficRecord.getCompanyId(), DateUtil.formatLocalDateTime(startTime), DateUtil.formatLocalDateTime(endTime));
+        if (trafficAmountYesterday != null && trafficAmountYesterday > 0) {
+            //判断是否已经更新当天流量
+//            CompanyTrafficRecordLog todayRecodeLog =  companyTrafficRecordLogService.selectTodayRecord(companyTrafficRecord.getCompanyId());
+//            if(todayRecodeLog != null){
+//                return;
+//            }
             long balance = companyTrafficRecord.getBalance() - trafficAmountYesterday;
             companyTrafficRecord.setBalance(balance);
-            log.info("【更新流量】:{}", "部门ID:" + companyTrafficRecord.getDeptId() +"公司ID:" + companyTrafficRecord.getCompanyId() +  "消耗流量:" + trafficAmountYesterday+"剩余流量:"+balance);
-            if (trafficAmountYesterday > 0) {
-                baseMapper.updateById(CompanyTrafficRecord.builder()
-                        .id(companyTrafficRecord.getId())
-                        .balance(balance)
-                        .updateTime(new Date())
-                        .updateBy(1L).build());
-                companyTrafficRecordLogService.save(CompanyTrafficRecordLog.builder()
-                        .balance(balance)
-                        .trafficAmount(trafficAmountYesterday)
-                        .companyId(companyTrafficRecord.getCompanyId())
-                        .createTime(new Date())
-                        .operationType(2)
-                        .userId(1L)//表示amdin
-                        .remark("0".equals(doType)?"重启同步流量":"定时更新扣除流量")
-                        .userName("admin")
-                        .build());
-            }
+            log.info("【更新流量】:{}", "部门ID:" + companyTrafficRecord.getDeptId() + "公司ID:" + companyTrafficRecord.getCompanyId() + "消耗流量:" + trafficAmountYesterday + "剩余流量:" + balance);
+            baseMapper.updateById(CompanyTrafficRecord.builder()
+                    .id(companyTrafficRecord.getId())
+                    .balance(balance)
+                    .updateTime(new Date())
+                    .updateBy(1L).build());
+            companyTrafficRecordLogService.save(CompanyTrafficRecordLog.builder()
+                    .balance(balance)
+                    .trafficAmount(trafficAmountYesterday)
+                    .companyId(companyTrafficRecord.getCompanyId())
+                    .createTime(new Date())
+                    .operationType(2)
+                    .userId(1L)//表示amdin
+                    .remark("定时更新扣除流量")
+                    .userName("定时任务")
+                    .build());
         }
-        init();
+//        init();
     }
 
     @Override
@@ -137,6 +165,21 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
         //充值
         if (record.getOperationType() == 1) {//获取转换后的流量
             Long trafficAmount = trafficConversion(record.getChargeAmount());
+            SysConfig courseConfig = sysConfigMapper.selectConfigByConfigKey("course.config");
+            CourseConfig config = JSON.parseObject(courseConfig.getConfigValue(), CourseConfig.class);
+            if (config.getDeptLimit() != null && config.getDeptLimit() && !record.getIsAdmin()) {
+                SysDeptConfig deptConfig = sysDeptConfigService.getDeptConfig(record.getDeptId());
+                Long flowNum = deptConfig.getFlowNum();
+                long surplus = flowNum - trafficAmount;
+                if (surplus < 0) {
+                    throw new BaseException("部门可用流量不足无法分配,请联系管理员充值");
+                }
+                deptConfig.setFlowNum(surplus);
+                deptConfig.setUpdateBy(record.getUserName());
+                deptConfig.setUpdateTime(new Date());
+                sysDeptConfigLogService.addLog(deptConfig.getDeptId(), 2, 1, trafficAmount.toString(), flowNum.toString(), surplus + "", record.getUserName(), "充值公司流量");
+                sysDeptConfigService.updateById(deptConfig);
+            }
             record.setChangeTraffic(trafficAmount);//用于处理日志
             if (companyRecord != null) {
                 //不是第一次充值  增加流量
@@ -144,6 +187,7 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
                 companyTrafficRecord.setId(companyRecord.getId());
                 companyTrafficRecord.setUpdateTime(new Date());
                 companyTrafficRecord.setUpdateBy(record.getUserId());
+                companyTrafficRecord.setDeptId(record.getDeptId());
                 baseMapper.updateById(companyTrafficRecord);
             } else {
                 companyTrafficRecord.setBalance(trafficAmount);
@@ -152,6 +196,7 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
                 companyTrafficRecord.setCompanyName(record.getCompany().getCompanyName());
                 companyTrafficRecord.setCreateTime(new Date());
                 companyTrafficRecord.setCreateBy(record.getUserId());
+                companyTrafficRecord.setDeptId(record.getDeptId());
                 baseMapper.insert(companyTrafficRecord);
             }
                 /*//扣除
@@ -186,8 +231,10 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
             return false;
         }
     }
+
     /**
      * 更新Redis缓存
+     *
      * @param record               充值参数
      * @param companyTrafficRecord 公司流量记录
      */
@@ -198,27 +245,28 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
                     companyTrafficRecord.getBalance());
 
             // 部门新增流量
-            calculateTrafficByDeptId(record.getCompany().getDeptId(),companyTrafficRecord.getBalance());
+            calculateTrafficByDeptId(record.getCompany().getDeptId(), companyTrafficRecord.getBalance());
         } else {
             // 抛出异常
             throw new IllegalArgumentException("缓存ID异常");
         }
     }
+
     /**
      * 部门下所有公司流量总和减去使用的流量
      */
-    private void calculateTrafficByDeptId(Long deptId,Long traffic) {
+    private void calculateTrafficByDeptId(Long deptId, Long traffic) {
         redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, traffic);
     }
 
     /**
      * 部门下所有公司流量总和减去使用的流量
      */
-    private void calculateTotalTrafficByDeptId(Map<Long,Long> deptTrafficMap) {
-        deptTrafficMap.forEach((deptId,totalTraffic) -> {
+    private void calculateTotalTrafficByDeptId(Map<Long, Long> deptTrafficMap) {
+        deptTrafficMap.forEach((deptId, totalTraffic) -> {
             Long total = baseMapper.calculateTotalTrafficByDeptId(deptId);
             redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId);
-            redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, total-totalTraffic);
+            redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + deptId, total - totalTraffic);
             //删除前天缓存
             redisCache.deleteObject(CompanyTrafficConstants.CACHE_KEY + ":" + deptId + ":" + LocalDate.now().minusDays(2));
             //删除上上月缓存

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

@@ -21,6 +21,7 @@ public class CompanyDeductVO implements Serializable {
      * ID
      */
     private Long deductId;
+    private Long deptId;
 
     /**
      * 企业ID

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

@@ -24,6 +24,7 @@ public class CompanyRechargeVO implements Serializable {
      * ID
      */
     private Long rechargeId;
+    private Long deptId;
 
     /**
      * 企业ID

+ 2 - 0
fs-service/src/main/java/com/fs/course/config/CourseConfig.java

@@ -62,7 +62,9 @@ public class CourseConfig implements Serializable {
      * 是否绑定
      */
     private Boolean isBound;
+    private Boolean isAllratingRating;
     private Boolean dept;
+    private Boolean deptLimit;
     /**
      * 是否单销售观看(只能在第一次绑定的销售头上看课)
      */

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

@@ -192,7 +192,5 @@ public interface FsCourseTrafficLogMapper
             "WHERE DATE(T.create_time) = DATE(CURDATE()) AND T.company_id = #{companyId} GROUP BY T.company_id ")
     Long sumTrafficByCompany(Long companyId);
 
-    @Select("SELECT SUM(T.internet_traffic)/1024 AS totalInternetTraffic FROM fs_course_traffic_log T " +
-            "WHERE DATE(T.create_time) = DATE(CURDATE() - INTERVAL 1 DAY) AND T.company_id = #{companyId} GROUP BY T.company_id ")
-    Long sumTrafficByCompanyYesterday(Long companyId);
+    Long sumTrafficByCompanyYesterday(@Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java

@@ -36,6 +36,9 @@ public class FsCourseWatchLogListParam implements Serializable {
 
     private Integer sendType;
 
+    //销售-部门(组)
+    private Long deptId;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date eTime;
 

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

@@ -91,7 +91,6 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.*;
-import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
@@ -871,8 +870,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             // 处理 UUID 为空的情况
             if (StringUtils.isNotEmpty(trafficLog.getUuId())) {
                 // 插入或更新
-                fsCourseTrafficLogMapper.insertOrUpdateTrafficLog(trafficLog);
                 asyncDeductTraffic(company, trafficLog);
+                fsCourseTrafficLogMapper.insertOrUpdateTrafficLog(trafficLog);
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -900,15 +899,15 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             Long remainingTraffic = updateRedisCache(company, recordedTraffic/1024);
 
             if ("1".equals(configUtil.generateConfigByKey("watch.course.config").getString("doNotPlay")) && remainingTraffic <= 0) {
-                logger.warn("公司ID: {} 流量不足,当前剩余: {}", company.getCompanyId(), remainingTraffic);
+                //logger.warn("公司ID: {} 流量不足,当前剩余: {}", company.getCompanyId(), remainingTraffic);
                 throw new Exception("流量不足");
             }
 
             /*logger.info("异步扣除流量成功 - 公司ID: {}, 扣除流量: {}, 剩余流量: {}",
                     company.getCompanyId(), traffic, remainingTraffic);*/
-        } catch (Exception e) {
-            logger.error("异步扣除流量失败 - 公司ID: {}, 错误信息: {}",
-                    company.getCompanyId(), e.getMessage(), e);
+        } catch (Exception ignored) {
+            /*logger.error("异步扣除流量失败 - 公司ID: {}, 错误信息: {}",
+                    company.getCompanyId(), e.getMessage(), e);*/
         }
     }
 
@@ -1246,9 +1245,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             redPacketLog.setPeriodId(param.getPeriodId());
             redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
-            // 更新观看记录的奖励类型
-            log.setRewardType(config.getRewardType());
-            courseWatchLogMapper.updateFsCourseWatchLog(log);
+                // 更新观看记录的奖励类型
+                log.setRewardType(config.getRewardType());
+                courseWatchLogMapper.updateFsCourseWatchLog(log);
             return R.ok("红包发送成功");
         }
 
@@ -2897,8 +2896,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             // 处理 UUID 为空的情况
             if (StringUtils.isNotEmpty(trafficLog.getUuId())) {
                 // 插入或更新
-                fsCourseTrafficLogMapper.insertOrUpdateTrafficLog(trafficLog);
                 asyncDeductTraffic(company, trafficLog);
+                fsCourseTrafficLogMapper.insertOrUpdateTrafficLog(trafficLog);
             }
         } catch (Exception e) {
             e.printStackTrace();

+ 3 - 21
fs-service/src/main/java/com/fs/hisStore/config/MedicalMallConfig.java

@@ -3,20 +3,15 @@ package com.fs.hisStore.config;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fs.his.utils.ConfigUtil;
+import lombok.Data;
 import lombok.Getter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
-import java.util.Objects;
 
-@Getter
-@Component
+@Data
 public class MedicalMallConfig {
-
-    @Autowired
-    @JsonIgnore
-    private ConfigUtil configUtil;
     /*
     {"isMedicalMall":"0","statics":"1","isAudit":"0"}
     */
@@ -28,19 +23,6 @@ public class MedicalMallConfig {
     private boolean isAudit;
     // 资源配置
     private boolean isResource;
-    // 多店铺
-    private boolean isStores;
-    @PostConstruct
-    public void init() {
-        JSONObject jsonObject = configUtil.generateConfigByKey("medicalMall.func.switch");
-        if (jsonObject != null) {
-            this.isMedicalMall = Objects.equals(jsonObject.getString("isMedicalMall"), "1");
-            this.isStatics = Objects.equals(jsonObject.getString("statics"), "1");
-            this.isAudit = Objects.equals(jsonObject.getString("isAudit"), "1");
-            this.isResource = Objects.equals(jsonObject.getString("isResource"), "1");
-            this.isStores = Objects.equals(jsonObject.getString("isStores"), "1");
-        }
-    }
-
 
+    private boolean isStores;
 }

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

@@ -375,4 +375,14 @@ public interface FsStoreProductScrmMapper
     List<FsStoreProductActivityListVO> selectFsStoreProductByIdsAudit(String productIds,@Param("config") MedicalMallConfig  config);
 
     List<FsStoreProductScrm> bulkCopyFsStoreProductByIds(Long[] productIds);
+
+    @Select("SELECT " +
+            " distinct  " +
+            "    COLUMN_NAME as colName,  " +
+            "    COLUMN_COMMENT  as colComment " +
+            "FROM  " +
+            "    information_schema.COLUMNS  " +
+            "WHERE  " +
+            "    TABLE_NAME = 'fs_store_product_scrm'")
+    List<Map<String, String>> getStoreProductColumns();
 }

+ 14 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreScrmMapper.java

@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 店铺管理Mapper接口
@@ -88,4 +89,17 @@ public interface FsStoreScrmMapper
 //    @Select("select store_id ,store_name,bus_no,bus_name  from fs_store_scrm ")
     @Select("select store_id ,store_name  from fs_store_scrm ")
     List<FsStoreScrmVO> selectFsAllStoreList();
+
+    @Select("SELECT " +
+            " distinct  " +
+            "    COLUMN_NAME as colName,  " +
+            "    COLUMN_COMMENT as colComment " +
+            "FROM  " +
+            "    information_schema.COLUMNS  " +
+            "WHERE  " +
+            "    TABLE_NAME = 'fs_store_scrm'")
+    List<Map<String, String>> getStoreColumns();
+
+    @Select("SELECT store_id,store_name from fs_store_scrm ")
+    List<FsStoreScrm> selectFsStoreListOption(FsStoreScrm fsStore);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java

@@ -137,4 +137,6 @@ public interface IFsStoreProductScrmService
     List<FsStoreProductActivityListVO> selectFsStoreProductByIdsAudit(String productIds);
 
     R bulkCopyFsStoreProductByIds(Long[] productIds);
+
+    List<Map<String, String>> getStoreProductColumns();
 }

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreScrmService.java

@@ -6,6 +6,7 @@ import com.fs.hisStore.vo.FsStoreRecommendListVO;
 import com.fs.hisStore.vo.FsStoreScrmVO;
 
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -84,4 +85,8 @@ public interface IFsStoreScrmService
     List<FsStoreRecommendListVO> storeRecommendList();
 
     List<FsStoreScrmVO> selectAllStore();
+
+    List<Map<String, String>> getStoreColumns();
+
+    List<FsStoreScrm> selectFsStoreListOption(FsStoreScrm fsStore);
 }

+ 6 - 2
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.hisStore.service.impl;
 
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
@@ -26,6 +27,8 @@ import com.fs.hisStore.param.FsStoreCartNumParam;
 import com.fs.hisStore.param.FsStoreCartParam;
 import com.fs.hisStore.service.IFsStoreCartScrmService;
 import com.fs.hisStore.vo.FsStoreCartVO;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -65,9 +68,8 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
 
     @Autowired
     private ConfigUtil configUtil;
-
     @Autowired
-    private MedicalMallConfig medicalMallConfig;
+    private ISysConfigService configService;
 
 
 
@@ -204,6 +206,8 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
 
     @Override
     public List<FsStoreCartVO> selectFsStoreCartListByUid(long uid) {
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         return fsStoreCartMapper.selectFsStoreCartListByUid(uid, medicalMallConfig);
     }
 

+ 7 - 2
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductAttrValueScrmServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.hisStore.service.impl;
 
 import java.util.List;
 
+import com.alibaba.fastjson.JSON;
 import com.fs.hisStore.config.MedicalMallConfig;
 import com.fs.hisStore.param.FsProductAttrValueParam;
 import com.fs.hisStore.param.FsStoreProductAttrValueQueryParam;
@@ -9,6 +10,8 @@ import com.fs.hisStore.param.FsStoreTuiProductAttrValueParam;
 import com.fs.hisStore.vo.FsStoreProductAttrValueQueryVO;
 import com.fs.hisStore.vo.FsStoreProductAttrValueVO;
 import com.fs.hisStore.vo.FsStoreTuiProductAttrValueVO;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.hisStore.mapper.FsStoreProductAttrValueScrmMapper;
@@ -28,7 +31,7 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
     private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueMapper;
 
     @Autowired
-    private MedicalMallConfig config;
+    private ISysConfigService configService;
 
     /**
      * 查询商品属性值
@@ -119,7 +122,9 @@ public class FsStoreProductAttrValueScrmServiceImpl implements IFsStoreProductAt
 
     @Override
     public List<FsStoreProductAttrValueQueryVO> selectStoreProductAttrValueListQuery(FsStoreProductAttrValueQueryParam param) {
-        return fsStoreProductAttrValueMapper.selectStoreProductAttrValueListQuery(param, config);
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
+        return fsStoreProductAttrValueMapper.selectStoreProductAttrValueListQuery(param, medicalMallConfig);
     }
 
     @Override

+ 116 - 10
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.hisStore.service.impl;
 
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.*;
@@ -10,6 +11,7 @@ import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
@@ -38,6 +40,9 @@ import com.fs.hisStore.param.FsStoreProductQueryParam;
 import com.fs.hisStore.service.IFsStoreProductAttrValueScrmService;
 import com.fs.hisStore.vo.*;
 import com.fs.statis.dto.ProductAuditDTO;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.service.ISysConfigService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,6 +60,7 @@ import org.springframework.transaction.annotation.Transactional;
  */
 @Service
 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+@Slf4j
 public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
 {
     @Autowired
@@ -78,6 +84,8 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
 
     @Autowired
     private ConfigUtil configUtil;
+    @Autowired
+    private ISysConfigService configService;
 
     @Autowired
     @Qualifier("hzOMSErpGoodsServiceImpl")
@@ -92,9 +100,6 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
     @Autowired
     private FsStoreScrmServiceImpl fsStoreScrmService;
 
-    @Autowired
-    private MedicalMallConfig medicalMallConfig;
-
     @Autowired
     private CloudHostProper cloudHostProper;
 
@@ -148,13 +153,62 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
     {
         fsStoreProduct.setUpdateTime(DateUtils.getNowDate());
         storeAuditLogUtil.addOperLog(fsStoreProduct.getProductId());
-        //对已上架的商品进行修改需要重新审核
-        if(1 == fsStoreProduct.getIsShow() && "1".equals(fsStoreProduct.getIsAudit())){
-            fsStoreProduct.setIsAudit("0");
+        FsStoreProductScrm oldFsStoreProduct = fsStoreProductMapper.selectFsStoreProductById(fsStoreProduct.getProductId());
+        Boolean isAudit = configUtil.generateConfigByKey("medicalMall.func.switch").getBoolean("isAudit");
+        try {
+            if (isAudit != null && isAudit) {
+                if (oldFsStoreProduct.getIsAudit() != null && "1".equals(oldFsStoreProduct.getIsAudit())) {
+                    Map<String, Object> diff = getDiff(oldFsStoreProduct, fsStoreProduct);
+                    Set<String> diff_columns = diff.keySet();
+                    JSONArray productColumns = configUtil.generateConfigByKey("medicalMall.func.switch").getJSONArray("productColumns");
+                    if(com.fs.common.utils.StringUtils.isNotEmpty(productColumns)){
+                        //判断diff_columns是否在productColumns中,不是则将isAudit设置为0
+                        for (String column : diff_columns) {
+                            if (!productColumns.contains(column)) {
+                                fsStoreProduct.setIsAudit("0");
+                                break;
+                            }
+                        }
+                    }else{
+                        fsStoreProduct.setIsAudit("0");
+                    }
+                }
+            }
+        } catch (IllegalAccessException e) {
+            log.error("获取diff出错", e);
         }
         return fsStoreProductMapper.updateFsStoreProduct(fsStoreProduct);
     }
 
+    public static Map<String, Object> getDiff(Object obj1, Object obj2) throws IllegalAccessException {
+        Map<String, Object> diff = new HashMap<>();
+        if (obj1 == null || obj2 == null || !obj1.getClass().equals(obj2.getClass())) {
+            return diff;
+        }
+
+        Field[] fields = obj1.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            field.setAccessible(true);
+            Object value1 = field.get(obj1);
+            Object value2 = field.get(obj2);
+
+            // BigDecimal类型特殊处理
+            if (value1 instanceof BigDecimal && value2 instanceof BigDecimal) {
+                BigDecimal bd1 = (BigDecimal) value1;
+                BigDecimal bd2 = (BigDecimal) value2;
+                // 使用compareTo方法比较,避免精度问题
+                if (bd1.compareTo(bd2) != 0) {
+                    diff.put(field.getName(), new Object[]{value1, value2});
+                }
+            }
+            // 其他类型使用默认比较
+            else if (!Objects.equals(value1, value2)) {
+                diff.put(field.getName(), new Object[]{value1, value2});
+            }
+        }
+        return diff;
+    }
+
     /**
      * 批量删除商品
      *
@@ -370,9 +424,29 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         }
 
         if(param.getProductId() != null && param.getProductId() > 0){
-            //对已上架的商品进行修改需要重新审核
-            if(1 == product.getIsShow() && "1".equals(product.getIsAudit())){
-                product.setIsAudit("0");
+            FsStoreProductScrm oldFsStoreProduct = fsStoreProductMapper.selectFsStoreProductById(product.getProductId());
+            Boolean isAudit = configUtil.generateConfigByKey("medicalMall.func.switch").getBoolean("isAudit");
+            try {
+                if (isAudit != null && isAudit) {
+                    if (oldFsStoreProduct.getIsAudit() != null && "1".equals(oldFsStoreProduct.getIsAudit())) {
+                        Map<String, Object> diff = getDiff(oldFsStoreProduct, product);
+                        Set<String> diff_columns = diff.keySet();
+                        JSONArray productColumns = configUtil.generateConfigByKey("medicalMall.func.switch").getJSONArray("productColumns");
+                        if(com.fs.common.utils.StringUtils.isNotEmpty(productColumns)){
+                            //判断diff_columns是否在productColumns中,不是则将isAudit设置为0
+                            for (String column : diff_columns) {
+                                if (!productColumns.contains(column)) {
+                                    product.setIsAudit("0");
+                                    break;
+                                }
+                            }
+                        }else{
+                            product.setIsAudit("0");
+                        }
+                    }
+                }
+            } catch (IllegalAccessException e) {
+                log.error("获取diff出错", e);
             }
             fsStoreProductMapper.updateFsStoreProduct(product);
             if (param.getSpecType().equals(0)) {
@@ -679,6 +753,8 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
 
     @Override
     public List<FsStoreProductListQueryVO> selectFsStoreProductListQuery(FsStoreProductQueryParam param) {
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         boolean stores = medicalMallConfig.isStores();
         param.setIsStores(stores?1:0);
         return fsStoreProductMapper.selectFsStoreProductListQuery(param);
@@ -686,6 +762,8 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
 
     @Override
     public FsStoreProductQueryVO selectFsStoreProductByIdQuery(Long productId,String storeId) {
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         return fsStoreProductMapper.selectFsStoreProductByIdQuery(productId,storeId,medicalMallConfig);
     }
 
@@ -711,6 +789,8 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
     @Override
     public List<FsStoreProductListQueryVO> selectFsStoreProductNewQuery(int count) {
         HashMap<String, Object> map = new HashMap<>();
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         map.put("count", count);
         map.put("config", medicalMallConfig);
         return fsStoreProductMapper.selectFsStoreProductNewQuery(map);
@@ -719,6 +799,8 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
     @Override
     public List<FsStoreProductListQueryVO> selectFsStoreProductHotQuery(int count) {
         HashMap<String, Object> map = new HashMap<>();
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         map.put("count", count);
         map.put("config", medicalMallConfig);
         return fsStoreProductMapper.selectFsStoreProductHotQuery(map);
@@ -726,16 +808,22 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
 
     @Override
     public List<FsStoreProductListQueryVO> selectFsStoreProductGoodQuery(int count) {
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         return fsStoreProductMapper.selectFsStoreProductGoodQuery(count,medicalMallConfig);
     }
 
     @Override
     public List<FsStoreProductListQueryVO> selectFsStoreProductTuiListQuery() {
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         return fsStoreProductMapper.selectFsStoreProductTuiListQuery(medicalMallConfig);
     }
 
     @Override
     public List<FsStoreProductListQueryVO> selectFsStoreProductGoodListQuery() {
+        SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         return fsStoreProductMapper.selectFsStoreProductGoodListQuery(medicalMallConfig);
     }
 
@@ -1049,7 +1137,8 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
     }
 
     @Override
-    public List<FsStoreProductActivityListVO> selectFsStoreProductByIdsAudit(String productIds) {
+    public List<FsStoreProductActivityListVO> selectFsStoreProductByIdsAudit(String productIds) {SysConfig config = configService.selectConfigByConfigKey("medicalMall.func.switch");
+        MedicalMallConfig medicalMallConfig = JSON.parseObject(config.getConfigValue(), MedicalMallConfig.class);
         return fsStoreProductMapper.selectFsStoreProductByIdsAudit(productIds,medicalMallConfig);
     }
 
@@ -1148,4 +1237,21 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         }
         return R.ok();
     }
+
+    @Override
+    public List<Map<String, String>> getStoreProductColumns() {
+        List<Map<String, String> > list = fsStoreProductMapper.getStoreProductColumns();
+        List<Map<String, String>> result = new ArrayList<>();
+        for (Map<String, String> column : list) {
+            Map<String, String> camelCaseColumn = new HashMap<>();
+            String columnName = column.get("colName");
+            String camelCaseName = com.fs.common.utils.StringUtils.toCamelCase(columnName);;
+            camelCaseColumn.put("colName", camelCaseName);
+            camelCaseColumn.put("colComment", column.get("colComment"));
+            result.add(camelCaseColumn);
+        }
+
+        return result;
+    }
+
 }

+ 42 - 8
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreScrmServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.hisStore.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
@@ -24,6 +25,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.lang.reflect.Field;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -113,18 +115,17 @@ public class FsStoreScrmServiceImpl implements IFsStoreScrmService
         fsStore.setUpdateTime(DateUtils.getNowDate());
         storeAuditLogUtil.addOperLog(fsStore.getStoreId());
         FsStoreScrm oldFsStore = fsStoreMapper.selectFsStoreByStoreId(fsStore.getStoreId());
-        String isAudit = configUtil.generateConfigByKey("medicalMall.func.switch").getString("isAudit");
+        Boolean isAudit = configUtil.generateConfigByKey("medicalMall.func.switch").getBoolean("isAudit");
         try {
-            if ("1".equals(isAudit)) {
+            if (isAudit != null && isAudit) {
                 if (fsStore.getIsAudit() != null && 1 == fsStore.getIsAudit()) {
                     Map<String, Object> diff = getDiff(oldFsStore, fsStore);
                     Set<String> diff_columns = diff.keySet();
-                    String passColumnStr = configUtil.generateConfigByKey("medicalMall.func.switch").getString("pass_columns");
-                    if(StringUtils.isNotEmpty(passColumnStr)){
-                        List<String> pass_columns = Arrays.asList(passColumnStr.split(","));
-                        //判断diff_columns是否在pass_columns中,不是则将isAudit设置为0
+                    JSONArray storeColumns = configUtil.generateConfigByKey("medicalMall.func.switch").getJSONArray("storeColumns");
+                    if(StringUtils.isNotEmpty(storeColumns)){
+                        //判断diff_columns是否在storeColumns中,不是则将isAudit设置为0
                         for (String column : diff_columns) {
-                            if (!pass_columns.contains(column)) {
+                            if (!storeColumns.contains(column)) {
                                 fsStore.setIsAudit(0);
                                 break;
                             }
@@ -151,7 +152,17 @@ public class FsStoreScrmServiceImpl implements IFsStoreScrmService
             field.setAccessible(true);
             Object value1 = field.get(obj1);
             Object value2 = field.get(obj2);
-            if (!Objects.equals(value1, value2)) {
+            // BigDecimal类型特殊处理
+            if (value1 instanceof BigDecimal && value2 instanceof BigDecimal) {
+                BigDecimal bd1 = (BigDecimal) value1;
+                BigDecimal bd2 = (BigDecimal) value2;
+                // 使用compareTo方法比较,避免精度问题
+                if (bd1.compareTo(bd2) != 0) {
+                    diff.put(field.getName(), new Object[]{value1, value2});
+                }
+            }
+            // 其他类型使用默认比较
+            else if (!Objects.equals(value1, value2)) {
                 diff.put(field.getName(), new Object[]{value1, value2});
             }
         }
@@ -263,5 +274,28 @@ public class FsStoreScrmServiceImpl implements IFsStoreScrmService
         return fsStoreMapper.selectFsAllStoreList();
     }
 
+    @Override
+    public List<Map<String, String>> getStoreColumns() {
+        List<Map<String, String> > list = fsStoreMapper.getStoreColumns();
+        List<Map<String, String>> result = new ArrayList<>();
+
+        for (Map<String, String> column : list) {
+            Map<String, String> camelCaseColumn = new HashMap<>();
+            String columnName = column.get("colName");
+            String camelCaseName = StringUtils.toCamelCase(columnName);
+            camelCaseColumn.put("colName", camelCaseName);
+            camelCaseColumn.put("colComment", column.get("colComment"));
+            result.add(camelCaseColumn);
+        }
+
+        return result;
+    }
+
+    @Override
+    public List<FsStoreScrm> selectFsStoreListOption(FsStoreScrm fsStore) {
+        return fsStoreMapper.selectFsStoreListOption(fsStore);
+    }
+
+
 }
 

+ 2 - 2
fs-service/src/main/java/com/fs/sop/mapper/SopUserLogsMapper.java

@@ -59,7 +59,7 @@ public interface SopUserLogsMapper {
     public List<SopUserLogs> meetsTheRatingByUserInfo();
 
     @DataSource(DataSourceType.SOP)
-    public List<SopUserLogs> meetsTheRatingByUserInfoWithPagination(@Param("offset") int offset,@Param("pageSize") int pageSize);
+    public List<SopUserLogs> meetsTheRatingByUserInfoWithPagination(@Param("offset") int offset, @Param("pageSize") int pageSize, @Param("isAllratingRating") Boolean isAllratingRating);
 
     @DataSource(DataSourceType.SOP)
     public List<SopUserLogs> meetsTheRatingByUserInfoWithPaginationStudyDays(@Param("offset") int offset,@Param("pageSize") int pageSize,@Param("notStudyDays") Integer notStudyDays);
@@ -113,7 +113,7 @@ public interface SopUserLogsMapper {
 
     @DataSource(DataSourceType.SOP)
     @Select("<script>" +
-            "select li.sop_id,li.external_contact_id,li.qw_user_id,li.corp_id,li.external_id,li.external_user_name,li.fs_user_id,ul.start_time,li.is_days_not_study " +
+            "select li.sop_id,li.external_contact_id,li.qw_user_id,li.corp_id,li.external_id,li.external_user_name,li.fs_user_id,ul.start_time,li.is_days_not_study, li.grade " +
             "from sop_user_logs ul  " +
             "INNER join  sop_user_logs_info li on ul.id=li.user_logs_id " +
             "        WHERE ul.id IN\n" +

+ 55 - 0
fs-service/src/main/java/com/fs/system/domain/SysDeptConfig.java

@@ -0,0 +1,55 @@
+package com.fs.system.domain;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 部门配置对象 sys_dept_config
+ *
+ * @author fs
+ * @date 2025-09-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SysDeptConfig extends BaseEntity{
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 部门ID */
+    @Excel(name = "部门ID")
+    private Long deptId;
+
+    /** pad 数量限制 */
+    @Excel(name = "pad 数量限制")
+    private Long padNum;
+
+    /** 剩余pad 数量 */
+    @Excel(name = "剩余pad 数量")
+    private Long padNumSub;
+
+    /** pad 过期时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "pad 过期时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private LocalDate padTime;
+
+    /** 剩余红包金额 */
+    @Excel(name = "剩余红包金额")
+    private BigDecimal redPackage;
+
+    /** 流量 */
+    @Excel(name = "流量")
+    private Long flowNum;
+
+
+}

+ 49 - 0
fs-service/src/main/java/com/fs/system/domain/SysDeptConfigLog.java

@@ -0,0 +1,49 @@
+package com.fs.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 系统部门资源配置使用记录对象 sys_dept_config_log
+ *
+ * @author fs
+ * @date 2025-09-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SysDeptConfigLog extends BaseEntity{
+
+    /** id */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 部门ID */
+    @Excel(name = "部门ID")
+    private Long deptId;
+
+    /** 数据类型(0红包1流量) */
+    @Excel(name = "数据类型", readConverterExp = "0=pad1=红包2=流量")
+    private Integer logType;
+
+    /** 操作类型(0新增1减少) */
+    @Excel(name = "操作类型", readConverterExp = "0=新增1减少")
+    private Integer operateType;
+
+    /** 操作数量 */
+    @Excel(name = "操作数量")
+    private String num;
+
+    /** 操作前数量 */
+    @Excel(name = "操作前数量")
+    private String firstNum;
+
+    /** 操作完成后数量 */
+    @Excel(name = "操作完成后数量")
+    private String lastNum;
+
+
+}

+ 61 - 0
fs-service/src/main/java/com/fs/system/mapper/SysDeptConfigLogMapper.java

@@ -0,0 +1,61 @@
+package com.fs.system.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.system.domain.SysDeptConfigLog;
+
+/**
+ * 系统部门资源配置使用记录Mapper接口
+ * 
+ * @author fs
+ * @date 2025-09-22
+ */
+public interface SysDeptConfigLogMapper extends BaseMapper<SysDeptConfigLog>{
+    /**
+     * 查询系统部门资源配置使用记录
+     * 
+     * @param id 系统部门资源配置使用记录主键
+     * @return 系统部门资源配置使用记录
+     */
+    SysDeptConfigLog selectSysDeptConfigLogById(Long id);
+
+    /**
+     * 查询系统部门资源配置使用记录列表
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 系统部门资源配置使用记录集合
+     */
+    List<SysDeptConfigLog> selectSysDeptConfigLogList(SysDeptConfigLog sysDeptConfigLog);
+
+    /**
+     * 新增系统部门资源配置使用记录
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 结果
+     */
+    int insertSysDeptConfigLog(SysDeptConfigLog sysDeptConfigLog);
+
+    /**
+     * 修改系统部门资源配置使用记录
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 结果
+     */
+    int updateSysDeptConfigLog(SysDeptConfigLog sysDeptConfigLog);
+
+    /**
+     * 删除系统部门资源配置使用记录
+     * 
+     * @param id 系统部门资源配置使用记录主键
+     * @return 结果
+     */
+    int deleteSysDeptConfigLogById(Long id);
+
+    /**
+     * 批量删除系统部门资源配置使用记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteSysDeptConfigLogByIds(Long[] ids);
+}

+ 61 - 0
fs-service/src/main/java/com/fs/system/mapper/SysDeptConfigMapper.java

@@ -0,0 +1,61 @@
+package com.fs.system.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.system.domain.SysDeptConfig;
+
+/**
+ * 部门配置Mapper接口
+ * 
+ * @author fs
+ * @date 2025-09-22
+ */
+public interface SysDeptConfigMapper extends BaseMapper<SysDeptConfig>{
+    /**
+     * 查询部门配置
+     * 
+     * @param id 部门配置主键
+     * @return 部门配置
+     */
+    SysDeptConfig selectSysDeptConfigById(Long id);
+
+    /**
+     * 查询部门配置列表
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 部门配置集合
+     */
+    List<SysDeptConfig> selectSysDeptConfigList(SysDeptConfig sysDeptConfig);
+
+    /**
+     * 新增部门配置
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 结果
+     */
+    int insertSysDeptConfig(SysDeptConfig sysDeptConfig);
+
+    /**
+     * 修改部门配置
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 结果
+     */
+    int updateSysDeptConfig(SysDeptConfig sysDeptConfig);
+
+    /**
+     * 删除部门配置
+     * 
+     * @param id 部门配置主键
+     * @return 结果
+     */
+    int deleteSysDeptConfigById(Long id);
+
+    /**
+     * 批量删除部门配置
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteSysDeptConfigByIds(Long[] ids);
+}

+ 63 - 0
fs-service/src/main/java/com/fs/system/service/ISysDeptConfigLogService.java

@@ -0,0 +1,63 @@
+package com.fs.system.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.system.domain.SysDeptConfigLog;
+
+/**
+ * 系统部门资源配置使用记录Service接口
+ * 
+ * @author fs
+ * @date 2025-09-22
+ */
+public interface ISysDeptConfigLogService extends IService<SysDeptConfigLog>{
+    /**
+     * 查询系统部门资源配置使用记录
+     * 
+     * @param id 系统部门资源配置使用记录主键
+     * @return 系统部门资源配置使用记录
+     */
+    SysDeptConfigLog selectSysDeptConfigLogById(Long id);
+
+    /**
+     * 查询系统部门资源配置使用记录列表
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 系统部门资源配置使用记录集合
+     */
+    List<SysDeptConfigLog> selectSysDeptConfigLogList(SysDeptConfigLog sysDeptConfigLog);
+
+    /**
+     * 新增系统部门资源配置使用记录
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 结果
+     */
+    int insertSysDeptConfigLog(SysDeptConfigLog sysDeptConfigLog);
+
+    /**
+     * 修改系统部门资源配置使用记录
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 结果
+     */
+    int updateSysDeptConfigLog(SysDeptConfigLog sysDeptConfigLog);
+
+    /**
+     * 批量删除系统部门资源配置使用记录
+     * 
+     * @param ids 需要删除的系统部门资源配置使用记录主键集合
+     * @return 结果
+     */
+    int deleteSysDeptConfigLogByIds(Long[] ids);
+
+    /**
+     * 删除系统部门资源配置使用记录信息
+     * 
+     * @param id 系统部门资源配置使用记录主键
+     * @return 结果
+     */
+    int deleteSysDeptConfigLogById(Long id);
+
+    void addLog(Long deptId, Integer logType, Integer operateType, String num, String firstNum, String lastNum, String username, String s);
+}

+ 73 - 0
fs-service/src/main/java/com/fs/system/service/ISysDeptConfigService.java

@@ -0,0 +1,73 @@
+package com.fs.system.service;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.system.domain.SysDeptConfig;
+
+/**
+ * 部门配置Service接口
+ * 
+ * @author fs
+ * @date 2025-09-22
+ */
+public interface ISysDeptConfigService extends IService<SysDeptConfig>{
+    /**
+     * 查询部门配置
+     * 
+     * @param id 部门配置主键
+     * @return 部门配置
+     */
+    SysDeptConfig selectSysDeptConfigById(Long id);
+
+    /**
+     * 查询部门配置列表
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 部门配置集合
+     */
+    List<SysDeptConfig> selectSysDeptConfigList(SysDeptConfig sysDeptConfig);
+
+    /**
+     * 新增部门配置
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 结果
+     */
+    int insertSysDeptConfig(SysDeptConfig sysDeptConfig);
+
+    /**
+     * 修改部门配置
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 结果
+     */
+    int updateSysDeptConfig(SysDeptConfig sysDeptConfig);
+
+    /**
+     * 批量删除部门配置
+     * 
+     * @param ids 需要删除的部门配置主键集合
+     * @return 结果
+     */
+    int deleteSysDeptConfigByIds(Long[] ids);
+
+    /**
+     * 删除部门配置信息
+     * 
+     * @param id 部门配置主键
+     * @return 结果
+     */
+    int deleteSysDeptConfigById(Long id);
+
+    void updatePadNum(Long deptId, Integer num, LoginUser loginUser, LocalDate endTime);
+
+    void addRedMoney(Long deptId, BigDecimal num, LoginUser loginUser);
+
+    void addFlowNum(Long deptId, BigDecimal money, LoginUser loginUser);
+
+    SysDeptConfig getDeptConfig(Long deptId, LoginUser loginUser);
+    SysDeptConfig getDeptConfig(Long deptId);
+}

+ 109 - 0
fs-service/src/main/java/com/fs/system/service/impl/SysDeptConfigLogServiceImpl.java

@@ -0,0 +1,109 @@
+package com.fs.system.service.impl;
+
+import java.util.Date;
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.fs.system.mapper.SysDeptConfigLogMapper;
+import com.fs.system.domain.SysDeptConfigLog;
+import com.fs.system.service.ISysDeptConfigLogService;
+
+/**
+ * 系统部门资源配置使用记录Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-09-22
+ */
+@Service
+public class SysDeptConfigLogServiceImpl extends ServiceImpl<SysDeptConfigLogMapper, SysDeptConfigLog> implements ISysDeptConfigLogService {
+
+    /**
+     * 查询系统部门资源配置使用记录
+     * 
+     * @param id 系统部门资源配置使用记录主键
+     * @return 系统部门资源配置使用记录
+     */
+    @Override
+    public SysDeptConfigLog selectSysDeptConfigLogById(Long id)
+    {
+        return baseMapper.selectSysDeptConfigLogById(id);
+    }
+
+    /**
+     * 查询系统部门资源配置使用记录列表
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 系统部门资源配置使用记录
+     */
+    @Override
+    public List<SysDeptConfigLog> selectSysDeptConfigLogList(SysDeptConfigLog sysDeptConfigLog)
+    {
+        return baseMapper.selectSysDeptConfigLogList(sysDeptConfigLog);
+    }
+
+    /**
+     * 新增系统部门资源配置使用记录
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 结果
+     */
+    @Override
+    public int insertSysDeptConfigLog(SysDeptConfigLog sysDeptConfigLog)
+    {
+        sysDeptConfigLog.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertSysDeptConfigLog(sysDeptConfigLog);
+    }
+
+    /**
+     * 修改系统部门资源配置使用记录
+     * 
+     * @param sysDeptConfigLog 系统部门资源配置使用记录
+     * @return 结果
+     */
+    @Override
+    public int updateSysDeptConfigLog(SysDeptConfigLog sysDeptConfigLog)
+    {
+        sysDeptConfigLog.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateSysDeptConfigLog(sysDeptConfigLog);
+    }
+
+    /**
+     * 批量删除系统部门资源配置使用记录
+     * 
+     * @param ids 需要删除的系统部门资源配置使用记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysDeptConfigLogByIds(Long[] ids)
+    {
+        return baseMapper.deleteSysDeptConfigLogByIds(ids);
+    }
+
+    /**
+     * 删除系统部门资源配置使用记录信息
+     * 
+     * @param id 系统部门资源配置使用记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysDeptConfigLogById(Long id)
+    {
+        return baseMapper.deleteSysDeptConfigLogById(id);
+    }
+
+    @Override
+    public void addLog(Long deptId, Integer logType, Integer operateType, String num, String firstNum, String lastNum, String username, String remark) {
+        SysDeptConfigLog log = new SysDeptConfigLog();
+        log.setDeptId(deptId);
+        log.setLogType(logType);
+        log.setOperateType(operateType);
+        log.setNum(num);
+        log.setFirstNum(firstNum);
+        log.setLastNum(lastNum);
+        log.setCreateBy(username);
+        log.setCreateTime(new Date());
+        log.setRemark(remark);
+        save(log);
+    }
+}

+ 173 - 0
fs-service/src/main/java/com/fs/system/service/impl/SysDeptConfigServiceImpl.java

@@ -0,0 +1,173 @@
+package com.fs.system.service.impl;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fs.common.core.domain.model.LoginUser;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.company.service.ICompanyTrafficRecordService;
+import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysConfigMapper;
+import com.fs.system.service.ISysDeptConfigLogService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.system.mapper.SysDeptConfigMapper;
+import com.fs.system.domain.SysDeptConfig;
+import com.fs.system.service.ISysDeptConfigService;
+
+/**
+ * 部门配置Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-09-22
+ */
+@Service
+@AllArgsConstructor
+public class SysDeptConfigServiceImpl extends ServiceImpl<SysDeptConfigMapper, SysDeptConfig> implements ISysDeptConfigService {
+
+
+    private final ISysDeptConfigLogService sysDeptConfigLogService;
+    private final SysConfigMapper sysConfigMapper;
+
+    /**
+     * 查询部门配置
+     * 
+     * @param id 部门配置主键
+     * @return 部门配置
+     */
+    @Override
+    public SysDeptConfig selectSysDeptConfigById(Long id)
+    {
+        return baseMapper.selectSysDeptConfigById(id);
+    }
+
+    /**
+     * 查询部门配置列表
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 部门配置
+     */
+    @Override
+    public List<SysDeptConfig> selectSysDeptConfigList(SysDeptConfig sysDeptConfig)
+    {
+        return baseMapper.selectSysDeptConfigList(sysDeptConfig);
+    }
+
+    /**
+     * 新增部门配置
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 结果
+     */
+    @Override
+    public int insertSysDeptConfig(SysDeptConfig sysDeptConfig)
+    {
+        sysDeptConfig.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertSysDeptConfig(sysDeptConfig);
+    }
+
+    /**
+     * 修改部门配置
+     * 
+     * @param sysDeptConfig 部门配置
+     * @return 结果
+     */
+    @Override
+    public int updateSysDeptConfig(SysDeptConfig sysDeptConfig)
+    {
+        sysDeptConfig.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateSysDeptConfig(sysDeptConfig);
+    }
+
+    /**
+     * 批量删除部门配置
+     * 
+     * @param ids 需要删除的部门配置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysDeptConfigByIds(Long[] ids)
+    {
+        return baseMapper.deleteSysDeptConfigByIds(ids);
+    }
+    /**
+     * 删除部门配置信息
+     * 
+     * @param id 部门配置主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSysDeptConfigById(Long id)
+    {
+        return baseMapper.deleteSysDeptConfigById(id);
+    }
+
+    @Override
+    public void updatePadNum(Long deptId, Integer num, LoginUser loginUser, LocalDate endTime) {
+        SysDeptConfig deptConfig = getDeptConfig(deptId, loginUser);
+        deptConfig.setUpdateBy(loginUser.getUsername());
+        deptConfig.setUpdateTime(new Date());
+        Long padNum = deptConfig.getPadNum() == null ? 0L : deptConfig.getPadNum();
+        deptConfig.setPadNum(num.longValue());
+        long n = num - padNum;
+        deptConfig.setPadTime(endTime);
+        sysDeptConfigLogService.addLog(deptId, 2, n >= 0 ? 0 : 1, num.toString(), padNum.toString(), deptConfig.getPadNum().toString(), loginUser.getUsername(), "");
+        updateById(deptConfig);
+    }
+
+    @Override
+    public void addRedMoney(Long deptId, BigDecimal num, LoginUser loginUser) {
+        SysDeptConfig deptConfig = getDeptConfig(deptId, loginUser);
+        deptConfig.setUpdateBy(loginUser.getUsername());
+        deptConfig.setUpdateTime(new Date());
+        BigDecimal red = deptConfig.getRedPackage() == null ? BigDecimal.ZERO : deptConfig.getRedPackage();
+        deptConfig.setRedPackage(red.add(num));
+        sysDeptConfigLogService.addLog(deptId, 0, 0, num.setScale(2, RoundingMode.UP).toString(), red.setScale(2, RoundingMode.UP).toString(), deptConfig.getRedPackage().setScale(2, RoundingMode.UP).toString(), loginUser.getUsername(), "");
+        updateById(deptConfig);
+
+    }
+
+    @Override
+    public void addFlowNum(Long deptId, BigDecimal money, LoginUser loginUser) {
+        SysDeptConfig deptConfig = getDeptConfig(deptId, loginUser);
+        deptConfig.setUpdateBy(loginUser.getUsername());
+        deptConfig.setUpdateTime(new Date());
+        Long l = trafficConversion(money.longValue());
+        long flowNum = deptConfig.getFlowNum() == null ? 0 : deptConfig.getFlowNum();
+        deptConfig.setFlowNum(flowNum + l);
+        sysDeptConfigLogService.addLog(deptId, 1, 0, l.toString(), flowNum + "", deptConfig.getFlowNum().toString(), loginUser.getUsername(), "");
+        updateById(deptConfig);
+
+    }
+    public Long trafficConversion(Long amount) {
+        SysConfig config = sysConfigMapper.selectConfigByConfigKey("statis.config");
+        JSONObject jsonObject = JSONObject.parseObject(config.getConfigValue());
+        float trafficPrice = jsonObject.getFloatValue("trafficPrice");
+        double trafficGB = amount / trafficPrice;
+        return (long) (trafficGB * 1024 * 1024);
+    }
+    @Override
+    public SysDeptConfig getDeptConfig(Long deptId, LoginUser loginUser){
+        SysDeptConfig one = getDeptConfig(deptId);
+        if(one == null){
+            one = new SysDeptConfig();
+            one.setDeptId(deptId);
+            one.setCreateBy(loginUser.getUsername());
+            one.setCreateTime(new Date());
+            save(one);
+        }
+        return one;
+    }
+
+    @Override
+    public SysDeptConfig getDeptConfig(Long deptId){
+        return getOne(new QueryWrapper<SysDeptConfig>().eq("dept_id", deptId));
+    }
+}

+ 67 - 89
fs-service/src/main/java/com/fs/system/service/impl/SysDeptServiceImpl.java

@@ -3,7 +3,14 @@ package com.fs.system.service.impl;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fs.common.utils.PubFun;
+import com.fs.system.domain.SysDeptConfig;
+import com.fs.system.mapper.SysDeptConfigMapper;
+import com.fs.system.service.ISysDeptConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.common.annotation.DataScope;
@@ -23,58 +30,57 @@ import com.fs.system.service.ISysDeptService;
 
 /**
  * 部门管理 服务实现
- * 
-
+ *
  */
 @Service
-public class SysDeptServiceImpl implements ISysDeptService
-{
+public class SysDeptServiceImpl implements ISysDeptService {
     @Autowired
     private SysDeptMapper deptMapper;
 
     @Autowired
     private SysRoleMapper roleMapper;
 
+    @Autowired
+    private SysDeptConfigMapper sysDeptConfigMapper;
+
     /**
      * 查询部门管理数据
-     * 
+     *
      * @param dept 部门信息
      * @return 部门信息集合
      */
     @Override
     @DataScope(deptAlias = "d")
-    public List<SysDept> selectDeptList(SysDept dept)
-    {
-        return deptMapper.selectDeptList(dept);
+    public List<SysDept> selectDeptList(SysDept dept) {
+        List<SysDept> list = deptMapper.selectDeptList(dept);
+        List<SysDeptConfig> configList = sysDeptConfigMapper.selectList(new QueryWrapper<SysDeptConfig>().in("dept_id", PubFun.listToNewList(list, SysDept::getDeptId)));
+        Map<Long, SysDeptConfig> deptConfig = PubFun.listToMapByGroupObject(configList, SysDeptConfig::getDeptId);
+        list.stream().filter(e -> deptConfig.containsKey(e.getDeptId())).forEach(e -> e.setDeptConfig(deptConfig.get(e.getDeptId())));
+        return list;
     }
 
     /**
      * 构建前端所需要树结构
-     * 
+     *
      * @param depts 部门列表
      * @return 树结构列表
      */
     @Override
-    public List<SysDept> buildDeptTree(List<SysDept> depts)
-    {
+    public List<SysDept> buildDeptTree(List<SysDept> depts) {
         List<SysDept> returnList = new ArrayList<SysDept>();
         List<Long> tempList = new ArrayList<Long>();
-        for (SysDept dept : depts)
-        {
+        for (SysDept dept : depts) {
             tempList.add(dept.getDeptId());
         }
-        for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext();)
-        {
+        for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext(); ) {
             SysDept dept = (SysDept) iterator.next();
             // 如果是顶级节点, 遍历该父节点的所有子节点
-            if (!tempList.contains(dept.getParentId()))
-            {
+            if (!tempList.contains(dept.getParentId())) {
                 recursionFn(depts, dept);
                 returnList.add(dept);
             }
         }
-        if (returnList.isEmpty())
-        {
+        if (returnList.isEmpty()) {
             returnList = depts;
         }
         return returnList;
@@ -82,93 +88,85 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 构建前端所需要下拉树结构
-     * 
+     *
      * @param depts 部门列表
      * @return 下拉树结构列表
      */
     @Override
-    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts)
-    {
+    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts) {
         List<SysDept> deptTrees = buildDeptTree(depts);
         return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
     /**
      * 根据角色ID查询部门树信息
-     * 
+     *
      * @param roleId 角色ID
      * @return 选中部门列表
      */
     @Override
-    public List<Integer> selectDeptListByRoleId(Long roleId)
-    {
+    public List<Integer> selectDeptListByRoleId(Long roleId) {
         SysRole role = roleMapper.selectRoleById(roleId);
         return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly());
     }
 
     /**
      * 根据部门ID查询信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 部门信息
      */
     @Override
-    public SysDept selectDeptById(Long deptId)
-    {
+    public SysDept selectDeptById(Long deptId) {
         return deptMapper.selectDeptById(deptId);
     }
 
     /**
      * 根据ID查询所有子部门(正常状态)
-     * 
+     *
      * @param deptId 部门ID
      * @return 子部门数
      */
     @Override
-    public int selectNormalChildrenDeptById(Long deptId)
-    {
+    public int selectNormalChildrenDeptById(Long deptId) {
         return deptMapper.selectNormalChildrenDeptById(deptId);
     }
 
     /**
      * 是否存在子节点
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
     @Override
-    public boolean hasChildByDeptId(Long deptId)
-    {
+    public boolean hasChildByDeptId(Long deptId) {
         int result = deptMapper.hasChildByDeptId(deptId);
         return result > 0 ? true : false;
     }
 
     /**
      * 查询部门是否存在用户
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果 true 存在 false 不存在
      */
     @Override
-    public boolean checkDeptExistUser(Long deptId)
-    {
+    public boolean checkDeptExistUser(Long deptId) {
         int result = deptMapper.checkDeptExistUser(deptId);
         return result > 0 ? true : false;
     }
 
     /**
      * 校验部门名称是否唯一
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
     @Override
-    public String checkDeptNameUnique(SysDept dept)
-    {
+    public String checkDeptNameUnique(SysDept dept) {
         Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
         SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId());
-        if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue())
-        {
+        if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -176,19 +174,16 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 校验部门是否有数据权限
-     * 
+     *
      * @param deptId 部门id
      */
     @Override
-    public void checkDeptDataScope(Long deptId)
-    {
-        if (!SysUser.isAdmin(SecurityUtils.getUserId()))
-        {
+    public void checkDeptDataScope(Long deptId) {
+        if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
             SysDept dept = new SysDept();
             dept.setDeptId(deptId);
             List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
-            if (StringUtils.isEmpty(depts))
-            {
+            if (StringUtils.isEmpty(depts)) {
                 throw new ServiceException("没有权限访问部门数据!");
             }
         }
@@ -196,17 +191,15 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 新增保存部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
     @Override
-    public int insertDept(SysDept dept)
-    {
+    public int insertDept(SysDept dept) {
         SysDept info = deptMapper.selectDeptById(dept.getParentId());
         // 如果父节点不为正常状态,则不允许新增子节点
-        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
-        {
+        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
             throw new ServiceException("部门停用,不允许新增");
         }
         dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
@@ -215,17 +208,15 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 修改保存部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
     @Override
-    public int updateDept(SysDept dept)
-    {
+    public int updateDept(SysDept dept) {
         SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId());
         SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId());
-        if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept))
-        {
+        if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) {
             String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
             String oldAncestors = oldDept.getAncestors();
             dept.setAncestors(newAncestors);
@@ -233,8 +224,7 @@ public class SysDeptServiceImpl implements ISysDeptService
         }
         int result = deptMapper.updateDept(dept);
         if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
-                && !StringUtils.equals("0", dept.getAncestors()))
-        {
+                && !StringUtils.equals("0", dept.getAncestors())) {
             // 如果该部门是启用状态,则启用该部门的所有上级部门
             updateParentDeptStatusNormal(dept);
         }
@@ -243,11 +233,10 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 修改该部门的父级部门状态
-     * 
+     *
      * @param dept 当前部门
      */
-    private void updateParentDeptStatusNormal(SysDept dept)
-    {
+    private void updateParentDeptStatusNormal(SysDept dept) {
         String ancestors = dept.getAncestors();
         Long[] deptIds = Convert.toLongArray(ancestors);
         deptMapper.updateDeptStatusNormal(deptIds);
@@ -255,48 +244,41 @@ public class SysDeptServiceImpl implements ISysDeptService
 
     /**
      * 修改子元素关系
-     * 
-     * @param deptId 被修改的部门ID
+     *
+     * @param deptId       被修改的部门ID
      * @param newAncestors 新的父ID集合
      * @param oldAncestors 旧的父ID集合
      */
-    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors)
-    {
+    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
         List<SysDept> children = deptMapper.selectChildrenDeptById(deptId);
-        for (SysDept child : children)
-        {
+        for (SysDept child : children) {
             child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
         }
-        if (children.size() > 0)
-        {
+        if (children.size() > 0) {
             deptMapper.updateDeptChildren(children);
         }
     }
 
     /**
      * 删除部门管理信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
     @Override
-    public int deleteDeptById(Long deptId)
-    {
+    public int deleteDeptById(Long deptId) {
         return deptMapper.deleteDeptById(deptId);
     }
 
     /**
      * 递归列表
      */
-    private void recursionFn(List<SysDept> list, SysDept t)
-    {
+    private void recursionFn(List<SysDept> list, SysDept t) {
         // 得到子节点列表
         List<SysDept> childList = getChildList(list, t);
         t.setChildren(childList);
-        for (SysDept tChild : childList)
-        {
-            if (hasChild(list, tChild))
-            {
+        for (SysDept tChild : childList) {
+            if (hasChild(list, tChild)) {
                 recursionFn(list, tChild);
             }
         }
@@ -305,15 +287,12 @@ public class SysDeptServiceImpl implements ISysDeptService
     /**
      * 得到子节点列表
      */
-    private List<SysDept> getChildList(List<SysDept> list, SysDept t)
-    {
+    private List<SysDept> getChildList(List<SysDept> list, SysDept t) {
         List<SysDept> tlist = new ArrayList<SysDept>();
         Iterator<SysDept> it = list.iterator();
-        while (it.hasNext())
-        {
+        while (it.hasNext()) {
             SysDept n = (SysDept) it.next();
-            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue())
-            {
+            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) {
                 tlist.add(n);
             }
         }
@@ -323,8 +302,7 @@ public class SysDeptServiceImpl implements ISysDeptService
     /**
      * 判断是否有子节点
      */
-    private boolean hasChild(List<SysDept> list, SysDept t)
-    {
+    private boolean hasChild(List<SysDept> list, SysDept t) {
         return getChildList(list, t).size() > 0 ? true : false;
     }
 }

+ 1 - 0
fs-service/src/main/resources/application-config-dev-yjb.yml

@@ -107,6 +107,7 @@ ipad:
   ipadUrl: http://ipad.cdwjyyh.com
   aiApi: http://152.136.202.157:3000/api
   voiceApi:
+  commonApi:
 wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:

+ 2 - 2
fs-service/src/main/resources/application-config-druid-jnlzjk.yml

@@ -37,8 +37,8 @@ wx:
       port: 6379
       timeout: 2000
     configs:
-      - appId: wxce847c8ebe5e62aa # 第一个公众号的appid  //公众号名称:济南联智健康
-        secret: 37f7c5e3b7ff07794343957f7ced8de4 # 公众号的appsecret--济南联智健康
+      - appId: wxd6905bed94e45ef0 # 第一个公众号的appid  //公众号名称:济南联智健康
+        secret: a7a59d1536e9eae16108a5ad627fa4a3 # 公众号的appsecret--济南联智健康
         token: PPKOdAlCoMO # 接口配置里的Token值
         aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
 aifabu:  #爱链接

+ 6 - 16
fs-service/src/main/resources/application-dev-yjb.yml

@@ -27,25 +27,15 @@ spring:
                 # #连接池最大阻塞等待时间(使用负值表示没有限制)
                 max-wait: -1ms
     datasource:
-        clickhouse:
-            type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
-            url: jdbc:clickhouse://1.14.104.71:8123/sop_test?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
-            username: default
-            password: rt2024
-            initialSize: 10
-            maxActive: 100
-            minIdle: 10
-            maxWait: 6000
         mysql:
             type: com.alibaba.druid.pool.DruidDataSource
             driverClassName: com.mysql.cj.jdbc.Driver
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://139.186.77.83:3306/yjb_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: Rtroot
-                    password: Rtroot
+                    url: jdbc:mysql://nj-cdb-4tbz4oqv.sql.tencentcdb.com:25247/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
                 # 初始连接数
                 initialSize: 5
                 # 最小连接池数量
@@ -91,9 +81,9 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://139.186.77.83:3306/his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                    username: Rtroot
-                    password: Rtroot
+                  url: jdbc:mysql://nj-cdb-4tbz4oqv.sql.tencentcdb.com:25247/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                  username: root
+                  password: Ylrz_1q2w3e4r5t6y
                 # 初始连接数
                 initialSize: 5
                 # 最小连接池数量

+ 37 - 0
fs-service/src/main/resources/mapper/company/CompanyTrafficRecordLogMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.CompanyTrafficRecordLogMapper">
+
+    <select id="list" resultType="com.fs.company.domain.CompanyTrafficRecordLog">
+        select a.* from company_traffic_record_log a inner join company b on a.company_id = b.company_id
+        <where>
+            <if test="companyId != null">
+                and a.company_id = #{companyId}
+            </if>
+            <if test="companyIds != null">
+                and a.company_id in <foreach collection="companyIds" open="(" separator="," close=")" item="item">#{item}</foreach>
+            </if>
+            <if test="userId != null">
+                and a.user_id = #{userId}
+            </if>
+            <if test="deptId != null">
+                and b.dept_id = #{deptId}
+            </if>
+            <if test="userName != null">
+                AND a.user_name LIKE concat('%',#{userName},'%')
+            </if>
+            <if test="operationType != null">
+                and a.operation_type = #{operationType}
+            </if>
+            <if test="createTimeStart != null">
+                AND a.create_time &gt;= #{createTimeStart}
+            </if>
+            <if test="createTimeEnd != null">
+                AND a.create_time &lt;= #{createTimeEnd}
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+</mapper>

+ 10 - 0
fs-service/src/main/resources/mapper/course/FsCourseTrafficLogMapper.xml

@@ -280,4 +280,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
     </select>
 
+    <select id="sumTrafficByCompanyYesterday" resultType="java.lang.Long">
+        SELECT
+            SUM(a.internet_traffic) / 1024 AS totalInternetTraffic
+        FROM
+            fs_course_traffic_log a
+        WHERE
+        a.company_id = #{companyId}
+        and a.create_time &gt;= #{startTime}
+        AND a.create_time &lt;= #{endTime}
+    </select>
 </mapper>

+ 3 - 0
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -72,6 +72,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test ='maps.isVip !=null'>
                 and l.user_id != 0 and u.is_vip = #{maps.isVip}
             </if>
+            <if test = 'maps.deptId != null'>
+                and cu.dept_id = #{maps.deptId}
+            </if>
             <if test ='maps.sendType !=null'>
                 and l.send_type = #{maps.sendType}
             </if>

+ 101 - 0
fs-service/src/main/resources/mapper/deptConfig/SysDeptConfigMapper.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.system.mapper.SysDeptConfigMapper">
+    
+    <resultMap type="SysDeptConfig" id="SysDeptConfigResult">
+        <result property="id"    column="id"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="padNum"    column="pad_num"    />
+        <result property="padNumSub"    column="pad_num_sub"    />
+        <result property="padTime"    column="pad_time"    />
+        <result property="redPackage"    column="red_package"    />
+        <result property="flowNum"    column="flow_num"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectSysDeptConfigVo">
+        select id, dept_id, pad_num, pad_num_sub, pad_time, red_package, flow_num, create_time, create_by, update_time, update_by, remark from sys_dept_config
+    </sql>
+
+    <select id="selectSysDeptConfigList" parameterType="SysDeptConfig" resultMap="SysDeptConfigResult">
+        <include refid="selectSysDeptConfigVo"/>
+        <where>  
+            <if test="deptId != null "> and dept_id = #{deptId}</if>
+            <if test="padNum != null "> and pad_num = #{padNum}</if>
+            <if test="padNumSub != null "> and pad_num_sub = #{padNumSub}</if>
+            <if test="padTime != null "> and pad_time = #{padTime}</if>
+            <if test="redPackage != null "> and red_package = #{redPackage}</if>
+            <if test="flowNum != null "> and flow_num = #{flowNum}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysDeptConfigById" parameterType="Long" resultMap="SysDeptConfigResult">
+        <include refid="selectSysDeptConfigVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertSysDeptConfig" parameterType="SysDeptConfig" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_dept_config
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="deptId != null">dept_id,</if>
+            <if test="padNum != null">pad_num,</if>
+            <if test="padNumSub != null">pad_num_sub,</if>
+            <if test="padTime != null">pad_time,</if>
+            <if test="redPackage != null">red_package,</if>
+            <if test="flowNum != null">flow_num,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="deptId != null">#{deptId},</if>
+            <if test="padNum != null">#{padNum},</if>
+            <if test="padNumSub != null">#{padNumSub},</if>
+            <if test="padTime != null">#{padTime},</if>
+            <if test="redPackage != null">#{redPackage},</if>
+            <if test="flowNum != null">#{flowNum},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysDeptConfig" parameterType="SysDeptConfig">
+        update sys_dept_config
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="deptId != null">dept_id = #{deptId},</if>
+            <if test="padNum != null">pad_num = #{padNum},</if>
+            <if test="padNumSub != null">pad_num_sub = #{padNumSub},</if>
+            <if test="padTime != null">pad_time = #{padTime},</if>
+            <if test="redPackage != null">red_package = #{redPackage},</if>
+            <if test="flowNum != null">flow_num = #{flowNum},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysDeptConfigById" parameterType="Long">
+        delete from sys_dept_config where id = #{id}
+    </delete>
+
+    <delete id="deleteSysDeptConfigByIds" parameterType="String">
+        delete from sys_dept_config where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 101 - 0
fs-service/src/main/resources/mapper/deptConfigLog/SysDeptConfigLogMapper.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.system.mapper.SysDeptConfigLogMapper">
+    
+    <resultMap type="SysDeptConfigLog" id="SysDeptConfigLogResult">
+        <result property="id"    column="id"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="logType"    column="log_type"    />
+        <result property="operateType"    column="operate_type"    />
+        <result property="num"    column="num"    />
+        <result property="firstNum"    column="first_num"    />
+        <result property="lastNum"    column="last_num"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectSysDeptConfigLogVo">
+        select id, dept_id, log_type, operate_type, num, first_num, last_num, create_time, create_by, update_time, update_by, remark from sys_dept_config_log
+    </sql>
+
+    <select id="selectSysDeptConfigLogList" parameterType="SysDeptConfigLog" resultMap="SysDeptConfigLogResult">
+        <include refid="selectSysDeptConfigLogVo"/>
+        <where>  
+            <if test="deptId != null "> and dept_id = #{deptId}</if>
+            <if test="logType != null "> and log_type = #{logType}</if>
+            <if test="operateType != null "> and operate_type = #{operateType}</if>
+            <if test="num != null "> and num = #{num}</if>
+            <if test="firstNum != null "> and first_num = #{firstNum}</if>
+            <if test="lastNum != null "> and last_num = #{lastNum}</if>
+        </where>
+    </select>
+    
+    <select id="selectSysDeptConfigLogById" parameterType="Long" resultMap="SysDeptConfigLogResult">
+        <include refid="selectSysDeptConfigLogVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertSysDeptConfigLog" parameterType="SysDeptConfigLog" useGeneratedKeys="true" keyProperty="id">
+        insert into sys_dept_config_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="deptId != null">dept_id,</if>
+            <if test="logType != null">log_type,</if>
+            <if test="operateType != null">operate_type,</if>
+            <if test="num != null">num,</if>
+            <if test="firstNum != null">first_num,</if>
+            <if test="lastNum != null">last_num,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="deptId != null">#{deptId},</if>
+            <if test="logType != null">#{logType},</if>
+            <if test="operateType != null">#{operateType},</if>
+            <if test="num != null">#{num},</if>
+            <if test="firstNum != null">#{firstNum},</if>
+            <if test="lastNum != null">#{lastNum},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysDeptConfigLog" parameterType="SysDeptConfigLog">
+        update sys_dept_config_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="deptId != null">dept_id = #{deptId},</if>
+            <if test="logType != null">log_type = #{logType},</if>
+            <if test="operateType != null">operate_type = #{operateType},</if>
+            <if test="num != null">num = #{num},</if>
+            <if test="firstNum != null">first_num = #{firstNum},</if>
+            <if test="lastNum != null">last_num = #{lastNum},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysDeptConfigLogById" parameterType="Long">
+        delete from sys_dept_config_log where id = #{id}
+    </delete>
+
+    <delete id="deleteSysDeptConfigLogByIds" parameterType="String">
+        delete from sys_dept_config_log where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 3 - 1
fs-service/src/main/resources/mapper/sop/SopUserLogsMapper.xml

@@ -246,7 +246,9 @@
             ul.`status` = '1'
           and qs.is_rating=1
           and qs.type=2
-          and qs.send_type=2
+        <if test="isAllratingRating == null || !isAllratingRating">
+            and qs.send_type=2
+        </if>
           and qs.`status` in (2,3)
           AND ( DATEDIFF( CURRENT_DATE, ul.start_time ) ) >= 7
         ORDER BY id ASC

+ 0 - 145
fs-user-app/src/main/java/com/fs/app/controller/store/FsStoreUserComplaintController.java

@@ -1,145 +0,0 @@
-package com.fs.app.controller.store;
-
-import com.fs.app.annotation.Login;
-import com.fs.app.controller.AppBaseController;
-import com.fs.common.annotation.Log;
-import com.fs.common.core.domain.AjaxResult;
-import com.fs.common.core.page.TableDataInfo;
-import com.fs.common.enums.BusinessType;
-import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.user.domain.FsUserComplaint;
-import com.fs.user.domain.FsUserComplaintMsg;
-import com.fs.user.service.IFsUserComplaintMsgService;
-import com.fs.user.service.IFsUserComplaintService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-/**
- * 用户投诉Controller
- *
- * @author fs
- * @date 2025-08-27
- */
-@RestController
-@RequestMapping("/store/app/user/complaint")
-public class FsStoreUserComplaintController extends AppBaseController
-{
-    @Autowired
-    private IFsUserComplaintService fsUserComplaintService;
-    @Autowired
-    private IFsUserComplaintMsgService fsUserComplaintMsgService;
-
-    /**
-     * 查询用户投诉列表
-     */
-    @GetMapping("/list")
-    public TableDataInfo list(FsUserComplaint fsUserComplaint)
-    {
-        startPage();
-        List<FsUserComplaint> list = fsUserComplaintService.selectFsUserComplaintList(fsUserComplaint);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出用户投诉列表
-     */
-    @Log(title = "用户投诉", businessType = BusinessType.EXPORT)
-    @GetMapping("/export")
-    public AjaxResult export(FsUserComplaint fsUserComplaint)
-    {
-        List<FsUserComplaint> list = fsUserComplaintService.selectFsUserComplaintList(fsUserComplaint);
-        ExcelUtil<FsUserComplaint> util = new ExcelUtil<FsUserComplaint>(FsUserComplaint.class);
-        return util.exportExcel(list, "用户投诉数据");
-    }
-
-    /**
-     * 获取用户投诉详细信息
-     */
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
-        return AjaxResult.success(fsUserComplaintService.selectFsUserComplaintVoById(id));
-    }
-
-    /**
-     * 新增用户投诉
-     */
-    @Log(title = "用户投诉", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody FsUserComplaint fsUserComplaint)
-    {
-        if (fsUserComplaint.getFsUserId() == null || fsUserComplaint.getFsUserId() == 0) {
-            String userId = getUserId();
-            fsUserComplaint.setFsUserId(Long.parseLong(userId));
-        }
-        return toAjax(fsUserComplaintService.insertFsUserComplaint(fsUserComplaint));
-    }
-
-    /**
-     * 修改用户投诉
-     */
-    @Log(title = "用户投诉", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody FsUserComplaint fsUserComplaint)
-    {
-        return toAjax(fsUserComplaintService.updateFsUserComplaint(fsUserComplaint));
-    }
-
-    /**
-     * 删除用户投诉
-     */
-    @Log(title = "用户投诉", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
-    {
-        return toAjax(fsUserComplaintService.deleteFsUserComplaintByIds(ids));
-    }
-
-    /**
-     * 查询投诉消息记录列表
-     */
-    @GetMapping("/msg/list")
-    public TableDataInfo msgList(FsUserComplaintMsg fsUserComplaintMsg)
-    {
-        startPage();
-        List<FsUserComplaintMsg> list = fsUserComplaintMsgService.selectFsUserComplaintMsgList(fsUserComplaintMsg);
-        return getDataTable(list);
-    }
-
-    /**
-     * 获取投诉消息记录详细信息
-     */
-    @GetMapping(value = "/msg/{id}")
-    public AjaxResult getMsgInfo(@PathVariable("id") Long id)
-    {
-        return AjaxResult.success(fsUserComplaintMsgService.selectFsUserComplaintMsgById(id));
-    }
-
-    /**
-     * 新增投诉消息记录
-     */
-    @PostMapping("/msgAdd")
-    @Login
-    public AjaxResult msgAdd(@RequestBody FsUserComplaintMsg fsUserComplaintMsg)
-    {
-        if (fsUserComplaintMsg.getComplaintId() == null){
-            return AjaxResult.error("未查询到相关投诉!");
-        }
-        String userId = getUserId();
-        fsUserComplaintMsg.setUserId(Long.valueOf(userId));
-        fsUserComplaintMsg.setSendType(1); //用户
-        return toAjax(fsUserComplaintMsgService.insertFsUserComplaintMsg(fsUserComplaintMsg));
-    }
-
-    /**
-     * 修改投诉消息记录
-     */
-    @PutMapping("/editMsg")
-    public AjaxResult editMsg(@RequestBody FsUserComplaintMsg fsUserComplaintMsg)
-    {
-        return toAjax(fsUserComplaintMsgService.updateFsUserComplaintMsg(fsUserComplaintMsg));
-    }
-
-}