瀏覽代碼

feat:同步h5会员看课中间表统计

caoliqin 15 小時之前
父節點
當前提交
9d9eafaaf4

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

@@ -14,9 +14,9 @@ public class UserCourseWatchCountTask {
 
 
     /**
-     * 每天两点进行会员看课统计
+     * 每15分钟执行一次
      */
-    @Scheduled(cron = "0 0 2 * * ?")  // 2点0分0秒执行
+    @Scheduled(cron = "0 */15 * * * ?")  // 每15分钟执行一次
     public void userCourseCountTask() {
         try {
             log.info("==============会员看课统计任务执行===============开始");

+ 12 - 0
fs-service/src/main/java/com/fs/store/domain/FsUserCourseCount.java

@@ -80,6 +80,10 @@ public class FsUserCourseCount extends BaseEntity
     @Excel(name = "创建日期,为了创建唯一索引", width = 30, dateFormat = "yyyy-MM-dd")
     private Date createDate;
 
+    //最大的看课日期,用于查询唯一数据
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date lastDate;
+
     public void setId(Long id)
     {
         this.id = id;
@@ -215,6 +219,14 @@ public class FsUserCourseCount extends BaseEntity
         this.createDate = createDate;
     }
 
+    public Date getLastDate() {
+        return lastDate;
+    }
+
+    public void setLastDate(Date lastDate) {
+        this.lastDate = lastDate;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

+ 6 - 0
fs-service/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java

@@ -69,6 +69,12 @@ public interface FsUserCourseCountMapper
      */
     List<FsUserCourseCount> getCountResult();
 
+    /**
+     * 获取最近七天每天最大心跳时间的看课记录数据
+     * @return
+     */
+    List<FsUserCourseCount> getUserStatusAndLastWatchDate();
+
     /**
      * 往看课统计表中插入数据
      */

+ 17 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java

@@ -13,6 +13,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 用户看课统计Service业务层处理
@@ -116,6 +118,21 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
         // 1、获取统计结果
         List<FsUserCourseCount> countResult = fsUserCourseCountMapper.getCountResult();
 
+        // 查询用户-每天的最新的看课状态,和最后的心跳时间
+        List<FsUserCourseCount> userStatusAndLastWatchDate = fsUserCourseCountMapper.getUserStatusAndLastWatchDate();
+        Map<String, FsUserCourseCount> map = userStatusAndLastWatchDate.stream()
+                .collect(Collectors.toMap(k -> String.format("%s-%s", k.getUserId(), k.getLastDate()), v -> v));
+
+        for (FsUserCourseCount data : countResult) {
+            String key = String.format("%s-%s",data.getUserId(), data.getLastDate());
+            FsUserCourseCount fsUserCourseCount = map.get(key);
+            if(fsUserCourseCount != null){
+                data.setLastWatchDate(fsUserCourseCount.getLastWatchDate());
+                data.setStatus(fsUserCourseCount.getStatus());
+                data.setStopWatchDays(fsUserCourseCount.getStopWatchDays());
+            }
+        }
+
         // 2、分批插入数据
         this.batchInsert(countResult);
 

+ 3 - 3
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -639,7 +639,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
         LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
         WHERE
-        company_user.parent_id = #{userId}
+        (company_user.user_id = #{userId} or company_user.parent_id = #{userId} )
         <if test="dateTag != null and dateTag !='' ">
             <choose>
                 <when test = "dateTag == '今天'">
@@ -669,7 +669,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
         LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
         WHERE
-        company_user.parent_id = #{userId}
+        (company_user.user_id = #{userId} or company_user.parent_id = #{userId} )
         AND fs_course_answer_logs.is_right = 1
         <if test="dateTag != null and dateTag !='' ">
             <choose>
@@ -704,7 +704,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_red_packet_log.user_id
         LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
         WHERE
-        company_user.parent_id = #{userId}
+        (company_user.user_id = #{userId} or company_user.parent_id = #{userId} )
         <if test="dateTag != null and dateTag !='' ">
             <choose>
                 <when test = "dateTag == '今天'">

+ 33 - 15
fs-service/src/main/resources/mapper/store/FsUserCourseCountMapper.xml

@@ -149,30 +149,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ( 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,
-            DATEDIFF(DATE_FORMAT(NOW(),'%Y-%m-%d'),DATE_FORMAT(a.last_heartbeat_time,'%Y-%m-%d')) as stop_watch_days,
             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,
+            DATE_FORMAT(fwl.create_time,'%Y-%m-%d 00:00:00') AS createTime,
             NOW() AS updateTime,
-            curdate() AS create_date
+            DATE_FORMAT(fwl.create_time,'%Y-%m-%d') AS create_date,
+            DATE (fwl.create_time ) AS lastDate
         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
+            fs_course_watch_log fwl
+        where fwl.send_type = 1 and fwl.create_time &gt;= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
         GROUP BY
             fwl.user_id
     </select>
 
+    <select id="getUserStatusAndLastWatchDate" resultType="FsUserCourseCount">
+        SELECT
+            fs_course_watch_log.user_id,
+            Max( fs_course_watch_log.last_heartbeat_time ) AS lastWatchDate,
+            Max( DATE ( fs_course_watch_log.create_time ) ) AS lastDate,
+            CASE
+
+                WHEN fs_course_watch_log.log_type = 1
+                    OR fs_course_watch_log.log_type = 2 THEN
+                    1
+                WHEN fs_course_watch_log.log_type = 4 THEN
+                    2
+                WHEN fs_course_watch_log.log_type = 3 THEN
+                    3
+                END AS STATUS,
+            DATEDIFF(
+                    DATE_FORMAT( NOW(), '%Y-%m-%d' ),
+                    DATE_FORMAT( fs_course_watch_log.last_heartbeat_time, '%Y-%m-%d' )) AS stop_watch_days
+        FROM
+            fs_course_watch_log
+        WHERE
+            fs_course_watch_log.send_type = 1
+          AND fs_course_watch_log.create_time >= DATE_SUB( CURDATE(), INTERVAL 7 DAY )
+        GROUP BY
+            fs_course_watch_log.user_id, date(fs_course_watch_log.create_time)
+    </select>
+
+
     <insert id="insertFsUserCourseCountTask" parameterType="FsUserCourseCount" useGeneratedKeys="true" keyProperty="id">
         insert into fs_user_course_count
         <trim prefix="(" suffix=")" suffixOverrides=",">