namespace Admin.NET.Plugin.AiDOP.Supply; /// /// 采购申请合并服务。P3 阶段仅合并本次生成且尚未入库的 PR 候选,不改动历史 PR。 /// public class PurchaseRequestMergeService : ITransient { public PurchaseRequestMergeResult MergeGeneratedRequests(List requests) { if (requests.Count <= 1) { return new PurchaseRequestMergeResult { Requests = requests, OriginalCount = requests.Count, MergedCount = requests.Count }; } var merged = requests .GroupBy(x => new { x.TenantId, x.CompanyId, x.FactoryId, x.IcitemId, x.PrPurchaseId, x.IsRequireGoods, SupplierType = x.SupplierType ?? string.Empty, WeekStart = GetWeekStart(x.PrSsendDate) }) .Select(group => { var rows = group.OrderBy(x => x.PrSsendDate).ThenBy(x => x.PrSarriveDate).ThenBy(x => x.Id).ToList(); var first = rows.First(); first.PrRqty = rows.Sum(x => x.PrRqty ?? 0); first.PrAqty = rows.Sum(x => x.PrAqty ?? 0); first.PrSqty = rows.Sum(x => x.PrSqty ?? 0); first.PrSsendDate = rows.Min(x => x.PrSsendDate); first.PrSarriveDate = rows.Min(x => x.PrSarriveDate); first.CreateTime = rows.Min(x => x.CreateTime); first.UpdateTime = DateTime.Now; return first; }) .ToList(); return new PurchaseRequestMergeResult { Requests = merged, OriginalCount = requests.Count, MergedCount = merged.Count }; } private static DateTime? GetWeekStart(DateTime? value) { if (!value.HasValue) return null; var date = value.Value.Date; var diff = ((int)date.DayOfWeek + 6) % 7; return date.AddDays(-diff); } } public sealed class PurchaseRequestMergeResult { public List Requests { get; set; } = new(); public int OriginalCount { get; set; } public int MergedCount { get; set; } public int ReducedCount => Math.Max(OriginalCount - MergedCount, 0); }