Преглед изворни кода

用户状态统计列表开发

gao.qiang пре 2 недеља
родитељ
комит
c032ea50e9

+ 28 - 16
business-service/src/main/resources/mapper/service/BaseUserMapper.xml

@@ -83,14 +83,23 @@
         FROM sys_user u
         WHERE u.status = 1
           AND u.del_flag = 1
-          AND EXISTS (
-            SELECT 1
-            FROM sys_dept d1
-                     LEFT JOIN sys_dept d2 ON d1.dept_id = d2.parent_id AND d2.status = 1 AND d2.del_flag = 1
-            WHERE d1.status = 1
-              AND d1.del_flag = 1
-              AND (d1.dept_name = '工务部' OR d2.dept_name = '工务部')
-              AND u.dept_id IN (d1.dept_id, d2.dept_id)
+          AND u.dept_id IN (
+            SELECT dept_id
+            FROM sys_dept
+            WHERE dept_name = '工务部'
+              AND status = 1
+              AND del_flag = 1
+            UNION ALL
+            SELECT dept_id
+            FROM sys_dept
+            WHERE
+                parent_id = (SELECT dept_id
+                             FROM sys_dept
+                             WHERE dept_name = '工务部'
+                               AND status = 1
+                               AND del_flag = 1)
+              AND status = 1
+              AND del_flag = 1
         );
     </select>
     <select id="getUsersByIds" resultType="com.ozs.service.entity.BaseUser">
@@ -107,14 +116,17 @@
         FROM sys_user u
         WHERE u.status = 1
           AND u.del_flag = 1
-          AND EXISTS (
-            SELECT 1
-            FROM sys_dept d1
-                     LEFT JOIN sys_dept d2 ON d1.dept_id = d2.parent_id AND d2.status = 1 AND d2.del_flag = 1
-            WHERE d1.status = 1
-              AND d1.del_flag = 1
-              AND (d1.dept_name = '工务部' AND d2.dept_name LIKE '%工务段%')
-              AND u.dept_id IN (d1.dept_id, d2.dept_id)
+          AND u.dept_id IN (
+            SELECT dept_id
+            FROM sys_dept
+            WHERE
+                parent_id = (SELECT dept_id
+                             FROM sys_dept
+                             WHERE dept_name = '工务部'
+                               AND status = 1
+                               AND del_flag = 1)
+              AND status = 1
+              AND del_flag = 1
         );
     </select>
     <select id="getUserLists" resultType="java.lang.String">

+ 41 - 7
business-service/src/main/resources/mapper/service/UserStateStatisticsMapper.xml

@@ -36,25 +36,59 @@
         ORDER BY u.create_time desc
     </select>
     <select id="userStateStatisticsPage" resultType="com.ozs.service.entity.vo.UserStateStatisticsResp">
-        SELECT * FROM (
+        SELECT
+        t.nikeName,
+        t.userName,
+        t.createTime,
+        t.isDisableName,
+        t.userId,
+        t.isDisable,
+        s.dept_id
+        FROM
+        (
         SELECT
         u.nike_name AS nikeName,
         u.user_name AS userName,
         u.create_time AS createTime,
-        CASE u.is_disable
-        WHEN 1 THEN '在线'
-        WHEN 2 THEN '离线'
+        CASE
+        u.is_disable
+        WHEN 1 THEN
+        '在线'
+        WHEN 2 THEN
+        '离线'
         END AS isDisableName,
         u.user_id AS userId,
         u.is_disable AS isDisable,
-        ROW_NUMBER() OVER (PARTITION BY u.nike_name ORDER BY u.create_time DESC) as rn
+        ROW_NUMBER() OVER ( PARTITION BY u.user_id ORDER BY u.create_time DESC ) AS rn
         FROM
         user_state_statistics u
         ) t
-        WHERE t.rn = 1
+        INNER JOIN sys_user s ON t.userId = s.user_id
+        AND s.STATUS = 1
+        AND s.del_flag = 1
+        AND s.dept_id IN (
+        SELECT
+        dept_id
+        FROM
+        sys_dept
+        WHERE
+        dept_name = '工务部'
+        AND STATUS = 1
+        AND del_flag = 1 UNION ALL
+        SELECT
+        dept_id
+        FROM
+        sys_dept
+        WHERE
+        parent_id = ( SELECT dept_id FROM sys_dept WHERE dept_name = '工务部' AND STATUS = 1 AND del_flag = 1 )
+        AND STATUS = 1
+        AND del_flag = 1
+        )
+        WHERE
+        t.rn = 1
         <if test="isDisable != null and isDisable != 0">
             AND t.isDisable = #{isDisable}
         </if>
-        ORDER BY t.createTime DESC
+        ORDER BY t.createTime DESC, t.userId DESC
     </select>
 </mapper>

+ 69 - 62
hazard-admin/src/main/java/com/ozs/web/core/util/InsertUserStateUtil.java

@@ -13,6 +13,7 @@ import com.ozs.web.controller.websocket.WebSocketServer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableAsync;
@@ -40,72 +41,78 @@ public class InsertUserStateUtil {
     private BaseUserMapper baseUserMapper;
     @Autowired
     private UserStateStatisticsService userStateStatisticsService;
+    @Value("${base.isEnable:false}")
+    private String isEnable;
 
     @Async
-    @Scheduled(cron = "0 */5 * * * ?")
+    @Scheduled(cron = "0 */1 * * * ?")
     @Transactional
     public void tableCreationAndDelete() {
-        // 获取在线用户和工务段用户
-        List<String> onlineUser = webSocketServer.getOnlineUser();
-        List<String> userIdList = baseUserMapper.getUserIdsLists();
-        //需要推送信息的用户
-        List<String> userIdsAll = baseUserMapper.getUserIdsAll();
-        //获取属于工段用户的用户ID
-        List<String>  userLists =baseUserMapper.getUserLists();
-
-
-        // 使用Set提高查找性能
-        Set<String> onlineSet = new HashSet<>(onlineUser);
-        Set<String> userSet = new HashSet<>(userIdList);
-        Set<String> userAll = new HashSet<>(userIdsAll);
-
-        // 计算差集和交集
-        Set<String> offlineUsers = userSet.stream()
-                .filter(userId -> !onlineSet.contains(userId))
-                .collect(Collectors.toSet());
-        Set<String> offlineUsersAll = userAll.stream()
-                .filter(userId -> !onlineSet.contains(userId))
-                .collect(Collectors.toSet());
-        Set<String> onlineUsers = onlineSet.stream()
-                .filter(userSet::contains)
-                .collect(Collectors.toSet());
-
-        // 批量查询用户信息,减少数据库查询
-        Map<String, BaseUser> userMap = baseUserMapper.getUsersByIds(
-                Stream.concat(offlineUsers.stream(), onlineUsers.stream())
-                        .collect(Collectors.toList())
-        ).stream().collect(Collectors.toMap(BaseUser::getUserId, user -> user));
-
-        // 批量查询最新用户状态
-        List<String> allUserIds = Stream.concat(offlineUsers.stream(), onlineUsers.stream())
-                .collect(Collectors.toList());
-        Map<String, UserStateStatistics> latestUserStateMap = getUserLatestStateMap(allUserIds);
-        log.info("用户状态 {}", latestUserStateMap);
-        // 处理离线用户
-        processUserStates(offlineUsers, userMap, latestUserStateMap, 2, userStateStatisticsService);
-
-        // 处理在线用户
-        processUserStates(onlineUsers, userMap, latestUserStateMap, 1, userStateStatisticsService);
-        // 推送信息
-        String data = objStr(offlineUsersAll.size());
-        log.info("准备推送数据: {}, 目标用户数: {}", data, userLists.size());
-        // 先批量检查在线状态,减少重复调用
-        List<String> onlineUserList = userLists.stream()
-                .filter(webSocketServer::userOnline)
-                .collect(Collectors.toList());
-
-        log.info("在线用户数: {}", onlineUserList.size());
-
-        // 批量推送
-        onlineUserList.parallelStream().forEach(userId -> {
-            try {
-                webSocketServer.sendOneMessage(userId, data);
-                log.info("推送成功 - 用户: {}", userId);
-            } catch (Exception e) {
-                log.error("推送消息给用户 {} 时发生异常: {}", userId, e.getMessage(), e);
-            }
-        });
-        log.info("推送完成,成功推送数: {}", onlineUserList.size());
+        log.info("isEnable----{}", isEnable);
+        if ("true".equals(isEnable)) {
+            log.info("开始执行 tableCreationAndDelete 任务");
+            // 获取在线用户和工务段用户
+            List<String> onlineUser = webSocketServer.getOnlineUser();
+            List<String> userIdList = baseUserMapper.getUserIdsLists();
+            //需要推送信息的用户
+            List<String> userIdsAll = baseUserMapper.getUserIdsAll();
+            //获取属于工段用户的用户ID
+            List<String> userLists = baseUserMapper.getUserLists();
+
+
+            // 使用Set提高查找性能
+            Set<String> onlineSet = new HashSet<>(onlineUser);
+            Set<String> userSet = new HashSet<>(userIdList);
+            Set<String> userAll = new HashSet<>(userIdsAll);
+
+            // 计算差集和交集
+            Set<String> offlineUsers = userSet.stream()
+                    .filter(userId -> !onlineSet.contains(userId))
+                    .collect(Collectors.toSet());
+            Set<String> offlineUsersAll = userAll.stream()
+                    .filter(userId -> !onlineSet.contains(userId))
+                    .collect(Collectors.toSet());
+            Set<String> onlineUsers = onlineSet.stream()
+                    .filter(userSet::contains)
+                    .collect(Collectors.toSet());
+
+            // 批量查询用户信息,减少数据库查询
+            Map<String, BaseUser> userMap = baseUserMapper.getUsersByIds(
+                    Stream.concat(offlineUsers.stream(), onlineUsers.stream())
+                            .collect(Collectors.toList())
+            ).stream().collect(Collectors.toMap(BaseUser::getUserId, user -> user));
+
+            // 批量查询最新用户状态
+            List<String> allUserIds = Stream.concat(offlineUsers.stream(), onlineUsers.stream())
+                    .collect(Collectors.toList());
+            Map<String, UserStateStatistics> latestUserStateMap = getUserLatestStateMap(allUserIds);
+            log.info("用户状态 {}", latestUserStateMap);
+            // 处理离线用户
+            processUserStates(offlineUsers, userMap, latestUserStateMap, 2, userStateStatisticsService);
+
+            // 处理在线用户
+            processUserStates(onlineUsers, userMap, latestUserStateMap, 1, userStateStatisticsService);
+            // 推送信息
+            String data = objStr(offlineUsersAll.size());
+            log.info("准备推送数据: {}, 目标用户数: {}", data, userLists.size());
+            // 先批量检查在线状态,减少重复调用
+            List<String> onlineUserList = userLists.stream()
+                    .filter(webSocketServer::userOnline)
+                    .collect(Collectors.toList());
+
+            log.info("在线用户数: {}", onlineUserList.size());
+
+            // 批量推送
+            onlineUserList.parallelStream().forEach(userId -> {
+                try {
+                    webSocketServer.sendOneMessage(userId, data);
+                    log.info("推送成功 - 用户: {}", userId);
+                } catch (Exception e) {
+                    log.error("推送消息给用户 {} 时发生异常: {}", userId, e.getMessage(), e);
+                }
+            });
+            log.info("推送完成,成功推送数: {}", onlineUserList.size());
+        }
     }