using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Configuration; using System.IO; using System.Net.Http; using System.Threading.Tasks; using Model; using Newtonsoft.Json; using RestSharp; using System.Net; namespace BLL { public class APIPersonSyncService { #region 根据项目、单位获取人员列表分页 public static List GetPersonLitsByProjectIdAndUnitId(string projectId, string unitId, string dataId = "") { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { var list = from x in db.SitePerson_Person where x.ProjectId == projectId select x; if (!string.IsNullOrEmpty(unitId)) { list = list.Where(x => x.UnitId == unitId); } if (!string.IsNullOrEmpty(dataId)) { list = list.Where(x => x.PersonId == dataId); } var personList = (from x in list join wp in db.Base_WorkPost on x.WorkPostId equals wp.WorkPostId into wpTemp from wp in wpTemp.DefaultIfEmpty() join tg in db.ProjectData_TeamGroup on x.TeamGroupId equals tg.TeamGroupId into tgTemp from tg in tgTemp.DefaultIfEmpty() join c in db.Base_Certificate on x.CertificateId equals c.CertificateId into cTemp from c in cTemp.DefaultIfEmpty() join att1 in db.AttachFile on (x.PersonId + "#1") equals att1.ToKeyId into att1Temp from att1 in att1Temp.DefaultIfEmpty() join att2 in db.AttachFile on (x.PersonId + "#2") equals att2.ToKeyId into att2Temp from att2 in att2Temp.DefaultIfEmpty() join att3 in db.AttachFile on (x.PersonId + "#3") equals att3.ToKeyId into att3Temp from att3 in att3Temp.DefaultIfEmpty() join att4 in db.AttachFile on (x.PersonId + "#4") equals att4.ToKeyId into att4Temp from att4 in att4Temp.DefaultIfEmpty() join att5 in db.AttachFile on (x.PersonId + "#5") equals att5.ToKeyId into att5Temp from att5 in att5Temp.DefaultIfEmpty() select new Model.PersonSyncItem { PersonId = x.PersonId, CardNo = x.CardNo, PersonName = x.PersonName, //Sex = x.Sex, IdentityCard = x.IdentityCard, //Address = x.Address, ProjectId = x.ProjectId, UnitId = x.UnitId, TeamGroupId = x.TeamGroupId, WorkAreaId = x.WorkAreaId, WorkPostId = x.WorkPostId, InTime = x.InTime, OutTime = x.OutTime, OutResult = x.OutResult, //Telephone = x.Telephone, // x.PositionId,//职务 // x.PostTitleId,//职称 //PhotoUrl = x.PhotoUrl, //IsUsed = x.IsUsed, //IsCardUsed = x.IsCardUsed, //PersonIndex = x.PersonIndex, // x.DepartId,//部门 CertificateId = x.CertificateId, CertificateItem = APIDataShareSyncService.GetPersonQualityByPersonId(x.PersonId), //特岗证书 CertificateCode = x.CertificateCode, CertificateName = c.CertificateName, CertificateLimitTime = x.CertificateLimitTime, //QualificationCertificateUrl = x.QualificationCertificateUrl, //TrainingCertificateUrl = x.TrainingCertificateUrl, //QRCodeAttachUrl = x.QRCodeAttachUrl, //Password = x.Password, //FromPersonId = x.FromPersonId, // x.AuditorId,审核人 AuditorDate = x.AuditorDate, ExchangeTime = x.ExchangeTime, ExchangeTime2 = x.ExchangeTime2, //IDCardUrl = x.IDCardUrl, //IsForeign = x.IsForeign, //IsOutside = x.IsOutside, //EduLevel = x.EduLevel, //MaritalStatus = x.MaritalStatus, Isprint = x.Isprint, //MainCNProfessionalId = x.MainCNProfessionalId, //ViceCNProfessionalId = x.ViceCNProfessionalId, //Birthday = x.Birthday, //IdcardType = x.IdcardType, //IdcardStartDate = x.IdcardStartDate, //IdcardEndDate = x.IdcardEndDate, //IdcardForever = x.IdcardForever, //PoliticsStatus = x.PoliticsStatus, //IdcardAddress = x.IdcardAddress, //Nation = x.Nation, //CountryCode = x.CountryCode, IsSafetyMonitoring = x.IsSafetyMonitoring, //ProvinceCode = x.ProvinceCode, //IsCardNoOK = x.IsCardNoOK, // AttachUrl1 = AttachFileService.getFileUrl(x.PersonId + "#1"), // AttachUrl2 = AttachFileService.getFileUrl(x.PersonId + "#2"), // AttachUrl3 = AttachFileService.getFileUrl(x.PersonId + "#3"), // AttachUrl4 = AttachFileService.getFileUrl(x.PersonId + "#4"), // AttachUrl5 = AttachFileService.getFileUrl(x.PersonId + "#5"), AttachUrl1 = att1.AttachUrl, AttachUrl2 = att2.AttachUrl, AttachUrl3 = att3.AttachUrl, AttachUrl4 = att4.AttachUrl, AttachUrl5 = att5.AttachUrl, WorkPostName = wp.WorkPostName, //岗位名称 PostType = wp.PostType, //岗位诶类型 IsHsse = wp.IsHsse, //岗位是否是安管人员 IsCQMS = wp.IsCQMS, //岗位是否是质量管理 TeamGroupName = tg.TeamGroupName, WorkAreaName = APIDataShareSyncService.GetWorkAreaNames(x.WorkAreaId, projectId) }).ToList(); return personList; } } #endregion #region 拉取项目人员数据 public static async Task getPersonLists() { int code = 0; string message = ""; try { string CollCropCode = string.Empty; string unitId = string.Empty; var thisUnit = CommonService.GetIsThisUnit(); //当前单位 if (thisUnit != null) { CollCropCode = thisUnit.CollCropCode; //社会统一信用代码 unitId = thisUnit.UnitId; } var ProjectList = (from x in Funs.DB.Base_Project where x.SubjectUnit != null && x.SubjectProject != null select x).ToList(); if (ProjectList.Count > 0) { foreach (var project in ProjectList) { string SubjectUnitId = project.SubjectUnit; //集团的单位id string SubjectProjectId = project.SubjectProject; //集团的单位id //获取对应单位的apiurl地址 //var Url = BLL.UnitService.getUnitApiUrlByUnitId(SubjectUnitId); //var ApiUrl = ""; //var WebUrl = ""; //if (!string.IsNullOrEmpty(Url)) //{ // var urls = Url.Split(','); // ApiUrl = urls[0]; // if (urls.Length > 1) // { // WebUrl = urls[1]; // } //} string ApiUrl = project.SubjectUnitApiUrl; string WebUrl = project.SubjectUnitWebUrl; // CollCropCode = "913404001520228377Y";//测试使用 // SubjectProjectId = "B409A8D7-48C7-486E-84C7-E3E7B2C0E5B7";//测试使用 // unitId = "aaa9e72b-e3a6-441e-a7bb-afc008adebc9";//测试使用 string url = "/api/PersonSync/getPersonListByProjectIdAndCollCropCode?projectId=" + SubjectProjectId + "&collCropCode=" + CollCropCode; string baseurl = ApiUrl + url; string contenttype = "application/json;charset=unicode"; var strJosn = ""; using (HttpClient client = new HttpClient()) { client.Timeout = TimeSpan.FromMinutes(5); // 设置超时时间为5分钟 client.DefaultRequestHeaders.Add("token", "AF17168B-87BD-4GLY-1111-F0A0A1158F9B"); // 前提是所有二级单位都有sysGLY账号且id是AF17168B-87BD-4GLY-1111-F0A0A1158F9B可作为token strJosn = await client.GetStringAsync(baseurl); } // var strJosn = APIGetHttpService.Http(baseurl, "GET", contenttype, null, null); if (!string.IsNullOrEmpty(strJosn)) { JObject obj = JObject.Parse(strJosn); code = Funs.GetNewIntOrZero(obj["code"].ToString()); message = obj["message"].ToString(); if (code == 1) { var getData = JsonConvert.DeserializeObject>(obj["data"].ToString()); if (getData.Count() > 0) { ProcessPersonData(getData, project.ProjectId, unitId, WebUrl); } message = "获取成功:同步人员数" + getData.Count().ToString() + "条"; } } } } } catch (Exception ex) { message = "获取失败:" + ex.Message; ErrLogInfo.WriteLog("人员获取!", ex); } return message; } #endregion #region 推送人员数据 public static ReturnData pushPersonLists(string projectId, string dataId) { Model.ReturnData responeData = new Model.ReturnData(); responeData.code = 0; responeData.message = string.Empty; try { var project = Funs.DB.Base_Project.FirstOrDefault(x => x.ProjectId == projectId); if (project != null) { //获取人员数据 var items = GetPersonLitsByProjectIdAndUnitId(projectId, "", dataId); //总包地址推送 if (items.Count() > 0) { var thisUnit = CommonService.GetIsThisUnit(); //当前单位 var apiurl = "/api/PersonSync/SavePersonSyncData"; //总包单位接口地址 //var Url = BLL.UnitService.getUnitApiUrlByUnitId(project.SubjectUnit); //var ApiUrl = ""; //var WebUrl = ""; //if (!string.IsNullOrEmpty(Url)) //{ // var urls = Url.Split(','); // ApiUrl = urls[0]; // if (urls.Length > 1) // { // WebUrl = urls[1]; // } //} string ApiUrl = project.SubjectUnitApiUrl; string WebUrl = project.SubjectUnitWebUrl; // thisUnit.CollCropCode = "913404001520228377Y"; //分包单位社会统一信用码 测试使用 // project.SubjectProject = "B409A8D7-48C7-486E-84C7-E3E7B2C0E5B7";//测试使用 var pushData = new PersonSyncData { CollCropCode = thisUnit.CollCropCode, //分包单位社会统一信用码 ProjectId = project.SubjectProject, //主包项目Id UnitDomain = Funs.SGGLUrl, //分包单位域名地址【文件存储地址】 Items = items //人员数据 }; var pushContent = JsonConvert.SerializeObject(pushData); string baseurl = ApiUrl + apiurl; string contenttype = "application/json;charset=unicode"; var returndata = APIGetHttpService.Http(baseurl, "Post", contenttype, null, pushContent); if (!string.IsNullOrEmpty(returndata)) { JObject obj = JObject.Parse(returndata); string code = obj["code"].ToString(); string message = obj["message"].ToString(); responeData.code = int.Parse(code); responeData.message = message; } } else { responeData.code = 0; responeData.message = "当前没有项目人员数据"; } } } catch (Exception ex) { responeData.message = "同步到总包单位失败!"; ErrLogInfo.WriteLog("【项目人员】同步到总包单位失败!", ex); } return responeData; } #endregion #region 接收保存项目人员数据 public static async Task SavePersonSyncData(Model.PersonSyncData items) { int code = 0; string message = ""; try { if (items.Items.Count > 0) { //获取分包单位CollCropCode var CollCropCode = items.CollCropCode; var ProjectId = items.ProjectId; var UnitDomain = items.UnitDomain; //分包单位域名地址【文件存储地址】 //1、判断分包单位是否存在 //根据分包单位CollCropCode获取单位id var unit = Funs.DB.Base_Unit.FirstOrDefault(x => x.CollCropCode == CollCropCode); if (unit == null) { message = "总包单位不存在本单位,请登录总包系统检查维护本单位信息!"; } else { //2、判断主包项目是否存在 var porject = BLL.ProjectService.GetProjectByProjectId(ProjectId); if (porject == null) { message = "总包单位不存在本项目,请检查总包项目关联是否正确!"; } else { ProcessPersonData(items.Items, ProjectId, unit.UnitId, UnitDomain); message = "数据推送成功!"; } } } else { message = "暂无项目人员数据!"; } } catch (Exception ex) { throw ex; } return message; } #endregion #region 处理单项目人员数据的新增或更新逻辑 /// /// 处理单项目人员数据的新增或更新逻辑 /// /// 人员数据项 /// 项目id /// 单位ID /// Web地址 private static async void ProcessPersonData(List getData, string projectId, string unitId, string WebUrl) { using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString)) { foreach (var item in getData) { try { string IdentityCard = item.IdentityCard; var model = db.SitePerson_Person.FirstOrDefault(e => e.IdentityCard == IdentityCard && e.ProjectId == projectId); if (model == null) { Model.SitePerson_Person newModel = new Model.SitePerson_Person { PersonId = item.PersonId, CardNo = item.CardNo, PersonName = item.PersonName, //Sex = item.Sex, IdentityCard = item.IdentityCard, //Address = item.Address, ProjectId = projectId, UnitId = unitId, TeamGroupId = APIDataShareSyncService.GetTeamGroupId(item.TeamGroupName, projectId, unitId), WorkAreaId = APIDataShareSyncService.getWorkAreaId(item.WorkAreaName, projectId), WorkPostId = APIDataShareSyncService.getWorkPostId(item.WorkPostName, item.PostType, item.IsHsse.ToString(), item.IsCQMS.ToString(),item.IsCQMSCheck.ToString()), InTime = item.InTime, OutTime = item.OutTime, OutResult = item.OutResult, //Telephone = item.Telephone, //PhotoUrl = item.PhotoUrl, // 异步安全的头像下载 //HeadImage = await SafeDownloadHeadImageAsync(WebUrl, item.PhotoUrl), //IsUsed = item.IsUsed, //IsCardUsed = item.IsCardUsed, //PersonIndex = item.PersonIndex, CertificateId = item.CertificateId, CertificateCode = item.CertificateCode, CertificateLimitTime = item.CertificateLimitTime, //QualificationCertificateUrl = item.QualificationCertificateUrl, //TrainingCertificateUrl = item.TrainingCertificateUrl, //QRCodeAttachUrl = item.QRCodeAttachUrl, //Password = item.Password, //FromPersonId = item.FromPersonId, AuditorDate = item.AuditorDate, ExchangeTime = item.ExchangeTime, ExchangeTime2 = item.ExchangeTime2, //IDCardUrl = item.IDCardUrl, //IsForeign = item.IsForeign, //IsOutside = item.IsOutside, //EduLevel = item.EduLevel, //MaritalStatus = item.MaritalStatus, Isprint = item.Isprint, //MainCNProfessionalId = item.MainCNProfessionalId, //ViceCNProfessionalId = item.ViceCNProfessionalId, //Birthday = item.Birthday, //IdcardType = item.IdcardType, //IdcardStartDate = item.IdcardStartDate, //IdcardEndDate = item.IdcardEndDate, //IdcardForever = item.IdcardForever, //PoliticsStatus = item.PoliticsStatus, //IdcardAddress = item.IdcardAddress, //Nation = item.Nation, //CountryCode = item.CountryCode, IsSafetyMonitoring = item.IsSafetyMonitoring, //ProvinceCode = item.ProvinceCode, //IsCardNoOK = item.IsCardNoOK }; db.SitePerson_Person.InsertOnSubmit(newModel); db.SubmitChanges(); } else { // 更新现有记录 UpdatePersonModel(model, item, projectId, unitId, WebUrl); db.SubmitChanges(); } // 异步安全的附件处理 await ProcessPersonAttachmentsAsync(WebUrl, item); if (item.CertificateItem != null) { APIDataShareSyncService.ProcessPersonQualityData(item.CertificateItem, item.PersonId); } } catch (Exception ex) { // 记录异常但不中断整个批处理 BLL.ErrLogInfo.WriteLog($"处理人员数据时出错 PersonId: {item?.PersonId}, 错误: {ex.Message}"); continue; // 继续处理下一个记录 } } } } // 安全的头像下载方法 public static async Task SafeDownloadHeadImageAsync(string webUrl, string photoUrl) { try { if (string.IsNullOrEmpty(photoUrl)) return null; return await APIDataShareSyncService.DownloadHeadImageAsync(webUrl, photoUrl); } catch (Exception ex) { BLL.ErrLogInfo.WriteLog($"下载头像失败: {photoUrl}, 错误: {ex.Message}"); return null; } } // 更新人员模型的辅助方法 private static void UpdatePersonModel(Model.SitePerson_Person model, PersonSyncItem item, string projectId, string unitId, string webUrl) { // model.PersonId = item.PersonId; model.CardNo = item.CardNo; model.PersonName = item.PersonName; //model.Sex = item.Sex; model.IdentityCard = item.IdentityCard; //model.Address = item.Address; model.ProjectId = projectId; model.UnitId = unitId; model.TeamGroupId = APIDataShareSyncService.GetTeamGroupId(item.TeamGroupName, projectId, unitId); model.WorkAreaId = APIDataShareSyncService.getWorkAreaId(item.WorkAreaName, projectId); model.WorkPostId = APIDataShareSyncService.getWorkPostId(item.WorkPostName, item.PostType, item.IsHsse.ToString(), item.IsCQMS.ToString(), item.IsCQMSCheck.ToString()); model.InTime = item.InTime; model.OutTime = item.OutTime; model.OutResult = item.OutResult; //model.Telephone = item.Telephone; //model.PhotoUrl = item.PhotoUrl; // 异步操作需要特殊处理 Task.Run(async () => { try { //model.HeadImage = await APIDataShareSyncService.DownloadHeadImageAsync(webUrl, item.PhotoUrl); } catch (Exception ex) { BLL.ErrLogInfo.WriteLog($"更新头像失败: {ex.Message}"); } }); //model.IsUsed = item.IsUsed; //model.IsCardUsed = item.IsCardUsed; //model.PersonIndex = item.PersonIndex; model.CertificateId = item.CertificateId; model.CertificateCode = item.CertificateCode; model.CertificateLimitTime = item.CertificateLimitTime; //model.QualificationCertificateUrl = item.QualificationCertificateUrl; //model.TrainingCertificateUrl = item.TrainingCertificateUrl; //model.QRCodeAttachUrl = item.QRCodeAttachUrl; //model.Password = item.Password; //model.FromPersonId = item.FromPersonId; model.AuditorDate = item.AuditorDate; model.ExchangeTime = item.ExchangeTime; model.ExchangeTime2 = item.ExchangeTime2; //model.IDCardUrl = item.IDCardUrl; //model.IsForeign = item.IsForeign; //model.IsOutside = item.IsOutside; //model.EduLevel = item.EduLevel; //model.MaritalStatus = item.MaritalStatus; model.Isprint = item.Isprint; //model.MainCNProfessionalId = item.MainCNProfessionalId; //model.ViceCNProfessionalId = item.ViceCNProfessionalId; //model.Birthday = item.Birthday; //model.IdcardType = item.IdcardType; //model.IdcardStartDate = item.IdcardStartDate; //model.IdcardEndDate = item.IdcardEndDate; //model.IdcardForever = item.IdcardForever; //model.PoliticsStatus = item.PoliticsStatus; //model.IdcardAddress = item.IdcardAddress; //model.Nation = item.Nation; //model.CountryCode = item.CountryCode; model.IsSafetyMonitoring = item.IsSafetyMonitoring; //model.ProvinceCode = item.ProvinceCode; //model.IsCardNoOK = item.IsCardNoOK; } // 异步安全的附件处理 private static async Task ProcessPersonAttachmentsAsync(string webUrl, PersonSyncItem item) { try { var attachmentTasks = new List { APIDataShareSyncService.OperationAttachFile(webUrl, item.PersonId + "#1", BLL.Const.PersonListMenuId, item.AttachUrl1), APIDataShareSyncService.OperationAttachFile(webUrl, item.PersonId + "#2", BLL.Const.PersonListMenuId, item.AttachUrl2), APIDataShareSyncService.OperationAttachFile(webUrl, item.PersonId + "#3", BLL.Const.PersonListMenuId, item.AttachUrl3), APIDataShareSyncService.OperationAttachFile(webUrl, item.PersonId + "#4", BLL.Const.PersonListMenuId, item.AttachUrl4), APIDataShareSyncService.OperationAttachFile(webUrl, item.PersonId + "#5", BLL.Const.PersonListMenuId, item.AttachUrl5) }; await Task.WhenAll(attachmentTasks); } catch (Exception ex) { BLL.ErrLogInfo.WriteLog($"处理人员附件失败 PersonId: {item.PersonId}, 错误: {ex.Message}"); } } #endregion } }