diff --git a/Src/Dlhis.ScheduledTask/Jobs/CostUploadJob.cs b/Src/Dlhis.ScheduledTask/Jobs/CostUploadJob.cs index 47f8dfe2..33ae43b9 100644 --- a/Src/Dlhis.ScheduledTask/Jobs/CostUploadJob.cs +++ b/Src/Dlhis.ScheduledTask/Jobs/CostUploadJob.cs @@ -32,7 +32,7 @@ public class CostUploadJob : BaseJob var endDayOfMonth = e.AddDays(-1); //从余额找人 - var userCodes = await DbContext.Queryable() + var userCodeAll = await DbContext.Queryable() .Where(x => SqlFunc.Subqueryable() .Where(p => p.UserCode == x.UserCode) .Where(p => p.Year == s.Year && p.Month == s.Month) @@ -42,51 +42,78 @@ public class CostUploadJob : BaseJob .Distinct() .ToListAsync(); - foreach (var userCode in userCodes) + foreach (var userCodes in userCodeAll.Chunk(100)) { - var balance = await DbContext.Queryable() - .Where(x => x.UserCode == userCode) - .Where(x => x.Status == BalanceRecordStatusEnumType.Valid) - .Where(x => x.Type == BalanceRecordTypeEnumType.Out) - .Where(x => x.CostDate >= s && x.CostDate < e) - .Where(x => !BalanceRecordSourceConstants.IgnoreSources.Contains(x.Source)) - .SumAsync(x => x.Amount); - - if (balance == 0) + var dict = new Dictionary(userCodes.Length); + foreach (var userCode in userCodes) { - continue; + var balance = await DbContext.Queryable() + .Where(x => x.UserCode == userCode) + .Where(x => x.Status == BalanceRecordStatusEnumType.Valid) + .Where(x => x.Type == BalanceRecordTypeEnumType.Out) + .Where(x => x.CostDate >= s && x.CostDate < e) + .Where(x => !BalanceRecordSourceConstants.IgnoreSources.Contains(x.Source)) + .SumAsync(x => x.Amount); + + if (balance == 0) + { + continue; + } + + dict.Add(userCode, Math.Abs(balance)); } var response = await jipApi.UploadCostAsync(new UploadCostRequest { - Data = new List + Data = dict.Select(x => new UploadCostItemRequest { - new UploadCostItemRequest - { - WorkCode = userCode, - BeginDate = endDayOfMonth.ToString("yyyy-MM-dd"), - Charge = Math.Abs(balance), - Code= "2086" - } - } + WorkCode = x.Key, + BeginDate = endDayOfMonth.ToString("yyyy-MM-dd"), + Charge = x.Value, + Code = "2086" + + }).ToList() }); - if (response.Data.FirstOrDefault(x => x.WorkCode == userCode)?.Success == "S") + + var handleData = response.Data.Where(x => x.Success == "S").ToList(); + var workCodes = handleData.Select(x => x.WorkCode).ToList(); + + var records = await DbContext.Queryable() + .Where(x => workCodes.Contains(x.UserCode)) + .Where(x => x.Year == s.Year && x.Month == s.Month) + .ToListAsync(); + + var updatedRecords = new List(); + var newRecords = new List(); + foreach (var item in handleData) { - if (!await DbContext.Queryable() - .Where(x => x.UserCode == userCode) - .Where(x => x.Year == s.Year && x.Month == s.Month) - .AnyAsync()) + var record = records.FirstOrDefault(x => x.UserCode == item.WorkCode); + if (record != null) { - await DbContext.InsertAsync(new UserBalanceUploadRecordEntity + record.Cost = dict[item.WorkCode]; + updatedRecords.Add(record); + } + else + { + newRecords.Add(new UserBalanceUploadRecordEntity { + UserCode = item.WorkCode, Year = s.Year, Month = s.Month, - UserCode = userCode, - Cost = balance, + Cost = dict[item.WorkCode] }); } } + if (updatedRecords.Any()) + { + await DbContext.UpdateAsync(updatedRecords); + } + + if (newRecords.Any()) + { + await DbContext.InsertAsync(newRecords); + } } } }