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

76 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2026年10月9日 固定资产系统问题修复与验证记录
本轮已在本地修复原审计第 2–9、13–20 项业务与使用流程问题,并处理第 26 项中可兼容升级的应用依赖。前后端、两种打印助手和隔离 MySQL 回归通过。以下为提交前的本地验收记录;记录时尚未提交或发布,该修复阶段未连接生产、修改真实资产、重发通知或操作实体打印机。
按用户要求,账号安全、发布与备份相关整改不做。本轮开始时记录的 12 个认证、部署及配置文件 SHA256 在结束时一致;已有工作区改动保留。原始问题及当时生产证据见[审查清单](<D:/AI Code/GuDingZiChan/docs/2026-10-09_项目问题与隐患审查.md>),不能把本地修复视为生产已经生效。
## 已修复行为
| 原审计项 | 修复结果 |
| --- | --- |
| 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` 目录执行:
```powershell
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 官方安装说明](https://docs.sheetjs.com/docs/getting-started/installation/nodejs/)切换到官方 0.20.3 分发包。后端在现有兼容范围内更新,删除无使用入口的 `multer` 及其类型包;ExcelJS 的 uuid 子依赖固定到修复版本 11.1.1,并验证 XLSX 写入、读取和条件格式往返。[uuid 安全公告](https://github.com/advisories/GHSA-w5hq-g745-h8pq)
后端生产依赖告警由 27 项降至 11 项,不能宣称清零:
- 8 项属于保留的 Keycloak 认证依赖链,含 6 项 high、2 项 low;本轮不做认证链跨主版本调整。
- 3 项 moderate 来自 `sprintf-js → tedious → mssql` 同一依赖链。[上游公告](https://github.com/advisories/GHSA-hp3w-g68c-fv3c)尚无修复版本。已检查当前 SQL 驱动内使用点均为固定格式串,没有发现本项目把不可信数据用作格式串的入口;这不等于依赖告警消失。
第 26 项因此仅完成应用依赖中已验证的兼容修复。Node 容器运行时及容器资源、日志配置属于用户排除的发布配置,保持原状。
账号登录限流、密码强度、改密撤销会话、Keycloak 身份映射、旧盘点链接身份策略、打印 HTTP 长期令牌限制,以及数据库账号和端口、发布回退、备份内容/权限/保留策略均未整改。对应原清单第 1、10–12、21–25 项及 3 个条件性安全风险继续保留。
## 后续使用条件
新增打印字段位于[增量迁移](<D:/AI Code/GuDingZiChan/backend/prisma/migrations/20261009_print_claim_recovery/migration.sql>)。未来上线需要数据库迁移和支持协议 2 的新版助手配套;旧助手领取任务会得到更新提示。此次只完成源码、构建和测试,没有发布安装包或部署服务。
本机验证了新增增量 SQL,未证明现有历史迁移能从空库完整部署;早期迁移依赖预先存在的基础表,该发布基线缺口按用户要求保留。历史维修没有可靠快照时仍拒绝猜测还原;旧借用配件快照按既有空集合语义比较当前树,不凭空补造历史配件。
尚未验收实体打印出纸、真实用户登录流程和生产流量表现。当前恢复设计减少重复出纸风险,但打印机提交与服务端写入不能形成同一事务;“结果待核实”仍需要核实实物后决定,不能承诺实体打印恰好一次。