song.jun
3 天以前 712de30133f921b5ac1f1ae2a1b77fff8b709c20
refs
用户 song.jun <lion0756@qq.com>
星期一, 四月 13, 2026 12:49 +0800
提交者 song.jun <lion0756@qq.com>
星期一, 四月 13, 2026 12:49 +0800
提交712de30133f921b5ac1f1ae2a1b77fff8b709c20
目录 18694b5b244dc3036768b03489cbc2883f6ac9ef 目录 | zip | gz
parent a3f4e4f2423a8d71b4c65e90920db34f2001aa7d 查看 | 对比
修正代码评审发现的 Critical 问题(a3f4e4f 后续修复)

评审发现两个 P0 回归和一个 P1 问题:

P0.1: ToEntityByLabCode 的 ProjectId 过滤导致后台流程静默失效
- 问题:前端 QCDistributionLabs.cshtml 的 openFeeWindow/openEMSWindow
把 CurrentQCDistRegisterInfo 重置为不含 ProjectId 字段的 JSON 字面量,
ko.mapping.toJS 序列化时根本不会带 ProjectId,服务端收到 0,
无条件加过滤会让 ConfigrmFee/ConfigrmEMS/switchNextOne 全部命不中
现有登记行,静默失败。
- 修复:改为条件过滤 —— 仅当 regInfoivewModel.ProjectId > 0 才加入
WHERE 子句,否则退化为只按 (QCDist, LabId) 匹配,与修复前一致。
未来若前端补 ProjectId 控件,服务端自动切换到精准匹配。

P0.2: MergeRegisterInfo 字符串规则在 Id=0 路径下会清空既有 EMSNo
- 问题:QCDistributionRegisterInfoViewModel.ToEntity:629 有
`entity.EMSNo = viewModel.EMSNo == null ? "" : viewModel.EMSNo.Trim()`
这类 force-set 代码,把 null 强制变成 ""。MergeRegisterInfo 按
`source != null` 判断就会把空串覆盖到 existing.EMSNo,清空既有
快递单号。
- 修复:10 个字符串字段全部改用 `!string.IsNullOrEmpty(source)` 判断。
空串视为"未设置",不覆盖既有值。

P1.4: LogHelper.Info("[WARN] ...") 告警级别形同虚设
- 问题:LogHelper wrapper 没有 Warn 方法,用 Info + 字符串前缀冒充
告警级别,实际生产 NLog 配置只对 Warn/Error/Fatal 级别转发告警,
Info 条目只会静默进日志文件。
- 修复:改用 LogHelper.Error。本条目本质是"应用状态异常需立即调查",
用 Error 级别合理。CLAUDE.md 同步更新解释此选择。

P1.3 不采纳:两道防线的合并规则不对称是刻意设计 —— 第一道(SaveLabList
路径)基于业务语义只同步 IsCharged+ModifyTime,第二道(SaveQcDistributionRegister
兜底)走全字段通用合并;两者服务不同场景,一致性不是目标。CLAUDE.md
补充说明此意图。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3个文件已修改
47 ■■■■■ 已修改文件
CLAUDE.md 11 ●●●● 对比 | 查看 | 原始文档 | blame | 历史
sbcLabSystem.Service/QC/QCService.cs 24 ●●●● 对比 | 查看 | 原始文档 | blame | 历史
sbcLabSystem/Models/Backstage/QCDistributionRegisterInfoViewModel.cs 12 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史