Kaynağa Gözat

统计报表开发

wangxy 3 gün önce
ebeveyn
işleme
49cda59baf

+ 1 - 0
fs-admin/src/main/java/com/fs/his/controller/FsPackageOrderController.java

@@ -74,6 +74,7 @@ public class FsPackageOrderController extends BaseController
     @PreAuthorize("@ss.hasPermi('his:packageOrder:report')")
     @GetMapping("/packageOrderReport")
     public TableDataInfo  selectFsPackageOrderReportVO(FsPackageOrderParam param){
+        startPage();
         List<FsPackageOrderReportVO> list = fsPackageOrderService.selectFsPackageOrderReportVO(param);
 //        // 计算合计数据
 //        FsPackageOrderReportVO totalVo = new FsPackageOrderReportVO();

+ 0 - 2
fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java

@@ -246,8 +246,6 @@ public class FsUserCoursePeriodController extends BaseController {
         Map<String,Object> params = new HashMap<>();
         params.put("name", name);
         params.put("campId", campId);
-
-        PageHelper.startPage(pageNum, pageSize);
         List<OptionsVO> periodList = fsUserCoursePeriodDaysService.selectPeriodListByMap(params);
         return R.ok().put("data", new PageInfo<>(periodList));
     }

+ 6 - 0
fs-company/src/main/java/com/fs/hisStore/controller/FsStoreStatisticsScrmController.java

@@ -5,6 +5,7 @@ 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.page.TableDataInfo;
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.TimeUtils;
 import com.fs.common.utils.poi.ExcelUtil;
@@ -12,6 +13,7 @@ import com.fs.company.domain.CompanyUser;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.course.param.FsCourseWatchLogStatisticsListParam;
 import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.hisStore.param.FsStoreStatisticsParam;
 import com.fs.hisStore.service.IFsStoreOrderScrmService;
@@ -188,6 +190,8 @@ public class FsStoreStatisticsScrmController extends BaseController {
     @GetMapping("/userReport")
     public TableDataInfo userReport(FsCourseWatchLogStatisticsListParam param) {
         startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
         return getDataTable(courseWatchLogService.selectFsUserReportVO(param));
     }
 
@@ -197,6 +201,8 @@ public class FsStoreStatisticsScrmController extends BaseController {
     @GetMapping("/watchLogReport")
     public TableDataInfo watchLogReport(FsCourseWatchLogStatisticsListParam param) {
         startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
         return getDataTable(courseWatchLogService.selectWatchLogReportVO(param));
     }
 

+ 7 - 0
fs-company/src/main/resources/logback.xml

@@ -76,6 +76,13 @@
 	<!-- Spring日志级别控制  -->
 	<logger name="org.springframework" level="warn" />
 
+    <!-- log4j2.xml -->
+    <Logger name="com.fs.his.mapper" level="debug"/>
+    <Logger name="com.fs.course.mapper" level="debug"/>
+    <Logger name="com.fs.company.mapper" level="debug"/>
+    <Logger name="com.fs.hisStore.mapper" level="debug"/>
+    <Logger name="org.apache.ibatis" level="debug"/>
+
 	<root level="info">
 		<appender-ref ref="console" />
 	</root>

+ 41 - 9
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -620,13 +620,27 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
     // 统计当天各公司的观看人数和完播人数, 存到redis中,定时任务每 ? 分钟执行一次
     List<WatchCourseStatisticsResultDTO> watchCourseStatisticsGroupByCompany(@Param("params") Map<String, Object> params);
 
+
+
+    /**
+     *  公司基本信息
+     * @param param
+     * @return
+     */
+    List<FsCourseReportVO> selectCompanyBaseInfo(FsCourseWatchLogStatisticsListParam param);
+
     /**
-     * 看课统计报表
+     * 看课信息
      * @param param
      * @return
      */
-    List<FsCourseReportVO>  selectFsCourseReportVO(FsCourseWatchLogStatisticsListParam param);
+    List<FsCourseReportVO> selectWatchStatistics(FsCourseWatchLogStatisticsListParam param);
+
+    List<FsCourseReportVO> selectAnswerStatistics(FsCourseWatchLogStatisticsListParam param);
+
+    List<FsCourseReportVO> selectRedPacketStatistics(FsCourseWatchLogStatisticsListParam param);
 
+    List<FsCourseReportVO> selectCampPeriodInfo(@Param("periodIds") List<Long> periodIds);
 
     /**
      * 查询会员基础数据
@@ -646,7 +660,7 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      * @param userIds
      * @return
      */
-    List<FsUserReportVO> selectIntegralStatsByUserIds(@Param("userIds") List<Long> userIds);
+    List<FsUserReportVO> selectIntegralStatsByUserIds(@Param("userIds") List<Long> userIds, @Param("watchParam") FsCourseWatchLogStatisticsListParam param);
 
     /**
      * 对应会员的红包数据
@@ -660,10 +674,9 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      * @param userIds
      * @return
      */
-    List<FsUserReportVO> selectOrderStatsByUserIds(@Param("userIds") List<Long> userIds);
+    List<FsUserReportVO> selectOrderStatsByUserIds(@Param("userIds") List<Long> userIds,@Param("watchParam") FsCourseWatchLogStatisticsListParam param);
 
 
-    List<WatchLogReportVO>  selectWatchLogReportVO(FsCourseWatchLogStatisticsListParam param);
 
     /**
      * 查询看课记录
@@ -701,6 +714,23 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      */
     List<WatchLogReportVO>  selectCompanyBaseData(FsCourseWatchLogStatisticsListParam param);
 
+    /**
+     * 销售端看课报表 营期训练营明细
+     * @param
+     * @return
+     */
+    List<WatchLogReportVO>  selectCampPeriodByPeriod(@Param("periodIds") List<Long> periodIds );
+
+    /**
+     * 根据销售ids查询会员数据
+     * @param salesIds
+     * @return
+     */
+    List<WatchLogReportVO>  getSalesMemberStats(@Param("salesIds") List<Long> salesIds );
+
+
+    List<WatchLogReportVO> getSalesDeptCompanyInfo(@Param("salesIds") List<Long> salesIds,@Param("watchParam") FsCourseWatchLogStatisticsListParam param);
+
     /**
      * 销售端看课报表 看课统计明细数据
      * @param userConditions
@@ -714,19 +744,21 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      * @param
      * @return
      */
-    List<WatchLogReportVO> selectRedPacketStats(@Param("userIds") List<Long> userIds);
+    List<WatchLogReportVO> selectRedPacketStats(@Param("logIds") List<Long> logIds);
 
     /**
      * 订单
      * @param userIds
      * @return
      */
-    List<WatchLogReportVO> selectOrderStats(@Param("userIds") List<Long> userIds);
+    List<WatchLogReportVO> selectOrderStats(@Param("userIds") List<Long> userIds, @Param("watchParam") FsCourseWatchLogStatisticsListParam param);
 
     /**
      * 答题
-     * @param userIds
+     * @param logIds
      * @return
      */
-    List<WatchLogReportVO> selectAnswerStats(@Param("userIds") List<Long> userIds);
+    List<WatchLogReportVO> selectAnswerStats(@Param("logIds") List<Long> logIds);
+
+
 }

+ 20 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogStatisticsListParam.java

@@ -74,5 +74,25 @@ public class FsCourseWatchLogStatisticsListParam extends BaseEntity {
      */
     private  Long salesId;
 
+    /**
+     * 营期ids
+     */
+    private List<Long> periodIds;
+
+    /**
+     * 订单开始时间
+     */
+    private  Date orderSTime;
+
+    /**
+     * 订单结束时间
+     */
+    private  Date orderETime;
+
+    /**
+     * 公司ids
+     */
+    private  List<Long> companyIds;
+
 
 }

+ 218 - 26
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -1294,9 +1294,149 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
 
     @Override
     public List<FsCourseReportVO> selectFsCourseReportVO(FsCourseWatchLogStatisticsListParam param) {
-        return fsCourseWatchLogMapper.selectFsCourseReportVO(param);
+        // 1. 查询公司基础信息
+        List<FsCourseReportVO> companyList = fsCourseWatchLogMapper.selectCompanyBaseInfo(param);
+        if (CollectionUtils.isEmpty(companyList)) {
+            return Collections.emptyList();
+        }
+        List<Long> companyIds = companyList.stream()
+                .map(company -> (Long) company.getCompanyId())
+                .collect(Collectors.toList());
+        param.setCompanyIds(companyIds);
+        Map<Long, FsCourseReportVO> watchStatistics = getWatchStatistics(param);
+        Map<Long, FsCourseReportVO> answerStatistics = getAnswerStatistics(param);
+        Map<Long, FsCourseReportVO> redPacketStatistics = getRedPacketStatistics(param);
+        Map<Long, FsCourseReportVO> campPeriodMap = new HashMap<>();
+        if ("camp".equals(param.getDimension())) {
+            List<Long> periodIds = watchStatistics.values().stream()
+                    .map(stats -> stats.getPeriodId())
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toList());
+            if (!periodIds.isEmpty()) {
+                campPeriodMap = getCampPeriodInfo(periodIds);
+            }
+        }
+        // 4. 组装最终结果
+        return assembleStatisticsResult(companyList, watchStatistics, answerStatistics,
+                redPacketStatistics, campPeriodMap, param);
+    }
+
+    private List<FsCourseReportVO> assembleStatisticsResult(List<FsCourseReportVO> companyList, Map<Long, FsCourseReportVO> watchStatistics, Map<Long, FsCourseReportVO> answerStatistics, Map<Long, FsCourseReportVO> redPacketStatistics, Map<Long, FsCourseReportVO> campPeriodMap, FsCourseWatchLogStatisticsListParam param) {
+        for (FsCourseReportVO  company : companyList) {
+            Long companyId = company.getCompanyId();
+
+            // 获取各类统计数据
+            FsCourseReportVO watchStats = watchStatistics.get(companyId);
+            FsCourseReportVO answerStats = answerStatistics.get(companyId);
+            FsCourseReportVO redPacketStats = redPacketStatistics.get(companyId);
+
+
+            // 设置看课统计数据
+            if(watchStats!=null){
+                company.setPendingCount(watchStats.getPendingCount());
+                company.setWatchingCount(watchStats.getWatchingCount());
+                company.setFinishedCount(watchStats.getFinishedCount());
+                company.setInterruptedCount(watchStats.getInterruptedCount());
+                company.setAccessCount(watchStats.getAccessCount());
+                company.setWatchRate(calculateWatchRate(watchStats.getWatchingCount(), watchStats.getFinishedCount(), watchStats.getAccessCount()));
+                company.setFinishRate(calculateFinishRate(watchStats.getFinishedCount(), watchStats.getAccessCount()));
+            }
+
+            // 设置答题统计数据
+            if(answerStats!=null){
+                company.setAnswerUserCount(answerStats.getAnswerUserCount());
+            }
+
+            // 设置红包统计数据
+           if(redPacketStats!=null){
+               company.setPacketUserCount(redPacketStats.getPacketUserCount());
+               company.setPacketAmount(redPacketStats.getPacketAmount());
+           }
+
+            // 设置营期信息(如果维度是camp)
+            if ("camp".equals(param.getDimension()) && watchStats != null) {
+                Long samplePeriodId = watchStats.getPeriodId();
+                if (samplePeriodId != null) {
+                    FsCourseReportVO campPeriod = campPeriodMap.get(samplePeriodId);
+                    if (campPeriod != null) {
+                        company.setTrainingCampName(campPeriod.getTrainingCampName());
+                        company.setPeriodName(campPeriod.getPeriodName());
+                    }
+                }
+            }
+
+        }
+        return  companyList;
+    }
+
+    /**
+     * 计算观看率
+     */
+    private BigDecimal calculateWatchRate(Integer watchingCount, Integer finishedCount, Integer accessCount) {
+        if (accessCount == null || accessCount == 0) {
+            return BigDecimal.ZERO;
+        }
+        int totalWatching = (watchingCount != null ? watchingCount : 0) +
+                (finishedCount != null ? finishedCount : 0);
+        return BigDecimal.valueOf(totalWatching * 100.0 / accessCount)
+                .setScale(2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * 计算完成率
+     */
+    private BigDecimal calculateFinishRate(Integer finishedCount, Integer accessCount) {
+        if (accessCount == null || accessCount == 0 || finishedCount == null) {
+            return BigDecimal.ZERO;
+        }
+        return BigDecimal.valueOf(finishedCount * 100.0 / accessCount)
+                .setScale(2, RoundingMode.HALF_UP);
     }
 
+    private Map<Long, FsCourseReportVO> getWatchStatistics(FsCourseWatchLogStatisticsListParam query) {
+        List<FsCourseReportVO> watchStatistics = fsCourseWatchLogMapper.selectWatchStatistics(query);
+        Map<Long, FsCourseReportVO> watchStatisticsMap = watchStatistics.stream()
+                .collect(Collectors.toMap(
+                        stats -> stats.getCompanyId(),
+                        Function.identity(),
+                        (existing, replacement) -> existing // 当出现重复键时,保留第一个值
+                ));
+        return watchStatisticsMap;
+    }
+    private Map<Long, FsCourseReportVO> getAnswerStatistics(FsCourseWatchLogStatisticsListParam query) {
+        List<FsCourseReportVO> answerStatistics = fsCourseWatchLogMapper.selectAnswerStatistics(query);
+        Map<Long, FsCourseReportVO> answerMap = answerStatistics.stream()
+                .collect(Collectors.toMap(
+                        stats -> stats.getCompanyId(),
+                        Function.identity(),
+                        (existing, replacement) -> existing // 当出现重复键时,保留第一个值
+                ));
+        return answerMap;
+    }
+
+    private Map<Long, FsCourseReportVO> getRedPacketStatistics(FsCourseWatchLogStatisticsListParam query){
+        List<FsCourseReportVO> redPacketStatistics = fsCourseWatchLogMapper.selectRedPacketStatistics(query);
+        Map<Long, FsCourseReportVO> redPacketMap = redPacketStatistics.stream().collect(Collectors.toMap(
+                stats -> stats.getCompanyId(),
+                Function.identity(),
+                (existing, replacement) -> existing // 当出现重复键时,保留第一个值
+        ));
+        return redPacketMap;
+    }
+
+    private Map<Long, FsCourseReportVO> getCampPeriodInfo(List<Long> periodIds) {
+        List<FsCourseReportVO> campPeriodList = fsCourseWatchLogMapper.selectCampPeriodInfo(periodIds);
+        Map<Long, FsCourseReportVO> campPeriodMap = campPeriodList.stream()
+                .collect(Collectors.toMap(
+                        FsCourseReportVO::getPeriodId,
+                        Function.identity(),
+                        (existing, replacement) -> existing // 当出现重复键时,保留第一个值
+                ));
+        return  campPeriodMap;
+
+    }
+
+
     @Override
     public List<FsUserReportVO> selectFsUserReportVO(FsCourseWatchLogStatisticsListParam param) {
         if (StringUtils.isNotEmpty(param.getUserPhone())) {
@@ -1320,7 +1460,7 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                         Function.identity()
                 ));
 
-        Map<Long, FsUserReportVO> integralStatsMap = fsCourseWatchLogMapper.selectIntegralStatsByUserIds(userIds)
+        Map<Long, FsUserReportVO> integralStatsMap = fsCourseWatchLogMapper.selectIntegralStatsByUserIds(userIds,param)
                 .stream()
                 .collect(Collectors.toMap(FsUserReportVO::getUserId, Function.identity()));
 
@@ -1331,7 +1471,7 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                         Function.identity()
                 ));
 
-        Map<Long, FsUserReportVO> orderStatsMap = fsCourseWatchLogMapper.selectOrderStatsByUserIds(userIds)
+        Map<Long, FsUserReportVO> orderStatsMap = fsCourseWatchLogMapper.selectOrderStatsByUserIds(userIds,param)
                 .stream()
                 .collect(Collectors.toMap(FsUserReportVO::getUserId, Function.identity()));
         userList.forEach(user -> {
@@ -1347,7 +1487,6 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
             //积分统计
             FsUserReportVO fsUserReportVO = integralStatsMap.get(user.getUserId());
             if (fsUserReportVO != null) {
-                user.setIntegral(fsUserReportVO.getIntegral());
                 user.setConsumedIntegral(fsUserReportVO.getConsumedIntegral());
             }
             //红包统计
@@ -1401,37 +1540,64 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
      */
     private List<WatchLogReportVO> assembleStatisticsData(List<WatchLogReportVO> baseData, FsCourseWatchLogStatisticsListParam param) {
         // 准备查询条件
-        List<UserConditionDTO> userCondition = baseData.stream()
-                .map(user -> new UserConditionDTO(user.getUserId(), user.getCompanyUserId()))
-                .collect(Collectors.toList());
+        List<Long> periods = baseData.stream().map(WatchLogReportVO::getPeriodId).collect(Collectors.toList());
+        List<Long> logIds = baseData.stream().map(WatchLogReportVO::getLogId).collect(Collectors.toList());
+
         List<Long> userIds = baseData.stream().map(WatchLogReportVO::getUserId).collect(Collectors.toList());
 
+        List<Long> salesIds = baseData.stream().map(WatchLogReportVO::getCompanyUserId).collect(Collectors.toList());
+
         // 批量查询统计数据
-        Map<String, WatchLogReportVO> watchMap = convertWatchStatsToMap(
-                fsCourseWatchLogMapper.selectUserWatchDetails(userCondition, param)
-        );
+        //营期数据
+        Map<Long, WatchLogReportVO> perMap = convertCampPeriodToMap(fsCourseWatchLogMapper.selectCampPeriodByPeriod(periods));
+
         Map<Long, WatchLogReportVO> redPacketMap = convertRedPacketToMap(
-                fsCourseWatchLogMapper.selectRedPacketStats(userIds)
+                fsCourseWatchLogMapper.selectRedPacketStats(logIds)
+        );
+
+        Map<Long, WatchLogReportVO> memberMap = convertMemberToMap(
+                fsCourseWatchLogMapper.getSalesMemberStats(salesIds)
         );
+
+        Map<Long, WatchLogReportVO> salesDeptMap = convertMemberToMap(
+                fsCourseWatchLogMapper.getSalesDeptCompanyInfo(salesIds,param)
+        );
+
         Map<Long, WatchLogReportVO> orderMap = convertOrderToMap(
-                fsCourseWatchLogMapper.selectOrderStats(userIds)
+                fsCourseWatchLogMapper.selectOrderStats(userIds,param)
         );
         Map<Long, WatchLogReportVO> answerMap = convertAnswerToMap(
-                fsCourseWatchLogMapper.selectAnswerStats(userIds)
+                fsCourseWatchLogMapper.selectAnswerStats(logIds)
         );
 
+
         // 组装数据
         for (WatchLogReportVO item : baseData) {
-            String key = buildKey(item.getUserId(), item.getCompanyUserId());
-
-            // 看课数据
-            WatchLogReportVO watchStats = watchMap.get(key);
+            if(!"user".equals(param.getDimension())){
+                //完课率
+                item.setCompletionRate(calculateCompletionRate(item));
+                //用户销售信息
+                WatchLogReportVO member = memberMap.get(item.getCompanyUserId());
+                if (member != null) {
+                    item.setUserCount(member.getUserCount());
+                    item.setOnlineUserCount(member.getOnlineUserCount());
+                    item.setSalesName(member.getSalesName());
+                }
+                WatchLogReportVO salesVo = salesDeptMap.get(item.getCompanyUserId());
+                if (salesVo != null) {
+                    item.setSalesDept(salesVo.getSalesDept());
+                    item.setSalesCompany(salesVo.getSalesCompany());
+                    item.setSalesCount(salesVo.getSalesCount());
+                }
+            }
+            // 营期数据
+            WatchLogReportVO watchStats = perMap.get(item.getPeriodId());
             if (watchStats != null) {
-                setWatchData(item, watchStats, param.getDimension());
+                item.setPeriodName(watchStats.getPeriodName());
+                item.setTrainingCampName(watchStats.getTrainingCampName());
             }
-
             // 红包数据
-            WatchLogReportVO redPacketStats = redPacketMap.get(item.getUserId());
+            WatchLogReportVO redPacketStats = redPacketMap.get(item.getLogId());
             if (redPacketStats != null) {
                 item.setRedPacketAmount(redPacketStats.getRedPacketAmount());
             }
@@ -1443,12 +1609,18 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
             }
 
             // 答题数据
-            WatchLogReportVO answer = answerMap.get(item.getUserId());
+            WatchLogReportVO answer = answerMap.get(item.getLogId());
             if (answer != null) {
                 setAnswerData(item, answer, param.getDimension());
             }
         }
-
+        //看课统计部门/公司 过滤销售会员匹配不到的数据
+        if (!"user".equals(param.getDimension())) {
+         return   baseData.stream()
+                    .filter(item -> memberMap.containsKey(item.getCompanyUserId()) &&
+                            salesDeptMap.containsKey(item.getCompanyUserId()))
+                    .collect(Collectors.toList());
+        }
         return baseData;
     }
 
@@ -1485,20 +1657,24 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
     }
 
 
+
+
     /**
-     * 看课数据转Map
+     * 会员数据转Map
      */
-    public Map<String, WatchLogReportVO> convertWatchStatsToMap(List<WatchLogReportVO> list) {
+    public Map<Long, WatchLogReportVO> convertMemberToMap(List<WatchLogReportVO> list) {
         if (list == null || list.isEmpty()) {
             return new HashMap<>();
         }
         return list.stream()
                 .collect(Collectors.toMap(
-                        stats -> buildKey(stats.getUserId(), stats.getCompanyUserId()),
-                        Function.identity()
+                        stats -> stats.getCompanyUserId(),
+                        Function.identity(),
+                        (existing, replacement) -> existing
                 ));
     }
 
+
     /**
      * 红包数据转Map
      */
@@ -1514,6 +1690,22 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                 ));
     }
 
+    /**
+     * 营期数据转Map
+     */
+    public Map<Long, WatchLogReportVO> convertCampPeriodToMap(List<WatchLogReportVO> list) {
+        if (list == null || list.isEmpty()) {
+            return new HashMap<>();
+        }
+        return list.stream()
+                .collect(Collectors.toMap(
+                        WatchLogReportVO::getPeriodId,
+                        Function.identity(),
+                        (existing, replacement) -> existing // 当出现重复键时,保留第一个值
+                ));
+    }
+
+
     /**
      * 订单数据转Map
      */

+ 8 - 0
fs-service/src/main/java/com/fs/his/vo/FsCourseReportVO.java

@@ -7,6 +7,9 @@ import java.math.BigDecimal;
 @Data
 public class FsCourseReportVO {
 
+    /** 公司id */
+    private  Long companyId;
+
     /** 公司名称 */
 
     private String companyName;
@@ -67,4 +70,9 @@ public class FsCourseReportVO {
      * 红包金额
      */
     private  BigDecimal packetAmount;
+
+    /**
+     * 营期id
+     */
+    private  Long periodId;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/vo/FsUserReportVO.java

@@ -98,4 +98,6 @@ public class FsUserReportVO {
      *  销售id
      */
     private  long companyUserId;
+
+
 }

+ 19 - 0
fs-service/src/main/java/com/fs/his/vo/WatchLogReportVO.java

@@ -1,5 +1,6 @@
 package com.fs.his.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -88,11 +89,13 @@ public class WatchLogReportVO {
     /**
      * 看课时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private Date courseTime;
 
     /**
      * 观看完成时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private  Date  finishTime;
 
     /**
@@ -129,4 +132,20 @@ public class WatchLogReportVO {
      * 总观看人数
      */
     private  Long totalLogCount;
+
+    /**
+     * 营期id
+     */
+    private  Long periodId;
+
+    /**
+     * 视频id
+     */
+    private  Long videoId;
+
+    /**
+     * 观看记录id
+     */
+    private  Long logId;
+
 }

+ 394 - 498
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -992,410 +992,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         GROUP BY
             o.company_id,
             o.send_type
-    </select>
-    <select id="selectFsCourseReportVO" resultType="com.fs.his.vo.FsCourseReportVO">
-        SELECT
-        c.company_id AS companyId,
-        c.company_name AS companyName,
-
-        <!-- 看课统计数据 -->
-        COALESCE(watch.pending_count, 0) AS pendingCount,
-        COALESCE(watch.watching_count, 0) AS watchingCount,
-        COALESCE(watch.finished_count, 0) AS finishedCount,
-        COALESCE(watch.interrupted_count, 0) AS interruptedCount,
-        COALESCE(watch.today_access_count, 0) AS accessCount,
-
-        <!-- 计算比率(避免除零) -->
-        CASE
-        WHEN COALESCE(watch.today_access_count, 0) > 0
-        THEN ROUND(
-        (COALESCE(watch.watching_count, 0) + COALESCE(watch.finished_count, 0)) * 100.0 /
-        watch.today_access_count,
-        2
-        )
-        ELSE 0
-        END AS watchRate,
-
-        CASE
-        WHEN COALESCE(watch.today_access_count, 0) > 0
-        THEN ROUND(
-        COALESCE(watch.finished_count, 0) * 100.0 /
-        watch.today_access_count,
-        2
-        )
-        ELSE 0
-        END AS finishRate,
-
-        <!-- 答题人数 -->
-        COALESCE(answer.answer_user_count, 0) AS answerUserCount,
-
-        <!-- 红包统计 -->
-        COALESCE(packet.packet_user_count, 0) AS packetUserCount,
-        COALESCE(packet.packet_amount, 0) AS packetAmount
-
-        <!-- 动态判断是否查询营期信息 -->
-        <if test='dimension == "camp"'>
-            ,(SELECT training_camp_name FROM fs_user_course_training_camp
-            WHERE training_camp_id = (SELECT training_camp_id FROM fs_user_course_period WHERE period_id = watch.sample_period_id LIMIT 1)
-            ) AS trainingCampName
-        </if>
-        <if test='dimension == "camp"'>
-           , (SELECT period_name FROM fs_user_course_period WHERE period_id = watch.sample_period_id LIMIT 1) AS periodName
-        </if>
-
-        FROM company c
-
-        <!-- 看课统计(一次性预聚合) -->
-        LEFT JOIN (
-        SELECT
-        company_id,
-        period_id AS sample_period_id,
-        COUNT(DISTINCT CASE WHEN log_type = 3 THEN user_id END) AS pending_count,
-        COUNT(DISTINCT CASE WHEN log_type = 1 THEN user_id END) AS watching_count,
-        COUNT(DISTINCT CASE WHEN log_type = 2 THEN user_id END) AS finished_count,
-        COUNT(DISTINCT CASE WHEN log_type = 4 THEN user_id END) AS interrupted_count,
-        COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() THEN user_id END) AS today_access_count
-        FROM fs_course_watch_log
-        <where>
-            <if test="sTime != null and eTime != null">
-                AND create_time BETWEEN #{sTime} AND #{eTime}
-            </if>
-            <if test="trainingCampId != null">
-                AND period_id IN (SELECT period_id FROM fs_user_course_period WHERE training_camp_id = #{trainingCampId})
-            </if>
-            <if test="periodId !=null">
-                AND period_id =#{periodId}
-            </if>
-        </where>
-        GROUP BY company_id
-        ) AS watch ON c.company_id = watch.company_id
-
-        <!-- 答题统计(预聚合) -->
-        LEFT JOIN (
-        SELECT
-        w.company_id,
-        COUNT(DISTINCT a.user_id) AS answer_user_count
-        FROM fs_course_answer_logs a
-        INNER JOIN fs_course_watch_log w ON a.watch_log_id = w.log_id
-            <where>
-                <if test="sTime != null and eTime != null">
-                    AND w.create_time BETWEEN #{sTime} AND #{eTime}
-                </if>
-                <if test="trainingCampId != null">
-                    AND w.period_id IN (SELECT period_id FROM fs_user_course_period WHERE training_camp_id = #{trainingCampId})
-                </if>
-                <if test="periodId!=null">
-                    AND w.period_id = #{periodId}
-                </if>
-            </where>
-        GROUP BY w.company_id
-        ) AS answer ON c.company_id = answer.company_id
-
-        <!-- 红包统计(预聚合) -->
-        LEFT JOIN (
-        SELECT
-        company_id,
-        COUNT(DISTINCT user_id) AS packet_user_count,
-        COALESCE(SUM(amount), 0) AS packet_amount
-            FROM fs_course_red_packet_log
-        <where>
-            <if test="sTime != null and eTime != null">
-                AND create_time BETWEEN #{sTime} AND #{eTime}
-            </if>
-        </where>
-        GROUP BY company_id
-        ) AS packet ON c.company_id = packet.company_id
-
-        <!-- 只显示有数据的公司 -->
-        WHERE watch.company_id IS NOT NULL
-
-        <!-- 公司筛选条件 -->
-
-         <if test="companyId != null and companyId != ''">
-            AND c.company_id =#{companyId}
-        </if>
-
-        <!-- 训练营筛选条件 -->
-        <if test="trainingCampId != null">
-            AND EXISTS (
-            SELECT 1 FROM fs_course_watch_log w2
-            INNER JOIN fs_user_course_period p ON w2.period_id = p.period_id
-            WHERE w2.company_id = c.company_id
-            AND p.training_camp_id = #{trainingCampId}
-            )
-        </if>
-
-        <if test="periodId != null">
-            AND EXISTS (
-            SELECT 1 FROM fs_course_watch_log w2
-            WHERE w2.company_id = c.company_id
-            AND w2.period_id = #{periodId}
-            )
-        </if>
-
-        ORDER BY COALESCE(watch.today_access_count, 0) DESC
-
-    </select>
-    <select id="selectWatchLogReportVO" resultType="com.fs.his.vo.WatchLogReportVO">
-        <choose>
-            <when test="dimension == 'user'">
-                WITH user_orders AS (
-                SELECT
-                user_id,
-                COUNT(DISTINCT CASE WHEN status = 3 THEN order_id END) AS history_order_count
-                FROM fs_package_order
-                GROUP BY user_id
-                ),
-                user_watch_stats AS (
-                SELECT
-                user_id,
-                log_id,
-                video_id,
-                period_id,
-                log_type,
-                duration,
-                create_time,
-                finish_time
-                FROM fs_course_watch_log
-                WHERE send_type = 1
-                ),
-                user_red_packet AS (
-                SELECT
-                watch_log_id,
-                SUM(amount) AS total_amount
-                FROM fs_course_red_packet_log
-                GROUP BY watch_log_id
-                )
-
-                SELECT
-                u.user_id AS userId,
-                u.nick_name AS nickName,
-                cu.nick_name AS salesName,
-                c.company_name AS salesCompany,
-                dept.dept_name AS salesDept,
-                camp.training_camp_name trainingCampName,
-                cp.period_name periodName,
-                cv.title videoTitle,
-                CASE
-                WHEN watch_log.log_type = '1' THEN '看课中'
-                WHEN watch_log.log_type = '2' THEN '完课'
-                WHEN watch_log.log_type = '3' THEN '待看课'
-                WHEN watch_log.log_type = '4' THEN '看课中断'
-                ELSE '无'
-                END AS watchStatus,
-                watch_log.duration,
-                watch_log.create_time courseTime,
-                watch_log.finish_time finishTime,
-                CASE
-                WHEN answer.log_id IS NOT NULL THEN '已答题'
-                ELSE '未答题'
-                END AS answerStatus,
-                COALESCE(red_packet.total_amount, 0) AS redPacketAmount,
-                COALESCE(orders.history_order_count, 0) AS historyOrderCount
-                FROM fs_user u
-                LEFT JOIN user_orders orders ON u.user_id = orders.user_id
-                LEFT JOIN fs_user_company_user cuu ON u.user_id = cuu.user_id
-                LEFT JOIN company_user cu ON cuu.company_user_id = cu.user_id
-                LEFT JOIN company c ON cuu.company_id = c.company_id
-                LEFT JOIN company_dept dept ON cu.dept_id = dept.dept_id
-                LEFT JOIN user_watch_stats watch_log ON u.user_id = watch_log.user_id
-                LEFT JOIN fs_user_course_video cv ON cv.video_id = watch_log.video_id
-                LEFT JOIN fs_user_course_period cp ON watch_log.period_id = cp.period_id AND cp.del_flag = 0
-                LEFT JOIN fs_user_course_training_camp camp ON cp.training_camp_id = camp.training_camp_id
-                LEFT JOIN user_red_packet red_packet ON watch_log.log_id = red_packet.watch_log_id
-                LEFT JOIN fs_course_answer_logs answer ON watch_log.log_id = answer.log_id
-                WHERE u.user_id IS NOT NULL
-                <include refid="commonConditions"/>
-                ORDER BY u.register_date DESC, watch_log.create_time DESC
-            </when>
-
-            <when test="dimension == 'sales'">
-                WITH sales_user_stats AS (
-                SELECT
-                cuu.company_user_id,
-                COUNT(DISTINCT cuu.user_id) AS user_count,
-                COUNT(DISTINCT CASE WHEN u.status = '1' THEN u.user_id END) AS online_user_count
-                FROM fs_user_company_user cuu
-                LEFT JOIN fs_user u ON cuu.user_id = u.user_id
-                GROUP BY cuu.company_user_id
-                ),
-                user_watch_stats AS (
-                SELECT
-                user_id,
-                COUNT(DISTINCT CASE WHEN log_type = '2' THEN log_id END) AS finished_count,
-                COUNT(DISTINCT CASE WHEN log_type IN ('1', '3', '4') THEN log_id END) AS unfinished_count,
-                COUNT(DISTINCT log_id) AS total_log_count,
-                COUNT(DISTINCT user_id) AS watched_user_count
-                FROM fs_course_watch_log
-                WHERE send_type = 1
-                GROUP BY user_id
-                ),
-                user_red_packet AS (
-                SELECT
-                wl.user_id,
-                SUM(rp.amount) AS total_amount
-                FROM fs_course_watch_log wl
-                JOIN fs_course_red_packet_log rp ON wl.log_id = rp.watch_log_id
-                WHERE wl.send_type = 1
-                GROUP BY wl.user_id
-                ),
-                user_orders AS (
-                SELECT
-                user_id,
-                COUNT(DISTINCT CASE WHEN status = 3 THEN order_id END) AS history_order_count
-                FROM fs_package_order
-                GROUP BY user_id
-                ),
-                user_answer_stats AS (
-                SELECT
-                user_id,
-                COUNT(DISTINCT log_id) AS answered_count
-                FROM fs_course_answer_logs
-                GROUP BY user_id
-                )
-
-                SELECT
-                cu.nick_name as salesName,
-                sus.user_count AS userCount,
-                sus.online_user_count AS onlineUserCount,
-                cd.dept_name AS salesDept,
-                c.company_name AS salesCompany,
-                camp.training_camp_name trainingCampName,
-                cp.period_name periodName,
-                cv.title videoTitle,
-                COALESCE(SUM(uws.finished_count), 0) AS finishedCount,
-                COALESCE(SUM(uws.unfinished_count), 0) AS unfinishedCount,
-                CASE
-                WHEN COALESCE(SUM(uws.total_log_count), 0) = 0 THEN 0
-                ELSE ROUND(COALESCE(SUM(uws.finished_count), 0) * 100.0 / COALESCE(SUM(uws.total_log_count), 0), 2)
-                END AS completionRate,
-                MAX(watch_log.create_time) AS courseTime,
-                sus.user_count - COALESCE(SUM(uws.watched_user_count), 0) AS notWatchedCount,
-                COALESCE(SUM(uws.watched_user_count), 0) - COUNT(DISTINCT uas.user_id) AS notAnsweredCount,
-                COALESCE(SUM(urp.total_amount), 0) AS redPacketAmount,
-                COALESCE(SUM(uo.history_order_count), 0) AS historyOrderCount
-                FROM company_user cu
-                LEFT JOIN company c ON cu.company_id = c.company_id
-                LEFT JOIN company_dept cd ON cu.dept_id = cd.dept_id
-                LEFT JOIN sales_user_stats sus ON cu.user_id = sus.company_user_id
-                LEFT JOIN fs_user_company_user cuu ON cu.user_id = cuu.company_user_id
-                LEFT JOIN fs_user u ON cuu.user_id = u.user_id
-                LEFT JOIN user_watch_stats uws ON u.user_id = uws.user_id
-                LEFT JOIN fs_course_watch_log watch_log ON u.user_id = watch_log.user_id AND watch_log.send_type = 1
-                LEFT JOIN fs_user_course_video cv ON cv.video_id = watch_log.video_id
-                LEFT JOIN fs_user_course_period cp ON watch_log.period_id = cp.period_id AND cp.del_flag = 0
-                LEFT JOIN fs_user_course_training_camp camp ON cp.training_camp_id = camp.training_camp_id
-                LEFT JOIN user_red_packet urp ON u.user_id = urp.user_id
-                LEFT JOIN user_answer_stats uas ON u.user_id = uas.user_id
-                LEFT JOIN user_orders uo ON u.user_id = uo.user_id
-                WHERE cu.user_id IS NOT NULL
-                <include refid="commonConditions"/>
-                GROUP BY cu.user_id, cu.nick_name, cd.dept_name, c.company_name
-                ORDER BY userCount DESC, completionRate DESC
-            </when>
-
-            <when test="dimension == 'company'">
-                WITH company_sales_stats AS (
-                SELECT
-                c.company_id,
-                cd.dept_id,
-                COUNT(DISTINCT cu.user_id) AS sales_count
-                FROM company c
-                LEFT JOIN company_dept cd ON c.company_id = cd.company_id
-                LEFT JOIN company_user cu ON cd.dept_id = cu.dept_id
-                GROUP BY c.company_id, cd.dept_id
-                ),
-                company_user_stats AS (
-                SELECT
-                cuu.company_id,
-                COUNT(DISTINCT cuu.user_id) AS user_count,
-                COUNT(DISTINCT CASE WHEN u.status = '1' THEN u.user_id END) AS online_user_count
-                FROM fs_user_company_user cuu
-                LEFT JOIN fs_user u ON cuu.user_id = u.user_id
-                GROUP BY cuu.company_id
-                ),
-                user_watch_stats AS (
-                SELECT
-                user_id,
-                COUNT(DISTINCT CASE WHEN log_type = '2' THEN log_id END) AS finished_count,
-                COUNT(DISTINCT CASE WHEN log_type IN ('1', '3', '4') THEN log_id END) AS unfinished_count,
-                COUNT(DISTINCT log_id) AS total_log_count,
-                COUNT(DISTINCT user_id) AS watched_user_count
-                FROM fs_course_watch_log
-                WHERE send_type = 1
-                GROUP BY user_id
-                ),
-                user_red_packet AS (
-                SELECT
-                wl.user_id,
-                SUM(rp.amount) AS total_amount
-                FROM fs_course_watch_log wl
-                JOIN fs_course_red_packet_log rp ON wl.log_id = rp.watch_log_id
-                WHERE wl.send_type = 1
-                GROUP BY wl.user_id
-                ),
-                user_orders AS (
-                SELECT
-                user_id,
-                COUNT(DISTINCT CASE WHEN status = 3 THEN order_id END) AS history_order_count
-                FROM fs_package_order
-                GROUP BY user_id
-                ),
-                user_answer_stats AS (
-                SELECT
-                user_id,
-                COUNT(DISTINCT log_id) AS answered_count
-                FROM fs_course_answer_logs
-                GROUP BY user_id
-                )
-
-                SELECT
-                cd.dept_name AS salesDept,
-                css.sales_count AS salesCount,
-                cus.user_count AS userCount,
-                cus.online_user_count AS onlineUserCount,
-                c.company_name AS salesCompany,
-                camp.training_camp_name trainingCampName,
-                cp.period_name periodName,
-                cv.title videoTitle,
-                COALESCE(SUM(uws.finished_count), 0) AS finishedCount,
-                COALESCE(SUM(uws.unfinished_count), 0) AS unfinishedCount,
-                CASE
-                WHEN COALESCE(SUM(uws.total_log_count), 0) = 0 THEN 0
-                ELSE ROUND(COALESCE(SUM(uws.finished_count), 0) * 100.0 / COALESCE(SUM(uws.total_log_count), 0), 2)
-                END AS completionRate,
-                MAX(watch_log.create_time) AS courseTime,
-                cus.user_count - COALESCE(SUM(uws.watched_user_count), 0) AS notWatchedCount,
-                COALESCE(SUM(uws.watched_user_count), 0) - COUNT(DISTINCT uas.user_id) AS notAnsweredCount,
-                COALESCE(SUM(urp.total_amount), 0) AS redPacketAmount,
-                COALESCE(SUM(uo.history_order_count), 0) AS historyOrderCount
-                FROM company c
-                LEFT JOIN company_dept cd ON c.company_id = cd.company_id
-                LEFT JOIN company_sales_stats css ON c.company_id = css.company_id AND cd.dept_id = css.dept_id
-                LEFT JOIN company_user_stats cus ON c.company_id = cus.company_id
-                LEFT JOIN company_user cu ON cd.dept_id = cu.dept_id
-                LEFT JOIN fs_user_company_user cuu ON cu.user_id = cuu.company_user_id
-                LEFT JOIN fs_user u ON cuu.user_id = u.user_id
-                LEFT JOIN user_watch_stats uws ON u.user_id = uws.user_id
-                LEFT JOIN fs_course_watch_log watch_log ON u.user_id = watch_log.user_id AND watch_log.send_type = 1
-                LEFT JOIN fs_user_course_video cv ON cv.video_id = watch_log.video_id
-                LEFT JOIN fs_user_course_period cp ON watch_log.period_id = cp.period_id AND cp.del_flag = 0
-                LEFT JOIN fs_user_course_training_camp camp ON cp.training_camp_id = camp.training_camp_id
-                LEFT JOIN user_red_packet urp ON u.user_id = urp.user_id
-                LEFT JOIN user_answer_stats uas ON u.user_id = uas.user_id
-                LEFT JOIN user_orders uo ON u.user_id = uo.user_id
-                WHERE c.company_id IS NOT NULL
-                <include refid="commonConditions"/>
-                GROUP BY cd.dept_id, cd.dept_name, c.company_id, c.company_name
-                ORDER BY salesCount DESC, userCount DESC, completionRate DESC
-            </when>
-        </choose>
-
-
     </select>
     <select id="selectUserBaseInfo" resultType="com.fs.his.vo.FsUserReportVO">
         SELECT distinct u.user_id AS userId,
         u.nick_name AS nickName,
+        u.integral AS integral,
         CASE
         WHEN u.`status` = '1' THEN '正常'
         WHEN u.`status` = '2' THEN '禁止'
@@ -1498,9 +1099,8 @@ FROM
     <select id="selectIntegralStatsByUserIds" resultType="com.fs.his.vo.FsUserReportVO">
         SELECT
         user_id AS userId,
-        SUM(integral) AS Integral,
         ABS(SUM(CASE WHEN integral &lt; 0 THEN integral ELSE 0 END)) AS consumedIntegral
-        FROM fs_user_integral_logs
+        from fs_user_integral_logs
         WHERE user_id IN
         <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
             #{userId}
@@ -1533,84 +1133,186 @@ FROM
         <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
             #{userId}
         </foreach>
+        <if test="watchParam.sTime != null and watchParam.eTime != null">
+            AND create_time BETWEEN #{watchParam.sTime} AND #{watchParam.eTime}
+        </if>
         GROUP BY user_id
     </select>
     <select id="selectUserBaseData" resultType="com.fs.his.vo.WatchLogReportVO">
-        SELECT DISTINCT
-        u.user_id AS userId,
+        SELECT
+        log.user_id userId,
         u.nick_name AS nickName,
-        u.status AS userStatus,
-        u.register_date AS registerDate,
-        cuu.company_user_id AS companyUserId,
         cu.nick_name AS salesName,
         c.company_name AS salesCompany,
-        dept.dept_name AS salesDept
-        FROM fs_user u
-        LEFT JOIN fs_user_company_user cuu ON u.user_id = cuu.user_id
-        LEFT JOIN company_user cu ON cuu.company_user_id = cu.user_id
-        LEFT JOIN company c ON cuu.company_id = c.company_id
-        LEFT JOIN company_dept dept ON cu.dept_id = dept.dept_id
-        <if test="(trainingCampId != null and trainingCampId != '') or (periodId != null and periodId != '')">
-            LEFT JOIN fs_course_watch_log watch ON watch.user_id = u.user_id
-            LEFT JOIN fs_user_course_period cp ON watch.period_id = cp.period_id
-            AND cp.del_flag = 0
-            LEFT JOIN fs_user_course_training_camp camp ON cp.training_camp_id = camp.training_camp_id and camp.del_flag=0
+        cd.dept_name AS salesDept,
+        log.period_id periodId,
+        log.video_id videoId,
+        log.log_id logId,
+        log.create_time courseTime,
+        log.finish_time finishTime,
+        log.duration ,
+        CASE
+        WHEN log.log_type = '1' THEN '看课中'
+        WHEN log.log_type = '2' THEN '完课'
+        WHEN log.log_type = '3' THEN '待看课'
+        WHEN log.log_type = '4' THEN '看课中断'
+        ELSE '无'
+        END AS watchStatus,
+        cv.title AS videoTitle
+        FROM
+        fs_course_watch_log log
+        <if test="orderSTime != null and orderETime != null">
+            left join fs_package_order  po ON po.user_id = log.user_id
         </if>
-        WHERE u.user_id IS NOT NULL
+        LEFT JOIN fs_user u ON u.user_id = log.user_id
+        LEFT JOIN fs_user_company_user cuu ON cuu.user_id = u.user_id
+        LEFT JOIN company_user cu ON cuu.company_user_id = cu.user_id
+        LEFT JOIN company c ON log.company_id = c.company_id
+        LEFT JOIN company_dept cd ON cu.dept_id = cd.dept_id
+        LEFT JOIN fs_user_course_video cv ON log.video_id = cv.video_id
+        WHERE log.send_type =1
         <include refid="commonConditions"/>
+         <if test="orderSTime != null and orderETime != null">
+            AND po.create_time BETWEEN #{orderSTime} AND #{orderETime}
+        </if>
         ORDER BY u.register_date DESC
     </select>
     <select id="selectSalesBaseData" resultType="com.fs.his.vo.WatchLogReportVO">
-        SELECT DISTINCT
-        cu.user_id AS companyUserId,
-        cu.nick_name AS salesName,
-        u.user_id AS userId,
-        cd.dept_name AS salesDept,
-        c.company_name AS salesCompany,
-        COUNT(DISTINCT cuu.user_id) AS userCount,
-        COUNT(DISTINCT CASE WHEN u.status = '1' THEN u.user_id END) AS onlineUserCount
-        FROM company_user cu
-        LEFT JOIN company c ON cu.company_id = c.company_id
-        LEFT JOIN company_dept cd ON cu.dept_id = cd.dept_id
-        LEFT JOIN fs_user_company_user cuu ON cu.user_id = cuu.company_user_id
-        LEFT JOIN fs_user u ON cuu.user_id = u.user_id
-        <if test="(trainingCampId != null and trainingCampId != '') or (periodId != null and periodId != '')">
-            LEFT JOIN fs_course_watch_log watch ON watch.user_id = u.user_id
-            LEFT JOIN fs_user_course_period cp ON watch.period_id = cp.period_id
-            AND cp.del_flag = 0
-            LEFT JOIN fs_user_course_training_camp camp ON cp.training_camp_id = camp.training_camp_id and camp.del_flag=0
+        SELECT
+        log.user_id userId,
+        log.company_user_id companyUserId,
+        log.period_id periodId,
+        log.video_id videoId,
+        log.log_id logId,
+        log.create_time courseTime,
+        log.finish_time finishTime,
+        log.duration,
+        cv.title videoTitle,
+        COUNT(DISTINCT log.log_id) AS totalLogCount,
+        COUNT(DISTINCT CASE WHEN log.log_type = '2' THEN log.log_id END) AS finishedCount,
+        COUNT(DISTINCT CASE WHEN log.log_type IN ('1', '3', '4') THEN log.log_id END) AS unfinishedCount,
+        COUNT(DISTINCT log.log_id)-COUNT(DISTINCT log.user_id) AS notWatchedCount
+        FROM
+        fs_course_watch_log log
+        <if test="orderSTime != null and orderETime != null">
+            LEFT JOIN fs_package_order po ON po.user_id = log.user_id
         </if>
-        WHERE cu.user_id IS NOT NULL
-        <include refid="commonConditions"/>
-        GROUP BY cu.user_id, cu.nick_name, cd.dept_name, c.company_name
-        ORDER BY userCount DESC
+        LEFT JOIN fs_user_course_video cv ON log.video_id = cv.video_id
+        <if test="deptId != null and deptId != ''">
+            LEFT JOIN company c ON log.company_id = c.company_id
+            LEFT JOIN company_dept cd ON c.company_id = cd.company_id
+        </if>
+        <if test="nickName != null and nickName != '' or userPhone != null and userPhone != ''">
+            LEFT JOIN fs_user u ON log.user_id = u.user_id
+        </if>
+        WHERE log.send_type =1
+        <if test="sTime != null and eTime != null">
+            AND log.create_time BETWEEN #{sTime} AND #{eTime}
+        </if>
+        <if test="orderSTime != null and orderETime != null">
+            AND po.create_time BETWEEN #{orderSTime} AND #{orderETime}
+        </if>
+        <!-- 销售公司 -->
+        <if test="companyId != null and companyId != ''">
+            AND log.company_id = #{companyId}
+        </if>
+        <if test="deptId != null and deptId != ''">
+            AND cd.dept_id = #{deptId}
+        </if>
+        <!-- 训练营 -->
+        <if test="trainingCampId != null and trainingCampId != ''">
+            AND log.period_id IN (SELECT period_id FROM fs_user_course_period WHERE training_camp_id =
+            #{trainingCampId})
+        </if>
+        <!-- 营期 -->
+        <if test="periodId != null and periodId != ''">
+            AND log.period_id = #{periodId}
+        </if>
+        <!-- 会员id -->
+        <if test="userId != null and userId != ''">
+            AND log.user_id = #{userId}
+        </if>
+        <!-- 会员手机号 -->
+        <if test="userPhone != null and userPhone != ''">
+            AND u.phone LIKE CONCAT('%', #{userPhone}, '%')
+        </if>
+        <if test="project != null and project != ''">
+            AND log.project = #{project}
+        </if>
+        <!-- 会员昵称 -->
+        <if test="nickName != null and nickName != ''">
+            AND u.nick_name LIKE CONCAT('%', #{nickName}, '%')
+        </if>
+        GROUP BY log.company_user_id
+
     </select>
     <select id="selectCompanyBaseData" resultType="com.fs.his.vo.WatchLogReportVO">
-        SELECT DISTINCT
-        c.company_id AS companyId,
-        c.company_name AS salesCompany,
-        cd.dept_id AS deptId,
-        u.user_id AS userId,
-        cd.dept_name AS salesDept,
-        cu.user_id AS companyUserId,
-        COUNT(DISTINCT cu.user_id) AS salesCount,
-        COUNT(DISTINCT cuu.user_id) AS userCount,
-        COUNT(DISTINCT CASE WHEN u.status = '1' THEN cuu.user_id END) AS onlineUserCount
-        FROM company c
-        LEFT JOIN company_dept cd ON c.company_id = cd.company_id
-        LEFT JOIN company_user cu ON cd.dept_id = cu.dept_id
-        LEFT JOIN fs_user_company_user cuu ON cu.user_id = cuu.company_user_id
-        LEFT JOIN fs_user u ON cuu.user_id = u.user_id
-        <if test="(trainingCampId != null and trainingCampId != '') or (periodId != null and periodId != '')">
-            LEFT JOIN fs_course_watch_log watch ON watch.user_id = u.user_id
-            LEFT JOIN fs_user_course_period cp ON watch.period_id = cp.period_id
-            AND cp.del_flag = 0
-            LEFT JOIN fs_user_course_training_camp camp ON cp.training_camp_id = camp.training_camp_id and camp.del_flag=0
+        SELECT
+        log.user_id userId,
+        log.company_user_id companyUserId,
+        log.period_id periodId,
+        log.video_id videoId,
+        log.log_id logId,
+        log.create_time courseTime,
+        log.finish_time finishTime,
+        log.duration,
+        cv.title videoTitle,
+        COUNT(DISTINCT log.log_id) AS totalLogCount,
+        COUNT(DISTINCT CASE WHEN log.log_type = '2' THEN log.log_id END) AS finishedCount,
+        COUNT(DISTINCT CASE WHEN log.log_type IN ('1', '3', '4') THEN log.log_id END) AS unfinishedCount,
+        COUNT(DISTINCT log.log_id)-COUNT(DISTINCT log.user_id) AS notWatchedCount
+        FROM
+        fs_course_watch_log log
+        <if test="orderSTime != null and orderETime != null">
+            LEFT JOIN fs_package_order po ON po.user_id = log.user_id
         </if>
-        WHERE c.company_id IS NOT NULL
-        <include refid="commonConditions"/>
-        GROUP BY c.company_id, c.company_name, cd.dept_id, cd.dept_name
-        ORDER BY salesCount DESC, userCount DESC
+        LEFT JOIN fs_user_course_video cv ON log.video_id = cv.video_id
+        <if test="deptId != null and deptId != ''">
+            LEFT JOIN company c ON log.company_id = c.company_id
+            LEFT JOIN company_dept cd ON c.company_id = cd.company_id
+        </if>
+        <if test="nickName != null and nickName != '' or userPhone != null and userPhone != ''">
+            LEFT JOIN fs_user u ON log.user_id = u.user_id
+        </if>
+        WHERE log.send_type =1
+        <if test="sTime != null and eTime != null">
+            AND log.create_time BETWEEN #{sTime} AND #{eTime}
+        </if>
+        <if test="orderSTime != null and orderETime != null">
+            AND po.create_time BETWEEN #{orderSTime} AND #{orderETime}
+        </if>
+        <!-- 销售公司 -->
+        <if test="companyId != null and companyId != ''">
+            AND log.company_id = #{companyId}
+        </if>
+          <!--部门 -->
+        <if test="deptId != null and deptId != ''">
+            AND cd.dept_id = #{deptId}
+        </if>
+        <!-- 训练营 -->
+        <if test="trainingCampId != null and trainingCampId != ''">
+            AND log.period_id IN (SELECT period_id FROM fs_user_course_period WHERE training_camp_id = #{trainingCampId})
+        </if>
+        <!-- 营期 -->
+        <if test="periodId != null and periodId != ''">
+            AND log.period_id = #{periodId}
+        </if>
+        <!-- 会员id -->
+        <if test="userId != null and userId != ''">
+            AND log.user_id = #{userId}
+        </if>
+        <!-- 会员手机号 -->
+        <if test="userPhone != null and userPhone != ''">
+            AND u.phone LIKE CONCAT('%', #{userPhone}, '%')
+        </if>
+        <if test="project != null and project != ''">
+            AND log.project = #{project}
+        </if>
+        <!-- 会员昵称 -->
+        <if test="nickName != null and nickName != ''">
+            AND u.nick_name LIKE CONCAT('%', #{nickName}, '%')
+        </if>
+        GROUP BY log.company_user_id
     </select>
     <select id="selectUserWatchDetails" resultType="com.fs.his.vo.WatchLogReportVO">
         SELECT
@@ -1642,7 +1344,7 @@ FROM
         FROM fs_course_watch_log wl
         LEFT JOIN fs_user_course_video cv ON wl.video_id = cv.video_id
         LEFT JOIN fs_user_course_period cp ON wl.period_id = cp.period_id AND cp.del_flag = 0
-        LEFT JOIN fs_user_course_training_camp camp ON cp.training_camp_id = camp.training_camp_id
+        LEFT JOIN fs_user_course_training_camp camp ON cp.training_camp_id = camp.training_camp_id and camp.del_flag=0
         WHERE wl.send_type = 1
         and (wl.user_id, wl.company_user_id) IN
         <foreach collection="userConditions" item="condition" open="(" close=")" separator=",">
@@ -1657,19 +1359,27 @@ FROM
         <if test="watchParam.sTime != null and watchParam.eTime != null">
             AND wl.create_time BETWEEN #{watchParam.sTime} AND #{watchParam.eTime}
         </if>
+        GROUP BY
+        wl.user_id,
+        wl.company_user_id,
+        camp.training_camp_name,
+        cp.period_name,
+        cv.title,
+        wl.log_type,
+        wl.duration,
+        wl.create_time,
+        wl.finish_time
     </select>
     <select id="selectRedPacketStats" resultType="com.fs.his.vo.WatchLogReportVO">
         SELECT
-        wl.user_id AS userId,
-        SUM(rp.amount) AS totalAmount
-        FROM fs_course_watch_log wl
-        JOIN fs_course_red_packet_log rp ON wl.log_id = rp.watch_log_id
-        WHERE wl.send_type = 1
-        AND wl.user_id IN
-        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
-            #{userId}
+        rp.watch_log_id  as  logId,
+        SUM(rp.amount) AS redPacketAmount
+        FROM fs_course_red_packet_log rp
+        WHERE  rp.watch_log_id IN
+        <foreach collection="logIds" item="logId" open="(" separator="," close=")">
+            #{logId}
         </foreach>
-        GROUP BY wl.user_id
+        GROUP BY rp.watch_log_id
     </select>
     <select id="selectOrderStats" resultType="com.fs.his.vo.WatchLogReportVO">
         SELECT
@@ -1680,27 +1390,216 @@ FROM
         <foreach collection="userIds" item="userId" open="(" separator="," close=")">
             #{userId}
         </foreach>
+        <!--下单时间-->
+        <if test="watchParam.orderSTime != null and watchParam.orderETime != null">
+            AND create_time BETWEEN #{watchParam.orderSTime} AND #{watchParam.orderETime}
+        </if>
         GROUP BY user_id
     </select>
     <select id="selectAnswerStats" resultType="com.fs.his.vo.WatchLogReportVO">
         SELECT
-        u.user_id AS userId,
+        l.watch_log_id AS logId,
         CASE WHEN l.log_id IS NOT NULL THEN '已答题' ELSE '未答题' END AS answerStatus,
-        (SELECT COUNT(1)
-        FROM fs_user
-        WHERE user_id IN
-        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
-            #{userId}
+        (
+        SELECT COUNT(1)
+        FROM fs_course_watch_log wl
+        WHERE wl.log_id IN
+        <foreach collection="logIds" item="logId" open="(" separator="," close=")">
+            #{logId}
+        </foreach>
+        AND wl.log_id NOT IN (
+        SELECT watch_log_id
+        FROM fs_course_answer_logs
+        WHERE watch_log_id IS NOT NULL
+        )) AS notAnsweredCount
+        FROM fs_course_answer_logs l
+        WHERE l.watch_log_id IN
+        <foreach collection="logIds" item="logId" open="(" separator="," close=")">
+            #{logId}
+        </foreach>
+        GROUP BY l.watch_log_id
+    </select>
+    <select id="selectCompanyBaseInfo" resultType="com.fs.his.vo.FsCourseReportVO">
+        SELECT
+        c.company_id AS companyId,
+        c.company_name AS companyName
+        FROM company c
+       <where>
+           <if test="companyId != null and companyId != ''">
+               AND company_id = #{companyId}
+           </if>
+           <if test="trainingCampId != null">
+               AND EXISTS (
+               SELECT 1 FROM fs_course_watch_log w
+               INNER JOIN fs_user_course_period p ON w.period_id = p.period_id
+               WHERE w.company_id = c.company_id
+               AND p.training_camp_id = #{trainingCampId}
+               <if test="sTime != null and eTime != null">
+                   AND w.create_time BETWEEN #{sTime} AND #{eTime}
+               </if>
+               )
+           </if>
+           <if test="periodId != null">
+               AND EXISTS (
+               SELECT 1 FROM fs_course_watch_log w
+               WHERE w.company_id = c.company_id
+               AND w.period_id = #{periodId}
+               <if test="sTime != null and eTime != null">
+                   AND w.create_time BETWEEN #{sTime} AND #{eTime}
+               </if>
+               )
+           </if>
+           <if test="(trainingCampId == null and periodId == null) and (sTime != null and eTime != null)">
+               AND EXISTS (
+               SELECT 1 FROM fs_course_watch_log w
+               WHERE w.company_id = c.company_id
+               AND w.create_time BETWEEN #{sTime} AND #{eTime}
+               )
+           </if>
+       </where>
+    </select>
+    <select id="selectWatchStatistics" resultType="com.fs.his.vo.FsCourseReportVO">
+        SELECT
+        company_id AS companyId,
+        period_id AS periodId,
+        COUNT(DISTINCT CASE WHEN log_type = 3 THEN user_id END) AS pendingCount,
+        COUNT(DISTINCT CASE WHEN log_type = 1 THEN user_id END) AS watchingCount,
+        COUNT(DISTINCT CASE WHEN log_type = 2 THEN user_id END) AS finishedCount,
+        COUNT(DISTINCT CASE WHEN log_type = 4 THEN user_id END) AS interruptedCount,
+        COUNT(DISTINCT CASE WHEN DATE(create_time) = CURDATE() THEN user_id END) AS accessCount
+        FROM fs_course_watch_log
+        <where>
+            <if test="sTime != null and eTime != null">
+                AND create_time BETWEEN #{sTime} AND #{eTime}
+            </if>
+            <if test="trainingCampId != null">
+                AND period_id IN (SELECT period_id FROM fs_user_course_period WHERE training_camp_id = #{trainingCampId})
+            </if>
+            <if test="periodId != null">
+                AND period_id = #{periodId}
+            </if>
+            <if test="companyIds != null and companyIds.size() > 0">
+                AND company_id IN
+                <foreach collection="companyIds" item="companyId" open="(" separator="," close=")">
+                    #{companyId}
+                </foreach>
+            </if>
+        </where>
+        GROUP BY company_id
+
+    </select>
+    <select id="selectAnswerStatistics" resultType="com.fs.his.vo.FsCourseReportVO">
+        SELECT
+        w.company_id AS companyId,
+        COUNT(DISTINCT a.user_id) AS answerUserCount
+        FROM fs_course_answer_logs a
+        INNER JOIN fs_course_watch_log w ON a.watch_log_id = w.log_id
+        <where>
+            <if test="sTime != null and eTime != null">
+                AND w.create_time BETWEEN #{sTime} AND #{eTime}
+            </if>
+            <if test="trainingCampId != null">
+                AND w.period_id IN (SELECT period_id FROM fs_user_course_period WHERE training_camp_id = #{trainingCampId})
+            </if>
+            <if test="periodId != null">
+                AND w.period_id = #{periodId}
+            </if>
+            <if test="companyIds != null and companyIds.size() > 0">
+                AND w.company_id IN
+                <foreach collection="companyIds" item="companyId" open="(" separator="," close=")">
+                    #{companyId}
+                </foreach>
+            </if>
+        </where>
+        GROUP BY w.company_id
+    </select>
+    <select id="selectRedPacketStatistics" resultType="com.fs.his.vo.FsCourseReportVO">
+        SELECT
+        w.company_id AS companyId,
+        COUNT(DISTINCT rpl.user_id) AS packetUserCount,
+        COALESCE(SUM(rpl.amount), 0) AS packetAmount
+        FROM fs_course_red_packet_log rpl
+        INNER JOIN fs_course_watch_log w ON rpl.watch_log_id = w.log_id
+        <where>
+            <if test="sTime != null and eTime != null">
+                AND w.create_time BETWEEN #{sTime} AND #{eTime}
+            </if>
+            <if test="companyIds != null and companyIds.size() > 0">
+                AND w.company_id IN
+                <foreach collection="companyIds" item="companyId" open="(" separator="," close=")">
+                    #{companyId}
+                </foreach>
+            </if>
+        </where>
+        GROUP BY w.company_id
+    </select>
+    <select id="selectCampPeriodInfo" resultType="com.fs.his.vo.FsCourseReportVO">
+        SELECT
+        p.period_id AS periodId,
+        p.period_name AS periodName,
+        c.training_camp_name AS trainingCampName
+        FROM fs_user_course_period p
+        LEFT JOIN fs_user_course_training_camp c ON p.training_camp_id = c.training_camp_id
+        WHERE p.period_id IN
+        <foreach collection="periodIds" item="periodId" open="(" separator="," close=")">
+            #{periodId}
+        </foreach>
+    </select>
+    <select id="selectCampPeriodByPeriod" resultType="com.fs.his.vo.WatchLogReportVO">
+        SELECT
+        cp.period_id periodId,
+        cp.period_name periodName,
+        camp.training_camp_name
+        FROM
+        fs_user_course_period cp
+        LEFT JOIN fs_user_course_training_camp camp ON camp.training_camp_id = cp.training_camp_id
+        WHERE cp.period_id in
+        <foreach collection="periodIds" item="periodId" open="(" separator="," close=")">
+            #{periodId}
         </foreach>
-        AND user_id NOT IN (SELECT user_id FROM fs_course_answer_logs)
-        ) AS notAnsweredCount
+    </select>
+    <select id="getSalesMemberStats" resultType="com.fs.his.vo.WatchLogReportVO">
+        SELECT
+        cu.user_id  companyUserId,
+        cu.nick_name salesName,
+        COUNT(DISTINCT u.user_id) AS userCount,
+        COUNT(DISTINCT CASE WHEN u.status = 1 THEN u.user_id END) AS onlineUserCount
         FROM fs_user u
-        LEFT JOIN fs_course_answer_logs l ON u.user_id = l.user_id
-        WHERE u.user_id IN
-        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
-            #{userId}
+        LEFT JOIN fs_user_company_user cuu ON u.user_id = cuu.user_id
+        LEFT JOIN company_user cu ON cuu.company_user_id = cu.user_id
+        <where>
+            (u.status = 1 OR cu.status = 1)
+            <if test="salesIds != null and salesIds.size() > 0">
+                AND cu.user_id IN
+                <foreach collection="salesIds" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+        GROUP BY cu.user_id
+    </select>
+    <select id="getSalesDeptCompanyInfo" resultType="com.fs.his.vo.WatchLogReportVO">
+        SELECT
+        cu.user_id AS companyUserId,
+        d.dept_name AS salesDept,
+        c.company_name AS salesCompany,
+        (SELECT COUNT(*)
+        FROM company_user cu2
+        WHERE cu2.dept_id = cu.dept_id
+        AND cu2.del_flag = '0'
+        AND cu2.status = '0') AS salesCount
+        FROM company_user cu
+        LEFT JOIN company_dept d ON cu.dept_id = d.dept_id
+        LEFT JOIN company c ON d.company_id = c.company_id
+        WHERE cu.user_id IN
+        <foreach collection="salesIds" item="salesId" open="(" separator="," close=")">
+            #{salesId}
         </foreach>
-        GROUP BY u.user_id, l.log_id;
+        <!--部门-->
+        <if test="watchParam.deptId != null and watchParam.deptId != ''">
+            AND d.dept_id = #{watchParam.deptId}
+        </if>
+        AND cu.del_flag = '0'
     </select>
     <sql id="commonConditions">
         <!-- 销售公司 -->
@@ -1720,22 +1619,19 @@ FROM
 
         <!-- 项目 -->
         <if test="project != null and project != ''">
-            AND cuu.project_id = #{projectId}
+            AND cuu.project_id = #{project}
+        </if>
+        <!-- 时间范围 -->
+        <if test="sTime != null and eTime != null">
+            AND log.create_time BETWEEN #{sTime} AND #{eTime}
         </if>
-
         <!-- 训练营 -->
         <if test="trainingCampId != null and trainingCampId != ''">
-            AND camp.training_camp_id = #{trainingCampId}
+            AND log.period_id IN (SELECT period_id FROM fs_user_course_period WHERE training_camp_id = #{trainingCampId})
         </if>
-
         <!-- 营期 -->
         <if test="periodId != null and periodId != ''">
-            AND cp.period_id = #{periodId}
-        </if>
-
-        <!-- 时间范围 -->
-        <if test="sTime != null and eTime != null">
-            AND watch.create_time BETWEEN #{startTime} AND #{endTime}
+            AND log.period_id = #{periodId}
         </if>
 
         <!-- 会员ID -->

+ 53 - 33
fs-service/src/main/resources/mapper/his/FsPackageOrderMapper.xml

@@ -324,29 +324,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         WITH order_stats AS (
         SELECT
         po.company_id,
+        po.start_time,
+        po.finish_time,
         COUNT(po.order_id) AS order_count,
         COALESCE(SUM(po.pay_money), 0) AS total_money,
         COUNT(CASE WHEN so.status = 3 THEN po.order_id END) AS receipt_order_count,
         COALESCE(SUM(CASE WHEN so.status = 3 THEN po.pay_money ELSE 0 END), 0) AS receipt_money
         FROM fs_package_order po
         INNER JOIN fs_store_order so ON po.order_id = so.order_id
-        <where>
-            <if test="stTime != null">
-                AND po.start_time &gt;= #{stTime}
-            </if>
-            <if test="endEndTime != null">
-                AND po.finish_time &lt;= #{endEndTime}
-            </if>
-            <!-- 训练营条件 -->
-            <if test="trainingCampId != null">
-                AND EXISTS (
-                SELECT 1 FROM fs_user_company_user ucu
-                JOIN fs_user_course_training_camp camp ON ucu.company_user_id = camp.user_id
-                WHERE ucu.company_id = po.company_id
-                AND camp.training_camp_id = #{trainingCampId}
-                )
-            </if>
-        </where>
         GROUP BY po.company_id
         )
         <choose>
@@ -362,13 +347,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 COALESCE(os.receipt_money, 0) AS receiptMoney
                 FROM company c
                 LEFT JOIN order_stats os ON c.company_id = os.company_id
-                WHERE COALESCE(os.order_count, 0) > 0
-                <if test="companyId != null and companyId != ''">
-                    AND c.company_id = #{companyId}
-                </if>
-                <if test="deptId != null and deptId != ''">
-                    AND c.dept_id = #{deptId}
-                </if>
+                <where>
+                    <if test="companyId != null and companyId != ''">
+                        AND c.company_id = #{companyId}
+                    </if>
+                    <if test="deptId != null and deptId != ''">
+                        AND c.dept_id = #{deptId}
+                    </if>
+                    <if test="stTime != null">
+                        AND os.start_time &gt;= #{stTime}
+                    </if>
+                    <if test="endEndTime != null">
+                        AND os.finish_time &lt;= #{endEndTime}
+                    </if>
+                </where>
             </when>
 
             <!-- 部门维度 -->
@@ -385,13 +377,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 FROM company_dept cd
                 LEFT JOIN company c ON cd.company_id = c.company_id
                 LEFT JOIN order_stats os ON c.company_id = os.company_id
-                WHERE COALESCE(os.order_count, 0) > 0
-                <if test="companyId != null and companyId != ''">
-                    AND c.company_id = #{companyId}
-                </if>
-                <if test="deptId != null and deptId != ''">
-                    AND cd.dept_id = #{deptId}
-                </if>
+                <where>
+                    <if test="companyId != null and companyId != ''">
+                        AND c.company_id = #{companyId}
+                    </if>
+                    <if test="deptId != null and deptId != ''">
+                        AND cd.dept_id = #{deptId}
+                    </if>
+                    <if test="stTime != null">
+                        AND os.start_time &gt;= #{stTime}
+                    </if>
+                    <if test="endEndTime != null">
+                        AND os.finish_time &lt;= #{endEndTime}
+                    </if>
+                </where>
             </when>
         </choose>
         ORDER BY orderNum DESC, money DESC
@@ -463,8 +462,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="companyId != null and companyId != ''">
             AND c.company_id = #{companyId}
         </if>
+        <if test="stTime != null and endEndTime != null">
+            AND c.company_id IN (
+            SELECT DISTINCT company_id FROM fs_inquiry_order WHERE create_time BETWEEN #{stTime} AND #{endEndTime}
+            UNION
+            SELECT DISTINCT company_id FROM fs_integral_order WHERE create_time BETWEEN #{stTime} AND #{endEndTime}
+            UNION
+            SELECT DISTINCT company_id FROM fs_package_order WHERE create_time BETWEEN #{stTime} AND #{endEndTime}
+            )
+        </if>
         GROUP BY c.company_id, c.company_name
-        HAVING inquiryOrderCount > 0 OR integralOrderCount > 0 OR packageOrderCount > 0
         ORDER BY inquiryOrderCount DESC, integralOrderCount DESC, packageOrderCount DESC
     </select>
     <select id="selectFsOrderReportVODept" resultType="com.fs.his.vo.FsOrderReportVO">
@@ -553,8 +560,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="companyId != null">
             AND d.company_id = #{companyId}
         </if>
+        <if test="stTime != null and endEndTime != null">
+            AND d.dept_id IN (
+            SELECT DISTINCT d2.dept_id
+            FROM company_dept d2
+            JOIN company c2 ON d2.company_id = c2.company_id
+            WHERE c2.company_id IN (
+            SELECT DISTINCT company_id FROM fs_inquiry_order WHERE create_time BETWEEN #{stTime} AND #{endEndTime}
+            UNION
+            SELECT DISTINCT company_id FROM fs_integral_order WHERE create_time BETWEEN #{stTime} AND #{endEndTime}
+            UNION
+            SELECT DISTINCT company_id FROM fs_package_order WHERE create_time BETWEEN #{stTime} AND #{endEndTime}
+            )
+            )
+        </if>
         GROUP BY d.dept_id, d.dept_name
-        HAVING inquiryOrderCount > 0 OR integralOrderCount > 0 OR packageOrderCount > 0
         ORDER BY inquiryOrderCount DESC, integralOrderCount DESC, packageOrderCount DESC
     </select>
 </mapper>