OrderResourceCheckService.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. namespace Admin.NET.Plugin.AiDOP.Order;
  2. /// <summary>订单评审资源检查编排。</summary>
  3. public class OrderResourceCheckService : ITransient
  4. {
  5. private readonly ISqlSugarClient _db;
  6. private readonly MaterialRequirementCalculator _calculator;
  7. private readonly ResourceCheckResultWriter _writer;
  8. public OrderResourceCheckService(
  9. ISqlSugarClient db,
  10. MaterialRequirementCalculator calculator,
  11. ResourceCheckResultWriter writer)
  12. {
  13. _db = db;
  14. _calculator = calculator;
  15. _writer = writer;
  16. }
  17. public async Task<OrderResourceCheckResult> RunForEntryAsync(
  18. OrderWorkOrderGenerationService.OrderHeader order,
  19. OrderWorkOrderGenerationService.OrderEntryLine entry,
  20. string workOrd,
  21. string account,
  22. List<string> warnings,
  23. long bangId = 0)
  24. {
  25. var lines = await _calculator.BuildLinesAsync(order, entry, warnings, bangId);
  26. var morderId = await ResolveMorderIdAsync(workOrd, entry.TenantId);
  27. return await _writer.WriteAsync(order, entry, workOrd, morderId, lines, account, DateTime.Now);
  28. }
  29. /// <summary>仅运行资源检查计算,不写库、不依赖工单。返回计算结果与 BOM 展开明细。</summary>
  30. public async Task<(OrderResourceCheckResult Result, List<ResourceCheckBomLine> Lines)> CheckOnlyAsync(
  31. OrderWorkOrderGenerationService.OrderHeader order,
  32. OrderWorkOrderGenerationService.OrderEntryLine entry,
  33. List<string> warnings,
  34. long bangId = 0)
  35. {
  36. var lines = await _calculator.BuildLinesAsync(order, entry, warnings, bangId);
  37. var activeLines = lines.Where(x => x.IsUse == 1).ToList();
  38. var needTime = entry.SysCapacityDate ?? entry.PlanDate ?? DateTime.Today;
  39. var hasShortage = activeLines.Any(x => x.LackQty > 0);
  40. var kittingTime = activeLines
  41. .Where(x => x.LackQty > 0)
  42. .Select(x => x.KittingTime)
  43. .DefaultIfEmpty(needTime)
  44. .Max();
  45. var result = new OrderResourceCheckResult
  46. {
  47. LineCount = activeLines.Count,
  48. HasShortage = hasShortage,
  49. KittingTime = kittingTime,
  50. };
  51. return (result, lines);
  52. }
  53. /// <summary>将已有计算结果写入 b_examine_result / b_bom_child_examine(需先创建工单)。</summary>
  54. public async Task<OrderResourceCheckResult> WriteResultAsync(
  55. OrderWorkOrderGenerationService.OrderHeader order,
  56. OrderWorkOrderGenerationService.OrderEntryLine entry,
  57. string workOrd,
  58. List<ResourceCheckBomLine> lines,
  59. string account)
  60. {
  61. var morderId = await ResolveMorderIdAsync(workOrd, entry.TenantId);
  62. return await _writer.WriteAsync(order, entry, workOrd, morderId, lines, account, DateTime.Now);
  63. }
  64. private async Task<long?> ResolveMorderIdAsync(string workOrd, long tenantId)
  65. {
  66. var id = await _db.Ado.GetLongAsync(
  67. """
  68. SELECT Id FROM mes_morder
  69. WHERE morder_no = @WorkOrd AND tenant_id = @TenantId AND IsDeleted = 0
  70. ORDER BY Id DESC LIMIT 1
  71. """,
  72. new List<SugarParameter>
  73. {
  74. new("@WorkOrd", workOrd),
  75. new("@TenantId", tenantId)
  76. });
  77. return id > 0 ? id : null;
  78. }
  79. }