| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- using SqlSugar;
- namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.L0;
- /// <summary>
- /// IQC 收货标准层只读读取(L0,态①)。**只读 `mdp_std_iqc_receipt_state`**——不直连 dopdemorq、不读旧 InvMaster/PurOrd* raw。
- /// 双源边界:std 内容由入站/切源决定(本库 或 dopdemorq),读端只按 tenant+domain+fbillno 查,与 source 解耦。
- /// </summary>
- public interface IIqcReceiptStdReader
- {
- /// <summary>按 (tenant, domain, FBILLNO) 读标准层单行;不存在返回 null(Found=false)。</summary>
- Task<IqcReceiptStdRow> LoadRowAsync(long tenantId, string domainCode, string fbillno);
- }
- /// <summary>
- /// 生产实现:原生 SQL 读 `mdp_std_iqc_receipt_state`(运行时 DDL 表,非 SugarTable 实体,故走 Ado)。
- /// ⚠️ Phase 5B 未实库验证:标准层需先由 <see cref="IqcReceiptStateMdpSyncService"/> 贴源产出。
- /// </summary>
- public sealed class SqlSugarIqcReceiptStdReader : IIqcReceiptStdReader, ITransient
- {
- private readonly ISqlSugarClient _db;
- public SqlSugarIqcReceiptStdReader(ISqlSugarClient db) => _db = db;
- public async Task<IqcReceiptStdRow> LoadRowAsync(long tenantId, string domainCode, string fbillno)
- {
- var dt = await _db.Ado.GetDataTableAsync(
- """
- SELECT tenant_id, domain, fbillno, qc_nbr, item_num, location, lot_serial, rct_nbr,
- pur_ord, pur_line, potype, qty_ordered, received_cum_qty, returned_cum_qty,
- sample_qty, receipt_pending_qty, receivable_detail_count, sync_time
- FROM mdp_std_iqc_receipt_state
- WHERE tenant_id=@t AND domain=@d AND fbillno=@fb
- LIMIT 1
- """,
- new SugarParameter("@t", tenantId), new SugarParameter("@d", domainCode ?? ""), new SugarParameter("@fb", fbillno));
- if (dt.Rows.Count == 0) return null;
- var r = dt.Rows[0];
- decimal Dec(string c) => r[c] == DBNull.Value ? 0m : Convert.ToDecimal(r[c]);
- int Int(string c) => r[c] == DBNull.Value ? 0 : Convert.ToInt32(r[c]);
- string Str(string c) => r[c] == DBNull.Value ? "" : Convert.ToString(r[c]);
- return new IqcReceiptStdRow
- {
- TenantId = tenantId, Domain = domainCode ?? "", Fbillno = fbillno, QcNbr = Str("qc_nbr"),
- ItemNum = Str("item_num"), Location = Str("location"), LotSerial = Str("lot_serial"), RctNbr = Str("rct_nbr"),
- PurOrd = Str("pur_ord"), PurLine = Int("pur_line"), Potype = Str("potype"),
- OrderedQty = Dec("qty_ordered"), ReceivedCumQty = Dec("received_cum_qty"), ReturnedCumQty = Dec("returned_cum_qty"),
- SampleQty = Dec("sample_qty"), ReceiptPendingQty = Dec("receipt_pending_qty"), ReceivableDetailCount = Int("receivable_detail_count"),
- SourceSyncedAt = r["sync_time"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(r["sync_time"]),
- };
- }
- }
|