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