From 06da5bb0d2a9973be7749b59a510e8a14e1ddc2b Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 13 May 2026 12:58:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=B7=AE=E5=BC=82?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Implements/GainfoUpdateService.cs | 55 +++++++++++++++++-- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs index 7afafed8..a2ee10d8 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs @@ -447,21 +447,64 @@ public class GainfoUpdateService : IGainfoUpdateService private async Task> GetModifiedPersonAsync(List sapList) { - var last = await LoadDataAsync(); + if (sapList.Count <= 0) + { + return new List(); + } + + var comparer = new SapPersonComparer(); + var workCodes = sapList + .Select(x => x.ZWORKCODE) + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Distinct() + .ToList(); + + if (workCodes.Count <= 0) + { + return sapList; + } + + var last = await LoadDataAsync(workCodes); if (last.Count <= 0) { return sapList; } - var comparer = new SapPersonComparer(); - var needRemove = sapList.Intersect(last, comparer); - return sapList.Except(needRemove, comparer).ToList(); + var lastMap = last + .Where(x => !string.IsNullOrWhiteSpace(x.ZWORKCODE)) + .GroupBy(x => x.ZWORKCODE) + .ToDictionary(x => x.Key, x => x.First()); + + var modifiedPersons = new List(); + foreach (var person in sapList) + { + if (string.IsNullOrWhiteSpace(person.ZWORKCODE)) + { + modifiedPersons.Add(person); + continue; + } + + if (!lastMap.TryGetValue(person.ZWORKCODE, out var historyPerson) || !comparer.Equals(person, historyPerson)) + { + modifiedPersons.Add(person); + } + } + + return modifiedPersons; } - private async Task> LoadDataAsync() + private async Task> LoadDataAsync(List workCodes) { - var gainfos = await _dbContext.Queryable().ToListAsync(); + var gainfos = new List(); + var chunks = workCodes.Chunk(2000); + foreach (var chunk in chunks) + { + var items = await _dbContext.Queryable() + .Where(x => chunk.Contains(x.ename)) + .ToListAsync(); + gainfos.AddRange(items); + } return gainfos.Select(x => new SapPersonItem {