zzw
5 小时以前 ce841ddf85c48bae32f9e3068403fdfe98ac8711
HANDOFF.md
@@ -1,7 +1,8 @@
# HANDOFF:临抢修软件需求与第一版实现
> 交接日期:2026-08-25(2026-08-26 晚 / 2026-09-07 / 2026-09-08 / 2026-09-09 核对 / 2026-09-10 / 2026-09-11 / 2026-09-14 / 2026-09-16 / 2026-09-17 / 2026-09-28 新会话准备 / 2026-09-28 专业配置与故障编号自动生成 / 2026-09-29 代码入库公司 Git 更新)| 用途:新开会话时先读本文件,即可无缝接续
> 项目目录:`C:\Users\jcxiong\Documents\Codex\MyProject\EmergencyRepair`
> 交接日期:2026-08-25(2026-08-26 晚 / 2026-09-07 / 2026-09-08 / 2026-09-09 核对 / 2026-09-10 / 2026-09-11 / 2026-09-14 / 2026-09-16 / 2026-09-17 / 2026-09-28 新会话准备 / 2026-09-28 专业配置与故障编号自动生成 / 2026-09-29 代码入库公司 Git 更新 / 2026-10-02 本机环境迁移与前后端启动)| 用途:新开会话时先读本文件,即可无缝接续
> 项目目录(2026-10-02 起为本机 `D:\projectJava\lqx`;行内旧路径 `C:\Users\jcxiong\Documents\Codex\MyProject\EmergencyRepair` 为上一台机器)
> 注意:2026-10-02 本机工具链与旧记录不同,构建、启动与工作方式约定以第 16 节为准。
## 0. 最新交接(2026-09-28 新会话准备,优先阅读)
@@ -288,14 +289,14 @@
### 0.10 2026-09-28 专业配置与故障编号自动生成(本次会话,已实现并验证)
用户本次给出的 4 条新需求:① 系统管理增加“工程专业配置”(字段仅名称);② 系统管理增加“T队专业配置”(字段名称、分类 A/B);③ 故障编号不再手工输入,改为按 `潜1基-X号/A-YYMMDD-nnn` 自动生成;④ 派单号为 `故障编号/nn`,承修单位序号从 01 起。
用户本次给出的 4 条新需求:① 系统管理增加“工程专业配置”(字段仅名称);② 系统管理增加“T队专业配置”(字段名称、分类 A/B);③ 故障编号不再手工输入,改为按 `固定前缀-X号/A-YYMMDD-nnn` 自动生成;④ 派单号为 `故障编号/nn`,承修单位序号从 01 起。
已实现:
- “工程专业配置”:菜单 `/system/engineering-majors`,字段仅“名称”;表 `LX.T_ENGINEERING_MAJOR(ID, NAME, CREATE_TIME, UPDATE_TIME)`;接口 `/api/system/engineering-majors`(GET/POST/PUT/DELETE)。
- “T队专业配置”:菜单 `/system/team-majors`,字段“名称、分类(A/B)”;表 `LX.T_TEAM_MAJOR(ID, NAME, CATEGORY, CREATE_TIME, UPDATE_TIME)`;接口 `/api/system/team-majors`(GET/POST/PUT/DELETE)。
- 两处配置均校验名称非空与重名;T队专业分类只允许 A/B。启动时 `DataInitializer.ensureMajorConfigMenus` 幂等补菜单,`seedMajors` 预置演示数据:工程专业 动力/电气/液压/辅机;T队专业 动力=A、液压=A、电气=B、辅机=B(默认拆分,可在页面修改)。
- 故障编号自动生成:`BusinessService.generateFaultCode`,格式 `潜1基-X号/分类-YYMMDD-nnn`。
  - 前缀固定 `潜1基-`;X号取 3 位数字(`X01` → `001`)。
- 故障编号自动生成:`BusinessService.generateFaultCode`,格式 `固定前缀-X号/分类-YYMMDD-nnn`。
  - 前缀固定 `固定前缀-`;X号取 3 位数字(`X01` → `001`)。
  - 分类取“T队专业配置”的 A/B;未配置或分类非法时保存报错并提示先行维护。
  - YYMMDD 取上报日期;nnn 为“同一 X号 + 同一 T队专业 + 同一上报日期”的序号,从 001 起。
  - 新建自动生成;修改时强制沿用原编号(改 T队专业/日期也不重新生成)。
@@ -308,8 +309,8 @@
验证(2026-09-28):
- 后端 `mvn -q -DskipTests package` 通过;前端 `vue-cli-service build` 通过(仅既有包体积提示)。
- 接口:工程专业、T队专业各返回 4 条;`/api/system/menu/nav` 系统管理下新增两项(排序 35/36)。
- 自动编号:`X02 + 动力专业(A) + 2026-09-28` → `潜1基-002/A-260928-001`、`潜1基-002/A-260928-002`;换 T队专业(电气 B)→ `潜1基-002/B-260928-001`;换上报日期 → `潜1基-001/A-260929-001`;修改故障改 T队专业后编号保持不变。
- 派单端到端:一条故障分配两个承修单位,生成 `潜1基-002/B-260928-001/01`、`.../02`。测试数据已从 `LX.T_FAULT`、`LX.T_WORK_ORDER` 清理。
- 自动编号:`X02 + 动力专业(A) + 2026-09-28` → `固定前缀-002/A-260928-001`、`固定前缀-002/A-260928-002`;换 T队专业(电气 B)→ `固定前缀-002/B-260928-001`;换上报日期 → `固定前缀-001/A-260929-001`;修改故障改 T队专业后编号保持不变。
- 派单端到端:一条故障分配两个承修单位,生成 `固定前缀-002/B-260928-001/01`、`.../02`。测试数据已从 `LX.T_FAULT`、`LX.T_WORK_ORDER` 清理。
- 浏览器:两个新配置页正常渲染;故障上报新增表单“故障编号”只读且占位“保存后自动生成”,T队专业/工程专业下拉为配置项;修复后控制台无新增报错。
- 历史演示故障仍使用 `GZ-2026-0xx` 旧编号(未迁移,避免影响已派工单引用);新建故障一律使用新规则。
- 文档已同步:`requirement\决策表_待确认项.md`、`前44页需求梳理.md`、`工程状态机设计.md`、`界面还原.html`,以及首页公告“派单规则”文案。
@@ -645,7 +646,7 @@
**本次会话完成(细节见 0.10 / 0.11)**
- 决策表 B1–B4 按建议关闭并落地:系统管理新增“工程专业配置”(字段:名称)、“T队专业配置”(字段:名称、分类 A/B)。
- 故障编号改为自动生成:`潜1基-X号/A-YYMMDD-nnn`(X号 3 位数字,A=T队专业 A/B,nnn 为同一 X号+同一专业+同一上报日期内从 001 递增);派单号=`故障编号/nn`(承修单位序号,从 01 起)。
- 故障编号改为自动生成:`固定前缀-X号/A-YYMMDD-nnn`(X号 3 位数字,A=T队专业 A/B,nnn 为同一 X号+同一专业+同一上报日期内从 001 递增);派单号=`故障编号/nn`(承修单位序号,从 01 起)。
- 故障上报页:任务状态标签与任务状态下拉框拆成两行(标签换到下一行)。
- 完工信息上报页(AXU15):修后质量情况独占整行;项目名称与验收方式同一行;故障说明、原因分析各独占整行;“处理解决情况”改为可多行的表格(序号/处理解决情况);维修器材表列改为序号、名称、规格型号、技术参数、数量、计量单位、合格证明、出库单号、来源、备注。后端新增 `LX.T_COMPLETION_INFO.SOLUTIONS_JSON` 与 `MaterialItem.certificate`,并继续兼容原 `SOLUTION` 字段。
- 项目纳入公司 Git 仓库:`http://admin@61.183.254.94:3000/r/EmergencyRepair.git`,分支 `main`,首提交 `5305262`(103 个文件),随后 `0bacdcf` 补记远端信息。
@@ -660,3 +661,334 @@
2. 决策表 B6–B10 待用户答复(`requirement\工程状态机设计.md` 第 4 节 + `requirement\决策表_待确认项.md` B 组),答完固化为正式设计。
3. AXU15 剩余待确认:字段来源与可改性(待确认清单第 13 条)、完工验收各环节角色与打印输出、修后质量评级与 AXU14 T员评分字段的关系。
4. 后续改动完成后直接推送到公司 Git 仓库 `main` 分支。
## 16. 收尾快照(2026-10-02 周五,本机环境迁移与前后端启动)
**环境迁移(重要,与第 0 节旧记录不同)**
- 代码已在本机重新拉取,工作目录改为 `D:\projectJava\lqx`,不再是 `D:\Codex\MyProject\EmergencyRepair`。
- 仓库:`http://61.183.254.94:3000/r/EmergencyRepair.git`,分支 `main`,本地 HEAD `5d015d7`(docs: add shutdown snapshot for 2026-09-29),与 `origin/main` 一致。
- 克隆时远端 HEAD 指向不存在的 ref,不会自动检出,需手动 `git checkout main`。凭据已存入 Windows 凭据管理器,`.git/config` 中不再有明文密码。
- 本机工具链与旧机器不同,**第 0.9 节和第 8 节里“`apply_patch` 不可用、必须用 Python 读改写、不能用 `Start-Process`”的约定只适用于上一台机器**,本机 `apply_patch` 与 `Start-Process` 均可正常使用。
- JDK:`C:\Program Files\Java\jdk1.8.0_172`。PATH 里的 java 是 JRE 1.8.0_481(没有 javac),构建前必须显式设置 `JAVA_HOME`。
- Maven:`D:\solidDir\apache-maven-3.6.1\bin\mvn.cmd`(不在 PATH,需绝对路径调用)。
- Node/npm:`C:\Program Files\nodejs`(Node v14.8.0 / npm 6.14.7,不在 PATH,需绝对路径调用)。
- 达梦驱动 `dm.jdbc:DmJdbcDriver18:1.0` 在默认本地仓库缺失(只有下载失败标记),已从 `D:\solidDir\repo` 同名构件安装进 `C:\Users\Lenovo\.m2`;属环境准备,未改项目文件。
- DM8:服务 `DmServiceDMSERVER` 运行中,监听 `127.0.0.1:5236`(PID 5692),账号 `SYSDBA/SYSDBA`,schema `LX`。
**本次完成的构建与运行**
- 后端 `mvn -B -DskipTests clean package` 通过,产物 `emergency-repair-server\target\emergency-repair-server-1.0.0-SNAPSHOT.jar`(约 27MB)。
- 前端 `npm install` + `npm run build` 通过,产物 `emergency-repair-web\dist`,仅两个既有包体积告警。
- 后端用 `java -jar target\emergency-repair-server-1.0.0-SNAPSHOT.jar` 后台运行,监听 `8091`(PID 61648);前端用 `node node_modules\@vue\cli-service\bin\vue-cli-service.js serve` 后台运行,监听 `8082`(PID 57052)。日志为项目根的 `backend.log` / `frontend.log`(`*.log` 已被 `.gitignore` 忽略)。
- HTTP 验证:`POST /api/auth/login`(`admin/admin123`)返回 `code=200`;`GET http://localhost:8082/` 返回 200;前端 `/api` 代理到 8091 链路通。登录 `admin / admin123`。
**本次唯一代码改动(已获用户确认)**
- `emergency-repair-web\src\utils\sensitive.js`:敏感词运行时替换改为跳过表格数据单元格。
  - 口径:`<td>` 内的文本与属性保持代称;`<th>` 表头、页面标题、筛选标签、placeholder 照常替换。
  - 实现:新增 `isInsideTableCell()`(`closest('td')`),接入文本遍历、属性替换、`MutationObserver` 字符变化回调,以及 `replaceDom()` 直接收到文本节点的分支。
  - 验证:向运行页面注入探针表格(表头与数据格均写 `X号`),结果为 `<th>县号</th>`、`<td>X号</td>`;`npm run build` 通过。
  - 效率影响:表格场景通常更快;没有表格且高频更新普通文本时,仅增加 `closest('td')` 的少量判断开销。
**用户本次明确的工作方式要求(务必遵守)**
- 用户问“可不可以……”时只是要调查结论和方案,**不要直接改代码**;只有用户明确要求实施时才动文件。
- 改动前先说明要改什么,口径不明确时先问清楚。
**下次接续**
1. 先确认 `5236 / 8091 / 8082` 是否在监听,不在再按上面的命令重启(本机启动需显式设置 `JAVA_HOME`,Maven / Node 用绝对路径)。
2. `sensitive.js` 改动已获确认并随本次提交推送;`requirement\~$原始需求.docx` 是 Word 锁文件,不要提交。
3. 需求侧待确认项不变:决策表 B6–B10、AXU15 字段来源与可改性、完工验收各环节角色与打印输出、修后质量评级与 AXU14 T员评分字段的关系。
4. 后续改动完成后推送到公司 Git 仓库 `main` 分支。
## 17. 收尾快照(2026-10-04 周六,需求 11 / 12 / 17-19 联调收尾)
**本轮完成内容**
- 需求 11:完工情况处理将状态改为“完工”时,只更新派工单状态,不再跳转“完工信息填报”。完工处理与完工填报由不同用户分别操作。
- 需求 12:完工信息填报的派工单选择列表只展示“已在完工情况处理中确认完工、属于当前登录用户所属单位、且尚未填报”的派工单,并增加工程名称(项目名称)显示。
- 需求 17:角色管理的“用户设置”增加“全部 / 已设置”过滤切换。
- 需求 18:新增“组织机构”部门树表页面,菜单 `/system/organization`,页面 `OrganizationManage.vue`,数据来自 `CSICZB_ZB.SYS_DEPT`,后端接口 `/api/system/depts`。当前环境返回 34 个部门,支持名称、编码、负责人、部门类型筛选。
- 需求 19:承修单位改为读取 `SYS_DEPT.DEPT_TYPE='cj'` 的部门记录,部门 ID 作为承修单位 ID;承修单位接口保留 GET,页面改为只读。当前环境返回 7 个 cj 部门,XCB审核、派单均使用 cj 部门 ID/名称。
**主要文件**
- 后端:`emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java`、`emergency-repair-server/src/main/java/com/emergencyrepair/business/service/BusinessService.java`、`emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DataInitializer.java`。
- 前端:`emergency-repair-web/src/views/system/OrganizationManage.vue`、`emergency-repair-web/src/views/system/ContractorManage.vue`、`emergency-repair-web/src/views/completion/CompletionReport.vue`、`emergency-repair-web/src/views/system/RoleManage.vue`、`emergency-repair-web/src/router/index.js`。
**验证结果**
- 后端 `mvn -B -DskipTests clean package` 通过;前端 `npm run build` 通过。
- 页面验证脚本完整通过:`node .codex-run/verify-items-11-12-17.js`、`node .codex-run/verify-items-18-19.js`;截图见 `.codex-run/organization-verified.png`、`.codex-run/contractor-readonly-verified.png`、`.codex-run/completion-report-verified.png`、`.codex-run/role-scope-verified.png`。
- 端到端联调使用临时故障 `固定前缀-088/A-261004-001`,跑通上报、XCB审核分配“厂家1/厂家2”、CMB/JCC三级审批、派单。最终故障保存 `contractorIds = 1303144990487465986,1303145150793764866`、`contractorNames = 厂家1、厂家2`,生成两张派工单,均保存 cj 部门 ID/名称。
- 完工填报可见性验证:`cjyh1-1` 仅看到厂家1派工单,`cjyh2-1` 仅看到厂家2派工单,`admin` 可看到两张。临时 `T_FAULT` / `T_WORK_ORDER` 测试数据已清理。
**当前运行状态(2026-10-04)**
- 前端:`http://localhost:8082`;后端:`http://127.0.0.1:8091`;DM8:`127.0.0.1:5236`;headless Edge 调试实例端口 `9222`。
- 登录:`admin / admin123`;数据库:`SYSDBA/SYSDBA`,业务 schema `LX`。
**接手注意事项**
- 非管理员用户的完工填报派工单单位匹配当前按 `DEPT_NAME`,不是按 `DEPT_ID`。本次验证通过;如存在同名部门,应改为按部门 ID 精确匹配。
- 历史演示派工单可能保留旧 `T_CONTRACTOR` 名称,非管理员 cj 用户可能看不到这些历史单;`admin` 不受单位过滤影响。
- `.codex-run`、Office 锁文件 `requirement\~$原始需求.docx` 和 `emergency-repair-web/public/新建 文本文档.txt` 属本地联调或临时文件,不应提交。
- 本轮代码已提交并推送公司 Git 仓库 `main` 分支,提交 `757dcb3`;交接文件回填提交记录。后续启动、构建和排错命令沿用第 16 节。
## 18. 收尾快照(2026-10-06 周一,需求 20 菜单权限管理收尾)
**本轮完成内容**
- 需求 20:菜单权限管理取消租户权限和角色权限的双重授权,改为单步设置角色权限。当前用户本身没有租户归属,因此不再设置租户权限。
- 权限树继续展示菜单节点和按钮节点,不按 `menuType` 过滤;切换角色后,已保存权限复选框正常反显。
- 菜单权限接口只保留 `roleId` / `roleMenuIds`,删除租户菜单授权及 `/api/system/tenants`。
- 修复雪花 ID 经浏览器 JSON 解析后精度丢失的问题:后端返回字符串 ID,前端选中态按字符串处理。
**主要文件**
- 后端:`emergency-repair-server/src/main/java/com/emergencyrepair/business/dto/Requests.java`、`emergency-repair-server/src/main/java/com/emergencyrepair/system/controller/SystemController.java`、`emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java`。
- 前端:`emergency-repair-web/src/views/system/MenuPermission.vue`。
**验证结果**
- 后端 `mvn -B -DskipTests compile` 通过;前端 `npm run build` 通过。
- 接口:`GET /api/system/menu-permissions?roleId=2106221661022490625` 返回字符串型 `roleMenuIds` 共 14 条。
- 浏览器:`node .codex-run/verify-menu-permission.js` 输出 `hasTenantPanel: false`、`buttonNodeCount: 76`、`checkedMatchesSaved: true`、`hasError: false`;截图 `.codex-run/menu-permission-verified.png`。
- 页面确认按钮节点保留,切换角色后权限勾选可正常反显。
**当前运行状态(2026-10-06)**
- 前端 `http://localhost:8082`,后端 `http://127.0.0.1:8091`,DM8 `127.0.0.1:5236`,Edge CDP `9222`。
- 登录 `admin / admin123`;数据库 `SYSDBA/SYSDBA`,业务 schema `LX`。
- 后端日志:`.codex-run/backend-20261006-menu-permission-fixed.out.log`、`.codex-run/backend-20261006-menu-permission-fixed.err.log`。
**接手注意**
- 不要提交 `.codex-run`、Office 锁文件或 `emergency-repair-web/public/新建 文本文档.txt`。
- 本轮代码与交接记录一并提交并推送公司 Git 仓库 `main` 分支。
## 19. 收尾快照(2026-10-06 周一,需求 21-22 菜单权限入口与错误日志)
**本轮完成内容**
- 需求 21:移除独立“菜单权限管理”菜单,在角色管理操作列新增“权限设置”按钮,并复用菜单/按钮权限树弹窗;旧 `/system/menu-permissions` 路由和页面已删除。
- 需求 22:系统管理新增“系统配置 / 权限配置 / 日志管理”三个二级目录;组织机构、承修单位、产品结构树、设备基础库、工程专业、T队专业、三员控制归入系统配置,用户管理、角色管理、菜单管理归入权限配置,登录日志、操作日志、错误日志归入日志管理。
- 错误日志为新增功能:`GlobalExceptionHandler` 捕获未处理的非业务异常并异步写入 `LX.T_SYS_ERROR_LOG`;业务校验异常不记录。列表支持模块、异常类型、时间筛选,详情展示完整堆栈。
- 新库初始化和旧库迁移均会删除旧菜单并补齐二级目录的父子菜单关系;权限树继续保留菜单节点和按钮节点,角色切换后复选框可反显。
**主要文件**
- 后端:`emergency-repair-server/src/main/java/com/emergencyrepair/system/entity/SysErrorLog.java`、`.../mapper/SysErrorLogMapper.java`、`.../log/ErrorLogRecorder.java`、`.../common/GlobalExceptionHandler.java`、`.../bootstrap/DataInitializer.java`、`.../bootstrap/DatabaseBootstrap.java`、`.../system/controller/SystemController.java`、`.../system/service/SystemService.java`、`.../system/service/ButtonPermissionCatalog.java`。
- 前端:`emergency-repair-web/src/views/system/RoleManage.vue`、`RolePermissionDialog.vue`、`ErrorLogManage.vue`、`emergency-repair-web/src/router/index.js`、`MenuManage.vue`;`MenuPermission.vue` 已删除。
**验证结果**
- 后端 `mvn -B -DskipTests clean package` 通过;前端 `npm run build` 通过,仅有既有包体积告警。
- `node .codex-run/verify-req21-22.js` 通过:三个二级目录和错误日志菜单正常显示,旧菜单不存在,角色管理“权限设置”弹窗按钮节点数为 78 且反显正常。
- 人为访问非法错误日志详情 ID 后,记录自动落库并可在错误日志页面查看;验证用临时记录已从数据库清理。
- 截图:`.codex-run/role-permission-dialog-verified.png`、`.codex-run/error-log-verified.png`。
**当前运行状态(2026-10-06)**
- 前端 `http://localhost:8082`;后端 `http://127.0.0.1:8091`;DM8 `127.0.0.1:5236`;Edge CDP `9222`。
- 登录 `admin / admin123`;数据库 `SYSDBA/SYSDBA`,业务 schema `LX`。
- 后端日志:`.codex-run/backend-20261006-req21-22.out.log`、`.codex-run/backend-20261006-req21-22.err.log`。
**接手注意**
- 错误日志当前覆盖进入 Spring MVC 全局异常处理的异常;启动阶段异常、异步线程中未进入该处理器的异常暂不会自动落库。
- 不要提交 `.codex-run`、Office 锁文件或 `emergency-repair-web/public/新建 文本文档.txt`。
- 本轮代码与交接记录一并提交并推送公司 Git 仓库 `main` 分支。
## 20. 收尾快照(2026-10-06 周一,需求 23-25 系统配置、完工查阅与菜单父节点)
**本轮完成内容**
- 需求 23:系统名称和版本改为关键词配置,codename 分别为 `rk_SystemName`、`rk_SystemVer`。登录页、页头、Logo 替代文本和浏览器标题使用配置值;页头版本使用红色显示。
- 需求 24:新增“完工信息查阅”功能,菜单 `/completion/query`,接口 `GET /api/work-orders/completion/query`。查询结果按故障汇总,一个故障展开多张派工单;故障编号、rk_X号、设备、工程名称及损坏情况、上报单位、上报日期、序号这 7 列使用单元格纵向合并。每张派工单的完工处理情况和更换器材支持多条明细。
- 需求 24 的查询条件包括关键词、承修单位、完工状态和完工日期。关键词匹配故障、派工单、工程编号、承修人和明细内容。
- 需求 25:菜单管理编辑时,“上级菜单”改为可编辑级联选择器;编辑时排除当前菜单及其全部下级,按钮类型只能选择菜单类型父节点。
- 需求 25 后端同步增加父节点存在性、自引用和循环层级校验,避免通过接口构造循环菜单树。
**主要文件**
后端:
- `emergency-repair-server/src/main/java/com/emergencyrepair/business/dto/CompletionFaultQueryItem.java`(新增)
- `emergency-repair-server/src/main/java/com/emergencyrepair/business/controller/WorkOrderController.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/business/service/BusinessService.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DataInitializer.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java`
前端:
- `emergency-repair-web/src/views/completion/CompletionQuery.vue`(新增)
- `emergency-repair-web/src/views/system/MenuManage.vue`
- `emergency-repair-web/src/components/AppHeader.vue`、`Login.vue`、`RepairLogo.vue`、`layout/AppLayout.vue`、`router/index.js`、`utils/sensitive.js`、`main.js`
- `emergency-repair-web/public/sensitive-words.json`、`public/index.html`
- `requirement/敏感词字典.json`
**验证结果**
- 后端 `mvn -B -DskipTests compile` 通过;前端 `npm run build` 通过,仅有既有包体积告警。
- `node .codex-run/verify-req23-25.js`:页面标题和页头使用“临抢修管理系统 / 网络版”,版本颜色为 `rgb(255, 107, 107)`;完工查阅显示故障 `GZ-2026-012`、处理情况和器材;菜单编辑父节点显示“故障管理”且可编辑。
- 接口实测:临时同一故障插入两张派工单和两条完工记录后,`GET /api/work-orders/completion/query?keyword=ZZ-MERGE-TEST-20261006` 返回 1 个故障、2 张派工单,每条各 1 条处理情况和 1 条器材。
- 浏览器合并实测:页面生成 2 张派工单行,故障编号单元格只出现 1 次,7 个故障信息列均有 `rowspan=2`,两张单各自的处理情况和器材均正常显示,无网络异常;截图 `.codex-run/completion-query-merge-verified.png`。临时数据库记录已清理。
- 菜单父节点接口实测:临时创建父子菜单成功;把父菜单移动到其子菜单下返回“上级菜单不能选择当前菜单的下级”;把子菜单移动到其他父节点成功;临时菜单已清理。
**当前运行状态(2026-10-06)**
- 前端 `http://localhost:8082`;后端 `http://127.0.0.1:8091`;DM8 `127.0.0.1:5236`;Edge CDP `9222`。
- 登录 `admin / admin123`;数据库 `SYSDBA/SYSDBA`,业务 schema `LX`。
- 后端日志:`.codex-run/backend-20261006-req23-25-v2.out.log`、`.codex-run/backend-20261006-req23-25-v2.err.log`。
**接手注意**
- 完工信息查阅当前只汇总已经存在完工填报记录 `T_COMPLETION_INFO` 的派工单;仅完工处理但未填报完工信息的派工单不会出现在查阅结果中。
- 完工查阅接口当前一次返回全部匹配结果,没有分页;数据量进一步增大时建议增加分页或导出策略。
- 不要提交 `.codex-run`、Office 锁文件或 `emergency-repair-web/public/新建 文本文档.txt`。
- 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 `main` 分支。
## 21. 收尾快照(2026-10-06 周一,需求 21 权限设置范围切换)
**本轮完成内容**
- 角色管理“权限设置”弹窗增加“全部 / 已设置”切换,交互方式与“用户设置”保持一致。
- “全部”显示完整菜单及按钮权限树,保留“全选”和原有权限反显。
- “已设置”仅显示当前角色已授权节点及其父级路径;没有已设置权限时显示空状态提示。
- 切换范围时会保留当前尚未保存的勾选状态,切回“全部”后恢复完整树及当前选中权限。
- 弹窗每次重新打开默认回到“全部”。
**主要文件**
- `emergency-repair-web/src/views/system/RolePermissionDialog.vue`
- `requirement/改进20261003.txt`(补充需求 21 的范围切换口径)
**验证结果**
- 前端 `npm run build` 通过,仅有既有包体积告警。
- `node .codex-run/verify-req21-22.js` 通过:左侧无“菜单权限管理”,角色管理存在“权限设置”。
- 全部视图显示 119 个复选框、13 个已勾选、1 个半选;已设置视图显示 14 个节点,均为当前已设置节点或父级路径;切回全部后勾选状态恢复,无网络异常。
- 截图:`.codex-run/role-permission-assigned-scope.png`。
**当前运行状态(2026-10-06)**
- 前端 `http://localhost:8082`;后端 `http://127.0.0.1:8091`;DM8 `127.0.0.1:5236`;Edge CDP `9222`。
- 登录 `admin / admin123`;数据库 `SYSDBA/SYSDBA`,业务 schema `LX`。
**接手注意**
- 不要提交 `.codex-run`、Office 锁文件或 `emergency-repair-web/public/新建 文本文档.txt`。
- 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 `main` 分支。
## 22. 收尾快照(2026-10-06 周一,需求 26 日志日期范围分隔符)
**本轮完成内容**
- 修复登录日志、操作日志、错误日志三个页面日期范围组件中间“至”显示不完整的问题。
- 三个页面的 `.el-range-separator` 固定为 `18px` 并居中显示,避免 Element UI 默认百分比宽度在 260px 日期控件中被压缩裁切。
**主要文件**
- `emergency-repair-web/src/views/system/LoginLogManage.vue`
- `emergency-repair-web/src/views/system/OperationLogManage.vue`
- `emergency-repair-web/src/views/system/ErrorLogManage.vue`
- `requirement/改进20261003.txt`(补充需求 26)
**验证结果**
- 前端 `npm run build` 通过,仅有既有包体积告警。
- `node .codex-run/verify-req26.js` 通过:三个日志页面均找到“至”,实际宽度、`clientWidth` 和 `scrollWidth` 均为 `18px`,计算样式为 `flex-basis: 18px`、`min-width: 18px`、居中,无网络异常。
- 截图:`.codex-run/login-log-date-separator.png`、`.codex-run/operation-log-date-separator.png`、`.codex-run/error-log-date-separator.png`。
**当前运行状态(2026-10-06)**
- 前端 `http://localhost:8082`;后端 `http://127.0.0.1:8091`;DM8 `127.0.0.1:5236`;Edge CDP `9222`。
- 登录 `admin / admin123`;数据库 `SYSDBA/SYSDBA`,业务 schema `LX`。
**接手注意**
- 不要提交 `.codex-run`、Office 锁文件或 `emergency-repair-web/public/新建 文本文档.txt`。
- 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 `main` 分支。
## 23. 收尾快照(2026-10-06 周一,需求 27 设备选择范围)
**本轮完成内容**
- 新增故障选择 `rk_X号`(产品结构树 `side` 类型节点)后,设备选择器只以所选节点为根展示其下级,不再同时返回型号根节点和整棵产品结构树。
- 设备选择器打开锁定范围时自动展开返回的 `side` 根节点,首屏直接显示第一层系统节点,后续继续按原逻辑懒加载。
- `xNo` 为空时仍返回完整产品结构树,不影响产品结构树管理和不按 `rk_X号` 筛选的设备选择场景。
**主要文件**
- `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java`
- `emergency-repair-web/src/components/ProductTreePicker.vue`
- `requirement/改进20261003.txt`(补充需求 27)
**验证结果**
- 后端 `mvn -B -DskipTests compile`、`mvn -B -DskipTests package` 通过;前端 `npm run build` 通过,仅有既有包体积告警。
- `GET /api/system/tree/product/side-roots?xNo=203` 修复后只返回 1 个根节点:`id=1280000000000009729`、`name=203`、`layer=side`、`level=2`;`201 / 203 / 301 / 测试T` 分别只返回对应节点。
- `node .codex-run/verify-req27.js` 通过:根节点文本仅为 `203`,自动展开 1 个根节点,首屏显示其下级系统节点,无网络异常。
- 请求链路确认:`/api/system/tree/product/side-roots?xNo=203` 后继续请求 `/api/system/tree/product/children?parentId=1280000000000009729`。截图:`.codex-run/req27-side-tree.png`。
**当前运行状态(2026-10-06)**
- 前端 `http://localhost:8082`,PID `138164`;后端 `http://127.0.0.1:8091`,PID `148268`;DM8 `127.0.0.1:5236`;Edge CDP `9222`。
- 登录 `admin / admin123`;数据库 `SYSDBA/SYSDBA`,业务 schema `LX`。
- 后端日志:`.codex-run/backend-20261006-req27.out.log`、`.codex-run/backend-20261006-req27.err.log`。
**接手注意**
- 需求 26 已提交并推送,提交 `f651ad5`(`fix: show full date range separator in log filters`)。需求 27 已提交并推送,提交 `f9114ff`(`fix: limit equipment picker to selected X number`)。
- 不要提交 `.codex-run`、Office 锁文件或 `emergency-repair-web/public/新建 文本文档.txt`。
- 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 `main` 分支。
## 24. 收尾快照(2026-10-06 周一,菜单名称被启动初始化覆盖)
**问题与修复**
- 手工把系统配置下的“产品结构树管理”改为“产品结构树”后,后端重启会恢复“管理”二字。
- 原因是 `DataInitializer.ensureMenu()` 每次启动都会拿代码中的默认名称覆盖已存在菜单。
- 已改为只在新建菜单时使用默认名称;已存在菜单只修复父节点、排序、类型和可见性,名称由菜单管理页面维护。
- 新建数据库的默认菜单名称同步改为“产品结构树”。
**主要文件**
- `emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DataInitializer.java`
**验证结果**
- 后端 `mvn -B -DskipTests compile`、`mvn -B -DskipTests package` 通过。
- 将数据库菜单 `id=2101493905517301763`、`url=/system/product-tree` 的名称改为“产品结构树”后,使用新 jar 重启后端,接口再次查询仍为“产品结构树”。
- 新后端 PID `151580`,监听 `8091`;日志:`.codex-run/backend-20261006-menu-name.out.log`、`.codex-run/backend-20261006-menu-name.err.log`。
## 25. 收尾快照(2026-10-07 周三,清空故障及完工业务数据)
**本次操作**
- 清空 `LX.T_FAULT`、`LX.T_WORK_ORDER`、`LX.T_COMPLETION_INFO`、`LX.T_ACCEPTANCE` 四张业务表。
- 清空前数量:故障 `23`、派工单 `8`、完工信息 `6`、验收 `6`;清空后均为 `0`。
- 同步关闭启动演示业务数据回填:新增配置 `app.seed-demo-data=false`,避免 `T_FAULT` 为空时后端重启又自动生成 16 条演示故障及完工数据。
**主要文件**
- `emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DataInitializer.java`
- `emergency-repair-server/src/main/resources/application.yml`
**验证结果**
- 后端 `mvn -B -DskipTests clean package` 通过。
- 使用新 jar 重启后再次查询,四张业务表仍均为 `0` 行;登录接口 `200`,前端首页 `200`。
- 当前后端 PID `21528`,监听 `8091`;日志:`.codex-run/backend-20261007-cleared.out.log`、`.codex-run/backend-20261007-cleared.err.log`。
- 如需重新灌入演示业务数据,将 `app.seed-demo-data` 临时设为 `true` 后重启。
## 26. 收尾快照(2026-10-07 周三,需求 28-30 扩展属性与新增故障默认值)
**需求口径**
- 需求 30 编号已确认;新增故障里的“责任”就是“负责人”。
- 部门扩展属性“负责rk_T”的值就是 `rk_X号`,值必须是产品结构树 `side` 类型节点,单选。
- 新增故障的 `rk_X号` 默认值只取登录用户所属部门的扩展属性;即使用户扩展属性也设置了“负责rk_T”,仍以部门设置为准。
- “rk_TD专业”与现有“rk_T队专业”是同一字段,代码字段为 `teamMajor`,当前界面暂时沿用“rk_T队专业”。
- 外部 `CSICZB_ZB.SYS_DEPT`、`CSICZB_ZB.SYS_USER` 由其他系统维护,本项目只读;扩展属性保存到本地新表。
**本轮完成内容**
- `DatabaseBootstrap` 自动创建 `LX.T_SYS_DEPT_EXT`(`DEPT_ID`、`RESPONSIBLE_X_NO` 及审计字段)和 `LX.T_SYS_USER_EXT`(`USER_ID`、`ENGINEERING_MAJOR`、`TEAM_MAJOR`、`RESPONSIBLE_X_NO` 及审计字段)。
- 组织机构页面增加“扩展属性”按钮和弹窗,可设置部门“负责rk_T”;列表显示已设置值。
- 用户管理页面增加“扩展属性”按钮和弹窗,可设置工程专业、rk_T队专业、负责rk_T;列表显示扩展属性是否已设置。
- 新增故障弹窗默认带出:上报单位为当前登录人的单位、负责人为当前登录人、`rk_X号`为当前部门扩展属性、工程专业和 rk_T队专业为当前用户扩展属性。
- 用户扩展属性为空时,工程专业和 rk_T队专业不再默认选择配置列表第一项。
**接口与权限**
- `GET/PUT /api/system/depts/{deptId}/ext`:查询和保存部门扩展属性。
- `GET/PUT /api/system/users/{userId}/ext`:查询和保存用户扩展属性。
- `/api/auth/login`、`/api/auth/me` 返回 `userId`、`deptId`、`engineeringMajor`、`teamMajor`、`deptResponsibleXNo`、`responsibleXNo`。
- 按钮权限新增 `system:organization:ext`(扩展属性设置)、`system:users:ext`(扩展属性设置)。
**主要变更文件**
- `emergency-repair-server/src/main/java/com/emergencyrepair/auth/AuthController.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DatabaseBootstrap.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/business/dto/Requests.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/system/controller/SystemController.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java`
- `emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java`
- `emergency-repair-web/src/views/Login.vue`
- `emergency-repair-web/src/views/fault/FaultReport.vue`
- `emergency-repair-web/src/views/system/OrganizationManage.vue`
- `emergency-repair-web/src/views/system/UserManage.vue`
- `requirement/改进20261003.txt`(补充需求 28-30)
**验证结果**
- 后端 `mvn -B -DskipTests clean package` 通过;前端 `npm run build` 通过,仅有既有包体积告警。
- `node .codex-run/verify-req28-30.js` 返回 `pass: true`。
- 部门 `1390477009348739073 / sy区域` 设置 `rk_X号=201`,用户 `123 / yszl` 设置工程专业 `动力专业`、rk_T队专业 `液压专业`、负责 `202`。
- 新增故障实际默认值为:上报单位 `sy区域`、负责人 `助理用户(演示)`、`rk_X号=201`、rk_T队专业 `液压专业`、工程专业 `动力专业`。
- 截图:`.codex-run/req28-org-ext.png`、`.codex-run/req29-user-ext.png`、`.codex-run/req30-fault-defaults.png`。
- 验证后已清除临时部门、用户扩展属性,查询确认 `configured=false` 且字段为空。
**当前运行状态(2026-10-07)**
- 后端 PID `56124`,监听 `http://127.0.0.1:8091`;前端 PID `57312`,监听 `http://localhost:8082`。
- 为 UI 验证启动的 headless Edge PID `95756`,CDP 端口 `9222`;配置目录 `.codex-run/edge-profile-req28-30`。
- 后端日志:`.codex-run/backend-20261007-req28-30-final.out.log`、`.codex-run/backend-20261007-req28-30-final.err.log`。
- 登录 `admin / admin123`;数据库 `SYSDBA/SYSDBA`,业务 schema `LX`。
**接手注意**
- 开发环境敏感词配置会把 `rk_T` 显示为“梯”,因此页面截图中可能显示“负责梯”;代码和后端字段仍是 `rk_T`。
- 不要提交 `.codex-run`、Office 锁文件或 `emergency-repair-web/public/新建 文本文档.txt`。
- 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 `main` 分支。