Browse Source

Merge remote-tracking branch 'origin/master'

zyp 3 days ago
parent
commit
311671f01c

+ 0 - 1
fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java

@@ -1166,7 +1166,6 @@ public class WebSocketServer {
      * @param userId 用户ID
      * @param watchDuration 观看时长(秒)
      */
-    @Async
     public void updateWatchLogTypeInRealTime(Long liveId, Long userId, Long watchDuration) {
         try {
             // 获取当前直播/回放状态

+ 2 - 2
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -325,11 +325,11 @@ public interface FsUserMapper
 
     List<FsUserSummaryCountTagVO> countTag(@Param("userId") Long userId, @Param("companyId") Long companyId);
 
-    Map<String, Long> countUserCourse(UserStatisticsCommonParam param);
+//    Map<String, Long> countUserCourse(UserStatisticsCommonParam param);
 
     Map<String, Long> countUserAnswer(UserStatisticsCommonParam param);
 
-    Map<String, Long> countCourseDetails(UserStatisticsCommonParam param);
+//    Map<String, Long> countCourseDetails(UserStatisticsCommonParam param);
 
     List<FsUserRankingVO> countUserRankingByComplete(@Param("userId") Long userId, @Param("companyId") Long companyId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("periodId")String periodId, @Param("videoId")String videoId, @Param("order")String order);
 

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

@@ -68,8 +68,17 @@ public interface FsUserCourseCountMapper
     /**
      * 获取看课统计表结果
      * @return list
+     * @param userIds 用户id列表
      */
-    List<FsUserCourseCount> getCountResult();
+    List<FsUserCourseCount> getCountResult(@Param("userIds") List<Long> userIds);
+
+    /**
+     *
+     * @param offset 从第几条开始查询
+     * @param pageSize 每页数量
+     * @return
+     */
+    List<Long> getUsersByPage(@Param("offset") int offset, @Param("pageSize") int pageSize);
 
     /**
      * 获取最近七天每天最大心跳时间的看课记录数据
@@ -82,6 +91,12 @@ public interface FsUserCourseCountMapper
      */
     void insertFsUserCourseCountTask(FsUserCourseCount fsUserCourseCount);
 
+    /**
+     * 插入/更新看课统计表
+     * @param list
+     */
+    void batchInsertOrUpdate(@Param("list") List<FsUserCourseCount> list);
+
     /**
      * 查询会员最新的看课状态和心跳时间
      * @return

+ 103 - 15
fs-service/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java

@@ -2,16 +2,21 @@ package com.fs.store.service.impl;
 
 import com.fs.common.utils.DateUtils;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.his.mapper.FsUserMapper;
+import com.fs.his.service.impl.FsUserServiceImpl;
 import com.fs.store.domain.FsUserCourseCount;
 import com.fs.store.mapper.FsUserCourseCountMapper;
 import com.fs.store.service.IFsUserCourseCountService;
 import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
 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 org.springframework.util.CollectionUtils;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -23,6 +28,7 @@ import java.util.stream.Collectors;
  * @date 2025-04-02
  */
 @Service
+@Slf4j
 public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
 {
     @Autowired
@@ -115,29 +121,111 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
 
     @Override
     public void insertFsUserCourseCountTask() {
-        // 1、获取统计结果
-        List<FsUserCourseCount> countResult = fsUserCourseCountMapper.getCountResult();
+        // 总处理量-执行中
+        int totalProcessed = 0;
+        long startTime = System.currentTimeMillis();
+
+        log.info("开始处理~~~~~~~~~~~~~~~~~");
+        // 1、分页分批次查询并处理数据
+        int page = 1;
+        int pageSize = 1000;
+        while (true) {
+            List<Long> userIds = fsUserCourseCountMapper.getUsersByPage((page - 1) * pageSize, pageSize);
+            if (userIds.isEmpty()) {
+                break;
+            }
+            log.info("处理第 {} 页,用户数: {}", page, userIds.size());
+
+            // 2、查询当前页用户的统计结果
+            List<FsUserCourseCount> countResult = Collections.emptyList();
+            if (!userIds.isEmpty()) {
+                countResult = fsUserCourseCountMapper.getCountResult(userIds);
+
+                // 3、分批插入数据
+                this.batchInsertOrUpdateNew(countResult);
+            }
+
+            totalProcessed += countResult.size();
+            // 每处理10页记录一次进度
+            if (page % 10 == 0) {
+                log.info("处理进度: 第{}页,已处理 {} 条记录", page, totalProcessed);
+            }
+            page++;
+        }
+
+        long endTime = System.currentTimeMillis();
+        log.info("处理完成!总共处理 {} 条记录,总耗时: {} 毫秒", totalProcessed, endTime - startTime);
+
+        // 获取统计结果
+//        List<FsUserCourseCount> countResult = fsUserCourseCountMapper.getCountResult();
 
         // 查询用户-每天的最新的看课状态,和最后的心跳时间
-        List<FsUserCourseCount> userStatusAndLastWatchDate = fsUserCourseCountMapper.getUserStatusAndLastWatchDate();
-        Map<String, FsUserCourseCount> map = userStatusAndLastWatchDate.stream()
-                .collect(Collectors.toMap(k -> String.format("%s-%s-%s", k.getUserId(),k.getProjectId(), k.getLastDate()), v -> v));
-
-        for (FsUserCourseCount data : countResult) {
-            String key = String.format("%s-%s-%s", data.getUserId(),data.getProjectId(), data.getLastDate());
-            FsUserCourseCount fsUserCourseCount = map.get(key);
-            if(fsUserCourseCount != null){
-                data.setLastWatchDate(fsUserCourseCount.getLastWatchDate());
-                data.setStatus(fsUserCourseCount.getStatus());
+//        List<FsUserCourseCount> userStatusAndLastWatchDate = fsUserCourseCountMapper.getUserStatusAndLastWatchDate();
+//        Map<String, FsUserCourseCount> map = userStatusAndLastWatchDate.stream()
+//                .collect(Collectors.toMap(k -> String.format("%s-%s-%s", k.getUserId(),k.getProjectId(), k.getLastDate()), v -> v));
+
+//        for (FsUserCourseCount data : countResult) {
+//            String key = String.format("%s-%s-%s", data.getUserId(),data.getProjectId(), data.getLastDate());
+//            FsUserCourseCount fsUserCourseCount = map.get(key);
+//            if(fsUserCourseCount != null){
+//                data.setLastWatchDate(fsUserCourseCount.getLastWatchDate());
+//                data.setStatus(fsUserCourseCount.getStatus());
 //                data.setStopWatchDays(fsUserCourseCount.getStopWatchDays());
-            }
+//            }
+//        }
+    }
+
+    /**
+     * 分批次插入数据
+     * @author Caolq
+     * @param list 数据列表
+     */
+    private void batchInsertOrUpdateNew(List<FsUserCourseCount> list){
+        if (CollectionUtils.isEmpty(list)) {
+            return;
         }
 
-        // 2、分批插入数据
-        this.batchInsert(countResult);
+        // 分批次处理,一次提交500条
+        int insertBatchSize = 500;
+        try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
+            FsUserCourseCountMapper mapper = sqlSession.getMapper(FsUserCourseCountMapper.class);
+
+            long totalStartTime = System.currentTimeMillis();
+            int totalInserted = 0;
+
+            // 将数据分割
+            List<List<FsUserCourseCount>> batches = Lists.partition(list, insertBatchSize);
+
+            for (int i = 0; i < batches.size(); i++) {
+                List<FsUserCourseCount> batch = batches.get(i);
+                try {
+                    // 批量插入
+                    mapper.batchInsertOrUpdate(batch);
+
+                    // 定期提交事务,避免事务过大
+                    if ((i + 1) % 10 == 0) {
+                        sqlSession.commit();
+                        log.debug("已提交第 {} 到 {} 批次", i - 9, i + 1);
+                    }
+                    totalInserted += batch.size();
+                } catch (Exception e) {
+                    log.error("批次 {} 插入/更新失败,大小:{}", i + 1, batch.size(), e);
+                    sqlSession.rollback();
+                }
+            }
+
+            // 提交剩余未提交的数据,避免提交漏
+            sqlSession.commit();
 
+            long totalEndTime = System.currentTimeMillis();
+            log.info("当前页批量插入/更新完成,总记录数:{},总耗时:{} 毫秒", totalInserted, totalEndTime - totalStartTime);
+        } catch (Exception e) {
+            log.error("批量插入/更新过程中发生错误", e);
+            throw new RuntimeException("批量插入/更新失败", e);
+        }
     }
 
+
     private void batchInsert(List<FsUserCourseCount> list) {
         // 分批次处理,一次提交500条
         List<List<FsUserCourseCount>> batches = Lists.partition(list, 500);

+ 1 - 0
fs-service/src/main/resources/application-config-druid-bjzm.yml

@@ -86,6 +86,7 @@ cloud_host:
   company_name: 北京卓美
   projectCode: BJZM
   spaceName:
+  volcengineUrl: https://myhkvolcengine.ylrztop.com
 headerImg:
   imgUrl:
 

+ 2 - 2
fs-service/src/main/resources/application-config-druid-cfryt.yml

@@ -87,8 +87,8 @@ cloud_host:
 headerImg:
   imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png
 ipad:
-  ipadUrl: http://ipad.ysya.top
-  aiApi: http://49.232.181.28:3000/api
+  ipadUrl: http://ipad.cfrytjkzx.cn
+  aiApi:
   voiceApi:
   commonApi:
 wx_miniapp_temp:

+ 1 - 0
fs-service/src/main/resources/application-config-druid-ddgy.yml

@@ -88,6 +88,7 @@ cloud_host:
   company_name: 叮当国医
   projectCode: DDGY
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://ddgy-1323137866.cos.ap-chongqing.myqcloud.com/fs/20251010/ddgy.jpg

+ 1 - 0
fs-service/src/main/resources/application-config-druid-heyantang.yml

@@ -81,6 +81,7 @@ cloud_host:
   company_name: 鹤颜堂
   projectCode: CDHYT
   spaceName:
+  volcengineUrl:
 headerImg:
   imgUrl: https
 ipad:

+ 1 - 0
fs-service/src/main/resources/application-config-druid-nmgyt.yml

@@ -87,6 +87,7 @@ cloud_host:
   company_name: 内蒙古一贴
   projectCode: NMGYT
   spaceName:
+  volcengineUrl:
 headerImg:
   imgUrl: https
 ipad:

+ 1 - 1
fs-service/src/main/resources/application-druid-nmgyt.yml

@@ -156,4 +156,4 @@ openIM:
 im:
     type: NONE
 #是否为新商户,新商户不走mpOpenId
-isNewWxMerchant: false
+isNewWxMerchant: true

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

@@ -842,7 +842,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test ='maps.logType !=null'>
                 and l.log_type = #{maps.logType}
             </if>
-            <if test ='maps.logType !=null'>
+            <if test ='maps.periodId !=null'>
                 and  l.period_id = #{maps.periodId}
             </if>
             <if test ='maps.companyId !=null'>

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

@@ -1010,77 +1010,77 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         company_tag.tag_id
     </select>
 
-    <select id="countUserCourse" resultType="Map">
-        SELECT
-        (SELECT COUNT(*) FROM (
-        SELECT 1
-        FROM fs_user_course_count fcc
-        JOIN fs_user ON fs_user.user_id = fcc.user_id
-        JOIN fs_user_company_user ucu ON ucu.user_id = fs_user.user_id
-        JOIN company_user ON ucu.company_user_id = company_user.user_id
-        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET(fcpd.period_id, fcc.course_ids) > 0
-        <where>
-            fcc.project_id = ucu.project_id
-            <if test="userId != null and userId != 0 ">
-                and (ucu.company_user_id = #{userId} OR company_user.parent_id = #{userId} )
-            </if>
-            <if test="userId != null and userId == 0 ">
-                and ucu.company_id = #{companyId}
-            </if>
-            <if test="startTime != null and startTime !='' ">
-                and fcc.create_time &gt;= #{startTime}
-            </if>
-            <if test="endTime != null and endTime != ''">
-                and fcc.create_time &lt;= #{endTime}
-            </if>
-            <if test="periodId != null and periodId != ''">
-                AND fcpd.period_id = #{periodId}
-            </if>
-            <if test="videoId != null and videoId != ''">
-                AND fcpd.video_id = #{videoId}
-            </if>
-            -- 单独通过销售id查询
-            <if test="companyUserId != null and companyUserId != ''">
-                AND company_user.user_id = #{companyUserId}
-            </if>
-        </where>
-        ) as courseWatchNum,
-        (SELECT COUNT(*) FROM (
-        SELECT 1
-        FROM fs_user_course_count fcc
-        JOIN fs_user ON fs_user.user_id = fcc.user_id
-        JOIN fs_user_company_user ucu ON ucu.user_id = fs_user.user_id
-        JOIN company_user ON ucu.company_user_id = company_user.user_id
-        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET(fcpd.period_id, fcc.course_ids) > 0
-        <where>
-            fcc.project_id = ucu.project_id
-            <if test="userId != null and userId != 0 ">
-                and (ucu.company_user_id = #{userId} OR company_user.parent_id = #{userId} )
-            </if>
-            <if test="userId != null and userId == 0 ">
-                and ucu.company_id = #{companyId}
-            </if>
-            AND fcc.complete_watch_count > 0
-            <if test="startTime != null and startTime !='' ">
-                and fcc.create_time &gt;= #{startTime}
-            </if>
-            <if test="endTime != null and endTime != ''">
-                and fcc.create_time &lt;= #{endTime}
-            </if>
-            <if test="periodId != null and periodId != ''">
-                AND fcpd.period_id = #{periodId}
-            </if>
-            <if test="videoId != null and videoId != ''">
-                AND fcpd.video_id = #{videoId}
-            </if>
-            -- 单独通过销售id查询
-            <if test="companyUserId != null and companyUserId != ''">
-                AND company_user.user_id = #{companyUserId}
-            </if>
-        </where>
-        GROUP BY fcc.user_id, ucu.project_id
-        ) AS complete_counts ) as courseCompleteNum
-    </select>
+<!--    <select id="countUserCourse" resultType="Map">-->
+<!--        SELECT-->
+<!--        (SELECT COUNT(*) FROM (-->
+<!--        SELECT 1-->
+<!--        FROM fs_user_course_count fcc-->
+<!--        JOIN fs_user ON fs_user.user_id = fcc.user_id-->
+<!--        JOIN fs_user_company_user ucu ON ucu.user_id = fs_user.user_id-->
+<!--        JOIN company_user ON ucu.company_user_id = company_user.user_id-->
+<!--        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET(fcpd.period_id, fcc.course_ids) > 0-->
+<!--        <where>-->
+<!--            fcc.project_id = ucu.project_id-->
+<!--            <if test="userId != null and userId != 0 ">-->
+<!--                and (ucu.company_user_id = #{userId} OR company_user.parent_id = #{userId} )-->
+<!--            </if>-->
+<!--            <if test="userId != null and userId == 0 ">-->
+<!--                and ucu.company_id = #{companyId}-->
+<!--            </if>-->
+<!--            <if test="startTime != null and startTime !='' ">-->
+<!--                and fcc.create_time &gt;= #{startTime}-->
+<!--            </if>-->
+<!--            <if test="endTime != null and endTime != ''">-->
+<!--                and fcc.create_time &lt;= #{endTime}-->
+<!--            </if>-->
+<!--            <if test="periodId != null and periodId != ''">-->
+<!--                AND fcpd.period_id = #{periodId}-->
+<!--            </if>-->
+<!--            <if test="videoId != null and videoId != ''">-->
+<!--                AND fcpd.video_id = #{videoId}-->
+<!--            </if>-->
+<!--            &#45;&#45; 单独通过销售id查询-->
+<!--            <if test="companyUserId != null and companyUserId != ''">-->
+<!--                AND company_user.user_id = #{companyUserId}-->
+<!--            </if>-->
+<!--        </where>-->
+<!--        ) as courseWatchNum,-->
+<!--        (SELECT COUNT(*) FROM (-->
+<!--        SELECT 1-->
+<!--        FROM fs_user_course_count fcc-->
+<!--        JOIN fs_user ON fs_user.user_id = fcc.user_id-->
+<!--        JOIN fs_user_company_user ucu ON ucu.user_id = fs_user.user_id-->
+<!--        JOIN company_user ON ucu.company_user_id = company_user.user_id-->
+<!--        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET(fcpd.period_id, fcc.course_ids) > 0-->
+<!--        <where>-->
+<!--            fcc.project_id = ucu.project_id-->
+<!--            <if test="userId != null and userId != 0 ">-->
+<!--                and (ucu.company_user_id = #{userId} OR company_user.parent_id = #{userId} )-->
+<!--            </if>-->
+<!--            <if test="userId != null and userId == 0 ">-->
+<!--                and ucu.company_id = #{companyId}-->
+<!--            </if>-->
+<!--            AND fcc.complete_watch_count > 0-->
+<!--            <if test="startTime != null and startTime !='' ">-->
+<!--                and fcc.create_time &gt;= #{startTime}-->
+<!--            </if>-->
+<!--            <if test="endTime != null and endTime != ''">-->
+<!--                and fcc.create_time &lt;= #{endTime}-->
+<!--            </if>-->
+<!--            <if test="periodId != null and periodId != ''">-->
+<!--                AND fcpd.period_id = #{periodId}-->
+<!--            </if>-->
+<!--            <if test="videoId != null and videoId != ''">-->
+<!--                AND fcpd.video_id = #{videoId}-->
+<!--            </if>-->
+<!--            &#45;&#45; 单独通过销售id查询-->
+<!--            <if test="companyUserId != null and companyUserId != ''">-->
+<!--                AND company_user.user_id = #{companyUserId}-->
+<!--            </if>-->
+<!--        </where>-->
+<!--        GROUP BY fcc.user_id, ucu.project_id-->
+<!--        ) AS complete_counts ) as courseCompleteNum-->
+<!--    </select>-->
     <select id="countUserStats" resultType="Map">
         SELECT
         -- 观看人数
@@ -1450,82 +1450,82 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ) AS answerRightNum
     </select>
 
-    <select id="countCourseDetails" resultType="Map">
-        select (SELECT
-        count( DISTINCT fcpd.period_id )
-        FROM
-        fs_user_course_period_days fcpd
-        LEFT JOIN fs_user_course_period fpd on fpd.period_id = fcpd.period_id
-        LEFT JOIN fs_user_course_count fcc ON FIND_IN_SET( fcpd.period_id, fcc.course_ids ) > 0
-        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
-        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
-        WHERE 1=1 and fcpd.del_flag =0 and fpd.del_flag =0
-        AND FIND_IN_SET(#{companyId}, fpd.company_id)
-        <if test="userId != null and userId != 0 ">
-            AND ucu.company_user_id = #{userId}
-        </if>
-        <if test="userId != null and userId == 0 ">
-            and ucu.company_id = #{companyId}
-        </if>
-        <if test="periodId != null and periodId != ''">
-            AND fcpd.period_id =  #{periodId}
-        </if>
-        -- 单独通过销售id查询
-        <if test="companyUserId != null and companyUserId != ''">
-            AND ucu.company_user_id = #{companyUserId}
-        </if>
-        ) as courseNum,
-
-        (SELECT count(DISTINCT fcpd.video_id)
-        FROM fs_user_course_period_days fcpd
-        LEFT JOIN fs_user_course_period fpd on fpd.period_id = fcpd.period_id
-        LEFT JOIN fs_user_course_count fcc ON FIND_IN_SET( fcpd.period_id, fcc.course_ids ) > 0
-        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
-        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
-        WHERE 1=1 and fcpd.del_flag =0 and fpd.del_flag =0
-        AND FIND_IN_SET(#{companyId}, fpd.company_id)
-        <if test="userId != null and userId != 0 ">
-            AND ucu.company_user_id = #{userId}
-        </if>
-        <if test="userId != null and userId == 0 ">
-            and ucu.company_id = #{companyId}
-        </if>
-        <if test="periodId != null and periodId != ''">
-            AND fcpd.period_id =  #{periodId}
-        </if>
-        <if test="videoId != null and videoId != ''">
-            AND fcpd.video_id = #{videoId}
-        </if>
-        -- 单独通过销售id查询
-        <if test="companyUserId != null and companyUserId != ''">
-            AND ucu.company_user_id = #{companyUserId}
-        </if>
-        ) as videoNum,
-
-        ( SELECT count(DISTINCT fs_user.user_id ) FROM fs_user_course_count fcc
-        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET( fcpd.period_id, fcc.course_ids ) > 0
-        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id
-        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
-        <if test="periodId != null and periodId != ''">
-            AND fcpd.period_id =  #{periodId}
-        </if>
-        <if test="videoId != null and videoId != ''">
-            AND fcpd.video_id = #{videoId}
-        </if>
-        -- 单独通过销售id查询
-        <if test="companyUserId != null and companyUserId != ''">
-            AND ucu.company_user_id = #{companyUserId}
-        </if>
-        <where>
-            <if test="userId != null and userId != 0 ">
-                AND ucu.company_user_id = #{userId}
-            </if>
-            <if test="userId != null and userId == 0 ">
-                and ucu.company_id = #{companyId}
-            </if>
-        </where>
-        ) as courseUserNum
-    </select>
+<!--    <select id="countCourseDetails" resultType="Map">-->
+<!--        select (SELECT-->
+<!--        count( DISTINCT fcpd.period_id )-->
+<!--        FROM-->
+<!--        fs_user_course_period_days fcpd-->
+<!--        LEFT JOIN fs_user_course_period fpd on fpd.period_id = fcpd.period_id-->
+<!--        LEFT JOIN fs_user_course_count fcc ON FIND_IN_SET( fcpd.period_id, fcc.course_ids ) > 0-->
+<!--        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id-->
+<!--        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id-->
+<!--        WHERE 1=1 and fcpd.del_flag =0 and fpd.del_flag =0-->
+<!--        AND FIND_IN_SET(#{companyId}, fpd.company_id)-->
+<!--        <if test="userId != null and userId != 0 ">-->
+<!--            AND ucu.company_user_id = #{userId}-->
+<!--        </if>-->
+<!--        <if test="userId != null and userId == 0 ">-->
+<!--            and ucu.company_id = #{companyId}-->
+<!--        </if>-->
+<!--        <if test="periodId != null and periodId != ''">-->
+<!--            AND fcpd.period_id =  #{periodId}-->
+<!--        </if>-->
+<!--        &#45;&#45; 单独通过销售id查询-->
+<!--        <if test="companyUserId != null and companyUserId != ''">-->
+<!--            AND ucu.company_user_id = #{companyUserId}-->
+<!--        </if>-->
+<!--        ) as courseNum,-->
+
+<!--        (SELECT count(DISTINCT fcpd.video_id)-->
+<!--        FROM fs_user_course_period_days fcpd-->
+<!--        LEFT JOIN fs_user_course_period fpd on fpd.period_id = fcpd.period_id-->
+<!--        LEFT JOIN fs_user_course_count fcc ON FIND_IN_SET( fcpd.period_id, fcc.course_ids ) > 0-->
+<!--        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id-->
+<!--        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id-->
+<!--        WHERE 1=1 and fcpd.del_flag =0 and fpd.del_flag =0-->
+<!--        AND FIND_IN_SET(#{companyId}, fpd.company_id)-->
+<!--        <if test="userId != null and userId != 0 ">-->
+<!--            AND ucu.company_user_id = #{userId}-->
+<!--        </if>-->
+<!--        <if test="userId != null and userId == 0 ">-->
+<!--            and ucu.company_id = #{companyId}-->
+<!--        </if>-->
+<!--        <if test="periodId != null and periodId != ''">-->
+<!--            AND fcpd.period_id =  #{periodId}-->
+<!--        </if>-->
+<!--        <if test="videoId != null and videoId != ''">-->
+<!--            AND fcpd.video_id = #{videoId}-->
+<!--        </if>-->
+<!--        &#45;&#45; 单独通过销售id查询-->
+<!--        <if test="companyUserId != null and companyUserId != ''">-->
+<!--            AND ucu.company_user_id = #{companyUserId}-->
+<!--        </if>-->
+<!--        ) as videoNum,-->
+
+<!--        ( SELECT count(DISTINCT fs_user.user_id ) FROM fs_user_course_count fcc-->
+<!--        LEFT JOIN fs_user_course_period_days fcpd ON FIND_IN_SET( fcpd.period_id, fcc.course_ids ) > 0-->
+<!--        LEFT JOIN fs_user ON fs_user.user_id = fcc.user_id-->
+<!--        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id-->
+<!--        <if test="periodId != null and periodId != ''">-->
+<!--            AND fcpd.period_id =  #{periodId}-->
+<!--        </if>-->
+<!--        <if test="videoId != null and videoId != ''">-->
+<!--            AND fcpd.video_id = #{videoId}-->
+<!--        </if>-->
+<!--        &#45;&#45; 单独通过销售id查询-->
+<!--        <if test="companyUserId != null and companyUserId != ''">-->
+<!--            AND ucu.company_user_id = #{companyUserId}-->
+<!--        </if>-->
+<!--        <where>-->
+<!--            <if test="userId != null and userId != 0 ">-->
+<!--                AND ucu.company_user_id = #{userId}-->
+<!--            </if>-->
+<!--            <if test="userId != null and userId == 0 ">-->
+<!--                and ucu.company_id = #{companyId}-->
+<!--            </if>-->
+<!--        </where>-->
+<!--        ) as courseUserNum-->
+<!--    </select>-->
 
     <select id="countUserRankingByComplete" resultType="com.fs.store.vo.h5.FsUserRankingVO">
         SELECT

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

@@ -165,9 +165,23 @@
             NOW() AS updateTime,
             DATE_FORMAT(fwl.create_time,'%Y-%m-%d') AS create_date,
             DATE (fwl.create_time ) AS lastDate
+            ,Max( fwl.last_heartbeat_time ) AS lastWatchDate,
+            CASE
+            WHEN fwl.log_type = 1
+            OR fwl.log_type = 2 THEN
+            1
+            WHEN fwl.log_type = 4 THEN
+            2
+            WHEN fwl.log_type = 3 THEN
+            3
+        END AS STATUS
         FROM fs_course_watch_log fwl
         left join fs_user_company_user ucu on ucu.user_id = fwl.user_id
-        where fwl.send_type = 1 and fwl.create_time &gt;= DATE_SUB(CURDATE(), INTERVAL 15 DAY) and fwl.project = ucu.project_id
+        where fwl.user_id in
+        <foreach item="userId" collection="userIds" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+            and fwl.send_type = 1 and fwl.create_time >= DATE_SUB(CURDATE(), INTERVAL 15 DAY) and fwl.project = ucu.project_id
         GROUP BY
             fwl.user_id, date(fwl.create_time),ucu.project_id
     </select>
@@ -199,6 +213,16 @@
             fs_course_watch_log.user_id, date(fs_course_watch_log.create_time),ucu.project_id
     </select>
 
+    <select id="getUsersByPage" resultType="Long">
+        SELECT DISTINCT
+            fs_user.user_id
+        FROM
+            fs_user
+                left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
+        where ucu.company_user_id is not null
+            LIMIT #{offset}, #{pageSize}
+    </select>
+
 
     <insert id="insertFsUserCourseCountTask" parameterType="FsUserCourseCount" useGeneratedKeys="true" keyProperty="id">
         insert into fs_user_course_count
@@ -256,6 +280,44 @@
         </trim>
     </insert>
 
+
+    <insert id="batchInsertOrUpdate">
+        INSERT INTO fs_user_course_count
+            ( user_id,
+            watch_course_count,
+            miss_course_count,
+            miss_course_status,
+            course_ids,
+            part_course_count,
+            last_watch_date,
+            status,
+            create_time,
+            update_time,
+            complete_watch_date,
+            complete_watch_count,
+            watch_times,
+            create_date,
+            project_id )
+        VALUES
+        <foreach collection="list" item="item" separator=",">
+            (#{item.userId}, #{item.watchCourseCount}, #{item.missCourseCount}, #{item.missCourseStatus}, #{item.courseIds},
+             #{item.partCourseCount}, #{item.lastWatchDate}, #{item.status},#{item.createTime},#{item.updateTime},#{item.completeWatchDate}
+            ,#{item.completeWatchCount},#{item.watchTimes},#{item.createDate},#{item.projectId})
+        </foreach>
+        on duplicate key update
+        watch_course_count = VALUES(watch_course_count),
+        miss_course_count = VALUES(miss_course_count),
+        miss_course_status = VALUES(miss_course_status),
+        course_ids = VALUES(course_ids),
+        part_course_count = VALUES(part_course_count),
+        last_watch_date = VALUES(last_watch_date),
+        status = VALUES(status),
+        complete_watch_date = VALUES(complete_watch_date),
+        complete_watch_count = VALUES(complete_watch_count),
+        watch_times = VALUES(watch_times),
+        update_time = NOW()
+    </insert>
+
     <select id="selectUserLastCount" resultType="com.fs.store.vo.FsUserLastCount">
         SELECT
         fs_user_course_count.user_id,