fix: 优化差异数据
This commit is contained in:
@@ -447,21 +447,64 @@ public class GainfoUpdateService : IGainfoUpdateService
|
||||
|
||||
private async Task<List<SapPersonItem>> GetModifiedPersonAsync(List<SapPersonItem> sapList)
|
||||
{
|
||||
var last = await LoadDataAsync();
|
||||
if (sapList.Count <= 0)
|
||||
{
|
||||
return new List<SapPersonItem>();
|
||||
}
|
||||
|
||||
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<SapPersonItem>();
|
||||
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<List<SapPersonItem>> LoadDataAsync()
|
||||
private async Task<List<SapPersonItem>> LoadDataAsync(List<string> workCodes)
|
||||
{
|
||||
var gainfos = await _dbContext.Queryable<GainfoSapEntity>().ToListAsync();
|
||||
var gainfos = new List<GainfoSapEntity>();
|
||||
var chunks = workCodes.Chunk(2000);
|
||||
foreach (var chunk in chunks)
|
||||
{
|
||||
var items = await _dbContext.Queryable<GainfoSapEntity>()
|
||||
.Where(x => chunk.Contains(x.ename))
|
||||
.ToListAsync();
|
||||
gainfos.AddRange(items);
|
||||
}
|
||||
|
||||
return gainfos.Select(x => new SapPersonItem
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user