song.jun
2026-05-20 87054d98234d4c37fc3ba9595efe63bcfdc30b07
修复 EQAS 报告 PDF 直抗扣分未汇总等 6 处遗漏(QCService.ExportPDF)

xlsx 模板里早就预留了"直抗"汇总位置(K23 行、Y9 列、M23/N23/O23、
O24 累计已引用 O23),但 ExportPDF 长期漏写,导致即使 ZhiKang.RealScore
在 ViewModel 层算了,PDF 上"您实验室以上罚分"、累计罚分、每个患者
"您的分数"都不体现直抗扣分。

本次修复(QCService.cs 单文件 6 处):
1. errors_ABO/errors_RH 的 ?: + + 运算符优先级 bug,并修复 RH 复制粘贴
成 RH1/RH1/RH1
2. 新增 errors_ZhiKang 统计
3. 写入 M23(直抗错误数)、N23/O23(直抗标准分值/总扣分)
4. M24 累计错误数加入 errors_ZhiKang,顺序按 ABO/RH/直抗/筛选/鉴定/交叉
调整
5. AA10/AA14/AA18(每个患者"您的分数")加上对应患者的 ZhiKang.RealScore
6. O24(累计总分)原已引用 O23,本次写入 O23 后自动正确

未改:Y21/Y22("您实验室以上罚分"区只有 ABO/RhD 两行标签,直抗汇总走
K23/O23)。

已知技术债(同源、本次未处理):errors_Filter / errors_Identity /
errors_JiaoCha(QCService.cs:307/344/406)有同款 ?: 优先级 bug,
留待后续单独修。

无自动化测试覆盖(本仓库无单测工程),需在测试环境用直抗答错数据手工验证。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1个文件已修改
33 ■■■■■ 已修改文件
sbcLabSystem.Service/QC/QCService.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sbcLabSystem.Service/QC/QCService.cs
@@ -223,37 +223,50 @@
            double Page3_3 = 0;
            double temp1 = 0;
            double temp2 = 0;
            double temp3 = 0;
            int errors_ABO = 0;
            int errors_RH = 0;
            int errors_ZhiKang = 0;
            errors_ABO += ABO1["RealScore"].ToString() == "0" ? 0 : 1 +
                ABO2["RealScore"].ToString() == "0" ? 0 : 1 +
                ABO3["RealScore"].ToString() == "0" ? 0 : 1;
            errors_RH += RH1["RealScore"].ToString() == "0" ? 0 : 1 +
                RH1["RealScore"].ToString() == "0" ? 0 : 1 +
                RH1["RealScore"].ToString() == "0" ? 0 : 1;
            errors_ABO += (ABO1["RealScore"].ToString() == "0" ? 0 : 1)
                + (ABO2["RealScore"].ToString() == "0" ? 0 : 1)
                + (ABO3["RealScore"].ToString() == "0" ? 0 : 1);
            errors_RH += (RH1["RealScore"].ToString() == "0" ? 0 : 1)
                + (RH2["RealScore"].ToString() == "0" ? 0 : 1)
                + (RH3["RealScore"].ToString() == "0" ? 0 : 1);
            errors_ZhiKang += (ZhiKang1["RealScore"].ToString() == "0" ? 0 : 1)
                + (ZhiKang2["RealScore"].ToString() == "0" ? 0 : 1)
                + (ZhiKang3["RealScore"].ToString() == "0" ? 0 : 1);
            ws.Cells["M18"].Value = errors_ABO;
            ws.Cells["M19"].Value = errors_RH;
            ws.Cells["M23"].Value = errors_ZhiKang;
            ws.Cells["N18"].Value = ABO1["Score"].ToString();
            ws.Cells["N19"].Value = RH1["Score"].ToString();
            ws.Cells["O18"].Value = int.Parse(ABO1["Score"].ToString()) * errors_ABO;
            ws.Cells["O19"].Value = int.Parse(RH1["Score"].ToString()) * errors_RH;
            ws.Cells["N23"].Value = ZhiKang1["Score"].ToString();
            ws.Cells["O23"].Value = double.Parse(ZhiKang1["RealScore"].ToString())
                + double.Parse(ZhiKang2["RealScore"].ToString())
                + double.Parse(ZhiKang3["RealScore"].ToString());
            double.TryParse(ABO1["RealScore"].ToString(), out temp1);
            double.TryParse(RH1["RealScore"].ToString(), out temp2);
            Page3_1 = temp1 + temp2;
            double.TryParse(ZhiKang1["RealScore"].ToString(), out temp3);
            Page3_1 = temp1 + temp2 + temp3;
            ws.Cells["AA10"].Value = Page3_1;
            double.TryParse(ABO2["RealScore"].ToString(), out temp1);
            double.TryParse(RH2["RealScore"].ToString(), out temp2);
            Page3_2 = temp1 + temp2;
            double.TryParse(ZhiKang2["RealScore"].ToString(), out temp3);
            Page3_2 = temp1 + temp2 + temp3;
            ws.Cells["AA14"].Value = Page3_2;
            double.TryParse(ABO3["RealScore"].ToString(), out temp1);
            double.TryParse(RH3["RealScore"].ToString(), out temp2);
            Page3_3 = temp1 + temp2;
            double.TryParse(ZhiKang3["RealScore"].ToString(), out temp3);
            Page3_3 = temp1 + temp2 + temp3;
            ws.Cells["AA18"].Value = Page3_3;
            ws.Cells["Y21"].Value = double.Parse(ABO1["RealScore"].ToString()) +
@@ -402,7 +415,7 @@
            ws.Cells["M22"].Value = errors_JiaoCha;
            ws.Cells["O22"].Value = ws.Cells["AS22"].Value;
            ws.Cells["M24"].Value = errors_ABO + errors_Filter + errors_Identity + errors_JiaoCha + errors_RH;
            ws.Cells["M24"].Value = errors_ABO + errors_RH + errors_ZhiKang + errors_Filter + errors_Identity + errors_JiaoCha;
            ws.Cells["O24"].Value = double.Parse(ws.Cells["O18"].Value.ToString()) +
                double.Parse(ws.Cells["O19"].Value.ToString()) +
                double.Parse(ws.Cells["O20"].Value.ToString()) +