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 {