6.4 KiB
6.4 KiB
RailwaySystem Electronic Board Demo-Safe Cleanup (V2 闭环版) 实施报告
1. 任务背景与集成基线
本任务目标为 RailwaySystem Electronic Board Demo-Safe Cleanup:
- 基线对齐:切换至正式受控集成分支
integration/delivery-cicd-20260914(commitc763cb691c4a48a0a01339de83731a99ed9311e6),在新分支fix/demo-electronic-board-cleanup-v2下开发。 - 结构对齐:与已在数据库执行的 Database V2 (
public.train_electronic_board) 真实物理结构完全对齐; - 界面清洁:前端管理页面彻底消除裸露的数据库表名、列名、主键 ID 及枚举裸数值;
- 生命周期写保护:
boardStatus/lastHeartbeat均为设备运行只读字段;- 前端表单中彻底删除
boardStatus与lastHeartbeat,避免管理员人工篡改; - 后端新增时显式初始化
boardStatus = 0(离线); - 后端编辑时写保护:强制置空防篡改,保留数据库原值;
- boardId 闭环:前端不传
boardId,后端 Service 自动生成唯一 UUID,实现 INSERT 与 GET 闭环; - 逻辑删除:DELETE 操作统一使用
UPDATE ... SET del_flag = '2'软删除,所有查询(包含教室聚合)强制排除del_flag = '2'; - 教室聚合无回归:完全保持 CG-05 裁决的轻量
ClassroomBoardSummaryVO契约,既有聚合行为 100% 正常; - 不伪造能力:不伪造不存在的设备心跳上报、不伪造协议/MQTT、不添加假“在线心跳模拟”按钮。
2. 真实数据库 V2 结构验证 (Kingbase 元数据)
通过直连 Kingbase 只读查询 information_schema.columns、information_schema.table_constraints、information_schema.key_column_usage,确认当前 public.train_electronic_board 的实际元数据如下:
2.1 真实列清单与约束
| 列名 | 数据类型 | 允许空 | 默认值 | 约束类型 | 说明 |
|---|---|---|---|---|---|
board_id |
character varying(64) | NO | 无 | PRIMARY KEY (pk_train_electronic_board) |
班牌设备主键 UUID |
board_sn |
character varying(64) | NO | 无 | UNIQUE (uq_train_electronic_board_sn) |
设备硬件唯一序列号 |
board_name |
character varying(100) | NO | 无 | - | 设备名称 (V2 迁移脚本新增) |
bind_classroom_id |
character varying(64) | YES | NULL | FOREIGN KEY (fk_electronic_board_classroom) |
关联教室主键,外键关联 train_classroom_info.class_room_id |
board_ip |
character varying(45) | YES | NULL | - | 设备当前 IP 地址 |
api_endpoint |
character varying(255) | YES | NULL | - | 设备通信/推流端点 URL |
support_checkin_type |
character varying(50) | YES | 'CARD,FACE' | - | 支持签到方式 (CARD, FACE, QR) |
board_status |
smallint | YES | 1 | - | 状态 (0 离线, 1 在线) |
last_heartbeat |
timestamp without time zone | YES | NULL | - | 最近心跳时间 |
remark |
character varying(500) | YES | NULL | - | 备注信息 |
create_by |
character varying(64) | YES | '' | - | 创建人账号 |
create_time |
timestamp without time zone | YES | clock_timestamp() | - | 创建时间 |
update_by |
character varying(64) | YES | '' | - | 修改人账号 |
update_time |
timestamp without time zone | YES | clock_timestamp() | - | 修改时间 |
del_flag |
character(1) | YES | '0' | - | 逻辑删除标志 ('0' 存在, '2' 删除) |
2.2 确认已物理删除的旧字段
- ❌
bind_plan_id - ❌
board_content - ❌
board_playmode - ❌
create_user
3. 后端最小兼容整改明细
3.1 实体模型对齐 (TrainElectronicBoard.java)
- 剔除
bindPlanId、boardContent、boardPlaymode、createUser。 - 补充
boardName、apiEndpoint、delFlag。 - 标注
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")。
3.2 映射器对齐与逻辑删除 (TrainElectronicBoardMapper.xml)
- 彻底剔除不存在的旧列,加入
board_name与api_endpoint。 - 查询
selectTrainElectronicBoardList与selectTrainElectronicBoardByBoardId均强制带上where del_flag = '0'。 - 逻辑删除:
<update id="deleteTrainElectronicBoardByBoardId" parameterType="String"> update train_electronic_board set del_flag = '2', update_time = clock_timestamp() where board_id = #{boardId} </update>
3.3 业务服务层写保护与主键闭环 (TrainElectronicBoardServiceImpl.java)
- boardId 生成位置:在
insertTrainElectronicBoard中:if (StringUtils.isEmpty(trainElectronicBoard.getBoardId())) { trainElectronicBoard.setBoardId(IdUtils.fastSimpleUUID()); } trainElectronicBoard.setBoardStatus(0); // 显式初始化为离线 - boardStatus / lastHeartbeat 写保护位置:在
updateTrainElectronicBoard中:trainElectronicBoard.setBoardStatus(null); trainElectronicBoard.setLastHeartbeat(null);
3.4 控制器与接口兼容 (TrainElectronicBoardController.java)
- 路由基路径:
@RequestMapping("/train/board")。 - 权限保持系统正式权限:
@ss.hasPermi('system:board:...')。
4. 前端表单与列表重构 (build_ui/src/views/train/board/index.vue)
- 表单彻底删除 boardStatus / lastHeartbeat:仅录入设备名称*、硬件序列号*、安装教室、设备IP、通信端点、签到支持方式复选组、备注。
- 列表优雅展示:安装教室根据 ID 映射显示
roomName;状态 Tag 化(绿标签“在线”/灰标签“离线”);心跳空显示“—”。
5. KingbaseES 9 步最小 Smoke Test 实测结果
在直连真实 KingbaseES 测试(BoardSmokeTest.java)中执行全部 9 项测试,结果全绿:
- 新增 Board(不传 boardId):Service 生成 UUID 并成功执行 INSERT。
- 查询 Board:验证存在,初始
board_status为 0(离线),last_heartbeat为 NULL。 - 修改业务字段:名称与 IP 成功更新。
- 确认写保护:修改无法人为篡改
boardStatus与lastHeartbeat,DB 原值完好。 - 删除 Board:执行软删除 UPDATE。
- DB 物理验证:底层行记录仍存在,
del_flag成功标记为'2'。 - 业务 list 验证:业务 list 查询自动排除,已不再返回该设备。
- 新增绑定教室 Board:成功插入绑定测试教室的班牌。
- Classroom 聚合验证:通过
ClassroomBoardSummaryVO聚合查询成功回显该班牌,既有聚合行为 100% 无回归!