编辑 | blame | 历史 | 原始文档

临抢修管理系统交接文件(2026.10.3)

基本信息

  • 仓库目录:D:\projectJava\lqx
  • Git 分支:main
  • 基线提交:f17c76c fix: load only active report data
  • 原始需求文件:requirement/改进20261003.txt
  • 交接整理时间:2026-10-04
  • 本轮工作日期:2026-10-03
  • 提交状态:需求 11、12、17-19 已完成并完成浏览器、接口及端到端联调,本轮代码已提交并推送 main 分支,提交 757dcb3;交接文件回填提交记录。
  • 注意事项:requirement/改进20261003.txt 是用户原始需求记录,本次未修改。

2026-10-04 更新:需求 11、12、17-19 已完成并完成浏览器、接口及端到端联调;本轮代码已提交并推送 main 分支,提交 757dcb3。DEPT_NAME 匹配等剩余风险见第十一节。

一、需求完成情况

序号 需求 状态 主要实现
1 logo 使用 public/logo.png 已完成 RepairLogo.vue 读取 ${BASE_URL}logo.png,文件位于 emergency-repair-web/public/logo.png
2 用户管理,左右结构,左侧用户表格、右侧角色复选及反显 已完成 新增 UserManage.vue;支持用户名、账户名、部门、角色过滤;支持一人多角色
3 登录日志、操作日志 已完成 新增登录日志和操作日志页面、实体、Mapper;操作日志记录新增、修改、删除请求
4 菜单管理增加按钮类型,按钮只能挂在菜单下级 已完成 MenuManage.vue、ButtonPermissionCatalog.java;页面按钮可自动获取并同步为 MENU_TYPE=2
5 代码中的“装备”改成“设备” 已完成 前端、后端源码检查无“装备”匹配;初始化菜单也有替换逻辑
6 多文档标签横向滚动时高度不足、文字显示不全 已完成 AppLayout.vue 调整多文档标签栏、滚动条和标签高度
7 放开权限,其他用户也可以登录 已完成 AuthController 查询外部用户表,不再只允许 admin;其他有效用户可登录
8 菜单权限管理父子节点复选联动 已完成 MenuPermission.vue 使用 Element UI 默认级联复选逻辑,并在保存时包含半选父节点
9 用户管理批量设置角色;角色管理增加角色用户设置 已完成 用户管理支持“追加角色”和“覆盖角色”;角色管理支持“用户设置”和角色用户反显
10 产品结构树改为同义词表 ZT_BOAT_TREE 已完成,仍有待确认事项 已映射 LABEL、INFO_ID、CONNECT_ID、CONNECT_GROUP、LAYER;已改为懒加载

二、用户与角色授权

2.1 用户管理

页面文件:

  • emergency-repair-web/src/views/system/UserManage.vue

功能:

  • 左侧用户表格显示:
  • 用户名
  • 账户名
  • 所属部门
  • 角色权限
  • 手机号
  • 状态
  • 支持按用户名、账户名、部门、角色过滤。
  • 选择左侧用户后,右侧复选显示该用户拥有的角色。
  • 一个用户可以同时拥有多个角色。
  • 支持多选用户后“批量设置角色”:
  • append:保留原角色,追加勾选角色。
  • replace:使用勾选角色覆盖原角色。
  • replace 且未选择角色时,会清空所选用户的全部角色。

相关接口:

  • GET /api/system/users
  • GET /api/system/users/{userId}/roles
  • PUT /api/system/users/{userId}/roles
  • PUT /api/system/users/roles/batch

2.2 角色管理

页面文件:

  • emergency-repair-web/src/views/system/RoleManage.vue

功能:

  • 每行角色增加“用户设置”。
  • 弹窗中可过滤用户,复选并反显当前角色所属用户。
  • 保存角色用户关系时只替换该角色的用户关系,不删除这些用户拥有的其他角色。

相关接口:

  • GET /api/system/roles/{roleId}/users
  • PUT /api/system/roles/{roleId}/users

服务实现:

  • SystemService.roleUsers(...)
  • SystemService.saveRoleUsers(...)

按钮权限:

  • system:roles:assign

三、日志功能

3.1 登录日志

实现位置:

  • emergency-repair-server/src/main/java/com/emergencyrepair/auth/AuthController.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/entity/SysLoginLog.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/mapper/SysLoginLogMapper.java
  • emergency-repair-web/src/views/system/LoginLogManage.vue

记录内容:

  • 用户 ID
  • 账户名
  • 用户名
  • 部门
  • 登录 IP
  • 登录状态
  • 登录结果说明
  • 登录时间

接口:

  • GET /api/system/login-logs

3.2 操作日志

实现位置:

  • emergency-repair-server/src/main/java/com/emergencyrepair/system/log/OperationLogInterceptor.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/entity/SysOperationLog.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/mapper/SysOperationLogMapper.java
  • emergency-repair-web/src/views/system/OperationLogManage.vue

记录规则:

  • 拦截 /api/** 下的 POST、PUT、DELETE 请求。
  • 登录接口排除,由登录日志负责。
  • 记录模块、操作类型、目标类型、目标 ID、请求方式、请求 URI、成功/失败、操作人和时间。
  • 业务请求失败时,日志写入异常不会影响原业务请求。
  • 当前操作日志用户取请求头 X-Username;如果调用方没有传该请求头,会回退记录为 admin。手机端或第三方调用时需要注意补齐该请求头。

接口:

  • GET /api/system/operation-logs

3.3 日志表

由 DatabaseBootstrap 创建:

  • LX.T_SYS_LOGIN_LOG
  • LX.T_SYS_OPERATION_LOG

索引:

  • IX_T_SYS_LOGIN_LOG_TIME
  • IX_T_SYS_OPERATION_LOG_TIME
  • IX_T_SYS_ROLE_USER_USER

四、菜单与按钮权限

页面文件:

  • emergency-repair-web/src/views/system/MenuManage.vue
  • emergency-repair-web/src/views/system/MenuPermission.vue

按钮目录:

  • emergency-repair-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java

规则:

  • 菜单类型:
  • 0:目录
  • 1:菜单
  • 2:按钮
  • 按钮只能挂在菜单类型 1 的下级。
  • 菜单页面点击“页面按钮”后,后端从按钮目录自动列出该页面可配置按钮。
  • 勾选并保存后,自动生成按钮类型菜单。
  • 按钮类型菜单可继续在菜单权限管理中授权给角色。
  • 菜单权限树使用父子节点联动,保存时同时收集已选中节点和半选父节点。

相关接口:

  • GET /api/system/menu/buttons
  • POST /api/system/menu/buttons
  • GET /api/system/menu-permissions
  • POST /api/system/menu-permissions

五、产品结构树

5.1 数据源

实体文件:

  • emergency-repair-server/src/main/java/com/emergencyrepair/business/entity/ProductNode.java

映射表:

LX.ZT_BOAT_TREE

物理表:

CSICZB_ZB.ZT_BOAT_TREE

已确认 CSICZB 和 LX 下均有同义词。

字段映射:

外部表字段 Java 字段 说明
INFO_ID id 业务节点主键
CONNECT_ID parentId 父节点 ID
CONNECT_GROUP connectGroup 祖辈路径
LABEL name 设备名称
LAYER layer 节点类型
SORT sortNo 排序
ISDELETE isDelete 删除标记
ID recordId 物理关系行 ID

已知层级兼容映射:

LAYER 前端层级 前端类型
model 1 MODEL
side 2 X_NO
system1 3 SYSTEM1
system2 4 SYSTEM2
equipment 5 DEVICE
其他值 6 原始值大写

5.2 实际数据情况

2026-10-03 DM8 实测:

  • 物理行数:12974
  • 去重后 INFO_ID:12972
  • 重复 INFO_ID:2 个
  • 根节点:2 个
  • equipment:12798
  • system1:161
  • side:9
  • model:2
  • 未知层级:ttt、sss、rrrr,各 1 个

示例根节点:

  • INFO_ID=1280000000000006486
  • 名称:型号s44444
  • LAYER=model

5.3 懒加载改造

由于 12972 个节点一次性加载和渲染会导致浏览器卡死,产品树已经改为按展开层级懒加载。

新增接口:

  • GET /api/system/tree/product/roots
  • GET /api/system/tree/product/children?parentId={id}
  • GET /api/system/tree/product/side-roots?xNo={xNo}
  • GET /api/system/tree/product/x-numbers
  • GET /api/system/tree/product/selected?ids={id1,id2}

前端使用位置:

  • TreeManage.vue:产品树管理
  • ProductTreePicker.vue:故障上报和故障编辑中的设备选择
  • FaultReport.vue
  • FaultEditDialog.vue
  • XcbReview.vue

处理结果:

  • 产品树管理首屏只返回 2 个根节点。
  • 展开根节点时只请求直接子节点。
  • 故障页面 X 号不再遍历完整树,直接请求 X 号列表。
  • 编辑故障时通过“已选设备”接口反显设备名称和路径。
  • 产品树管理隐藏了外部表不存在的“编码”字段。
  • 产品节点删除采用软删除,设置 ISDELETE=1。

5.4 产品树待确认事项

用户已说明:实际结构并非严格按 model -> side -> system1 -> system2 -> equipment 排列,可能缺少 system2,且 system2 下也可能挂非 equipment 类型节点。

目前实现仍有以下约束:

  • 未知 LAYER 目前统一映射为第 6 级。
  • 前端当前最大编辑层级固定为 5,第 6 级节点通常只能查看,点击“新增下级”的条件不满足。
  • 需要用户后续确认未知层级是只读展示、归入“其他”,还是允许继续配置下级。
  • 产品树写入的是外部表同义词,正式环境需确认数据库账号对 CSICZB_ZB.ZT_BOAT_TREE 的增删改权限。
  • DatabaseBootstrap 中仍保留旧 LX.T_PRODUCT_TREE 建表定义,但 ProductNode 已不再使用旧表,DataInitializer 也已停止初始化产品树演示数据。

六、构建与运行

6.1 环境

  • Java:C:\Program Files\Java\jdk1.8.0_172
  • Maven:D:\solidDir\apache-maven-3.6.1\bin\mvn.cmd
  • Node/npm:C:\Program Files\nodejs\npm.cmd
  • 后端端口:8091
  • 前端端口:8082
  • DM8:127.0.0.1:5236
  • DM8 数据库账号:SYSDBA / SYSDBA
  • 登录示例:admin / admin 或 admin / admin123

6.2 后端构建

$env:JAVA_HOME='C:\Program Files\Java\jdk1.8.0_172'
Set-Location 'D:\projectJava\lqx\emergency-repair-server'
& 'D:\solidDir\apache-maven-3.6.1\bin\mvn.cmd' -B -DskipTests clean package

构建结果:成功。

JAR 路径:

D:\projectJava\lqx\emergency-repair-server\target\emergency-repair-server-1.0.0-SNAPSHOT.jar

启动示例:

Start-Process `
  -FilePath 'C:\Program Files\Java\jdk1.8.0_172\bin\java.exe' `
  -ArgumentList '-jar','D:\projectJava\lqx\emergency-repair-server\target\emergency-repair-server-1.0.0-SNAPSHOT.jar' `
  -WorkingDirectory 'D:\projectJava\lqx\emergency-repair-server' `
  -WindowStyle Hidden `
  -PassThru

6.3 前端构建

Set-Location 'D:\projectJava\lqx\emergency-repair-web'
& 'C:\Program Files\nodejs\npm.cmd' run build

构建结果:成功。

构建告警:

  • chunk-5be386f4 约 1.01 MiB。
  • chunk-vendors 约 946 KiB。
  • 属于包体积告警,不阻塞运行。

启动开发服务:

Set-Location 'D:\projectJava\lqx\emergency-repair-web'
& 'C:\Program Files\nodejs\npm.cmd' run serve

前端代理配置:

  • /api 代理到 http://127.0.0.1:8091
  • 前端地址:http://localhost:8082

七、已完成验证

7.1 编译验证

  • 后端:mvn -B -DskipTests clean package 通过。
  • 前端:npm run build 通过。

7.2 浏览器验证

角色管理:

  • “用户设置”按钮存在。
  • 弹窗反显 44 个用户。
  • 首个角色选中 6 人。

用户管理:

  • “批量设置角色”按钮存在。
  • 角色授权面板存在。
  • 表格返回 20 行。

产品树:

  • 首屏 2 个根节点。
  • 展开第一个根节点后显示 5 个直接子节点。
  • X 号数量 9 个。
  • 已选设备接口能返回名称和完整路径。
  • 产品树管理和故障选择设备弹窗均可正常加载,未出现整树渲染卡死。

验证截图和脚本:

  • .codex-run/role-users-verified.png
  • .codex-run/user-manage-verified.png
  • .codex-run/product-tree-verified.png
  • .codex-run/product-tree-lazy-verified.png
  • .codex-run/verify-ui.js
  • .codex-run/verify-lazy-tree.js
  • .codex-run/verify-picker.js

7.3 交接时进程状态

2026-10-04 12:28 重新构建并启动后,当前运行状态:8082 前端开发服务监听中,8091 后端监听中。启动日志位于 .codex-run/backend.out.log 和 .codex-run/backend.err.log。

2026-10-03 最后验证时曾运行:

  • 后端端口:8091
  • 前端端口:8082
  • Edge 调试端口:9222

重新联调时按第六节命令启动后端和前端。

八、主要变更文件

后端:

  • emergency-repair-server/src/main/java/com/emergencyrepair/auth/AuthController.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DataInitializer.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/business/entity/ProductNode.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-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/log/OperationLogInterceptor.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/entity/SysLoginLog.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/entity/SysOperationLog.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/mapper/SysLoginLogMapper.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/mapper/SysOperationLogMapper.java

前端:

  • emergency-repair-web/public/logo.png
  • emergency-repair-web/src/components/RepairLogo.vue
  • emergency-repair-web/src/components/ProductTreePicker.vue
  • emergency-repair-web/src/layout/AppLayout.vue
  • emergency-repair-web/src/router/index.js
  • emergency-repair-web/src/views/system/UserManage.vue
  • emergency-repair-web/src/views/system/RoleManage.vue
  • emergency-repair-web/src/views/system/MenuManage.vue
  • emergency-repair-web/src/views/system/MenuPermission.vue
  • emergency-repair-web/src/views/system/TreeManage.vue
  • emergency-repair-web/src/views/system/LoginLogManage.vue
  • emergency-repair-web/src/views/system/OperationLogManage.vue
  • emergency-repair-web/src/views/fault/FaultReport.vue
  • emergency-repair-web/src/views/fault/FaultEditDialog.vue
  • emergency-repair-web/src/views/fault/XcbReview.vue

九、接手建议

  1. 先确认 git status,不要回退当前未提交修改。
  2. 先启动后端,再启动前端,确认 8091 和 8082 可访问。
  3. 产品树后续优先确认未知 LAYER 的展示和编辑规则。
  4. 正式联调时检查操作日志是否能拿到真实 X-Username,避免全部回退为 admin。
  5. 如果要把产品树写入外部同义词表,先确认数据库账号权限和外部系统对 ISDELETE 软删除的约定。

十、2026-10-04 补充需求(13-16)

序号 需求 状态 实现与验证
13 敏感词 codename 增加 rk_ 前缀 已完成 public/sensitive-words.json、requirement/敏感词字典.json 已更新;菜单及页面旧文案已迁移为 rk_;前端保留无前缀别名兼容
14 故障编号前缀后台可配置 已完成 application.yml 新增 fault-code.prefix,默认 固定前缀-;实测编号 固定前缀-001/A-261004-001
15 所有表自动记录创建人、修改人 已完成 新增 BaseAuditEntity、CurrentUserInterceptor、AuditMetaObjectHandler;实测创建写入 codex-create-user,修改写入 codex-update-user
16 所有表逻辑删除并自动过滤 已完成 自建表新增 DEL_FLAG,实体继承 @TableLogic;报表 SQL 已增加过滤;实测逻辑删除后列表查询返回 0 条

补充说明:

  • 产品结构树外部同义词表 LX.ZT_BOAT_TREE 沿用自己的 ISDELETE,不额外增加 UPDATE_BY、DEL_FLAG。
  • 故障编号序号查询会包含逻辑删除记录,避免唯一索引冲突。
  • 操作日志新增、修改、删除均已实测落库。

十一、2026-10-04 联调收尾(11、12、17-19)

序号 需求 状态 实现与验证
11 完工情况处理改为“完工”时不跳转完工信息填报 已完成 完工处理只更新派工单状态;完工处理与完工填报由不同用户分别操作
12 完工信息填报只显示已完工、本单位、未填报派工单,并显示工程/项目名称 已完成 选择列表按“完工状态 + 登录用户所属单位 + 尚未填报”限制,并显示工程名称
17 角色管理用户设置增加“全部 / 已设置”切换 已完成 RoleManage.vue 增加范围过滤,已设置和全部列表可切换
18 增加组织机构(部门树表)功能 已完成 菜单 /system/organization,页面 OrganizationManage.vue,数据来自 CSICZB_ZB.SYS_DEPT,接口 /api/system/depts;当前 34 个部门
19 承修单位改为查询部门表中 DEPT_TYPE='cj' 的记录 已完成 SystemService.listContractors() 查询 cj 部门,部门 ID/名称用于审核和派单;承修单位页只读;当前 7 个 cj 部门

11.1 主要变更文件

后端:

  • 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

11.2 验证结果

  • 后端 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三级审批和派单;生成两张派工单,承修单位为 cj 部门 ID/名称。
  • 完工填报可见性:cjyh1-1 仅见厂家1派工单,cjyh2-1 仅见厂家2派工单,admin 见两张;临时 T_FAULT、T_WORK_ORDER 数据已清理。

11.3 当前服务

  • 前端 http://localhost:8082;后端 http://127.0.0.1:8091;DM8 127.0.0.1:5236;Edge 调试端口 9222。
  • 登录 admin / admin123;数据库 SYSDBA/SYSDBA,业务 schema LX。

11.4 接手注意

  • 非管理员完工填报的单位匹配目前按 DEPT_NAME,不是 DEPT_ID;若出现同名部门,应改为 ID 精确匹配。
  • 历史演示派工单可能仍保存旧 T_CONTRACTOR 名称,非管理员 cj 用户可能看不到;admin 不受单位过滤影响。
  • .codex-run、Office 锁文件以及 emergency-repair-web/public/新建 文本文档.txt 是本地联调或临时文件,不应提交。

十二、2026-10-06 联调收尾(需求 20)

序号 需求 状态 实现与验证
20 菜单权限管理取消租户权限,仅保留角色权限;权限复选框反显 已完成 权限树保留菜单和按钮节点;角色切换后正常反显,接口仅处理 roleId / roleMenuIds

12.1 主要变更文件

后端:

  • 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

12.2 验证结果

  • 后端 mvn -B -DskipTests compile 通过;前端 npm run build 通过。
  • GET /api/system/menu-permissions?roleId=2106221661022490625 返回字符串型 roleMenuIds 共 14 条,避免浏览器解析雪花 ID 时丢失精度。
  • node .codex-run/verify-menu-permission.js 输出 hasTenantPanel: false、buttonNodeCount: 76、checkedMatchesSaved: true、hasError: false。
  • 页面保留按钮节点,角色切换后权限树复选框反显正常;截图 .codex-run/menu-permission-verified.png。

12.3 接手注意

  • 本轮代码与交接记录一并提交并推送公司 Git 仓库 main 分支。
  • .codex-run、Office 锁文件及 emergency-repair-web/public/新建 文本文档.txt 仍为本地临时文件,不应提交。

十三、2026-10-06 联调收尾(需求 21-22)

序号 需求 状态 实现与验证
21 菜单权限管理改为角色管理的“权限设置”入口 已完成 删除独立菜单、路由和页面;角色列表新增“权限设置”,弹窗保留菜单及按钮节点并正常反显
22 系统管理新增二级菜单组,新增错误日志 已完成 新增“系统配置 / 权限配置 / 日志管理”目录并迁移菜单;错误日志记录非业务异常,支持筛选、分页和堆栈详情

13.1 主要变更文件

后端:

  • emergency-repair-server/src/main/java/com/emergencyrepair/system/entity/SysErrorLog.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/mapper/SysErrorLogMapper.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/system/log/ErrorLogRecorder.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/common/GlobalExceptionHandler.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DataInitializer.java
  • emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DatabaseBootstrap.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-server/src/main/java/com/emergencyrepair/system/service/ButtonPermissionCatalog.java

前端:

  • emergency-repair-web/src/views/system/RoleManage.vue
  • emergency-repair-web/src/views/system/RolePermissionDialog.vue
  • emergency-repair-web/src/views/system/ErrorLogManage.vue
  • emergency-repair-web/src/views/system/MenuManage.vue
  • emergency-repair-web/src/router/index.js
  • 删除 emergency-repair-web/src/views/system/MenuPermission.vue

13.2 验证结果

  • 后端 mvn -B -DskipTests clean package 通过;前端 npm run build 通过,仅有既有包体积告警。
  • node .codex-run/verify-req21-22.js 通过:二级目录和错误日志菜单显示正常,旧“菜单权限管理”不存在;角色权限弹窗按钮节点数 78,权限反显正常。
  • 错误日志列表、异常类型筛选和堆栈详情页面验证通过;人为触发非法接口参数后成功落库,临时验证记录已清理。
  • 截图:.codex-run/role-permission-dialog-verified.png、.codex-run/error-log-verified.png。

13.3 接手注意

  • 错误日志目前覆盖进入 Spring MVC 全局异常处理的异常;启动阶段异常、异步线程异常若绕过该处理器,暂不会自动记录。
  • 本轮代码与交接记录一并提交并推送公司 Git 仓库 main 分支。
  • .codex-run、Office 锁文件及 emergency-repair-web/public/新建 文本文档.txt 仍为本地临时文件,不应提交。

十四、2026-10-06 联调收尾(需求 23-25)

序号 需求 状态 实现与验证
23 系统名称、版本改为关键词配置,版本红色显示 已完成 codename 为 rk_SystemName、rk_SystemVer;登录页、页头、Logo 和浏览器标题统一读取配置,页头版本为红色
24 完工信息查阅,多故障及多条完工明细展示 已完成 增加 /completion/query 和 GET /api/work-orders/completion/query;按故障汇总,同一故障的多张派工单展开为多行,故障信息列使用 rowspan 纵向合并,处理情况和器材支持多条
25 菜单管理编辑时可修改父节点 已完成 上级菜单改为级联选择器,排除自身和全部下级;后端增加父节点、自引用和循环层级校验

14.1 主要变更文件

后端:

  • 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

14.2 完工信息查阅口径

  • 结果按故障汇总,不按派工单汇总。
  • 一个故障有多张已填报完工信息的派工单时,表格展开为多行;序号、故障编号、rk_X号、设备名称、工程名称及损坏情况、上报单位、上报日期这 7 列共用故障行,使用单元格纵向合并。
  • 派工单编号、承修单位、完工状态、工程编号、开工/完工、承修人、完工处理情况、更换器材、修后质量、原因分析、提交时间按派工单展示。
  • 查询支持关键词、承修单位、完工状态和完工日期;关键词同时匹配故障、派工单、工程编号、承修人、处理情况和器材。

14.3 验证结果

  • 后端 mvn -B -DskipTests compile 通过;前端 npm run build 通过,仅有既有包体积告警。
  • node .codex-run/verify-req23-25.js 通过:系统名称、版本和红色样式正常;完工查阅正常;菜单编辑父节点“故障管理”可编辑。
  • 临时构造同一故障两张派工单、两条完工记录,接口返回 1 个故障节点和 2 张派工单,各带处理情况和器材明细。
  • 浏览器显示 2 张派工单行,故障编号只出现 1 次,7 个故障信息列均为 rowspan=2;两张单的明细均正常;截图 .codex-run/completion-query-merge-verified.png。临时数据已清理。
  • 菜单级联父节点接口实测可正常移动子菜单;选择自身或下级时被后端拒绝,临时菜单已清理。

14.4 当前服务与接手注意

  • 前端 http://localhost:8082;后端 http://127.0.0.1:8091;DM8 127.0.0.1:5236;Edge 调试端口 9222。
  • 登录 admin / admin123;数据库 SYSDBA/SYSDBA,业务 schema LX。
  • 完工查阅当前只展示已有 T_COMPLETION_INFO 完工填报记录的派工单,并且接口未分页。
  • 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 main 分支。
  • .codex-run、Office 锁文件及 emergency-repair-web/public/新建 文本文档.txt 仍为本地临时文件,不应提交。

    十五、2026-10-06 联调收尾(需求 21 权限设置范围切换)

序号 需求补充 状态 实现与验证
21 权限设置增加“全部 / 已设置”切换 已完成 RolePermissionDialog.vue 增加范围切换;“全部”显示完整菜单及按钮树并可全选,“已设置”仅显示当前角色已授权节点和父级路径,切换时保留未保存勾选,重新打开默认“全部”

15.1 主要变更文件

  • emergency-repair-web/src/views/system/RolePermissionDialog.vue
  • requirement/改进20261003.txt(补充需求 21 的范围切换口径)

15.2 验证结果

  • 前端 npm run build 通过,仅有既有包体积告警。
  • node .codex-run/verify-req21-22.js 通过:左侧无“菜单权限管理”,角色管理存在“权限设置”。
  • 全部视图显示 119 个复选框、13 个已勾选、1 个半选;已设置视图显示 14 个节点,均为当前已设置节点或父级路径;切回全部后勾选状态恢复,无网络异常。
  • 截图:.codex-run/role-permission-assigned-scope.png。

15.3 接手注意

  • 当前运行:前端 http://localhost:8082;后端 http://127.0.0.1:8091;DM8 127.0.0.1:5236;Edge CDP 9222。登录 admin / admin123。
  • 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 main 分支。
  • .codex-run、Office 锁文件及 emergency-repair-web/public/新建 文本文档.txt 仍为本地临时文件,不应提交。

十六、2026-10-06 联调收尾(需求 26 日志日期范围分隔符)

序号 需求 状态 实现与验证
26 日志管理的日期组件两个日期中间的“至”显示不完整 已完成 登录日志、操作日志、错误日志的 .el-range-separator 固定为 18px 并居中,三个页面实际宽度、clientWidth、scrollWidth 均为 18px

16.1 主要变更文件

  • 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)

16.2 验证结果

  • 前端 npm run build 通过,仅有既有包体积告警。
  • node .codex-run/verify-req26.js 通过:三个日志页面均显示“至”,无裁切,无网络异常。
  • 截图:.codex-run/login-log-date-separator.png、.codex-run/operation-log-date-separator.png、.codex-run/error-log-date-separator.png。

16.3 接手注意

  • 当前运行:前端 http://localhost:8082;后端 http://127.0.0.1:8091;DM8 127.0.0.1:5236;Edge CDP 9222。登录 admin / admin123。
  • 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 main 分支。
  • .codex-run、Office 锁文件及 emergency-repair-web/public/新建 文本文档.txt 仍为本地临时文件,不应提交。

十七、2026-10-06 联调收尾(需求 27 设备选择范围)

序号 需求 状态 实现与验证
27 新增故障选择 rk_X号 后,设备选择器应只显示所选 side 节点的下级 已完成 后端只返回所选 side 节点作为根;前端自动展开该根节点并继续懒加载下级,接口与浏览器验证通过

17.1 主要变更文件

  • emergency-repair-server/src/main/java/com/emergencyrepair/system/service/SystemService.java
  • emergency-repair-web/src/components/ProductTreePicker.vue
  • requirement/改进20261003.txt(补充需求 27)

17.2 验证结果

  • 后端 mvn -B -DskipTests compile、mvn -B -DskipTests package 通过;前端 npm run build 通过,仅有既有包体积告警。
  • GET /api/system/tree/product/side-roots?xNo=203 只返回对应的 side 根节点;201 / 203 / 301 / 测试T 均分别验证通过。
  • node .codex-run/verify-req27.js 通过:根节点文本仅为 203,自动展开 1 个根节点,显示下级系统节点,无网络异常。
  • 请求链路确认:side-roots?xNo=203 后请求 children?parentId=1280000000000009729。截图:.codex-run/req27-side-tree.png。

17.3 接手注意

  • 当前运行:前端 http://localhost:8082,PID 138164;后端 http://127.0.0.1:8091,PID 148268;DM8 127.0.0.1:5236;Edge CDP 9222。登录 admin / admin123。
  • 需求 26 已提交并推送,提交 f651ad5;需求 27 已提交并推送,提交 f9114ff(fix: limit equipment picker to selected X number)。
  • 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 main 分支。
  • .codex-run、Office 锁文件及 emergency-repair-web/public/新建 文本文档.txt 仍为本地临时文件,不应提交。

十八、2026-10-06 联调修复(菜单名称被启动初始化覆盖)

问题 状态 实现与验证
系统配置下“产品结构树管理”手工改为“产品结构树”后,后端重启又加回“管理” 已修复 DataInitializer.ensureMenu() 不再覆盖已存在菜单名称;新建菜单默认名称改为“产品结构树”;改名后重启新 jar 名称保持不变

18.1 主要变更文件

  • emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DataInitializer.java

18.2 验证结果

  • 后端 mvn -B -DskipTests compile、mvn -B -DskipTests package 通过。
  • 菜单记录 id=2101493905517301763、url=/system/product-tree 改名为“产品结构树”后,新 jar 重启并再次查询,名称仍为“产品结构树”。
  • 当前后端 PID 151580,监听 http://127.0.0.1:8091;前端仍监听 http://localhost:8082。

十九、2026-10-07 清空故障及完工业务数据

操作 结果
清空故障、派工单、完工处理及完工信息数据 T_FAULT、T_WORK_ORDER、T_COMPLETION_INFO、T_ACCEPTANCE 四表均从原数量清为 0
防止重启回填演示数据 新增 app.seed-demo-data=false,默认不再执行 seedBusinessData()

19.1 主要变更文件

  • emergency-repair-server/src/main/java/com/emergencyrepair/bootstrap/DataInitializer.java
  • emergency-repair-server/src/main/resources/application.yml

19.2 验证结果

  • 清空前:故障 23、派工单 8、完工信息 6、验收 6;清空后均 0。
  • 后端 mvn -B -DskipTests clean package 通过;新 jar 重启后四表仍均为 0。
  • 当前后端 PID 21528,监听 8091;前端 PID 57312,监听 8082;后端错误日志为空。

二十、2026-10-07 联调收尾(需求 28-30)

序号 需求 状态 实现与验证
28 组织机构增加扩展属性设置,设置部门负责rk_T 已完成 组织机构列表增加“扩展属性”按钮和弹窗,从产品结构树 side 节点中单选 rk_X号,保存到 LX.T_SYS_DEPT_EXT,不修改外部 SYS_DEPT
29 用户管理增加扩展属性设置 已完成 列表展开显示工程专业、rk_T队专业、负责rk_T三列,最后操作列提供“编辑属性”;可保存到 LX.T_SYS_USER_EXT,不修改外部 SYS_USER;rk_TD专业与现有 teamMajor 为同一字段
30 新增故障默认值 已完成 上报单位取登录用户单位,负责人取登录用户,rk_X号只取部门扩展属性,工程专业和rk_T队专业取用户扩展属性;未配置时留空,不再取列表第一项

20.1 确认口径

  • 需求 30 编号正确;新增故障里的“责任”就是“负责人”。
  • 部门扩展属性“负责rk_T”就是 rk_X号,单选;新增故障的 rk_X号 只以部门设置为准,即使用户也设置了“负责rk_T”也不参与该默认值。
  • rk_TD专业就是现有页面里的“rk_T队专业”,后续暂统一沿用现有显示,字段为 teamMajor。
  • 外部 CSICZB_ZB.SYS_DEPT、CSICZB_ZB.SYS_USER 由其他系统维护,扩展属性均存本地扩展表。

20.2 接口与数据表

  • LX.T_SYS_DEPT_EXT:DEPT_ID、RESPONSIBLE_X_NO、审计字段。
  • LX.T_SYS_USER_EXT:USER_ID、ENGINEERING_MAJOR、TEAM_MAJOR、RESPONSIBLE_X_NO、审计字段。
  • GET/PUT /api/system/depts/{deptId}/ext:查询、保存部门扩展属性。
  • GET/PUT /api/system/users/{userId}/ext:查询、保存用户扩展属性。
  • /api/auth/login、/api/auth/me返回用户、部门和专业扩展信息,供新增故障默认值使用。
  • 新增按钮权限 system:organization:ext、system:users:ext。

20.3 主要变更文件

  • 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、HANDOFF.md(补充需求 28-30 和交接记录)

20.4 验证结果

  • 后端 mvn -B -DskipTests clean package 通过;前端 npm run build 通过,仅有既有包体积告警。
  • node .codex-run/verify-req28-30.js 返回 pass: true。
  • 部门 sy区域 设置 rk_X号=201;用户 yszl 设置工程专业 动力专业、rk_T队专业 液压专业、负责 202。
  • 新增故障默认值实测:上报单位 sy区域、负责人 助理用户(演示)、rk_X号=201、rk_T队专业 液压专业、工程专业 动力专业。
  • 用户管理页面实测展开三列,表头顺序为工程专业、rk_T队专业、负责rk_T、状态、操作,最后操作列每行显示“编辑属性”。
  • 截图:.codex-run/req28-org-ext.png、.codex-run/req29-user-ext.png、.codex-run/req30-fault-defaults.png。
  • 验证后已清空临时扩展属性,查询确认 configured=false 且字段为空。

20.5 接手注意

  • 当前后端 PID 56124,监听 http://127.0.0.1:8091;前端 PID 57312,监听 http://localhost:8082;DM8 127.0.0.1:5236;Edge CDP 9222。登录 admin / admin123。
  • 开发环境敏感词会把 rk_T 显示成“梯”,截图中的“负责梯”对应代码/后端字段 rk_T。
  • .codex-run、Office 锁文件及 emergency-repair-web/public/新建 文本文档.txt 仍为本地临时文件,不应提交。
  • 本轮代码、需求文件和交接记录一并提交并推送公司 Git 仓库 main 分支。

二十一、2026-10-07 联调修复(CMB 审批后 JCC 助理列表未刷新)

问题 状态 根因与修复
rk_CMB领导审批 通过后进入 rk_JCC助理审批,列表没有数据 已修复 CMB、JCC 助理、JCC 处长共用 SimpleApproval.vue 和同一 keep-alive 缓存名;原组件仅在 created() 查询一次,切换 stage 时没有重新请求。现监听 stage,切换时清空旧列表并立即按新状态查询;缓存页签再次激活时也会刷新

21.1 主要变更文件

  • emergency-repair-web/src/views/fault/SimpleApproval.vue

21.2 验证结果

  • 前端 npm run build 通过,仅有既有包体积告警。
  • 真实接口数据:XCB_REVIEWED 为 0 条,CMB_APPROVED 为 3 条。
  • node .codex-run/verify-cmb-jcc-refresh.js 返回 pass: true。
  • 直接进入 CMB 显示 0 条;切到 JCC 助理后重新查询并显示 3 条;从其他页签返回 JCC 助理后重新查询并显示 3 条。
  • 截图:.codex-run/cmb-jcc-refresh-verified.png。

21.3 接手注意

  • 当前前端 PID 57312,监听 http://localhost:8082;后端 PID 56124,监听 http://127.0.0.1:8091;DM8 127.0.0.1:5236;Edge CDP 9222;登录 admin / admin123。
  • .codex-run、Office 锁文件及 emergency-repair-web/public/新建 文本文档.txt 仍为本地临时文件,不应提交。
  • emergency-repair-web/public/sensitive-words.json 是用户既有未提交修改,本轮不纳入提交。

二十二、2026-10-07 业务字典改为发布后可修改

需求 状态 实现
dict.js 移到 public,发布后仍可修改 已完成 新增 public/dict.js 保存任务、完工、验收状态字典,通过 window.__APP_DICT__ 暴露;src/utils/dict.js 作为加载和兜底适配层;应用启动前按时间戳加载,构建后对应文件为 dist/dict.js

22.1 主要变更文件

  • emergency-repair-web/public/dict.js
  • emergency-repair-web/src/utils/dict.js
  • emergency-repair-web/src/main.js

22.2 验证结果

  • 前端 npm run build 通过,dist/dict.js 正常生成,仅有既有包体积告警。
  • 临时修改 public/dict.js 的“未上报”文字后,不重新构建,仅刷新故障上报页面即生效;恢复后刷新也立即恢复。
  • 页面资源请求包含 /dict.js?ts=...,发布后修改文件不会被旧缓存阻塞。

22.3 发布后维护说明

  • 生产环境直接编辑部署目录中的 dist/dict.js,可修改状态显示文字和 type,刷新页面生效。
  • 不要重新执行前端构建,否则当前 public/dict.js 会再次覆盖部署目录中的修改。
  • dict.js 不可用或字段非法时,应用继续使用源码内置字典,不影响页面启动。