using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; namespace BLL { /// /// 赛鼎实名制接口同步服务。 /// public static class SedinRealNameService { private const string DataSourceName = "赛鼎宁波实名制"; private const string DefaultBaseUrl = "http://gd.17hr.net:8016"; private const string DefaultApiKey = "07c1cead689244be98809b80ec54d80c"; private const string DefaultApiSecret = "5fec0405962e4e66ac03840dc1cfe49d"; /// /// 根据项目和同步配置构造赛鼎实名制请求参数。 /// 约定:ApiUrl 存基础地址,ClientId 存 api_key,Password 存 api_secret。 /// xmjc 优先取实名制项目简称,其次取项目简称。 /// xmcode 优先取实名制项目编码,其次取合同号。 /// /// 本系统项目ID /// 同步配置单位ID,可为空 /// 接口请求参数 public static SedinRealNameOptions BuildOptionsByProject(string projectId, string unitId = null) { if (string.IsNullOrEmpty(projectId)) { throw new ArgumentException("项目ID不能为空", nameof(projectId)); } var project = Funs.DB.Base_Project.FirstOrDefault(x => x.ProjectId == projectId); if (project == null) { throw new InvalidOperationException("未找到对应的项目配置"); } string proCode = project.ContractNo; var realNameProject = !string.IsNullOrEmpty(proCode) ? Funs.DB.RealName_Project.FirstOrDefault(x => x.ProCode == proCode) : null; string xmcode = realNameProject != null && !string.IsNullOrEmpty(realNameProject.JTproCode) ? realNameProject.JTproCode : (realNameProject != null && !string.IsNullOrEmpty(realNameProject.ProCode) ? realNameProject.ProCode : proCode); string xmjc = realNameProject != null && !string.IsNullOrEmpty(realNameProject.ProShortName) ? realNameProject.ProShortName : (project.ShortName ?? project.ProjectName); return new SedinRealNameOptions { ProjectId = projectId, UnitId = unitId, BaseUrl = DefaultBaseUrl, Xmjc = xmjc, Xmcode = xmcode, ApiKey = DefaultApiKey, ApiSecret = DefaultApiSecret, }; } /// /// 按顺序同步参建单位、班组、人员、打卡记录。 /// /// 赛鼎实名制请求参数 /// 开始时间,传空则不限制 /// 结束时间,传空则不限制 /// 同步结果 public static SedinRealNameSyncResult SyncAll(SedinRealNameOptions options, string start = "", string end = "") { ValidateOptions(options); var result = new SedinRealNameSyncResult { ProjectId = options.ProjectId, }; var units = GetSubContractors(options, start, end); var unitMap = SyncSubContractors(options.ProjectId, units); result.SubContractorCount = unitMap.Count; var teams = GetTeams(options, start, end); var teamMap = SyncTeams(options.ProjectId, unitMap, teams); result.TeamCount = teamMap.Count; var persons = GetPersons(options, start, end); result.PersonCount = SyncPersons(options.ProjectId, unitMap, teamMap, persons); var checkIns = GetCheckIns(options, start, end); result.CheckInCount = SyncCheckIns(options.ProjectId, checkIns); result.LastStart = checkIns.LastStart; result.Message = $"同步完成:参建单位 {result.SubContractorCount} 条,班组 {result.TeamCount} 条,人员 {result.PersonCount} 条,打卡记录 {result.CheckInCount} 条。"; return result; } /// /// 获取参建单位。 /// public static SedinApiListResult GetSubContractors(SedinRealNameOptions options, string start = "", string end = "") { return PostList(options, "/ApiService/SubContractorInfo.ashx", "获取参建单位", start, end); } /// /// 获取班组信息。 /// public static SedinApiListResult GetTeams(SedinRealNameOptions options, string start = "", string end = "") { return PostList(options, "/ApiService/TeamInfo.ashx", "获取班组信息", start, end); } /// /// 获取人员信息。 /// public static SedinApiListResult GetPersons(SedinRealNameOptions options, string start = "", string end = "") { return PostList(options, "/ApiService/GetUser.ashx", "获取人员信息", start, end); } /// /// 获取打卡记录。 /// public static SedinApiListResult GetCheckIns(SedinRealNameOptions options, string start = "", string end = "") { return PostList(options, "/ApiService/GetCockIn.ashx", "获取打卡记录", start, end); } /// /// 同步参建单位到 Base_Unit / Project_ProjectUnit。 /// 返回值:外部单位ID -> 本系统单位ID。 /// public static Dictionary SyncSubContractors(string projectId, SedinApiListResult result) { var unitMap = new Dictionary(); if (result == null || result.Items == null || result.Items.Count == 0) { return unitMap; } foreach (var item in result.Items) { if (string.IsNullOrEmpty(item.FBDataID) || string.IsNullOrEmpty(item.Name)) { continue; } var unit = Funs.DB.Base_Unit.FirstOrDefault(x => x.FromUnitId == item.FBDataID) ?? (!string.IsNullOrEmpty(item.OrgCode_XY) ? Funs.DB.Base_Unit.FirstOrDefault(x => x.CollCropCode == item.OrgCode_XY) : null) ?? Funs.DB.Base_Unit.FirstOrDefault(x => x.UnitName == item.Name); if (unit == null) { unit = new Model.Base_Unit { UnitId = SQLHelper.GetNewID(typeof(Model.Base_Unit)), UnitCode = !string.IsNullOrEmpty(item.OrgCode_XY) ? item.OrgCode_XY : item.FBDataID, UnitName = item.Name, ShortUnitName = item.ShortName, Corporate = item.OrgOwner, Address = FirstNotEmpty(item.Address, item.OrgAddress), Telephone = item.FuZeRenPhone, EMail = item.Email, DataSources = DataSourceName, FromUnitId = item.FBDataID, CollCropCode = item.OrgCode_XY, LinkName = item.FuZeRen, IdcardNumber = item.OrgOwnerCode, LinkMobile = item.FuZeRenPhone, CollCropStatus = item.Status, }; UnitService.AddUnit(unit); unit = Funs.DB.Base_Unit.FirstOrDefault(x => x.UnitId == unit.UnitId); } else { unit.UnitCode = !string.IsNullOrEmpty(item.OrgCode_XY) ? item.OrgCode_XY : unit.UnitCode; unit.UnitName = item.Name; unit.ShortUnitName = item.ShortName; unit.Corporate = item.OrgOwner; unit.Address = FirstNotEmpty(item.Address, item.OrgAddress); unit.Telephone = item.FuZeRenPhone; unit.EMail = item.Email; unit.DataSources = DataSourceName; unit.FromUnitId = item.FBDataID; unit.CollCropCode = item.OrgCode_XY; unit.LinkName = item.FuZeRen; unit.IdcardNumber = item.OrgOwnerCode; unit.LinkMobile = item.FuZeRenPhone; unit.CollCropStatus = item.Status; Funs.DB.SubmitChanges(); } if (unit == null) { continue; } unitMap[item.FBDataID] = unit.UnitId; var projectUnit = ProjectUnitService.GetProjectUnitByUnitIdProjectId(projectId, unit.UnitId); if (projectUnit == null) { ProjectUnitService.AddProjectUnit(new Model.Project_ProjectUnit { ProjectId = projectId, UnitId = unit.UnitId, UnitType = MapUnitType(item.FenBaoType), InTime = ParseDateTime(item.RCDate), OutTime = ParseDateTime(item.LCDate), IsSynchro = true, IsOutSideUnit = true, }); } else { projectUnit.UnitType = MapUnitType(item.FenBaoType); projectUnit.InTime = ParseDateTime(item.RCDate); projectUnit.OutTime = ParseDateTime(item.LCDate); projectUnit.IsSynchro = true; projectUnit.IsOutSideUnit = true; ProjectUnitService.UpdateProjectUnit(projectUnit); } } return unitMap; } /// /// 同步班组到 ProjectData_TeamGroup。 /// 返回值:外部班组ID -> 本系统班组ID。 /// public static Dictionary SyncTeams(string projectId, IDictionary unitMap, SedinApiListResult result) { var teamMap = new Dictionary(); if (result == null || result.Items == null || result.Items.Count == 0) { return teamMap; } foreach (var item in result.Items) { if (string.IsNullOrEmpty(item.BZDataID) || string.IsNullOrEmpty(item.Name)) { continue; } string unitId = GetMappedValue(unitMap, item.FBDataID); if (string.IsNullOrEmpty(unitId)) { continue; } var team = Funs.DB.ProjectData_TeamGroup.FirstOrDefault(x => x.ProjectId == projectId && x.ThirdTeamCode == item.BZDataID) ?? Funs.DB.ProjectData_TeamGroup.FirstOrDefault(x => x.ProjectId == projectId && x.UnitId == unitId && x.TeamGroupName == item.Name); if (team == null) { team = new Model.ProjectData_TeamGroup { TeamGroupId = SQLHelper.GetNewID(typeof(Model.ProjectData_TeamGroup)), ProjectId = projectId, UnitId = unitId, TeamGroupCode = item.BZDataID, TeamGroupName = item.Name, ThirdTeamCode = item.BZDataID, EntryTime = ParseDateTime(item.RCDate), ExitTime = ParseDateTime(item.LCDate), Remark = item.Remark, }; TeamGroupService.AddTeamGroup(team); team = Funs.DB.ProjectData_TeamGroup.FirstOrDefault(x => x.TeamGroupId == team.TeamGroupId); } else { team.UnitId = unitId; team.TeamGroupCode = item.BZDataID; team.TeamGroupName = item.Name; team.ThirdTeamCode = item.BZDataID; team.EntryTime = ParseDateTime(item.RCDate); team.ExitTime = ParseDateTime(item.LCDate); team.Remark = item.Remark; Funs.DB.SubmitChanges(); } if (team != null) { teamMap[item.BZDataID] = team.TeamGroupId; } } return teamMap; } /// /// 同步人员到 Person_Persons / SitePerson_Person。 /// public static int SyncPersons(string projectId, IDictionary unitMap, IDictionary teamMap, SedinApiListResult result) { int count = 0; if (result == null || result.Items == null || result.Items.Count == 0) { return count; } foreach (var item in result.Items) { if (string.IsNullOrEmpty(item.Shenfenzheng) || string.IsNullOrEmpty(item.Name)) { continue; } string unitId = GetMappedValue(unitMap, item.FBDataID); string teamGroupId = GetMappedValue(teamMap, item.BZDataID); if (string.IsNullOrEmpty(unitId)) { continue; } string workPostId = EnsureWorkPost(item.Zhicheng); string personId = EnsurePerson(item, unitId, workPostId); EnsureSitePerson(projectId, personId, unitId, teamGroupId, workPostId, item); UpdateTeamLeaderByPerson(teamGroupId, personId, item.TeamWorkerType); count++; } return count; } /// /// 同步打卡记录到 SitePerson_PersonInOut。 /// public static int SyncCheckIns(string projectId, SedinApiListResult result) { int count = 0; if (result == null || result.Items == null || result.Items.Count == 0) { return count; } foreach (var item in result.Items) { if (string.IsNullOrEmpty(item.Shenfenzheng)) { continue; } DateTime? checkTime = ParseDateTime(item.CheckTime); if (!checkTime.HasValue) { continue; } bool isIn = ParseIsIn(item.inout); var sitePerson = SitePerson_PersonService.GetSitePersonByProjectIdIdentityCard(projectId, item.Shenfenzheng); if (sitePerson == null || string.IsNullOrEmpty(sitePerson.PersonId)) { continue; } var exists = PersonInOutService.GetPersonInOutByTimePersonId(sitePerson.PersonId, checkTime.Value, isIn); if (exists != null) { continue; } PersonInOutService.AddPersonInOut(new Model.SitePerson_PersonInOut { ProjectId = projectId, PersonId = sitePerson.PersonId, IdentityCard = item.Shenfenzheng, IsIn = isIn, ChangeTime = checkTime, InOutWay = Const.InOutWay_1, OldID = item.machine_sn, Address = item.MachineAlias, Remark = "赛鼎实名制同步", }); count++; } return count; } private static SedinApiListResult PostList(SedinRealNameOptions options, string path, string operationName, string start, string end) { ValidateOptions(options); string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm"); string token = BuildToken(options, timestamp); string url = BuildRequestUrl(options.BaseUrl, path, token); string body = JsonConvert.SerializeObject(new { xmjc = options.Xmjc, xmcode = options.Xmcode, start = start ?? string.Empty, end = end ?? string.Empty, }); string responseText = APIGetHttpService.OutsideHttp(url, "POST", "application/json;charset=utf-8", null, body); var response = ParseResponse(responseText); SynchroSetService.InsertRealNamePushLog(options.ProjectId, options.Xmcode, operationName, response.Success ? "True" : "False", response.Code, response.Message, response.DataRaw, body); if (!response.Success) { throw new InvalidOperationException($"{operationName}失败:{response.Message}"); } return response; } private static SedinApiListResult ParseResponse(string responseText) { var result = new SedinApiListResult { Raw = responseText, }; if (string.IsNullOrWhiteSpace(responseText)) { result.Success = false; result.Message = "接口未返回任何内容"; return result; } JObject obj = JObject.Parse(responseText); result.Code = FirstNotEmpty(obj["code"]?.ToString(), obj["success"]?.ToString()); result.Message = FirstNotEmpty(obj["msg"]?.ToString(), obj["message"]?.ToString()); result.LastStart = obj["laststart"]?.ToString(); result.Success = IsSuccess(obj["success"]); result.DataRaw = obj["data"]?.ToString(); if (string.IsNullOrWhiteSpace(result.DataRaw)) { result.Items = new List(); return result; } JToken dataToken = obj["data"]; if (dataToken == null) { result.Items = new List(); return result; } if (dataToken.Type == JTokenType.String) { string dataString = dataToken.ToString(); if (string.IsNullOrWhiteSpace(dataString)) { result.Items = new List(); } else { result.Items = JsonConvert.DeserializeObject>(dataString); } } else if (dataToken.Type == JTokenType.Array) { result.Items = dataToken.ToObject>(); } else { result.Items = new List(); } if (result.Items == null) { result.Items = new List(); } return result; } private static string EnsurePerson(SedinPersonDto item, string unitId, string workPostId) { var person = Person_PersonsService.GetPerson_PersonsByIdCard(item.Shenfenzheng); if (person == null) { person = new Model.Person_Persons { PersonId = SQLHelper.GetNewID(typeof(Model.Person_Persons)), UnitId = unitId, WorkPostId = workPostId, PersonName = item.Name, IdentityCard = item.Shenfenzheng, IdcardType = "身份证", Telephone = FirstNotEmpty(item.ShoujiHaoma, item.LianxiDianHua), Sex = MapSex(item.Xingbie), Birthday = ParseDateTime(item.ChushengRq), Address = item.JiatingDz, PhotoUrl = item.EmpPhoto, PersonType = "3", Email = item.Email, IsPost = item.Status != "0", IntoDate = ParseDateTime(item.RuzhiRq), WorkDate = ParseDateTime(item.RuzhiRq), DataFrom = DataSourceName, OldDataId = FirstNotEmpty(item.Kaoqinhao, item.Shenfenzheng), Major = item.Zhicheng, }; Person_PersonsService.AddPerson(person); return person.PersonId; } bool changed = false; changed |= SetStringProperty(person.UnitId, unitId, v => person.UnitId = v); changed |= SetStringProperty(person.WorkPostId, workPostId, v => person.WorkPostId = v); changed |= SetStringProperty(person.PersonName, item.Name, v => person.PersonName = v); changed |= SetStringProperty(person.IdentityCard, item.Shenfenzheng, v => person.IdentityCard = v); changed |= SetStringProperty(person.Telephone, FirstNotEmpty(item.ShoujiHaoma, item.LianxiDianHua), v => person.Telephone = v); changed |= SetStringProperty(person.Sex, MapSex(item.Xingbie), v => person.Sex = v); changed |= SetStringProperty(person.Address, item.JiatingDz, v => person.Address = v); changed |= SetStringProperty(person.PhotoUrl, item.EmpPhoto, v => person.PhotoUrl = v); changed |= SetStringProperty(person.PersonType, "3", v => person.PersonType = v); changed |= SetStringProperty(person.Email, item.Email, v => person.Email = v); changed |= SetStringProperty(person.DataFrom, DataSourceName, v => person.DataFrom = v); changed |= SetStringProperty(person.OldDataId, FirstNotEmpty(item.Kaoqinhao, item.Shenfenzheng), v => person.OldDataId = v); changed |= SetStringProperty(person.Major, item.Zhicheng, v => person.Major = v); changed |= SetDateProperty(person.Birthday, ParseDateTime(item.ChushengRq), v => person.Birthday = v); changed |= SetDateProperty(person.IntoDate, ParseDateTime(item.RuzhiRq), v => person.IntoDate = v); changed |= SetDateProperty(person.WorkDate, ParseDateTime(item.RuzhiRq), v => person.WorkDate = v); bool isPost = item.Status != "0"; if (person.IsPost != isPost) { person.IsPost = isPost; changed = true; } if (changed) { Person_PersonsService.UpdatePerson(person); } return person.PersonId; } private static void EnsureSitePerson(string projectId, string personId, string unitId, string teamGroupId, string workPostId, SedinPersonDto item) { var sitePerson = SitePerson_PersonService.GetSitePersonByProjectIdPersonId(projectId, personId) ?? SitePerson_PersonService.GetSitePersonByProjectIdIdentityCard(projectId, item.Shenfenzheng); DateTime? inTime = ParseDateTime(item.RuzhiRq); DateTime? outTime = ParseDateTime(item.LiZhiRq); string states = item.Status == "0" ? Const.ProjectPersonStates_2 : Const.ProjectPersonStates_1; if (sitePerson == null) { SitePerson_PersonService.AddSitePerson(new Model.SitePerson_Person { SitePersonId = SQLHelper.GetNewID(typeof(Model.SitePerson_Person)), PersonId = personId, CardNo = item.Kaoqinhao, PersonName = item.Name, UnitId = unitId, IdentityCard = item.Shenfenzheng, ProjectId = projectId, TeamGroupId = teamGroupId, WorkPostId = workPostId, InTime = inTime ?? DateTime.Now, OutTime = outTime, States = states, Remark = FirstNotEmpty(item.Memo, item.Zhicheng), AuditorDate = DateTime.Now, }); sitePerson = SitePerson_PersonService.GetSitePersonByProjectIdPersonId(projectId, personId); } else { sitePerson.PersonId = personId; sitePerson.CardNo = item.Kaoqinhao; sitePerson.PersonName = item.Name; sitePerson.UnitId = unitId; sitePerson.IdentityCard = item.Shenfenzheng; sitePerson.ProjectId = projectId; sitePerson.TeamGroupId = teamGroupId; sitePerson.WorkPostId = workPostId; sitePerson.InTime = inTime ?? sitePerson.InTime; sitePerson.OutTime = outTime; sitePerson.States = states; sitePerson.Remark = FirstNotEmpty(item.Memo, item.Zhicheng); if (!sitePerson.AuditorDate.HasValue) { sitePerson.AuditorDate = DateTime.Now; } SitePerson_PersonService.UpdateSitePerson(sitePerson, null); } if (sitePerson != null) { sitePerson.RealNameAddTime = sitePerson.RealNameAddTime ?? DateTime.Now; sitePerson.RealNameUpdateTime = DateTime.Now; Funs.DB.SubmitChanges(); } } private static void UpdateTeamLeaderByPerson(string teamGroupId, string personId, string teamWorkerType) { if (string.IsNullOrEmpty(teamGroupId) || teamWorkerType != "1") { return; } var team = TeamGroupService.GetTeamGroupById(teamGroupId); if (team != null && team.GroupLeaderId != personId) { team.GroupLeaderId = personId; TeamGroupService.UpdateTeamGroup(team); } } private static string EnsureWorkPost(string workPostName) { if (string.IsNullOrWhiteSpace(workPostName)) { workPostName = "其他"; } var workPost = Funs.DB.Base_WorkPost.FirstOrDefault(x => x.WorkPostName == workPostName); if (workPost != null) { return workPost.WorkPostId; } var newWorkPost = new Model.Base_WorkPost { WorkPostId = SQLHelper.GetNewID(typeof(Model.Base_WorkPost)), WorkPostCode = workPostName, WorkPostName = workPostName, PostType = "3", Remark = "赛鼎实名制同步", }; WorkPostService.AddWorkPost(newWorkPost); return newWorkPost.WorkPostId; } private static string MapUnitType(string unitTypeName) { if (string.IsNullOrWhiteSpace(unitTypeName)) { return Const.ProjectUnitType_0; } if (unitTypeName.Contains("总承包")) { return Const.ProjectUnitType_1; } if (unitTypeName.Contains("劳务") || unitTypeName.Contains("专业分包") || unitTypeName.Contains("分包")) { return Const.ProjectUnitType_2; } if (unitTypeName.Contains("监理")) { return Const.ProjectUnitType_3; } if (unitTypeName.Contains("建设")) { return Const.ProjectUnitType_4; } if (unitTypeName.Contains("检测") || unitTypeName.Contains("监测")) { return Const.ProjectUnitType_5; } if (unitTypeName.Contains("供应")) { return Const.ProjectUnitType_6; } return Const.ProjectUnitType_0; } private static string MapSex(string sex) { return sex == "女" ? "2" : "1"; } private static bool ParseIsIn(string inout) { return inout != "2"; } private static string BuildRequestUrl(string baseUrl, string path, string token) { string url = NormalizeUrl(baseUrl) + path; return $"{url}?token={Uri.EscapeDataString(token)}"; } private static string NormalizeUrl(string baseUrl) { string url = (baseUrl ?? string.Empty).Trim().TrimEnd('/'); if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) && !url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) { url = "http://" + url; } return url; } private static string BuildToken(SedinRealNameOptions options, string timestamp) { string raw = $"xmcode={options.Xmcode}&xmjc={options.Xmjc}&api_key_szzjt={options.ApiKey}&api_secret_szzjt={options.ApiSecret}×tamp={timestamp}"; using (var md5 = MD5.Create()) { byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(raw)); StringBuilder sb = new StringBuilder(bytes.Length * 2); foreach (byte item in bytes) { sb.Append(item.ToString("x2")); } return sb.ToString(); } } private static bool IsSuccess(JToken token) { if (token == null) { return false; } string value = token.ToString().Trim(); return value == "0" || value.Equals("true", StringComparison.OrdinalIgnoreCase); } private static DateTime? ParseDateTime(string value) { if (string.IsNullOrWhiteSpace(value)) { return null; } DateTime dateTime; if (DateTime.TryParse(value, out dateTime)) { return dateTime; } double oaValue; if (double.TryParse(value, out oaValue) && oaValue > 0 && oaValue < 600000) { try { return DateTime.FromOADate(oaValue); } catch { return null; } } return null; } private static void ValidateOptions(SedinRealNameOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrWhiteSpace(options.ProjectId)) { throw new InvalidOperationException("ProjectId 未配置"); } if (string.IsNullOrWhiteSpace(options.BaseUrl)) { throw new InvalidOperationException("赛鼎实名制接口地址未配置"); } if (string.IsNullOrWhiteSpace(options.Xmjc)) { throw new InvalidOperationException("项目简称 xmjc 未配置"); } if (string.IsNullOrWhiteSpace(options.Xmcode)) { throw new InvalidOperationException("项目编号 xmcode 未配置"); } if (string.IsNullOrWhiteSpace(options.ApiKey)) { throw new InvalidOperationException("api_key 未配置"); } if (string.IsNullOrWhiteSpace(options.ApiSecret)) { throw new InvalidOperationException("api_secret 未配置"); } } private static string GetMappedValue(IDictionary map, string key) { if (map == null || string.IsNullOrEmpty(key)) { return null; } string value; return map.TryGetValue(key, out value) ? value : null; } private static string FirstNotEmpty(params string[] values) { return values.FirstOrDefault(x => !string.IsNullOrWhiteSpace(x)); } private static bool SetStringProperty(string currentValue, string newValue, Action setter) { if (currentValue == newValue) { return false; } setter(newValue); return true; } private static bool SetDateProperty(DateTime? currentValue, DateTime? newValue, Action setter) { if (currentValue == newValue) { return false; } setter(newValue); return true; } } /// /// 赛鼎实名制接口请求参数。 /// public class SedinRealNameOptions { public string ProjectId { get; set; } public string UnitId { get; set; } public string BaseUrl { get; set; } public string Xmjc { get; set; } public string Xmcode { get; set; } public string ApiKey { get; set; } public string ApiSecret { get; set; } } /// /// 赛鼎实名制同步结果。 /// public class SedinRealNameSyncResult { public string ProjectId { get; set; } public int SubContractorCount { get; set; } public int TeamCount { get; set; } public int PersonCount { get; set; } public int CheckInCount { get; set; } public string LastStart { get; set; } public string Message { get; set; } } /// /// 赛鼎实名制列表接口返回结果。 /// public class SedinApiListResult { public bool Success { get; set; } public string Code { get; set; } public string Message { get; set; } public string LastStart { get; set; } public string DataRaw { get; set; } public string Raw { get; set; } public List Items { get; set; } } public class SedinSubContractorDto { public string XMDataID { get; set; } public string FBDataID { get; set; } public string Name { get; set; } public string FuZeRen { get; set; } public string FuZeRenPhone { get; set; } public string Remark { get; set; } public string OrgCode_XY { get; set; } public string OrgAddress { get; set; } public string OrgOwner { get; set; } public string OrgOwnerCode { get; set; } public string ModifyTime { get; set; } public string Address { get; set; } public string Email { get; set; } public string FenBaoType { get; set; } public string ShortName { get; set; } public string RCDate { get; set; } public string LCDate { get; set; } public string Status { get; set; } } public class SedinTeamDto { public string XMDataID { get; set; } public string FBDataID { get; set; } public string BZDataID { get; set; } public string Name { get; set; } public string Remark { get; set; } public string ModifyTime { get; set; } public string RCDate { get; set; } public string LCDate { get; set; } public string Status { get; set; } } public class SedinPersonDto { public string XMDataID { get; set; } public string FBDataID { get; set; } public string BZDataID { get; set; } public string Kaoqinhao { get; set; } public string Name { get; set; } public string Zhicheng { get; set; } public string Shenfenzheng { get; set; } public string ChushengRq { get; set; } public string Xingbie { get; set; } public string Jiguan { get; set; } public string Mingzu { get; set; } public string Xueli { get; set; } public string RuzhiRq { get; set; } public string LiZhiRq { get; set; } public string Email { get; set; } public string LianxiDianHua { get; set; } public string ShoujiHaoma { get; set; } public string JiatingDz { get; set; } public string IsBlack { get; set; } public string Status { get; set; } public string Memo { get; set; } public string TeamWorkerType { get; set; } public string EmpPhoto { get; set; } } public class SedinCheckInDto { public string Shenfenzheng { get; set; } public string Name { get; set; } public string MachineAlias { get; set; } public string machine_sn { get; set; } public string CheckTime { get; set; } public string inout { get; set; } public string AddTime { get; set; } } }