PurchaseRequestMergeService.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. namespace Admin.NET.Plugin.AiDOP.Supply;
  2. /// <summary>
  3. /// 采购申请合并服务。P3 阶段仅合并本次生成且尚未入库的 PR 候选,不改动历史 PR。
  4. /// </summary>
  5. public class PurchaseRequestMergeService : ITransient
  6. {
  7. public PurchaseRequestMergeResult MergeGeneratedRequests(List<PurchaseRequestMain> requests)
  8. {
  9. if (requests.Count <= 1)
  10. {
  11. return new PurchaseRequestMergeResult
  12. {
  13. Requests = requests,
  14. OriginalCount = requests.Count,
  15. MergedCount = requests.Count
  16. };
  17. }
  18. var merged = requests
  19. .GroupBy(x => new
  20. {
  21. x.TenantId,
  22. x.CompanyId,
  23. x.FactoryId,
  24. x.IcitemId,
  25. x.PrPurchaseId,
  26. x.IsRequireGoods,
  27. SupplierType = x.SupplierType ?? string.Empty,
  28. WeekStart = GetWeekStart(x.PrSsendDate)
  29. })
  30. .Select(group =>
  31. {
  32. var rows = group.OrderBy(x => x.PrSsendDate).ThenBy(x => x.PrSarriveDate).ThenBy(x => x.Id).ToList();
  33. var first = rows.First();
  34. first.PrRqty = rows.Sum(x => x.PrRqty ?? 0);
  35. first.PrAqty = rows.Sum(x => x.PrAqty ?? 0);
  36. first.PrSqty = rows.Sum(x => x.PrSqty ?? 0);
  37. first.PrSsendDate = rows.Min(x => x.PrSsendDate);
  38. first.PrSarriveDate = rows.Min(x => x.PrSarriveDate);
  39. first.CreateTime = rows.Min(x => x.CreateTime);
  40. first.UpdateTime = DateTime.Now;
  41. return first;
  42. })
  43. .ToList();
  44. return new PurchaseRequestMergeResult
  45. {
  46. Requests = merged,
  47. OriginalCount = requests.Count,
  48. MergedCount = merged.Count
  49. };
  50. }
  51. private static DateTime? GetWeekStart(DateTime? value)
  52. {
  53. if (!value.HasValue) return null;
  54. var date = value.Value.Date;
  55. var diff = ((int)date.DayOfWeek + 6) % 7;
  56. return date.AddDays(-diff);
  57. }
  58. }
  59. public sealed class PurchaseRequestMergeResult
  60. {
  61. public List<PurchaseRequestMain> Requests { get; set; } = new();
  62. public int OriginalCount { get; set; }
  63. public int MergedCount { get; set; }
  64. public int ReducedCount => Math.Max(OriginalCount - MergedCount, 0);
  65. }