using Dlhis.ScheduledTask.SyncSapInfo.Dto; using System.Text; namespace Dlhis.ScheduledTask.SyncSapInfo.Comparers; /// /// 人员信息比较器 /// public class SapPersonComparer : IEqualityComparer { public bool Equals(SapPersonItem x, SapPersonItem y) { if (ReferenceEquals(x, y)) return true; if (ReferenceEquals(x, null)) return false; if (ReferenceEquals(y, null)) return false; return x.PERNR == y.PERNR && x.WERKS == y.WERKS && SubString(x.ORGEH, 10) == SubString(y.ORGEH, 10) && SubString(x.NAME, 50) == SubString(y.NAME, 50) && SafeParseDate(x.GBDAT) == SafeParseDate(y.GBDAT) && SubString(x.ZZ_SFZH, 18) == SubString(y.ZZ_SFZH, 18) && SubString(x.ZWORKCODE, 50) == SubString(y.ZWORKCODE, 50) && SubString(x.ZMOBILE, 20) == SubString(y.ZMOBILE, 20) && x.ZSTATUS == y.ZSTATUS && x.KOSTL == y.KOSTL && x.ZZ_ZD == y.ZZ_ZD && x.Z_ZJ == y.Z_ZJ && x.ZRZRQ == y.ZRZRQ && SafeParseDate(x.ZLZRQ) == SafeParseDate(y.ZLZRQ) && x.STELL == y.STELL && x.STELL_NM == y.STELL_NM && x.MASSN == y.MASSN && x.MNTXT == y.MNTXT && (x.ZXUELI ?? string.Empty).Trim() == (y.ZXUELI ?? string.Empty).Trim() && (x.ZZ_KLX ?? string.Empty) == (y.ZZ_KLX ?? string.Empty); } public int GetHashCode(SapPersonItem obj) { return obj.PERNR.SafeGetHashCode() ^ obj.WERKS.SafeGetHashCode() ^ SubString(obj.ORGEH, 10).SafeGetHashCode() ^ SubString(obj.NAME, 50).SafeGetHashCode() ^ SafeParseDate(obj.GBDAT).SafeGetHashCode() ^ SubString(obj.ZZ_SFZH, 18).SafeGetHashCode() ^ SubString(obj.ZWORKCODE, 50).SafeGetHashCode() ^ SubString(obj.ZMOBILE, 20).SafeGetHashCode() ^ obj.ZSTATUS.SafeGetHashCode() ^ obj.KOSTL.SafeGetHashCode() ^ obj.ZZ_ZD.SafeGetHashCode() ^ obj.Z_ZJ.SafeGetHashCode() ^ obj.ZRZRQ.SafeGetHashCode() ^ SafeParseDate(obj.ZLZRQ).SafeGetHashCode() ^ obj.STELL.SafeGetHashCode() ^ obj.STELL_NM.SafeGetHashCode() ^ obj.MASSN.SafeGetHashCode() ^ obj.MNTXT.SafeGetHashCode() ^ obj.ZXUELI.SafeGetHashCode() ^ (obj.ZZ_KLX ?? "").SafeGetHashCode(); } private string SubString(string s, int len) { if (string.IsNullOrWhiteSpace(s)) { return s?.Trim() ?? ""; } s = s.Trim(); var bs = Encoding.UTF8.GetBytes(s); if (bs.Length <= len) { return s; } var bytes = new byte[len]; Buffer.BlockCopy(bs, 0, bytes, 0, len); return Encoding.UTF8.GetString(bytes); } private DateTime? SafeParseDate(string str) { if (str == "0000-00-00" || str == "0001-01-01" || str == "1900-01-01") return null; if (DateTime.TryParse(str, out var d)) { return d; } return null; } }