# 后端开发规则 本文件适用于 `BatteryDetection`。同时遵守父目录 `AGENTS.md` 的项目不变量。 ## 模块边界 - `ruoyi-device` 负责厂商无关设备接口、BTS 协议实现、模拟器契约和采集调度。协议 XML、TCP 帧、固定地址和厂商枚举停留在该模块内部。 - `ruoyi-system` 负责测试业务、状态聚合、事务、持久化和审计;它依赖设备抽象,不解析 BTS XML。 - `ruoyi-admin` 只负责应用装配及 REST/SSE 控制器,不承载采集或状态机业务。 - 第一阶段打包为一个后端进程,并明确保持单采集实例。适配器租约字段只为后续高可用预留。 ## 设备路径 - 每个设备适配器实例从数据库读取名称、类型、主机、端口、启停、轮询周期、时区和能力,不在代码中固定连接参数。 - 每个实例只有一个串行请求队列;一次 `inquire` 批量查询需监测通道。状态查询默认每 5 秒。 - 连接拒绝、响应超时、断线和后端重启只记录设备/请求异常并继续观测,不自动恢复或追回历史数据。 - 解析器拒绝 DOCTYPE/外部实体,限制响应大小,并显式处理缺字段、非法数值和未知枚举。 - 协议报文压缩保存到文件系统,数据库仅保存索引、校验值和解析结果;普通报文保留 30 天,解析失败或冲突报文保留 180 天。 ## 业务事务 - 开始接收在一个事务内校验全部检测柜和采集器在线可观测及必填映射完整;任一条件失败则整体回滚。暂停接收停止该测试的数据请求,继续接收恢复请求,停止测试进入检测完成并释放业务占用。 - 检测柜通道允许运行中接入;同一次设备运行可依次服务多个测试,只有请求期间成功接收且可可靠归属的数据写入测试。 - 停止测试或设备自然结束后直接进入“检测完成”;成功接收的数据追加保存,缺失、序号跳跃和采样间隔异常只作为可见事实。 - “检测完成”是新流程唯一不可恢复终态;异常处理和负责人转交都追加审计,数据缺失不进入系统恢复责任。 - 相同“测试 + 字段 + 阈值规则”在人工关闭前聚合为一条开放测试预警异常;正常观测不自动关闭,关闭后再次超限创建新异常。 ## 数据库迁移 - 开发数据库是 WSL 内 Docker 的 MySQL 8,通过 Windows 端口映射 `127.0.0.1:3307/battery_detection` 访问。连接配置保留可覆盖能力,部署环境通过参数提供凭据。 - 已应用的 `V1`、`V2`、`V3` 迁移是不可变基线。任何结构或种子变化新增下一个 `V__description.sql`,不要改写已应用脚本或整库导出文件。 - 迁移必须可从空库顺序执行,并可在已迁移库重复启动。迁移不得导入演示设备、演示测试、采样数据或历史日志。 - 项目排除了默认 `DataSourceAutoConfiguration`;Flyway 在 `FlywayMigrationConfig` 中使用独立 JDBC 连接,并且 `dynamicDataSource` 必须等待迁移完成。 - 修改迁移前先只读检查目标库和 `flyway_schema_history`。清库、覆盖或修复迁移历史需要用户明确授权。 ## API 与实时流 - 普通提交和历史数据查询使用 REST;实时快照、状态变化和异常使用 `SseEmitter`。 - SSE 只保留每测试每数据来源最新快照。设备状态、接收状态、测试状态和异常变化不可合并;发送失败关闭连接。重连先发当前事实,历史由 REST 查询。 - 权限由后端统一执行。创建人、负责人和管理员是独立字段和角色;不要依赖前端隐藏按钮实现授权。 - API 时间输出 ISO 8601 带时区,测量值同时返回明确单位。 ## 验证 - 设备协议或调度改动至少覆盖正常多通道、拒绝连接、断线、超时、畸形 XML 和实时数据幂等冲突等受影响场景。 - 运行设备模块测试:`mvn -pl ruoyi-device test`。 - 跨模块改动运行全量测试:`mvn test`。 - 验证可执行包:`mvn -pl ruoyi-admin -am package -DskipTests`。启动验证时使用可写的 `LOG_PATH`,完成后停止临时进程。 - 浏览器主接缝由前端仓库 `npm run test:e2e:ticket04` 编排隔离 MySQL 8、Redis、完整可执行包和模拟器;不得连接共享开发库或复用已有服务端口。