| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse.InventoryPosting.Receipt;
- /// <summary>
- /// MRB 挑选(IQC ②⑤)任务服务。据 Phase 6A/6C:挑选分支 **不进 C5 库存过账**,只创建
- /// `PurOrdRctByMRBChoose` 移动任务(LIVE pr_WMS_SaveIQCResult L270-281,PartRctFlag=1 后 goto IQCEnd)。
- /// 与 <see cref="IqcReceiptOrchestrator"/> 分离,避免让挑选强行进入 Inventory Posting。
- /// 幂等由 TaskID(=QCNbr) 的 DB UNIQUE 兜底。
- /// </summary>
- public sealed class IqcMrbSelectionTaskService
- {
- private readonly IIqcReceiptUnitOfWorkFactory _factory;
- public IqcMrbSelectionTaskService(IIqcReceiptUnitOfWorkFactory factory)
- {
- _factory = factory ?? throw new ArgumentNullException(nameof(factory));
- }
- public async Task<IqcReceiptResult> PostAsync(IqcMrbSelectionCommand m)
- {
- if (m == null) throw new ArgumentNullException(nameof(m));
- await using var uow = _factory.Create();
- try
- {
- await uow.BeginAsync(m.TenantId, m.DomainCode); // 任务-only:仅开事务,无库存锁
- await uow.WriteMobileTaskAsync(MobileTaskBuilder.MrbChoose(m)); // 无 C5/C6
- // Phase 7C A3:完成锚(与任务同事务提交)——闭合 commit→MarkPosted 崩溃窗口
- await uow.WriteCompletionAsync(new IqcCompletionMarker
- {
- TenantId = m.TenantId, DomainCode = m.DomainCode, FbillNo = m.Fbillno,
- PostingId = m.PostingId, RouteKind = "MrbChoose",
- });
- await uow.CommitAsync();
- return new IqcReceiptResult { Outcome = IqcReceiptOutcome.Success, WrittenRows = 1, LegacyReturnMsg = "保存成功" };
- }
- catch (Exception ex)
- {
- try { await uow.RollbackAsync(); } catch { }
- return new IqcReceiptResult { Outcome = IqcReceiptOutcome.Error, WrittenRows = 0, Reason = ex.Message, LegacyReturnMsg = "保存失败," + (ex.Message ?? string.Empty) };
- }
- }
- }
|