IBusinessCompletionStore.cs 1.4 KB

123456789101112131415161718192021222324252627282930
  1. using Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Entity;
  2. using SqlSugar;
  3. namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Receipt;
  4. /// <summary>
  5. /// 业务事务完成锚读取(Phase 7C)。用于 stale Processing 重投时判定「业务是否已完整提交」,
  6. /// 从而闭合 commit→MarkPosted 崩溃窗口:锚存在 → 修复 POSTED + ack、不重复过账。
  7. /// **只读**——写入由 <see cref="IIqcReceiptUnitOfWork.WriteCompletionAsync"/> 在业务事务内完成。
  8. /// </summary>
  9. public interface IBusinessCompletionStore
  10. {
  11. /// <summary>给定幂等键是否已存在完成锚(业务事务已完整提交的权威证据)。</summary>
  12. Task<bool> IsCommittedAsync(long tenantId, string domainCode, string fbillNo);
  13. }
  14. /// <summary>生产实现:读 `ado_iqc_posting_completion`(目标库 aidopdev;⚠️ Phase 5B 未实库验证)。</summary>
  15. public sealed class SqlSugarBusinessCompletionStore : IBusinessCompletionStore, ITransient
  16. {
  17. private readonly ISqlSugarClient _db;
  18. public SqlSugarBusinessCompletionStore(ISqlSugarClient db) => _db = db;
  19. public async Task<bool> IsCommittedAsync(long tenantId, string domainCode, string fbillNo)
  20. {
  21. var domain = domainCode ?? string.Empty;
  22. return await _db.Queryable<AdoIqcPostingCompletion>()
  23. .Where(x => x.TenantId == tenantId && x.DomainCode == domain && x.FbillNo == fbillNo)
  24. .AnyAsync();
  25. }
  26. }