using Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Inventory; namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Receipt; /// /// IQC 收货**外层工作单元**(Phase 6B:C2 拥有唯一外层事务)。C6 与 C5 使用同一事务; /// **C5 不自行 Commit**,由外层统一 Commit/Rollback。对齐 Phase 6A:C1 BEGIN … CheckInv→C6→C5 … COMMIT。 /// /// 生命周期:Create → BeginAndLock(BeginTran + 库存行 FOR UPDATE + 锁内快照) → [守卫] → /// WritePurchaseReceipt(C6) → WriteInventory(C5,同事务不提交) → [下游] → Commit / Rollback。 /// public interface IIqcReceiptUnitOfWork : IAsyncDisposable { /// 开外层事务并锁定库存自然键,返回锁内变动前快照(守卫与 C5 据此)。 Task BeginAndLockAsync(IReadOnlyList invCmds); /// 仅开外层事务(无库存锁/加载)——供 MRB 挑选等「任务-only」路径用。 Task BeginAsync(long tenantId, string domainCode); /// C6:写采购收货回写(DOP shadow,同一事务)。 Task WritePurchaseReceiptAsync(PurchaseReceiptWriteback c6); /// C5:写库存过账集(同一事务,**不提交**)。 Task WriteInventoryAsync(InventoryWriteSet writeSet); /// C7:写移动任务(DOP shadow,同一事务,**不提交**)。 Task WriteMobileTaskAsync(MobileTaskCommand task); /// /// 完成锚(Phase 7C):写 `ado_iqc_posting_completion`(DOP shadow,同一事务,**不提交**), /// 作为业务事务已完整提交的权威证据。**须在 C6/C5/C7 之后、Commit 之前调用**——与业务写同成同败。 /// Task WriteCompletionAsync(IqcCompletionMarker marker); Task CommitAsync(); Task RollbackAsync(); } public interface IIqcReceiptUnitOfWorkFactory { IIqcReceiptUnitOfWork Create(); }