From 9f16e24b9d6295749ee2587c5096bbcad35bb5af Mon Sep 17 00:00:00 2001 From: liguoyang Date: Wed, 21 Feb 2024 17:38:35 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=BA=BA=E5=91=98=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Comparers/SapPositionComparer.cs | 4 +- .../SyncSapInfo/Job/SyncPersonJob.cs | 223 +++++++----------- 2 files changed, 83 insertions(+), 144 deletions(-) diff --git a/Src/Dlhis.ScheduledTask/SyncSapInfo/Comparers/SapPositionComparer.cs b/Src/Dlhis.ScheduledTask/SyncSapInfo/Comparers/SapPositionComparer.cs index e52b1e77..2f6a04b2 100644 --- a/Src/Dlhis.ScheduledTask/SyncSapInfo/Comparers/SapPositionComparer.cs +++ b/Src/Dlhis.ScheduledTask/SyncSapInfo/Comparers/SapPositionComparer.cs @@ -17,7 +17,7 @@ public class SapPositionComparer : IEqualityComparer && x.ENDDA == y.ENDDA && x.LANGU == y.LANGU && x.ZJOBID == y.ZJOBID - && x.ZJOBANME == y.ZJOBANME + && x.ZJOBNAME == y.ZJOBNAME && x.ZZWID == y.ZZWID && x.ZDEPID == y.ZDEPID; } @@ -26,7 +26,7 @@ public class SapPositionComparer : IEqualityComparer { return obj.BEGDA.SafeGetHashCode() ^ obj.ENDDA.SafeGetHashCode() ^ obj.LANGU.SafeGetHashCode() ^ obj.ZJOBID.SafeGetHashCode() - ^ obj.ZJOBANME.SafeGetHashCode() ^ obj.ZZWID.SafeGetHashCode() + ^ obj.ZJOBNAME.SafeGetHashCode() ^ obj.ZZWID.SafeGetHashCode() ^ obj.ZDEPID.SafeGetHashCode(); } } diff --git a/Src/Dlhis.ScheduledTask/SyncSapInfo/Job/SyncPersonJob.cs b/Src/Dlhis.ScheduledTask/SyncSapInfo/Job/SyncPersonJob.cs index 0c0819d5..27c9e6d2 100644 --- a/Src/Dlhis.ScheduledTask/SyncSapInfo/Job/SyncPersonJob.cs +++ b/Src/Dlhis.ScheduledTask/SyncSapInfo/Job/SyncPersonJob.cs @@ -14,8 +14,9 @@ public class SyncPersonJob private readonly IDbContext _dbContext; private readonly ILogger _logger; private readonly IJinkoSapService _jinkoSapService; + private List _positions; - public SyncPersonJob(IDbContext dbContext, ILogger logger, IJinkoSapService jinkoSapService) + public SyncPersonJob(IDbContext dbContext, ILogger logger, IJinkoSapService jinkoSapService) { _dbContext = dbContext; _logger = logger; @@ -29,6 +30,7 @@ public class SyncPersonJob if (persons.Count > 0) { + _positions = await _dbContext.Queryable().ToListAsync(); var modifiedPersons = await GetModifiedPersonAsync(persons.OrderByDescending(x => x.ZSTATUS).ThenBy(x => x.ZRZRQ).ToList()); if (modifiedPersons.Count > 0) { @@ -39,173 +41,110 @@ public class SyncPersonJob private async Task SavePerson(List persons) { - + var failure = 0; var workCodes = persons.Select(x => x.ZWORKCODE).ToList(); - var index = 1; - var count = 4000; - var failure = 0; - var total = persons.Count; - - var searchCodes = workCodes.Skip((index - 1) * count).Take(count).ToList(); - while (searchCodes.Count > 0) + foreach (var searchCodes in workCodes.Chunk(4000)) { - var existsWorkCodes = _dbContext.Queryable() + var existsWorkCodes = await _dbContext.Queryable() .Where(x => searchCodes.Contains(x.Code)) .Select(x => x.Code) - .ToList(); + .ToListAsync(); var originUpdates = persons.Where(x => existsWorkCodes.Contains(x.ZWORKCODE)).ToList(); var originInserts = persons.Where(x => searchCodes.Contains(x.ZWORKCODE)).Except(originUpdates, new SapPersonComparer()).ToList(); int i = 0; - if (originUpdates.Count + originInserts.Count <= count) + var currentTotal = originUpdates.Count + originInserts.Count; + + var updates = ToGainfoSap(originUpdates); + var inserts = ToGainfoSap(originInserts); + + foreach (var item in inserts) { - var currentTotal = originUpdates.Count + originInserts.Count; - - var updates = ToGainfoSap(originUpdates); - var inserts = ToGainfoSap(originInserts); - - foreach (var item in inserts) + i++; + try { - i++; - try - { - await SavePerson(item); - //conn.Execute(SqlGeneration.InsertSql, item); - //log.Debug($"执行新增{i}/{currentTotal} name:{item.gname},ename:{item.ename}"); - } - catch (Exception ex) - { - failure++; - //log.Error($"执行新增{i}/{currentTotal} name:{item.gname},ename:{item.ename}失败 \r\n{ex.Message}"); - } - + await SavePerson(item); + //conn.Execute(SqlGeneration.InsertSql, item); + //log.Debug($"执行新增{i}/{currentTotal} name:{item.gname},ename:{item.ename}"); + } + catch (Exception ex) + { + failure++; + //log.Error($"执行新增{i}/{currentTotal} name:{item.gname},ename:{item.ename}失败 \r\n{ex.Message}"); } - foreach (var item in updates) - { - i++; - try - { - await UpdatePerson(item); - //conn.Execute(SqlGeneration.UpdateSql, item); - //log.Debug($"执行更新{i}/{currentTotal} name:{item.gname},ename:{item.ename}"); - } - catch (Exception ex) - { - failure++; - //log.Error($"执行更新{i}/{currentTotal} name:{item.gname},ename:{item.ename}失败 \r\n{ex.Message}"); - } - } } - index++; - persons = persons.Except(originUpdates).Except(originUpdates).ToList(); - searchCodes = workCodes.Skip((index - 1) * count).Take(count).ToList(); + foreach (var item in updates) + { + i++; + try + { + await UpdatePerson(item); + //conn.Execute(SqlGeneration.UpdateSql, item); + //log.Debug($"执行更新{i}/{currentTotal} name:{item.gname},ename:{item.ename}"); + } + catch (Exception ex) + { + failure++; + //log.Error($"执行更新{i}/{currentTotal} name:{item.gname},ename:{item.ename}失败 \r\n{ex.Message}"); + } + } } - return failure; + return 0; } private async Task SavePerson(GainfoSapEntity item) { - var gainfo = await _dbContext.Queryable().Where(x => x.IdNo == item.idno).FirstAsync(); - if (gainfo != null) + var info = new GainfoEntity { - gainfo.No = item.guestno; - gainfo.SapNo = item.ano; - gainfo.Type = item.@class; - gainfo.Name = item.gname; - gainfo.Code = item.ename; - gainfo.CountryNo = item.country; - gainfo.IdClass = item.idcls; - gainfo.Native = item.native; - gainfo.Gender = item.sex == "F" ? GenderEnumType.Female : GenderEnumType.Male; - gainfo.Birthday = (DateTime)item.birthday; - gainfo.Address = item.address; - gainfo.DepartmentNo = item.appellation; - gainfo.Nation = item.nation; - gainfo.Phone = item.phone; - gainfo.Degree = item.email; - gainfo.Position = item.web; - gainfo.Remark = item.remark; - gainfo.Werks = item.WERKS; - gainfo.Employed = item.isowner; //int.Parse(person.ZSTATUS) < 4 ? "T" : "F", 是否离职 - await _dbContext.UpdateAsync(gainfo); - } - else - { - var info = new GainfoEntity - { - No = item.guestno, - SapNo = item.ano, - Type = item.@class, - Name = item.gname, - Code = item.ename, - CountryNo = item.country, - IdClass = item.idcls, - IdNo = item.idno, - Native = item.native, - Gender = item.sex == "F" ? GenderEnumType.Female : GenderEnumType.Male, - Birthday = (DateTime)item.birthday, - Address = item.address, - //Marital 已婚未婚 - //Occuption = item.occuption, - DepartmentNo = item.appellation, - Nation = item.nation, - Phone = item.phone, - Degree = item.email, - Position = item.web, - //CarNo - Remark = item.remark, - Werks = item.WERKS, - Employed = item.isowner, - }; - await _dbContext.InsertAsync(info); - } + No = item.guestno, + SapNo = item.ano, + Type = item.@class, + Name = item.gname, + Code = item.ename, + CountryNo = item.country, + IdClass = item.idcls, + IdNo = item.idno, + Native = item.native, + Gender = item.sex == "F" ? GenderEnumType.Female : GenderEnumType.Male, + Birthday = (DateTime)item.birthday, + Address = item.address, + //Marital 已婚未婚 + //Occuption = item.occuption, + DepartmentNo = item.appellation, + Nation = item.nation, + Phone = item.phone, + Degree = item.email, + Position = item.web, + //CarNo + Remark = item.remark, + Werks = item.WERKS, + Employed = item.isowner, + }; + await _dbContext.InsertAsync(info); } private async Task UpdatePerson(GainfoSapEntity item) { var gainfo = await _dbContext.Queryable().Where(x => x.IdNo == item.idno).FirstAsync(); - if (gainfo != null) + await _dbContext.Updateable().SetColumns(g => new GainfoEntity { - _dbContext.Updateable().SetColumns(g => new GainfoEntity - { - SapNo = item.PERNR, - Name = item.gname, - Code = item.ename, - Position = item.web, - Phone = item.phone, - DepartmentNo = item.appellation, - Employed = item.isowner, - Remark = item.remark, - Degree = item.email, - Werks = item.WERKS - }) - .Where(g => g.IdNo == item.idno - && !_dbContext.Queryable().Any(g => g.IdNo == item.idno && g.SapNo != item.PERNR && g.Employed == "T") - && !_dbContext.Queryable().Any(g => g.IdNo == item.idno && int.Parse(g.SapNo) > int.Parse(item.PERNR) && g.Employed == item.isowner)); - } - else - { - _dbContext.Updateable().SetColumns(g => new GainfoEntity - { - SapNo = item.PERNR, - Name = item.gname, - Code = item.ename, - Position = item.web, - Phone = item.phone, - DepartmentNo = item.appellation, - Employed = item.isowner, - Remark = item.remark, - Degree = item.email, - Werks = item.WERKS - }) - .Where(g => g.SapNo == item.PERNR - && !_dbContext.Queryable().Any(g => g.Code == item.ename && g.Employed == "T") - && !_dbContext.Queryable().Any(g => g.IdNo == item.idno && int.Parse(g.SapNo) > int.Parse(item.PERNR) && g.Employed == item.isowner)); - } + SapNo = item.PERNR, + Name = item.gname, + Code = item.ename, + Position = item.web, + Phone = item.phone, + DepartmentNo = item.appellation, + Employed = item.isowner, + Remark = item.remark, + Degree = item.email, + Werks = item.WERKS + }) + .Where(x => x.Code == item.ename) + .ExecuteCommandAsync(); } private async Task> GetModifiedPersonAsync(List sapList) @@ -259,7 +198,7 @@ public class SyncPersonJob GainfoSapEntity o = null; try { - var position = string.Empty; //lastUpdatedPositionList.FirstOrDefault(x => x.ZJOBID == person.PLANS); + var position = _positions.FirstOrDefault(x => x.No == person.PLANS); var rzrq = SafeParseDate(person.ZRZRQ); var lzrq = SafeParseDate(person.ZLZRQ); @@ -302,7 +241,7 @@ public class SyncPersonJob remark = rmk, native = native, sex = sex, - //web = SubString(position?.ZJOBANME, 30), todo + web = SubString(position?.Name ?? "", 30), logdate = DateTime.Now, isowner = int.Parse(person.ZSTATUS) < 4 ? "T" : "F", @class = "C",