Explorar el Código

看客统计定时任务- 看客人数-完课人数

xgb hace 1 semana
padre
commit
43c15a5839

+ 31 - 0
fs-admin/src/main/java/com/fs/course/task/WatchCourseStatistics.java

@@ -0,0 +1,31 @@
+package com.fs.course.task;
+
+import com.fs.statis.service.IStatisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 看客相关统计定时任务
+ * @author: Xgb
+ * @createDate: 2025/10/27
+ * @version: 1.0
+ */
+@Component("watchCourseStatistics")
+public class WatchCourseStatistics {
+
+    @Autowired
+    private IStatisticsService statisticsService;
+
+    /**
+     * @Description: 统计统计按TimeType 0-今天,1-昨天,2-本周,3-本月,4-上月;各公司的观看人数和完播人数,
+     * 各公司的观看人数和完播人数, 存到redis中,定时任务每15分钟执行一次
+     *
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/27 11:47
+     */
+    public void watchCourseStatisticsGroupByCompany() {
+        statisticsService.watchCourseStatisticsGroupByCompany();
+    }
+}

+ 2 - 0
fs-common/src/main/java/com/fs/common/constant/FsConstants.java

@@ -16,4 +16,6 @@ public interface FsConstants {
     String COMPANY_MONEY_KEY = "company:money:";
     // 公司余额redis 锁
     String COMPANY_MONEY_LOCK = "company_money_lock:";
+    // 看客统计  按公司分组 按TimeType 0-今天,1-昨天,2-本周,3-本月,4-上月;
+    String WATCH_COURSE_STATISTICS_GROUP_COMPANY = "watch_course_statistics:group_company:";
 }

+ 59 - 0
fs-common/src/main/java/com/fs/common/utils/DateUtils.java

@@ -6,8 +6,12 @@ import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.Map;
+
+import com.fs.common.utils.model.DateTimeEntity;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 /**
@@ -296,4 +300,59 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return calendar.getTimeInMillis();
     }
 
+
+    /**
+     * @Description: 根据类型返回开始时间和结束时间 最大时间是今天23:59:59 如本月 是1号00:00:00到今天的23:59:59
+     * @Param:  type: 0-今天 1-昨天 2-本周 3-本月 4-上月
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/27 14:09
+     */
+    public static DateTimeEntity getBetweenTime(int type){
+        // 根据type计算出时间范围
+        String startDate = "";
+        String endDate = "";
+
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalTime startOfDayTime = LocalTime.MIN;
+        LocalTime endOfDayTime = LocalTime.of(23, 59, 59);
+        if(0 == type){
+            LocalDateTime startOfDay = now.with(startOfDayTime);
+            LocalDateTime endOfDay = now.with(endOfDayTime);
+            startDate = startOfDay.format(formatter);
+            endDate = endOfDay.format(formatter);
+        } else if(1 == type){
+            LocalDateTime yesterday = now.minusDays(1);
+            LocalDateTime startOfYesterday = yesterday.with(startOfDayTime);
+            LocalDateTime endOfYesterday = yesterday.with(endOfDayTime);
+            startDate = startOfYesterday.format(formatter);
+            endDate = endOfYesterday.format(formatter);
+        } else if(2 == type) {
+            LocalDateTime startOfWeek = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+            LocalDateTime startOfStartOfWeek = startOfWeek.with(startOfDayTime);
+            LocalDateTime endOfToday = now.with(endOfDayTime);
+            startDate = startOfStartOfWeek.format(formatter);
+            endDate = endOfToday.format(formatter);
+        } else if(3 == type) {
+            LocalDateTime startOfMonth = now.withDayOfMonth(1);
+            LocalDateTime startOfStartOfMonth = startOfMonth.with(startOfDayTime);
+            LocalDateTime endOfToday = now.with(endOfDayTime);
+            startDate = startOfStartOfMonth.format(formatter);
+            endDate = endOfToday.format(formatter);
+        } else if(4 == type) {
+            LocalDateTime firstDayOfPreviousMonth = now.minusMonths(1).withDayOfMonth(1);
+            LocalDateTime lastDayOfPreviousMonth = now.withDayOfMonth(1).minusDays(1);
+
+            LocalDateTime startOfPrevMonthStart = firstDayOfPreviousMonth.with(startOfDayTime);
+            LocalDateTime endOfPrevMonthEnd = lastDayOfPreviousMonth.with(endOfDayTime);
+
+            startDate = startOfPrevMonthStart.format(formatter);
+            endDate = endOfPrevMonthEnd.format(formatter);
+        }
+
+        return new DateTimeEntity(startDate, endDate);
+    }
+
 }

+ 26 - 0
fs-common/src/main/java/com/fs/common/utils/model/DateTimeEntity.java

@@ -0,0 +1,26 @@
+package com.fs.common.utils.model;
+
+import lombok.Data;
+
+/**
+ * @description: 时间对象
+ * @author: Xgb
+ * @createDate: 2025/10/27
+ * @version: 1.0
+ */
+
+@Data
+public class DateTimeEntity {
+
+    private String startTime;
+
+    private String endTime;
+
+    public DateTimeEntity(String startTime, String endTime) {
+        this.startTime = startTime;
+        this.endTime = endTime;
+    }
+
+    public DateTimeEntity() {
+    }
+}

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

@@ -5,10 +5,10 @@ import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.dto.WatchLogDTO;
 import com.fs.course.param.*;
 import com.fs.course.vo.*;
-import com.fs.im.dto.OpenImBatchResponseDataDTO;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.param.QwSidebarStatsParam;
 import com.fs.sop.vo.QwRatingVO;
+import com.fs.statis.dto.WatchCourseStatisticsResultDTO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -539,4 +539,7 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      * 看课统计
      * */
     List<FsCourseWatchLogStatisticsListVO> selectQwFsCourseWatchLogStatisticsListVO(QwSidebarStatsParam param);
+
+    // 统计当天各公司的观看人数和完播人数, 存到redis中,定时任务每 ? 分钟执行一次
+    List<WatchCourseStatisticsResultDTO> watchCourseStatisticsGroupByCompany(@Param("params") Map<String, Object> params);
 }

+ 29 - 0
fs-service/src/main/java/com/fs/statis/dto/WatchCourseStatisticsResultDTO.java

@@ -0,0 +1,29 @@
+package com.fs.statis.dto;
+
+import lombok.Data;
+
+/**
+ * @description: 看客统计实体类 没有统计观看完成人数
+ * @author: Xgb
+ * @createDate: 2025/10/27
+ * @version: 1.0
+ */
+@Data
+public class WatchCourseStatisticsResultDTO {
+
+    // 公司id
+    private String companyId;
+    // 公司名称
+    private String companyName;
+    // 1.个微 手动 2.企微 自动
+    private String sendType;
+    // 观看用户数
+    private Integer watchUserCount;
+    // 观看次数
+    private Integer watchCount;
+    // 观看完成数
+    private Integer finishCount;
+    // 观看完成用户数
+    private Integer finishUserCount;
+
+}

+ 5 - 0
fs-service/src/main/java/com/fs/statis/service/IStatisticsService.java

@@ -115,4 +115,9 @@ public interface IStatisticsService {
      * 查询看课统计
      */
     WatchCourseStatisticsDTO queryWatchCourse(WatchCourseStatisticsParam param);
+
+    /**
+     * 统计今日看课
+     */
+    void watchCourseStatisticsGroupByCompany();
 }

+ 32 - 0
fs-service/src/main/java/com/fs/statis/service/impl/StatisticsServiceImpl.java

@@ -1,10 +1,14 @@
 package com.fs.statis.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.TimeUtils;
+import com.fs.common.utils.model.DateTimeEntity;
 import com.fs.company.cache.ICompanyCacheService;
+import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.dto.WatchLogDTO;
 import com.fs.course.mapper.FsCourseTrafficLogMapper;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
@@ -24,6 +28,7 @@ import com.fs.statis.service.utils.TrendDataFiller;
 import com.fs.store.service.cache.IFsUserCourseCacheService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.service.ISysConfigService;
+import com.hc.openapi.tool.fastjson.JSON;
 import com.hc.openapi.tool.util.ObjectUtils;
 import com.hc.openapi.tool.util.StringUtils;
 import org.apache.http.util.Asserts;
@@ -38,7 +43,9 @@ import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import com.fs.statistics.dto.WatchCourseStatisticsDTO;
 
@@ -80,6 +87,8 @@ public class StatisticsServiceImpl implements IStatisticsService {
     @Autowired
     private IQwIpadServerService qwIpadServerService;
 
+
+
     @Override
     public void dataOverviewTask() {
         DealerAggregatedDTO dealerAggregatedDTO = this.dealerAggregated();
@@ -998,4 +1007,27 @@ public class StatisticsServiceImpl implements IStatisticsService {
 
         return watchCourseStatisticsDTO;
     }
+
+    /**
+     * @Description: 统计按TimeType 0-今天,1-昨天,2-本周,3-本月,4-上月;各公司的观看人数和完播人数, 存到redis中,定时任务每 ? 分钟执行一次
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/27 13:09
+     */
+    @Override
+    public void watchCourseStatisticsGroupByCompany() {
+        for(int i = 0; i < 5; i++){
+            Map<String,Object> params=new HashMap<>();
+            DateTimeEntity timeEntity =DateUtils.getBetweenTime(i);
+            params.put("startTime",timeEntity.getStartTime());
+            params.put("endTime",timeEntity.getEndTime());
+
+            List<WatchCourseStatisticsResultDTO> watchCourseStatisticsDTOS=fsCourseWatchLogMapper.watchCourseStatisticsGroupByCompany(params);
+            // 存到redis中 按TimeType 0-今天,1-昨天,2-本周,3-本月,4-上月;
+            redisCache.setCacheObject(FsConstants.WATCH_COURSE_STATISTICS_GROUP_COMPANY+i, JSON.toJSONString(watchCourseStatisticsDTOS));
+        }
+    }
+
+
 }

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

@@ -973,4 +973,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         o.create_time DESC
     </select>
 
+    <!-- 统计当天各公司的观看人数和完播人数, 存到redis中,定时任务每 ? 分钟执行一次    -->
+    <select id="watchCourseStatisticsGroupByCompany" resultType="com.fs.statis.dto.WatchCourseStatisticsResultDTO">
+        SELECT
+            o.company_id AS companyId,
+            c.company_name AS companyName,
+            o.send_type,
+            COUNT(DISTINCT o.user_id) AS watchUserCount,
+            COUNT(o.log_id) AS watchCount,
+            sum(case when o.log_type = 2 then 1 else 0 end)  AS finishCount,
+            COUNT(DISTINCT CASE WHEN o.log_type = 2 THEN o.user_id END) AS finishUserCount
+        FROM
+            fs_course_watch_log o
+            LEFT JOIN company c ON c.company_id = o.company_id
+        WHERE
+            o.create_time &gt;= #{params.startTime}
+            AND o.create_time &lt;= #{params.endTime}
+        GROUP BY
+            o.company_id,
+            o.send_type
+    </select>
+
 </mapper>