| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto;
- // ════════════════════════════════════════════════════════════════════════════
- // S5 IQC 项目级结果(Batch 3)读写契约
- //
- // 读:GET /api/S5IqcInspBill/detail 的 lines[] / lineSummary / canEdit(纯加法)
- // 写:POST /api/S5IqcInspection/save-detail
- //
- // 后端派生 / 审计字段(前端一律不得 author,传了也被忽略):
- // sampleNumeric · sample.judgement · itemJudgement · judgementSource
- // inspectorId · inspectionTime · lastResultBy · lastResultAt · tenantId
- // ════════════════════════════════════════════════════════════════════════════
- /// <summary>
- /// 检验单项目实例(检规快照 + 项目级结果)——Detail lines[] 的行。
- /// 快照字段组生成后不可变;结果字段组仅 N1 可编辑态可写。
- /// </summary>
- public class IqcInspBillItemLineRow
- {
- /// <summary>项目实例主键(save-detail 回传用)</summary>
- public long Id { get; set; }
- /// <summary>展示序号(快照自 qms_jygfzb.xh,可空可重复,不作键)</summary>
- public int? Seq { get; set; }
- // ── 来源追溯(仅 lineage,允许悬挂,前端不展示)──
- public long SourceSpecId { get; set; }
- public long SourceSpecItemId { get; set; }
- // ── 检规快照(只读,永不回查 S0)──
- public string? InspectionItem { get; set; }
- public string? InspectionStandard { get; set; }
- public string? MethodTool { get; set; }
- public string? ImageCategory { get; set; }
- public string? SamplingScheme { get; set; }
- public string? SpecRemark { get; set; }
- public string? UpperLimit { get; set; }
- public string? LowerLimit { get; set; }
- // ── 项目级结果 ──
- /// <summary>NUMERIC / NON_NUMERIC;NULL = 未定(合法初态,由 N1 首次录入时选定)</summary>
- public string? ResultType { get; set; }
- /// <summary>PASS / FAIL / INVALID;NULL = 未录。后端唯一写入方</summary>
- public string? ItemJudgement { get; set; }
- /// <summary>AUTO / MANUAL;测量事实变更即强制复位为 AUTO</summary>
- public string? JudgementSource { get; set; }
- /// <summary>NON_NUMERIC 的测量真源之一;NUMERIC 恒为 NULL</summary>
- public decimal? QualifiedQty { get; set; }
- /// <summary>NON_NUMERIC 的测量真源之一;NUMERIC 恒为 NULL</summary>
- public decimal? UnqualifiedQty { get; set; }
- public string? ResultRemark { get; set; }
- public long? LastResultBy { get; set; }
- public DateTime? LastResultAt { get; set; }
- /// <summary>NUMERIC 的测量真源;NON_NUMERIC 恒为空数组</summary>
- public List<IqcInspBillItemSampleRow> Samples { get; set; } = [];
- }
- /// <summary>逐样本实测值(仅 NUMERIC 使用)。</summary>
- public class IqcInspBillItemSampleRow
- {
- public long Id { get; set; }
- public int SampleIndex { get; set; }
- /// <summary>检验员录入原文(原样保留,供 INVALID 复盘)</summary>
- public string? SampleValueRaw { get; set; }
- /// <summary>后端解析值;不可解析 = NULL(不丢原文)</summary>
- public decimal? SampleNumeric { get; set; }
- /// <summary>PASS / FAIL / INVALID;后端唯一写入方</summary>
- public string? Judgement { get; set; }
- public string? Remark { get; set; }
- public long? InspectorId { get; set; }
- public DateTime? InspectionTime { get; set; }
- }
- /// <summary>
- /// 项目级结果汇总(后端实时聚合,不落表)。
- /// itemCount = 0 时全部为 0(LEGACY MODE:历史单 / NO_SPEC 新单 / MATCHED+0 明细新单同一语义)。
- /// </summary>
- public class IqcInspBillLineSummary
- {
- /// <summary>项目实例总数;0 ⇒ LEGACY MODE</summary>
- public int ItemCount { get; set; }
- /// <summary>已给出 PASS/FAIL 的项目数(可提交口径)</summary>
- public int JudgedCount { get; set; }
- public int PassCount { get; set; }
- public int FailCount { get; set; }
- public int InvalidCount { get; set; }
- /// <summary>itemJudgement 为 NULL 的项目数</summary>
- public int UnjudgedCount { get; set; }
- }
- // ────────────────────────────── save-detail 入参 ──────────────────────────────
- /// <summary>
- /// 保存项目级检验结果(草稿,**不推进流程**)。
- /// item 级增量:未出现在 items 中的项目完全不动。
- /// item 内样本全量替换:携带的 samples 即该项目的完整新集合。
- /// </summary>
- public class IqcSaveDetailInput
- {
- /// <summary>检验单 id(qms_qcp_inspbill.id)</summary>
- public long BillId { get; set; }
- public List<IqcSaveDetailItemInput> Items { get; set; } = [];
- }
- /// <summary>单个项目的结果入参。</summary>
- public class IqcSaveDetailItemInput
- {
- /// <summary>项目实例 id;必须属当前租户 + 当前 bill,否则整单 400</summary>
- public long ItemId { get; set; }
- /// <summary>
- /// 录入类型 NUMERIC / NON_NUMERIC。
- /// 与库中现值不同(含 NULL→非 NULL)视为类型切换,会清空该项目的全部旧测量事实。
- /// 不传(null)表示沿用库中现值。
- /// </summary>
- public string? ResultType { get; set; }
- /// <summary>NON_NUMERIC 测量真源;NUMERIC 传值 → 400(禁双真源)</summary>
- public decimal? QualifiedQty { get; set; }
- /// <summary>NON_NUMERIC 测量真源;NUMERIC 传值 → 400(禁双真源)</summary>
- public decimal? UnqualifiedQty { get; set; }
- public string? ResultRemark { get; set; }
- /// <summary>
- /// 人工判定,仅允许 PASS / FAIL(不得人工设 INVALID)。
- /// 传值 ⇒ judgementSource=MANUAL;不传 ⇒ 按测量真源 AUTO 重算。
- /// </summary>
- public string? ManualJudgement { get; set; }
- /// <summary>
- /// NUMERIC 测量真源,**该项目的完整新集合**(未出现的旧样本会被删除)。
- /// NON_NUMERIC 携带 → 400。
- /// </summary>
- public List<IqcSaveDetailSampleInput>? Samples { get; set; }
- }
- /// <summary>单个样本入参。</summary>
- public class IqcSaveDetailSampleInput
- {
- /// <summary>样本序号,必须 >= 1 且在同一项目内不重复</summary>
- public int SampleIndex { get; set; }
- /// <summary>录入原文,非空(空值语义 = 该样本不存在 ⇒ 请从数组中移除,而不是传空串)</summary>
- public string? SampleValueRaw { get; set; }
- public string? Remark { get; set; }
- }
- // ────────────────────────────── save-detail 出参 ──────────────────────────────
- /// <summary>保存结果。回传受影响项目的最终判定与实时汇总,供前端免二次拉取。</summary>
- public class IqcSaveDetailOutput
- {
- public bool Ok { get; set; } = true;
- /// <summary>本次实际更新的项目数</summary>
- public int SavedItems { get; set; }
- /// <summary>本次写入的样本行数</summary>
- public int SavedSamples { get; set; }
- /// <summary>本次删除的样本行数(含类型切换清理与全量替换剪枝)</summary>
- public int DeletedSamples { get; set; }
- /// <summary>因类型切换而清空过测量事实的项目 id</summary>
- public List<long> ClearedByTypeChange { get; set; } = [];
- /// <summary>因测量事实变更而被作废的旧 MANUAL 判定所属项目 id</summary>
- public List<long> ManualInvalidated { get; set; } = [];
- public IqcInspBillLineSummary LineSummary { get; set; } = new();
- /// <summary>本次涉及项目的最终结果(含重算后的 judgement / source)</summary>
- public List<IqcInspBillItemLineRow> Items { get; set; } = [];
- }
|