🟢 在线设备数

定义

当前时刻与云端平台保持稳定网络连接、可正常接收指令和上报数据的活跃设备数量。

计算方式

# 设备统计指标计算说明

## 📊 概述
本文档详细说明系统中各设备统计指标的定义和计算方式,所有计算均基于真实数据源,确保数据的准确性和实时性。

## 🖥️ 设备总数

### 定义
系统中已完成注册、激活并投入使用的物理设备总量,反映业务规模和市场覆盖范围。

### 计算方式
```sql
-- 核心数据表:device
-- 关键字段:is_deleted(软删除标记)
SELECT COUNT(*) AS total_devices 
FROM device 
WHERE is_deleted = 0  -- 排除逻辑删除设备
  AND device_id IS NOT NULL  -- 设备ID非空验证
  AND status IN ('ONLINE', 'OFFLINE', 'ACTIVE', 'INACTIVE');  -- 有效状态验证

核心代码

/**
 * 设备总数计算 - 企业级实现
 */
public Long getTotalDeviceCount() {
    return deviceMapper.selectCount(
        Wrappers.<Device>lambdaQuery()
            .eq(Device::getIsDeleted, 0)  // 软删除过滤
            .isNotNull(Device::getDeviceId)  // 设备ID完整性校验
            .in(Device::getStatus, 
                Arrays.asList("ONLINE", "OFFLINE", "ACTIVE", "INACTIVE"))  // 状态有效性验证
    );
}
-- 多维度在线状态判定
SELECT COUNT(DISTINCT d.device_id) AS online_devices
FROM device d
LEFT JOIN device_status_log dsl ON d.device_id = dsl.device_id
WHERE d.is_deleted = 0
  AND d.status = 'ONLINE'  -- 设备表状态
  AND (dsl.status = 'ONLINE' OR dsl.status IS NULL)  -- 状态日志校验
  AND (dsl.event_time >= DATE_SUB(NOW(), INTERVAL 5 MINUTE)  -- 5分钟内活跃
       OR dsl.event_time IS NULL)
  AND d.last_online_time >= DATE_SUB(NOW(), INTERVAL 10 MINUTE);  -- 10分钟内在线

核心代码

/**
 * 在线设备数计算 - 多维度交叉验证
 */
public Long calculateOnlineDevices() {
    // 1. 基础状态统计
    Long baseOnlineCount = deviceMapper.selectCount(
        Wrappers.<Device>lambdaQuery()
            .eq(Device::getIsDeleted, 0)
            .eq(Device::getStatus, "ONLINE")
    );
    
    // 2. Redis实时状态验证
    Set<String> redisOnlineDevices = redisTemplate.keys("device:status:ONLINE:*");
    Long redisOnlineCount = redisOnlineDevices != null ? 
        (long) redisOnlineDevices.size() : 0L;
    
    // 3. 状态日志时间窗口验证
    Long recentOnlineCount = deviceStatusLogMapper.selectCount(
        Wrappers.<DeviceStatusLog>lambdaQuery()
            .eq(DeviceStatusLog::getStatus, "ONLINE")
            .ge(DeviceStatusLog::getEventTime, 
                DateUtils.addMinutes(new Date(), -5))  // 5分钟时间窗口
    );
    
    // 4. 综合判定:取最小值确保准确性
    return Math.min(Math.min(baseOnlineCount, redisOnlineCount), recentOnlineCount);
}

🔴 离线设备数

定义

当前无法与云端建立稳定连接、处于失联状态的设备数量,反映网络稳定性和设备健康度。

计算方式

-- 离线设备综合判定
SELECT COUNT(*) AS offline_devices
FROM device d
WHERE d.is_deleted = 0
  AND (
    -- 条件1:设备表状态为离线
    d.status = 'OFFLINE'
    -- 条件2:最后在线时间超过阈值
    OR (d.last_online_time < DATE_SUB(NOW(), INTERVAL 15 MINUTE)
        AND d.status != 'ONLINE')
    -- 条件3:状态日志中最近无在线记录
    OR NOT EXISTS (
      SELECT 1 FROM device_status_log dsl 
      WHERE dsl.device_id = d.device_id 
        AND dsl.status = 'ONLINE'
        AND dsl.event_time >= DATE_SUB(NOW(), INTERVAL 10 MINUTE)
    )
  );

核心代码

/**
 * 离线设备统计 - 多层次判定算法
 */
public DeviceHealthStats calculateOfflineDevices() {
    DeviceHealthStats stats = new DeviceHealthStats();
    
    // 1. 基础离线统计
    Long baseOffline = deviceMapper.selectCount(
        Wrappers.<Device>lambdaQuery()
            .eq(Device::getIsDeleted, 0)
            .eq(Device::getStatus, "OFFLINE")
    );
    
    // 2. 疑似离线设备(状态不一致)
    Long suspectedOffline = deviceMapper.selectCount(
        Wrappers.<Device>lambdaQuery()
            .eq(Device::getIsDeleted, 0)
            .ne(Device::getStatus, "ONLINE")
            .lt(Device::getLastOnlineTime, 
                DateUtils.addMinutes(new Date(), -15))
    );
    
    stats.setTotalOffline(baseOffline + suspectedOffline);
    
    return stats;
}

🔥 活跃设备

定义

在特定时间范围内产生实际业务操作(按摩任务)的设备数量,反映设备的实际使用价值和用户活跃度。

计算方式

-- 活跃设备多时间维度统计
SELECT 
    COUNT(DISTINCT device_id) AS active_devices,
    time_range
FROM (
    -- 今日活跃
    SELECT device_id, 'today' AS time_range
    FROM massage_task 
    WHERE DATE(create_time) = CURDATE()
    
    UNION ALL
    
    -- 本周活跃
    SELECT device_id, 'week' AS time_range  
    FROM massage_task
    WHERE YEARWEEK(create_time) = YEARWEEK(CURDATE())
    
    UNION ALL
    
    -- 本月活跃
    SELECT device_id, 'month' AS time_range
    FROM massage_task
    WHERE YEAR(create_time) = YEAR(CURDATE())
      AND MONTH(create_time) = MONTH(CURDATE())
) AS activity
GROUP BY time_range;

核心代码

/**
 * 活跃设备分析 - 多时间维度统计
 */
public Map<String, ActiveDeviceStats> calculateActiveDevices() {
    Map<String, ActiveDeviceStats> statsMap = new HashMap<>();
    
    // 1. 今日活跃设备
    ActiveDeviceStats todayStats = new ActiveDeviceStats();
    todayStats.setActiveCount(massageTaskMapper.selectTodayActiveDeviceCount(
        DateUtils.getTodayStart(), new Date()));
    statsMap.put("today", todayStats);
    
    // 2. 本周活跃设备
    ActiveDeviceStats weekStats = new ActiveDeviceStats();
    weekStats.setActiveCount(massageTaskMapper.selectActiveDeviceCountByPeriod(
        DateUtils.getWeekStart(), new Date()));
    statsMap.put("week", weekStats);
    
    // 3. 本月活跃设备
    ActiveDeviceStats monthStats = new ActiveDeviceStats();
    monthStats.setActiveCount(massageTaskMapper.selectActiveDeviceCountByPeriod(
        DateUtils.getMonthStart(), new Date()));
    statsMap.put("month", monthStats);
    
    return statsMap;
}

📈 设备在线率

定义

在线设备在总设备中的占比,反映整体设备连接稳定性和网络服务质量,是基础设施健康度的核心指标。

计算方式

-- 设备在线率精确计算
SELECT 
    ROUND(
        (COUNT(CASE WHEN status = 'ONLINE' THEN 1 END) * 100.0 / COUNT(*)),
        2
    ) AS online_rate_percent,
    COUNT(*) AS total_devices,
    COUNT(CASE WHEN status = 'ONLINE' THEN 1 END) AS online_devices
FROM device
WHERE is_deleted = 0
  AND device_id IN (
      SELECT DISTINCT device_id FROM device_status_log 
      WHERE event_time >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
  );  -- 24小时内有状态更新的设备

核心代码

/**
 * 设备在线率计算 - 企业级精度保障
 */
public DeviceOnlineRate calculateOnlineRate() {
    DeviceOnlineRate rate = new DeviceOnlineRate();
    
    // 1. 获取有效设备总数(24小时内有状态更新)
    Long totalValidDevices = deviceMapper.selectCount(
        Wrappers.<Device>lambdaQuery()
            .eq(Device::getIsDeleted, 0)
            .in(Device::getDeviceId, 
                deviceStatusLogMapper.selectRecentActiveDevices(24))
    );
    
    // 2. 获取稳定在线设备数(排除瞬时在线)
    Long stableOnlineDevices = deviceMapper.selectCount(
        Wrappers.<Device>lambdaQuery()
            .eq(Device::getIsDeleted, 0)
            .eq(Device::getStatus, "ONLINE")
            .ge(Device::getLastOnlineTime, 
                DateUtils.addMinutes(new Date(), -30))
    );
    
    // 3. 计算精确在线率
    double onlineRate = totalValidDevices > 0 ? 
        (double) stableOnlineDevices / totalValidDevices * 100 : 0;
    
    rate.setOnlineRate(Math.round(onlineRate * 100) / 100.0);
    rate.setTotalDevices(totalValidDevices);
    rate.setOnlineDevices(stableOnlineDevices);
    
    return rate;
}

💪 设备使用率

定义

在特定时间范围内产生业务价值的设备占比,直接反映设备资产利用效率和投资回报率。

计算方式

-- 设备使用率多维度分析
SELECT 
    -- 基础使用率
    ROUND(
        (COUNT(DISTINCT mt.device_id) * 100.0 / COUNT(DISTINCT d.device_id)),
        2
    ) AS overall_usage_rate
FROM device d
LEFT JOIN (
    -- 设备使用统计子查询
    SELECT 
        device_id,
        COUNT(*) AS daily_tasks,
        SUM(task_time) AS total_duration
    FROM massage_task
    WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)  -- 近7天数据
    GROUP BY device_id
) mt ON d.device_id = mt.device_id
WHERE d.is_deleted = 0;

核心代码

/**
 * 设备使用率深度分析
 */
public DeviceUsageAnalytics analyzeDeviceUsage() {
    DeviceUsageAnalytics analytics = new DeviceUsageAnalytics();
    
    // 1. 基础使用率计算
    Long totalDevices = getTotalDeviceCount();
    Long usedDevices = massageTaskMapper.selectCount(
        Wrappers.<MassageTask>lambdaQuery()
            .select(MassageTask::getDeviceId)
            .ge(MassageTask::getCreateTime, 
                DateUtils.addDays(new Date(), -7))  // 近7天
            .groupBy(MassageTask::getDeviceId)
    );
    
    double basicUsageRate = totalDevices > 0 ? 
        (double) usedDevices / totalDevices * 100 : 0;
    
    analytics.setBasicUsageRate(basicUsageRate);
    analytics.setAnalysisPeriod("7d");
    
    return analytics;
}

🎯 关键业务逻辑说明

数据源说明

  • 设备基础信息:来自 device 表

  • 设备状态:来自 device 表的 status 字段 + device_status_log 表

  • 设备使用记录:来自 massage_task 表

  • 实时状态:来自 Redis 缓存

时间范围定义

  • 今日:从当天00:00:00到当前时间

  • 本周:从当周第一天00:00:00到当前时间

  • 本月:从当月1日00:00:00到当前时间

  • 实时状态:基于设备最后上报状态和时间窗口

数据准确性保障

  • 软删除机制:所有查询都排除 is_deleted = 1 的记录

  • 多源验证:设备表、状态日志、Redis缓存三重验证

  • 时间窗口过滤:5分钟活跃时间窗口,排除瞬时连接

  • 去重计数:活跃设备统计使用 DISTINCT 确保准确性

  • 完整性校验:核心字段非空验证,状态有效性验证

📋 示例数据

指标 计算值 说明
设备总数 156台 系统中所有有效注册设备
在线设备数 128台 当前稳定在线连接的设备
离线设备数 28台 当前离线或连接异常的设备
活跃设备数(今日) 89台 今日有使用记录的设备
设备在线率 82.05% 稳定在线设备占比
设备使用率(7天) 57.05% 近7天有使用记录的设备占比

🔄 更新频率

  • 实时指标:设备状态、在线/离线数量(实时更新)

  • 每日指标:活跃设备、使用率(每日零点重置)

  • 月度指标:月度使用统计(每月1日重置)

  • 健康度评分:每小时计算更新


📊 数据驱动决策 · 🔧 技术保障准确 · 💰 分析创造价值

我们根据提供的1.md文件内容,提取真实数据的计算方式,并按照要求的格式编写README文档。
注意:我们只关注真实数据的计算,假数据部分忽略。
根据1.md文件,我们可以提取每个指标的定义和计算方式(包括SQL和Java代码)。
我们将按照以下结构组织每个指标:

  • 定义

  • 计算方式(包括SQL和Java代码片段)

但是,请注意,1.md文件中有些指标有多个计算维度(例如活跃设备有今日、本周、本月),在README中我们重点说明核心计算逻辑。

由于README要求重点解释真实数据的计算方式,我们将从1.md中提取真实数据计算的部分,忽略假数据部分。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐