Browse Source

sql优化 userSummaryCount 现拆分成次异步查询 小程序统计功能

xgb 1 tuần trước cách đây
mục cha
commit
e24f5cf0b0

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

@@ -315,6 +315,11 @@ public interface FsUserMapper
 
     FsUserSummaryCountVO countUserSummary(@Param("userId") Long userId, @Param("companyId") Long companyId);
 
+    Integer getUserTotal(@Param("userId") Long userId, @Param("companyId") Long companyId);
+
+    Integer getTodayNewUser(@Param("userId") Long userId, @Param("companyId") Long companyId);
+
+
     List<FsUserSummaryCountTagVO> countTag(@Param("userId") Long userId, @Param("companyId") Long companyId);
 
     Map<String, Long> countUserCourse(UserStatisticsCommonParam param);

+ 59 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -846,8 +846,52 @@ public class FsUserServiceImpl implements IFsUserService {
         return fsUserMapper.selectFsUserByUserIds(userIds, companyUserId);
     }
 
+
     @Override
     public FsUserSummaryCountVO userSummaryCount(Long userId) {
+        // 判断是否是管理员
+        Long companyId;
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
+        if (companyUser != null && companyUser.isAdmin()) {
+            userId = 0L;
+            companyId = companyUser.getCompanyId();
+        } else {
+            companyId = null;
+        }
+
+        // 使用 CompletableFuture 异步执行两个查询
+
+        Long finalUserId = userId;
+        CompletableFuture<Integer> userTotalFuture = CompletableFuture.supplyAsync(() ->
+                fsUserMapper.getUserTotal(finalUserId, companyId));
+
+        CompletableFuture<Integer> todayNewUserFuture = CompletableFuture.supplyAsync(() ->
+                fsUserMapper.getTodayNewUser(finalUserId, companyId));
+
+        CompletableFuture<List<FsUserSummaryCountTagVO>> countTagList = CompletableFuture.supplyAsync(() ->
+                fsUserMapper.countTag(finalUserId, companyId));
+
+        // 等待查询结果并构建返回对象
+        FsUserSummaryCountVO fsUserSummaryCountVO = new FsUserSummaryCountVO();
+        try {
+            fsUserSummaryCountVO.setUserTotal(userTotalFuture.get());
+            fsUserSummaryCountVO.setTodayNewUser(todayNewUserFuture.get());
+            fsUserSummaryCountVO.setTagList(countTagList.get());
+
+        } catch (InterruptedException | ExecutionException e) {
+            logger.error("异步查询用户统计数据失败", e);
+            // 设置默认值
+            fsUserSummaryCountVO.setUserTotal(0);
+            fsUserSummaryCountVO.setTodayNewUser(0);
+            fsUserSummaryCountVO.setTagList(new ArrayList<>());
+        }
+
+        return fsUserSummaryCountVO;
+    }
+
+    public FsUserSummaryCountVO userSummaryCountOld(Long userId) {
+        // 开始时间
+        long start = System.currentTimeMillis();
         // 判断是否是管理员
         Long companyId = null;
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(userId);
@@ -855,9 +899,24 @@ public class FsUserServiceImpl implements IFsUserService {
             userId = 0L;
             companyId = companyUser.getCompanyId();
         }
+        long start2 = System.currentTimeMillis();
+        logger.info("countUserSummary 执行耗时: {}ms", start2 - start);
+
+        //     Integer getUserTotal(@Param("userId") Long userId, @Param("companyId") Long companyId);
+        //
+        //    Integer getTodayNewUser(@Param("userId") Long userId, @Param("companyId") Long companyId);
+
+
         FsUserSummaryCountVO fsUserSummaryCountVO = fsUserMapper.countUserSummary(userId, companyId);
+        long start3 =System.currentTimeMillis();
+        logger.info("countTag 执行耗时: {}ms", start3 - start2);
         List<FsUserSummaryCountTagVO> countTagList = fsUserMapper.countTag(userId, companyId);
         fsUserSummaryCountVO.setTagList(countTagList);
+
+        // 结束时间
+        long end = System.currentTimeMillis();
+        logger.info("countUserAnswerStats 执行耗时: {}ms", end - start3);
+
         return fsUserSummaryCountVO;
     }
 

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

@@ -894,6 +894,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         fs_user.user_id
     </select>
 
+    <select id="getUserTotal" resultType="java.lang.Integer">
+        SELECT count(fs_user.user_id) as userTotal
+        FROM fs_user
+        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
+        LEFT JOIN company_user ON ucu.company_user_id = company_user.user_id
+        WHERE fs_user.is_del = 0
+        <if test="userId != null and userId != 0 ">
+            and (ucu.company_user_id = #{userId} OR company_user.parent_id = #{userId} )
+        </if>
+        <if test="companyId != null ">
+            and ucu.company_id = #{companyId}
+        </if>
+    </select>
+
+    <select id="getTodayNewUser" resultType="java.lang.Integer">
+        SELECT count(fs_user.user_id) as todayNewUser
+        FROM fs_user
+        left join fs_user_company_user ucu on ucu.user_id = fs_user.user_id
+        LEFT JOIN company_user ON ucu.company_user_id = company_user.user_id
+        WHERE fs_user.is_del = 0
+        <if test="userId != null and userId != 0 ">
+            and (ucu.company_user_id = #{userId} OR company_user.parent_id = #{userId} )
+        </if>
+        <if test="companyId != null ">
+            and ucu.company_id = #{companyId}
+        </if>
+        AND to_days(ucu.create_time) = to_days(now())
+    </select>
+
     <select id="countUserSummary" resultType="com.fs.store.vo.h5.FsUserSummaryCountVO">
         SELECT (SELECT count(fs_user.user_id)
         FROM fs_user