GuDingZiChan/docs/2026-10-09_问题修复与验证记录.md

9.7 KiB
Raw Blame History

2026年10月9日 固定资产系统问题修复与验证记录

本轮已在本地修复原审计第 2–9、13–20 项业务与使用流程问题,并处理第 26 项中可兼容升级的应用依赖。前后端、两种打印助手和隔离 MySQL 回归通过。以下为提交前的本地验收记录;记录时尚未提交或发布,该修复阶段未连接生产、修改真实资产、重发通知或操作实体打印机。

按用户要求,账号安全、发布与备份相关整改不做。本轮开始时记录的 12 个认证、部署及配置文件 SHA256 在结束时一致;已有工作区改动保留。原始问题及当时生产证据见审查清单,不能把本地修复视为生产已经生效。

已修复行为

原审计项 修复结果
2 详情错位 切换资产时重建详情页面,异步请求按当前操作范围校验;旧请求不能覆盖新资产或已关闭的归还弹窗。资料未加载完成时不能提交操作。
3 损坏、丢失归还 损坏归还保留实物库存,但状态为“已损坏”、可用价值为 0;丢失归还记“已丢失”和 loss 流水,剩余数量为 0。普通与批量归还一致,统计单独列出损失数量。已丢失资产不能通过调拨、报废或修改数量恢复可用状态。
4–5 维修树与并发 未结束维修期间禁止挂载、卸载。完成与取消维修使用维修单和整树锁,并核对关系、状态、版本;竞争操作只能有一方成功,不覆盖另一方已经改变的状态。
6 HR 同步 写入组织和人员前拒绝空源、缺失或重复人员标识、异常减员;同一进程不能重叠执行同步。默认停用超过现有同步人数的 20% 或超过 50 人即停止,阈值配置无效也停止。
7–9 打印一致性与恢复 每次领取获得独立凭据和租约,状态更新采用条件写入。过期任务进入“结果待核实”,不自动重印;完成结果可以幂等补报,旧凭据和晚到失败不能覆盖完成或新派单。Electron 和 .NET 助手在出纸前持久化阶段,重启只对账,不再次执行未核实任务。
13 会话过期循环 获取用户失败时同步清理 Pinia 和持久化认证状态,稳定进入登录页,不再与首页循环。后端登录、密码和会话撤销策略未改。
14 跨页选择 缓存全部选中资产,跨页借还不遗漏前页选择;单项操作只移除成功项,批量失败项继续保留供处理。
15 时间偏移 浏览器提交带时区的 ISO 时间;后端兼容历史无时区输入,并按上海时区解析,避免 UTC 服务器造成 8 小时偏移。
16 Excel 导入 保留工作表实际行号,包括非 A1 起始区域及空行;数量 0、非数字和非法价格逐行报错,不默认为 1 或在序列化时变成 0。
17–18 盘点状态与计数 修改明细、分配和更新汇总在同一事务中先锁定任务;已关闭任务拒绝再分配,并发扫描和管理员核验不会丢失汇总或审计动作。
19 配件归还确认 借出时为空的配件集合仍与当前树比对;归还确认绑定当前树和版本,确认后树发生变化会返回冲突,不能沿用旧确认。各普通归还页面都处理确认流程。
20 标签图片与请求大小 校验 PNG 签名、块顺序、CRC、尺寸、解压字节数和像素过滤格式;每任务最多 100 张,单图最多 2 MiB,总图最多 20 MiB。普通 JSON/form 最多 5 MiB;标签 JSON 在现有登录与打印权限检查后解析,上限 30 MiB,容纳 base64 开销。

多数量资产的损坏、丢失归还若无法用现有单一状态准确表达,会返回 409 并保留原记录,要求单独核实,避免把部分损坏的资产误记为整批可用。丢失资产的历史购入成本继续保留,实物数量与可用价值排除损失,页面注明统计口径。

打印管理员处理“结果待核实”时,必须选择已出纸、未出纸或取消,并勾选已核实;没有预选结果。未出纸才允许重新派单。未知结果保留原 PNG,新派单换领取凭据;完成或取消后才清理图片。客户端校验服务器返回的任务 ID、凭据和状态,409、空响应或未知状态都不会直接丢弃恢复记录。Electron 同时只允许一个应用实例运行。

HR 阈值可通过 HR_SYNC_MAX_DEACTIVATION_RATIO 和 HR_SYNC_MAX_DEACTIVATION_COUNT 配置。当前重叠保护仅限同一进程;本轮没有引入多实例调度或分布式锁。

验证结果

验证 结果与覆盖范围
前后端 npm run build 均通过;前端仍有统计相关 chunk 约 1.13 MB 的构建提示,未据此认定实际页面卡顿。
后端全套测试 285 项通过,2 个实库套件默认跳过;常规测试使用不可用的本机数据库地址,避免误连真实库。
本机 MySQL 打印回归 10/10 通过:竞争领取、重复完成、旧凭据、租约失效、部分出纸未知、人工核实竞争、PNG 保留与清理、真实 GET /api/health。
本机 MySQL 业务回归 5/5 通过:连接范围门禁、并发盘点与核验、关闭后分配拒绝、维修完成/取消竞争 4 轮、损坏与丢失归还。
前端专项回归 24/24 通过:路由、请求竞态、跨页选择、会话失效、时间、导入与归还确认,以及既有借还和标签展示。
请求体真实 HTTP 回归 5/5 通过:普通 JSON/form 大小拒绝、权限检查先于标签解析、授权大标签、大小写/尾斜杠/中间双斜杠/查询串,以及近似路径与打印上限。已计入后端全套数量。
Electron 助手 29/29 通过,覆盖持久化恢复、回写断网、部分打印失败和无效服务器回读。
.NET 助手 实际 Windows 项目构建 0 警告、0 错误;7 组恢复测试通过。
Prisma 客户端生成通过;新增打印迁移 SQL 在独立测试库基线执行成功,健康检查读取新增业务列成功。
浏览器 使用本机模拟数据操作真实前端:跨页两项均进入批量弹窗,打印核实必须主动选择并确认,390px 手机视口弹窗可用,丢失资产禁调拨,401 后稳定进入登录页。未向生产提交任何动作。
工作区检查 git diff --check 通过;排除的 12 个文件与本轮开始时哈希相同。

两套实库测试显式启用才运行,连接限定本机专用端口和 equipment_audit 数据库,拒绝其他目标和连接参数覆盖。测试样本及衍生记录已按确切 ID 清理并核查零残留;本轮创建的数据库容器、浏览器页和模拟服务已移除或停止。

前端回归在 frontend 目录执行:

node --test scripts/test-audit-functional-fixes.ts scripts/test-audit-routing.mjs scripts/test-borrow-scan-state.ts scripts/test-return-scan-state.ts scripts/test-notification-quick-return.ts scripts/test-phase-two-presentation.ts scripts/test-local-batch-print.ts

后端全部 src/**/*.test.ts 使用 ts-node/register 执行;实库测试分别通过 RUN_PRINT_DB_TESTS=true、RUN_BUSINESS_DB_TESTS=true 启用。Electron 使用 npm test,.NET 使用 dotnet build 和 RecoveryTests 控制台项目。

依赖处理与保留边界

前端生产依赖审计由 10 项包级告警降至 0;xlsx 按 SheetJS 官方安装说明切换到官方 0.20.3 分发包。后端在现有兼容范围内更新,删除无使用入口的 multer 及其类型包;ExcelJS 的 uuid 子依赖固定到修复版本 11.1.1,并验证 XLSX 写入、读取和条件格式往返。uuid 安全公告

后端生产依赖告警由 27 项降至 11 项,不能宣称清零:

  • 8 项属于保留的 Keycloak 认证依赖链,含 6 项 high、2 项 low;本轮不做认证链跨主版本调整。
  • 3 项 moderate 来自 sprintf-js → tedious → mssql 同一依赖链。上游公告尚无修复版本。已检查当前 SQL 驱动内使用点均为固定格式串,没有发现本项目把不可信数据用作格式串的入口;这不等于依赖告警消失。

第 26 项因此仅完成应用依赖中已验证的兼容修复。Node 容器运行时及容器资源、日志配置属于用户排除的发布配置,保持原状。

账号登录限流、密码强度、改密撤销会话、Keycloak 身份映射、旧盘点链接身份策略、打印 HTTP 长期令牌限制,以及数据库账号和端口、发布回退、备份内容/权限/保留策略均未整改。对应原清单第 1、10–12、21–25 项及 3 个条件性安全风险继续保留。

后续使用条件

新增打印字段位于增量迁移。未来上线需要数据库迁移和支持协议 2 的新版助手配套;旧助手领取任务会得到更新提示。此次只完成源码、构建和测试,没有发布安装包或部署服务。

本机验证了新增增量 SQL,未证明现有历史迁移能从空库完整部署;早期迁移依赖预先存在的基础表,该发布基线缺口按用户要求保留。历史维修没有可靠快照时仍拒绝猜测还原;旧借用配件快照按既有空集合语义比较当前树,不凭空补造历史配件。

尚未验收实体打印出纸、真实用户登录流程和生产流量表现。当前恢复设计减少重复出纸风险,但打印机提交与服务端写入不能形成同一事务;“结果待核实”仍需要核实实物后决定,不能承诺实体打印恰好一次。