状态:设计稿,未改代码。确认后再进入实施。 本版调整:标注改为“段记录 + 15 分钟色块显示”;PKS 单击整小时、连续小时合并;双击弹窗改类型/看算法属性/改起止/删除;不设正常段;时间轴汇总所有子图。
tag-manual。compressor_alarm。wave_annotation,最后迁移。“预训练记录”整套:前端记录/删除按钮、/api/pretrain-records、pretrain_service.py、backend/预训练之文件头.csv、pretrainCounts。
标注目标 = 目标类型 + 通道 + 标签段(start_time, end_time)
| 目标类型 | 通道 channel_key | target_key |
|---|---|---|
wave_file |
`wave:{device_part} | {device_point}` |
pks |
pks:{unit}:{device_code}:{metric_key} |
同 channel_key |
YSJ_11)一个独立通道、独立标注行。[start_time, end_time)。start_time/end_time 对齐 15 分钟;PKS 人工标注默认整小时。只保留异常级别,与现有算法一致:
轻微 / 异常 / 严重异常
label_subtype 存振动侧、温度部位、方向等;features_json 存算法原始属性。
每个子图上方一行,高度约一行文本(18–20px):
┌──────────── 子图标题 ────────────┐
│ 异常 │ [异常][异常][ ][轻微][轻微] │ ← 左侧显示当前设置的类
├──────────────────────────────────┤
│ 波形子图 │
└──────────────────────────────────┘
异常(可改)。双击任意块打开弹窗,内容:
机组、批次、周期编号、压力阶段、开始小时、结束小时、
持续自然小时数、有效运行小时数、周期基线油压、正常波动带、
阶段开始小时油压、阶段结束小时油压、阶段最低小时油压、
阶段开始/结束相对周期基线变化、阶段最大连续下降有效小时数、
阶段低报警小时数、阶段低低报警小时数、是否形成确认等级、阶段触发依据
保存后:
origin=manual,算法重复导入不覆盖。CREATE TABLE IF NOT EXISTS compressor_label (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
source_type VARCHAR(32) NOT NULL COMMENT 'vibration/oil_pressure/temperature/pressure_wave/pks_manual',
origin VARCHAR(16) NOT NULL DEFAULT 'manual' COMMENT 'algorithm/manual/imported',
target_type VARCHAR(16) NOT NULL COMMENT 'wave_file/pks',
target_id BIGINT UNSIGNED NULL COMMENT 'wave_file.id',
target_key VARCHAR(200) NOT NULL COMMENT 'wave:{id} / pks:{unit}:{code}:{metric}',
channel_key VARCHAR(200) NOT NULL COMMENT '子图通道键',
segment_key VARCHAR(128) NULL COMMENT '算法原始段分组键',
unit VARCHAR(16) NOT NULL,
device_code VARCHAR(64) NULL,
device_part VARCHAR(200) NULL,
device_point VARCHAR(200) NULL COMMENT 'wave 点位',
metric_key VARCHAR(64) NULL COMMENT 'PKS: YSJ_11',
metric_label VARCHAR(200) NULL COMMENT 'PKS: 链轮端振动',
start_time DATETIME NOT NULL COMMENT '标签段起点,15min/小时对齐',
end_time DATETIME NOT NULL COMMENT '标签段终点(不含)',
algorithm_start DATETIME NULL COMMENT '算法原始段起点',
algorithm_end DATETIME NULL COMMENT '算法原始段终点',
label_type VARCHAR(32) NOT NULL COMMENT '轻微/异常/严重异常',
label_subtype VARCHAR(64) NULL,
severity TINYINT NULL,
confirm_status VARCHAR(16) NOT NULL DEFAULT '未确认',
usable_for_train TINYINT(1) NOT NULL DEFAULT 1,
source_file VARCHAR(500) NULL,
source_row VARCHAR(64) NULL,
algorithm_version VARCHAR(64) NULL,
features_json MEDIUMTEXT NULL COMMENT '算法原始属性',
note VARCHAR(1000) NULL,
created_by VARCHAR(64) NULL,
updated_by VARCHAR(64) NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at DATETIME NULL,
PRIMARY KEY (id),
KEY idx_target_time (target_key, start_time, end_time),
KEY idx_channel_time (channel_key, start_time),
KEY idx_segment (segment_key),
KEY idx_unit_time (unit, start_time),
KEY idx_source (source_type, origin)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '统一训练标签表';
说明:
(target_key, slot_start) 唯一键,因为要支持跨多槽的段和合并。新增或修改时,取同 target_key(同一子图通道)下与 [start,end) 重叠或相邻的记录:
- 类型相同(重叠或相邻) -> 合并为一条,start=min, end=max
- 类型不同(重叠或相邻) -> 拒绝,提示先修改/删除相邻记录
- 不同 target_key/通道互不影响,各自独立
不存在 -> 插入
origin=manual -> 跳过
origin=algorithm -> 更新
算法不动,新增转存程序:
读取 CSV -> 生成段记录 -> UPSERT compressor_label
| 来源 | source_type | metric_key | label_type | 时间 |
|---|---|---|---|---|
| 振动异常段.csv | vibration | 链轮端→YSJ_11,联轴器端→YSJ_10 | 振动阶段 | 开始/结束小时 |
| 润滑油压力小时阶段段.csv | oil_pressure | 7/8/9 号机→YSJ_5 | 压力阶段 | 开始/结束小时 |
| 温度异常段.csv | temperature | 阶段点位 YSJ_n → YSJ{unit}_n | 温度阶段 | 开始/结束小时 |
字段映射:
label_subtype:振动侧 / 温度部位 / 方向 / 特征类型。confirm_status:由“是否形成确认等级”映射。source_row:周期编号。features_json:整行原样 JSON。segment_key:来源 + 周期编号 + 起止时间。正常样本不导入、不生成。
GET /api/labels?target_type=&unit=&device_code=&metric_key=&start=&end=
GET /api/labels?wave_file_ids=...
POST /api/labels 新增(自动合并)
PUT /api/labels/{id} 改类型/起止/备注(自动合并或拆分)
DELETE /api/labels/{id} 删除段
返回:
{
"id": 12,
"targetType": "pks",
"targetKey": "pks:7:7#:YSJ_11",
"startTime": "2026-02-10T10:00:00",
"endTime": "2026-02-10T12:00:00",
"labelType": "异常",
"labelSubtype": "链轮端",
"origin": "algorithm",
"confirmStatus": "已确认",
"features": { "...": "算法原始属性" }
}
前端按钮/状态、后端接口/service/CSV/pretrainCounts。不动 wave_annotation。
建表、转存三张 CSV、查询接口、标注行只读展示。
单击新增/整小时选择/连续合并;双击弹窗改类型、起止、看算法 JSON、删除;先 wave 后 PKS。
导出 usable_for_train=1;迁移 wave_annotation;下线老逻辑。
使用 Playwright + Chrome 对 Phase 1–3 做了界面回归:
/api/pretrain-records 返回 404。异常,成功。