编辑 | 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 分支。
  • 注意事项:requirement/改进20261003.txt 是用户原始需求记录,本次未修改。

2026-10-04 更新:需求 11、12、17-19 已完成并完成浏览器、接口及端到端联调;本轮代码与交接文档将统一提交并推送 main 分支。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 是本地联调或临时文件,不应提交。