Quellcode durchsuchen

feat:会员看课统计表定时任务

caoliqin vor 3 Wochen
Ursprung
Commit
2371225e88

+ 11 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -21,6 +21,7 @@ import com.fs.store.domain.FsUser;
 import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.param.h5.TagListParam;
 import com.fs.store.param.h5.UserStatisticsCommonParam;
+import com.fs.store.service.IFsUserCourseCountService;
 import com.fs.store.service.IFsUserService;
 import com.fs.store.vo.h5.*;
 import com.github.pagehelper.PageHelper;
@@ -59,6 +60,9 @@ public class FsUserController extends AppBaseController {
     @Autowired
     private IFsUserCourseService fsUserCourseService;
 
+    @Autowired
+    private IFsUserCourseCountService userCourseCountService;
+
     @Login
     @PostMapping("/pageList")
     @ApiOperation("用户会员分页列表")
@@ -317,4 +321,11 @@ public class FsUserController extends AppBaseController {
         }
     }
 
+    @PostMapping("/test")
+    @ApiOperation("测试定时任务")
+    public void userCourseCountTask() {
+        userCourseCountService.insertFsUserCourseCountTask();
+    }
+
+
 }

+ 9 - 4
fs-qw-task/src/main/java/com/fs/app/task/UserCourseWatchCountTask.java

@@ -3,6 +3,7 @@ package com.fs.app.task;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.store.service.IFsUserCourseCountService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -21,6 +22,9 @@ public class UserCourseWatchCountTask {
     @Autowired
     private IFsCourseWatchLogService courseWatchLogService;
 
+    @Autowired
+    private IFsUserCourseCountService userCourseCountService;
+
 
     /**
      * 每天两点进行会员看课统计
@@ -28,11 +32,12 @@ public class UserCourseWatchCountTask {
     @Scheduled(cron = "0 0 2 * * ?")  // 2点0分0秒执行
     public void userCourseCountTask() {
         try {
-            log.info("会员看课统计任务执行----------开始");
+            log.info("==============会员看课统计任务执行===============开始");
             long startTime = System.currentTimeMillis();
-            //
-            // todo
-            log.info("会员看课统计任务执行----------结束");
+
+            userCourseCountService.insertFsUserCourseCountTask();
+
+            log.info("会员看课统计任务执行==============结束");
             long endTime = System.currentTimeMillis();
             log.info("会员看课统计任务执行----------执行时长:{}", (endTime - startTime));
         } catch (Exception e) {

+ 7 - 1
fs-service-system/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java

@@ -62,9 +62,15 @@ public interface FsUserCourseCountMapper
 
     FsUserCourseCount findByUserId(@Param("userId") Long userId);
 
+    /**
+     * 获取看课统计表结果
+     * @return list
+     */
+    List<FsUserCourseCount> getCountResult();
+
     /**
      * 往看课统计表中插入数据
      */
-    void insertFsUserCourseCountTask();
+    void insertFsUserCourseCountTask(FsUserCourseCount fsUserCourseCount);
 
 }

+ 23 - 3
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java

@@ -3,6 +3,10 @@ package com.fs.store.service.impl;
 import java.util.List;
 import com.fs.common.utils.DateUtils;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.google.common.collect.Lists;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.store.mapper.FsUserCourseCountMapper;
@@ -24,6 +28,9 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
     @Autowired
     private FsCourseWatchLogMapper fsCourseWatchLogMapper;
 
+    @Autowired
+    private SqlSessionFactory sqlSessionFactory;
+
     /**
      * 查询用户看课统计
      *
@@ -106,12 +113,25 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
     @Override
     public void insertFsUserCourseCountTask() {
         // 1、获取统计结果
-        // todo
-
+        List<FsUserCourseCount> countResult = fsUserCourseCountMapper.getCountResult();
 
         // 2、分批插入数据
+        this.batchInsert(countResult);
 
+    }
 
-
+    private void batchInsert(List<FsUserCourseCount> list) {
+        // 分批次处理,一次提交500条
+        List<List<FsUserCourseCount>> batches = Lists.partition(list, 500);
+        batches.forEach(batch -> {
+            SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
+            try {
+                FsUserCourseCountMapper mapper = sqlSession.getMapper(FsUserCourseCountMapper.class);
+                batch.forEach(mapper::insertFsUserCourseCountTask);
+                sqlSession.commit();
+            } finally {
+                sqlSession.close();
+            }
+        });
     }
 }

+ 65 - 1
fs-service-system/src/main/resources/mapper/store/FsUserCourseCountMapper.xml

@@ -135,8 +135,72 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
-    <insert id="insertFsUserCourseCountTask" useGeneratedKeys="true" keyProperty="id">
+    <select id="getCountResult" resultType="FsUserCourseCount">
+        SELECT
+            fwl.user_id,
+            count( DISTINCT CASE WHEN fwl.log_type != 3 THEN fwl.video_id END ) AS watchCourseCount,
+            count( DISTINCT CASE WHEN fwl.log_type = 3 THEN fwl.video_id END ) AS missCourseCount,
+            IF
+            ( count( DISTINCT CASE WHEN fwl.log_type = 3 THEN fwl.video_id END ) > 0, 1, 2 ) AS missCourseStatus,
+            GROUP_CONCAT( DISTINCT fwl.period_id ) AS courseIds,
+            count(DISTINCT fwl.period_id ) AS partCourseCount,
+            a.last_heartbeat_time AS lastWatchDate,
+            CASE
+                WHEN a.log_type = 1
+                    OR a.log_type = 2 THEN
+                    1
+                WHEN a.log_type = 4 THEN
+                    2
+                WHEN a.log_type = 3 THEN
+                    3
+                END AS STATUS,
+            max( CASE WHEN fwl.log_type = 2 THEN fwl.last_heartbeat_time END ) AS completeWatchDate,
+            count( CASE WHEN fwl.log_type = 2 THEN fwl.log_id END ) AS completeWatchCount,
+            count( CASE WHEN fwl.log_type != 3 THEN fwl.log_id END ) AS watch_times,
+            NOW() AS create_time
+        FROM
+            ( SELECT fs_course_watch_log.user_id, Max( fs_course_watch_log.last_heartbeat_time ) AS last_heartbeat_time, log_type FROM fs_course_watch_log GROUP BY fs_course_watch_log.user_id ) a
+                INNER JOIN fs_course_watch_log fwl ON fwl.user_id = a.user_id
+        GROUP BY
+            fwl.user_id
+    </select>
 
+    <insert id="insertFsUserCourseCountTask" parameterType="FsUserCourseCount" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_user_course_count
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="watchCourseCount != null">watch_course_count,</if>
+            <if test="missCourseCount != null">miss_course_count,</if>
+            <if test="missCourseStatus != null">miss_course_status,</if>
+            <if test="courseIds != null">course_ids,</if>
+            <if test="partCourseCount != null">part_course_count,</if>
+            <if test="lastWatchDate != null">last_watch_date,</if>
+            <if test="status != null">status,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="completeWatchDate != null">complete_watch_date,</if>
+            <if test="completeWatchCount != null">complete_watch_count,</if>
+            <if test="watchTimes != null">watch_times,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="watchCourseCount != null">#{watchCourseCount},</if>
+            <if test="missCourseCount != null">#{missCourseCount},</if>
+            <if test="missCourseStatus != null">#{missCourseStatus},</if>
+            <if test="courseIds != null">#{courseIds},</if>
+            <if test="partCourseCount != null">#{partCourseCount},</if>
+            <if test="lastWatchDate != null">#{lastWatchDate},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="completeWatchDate != null">#{completeWatchDate},</if>
+            <if test="completeWatchCount != null">#{completeWatchCount},</if>
+            <if test="watchTimes != null">#{watchTimes},</if>
+        </trim>
     </insert>