Ver Fonte

医健宝首页定时任务生成、销售公司批量绑定小程序、总公司的数据权限

yjwang há 1 semana atrás
pai
commit
3470736bdc
33 ficheiros alterados com 685 adições e 62 exclusões
  1. 159 35
      fs-admin/src/main/java/com/fs/api/controller/IndexStatisticsController.java
  2. 40 4
      fs-admin/src/main/java/com/fs/company/controller/CompanyController.java
  3. 24 1
      fs-admin/src/main/java/com/fs/company/controller/CompanyMoneyLogsController.java
  4. 17 1
      fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficController.java
  5. 22 2
      fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficLogController.java
  6. 17 2
      fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java
  7. 19 3
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java
  8. 27 2
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyDeductController.java
  9. 47 0
      fs-admin/src/main/java/com/fs/his/task/Task.java
  10. 19 2
      fs-admin/src/main/java/com/fs/qw/controller/QwCompanyController.java
  11. 12 0
      fs-admin/src/main/java/com/fs/web/controller/system/SysUserController.java
  12. 1 0
      fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java
  13. 4 0
      fs-service/src/main/java/com/fs/company/domain/Company.java
  14. 8 2
      fs-service/src/main/java/com/fs/company/mapper/CompanyMoneyLogsMapper.java
  15. 10 0
      fs-service/src/main/java/com/fs/company/service/ICompanyService.java
  16. 21 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  17. 7 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserMapper.java
  18. 2 0
      fs-service/src/main/java/com/fs/his/param/FsCompanyMoneyLogsExportParam.java
  19. 6 6
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  20. 16 0
      fs-service/src/main/java/com/fs/his/vo/SystemGoodsStatisticsVo.java
  21. 16 0
      fs-service/src/main/java/com/fs/his/vo/SystemOrderStatisticsVo.java
  22. 20 0
      fs-service/src/main/java/com/fs/his/vo/SystemUserStatisticsVo.java
  23. 7 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  24. 4 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  25. 11 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  26. 13 0
      fs-service/src/main/java/com/fs/statis/param/StatisticsStroeParam.java
  27. 16 0
      fs-service/src/main/java/com/fs/statis/param/StatisticsUserParam.java
  28. 16 0
      fs-service/src/main/java/com/fs/statis/vo/StatisticsStroeInfoVo.java
  29. 20 0
      fs-service/src/main/java/com/fs/statis/vo/StatisticsUserInfoVo.java
  30. 32 0
      fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml
  31. 14 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml
  32. 12 1
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml
  33. 26 0
      fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

+ 159 - 35
fs-admin/src/main/java/com/fs/api/controller/IndexStatisticsController.java

@@ -4,17 +4,28 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.entity.SysDept;
+import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.ServletUtils;
 import com.fs.company.constant.CompanyTrafficConstants;
 import com.fs.company.domain.Company;
 import com.fs.company.service.ICompanyService;
+import com.fs.framework.web.service.TokenService;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.his.vo.SystemGoodsStatisticsVo;
+import com.fs.his.vo.SystemOrderStatisticsVo;
+import com.fs.his.vo.SystemUserStatisticsVo;
 import com.fs.hisStore.config.MedicalMallConfig;
 import com.fs.statis.StatisticsRedisConstant;
 import com.fs.statis.dto.*;
 import com.fs.statis.param.StatisticsDeptCompanyParam;
+import com.fs.statis.param.StatisticsStroeParam;
+import com.fs.statis.param.StatisticsUserParam;
 import com.fs.statis.service.IStatisticsService;
+import com.fs.statis.vo.StatisticsStroeInfoVo;
+import com.fs.statis.vo.StatisticsUserInfoVo;
 import com.fs.system.domain.SysConfig;
+import com.fs.system.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.system.service.ISysDeptService;
 import lombok.extern.slf4j.Slf4j;
@@ -57,6 +68,16 @@ public class IndexStatisticsController {
 
     @Autowired
     private IStatisticsService statisticsService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
+    //统计redis_key
+    private final String REDIS_KEY_PREFIX = "system:statistics:";
+
     /**
      * 分析概览
      */
@@ -84,41 +105,23 @@ public class IndexStatisticsController {
             company.setDeptId(param.getDeptId());
             Long[] companyIds = companyService.selectCompanyList(company).stream().map(Company::getCompanyId).toArray(Long[]::new);
             for(Long companyId : companyIds){
-                AnalysisPreviewDTO clildDTO = redisCache.getCacheObject(String.format("%s:%d:%d:%d",DATA_OVERVIEW_DEALER_ANALYSISPREVIEW,type,userType,companyId));
-                if (clildDTO != null) {
-                    //将除了completedRate、correctRate和watchRate之外的数据相加,并计算completedRate、correctRate和watchRate
-                    analysisPreviewDTO.setWatchUserCount(
-                            analysisPreviewDTO.getWatchUserCount() == 0 ? 0 : analysisPreviewDTO.getWatchUserCount()
-                                +(clildDTO.getWatchUserCount() == 0 ? 0 : clildDTO.getWatchUserCount())
-                    );
-                    analysisPreviewDTO.setCompletedUserCount(
-                            analysisPreviewDTO.getCompletedUserCount() == 0 ? 0 : analysisPreviewDTO.getCompletedUserCount()
-                                +(clildDTO.getCompletedUserCount() == 0 ? 0 : clildDTO.getCompletedUserCount())
-                    );
-                    analysisPreviewDTO.setCompletedCount(
-                            analysisPreviewDTO.getCompletedCount() == 0 ? 0 : analysisPreviewDTO.getCompletedCount()
-                                +(clildDTO.getCompletedCount() == 0 ? 0 : clildDTO.getCompletedCount())
-                    );
-                    analysisPreviewDTO.setWatchCount(
-                            analysisPreviewDTO.getWatchCount() == 0 ? 0 : analysisPreviewDTO.getWatchCount()
-                                +(clildDTO.getWatchCount() == 0 ? 0 : clildDTO.getWatchCount())
-                    );
-                    analysisPreviewDTO.setAnswerMemberCount(
-                            analysisPreviewDTO.getAnswerMemberCount() == 0 ? 0 : analysisPreviewDTO.getAnswerMemberCount()
-                                +(clildDTO.getAnswerMemberCount() == 0 ? 0 : clildDTO.getAnswerMemberCount())
-                    );
-                    analysisPreviewDTO.setCorrectUserCount(
-                            analysisPreviewDTO.getCorrectUserCount() == 0 ? 0 : analysisPreviewDTO.getCorrectUserCount()
-                                +(clildDTO.getCorrectUserCount() == 0 ? 0 : clildDTO.getCorrectUserCount())
-                    );
-                    analysisPreviewDTO.setRewardCount(
-                            analysisPreviewDTO.getRewardCount() == 0 ? 0 : analysisPreviewDTO.getRewardCount()
-                                +(clildDTO.getRewardCount() == 0 ? 0 : clildDTO.getRewardCount())
-                    );
-                    analysisPreviewDTO.setRewardMoney(
-                            analysisPreviewDTO.getRewardMoney() == null ? BigDecimal.ZERO : analysisPreviewDTO.getRewardMoney()
-                                .add(clildDTO.getRewardMoney() == null ? BigDecimal.ZERO : clildDTO.getRewardMoney())
-                    );
+                AnalysisPreviewDTO childDTO = redisCache.getCacheObject(String.format("%s:%d:%d:%d",DATA_OVERVIEW_DEALER_ANALYSISPREVIEW,type,userType,companyId));
+                if (childDTO != null) {
+                    // 累加 long 类型字段(直接相加即可)
+                    analysisPreviewDTO.setWatchUserCount(analysisPreviewDTO.getWatchUserCount() + childDTO.getWatchUserCount());
+                    analysisPreviewDTO.setCompletedUserCount(analysisPreviewDTO.getCompletedUserCount() + childDTO.getCompletedUserCount());
+                    analysisPreviewDTO.setCompletedCount(analysisPreviewDTO.getCompletedCount() + childDTO.getCompletedCount());
+                    analysisPreviewDTO.setWatchCount(analysisPreviewDTO.getWatchCount() + childDTO.getWatchCount());
+                    analysisPreviewDTO.setAnswerMemberCount(analysisPreviewDTO.getAnswerMemberCount() + childDTO.getAnswerMemberCount());
+                    analysisPreviewDTO.setCorrectUserCount(analysisPreviewDTO.getCorrectUserCount() + childDTO.getCorrectUserCount());
+                    analysisPreviewDTO.setRewardCount(analysisPreviewDTO.getRewardCount() + childDTO.getRewardCount());
+                    BigDecimal current = analysisPreviewDTO.getRewardMoney();
+                    BigDecimal child = childDTO.getRewardMoney();
+                    if (current == null) {
+                        analysisPreviewDTO.setRewardMoney(child == null ? BigDecimal.ZERO : child);
+                    } else {
+                        analysisPreviewDTO.setRewardMoney(current.add(child == null ? BigDecimal.ZERO : child));
+                    }
                 }
             }
             if(analysisPreviewDTO.getAnswerMemberCount() != 0){
@@ -909,4 +912,125 @@ public class IndexStatisticsController {
 
         return R.ok().put("data", data);
     }
+
+    /**
+     * 获取首页店铺相关数据
+     * **/
+
+    @PostMapping("/getStatisticsStroe")
+    public R getStatisticsStroe(@RequestBody StatisticsStroeParam param){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        StatisticsStroeInfoVo statisticsStroeInfoVo = new StatisticsStroeInfoVo();
+
+        if (loginUser.getUser().isAdmin() || checkDept(loginUser.getUser().getDeptId())) {
+            List<SystemGoodsStatisticsVo> goodsStatisticsVos =
+                    redisCache.getCacheObject(REDIS_KEY_PREFIX + "goods");
+
+            if (goodsStatisticsVos != null && !goodsStatisticsVos.isEmpty()) {
+                long goodsTotalNum = goodsStatisticsVos.stream()
+                        .filter(vo -> param.getStoreId() == null ||
+                                Objects.equals(vo.getStoreId(), param.getStoreId()))
+                        .mapToLong(SystemGoodsStatisticsVo::getGoodsNum)
+                        .sum();
+                statisticsStroeInfoVo.setGoodsTotalNum(goodsTotalNum);
+            }
+            List<SystemOrderStatisticsVo> orderStatisticsVos =redisCache.getCacheObject(REDIS_KEY_PREFIX+"order");
+            if (orderStatisticsVos != null && !orderStatisticsVos.isEmpty()) {
+                List<SystemOrderStatisticsVo> filteredList = orderStatisticsVos.stream()
+                        .filter(v -> param.getStoreId() == null ||
+                                Objects.equals(v.getStoreId(), param.getStoreId()))
+                        .collect(Collectors.toList());
+                Long orderTotalNum = filteredList.stream()
+                        .mapToLong(SystemOrderStatisticsVo::getOrderNum)
+                        .sum();
+                BigDecimal recvTotalNum = filteredList.stream()
+                        .map(SystemOrderStatisticsVo::getPaymentAmount)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                statisticsStroeInfoVo.setOrderTotalNum(orderTotalNum);
+                statisticsStroeInfoVo.setRecvTotalNum(recvTotalNum);
+            }
+        }
+        return R.ok().put("data",statisticsStroeInfoVo);
+    }
+
+    /**
+     * 获取首页用户相关数据
+     * **/
+    @PostMapping("/getStatisticsUser")
+    public R getStatisticsUser(@RequestBody StatisticsUserParam param){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        StatisticsUserInfoVo userInfoVo = new StatisticsUserInfoVo();
+        //非管理员默认部门信息
+        if (!loginUser.getUser().isAdmin() && !checkDept(loginUser.getUser().getDeptId())) {
+            param.setDeptId(loginUser.getUser().getDeptId());
+        }else if(param.getDeptId() == 1){
+            param.setDeptId(null);
+        }
+
+        //总用户数
+        List<SystemUserStatisticsVo> totalUserList = redisCache.getCacheObject(REDIS_KEY_PREFIX+"manual:totalUser");
+        if (totalUserList != null && !totalUserList.isEmpty()) {
+            userInfoVo.setManualTotalUser(fileStatistics(totalUserList, param));
+        }
+
+        //今日新增用户数
+        List<SystemUserStatisticsVo> todayUserList = redisCache.getCacheObject(REDIS_KEY_PREFIX+"manual:todayUser");
+        if (todayUserList != null && !todayUserList.isEmpty()) {
+          userInfoVo.setManualTodayUser(fileStatistics(todayUserList, param));
+        }
+
+        //自动用户数
+        List<SystemUserStatisticsVo> automaticUserList = redisCache.getCacheObject(REDIS_KEY_PREFIX+"automatic:totalUser");
+        if (automaticUserList != null && !automaticUserList.isEmpty()){
+            userInfoVo.setAutomaticTotalUser(fileStatistics(automaticUserList, param));
+        }
+
+        //自动今日新增用户数
+        List<SystemUserStatisticsVo> automaticTodayUserList = redisCache.getCacheObject(REDIS_KEY_PREFIX+"automatic:todayUser");
+        if(automaticTodayUserList != null && !automaticTodayUserList.isEmpty()) {
+            userInfoVo.setAutomaticTodayUser(fileStatistics(automaticTodayUserList, param));
+        }
+        return R.ok().put("data",userInfoVo);
+    }
+
+    //筛选统计信息
+    private Long fileStatistics(List<SystemUserStatisticsVo> totalUserList, StatisticsUserParam param){
+        Long num = 0L;
+        List<SystemUserStatisticsVo> filteredList = totalUserList.stream()
+                .filter(vo -> {
+                    if (param.getDeptId() == null && param.getCompanyId() == null) {
+                        return true;
+                    }
+                    if (param.getDeptId() != null && param.getCompanyId() == null) {
+                        return Objects.equals(vo.getDeptId(), param.getDeptId());
+                    }
+                    if (param.getDeptId() != null && param.getCompanyId() != null) {
+                        return Objects.equals(vo.getDeptId(), param.getDeptId())
+                                && Objects.equals(vo.getCompanyId(), param.getCompanyId());
+                    }
+                    if (param.getDeptId() == null && param.getCompanyId() != null) {
+                        return Objects.equals(vo.getCompanyId(), param.getCompanyId());
+                    }
+                    return false;
+                })
+                .collect(Collectors.toList());
+        if(!filteredList.isEmpty()){
+            // 计算总用户数
+            num = filteredList.stream()
+                    .mapToLong(SystemUserStatisticsVo::getUserNum)
+                    .sum();
+        }
+        return num;
+    }
+
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
 }

+ 40 - 4
fs-admin/src/main/java/com/fs/company/controller/CompanyController.java

@@ -7,6 +7,7 @@ import com.fs.common.annotation.RepeatSubmit;
 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.entity.SysDept;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
@@ -28,6 +29,7 @@ import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.config.CourseConfig;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.vo.OptionsVO;
+import com.fs.system.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -60,6 +62,10 @@ public class CompanyController extends BaseController
     private ICompanyVoiceCallerService callerService;
     @Autowired
     private ISysConfigService configService;
+
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
     /**
      * 查询企业列表
      */
@@ -89,7 +95,7 @@ public class CompanyController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept() && !checkDept(loginUser.getUser().getDeptId())){
             company.setDeptId(loginUser.getDeptId());
         }
         List<CompanyVO> list = companyService.selectCompanyVOList(company);
@@ -164,7 +170,25 @@ public class CompanyController extends BaseController
         return toAjax(companyService.updateCompany(company));
     }
 
-
+    /**
+     * 批量修改企业主备小程序
+     */
+//    @PreAuthorize("@ss.hasPermi('company:company:edit')")
+    @Log(title = "企业", businessType = BusinessType.UPDATE)
+    @PostMapping("/batchUpdateMiniApp")
+    public AjaxResult batchUpdateMiniApp(@RequestBody Company company)
+    {
+        if (company.getIds() == null || company.getIds().length == 0) {
+            return AjaxResult.error("请选择要修改的企业");
+        }
+        String miniAppMaster = company.getMiniAppMaster() != null && !company.getMiniAppMaster().isEmpty() ? company.getMiniAppMaster().get(0) : null;
+        String miniAppServer = company.getMiniAppServer() != null && !company.getMiniAppServer().isEmpty() ? company.getMiniAppServer().get(0) : null;
+        if (miniAppMaster == null && miniAppServer == null) {
+            return AjaxResult.error("请至少选择主小程序或备用小程序");
+        }
+        int count = companyService.batchUpdateMiniApp(company.getIds(), miniAppMaster, miniAppServer);
+        return AjaxResult.success("成功修改 " + count + " 个企业的主备小程序");
+    }
 
     /**
      * 删除企业
@@ -185,7 +209,7 @@ public class CompanyController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept() && !checkDept(loginUser.getUser().getDeptId())){
             map.setDeptId(loginUser.getDeptId());
         }
         List<Company> list = companyService.selectCompanyList(map);
@@ -201,7 +225,7 @@ public class CompanyController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()&& !checkDept(loginUser.getUser().getDeptId())){
             param.setDeptId(loginUser.getDeptId());
         }
         List<CompanyCrmVO> list = companyService.selectCompanyCrmDayCountList(param);
@@ -289,4 +313,16 @@ public class CompanyController extends BaseController
         List<OptionsVO> list = companyService.selectAllCompanyList(deptId);
         return getDataTable(list);
     }
+
+
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
 }

+ 24 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanyMoneyLogsController.java

@@ -4,6 +4,7 @@ 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.entity.SysDept;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
@@ -37,6 +38,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.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
@@ -70,6 +72,9 @@ public class CompanyMoneyLogsController extends BaseController
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
     /**
      * 查询企业账户记录列表
      */
@@ -81,7 +86,7 @@ public class CompanyMoneyLogsController extends BaseController
         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()){
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound() && !checkDept(loginUser.getUser().getDeptId())){
             companyMoneyLogs.setDeptId(loginUser.getDeptId());
         }
         if(!StringUtils.isEmpty(companyMoneyLogs.getCreateTimeRange())){
@@ -142,6 +147,13 @@ public class CompanyMoneyLogsController extends BaseController
         if (exportType1>0){
             return AjaxResult.error("你已经有正在导出的任务");
         }
+        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() && !checkDept(loginUser.getUser().getDeptId())){
+            param.setDeptId(loginUser.getDeptId());
+        }
+
         //导出全部
         if(param.getType().equals(0)){
             //判断是否达到数据上线
@@ -192,4 +204,15 @@ public class CompanyMoneyLogsController extends BaseController
         return AjaxResult.success(companyMoneyLogsService.selectCompanyMoneyLogsById(logsId));
     }
 
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
+
 }

+ 17 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficController.java

@@ -5,6 +5,7 @@ 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;
+import com.fs.common.core.domain.entity.SysDept;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
@@ -17,6 +18,7 @@ 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.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -39,6 +41,9 @@ public class CompanyTrafficController extends BaseController {
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
     /**
      * 每天扣除流量余额
      * */
@@ -81,7 +86,7 @@ public class CompanyTrafficController extends BaseController {
         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()){
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound() && !checkDept(loginUser.getUser().getDeptId())){
             param.setDeptId(loginUser.getDeptId());
         }
         List<CompanyTrafficRecord> list = companyTrafficRecordService.selectList(param);
@@ -115,4 +120,15 @@ public class CompanyTrafficController extends BaseController {
     public R trafficStatistics(CompanyTrafficRecord record) {
         return R.ok().put("tatol","").put("dept","").put("company","");
     }
+
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
 }

+ 22 - 2
fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficLogController.java

@@ -5,6 +5,7 @@ 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.entity.SysDept;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
@@ -15,6 +16,7 @@ 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.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -36,6 +38,9 @@ public class CompanyTrafficLogController extends BaseController {
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
 
     /** 流量充值记录查询 */
     @PreAuthorize("@ss.hasPermi('company:trafficLog:list')")
@@ -45,7 +50,7 @@ public class CompanyTrafficLogController extends BaseController {
         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()){
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound() && !checkDept(loginUser.getUser().getDeptId())){
             param.setDeptId(loginUser.getDeptId());
         }
         List<CompanyTrafficRecordLog> list = companyTrafficRecordLogService.selectList(param);
@@ -58,11 +63,26 @@ public class CompanyTrafficLogController extends BaseController {
     @Log(title = "流量充值记录导出", businessType = BusinessType.EXPORT)
     @GetMapping(value = "/export")
     public AjaxResult export(CompanyTrafficRecordLogQueryParam param) {
+        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() && !checkDept(loginUser.getUser().getDeptId())){
+            param.setDeptId(loginUser.getDeptId());
+        }
         List<CompanyTrafficRecordLog> list = companyTrafficRecordLogService.selectList(param);
         ExcelUtil<CompanyTrafficRecordLog> util = new ExcelUtil<>(CompanyTrafficRecordLog.class);
         return util.exportExcel(list, "流量充值记录");
     }
 
-
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
 
 }

+ 17 - 2
fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java

@@ -9,6 +9,7 @@ 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.entity.SysDept;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.core.redis.RedisCache;
@@ -24,6 +25,7 @@ import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.course.vo.FsCoursePlaySourceConfigProtocolVO;
 import com.fs.course.vo.FsCoursePlaySourceConfigVO;
 import com.fs.framework.web.service.TokenService;
+import com.fs.system.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import lombok.AllArgsConstructor;
@@ -45,6 +47,8 @@ public class FsCoursePlaySourceConfigController extends BaseController {
     private final TokenService tokenService;
     private final ISysConfigService configService;
 
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
     @Autowired
     private RedisCache redisCache;
 
@@ -66,7 +70,7 @@ public class FsCoursePlaySourceConfigController extends BaseController {
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
         Long userId = null;
         Long deptId = null;
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept() && !checkDept(loginUser.getUser().getDeptId())){
             deptId = loginUser.getDeptId();
             if(config.getDept() == null || !config.getDept()){
                 userId = loginUser.getUserId();
@@ -169,7 +173,7 @@ public class FsCoursePlaySourceConfigController extends BaseController {
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
         QueryWrapper<FsCoursePlaySourceConfig> queryWrapper = new QueryWrapper<FsCoursePlaySourceConfig>().eq("is_del", 0);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept() && !checkDept(loginUser.getUser().getDeptId())){
             queryWrapper.eq(config.getDept() == null || !config.getDept(),"create_user_id", loginUser.getUserId()).eq( "create_dept_id", loginUser.getDeptId());
         }
         if(companyId != null){
@@ -286,4 +290,15 @@ public class FsCoursePlaySourceConfigController extends BaseController {
             return 2; // 已设置
         }
     }
+
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
 }

+ 19 - 3
fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java

@@ -6,6 +6,7 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.entity.SysDept;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.common.utils.ServletUtils;
@@ -25,6 +26,7 @@ import com.fs.course.config.CourseConfig;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.mapper.FsDoctorMapper;
 import com.fs.his.vo.OptionsVO;
+import com.fs.system.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -71,6 +73,10 @@ public class FsCompanyController extends BaseController
     private ISysConfigService configService;
     @Autowired
     private ICompanyDivConfigService companyDivConfigService;
+
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
     /**
      * 查询诊所管理列表
      */
@@ -82,7 +88,7 @@ public class FsCompanyController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept() && !checkDept(loginUser.getUser().getDeptId())){
             company.setDeptId(loginUser.getDeptId());
         }
         List<CompanyVO> list = companyService.selectCompanyListVO(company);
@@ -97,7 +103,7 @@ public class FsCompanyController extends BaseController
         Long depId = null;
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept() && !checkDept(loginUser.getUser().getDeptId())){
             depId = loginUser.getDeptId();
         }
         List<OptionsVO> list = companyService.selectAllCompanyList(depId);
@@ -153,7 +159,7 @@ public class FsCompanyController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept() && !checkDept(loginUser.getUser().getDeptId())){
             company.setDeptId(loginUser.getDeptId());
         }
         company.setAdmin(loginUser.isAdmin());
@@ -310,4 +316,14 @@ public class FsCompanyController extends BaseController
         return companyService.oneClickEnable(param.getCompanyIds(),loginUser);
     }
 
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
 }

+ 27 - 2
fs-admin/src/main/java/com/fs/his/controller/FsCompanyDeductController.java

@@ -8,6 +8,7 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.entity.SysDept;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.ServletUtils;
@@ -24,6 +25,7 @@ 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.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import com.fs.system.service.ISysDeptConfigLogService;
 import com.fs.system.service.ISysDeptConfigService;
@@ -72,6 +74,9 @@ public class FsCompanyDeductController extends BaseController
     @Autowired
     private ISysDeptConfigLogService sysDeptConfigLogService;
 
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
     /**
      * 查询扣款管理列表
      */
@@ -83,7 +88,7 @@ public class FsCompanyDeductController extends BaseController
         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()){
+        if(!loginUser.isAdmin() && config.getIsBound() != null && config.getIsBound() && !checkDept(loginUser.getUser().getDeptId())){
             companyDeduct.setDeptId(loginUser.getDeptId());
         }
         List<CompanyDeductVO> list = companyDeductService.selectCompanyDeductListVO(companyDeduct);
@@ -100,6 +105,12 @@ public class FsCompanyDeductController extends BaseController
     public AjaxResult export(CompanyDeductVO companyDeduct)
     {
         companyDeduct.setIsAudit(null);
+        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() && !checkDept(loginUser.getUser().getDeptId())){
+            companyDeduct.setDeptId(loginUser.getDeptId());
+        }
         List<CompanyDeductVO> list = companyDeductService.selectCompanyDeductListVO(companyDeduct);
         ExcelUtil<CompanyDeductVO> util = new ExcelUtil<CompanyDeductVO>(CompanyDeductVO.class);
         return util.exportExcel(list, "扣款管理数据");
@@ -162,6 +173,9 @@ public class FsCompanyDeductController extends BaseController
         deduct.setIsAudit(param.getIsAudit());
         deduct.setRemark(param.getRemark());
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if(loginUser.getUser().getDeptId() == null){
+            return R.error("审核失败,当前审核账号未绑定部门!");
+        }
         if(deduct.getIsAudit()==1){
             Company company=companyService.selectCompanyByIdForUpdate(deduct.getCompanyId());
             company.setMoney(company.getMoney().subtract(deduct.getMoney()));
@@ -179,7 +193,7 @@ public class FsCompanyDeductController extends BaseController
 
             SysConfig courseConfig = sysConfigMapper.selectConfigByConfigKey("course.config");
             CourseConfig config = JSON.parseObject(courseConfig.getConfigValue(), CourseConfig.class);
-            if(config.getDeptLimit() != null && config.getDeptLimit() && !loginUser.isAdmin()){
+            if(config.getDeptLimit() != null && config.getDeptLimit() && !loginUser.isAdmin() && !checkDept(loginUser.getUser().getDeptId())){
                 SysDeptConfig deptConfig = sysDeptConfigService.getDeptConfig(loginUser.getDeptId());
                 BigDecimal redPackage = deptConfig.getRedPackage();
                 BigDecimal nowMoney = redPackage.add(deduct.getMoney());
@@ -197,4 +211,15 @@ public class FsCompanyDeductController extends BaseController
 
     }
 
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
+
 }

+ 47 - 0
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -23,6 +23,7 @@ import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCoursePeriodDays;
 import com.fs.course.dto.BatchSendCourseAllDTO;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.course.mapper.FsUserCompanyUserMapper;
 import com.fs.course.mapper.FsUserCoursePeriodDaysMapper;
 import com.fs.course.service.IFsCourseLinkService;
 import com.fs.course.service.IFsCourseWatchLogService;
@@ -58,6 +59,9 @@ import com.fs.his.service.*;
 import com.fs.his.service.impl.FsPackageOrderServiceImpl;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsSubOrderResultVO;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
 import com.fs.hisStore.service.IFsStoreScrmService;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hospital580.service.Hospital580PrescriptionScrmService;
@@ -65,6 +69,8 @@ import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
 import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.QwCompany;
+import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwRestrictionPushRecordMapper;
 import com.fs.qw.service.*;
 import com.fs.qwApi.service.QwApiService;
@@ -218,6 +224,21 @@ public class Task {
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private FsUserCompanyUserMapper userCompanyUserMapper;
+
+    @Autowired
+    private QwExternalContactMapper externalContactMapper;
+
+    @Autowired
+    private FsStoreOrderScrmMapper orderScrmMapper;
+
+    @Autowired
+    private FsStoreProductScrmMapper storeProductScrmMapper;
+
+    //统计redis_key
+    private final String REDIS_KEY_PREFIX = "system:statistics:";
+
     /**
      * sop任务token消耗统计
      */
@@ -1629,4 +1650,30 @@ public class Task {
         }
     }
 
+    /**
+     * 定时任务统计(1小时统计一次)
+     * **/
+   public void systemStatistics(){
+       log.info("定时任务统计-----------------------------------------》:{}","START");
+       //统计手动会员
+       redisCache.setCacheObject(REDIS_KEY_PREFIX+"manual:totalUser",userCompanyUserMapper.selectManualUser());
+
+       //统计手动今日新增
+       redisCache.setCacheObject(REDIS_KEY_PREFIX+"manual:todayUser",userCompanyUserMapper.selectManualTodayUser());
+
+       //统计企微信会员
+       redisCache.setCacheObject(REDIS_KEY_PREFIX+"automatic:totalUser",externalContactMapper.selectAutomaticUser());
+
+       //统计自动今日新增
+       redisCache.setCacheObject(REDIS_KEY_PREFIX+"automatic:todayUser",externalContactMapper.selectAutomaticTodayUser());
+
+       //店铺订单统计
+       redisCache.setCacheObject(REDIS_KEY_PREFIX+"order",orderScrmMapper.selectOrderStatistics());
+
+       //商品总数
+       redisCache.setCacheObject(REDIS_KEY_PREFIX+"goods",storeProductScrmMapper.selectGoodsStatistics());
+
+       log.info("定时任务结束-----------------------------------------》:{}","END");
+    }
+
 }

+ 19 - 2
fs-admin/src/main/java/com/fs/qw/controller/QwCompanyController.java

@@ -4,11 +4,13 @@ import java.util.List;
 
 import cn.hutool.json.JSONUtil;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.entity.SysDept;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.utils.ServletUtils;
 import com.fs.course.config.CourseConfig;
 import com.fs.framework.web.service.TokenService;
 import com.fs.qw.vo.QwOptionsVO;
+import com.fs.system.mapper.SysDeptMapper;
 import com.fs.system.service.ISysConfigService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,6 +45,10 @@ public class QwCompanyController extends BaseController
     private IQwCompanyService qwCompanyService;
     @Autowired
     private TokenService tokenService;
+
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
     @Autowired
     private ISysConfigService configService;
 
@@ -57,7 +63,7 @@ public class QwCompanyController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){//查看部门所有主体信息
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept() && !checkDept(loginUser.getUser().getDeptId())){//查看部门所有主体信息
             qwCompany.setCreateDeptId(loginUser.getDeptId());
 //            qwCompany.setCreateUserId(loginUser.getUserId());
         }
@@ -74,7 +80,7 @@ public class QwCompanyController extends BaseController
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
-        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()){
+        if(!loginUser.isAdmin() && config.getDept() != null && config.getDept()&& !checkDept(loginUser.getUser().getDeptId())){
             deptId = loginUser.getDeptId();
             if(config.getDept() == null || !config.getDept()){
                 userId = loginUser.getUserId();
@@ -144,4 +150,15 @@ public class QwCompanyController extends BaseController
     {
         return toAjax(qwCompanyService.deleteQwCompanyByIds(ids));
     }
+
+    /**
+     * 校验是否总公司部门
+     * **/
+    public boolean checkDept(Long deptId){
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if(dept == null || !dept.getDeptId().equals(1L)){
+            return false;
+        }
+        return true;
+    }
 }

+ 12 - 0
fs-admin/src/main/java/com/fs/web/controller/system/SysUserController.java

@@ -9,6 +9,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.PageDomain;
 import com.fs.common.core.page.TableSupport;
+import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.ServletUtils;
 import com.fs.framework.web.service.TokenService;
 import com.fs.hisStore.service.IFsStoreScrmService;
@@ -167,6 +168,17 @@ public class SysUserController extends BaseController
         {
             return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
         }
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if(loginUser == null){
+            throw new ServiceException("操作失败,登录用户不存在!");
+        }
+
+        if(user.getDeptId() != null && user.getDeptId().equals(1L)){//总公司
+            if(!loginUser.getUser().getDeptId().equals(user.getDeptId())){
+                throw new ServiceException("操作失败,暂无权限创建总公司部门下面的账号!");
+            }
+        }
         user.setCreateBy(getUsername());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         return toAjax(userService.insertUser(user));

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

@@ -51,6 +51,7 @@ public class ScheduleConfig
         factory.setOverwriteExistingJobs(true);
         // 设置自动启动,默认为true
         factory.setAutoStartup(true);
+//        factory.setAutoStartup(false);
 
         return factory;
     }

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

@@ -126,6 +126,10 @@ public class Company extends BaseEntity
     @TableField(exist = false)
     private List<String> miniAppServer;
 
+    /** 批量操作时传入的企业ID列表 */
+    @TableField(exist = false)
+    private Long[] ids;
+
     @TableField(exist = false)
     private boolean updateMiniApp;
 

+ 8 - 2
fs-service/src/main/java/com/fs/company/mapper/CompanyMoneyLogsMapper.java

@@ -296,7 +296,7 @@ public interface CompanyMoneyLogsMapper
     @Select("select * FROM company_money_logs where logs_type=12 AND business_id=#{id} limit 1")
     CompanyMoneyLogs selectCompanyMoneyByInquiry(Long id);
     @Select({"<script> " +
-            "select  count(1) from company_money_logs l" +
+            "select  count(1) from company_money_logs l left join company c on c.company_id=l.company_id" +
             " where 1=1 " +
             "<if test = 'maps.companyId != null  '> " +
             "and l.company_id = #{maps.companyId}" +
@@ -304,6 +304,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.createTimeList != null    '> " +
             " AND date_format(l.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
             " AND date_format(l.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +
@@ -313,11 +316,14 @@ public interface CompanyMoneyLogsMapper
 
 
     @Select({"<script> " +
-            "select count(1)  FROM company_money_logs l " +
+            "select count(1)  FROM company_money_logs l left join company c on c.company_id=l.company_id " +
             " where (l.logs_type=3||l.logs_type=4||l.logs_type=5||l.logs_type=6 ||  l.logs_type=13 ||  l.logs_type=14)" +
             "<if test = 'maps.companyId != null  '> " +
             "and l.company_id = #{maps.companyId}" +
             "</if>" +
+            "<if test = 'maps.deptId != null  '> " +
+            "and c.dept_id = #{maps.deptId}" +
+            "</if>" +
             "<if test = 'maps.createTimeList != null    '> " +
             " AND date_format(l.create_time,'%y%m%d') &gt;= date_format(#{maps.createTimeList[0]},'%y%m%d') " +
             " AND date_format(l.create_time,'%y%m%d') &lt;= date_format(#{maps.createTimeList[1]},'%y%m%d') " +

+ 10 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyService.java

@@ -64,6 +64,16 @@ public interface ICompanyService
      */
     public int updateCompany(Company company);
 
+    /**
+     * 批量更新企业主备小程序
+     *
+     * @param companyIds 企业ID列表
+     * @param miniAppMaster 主小程序ID(可为空)
+     * @param miniAppServer 备用小程序ID(可为空)
+     * @return 结果
+     */
+    public int batchUpdateMiniApp(Long[] companyIds, String miniAppMaster, String miniAppServer);
+
     /**
      * 批量删除企业
      *

+ 21 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -357,6 +357,27 @@ public class CompanyServiceImpl implements ICompanyService
         }
         return companyMapper.updateCompany(company);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchUpdateMiniApp(Long[] companyIds, String miniAppMaster, String miniAppServer) {
+        int count = 0;
+        for (Long companyId : companyIds) {
+            Company company = new Company();
+            company.setCompanyId(companyId);
+            company.setUpdateMiniApp(true);
+            if (miniAppMaster != null && !miniAppMaster.isEmpty()) {
+                company.setMiniAppMaster(java.util.Collections.singletonList(miniAppMaster));
+            }
+            if (miniAppServer != null && !miniAppServer.isEmpty()) {
+                company.setMiniAppServer(java.util.Collections.singletonList(miniAppServer));
+            }
+            bindMiniApp(company);
+            count++;
+        }
+        return count;
+    }
+
     // 绑定小程序
     public void bindMiniApp(Company company){
         companyMiniappService.removeByCompanyId(company.getCompanyId());

+ 7 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCompanyUserMapper.java

@@ -2,6 +2,7 @@ package com.fs.course.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.course.domain.FsUserCompanyUser;
+import com.fs.his.vo.SystemUserStatisticsVo;
 import com.fs.qw.dto.FsUserTransferParamDTO;
 import com.fs.qw.dto.UserProjectDTO;
 import org.apache.ibatis.annotations.Param;
@@ -95,4 +96,10 @@ public interface FsUserCompanyUserMapper extends BaseMapper<FsUserCompanyUser>{
     List<Long> selectFsUserCompanyUserListByMap(@Param("param") Map<String, Object> param);
 
     List<FsUserCompanyUser> selectFsUserCompanyUserByIds(@Param("param") Map<String, Object> param);
+
+    //获取手动添加的会员总
+    List<SystemUserStatisticsVo> selectManualUser();
+
+    //获取手动今日新增会员
+    List<SystemUserStatisticsVo> selectManualTodayUser();
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/param/FsCompanyMoneyLogsExportParam.java

@@ -14,4 +14,6 @@ public class FsCompanyMoneyLogsExportParam  implements Serializable {
     private String createTimeRange;
 
     private String[] createTimeList;
+
+    private Long deptId;
 }

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

@@ -867,8 +867,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
             return R.error("红包单号生成失败,请重试");
         }
         request.setOutBatchNo("fsCourse"+cloudHostProper.getProjectCode() + code);
-        request.setBatchRemark("课堂答题奖励");
-        request.setBatchName("课堂答题奖励");
+        request.setBatchRemark("鼓励奖");
+        request.setBatchName("鼓励奖");
         Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount().toString());
         request.setTotalAmount(amount);
         request.setTotalNum(1);
@@ -880,7 +880,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         String code1 = IdUtil.getSnowflake(0, 0).nextIdStr();
         transferDetail.setOutDetailNo("fsCourse"+cloudHostProper.getProjectCode() + code1);
         transferDetail.setTransferAmount(amount);
-        transferDetail.setTransferRemark("恭喜同学,认真听课,奖励你一朵小红花!");
+        transferDetail.setTransferRemark("恭喜,奖励你一朵小红花");
         transferDetailList.add(transferDetail);
         request.setTransferDetailList(transferDetailList);
 
@@ -1077,8 +1077,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
 //        }
         String code = String.valueOf(IdUtil.getSnowflake(0, 0).nextId());
         request.setOutBatchNo("fsCourse"+code);
-        request.setBatchRemark("课堂答题奖励");
-        request.setBatchName("课堂答题奖励");
+        request.setBatchRemark("鼓励奖");
+        request.setBatchName("鼓励奖");
         Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount()!=null ? param.getAmount().toString() : "0.1");
         request.setTotalAmount(amount);
         request.setTotalNum(1);
@@ -1089,7 +1089,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         String code1 =  String.valueOf(IdUtil.getSnowflake(0, 0).nextId());
         transferDetail.setOutDetailNo("fsCourse"+code1);
         transferDetail.setTransferAmount(amount);
-        transferDetail.setTransferRemark("恭喜同学,认真听课,奖励你一朵小红花!");
+        transferDetail.setTransferRemark("恭喜,奖励你一朵小红花");
         transferDetailList.add(transferDetail);
         request.setTransferDetailList(transferDetailList);
         TransferBatchesResult transferBatchesResult=null;

+ 16 - 0
fs-service/src/main/java/com/fs/his/vo/SystemGoodsStatisticsVo.java

@@ -0,0 +1,16 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 商品数量统计
+ * **/
+@Data
+public class SystemGoodsStatisticsVo implements Serializable {
+    //门店ID
+    private Long storeId;
+    //商品数量
+    private Long goodsNum;
+}

+ 16 - 0
fs-service/src/main/java/com/fs/his/vo/SystemOrderStatisticsVo.java

@@ -0,0 +1,16 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class SystemOrderStatisticsVo implements Serializable {
+    //门店ID
+    private Long storeId;
+    //订单数量
+    private Long orderNum;
+    //订单金额
+    private BigDecimal paymentAmount;
+}

+ 20 - 0
fs-service/src/main/java/com/fs/his/vo/SystemUserStatisticsVo.java

@@ -0,0 +1,20 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 系统用户统计Vo
+ * **/
+@Data
+public class SystemUserStatisticsVo implements Serializable {
+    //部门ID
+    private Long deptId;
+
+    //公司ID
+    private Long companyId;
+
+    //用户数量
+    private Long userNum;
+}

+ 7 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -16,6 +16,7 @@ import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.dto.FsStoreOrderAmountScrmStatsQueryDto;
 import com.fs.his.vo.FsStoreOrderAmountScrmStatsVo;
 import com.fs.his.vo.FsStoreOrderExcelVO;
+import com.fs.his.vo.SystemOrderStatisticsVo;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.domain.FsStoreOrderItemScrm;
 import com.fs.hisStore.domain.ReportScrm;
@@ -1431,4 +1432,10 @@ public interface FsStoreOrderScrmMapper extends BaseMapper<FsStoreOrderScrm>
      * 批量更新溯源码
      * **/
     void batchUpdateVerifyCodeByOrderCode(@Param("list") List<FsOrderCodeNoteDTO> list);
+
+    /**
+     * 获取订单统计数据
+     * @return 订单统计数据
+     */
+    List<SystemOrderStatisticsVo> selectOrderStatistics();
 }

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

@@ -6,6 +6,7 @@ import java.util.Map;
 import com.fs.his.param.FsStoreProductListSParam;
 import com.fs.his.vo.FsStoreProductListSVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.his.vo.SystemGoodsStatisticsVo;
 import com.fs.hisStore.config.MedicalMallConfig;
 import com.fs.hisStore.domain.ForbiddenOnlineMedicine;
 import com.fs.hisStore.domain.FsStoreProductRuleScrm;
@@ -16,7 +17,6 @@ import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.param.FsStoreProductQueryParam;
 import com.fs.hisStore.vo.*;
 import com.fs.statis.dto.ProductAuditDTO;
-import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -741,4 +741,7 @@ public interface FsStoreProductScrmMapper
      */
     Boolean productNameExist(@Param("productName") String productName,@Param("commonName") String commonName,
                              @Param("storeId") Long storeId);
+
+    //商品总数
+    List<SystemGoodsStatisticsVo> selectGoodsStatistics();
 }

+ 11 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.common.annotation.DataSource;
 import com.fs.common.enums.DataSourceType;
 import com.fs.fastGpt.domain.FastgptChatArtificialWords;
+import com.fs.his.vo.SystemUserStatisticsVo;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUserDelLossLog;
 import com.fs.qw.param.*;
@@ -540,4 +541,14 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
      * 批量更备份表字段
      * **/
     void updateQwExternalContactBfByUserId(@Param("userIds")List<Long> userIds);
+
+    /**
+     * 自动会员统计
+     * **/
+    List<SystemUserStatisticsVo> selectAutomaticUser();
+
+    /**
+     * 自动会员今日统计
+     * **/
+    List<SystemUserStatisticsVo> selectAutomaticTodayUser();
 }

+ 13 - 0
fs-service/src/main/java/com/fs/statis/param/StatisticsStroeParam.java

@@ -0,0 +1,13 @@
+package com.fs.statis.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 统计店铺相关参数
+ * **/
+@Data
+public class StatisticsStroeParam implements Serializable {
+    private Long storeId;
+}

+ 16 - 0
fs-service/src/main/java/com/fs/statis/param/StatisticsUserParam.java

@@ -0,0 +1,16 @@
+package com.fs.statis.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 首页统计用户参数
+ * **/
+@Data
+public class StatisticsUserParam implements Serializable {
+    //部门id
+    private Long deptId;
+    //公司id
+    private Long companyId;
+}

+ 16 - 0
fs-service/src/main/java/com/fs/statis/vo/StatisticsStroeInfoVo.java

@@ -0,0 +1,16 @@
+package com.fs.statis.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class StatisticsStroeInfoVo implements Serializable {
+    //收款总数
+    private BigDecimal recvTotalNum;
+    //订单总数
+    private Long orderTotalNum;
+    //商品总数
+    private Long goodsTotalNum;
+}

+ 20 - 0
fs-service/src/main/java/com/fs/statis/vo/StatisticsUserInfoVo.java

@@ -0,0 +1,20 @@
+package com.fs.statis.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 销售用户信息
+ * **/
+@Data
+public class StatisticsUserInfoVo implements Serializable {
+    //手动总会员数
+    private Long manualTotalUser;
+    //手动今日新增会员数量
+    private Long manualTodayUser;
+    //自动总会员数
+    private Long automaticTotalUser;
+    //自动今日新增会员数量
+    private Long automaticTodayUser;
+}

+ 32 - 0
fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml

@@ -194,4 +194,36 @@
         </where>
     </select>
 
+    <select id="selectManualUser" resultType="com.fs.his.vo.SystemUserStatisticsVo">
+        SELECT
+            c.dept_id,
+            c.company_id,
+            COUNT( DISTINCT cu.user_id) AS userNum
+        FROM
+            fs_user_company_user cu
+                INNER JOIN company c ON c.company_id = cu.company_id
+                AND c.dept_id IS not NULL
+        GROUP BY
+            c.dept_id,
+            c.company_id
+    </select>
+
+    <select id="selectManualTodayUser" resultType="com.fs.his.vo.SystemUserStatisticsVo">
+        SELECT
+        c.dept_id,
+        c.company_id,
+        COUNT(DISTINCT cu.user_id) AS userNum
+        FROM
+        fs_user_company_user cu
+        INNER JOIN company c ON c.company_id = cu.company_id AND c.dept_id IS NOT NULL
+        INNER JOIN fs_user fu ON fu.user_id = cu.user_id
+        WHERE
+        fu.create_time >= CURDATE()
+        AND fu.create_time &lt; CURDATE() + INTERVAL 1 DAY
+        GROUP BY
+        c.dept_id,
+        c.company_id;
+    </select>
+
+
 </mapper>

+ 14 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml

@@ -2181,4 +2181,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             </foreach>
         </if>
     </update>
+
+    <select id="selectOrderStatistics" resultType="com.fs.his.vo.SystemOrderStatisticsVo">
+        SELECT
+            fs.store_name,
+            os.store_id,
+            COUNT(*) AS orderNum,
+            SUM(os.pay_money) AS paymentAmount
+        FROM
+            fs_store_order_scrm os
+                INNER JOIN fs_store_scrm fs ON os.store_id = fs.store_id
+        WHERE
+            paid = 1
+        GROUP BY store_id
+    </select>
 </mapper>

+ 12 - 1
fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

@@ -1048,7 +1048,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        where store_id = #{storeId} and  ((product_name = #{productName} AND product_name != '-') or (common_name = #{commonName} AND common_name != '-'))
     </select>
 
-
+    <select id="selectGoodsStatistics" resultType="com.fs.his.vo.SystemGoodsStatisticsVo">
+        SELECT
+            store_id,
+            COUNT(*) AS goodsNum
+        FROM
+            fs_store_product_scrm
+        WHERE
+            is_del = 0
+          AND is_show = 1
+          AND store_id IS NOT NULL
+        GROUP BY store_id
+    </select>
 
 
 </mapper>

+ 26 - 0
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -803,4 +803,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{userId}
         </foreach>
     </update>
+
+    <select id="selectAutomaticUser" resultType="com.fs.his.vo.SystemUserStatisticsVo">
+        SELECT
+            c.dept_id,
+            c.company_id,
+            COUNT(DISTINCT ec.fs_user_id) AS userNum
+        FROM
+            qw_external_contact ec
+                INNER JOIN company c ON ec.company_id = c.company_id
+        GROUP BY c.dept_id,c.company_id
+    </select>
+
+    <select id="selectAutomaticTodayUser" resultType="com.fs.his.vo.SystemUserStatisticsVo">
+        SELECT
+            c.dept_id,
+            c.company_id,
+            COUNT(DISTINCT ec.fs_user_id) AS userNum
+        FROM
+            qw_external_contact ec
+            INNER JOIN company c ON ec.company_id = c.company_id AND c.dept_id IS NOT NULL
+            INNER JOIN fs_user fu ON fu.user_id = ec.fs_user_id
+        WHERE
+            fu.create_time >= CURDATE()
+          AND fu.create_time &lt; CURDATE() + INTERVAL 1 DAY
+        GROUP BY c.dept_id,c.company_id
+    </select>
 </mapper>