From 1ced64b627c79dcb51be852a7974f8743460df79 Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Tue, 02 Dec 2025 16:29:39 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 ard-system/src/main/java/com/ard/data/statistics/domain/ArdStatisticsCountResult.java |    9 +++
 ard-admin/src/main/java/com/ard/web/controller/data/ArdStatisticsController.java      |   26 ++++++++
 ard-admin/src/main/java/com/ard/web/controller/monitor/SysUserOnlineController.java   |   49 +++++++++++++++
 ard-system/src/main/resources/mapper/data/ArdStatisticsMapper.xml                     |   25 ++++++++
 ard-system/src/main/java/com/ard/data/statistics/mapper/ArdStatisticsMapper.java      |   10 +++
 ard-system/src/main/java/com/ard/data/statistics/service/ArdStatisticsService.java    |   19 ++++++
 6 files changed, 136 insertions(+), 2 deletions(-)

diff --git a/ard-admin/src/main/java/com/ard/web/controller/data/ArdStatisticsController.java b/ard-admin/src/main/java/com/ard/web/controller/data/ArdStatisticsController.java
new file mode 100644
index 0000000..8695066
--- /dev/null
+++ b/ard-admin/src/main/java/com/ard/web/controller/data/ArdStatisticsController.java
@@ -0,0 +1,26 @@
+package com.ard.web.controller.data;
+
+import com.ard.common.core.domain.AjaxResult;
+import com.ard.data.statistics.service.ArdStatisticsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "统计接口")
+@RestController
+@RequestMapping("/data/statistics")
+public class ArdStatisticsController {
+
+    @Resource
+    private ArdStatisticsService service;
+
+    @ApiOperation("获取统计数量")
+    @GetMapping("/counts")
+    public AjaxResult getCounts() {
+        return AjaxResult.success(service.getCounts());
+    }
+}
diff --git a/ard-admin/src/main/java/com/ard/web/controller/monitor/SysUserOnlineController.java b/ard-admin/src/main/java/com/ard/web/controller/monitor/SysUserOnlineController.java
index 504a20b..1cc4a66 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/monitor/SysUserOnlineController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/monitor/SysUserOnlineController.java
@@ -39,8 +39,8 @@
     private RedisCache redisCache;
 
     @PreAuthorize("@ss.hasPermi('monitor:online:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(String ipaddr, String userName)
+    @GetMapping("/list1")
+    public TableDataInfo list1(String ipaddr, String userName)
     {
         Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
         List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
@@ -68,6 +68,51 @@
         userOnlineList.removeAll(Collections.singleton(null));
         return getDataTable(userOnlineList);
     }
+    @PreAuthorize("@ss.hasPermi('monitor:online:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(String ipaddr, String userName)
+    {
+        startPage();  // ❗ Ruoyi 分页
+
+        Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
+        List<SysUserOnline> resultList = new ArrayList<>();
+
+        boolean searchIp = StringUtils.isNotEmpty(ipaddr);
+        boolean searchName = StringUtils.isNotEmpty(userName);
+
+        for (String key : keys)
+        {
+            LoginUser loginUser = redisCache.getCacheObject(key);
+            if (loginUser == null || loginUser.getUser() == null)
+                continue;
+
+            // 转换成 SysUserOnline
+            SysUserOnline onlineUser = userOnlineService.loginUserToUserOnline(loginUser);
+            if (onlineUser == null) continue;
+
+            boolean match = true;
+
+            // ⭐ IP 模糊匹配
+            if (searchIp)
+            {
+                String userIp = loginUser.getIpaddr();
+                match = userIp != null && userIp.contains(ipaddr);
+            }
+
+            // ⭐ 用户名模糊匹配
+            if (match && searchName)
+            {
+                String nick = loginUser.getUsername();
+                match = nick != null && nick.contains(userName);
+            }
+
+            if (match)
+                resultList.add(onlineUser);
+        }
+
+        Collections.reverse(resultList);
+        return getDataTable(resultList);
+    }
 
     /**
      * 强退用户
diff --git a/ard-system/src/main/java/com/ard/data/statistics/domain/ArdStatisticsCountResult.java b/ard-system/src/main/java/com/ard/data/statistics/domain/ArdStatisticsCountResult.java
new file mode 100644
index 0000000..370c80d
--- /dev/null
+++ b/ard-system/src/main/java/com/ard/data/statistics/domain/ArdStatisticsCountResult.java
@@ -0,0 +1,9 @@
+package com.ard.data.statistics.domain;
+
+import lombok.Data;
+
+@Data
+public class ArdStatisticsCountResult {
+    private String name;
+    private Integer count;
+}
diff --git a/ard-system/src/main/java/com/ard/data/statistics/mapper/ArdStatisticsMapper.java b/ard-system/src/main/java/com/ard/data/statistics/mapper/ArdStatisticsMapper.java
new file mode 100644
index 0000000..72d2908
--- /dev/null
+++ b/ard-system/src/main/java/com/ard/data/statistics/mapper/ArdStatisticsMapper.java
@@ -0,0 +1,10 @@
+package com.ard.data.statistics.mapper;
+
+import com.ard.data.statistics.domain.ArdStatisticsCountResult;
+import java.util.List;
+
+
+public interface ArdStatisticsMapper {
+
+    List<ArdStatisticsCountResult> getAllCounts();
+}
diff --git a/ard-system/src/main/java/com/ard/data/statistics/service/ArdStatisticsService.java b/ard-system/src/main/java/com/ard/data/statistics/service/ArdStatisticsService.java
new file mode 100644
index 0000000..c8f707b
--- /dev/null
+++ b/ard-system/src/main/java/com/ard/data/statistics/service/ArdStatisticsService.java
@@ -0,0 +1,19 @@
+package com.ard.data.statistics.service;
+
+import com.ard.data.statistics.domain.ArdStatisticsCountResult;
+import com.ard.data.statistics.mapper.ArdStatisticsMapper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class ArdStatisticsService {
+
+    @Resource
+    private ArdStatisticsMapper mapper;
+
+    public List<ArdStatisticsCountResult> getCounts() {
+        return mapper.getAllCounts();
+    }
+}
diff --git a/ard-system/src/main/resources/mapper/data/ArdStatisticsMapper.xml b/ard-system/src/main/resources/mapper/data/ArdStatisticsMapper.xml
new file mode 100644
index 0000000..f487d07
--- /dev/null
+++ b/ard-system/src/main/resources/mapper/data/ArdStatisticsMapper.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.ard.data.statistics.mapper.ArdStatisticsMapper">
+
+    <select id="getAllCounts" resultType="ArdStatisticsCountResult">
+        SELECT 'serverCount' AS name, COUNT(*) AS count FROM ard_server
+        UNION ALL
+        SELECT 'uavCount' AS name, COUNT(*) AS count FROM ard_drone
+        UNION ALL
+        SELECT 'cameraCount' AS name, COUNT(*) AS count FROM ard_camera
+        UNION ALL
+        SELECT 'dockCount' AS name, COUNT(*) AS count FROM manage_device where domain = 3
+        UNION ALL
+        SELECT 'noFlyZoneCount' AS name, COUNT(*) AS count FROM ard_no_fly_zone
+        UNION ALL
+        SELECT 'mapCount' AS name, COUNT(*) AS count FROM ard_map
+        UNION ALL
+        SELECT 'modelCount' AS name, COUNT(*) AS count FROM ard_model
+        UNION ALL
+        SELECT 'tilesCount' AS name, COUNT(*) AS count FROM ard_tile
+    </select>
+
+</mapper>

--
Gitblit v1.9.3