OrderResourceCheckService.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. {
  24. var lines = await _calculator.BuildLinesAsync(order, entry, warnings);
  25. var morderId = await ResolveMorderIdAsync(workOrd, entry.TenantId);
  26. return await _writer.WriteAsync(order, entry, workOrd, morderId, lines, account, DateTime.Now);
  27. }
  28. /// <summary>仅运行资源检查计算,不写库、不依赖工单。返回计算结果与 BOM 展开明细。</summary>
  29. public async Task<(OrderResourceCheckResult Result, List<ResourceCheckBomLine> Lines)> CheckOnlyAsync(
  30. OrderWorkOrderGenerationService.OrderHeader order,
  31. OrderWorkOrderGenerationService.OrderEntryLine entry,
  32. List<string> warnings)
  33. {
  34. var lines = await _calculator.BuildLinesAsync(order, entry, warnings);
  35. var activeLines = lines.Where(x => x.IsUse == 1).ToList();
  36. var needTime = entry.SysCapacityDate ?? entry.PlanDate ?? DateTime.Today;
  37. var hasShortage = activeLines.Any(x => x.LackQty > 0);
  38. var kittingTime = activeLines
  39. .Where(x => x.LackQty > 0)
  40. .Select(x => x.KittingTime)
  41. .DefaultIfEmpty(needTime)
  42. .Max();
  43. var result = new OrderResourceCheckResult
  44. {
  45. LineCount = activeLines.Count,
  46. HasShortage = hasShortage,
  47. KittingTime = kittingTime,
  48. };
  49. return (result, lines);
  50. }
  51. /// <summary>将已有计算结果写入 b_examine_result / b_bom_child_examine(需先创建工单)。</summary>
  52. public async Task<OrderResourceCheckResult> WriteResultAsync(
  53. OrderWorkOrderGenerationService.OrderHeader order,
  54. OrderWorkOrderGenerationService.OrderEntryLine entry,
  55. string workOrd,
  56. List<ResourceCheckBomLine> lines,
  57. string account)
  58. {
  59. var morderId = await ResolveMorderIdAsync(workOrd, entry.TenantId);
  60. return await _writer.WriteAsync(order, entry, workOrd, morderId, lines, account, DateTime.Now);
  61. }
  62. private async Task<long?> ResolveMorderIdAsync(string workOrd, long tenantId)
  63. {
  64. var id = await _db.Ado.GetLongAsync(
  65. """
  66. SELECT Id FROM mes_morder
  67. WHERE morder_no = @WorkOrd AND tenant_id = @TenantId AND IsDeleted = 0
  68. ORDER BY Id DESC LIMIT 1
  69. """,
  70. new List<SugarParameter>
  71. {
  72. new("@WorkOrd", workOrd),
  73. new("@TenantId", tenantId)
  74. });
  75. return id > 0 ? id : null;
  76. }
  77. }