IqcMrbSelectionTaskService.cs 2.0 KB

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