From 3193d5e739199b201e7602474f9842a645793014 Mon Sep 17 00:00:00 2001 From: qsc20001102 Date: Sat, 11 Jul 2026 17:27:15 +0800 Subject: [PATCH] 11 --- 开发文档/spec-历史数据.md | 27 +++++++------------- 开发文档/spec-数据管理.md | 53 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 22 deletions(-) diff --git a/开发文档/spec-历史数据.md b/开发文档/spec-历史数据.md index 06aa1aa..4d102be 100644 --- a/开发文档/spec-历史数据.md +++ b/开发文档/spec-历史数据.md @@ -70,8 +70,7 @@ CREATE STABLE IF NOT EXISTS collection_data ( ) TAGS ( device_id VARCHAR(32), device_name VARCHAR(128), - data_type VARCHAR(16), - unit VARCHAR(32) + data_type VARCHAR(16) ); ``` @@ -91,8 +90,7 @@ CREATE STABLE IF NOT EXISTS computed_data ( point_name VARCHAR(128), source VARCHAR(32) -- 数据来源: 'ai_model', 'manual_input', 'external' 等 ) TAGS ( - category VARCHAR(32), -- 类别,如 'aeration', 'dosing', 'prediction' - unit VARCHAR(32) + category VARCHAR(32) -- 类别,如 'aeration', 'dosing', 'prediction' ); ``` @@ -150,7 +148,6 @@ CREATE STABLE IF NOT EXISTS computed_data ( "name": "曝气池DO_01", "type": "collection", // 或 'computed'(预留) "data_type": "REAL", - "unit": "mg/L", "device_id": "device-uuid", "device_name": "一期曝气柜PLC", "group_name": "曝气池", @@ -189,13 +186,13 @@ CREATE STABLE IF NOT EXISTS computed_data ( ```sql -- 创建数据库时指定保留天数 -CREATE DATABASE IF NOT EXISTS water_plant +CREATE DATABASE IF NOT EXISTS aquacontrolai KEEP 365 -- 数据保留天数(对应配置值) DAYS 10 -- 每10天一个文件 BLOCKS 100; -- 修改保留天数(当用户在系统配置中修改时执行) -ALTER DATABASE water_plant KEEP 730; +ALTER DATABASE aquacontrolai KEEP 730; ``` ### 4.3 注意 @@ -238,7 +235,6 @@ Response (200): "name": "曝气池DO_01", "type": "collection", "data_type": "REAL", - "unit": "mg/L", "device_id": "device-uuid-1", "device_name": "一期曝气柜PLC", "latest_value": 2.35, @@ -250,7 +246,6 @@ Response (200): "name": "曝气池温度", "type": "collection", "data_type": "REAL", - "unit": "℃", "device_id": "device-uuid-1", "device_name": "一期曝气柜PLC", "latest_value": 25.1, @@ -314,7 +309,6 @@ Response (200): { "point_id": "point-uuid-1", "point_name": "曝气池DO_01", - "unit": "mg/L", "data_type": "REAL", "data": [ { "ts": "2026-07-09T00:00:01+08:00", "value": 2.35, "quality": "good" }, @@ -327,7 +321,6 @@ Response (200): { "point_id": "point-uuid-2", "point_name": "曝气池温度", - "unit": "℃", "data_type": "REAL", "data": [ { "ts": "2026-07-09T00:00:01+08:00", "value": 25.1, "quality": "good" }, @@ -399,7 +392,6 @@ Response (200): { "point_id": "point-uuid-1", "point_name": "曝气池DO_01", - "unit": "mg/L", "data": [ { "value": 2.35, "quality": "good" }, { "value": 2.40, "quality": "good" }, @@ -413,7 +405,6 @@ Response (200): { "point_id": "point-uuid-2", "point_name": "曝气池温度", - "unit": "℃", "data": [ { "value": 25.1, "quality": "good" }, { "value": 25.0, "quality": "good" }, @@ -446,7 +437,7 @@ Response:CSV文件(Content-Type: text/csv; charset=utf-8-sig) CSV格式: ```csv -时间,曝气池DO_01(mg/L),曝气池DO_01_质量,曝气池温度(℃),曝气池温度_质量 +时间,曝气池DO_01,曝气池DO_01_质量,曝气池温度,曝气池温度_质量 2026-07-09 00:00:00,2.35,good,25.1,good 2026-07-09 00:10:00,2.40,good,25.0,good 2026-07-09 00:20:00,—,—,25.3,good @@ -513,7 +504,7 @@ CSV格式: **场景举例**: -同时展示两条曲线,一条 DO 值在 2.0~3.0 mg/L,一条温度在 20~30℃。如果Y轴从0均匀到30,DO曲线会被压缩成一条几乎水平的直线,完全看不出变化。 +同时展示两条曲线,一条 DO 值在 2.0~3.0,一条温度在 20~30。如果Y轴从0均匀到30,DO曲线会被压缩成一条几乎水平的直线,完全看不出变化。 **实现方式 — 分段映射法**: @@ -573,7 +564,7 @@ p = sum( previous_segment_heights ) + (v - segment_start) / (segment_end - segme | 数值标签 | 显示原始数值,不显示映射后的坐标值 | | 刻度位置 | 刻度线在Y轴上的物理位置由映射函数决定,不是均匀分布 | | 刻度数量 | 自动控制,保持5~10个刻度标签,避免过密 | -| 单位标注 | Y轴标题显示 `数值 (单位)`,如 `mg/L` | +| 标题标注 | Y轴标题显示 `数值` | | 分段视觉提示 | 在Y轴背景上用浅色横条标记不同分段区域,帮助用户识别分段边界 | #### 6.3.3 折线规则 @@ -632,7 +623,7 @@ p = sum( previous_segment_heights ) + (v - segment_start) / (segment_end - segme │ (复选框) │ 间隔: [10分钟] ▼ │ │ │ │ │ ☑ 曝气池 │ ┌──────────────────────────────────┐ │ -│ ☑ DO │ │ 时间 │ DO(mg/L)│ 温度(℃)│ │ +│ ☑ DO │ │ 时间 │ DO │ 温度 │ │ │ ☐ 温度 │ │──────────────┼─────────┼────────│ │ │ ☐ 加药间 │ │ 00:00:00 │ 2.35 │ 25.1 │ │ │ │ │ 00:10:00 │ 2.40 │ 25.0 │ │ @@ -750,4 +741,4 @@ p = sum( previous_segment_heights ) + (v - segment_start) / (segment_end - segme --- > 本文档版本:v1.0 -> 最后更新:2026-07-09 \ No newline at end of file +> 最后更新:2026-07-09 diff --git a/开发文档/spec-数据管理.md b/开发文档/spec-数据管理.md index c9ea676..b8ec2d1 100644 --- a/开发文档/spec-数据管理.md +++ b/开发文档/spec-数据管理.md @@ -662,6 +662,52 @@ CREATE INDEX idx_write_points_group ON write_points(group_name) WHERE deleted = | POST | /api/v1/write-points/export | 导出CSV | | POST | /api/v1/write-points/import | 从CSV导入 | | POST | /api/v1/write-points/{id}/write | 执行写入操作(人工/程序自动均使用此接口) | +| GET | /api/v1/write-logs | 查询写入操作日志 | + +**GET /api/v1/write-logs** — 查询写入操作日志 + +Query parameters: + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| page | int | 否 | 默认1 | +| page_size | int | 否 | 默认20,最大100 | +| point_id | string | 否 | 按写入点筛选 | +| device_id | string | 否 | 按设备筛选 | +| source | string | 否 | 筛选 manual/auto | +| result | string | 否 | 筛选 success/failed | +| start_time | string | 否 | 开始时间 | +| end_time | string | 否 | 结束时间 | +| keyword | string | 否 | 搜索 operator 或 point_name | + +Response (200): + +```json +{ + "total": 500, + "page": 1, + "page_size": 20, + "items": [ + { + "id": "uuid", + "point_id": "uuid", + "point_name": "加药泵频率", + "device_id": "uuid", + "device_name": "一期加药间PLC", + "address": "DB2.10", + "data_type": "REAL", + "source": "manual", + "target_value": "20.5", + "readback_value": "20.5", + "result": "success", + "error_message": null, + "operator": "张三", + "reason": "AI推荐加药量调整", + "created_at": "2026-07-09T10:00:00+08:00" + } + ] +} +``` #### 4.2.2 写入接口详细定义 @@ -903,8 +949,7 @@ CREATE STABLE IF NOT EXISTS collection_data ( ) TAGS ( device_id VARCHAR(32), -- 设备ID device_name VARCHAR(128), -- 设备名称 - data_type VARCHAR(16), -- 原始数据类型 - unit VARCHAR(32) -- 单位(可选,由采集点配置扩展) + data_type VARCHAR(16) -- 原始数据类型 ); ``` @@ -917,7 +962,7 @@ CREATE STABLE IF NOT EXISTS collection_data ( -- 子表名: a1b2c3d4e5f64a7b8c9d0e1f2a3b4c5d CREATE TABLE IF NOT EXISTS a1b2c3d4e5f64a7b8c9d0e1f2a3b4c5d USING collection_data TAGS ( - 'device-uuid', '一期曝气柜PLC', 'REAL', 'mg/L' + 'device-uuid', '一期曝气柜PLC', 'REAL' ); ``` @@ -1173,4 +1218,4 @@ func GetProtocol(protocolType string) (ProtocolDriver, error) { --- > 本文档版本:v1.1 -> 最后更新:2026-07-09 \ No newline at end of file +> 最后更新:2026-07-09