فهرست منبع

定时删除 表 fs_user_course_count 数据 只保留21天 sql 优化

xgb 2 روز پیش
والد
کامیت
d716ec60f7

+ 1 - 1
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -1908,7 +1908,7 @@ public class Task {
      */
     public void cleanFsUserCourseCount() {
         logger.info("开始执行清理 fs_user_course_count 表数据任务");
-        Date thresholdTime = org.apache.commons.lang3.time.DateUtils.addMonths(new Date(), -3);
+        Date thresholdTime = org.apache.commons.lang3.time.DateUtils.addDays(new Date(), -21);
         int totalDeleted = 0;
         int batchCount;
         do {

+ 13 - 3
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -617,7 +617,12 @@ public class FsUserServiceImpl implements IFsUserService {
 
     @Override
     public PageInfo<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param) {
+        long totalStart = System.currentTimeMillis();
+
+        long start1 = System.currentTimeMillis();
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getUserId());
+        log.info("pageList-查询公司用户耗时: {}ms", System.currentTimeMillis() - start1);
+
         if (companyUser != null && companyUser.isAdmin()) {
             param.setUserId(0L);
             param.setCompanyId(companyUser.getCompanyId());
@@ -630,16 +635,19 @@ public class FsUserServiceImpl implements IFsUserService {
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         if (param.getTagIds() != null && param.getTagIds().length > 0) {
             boolean containsZero = Arrays.asList(param.getTagIds()).contains("0");
-            // 如果包含 "0",则设置 isNullTag 为 true
-            System.out.println("是否包含 0:" + containsZero + ",参数:" + Arrays.toString(param.getTagIds()));
             if (containsZero) {
                 param.setIsNullTag(true);
             }
         }
+        long start2 = System.currentTimeMillis();
         List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageList(param);
+        log.info("pageList-用户分页查询耗时: {}ms, params: {}", System.currentTimeMillis() - start2, param);
 
-
+        long start3 = System.currentTimeMillis();
         List<SysDictData> courseProject = dictDataMapper.selectDictDataByType("sys_course_project");
+        log.info("pageList-项目字典查询耗时: {}ms", System.currentTimeMillis() - start3);
+
+        long start4 = System.currentTimeMillis();
         for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOS) {
             if (courseProject != null && !courseProject.isEmpty()) {
                 if (fsUserPageListVO.getProjectId() != null) {
@@ -668,7 +676,9 @@ public class FsUserServiceImpl implements IFsUserService {
 
             }
         }
+        log.info("pageList-数据处理耗时(包含解密): {}ms, 记录数: {}", System.currentTimeMillis() - start4, fsUserPageListVOS.size());
 
+        log.info("pageList-总耗时: {}ms", System.currentTimeMillis() - totalStart);
         return new PageInfo<>(fsUserPageListVOS);
     }
 

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

@@ -238,18 +238,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         fs_user.nick_name as nickname,
         fs_user.phone,
         case when fs_user.app_open_id is null then 2 else 1 end as isAppUser,
-        fs_user_course_count.id,
-        fs_user_course_count.watch_course_count,
---         fs_course_watch_log.watch_course_count,
-        fs_user_course_count.miss_course_count,
-        fs_user_course_count.miss_course_status,
-        fs_user_course_count.course_ids,
-        fs_user_course_count.part_course_count,
---         fs_course_watch_log.part_course_count,
-        fs_user_course_count.last_watch_date,
-        fs_user_course_count.STATUS AS courseCountStatus,
-        fs_user_course_count.stop_watch_days,
-        fs_user_course_count.complete_watch_date,
+        fcc.id,
+        fcc.watch_course_count,
+        fcc.miss_course_count,
+        fcc.miss_course_status,
+        fcc.course_ids,
+        fcc.part_course_count,
+        fcc.last_watch_date,
+        fcc.STATUS AS courseCountStatus,
+        fcc.stop_watch_days,
+        fcc.complete_watch_date,
         GROUP_CONCAT(DISTINCT company_tag.tag) AS tag,
         GROUP_CONCAT(DISTINCT company_tag.tag_id) AS tagIds,
         company_user.nick_name as companyUserNickName,
@@ -262,7 +260,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         FROM
         fs_user
         INNER JOIN fs_user_company_user ON fs_user_company_user.user_id = fs_user.user_id
-        LEFT JOIN fs_user_course_count ON fs_user_company_user.user_id = fs_user_course_count.user_id and fs_user_company_user.project_id = fs_user_course_count.project_id
+        LEFT JOIN fs_user_course_count fcc ON fcc.id = (
+            SELECT MAX(fcc2.id)
+            FROM fs_user_course_count fcc2
+            WHERE fcc2.user_id = fs_user_company_user.user_id
+              AND fcc2.project_id = fs_user_company_user.project_id
+        )
         left join fs_user_project_tag upt ON upt.user_company_user_id = fs_user_company_user.id
         LEFT JOIN company_tag ON company_tag.tag_id = upt.tag_id
         LEFT JOIN company_user ON company_user.user_id = fs_user_company_user.company_user_id
@@ -321,33 +324,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     AND fs_user_company_user.create_time >= CURDATE() AND fs_user_company_user.create_time &lt; CURDATE() + INTERVAL 1 DAY
                 </when>
                 <when test = "tabValue == 2">
-                    AND fs_user_course_count.complete_watch_date >= CURDATE() AND fs_user_course_count.complete_watch_date &lt; CURDATE() + INTERVAL 1 DAY
+                    AND fcc.complete_watch_date >= CURDATE() AND fcc.complete_watch_date &lt; CURDATE() + INTERVAL 1 DAY
                 </when>
                 <when test = "tabValue == 3">
-                    AND (fs_user_course_count.status = 3 or fs_user_course_count.status is null)
+                    AND (fcc.status = 3 or fcc.status is null)
                 </when>
             </choose>
         </if>
         <if test="watchCourseType != null and watchCourseType !='' ">
             <choose>
                 <when test = "watchCourseType == 1">
-                    AND (fs_user_course_count.status = 3 or fs_user_course_count.status is null)
+                    AND (fcc.status = 3 or fcc.status is null)
                 </when>
                 <when test = "watchCourseType == 2">
-                    AND fs_user_course_count.status = 1
+                    AND fcc.status = 1
                 </when>
                 <when test = "watchCourseType == 3">
-                    AND fs_user_course_count.status = 2
+                    AND fcc.status = 2
                 </when>
             </choose>
         </if>
         <if test="missCourseStatus != null and missCourseStatus !='' ">
             <choose>
                 <when test = "missCourseStatus == 1">
-                    AND fs_user_course_count.miss_course_status = 1
+                    AND fcc.miss_course_status = 1
                 </when>
                 <when test = "missCourseStatus == 2">
-                    AND (fs_user_course_count.miss_course_status = 2 or fs_user_course_count.miss_course_status is null )
+                    AND (fcc.miss_course_status = 2 or fcc.miss_course_status is null )
                 </when>
             </choose>
         </if>
@@ -357,13 +360,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by
         <choose>
             <when test = "continueMissCourseSort != null and continueMissCourseSort == 0">
-                fs_user_company_user.create_time desc,fs_user.user_id desc
+                fs_user_company_user.create_time desc,fs_user_company_user.user_id desc
             </when>
             <when test = "continueMissCourseSort != null and continueMissCourseSort == 1">
-                fs_user.nick_name asc,fs_user.user_id desc
+                fs_user.nick_name asc,fs_user_company_user.user_id desc
             </when>
             <otherwise>
-                fs_user.user_id desc, fs_user_company_user.project_id
+                fs_user_company_user.user_id desc, fs_user_company_user.project_id
             </otherwise>
         </choose>
     </select>