76 lines
9.7 KiB
Markdown
76 lines
9.7 KiB
Markdown
# 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,未证明现有历史迁移能从空库完整部署;早期迁移依赖预先存在的基础表,该发布基线缺口按用户要求保留。历史维修没有可靠快照时仍拒绝猜测还原;旧借用配件快照按既有空集合语义比较当前树,不凭空补造历史配件。
|
||
|
||
尚未验收实体打印出纸、真实用户登录流程和生产流量表现。当前恢复设计减少重复出纸风险,但打印机提交与服务端写入不能形成同一事务;“结果待核实”仍需要核实实物后决定,不能承诺实体打印恰好一次。
|