using APT.Infrastructure.Core; using APT.BaseData.Domain.Entities.FM; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using APT.Utility; using APT.BaseData.Domain.ApiModel.FM; using Newtonsoft.Json; using APT.BaseData.Domain.ApiModel.Platform; using APT.BaseData.Domain.Entities; using APT.Infrastructure.Api; using System.Linq.Expressions; using APT.BaseData.Domain.Enums; using System.IO; using APT.BaseData.Domain.Entities.OP; using APT.Migrations; using APT.BaseData.Domain.Enums.PF; using static APT.Utility.FileUtils; using System.Security.Cryptography; using static APT.Utility.RSAHelper; using System.Text; using Microsoft.AspNetCore.Http; namespace APT.FM.WebApi.Controllers.Api.FM { /// /// 数据同步 /// [Route("api/FM/DataSync")] public class DataSyncController : APTApiController { //1、组织有唯一编号 //2、岗位也有唯一编号 //3、员工工号唯一 //4、根据 MODIFY_TIME 判断是否做信息同步 /// /// 信息同步 岗位 部门 人员 /// /// /// [HttpPost, Route("Sync")] public JsonActionResult Sync([FromBody] ListDate listEntity) { return SafeExecute(() => { #region 签名验证 ( Key 获取已经注释 ) 生成Key ORG_ID.ToString() + DateTime.Now.ToString("yyyyMMdd") IHeaderDictionary Headers = Request.Headers; string Signature = string.Empty; //string Signature = "snJ0cOfn7aZ54nKcMQnz3tG1kL8IyN5H/FHsVyDpJxWyH2QNgZlCE+KSHQqcKR4PzZnpaqp7/awwGvleUsoFRn6pc1of6UZsCTEeWF2zG5ciHosp+jRhNGp55bLXCnqt+9bj9KU4Ca+lpHP/9B8nE6OW/9zoRkccFXxeZBSg32fBmlHlkjvi9cmTc0oQ/osdoRZ2HdiLJ6WZNXr9Uz9nUj7Du/qXvN5BZN7V8pxxdm9mgGnCMLMwz7cglB9mYyt/tKp9ur2UjO3bwFJ7ypZWWCQ9Af/dJe0Z8i9muTQptJCuXJ6kHjYaFHm1jny0rtO2pbaO7WPyYJQeke8d16yVNg=="; if (string.IsNullOrEmpty(Signature)) { if (Headers.ContainsKey("signature")) { Signature = Headers["signature"]; } else if (Headers.ContainsKey("Signature")) { Signature = Headers["Signature"]; } else { throw new Exception("未获取到签名!"); } } //string privateKey = "uegx1Y4vPGdg4qQJOkUyocR4Ir5dKu7+UJRUmPpADwuac9LBTAfiEf7THa5nILLS2iuMR0jBmFZC6WbyMmSAD4fuCYmIUERf6QKAFSctNFk4tXm2dlUWwsB6YurSj0queOhm6egQ+jcjsn8iq3D2+pzQcArXojHwRAUF0Nsa4CVmpLk4YSuADMBPbaT/omON08E+Qv1xw9ho2QIC+HHzvBTHtFVvlpOiAdtnZ0HfSXJ618rs4j5/WVdZ4rbKdgnlnRsMFogOmu+o0rMni4hi+kGZUqSw/heYJOZY2UOIBO6KTDwcFBWhDTbAMvl1NxalsdW1J0RPY6qsVbov4FapuQ==AQAB

30hSFbm0DV4/qtczGiKFdhg2xHTqWmd7lvGOlwb1LYfihiS6sVISiPPL6/etneOxb/zJF6aoldNoTWkSrEhpFvl8hb7jyhktzHBejXOUm2Ro6u7N+6MWUUm3BkOVDmJ3pgDY0lSua5ZBwac7N+N2nDHLg0R7dX/1QyOwdbWQXvs=

1SXcOwGErAm99l+LapYgib30oiLVN0fBUTpoICrigYSOKYPxhnPhDYyic1RqpsjFg+cT8YlXe1Kr8WbM9YOGaGM4MzkpCqGnkPMNoYjDQazZ+CQ3Nzkd93/GfzMqOZVksr9ZzfVR9E6Brn4ywJ5j8X/KoGi+6D++omKQ477f69s=snsZ+nnWPnVfSU36cGK18l+Kr+GRT7C2r0LqKzmJlNqxLW+AuKuVW1oeYMI8SyCuPol/qWM0EYfLMU3Telnrf0zwx+x+I5ea73fHbSS93rUV1O4NQ5/rABF/twcgyD3XzJ+Ssha00hVq/MST5qnxrwty1bxRP+yH/iIyNPVssS8=yFSZNOwsYfWWESWjxz3qvwtGDc1nUFmknE+k5fbohIqtgt979b6b2zw+wt6ojrFM0rgwymcnTcVZzb2tDWPcw+fdPmeO52sgLuACA7yip+tpwgtnygNo4uG5EnxoR07eIhIuuaDEsjXHNNVvphI4JRbSvwkzxN2EsuKpAyS3GNk=bOC30Dhc63ajKaghFvDnQEBWC60KWTp9dgzES90IIqCOF6l17hDLBy1aKn2I3ixT9y26IFAbBGCK50PNMW6aKvJUK3gBl+rjeWzxTEUFo2A+p0weBxRsRM3AFWObzUgXg292azJW755vFTY8cauC6E5Jgp+lM8zcMvBpCEQn2X0=LEzhezM7nFhCJR/TtxgAPb40porYZr+2yHrgQef4Vd18+7awKy8BtyoTItKJbqhOSIDyF5aF04hSv42xj0KVpZ3NomYsnnv8oujenqvMQNo2AkCzszUJjHUTdPjiHhU8yEERLRII4ac8EW/sUhBEOmod3WUoB1WBHKRZw3BC0kCPWiH1m3zjyyU9IIYBqitqZ5BKaVsAR8jae+HiN7xRO82NkVHMpCFPPJM/yEE8v8XMXdpFVRc9aWfHTtEItqg9z4DSs8PHgdiiOy0dU/nLHz97LGQUSX0CTxUGskYzgSnhtq4X2osAEOSRofioSgO88Go1f3BZLapDq/LunZ2y5Q==
"; // 私钥 ////////string privateKey2 = "

30hSFbm0DV4/qtczGiKFdhg2xHTqWmd7lvGOlwb1LYfihiS6sVISiPPL6/etneOxb/zJF6aoldNoTWkSrEhpFvl8hb7jyhktzHBejXOUm2Ro6u7N+6MWUUm3BkOVDmJ3pgDY0lSua5ZBwac7N+N2nDHLg0R7dX/1QyOwdbWQXvs=

1SXcOwGErAm99l+LapYgib30oiLVN0fBUTpoICrigYSOKYPxhnPhDYyic1RqpsjFg+cT8YlXe1Kr8WbM9YOGaGM4MzkpCqGnkPMNoYjDQazZ+CQ3Nzkd93/GfzMqOZVksr9ZzfVR9E6Brn4ywJ5j8X/KoGi+6D++omKQ477f69s=snsZ+nnWPnVfSU36cGK18l+Kr+GRT7C2r0LqKzmJlNqxLW+AuKuVW1oeYMI8SyCuPol/qWM0EYfLMU3Telnrf0zwx+x+I5ea73fHbSS93rUV1O4NQ5/rABF/twcgyD3XzJ+Ssha00hVq/MST5qnxrwty1bxRP+yH/iIyNPVssS8=yFSZNOwsYfWWESWjxz3qvwtGDc1nUFmknE+k5fbohIqtgt979b6b2zw+wt6ojrFM0rgwymcnTcVZzb2tDWPcw+fdPmeO52sgLuACA7yip+tpwgtnygNo4uG5EnxoR07eIhIuuaDEsjXHNNVvphI4JRbSvwkzxN2EsuKpAyS3GNk=bOC30Dhc63ajKaghFvDnQEBWC60KWTp9dgzES90IIqCOF6l17hDLBy1aKn2I3ixT9y26IFAbBGCK50PNMW6aKvJUK3gBl+rjeWzxTEUFo2A+p0weBxRsRM3AFWObzUgXg292azJW755vFTY8cauC6E5Jgp+lM8zcMvBpCEQn2X0=LEzhezM7nFhCJR/TtxgAPb40porYZr+2yHrgQef4Vd18+7awKy8BtyoTItKJbqhOSIDyF5aF04hSv42xj0KVpZ3NomYsnnv8oujenqvMQNo2AkCzszUJjHUTdPjiHhU8yEERLRII4ac8EW/sUhBEOmod3WUoB1WBHKRZw3BC0kCPWiH1m3zjyyU9IIYBqitqZ5BKaVsAR8jae+HiN7xRO82NkVHMpCFPPJM/yEE8v8XMXdpFVRc9aWfHTtEItqg9z4DSs8PHgdiiOy0dU/nLHz97LGQUSX0CTxUGskYzgSnhtq4X2osAEOSRofioSgO88Go1f3BZLapDq/LunZ2y5Q==
"; // 仅私钥 string publicKey = "uegx1Y4vPGdg4qQJOkUyocR4Ir5dKu7+UJRUmPpADwuac9LBTAfiEf7THa5nILLS2iuMR0jBmFZC6WbyMmSAD4fuCYmIUERf6QKAFSctNFk4tXm2dlUWwsB6YurSj0queOhm6egQ+jcjsn8iq3D2+pzQcArXojHwRAUF0Nsa4CVmpLk4YSuADMBPbaT/omON08E+Qv1xw9ho2QIC+HHzvBTHtFVvlpOiAdtnZ0HfSXJ618rs4j5/WVdZ4rbKdgnlnRsMFogOmu+o0rMni4hi+kGZUqSw/heYJOZY2UOIBO6KTDwcFBWhDTbAMvl1NxalsdW1J0RPY6qsVbov4FapuQ==AQAB"; // 公钥 //using (var rsa = RSA.Create()) //{ // // 获取私钥和公钥 // privateKey = rsa.ToXmlString(true); // 包含私钥 // publicKey = rsa.ToXmlString(false); // 仅公钥 //} // 签名 byte[] dataBytes = Encoding.UTF8.GetBytes(listEntity.ORG_ID.ToString() + DateTime.Now.ToString("yyyyMMdd")); //byte[] signature = SignData(dataBytes, privateKey);//签名 //string Signature2 = Convert.ToBase64String(signature);//获取签名字符串 byte[] check = Convert.FromBase64String(Signature); // 验证签名 bool isVerified = VerifyData(dataBytes, check, publicKey); //bool isVerified2 = VerifyData(dataBytes, signature, publicKey); if (!isVerified) { throw new Exception("签名验证失败"); } #endregion Guid USER_ID = Guid.Empty; var admin = GetEntity(e => e.CODE.Contains("admin")); if (admin != null) { USER_ID = admin.ID; } else { throw new Exception("获取管理员信息失败!"); } if (listEntity == null) { throw new Exception("传参有误!"); } #region 签名、权鉴、固有数据 、次数 验证 var Tenant = this.Request.Headers["Tenant"]; if (listEntity.ORG_ID == Guid.Empty) throw new Exception("公司ID不能为空"); Expression> expressione = e => !e.IS_DELETED; T_FM_SYNC_LIMIT modelSync = null; if (!string.IsNullOrEmpty(listEntity.PARAMETER)) { expressione = expressione.And(e => e.PARAMETER == listEntity.PARAMETER); } var listLimit = GetEntities(expressione, null, null); if (listLimit == null || !listLimit.Any()) { modelSync = new T_FM_SYNC_LIMIT(); modelSync.ORG_ID = listEntity.ORG_ID; modelSync.TIMES = 5; if (!string.IsNullOrEmpty(listEntity.PARAMETER)) { modelSync.PARAMETER = listEntity.PARAMETER; } } else { modelSync = listLimit.ToList()[0]; } if (modelSync.TIMES <= 0) { throw new Exception("同步次数超限"); } modelSync.DATE = DateTime.Now.Date; modelSync.TIMES--; #endregion #region 调用具体的数据同步 string MsgP = string.Empty; bool resultP = true; string MsgD = string.Empty; bool resultD = true; string MsgU = string.Empty; bool resultU = true; if (listEntity.listPost != null && listEntity.listPost.Any() && listEntity.listPost.Count > 0) { resultP = SyncPost(listEntity.listPost, listEntity.ORG_ID, (int)PFSysLogTypeEnum.SYNC_Post, USER_ID, ref MsgP); } if (listEntity.listDepartment != null && listEntity.listDepartment.Any() && listEntity.listDepartment.Count > 0) { resultD = SyncDepartment(listEntity.listDepartment, listEntity.ORG_ID, (int)PFSysLogTypeEnum.SYNC_Department, USER_ID, ref MsgD); } if (listEntity.listUser != null && listEntity.listUser.Any() && listEntity.listUser.Count > 0) { resultU = SyncUser(listEntity.listUser, listEntity.ORG_ID, (int)PFSysLogTypeEnum.SYNC_User, USER_ID, Tenant, ref MsgU); } #endregion #region 同步限制信息数据库更新 if (modelSync != null) { this.UnifiedCommit(() => { UpdateEntityNoCommit(modelSync); }); } #endregion #region 返参 if (resultP && resultD && resultU) { return true; } else { string Msg = string.Empty; if (!resultP) { Msg += MsgP; } if (resultD) { Msg += (string.IsNullOrEmpty(Msg) ? "" : ";") + MsgD; } if (resultU) { Msg += (string.IsNullOrEmpty(Msg) ? "" : ";") + MsgU; } throw new Exception(Msg); } #endregion }); } /// /// 手动隐患上报 单次 一张图片 必备输入信息 imgID = CONTENT_ID /// /// [HttpPost, Route("SyncUploadFile")] public JsonActionResult SyncUploadFile() { return SafeExecute(() => { var httpRequest = HttpContext.Request; Microsoft.AspNetCore.Http.IFormCollection formInfo = httpRequest.Form; string strOrgId = string.Empty; string strTYPE = string.Empty; string strCODE = string.Empty; foreach (var item in formInfo) { if (item.Key == "ORG_ID") { strOrgId = item.Value;//组织 } else if (item.Key == "TYPE") { strTYPE = item.Value;//类型 } else if (item.Key == "CODE") { strCODE = item.Value; // 编号 } } #region 签名验证 ( Key 获取已经注释 ) 生成Key ORG_ID.ToString() + DateTime.Now.ToString("yyyyMMdd") IHeaderDictionary Headers = Request.Headers; string Signature = string.Empty; if (string.IsNullOrEmpty(Signature)) { if (Headers.ContainsKey("signature")) { Signature = Headers["signature"]; } else if (Headers.ContainsKey("Signature")) { Signature = Headers["Signature"]; } else { throw new Exception("未获取到签名!"); } } string publicKey = "uegx1Y4vPGdg4qQJOkUyocR4Ir5dKu7+UJRUmPpADwuac9LBTAfiEf7THa5nILLS2iuMR0jBmFZC6WbyMmSAD4fuCYmIUERf6QKAFSctNFk4tXm2dlUWwsB6YurSj0queOhm6egQ+jcjsn8iq3D2+pzQcArXojHwRAUF0Nsa4CVmpLk4YSuADMBPbaT/omON08E+Qv1xw9ho2QIC+HHzvBTHtFVvlpOiAdtnZ0HfSXJ618rs4j5/WVdZ4rbKdgnlnRsMFogOmu+o0rMni4hi+kGZUqSw/heYJOZY2UOIBO6KTDwcFBWhDTbAMvl1NxalsdW1J0RPY6qsVbov4FapuQ==AQAB"; // 公钥 // 签名 byte[] dataBytes = Encoding.UTF8.GetBytes(strOrgId + DateTime.Now.ToString("yyyyMMdd")); byte[] check = Convert.FromBase64String(Signature); // 验证签名 bool isVerified = VerifyData(dataBytes, check, publicKey); if (!isVerified) { throw new Exception("签名验证失败"); } #endregion var files = formInfo.Files; if (files == null) { throw new Exception("附件缺失!"); } if (string.IsNullOrEmpty(strOrgId)) throw new Exception("组织不允许为空"); if (string.IsNullOrEmpty(strCODE)) throw new Exception("用户编号不允许为空"); var orgId = new Guid(strOrgId); var now = DateTime.Now; var user = GetEntity(e => e.CODE == strCODE); if (user == null) throw new Exception("未找到编号对应的用户"); var LoginID = user.ID; T_FM_PERSON person = null; bool isAdd = false; if (strTYPE != "Nav_UserPhotoFiles" && !user.PERSON_ID.HasValue) { isAdd = true; //添加用户信息 按理不会过来 person = new T_FM_PERSON(); person.ID = Guid.NewGuid(); user.PERSON_ID = person.ID; person.CODE = user.CODE; person.NAME = user.NAME; person.ORG_ID = user.ORG_ID; person.SEX = user.SEX; } #region 图片处理 var strImgID = string.Empty; if (formInfo.ContainsKey("imgFileID")) { strImgID = formInfo["imgFileID"][0]; } Guid ImgID = Guid.Empty; if (strImgID != null && !string.IsNullOrEmpty(strImgID)) { try { ImgID = new Guid(strImgID.ToString()); } catch { } } if (ImgID == Guid.Empty) ImgID = Guid.NewGuid(); string filePath = GetFilePath(orgId); var fullFilePath = $"{ ConfigurationManager.AppSettings["Img_Local"]}{filePath}"; ImageConverterFactory imageConverterFactory = new ImageConverterFactory(); var host = ConfigurationManager.AppSettings["SapInvokeHost"]; List fileList = new List(); List imgFileList = new List(); List listPhoto = null;//照片 new List();//照片 List listIDCard = null;//身份证 new List();//身份证 List listEducation = null;//学历证 new List();//学历证 List listCertificate = null; //学历证 new List();//证书 if (!Directory.Exists(fullFilePath)) { Directory.CreateDirectory(fullFilePath); } foreach (var item in files) { if (item != null) { //文件后缀 var fileExtension = Path.GetExtension(item.FileName); var strDateTime = DateTime.Now.ToString("yyMMddhhmmssfff"); //取得时间字符串 var strRan = Convert.ToString(new Random().Next(100, 999)); //生成三位随机数 var saveName = strDateTime + strRan + fileExtension; string fileName = item.FileName; //插入图片数据 using (FileStream fs = System.IO.File.Create(fullFilePath + saveName))//fullFilePath + fileName wyw { item.CopyTo(fs); fs.Flush(); } if (fileExtension == ".jpg" || fileExtension == ".png" || fileExtension == ".jpeg") { using (FileStream inputFileStream = new FileStream(fullFilePath + saveName, FileMode.Open, FileAccess.Read)) { MemoryStream compressedStream = CompressImageFileStream(inputFileStream); inputFileStream.Close(); using (FileStream outputFileStream = new FileStream(fullFilePath + saveName, FileMode.Create, FileAccess.Write)) { compressedStream.CopyTo(outputFileStream); } } } var pos = fileName.LastIndexOf("."); var extendName = fileName.Substring(pos); List list = new List(); bool isSuppot = imageConverterFactory.Support(extendName); bool isSaveSelf = true; T_PF_IMG_FILE imgFile = new T_PF_IMG_FILE { ID = ImgID, FILE_NAME = fileName, FILE_TYPE = item.ContentType, ORG_ID = orgId, CREATER_ID = LoginID, CREATE_TIME = now }; var inputStream = item.OpenReadStream(); //支持转换时,按类型转为图片,否则直接存储 if (isSuppot) { if (!string.IsNullOrEmpty(host)) { ConvertImageFileParam param = new ConvertImageFileParam(); param.FileName = fileName; Byte[] fileData = new Byte[(int)item.Length]; Stream sr = inputStream;//创建数据流对象 sr.Read(fileData, 0, (int)item.Length); param.FileData = fileData; string url = host + "ImageConvert/ImageConvert"; ConvertImageFileParam retModel = WebUtils.Execute(url, param, string.Empty, SendType.Post); if (retModel != null && retModel.Files != null && retModel.Files.Any()) list.AddRange(retModel.Files); } else { var convert = imageConverterFactory.CreateImageConverter(fileName); convert.ConvertToImage(fileName, inputStream, list); } if (isSaveSelf)//保存自身数据 { Byte[] fileData = new Byte[(int)item.Length]; Stream sr = inputStream;//创建数据流对象 sr.Read(fileData, 0, (int)item.Length); T_PF_FILE file = new T_PF_FILE { FILE_NAME = fileName, FILE_TYPE = item.ContentType, //FILE_DATA = fileData, ORG_ID = orgId, //FILE_PATH = filePath + fileName FILE_PATH = filePath + saveName,//wyw, CREATER_ID = LoginID, CREATE_TIME = now }; imgFile.FILE_ID = file.ID; imgFile.Nav_File = file; fileList.Add(file); } } else { ConvertImageFile tmpImgFile = new ConvertImageFile(); //tmpImgFile.FileName = fileName; tmpImgFile.FileName = saveName;//wyw tmpImgFile.FileType = item.ContentType; Byte[] fileData = new Byte[(int)item.Length]; Stream sr = inputStream;//创建数据流对象 sr.Read(fileData, 0, (int)item.Length); tmpImgFile.FileData = fileData; list.Add(tmpImgFile); } //保存文件数据 if (list.Any()) { int i = 1; foreach (var fileitem in list) { T_PF_FILE file = new T_PF_FILE { ID = Guid.NewGuid(), FILE_NAME = fileitem.FileName, FILE_TYPE = fileitem.FileType, //FILE_DATA = fileitem.FileData, //FILE_PATH = filePath + fileName, FILE_PATH = filePath + saveName,//wyw, ORG_ID = orgId, CREATER_ID = LoginID, CREATE_TIME = now }; if (!isSuppot && isSaveSelf) { imgFile.FILE_ID = file.ID; imgFile.Nav_File = file; } if (string.IsNullOrEmpty(imgFile.FILE_PATH) && !string.IsNullOrEmpty(file.FILE_PATH)) imgFile.FILE_PATH = file.FILE_PATH; switch (strTYPE) { case "Nav_UserPhotoFiles"://照片 头像文件 T_FM_USER_PHOTO_FILE listPhoto = new List();//照片 listPhoto.Add(new T_FM_USER_PHOTO_FILE() { ID = Guid.NewGuid(), ORG_ID = orgId, IMG_FILE_ID = imgFile.ID, USER_ID = user.ID, CREATER_ID = LoginID, CREATE_TIME = now }); break; case "Nav_IDCardFiles"://身份证 Nav_IDCardFiles T_FM_PERSON_IDCARD_FILE listIDCard = new List();//身份证 listIDCard.Add(new T_FM_PERSON_IDCARD_FILE() { ID = Guid.NewGuid(), ORG_ID = orgId, IMG_FILE_ID = imgFile.ID, //CODE= PERSON_ID = user.PERSON_ID.Value, NUM = i, CREATER_ID = LoginID, CREATE_TIME = now }); break; case "Nav_EducationFiles"://学历证 Nav_EducationFiles T_FM_PERSON_EDUCATION_FILE listEducation = new List();//学历证 listEducation.Add(new T_FM_PERSON_EDUCATION_FILE() { ID = Guid.NewGuid(), ORG_ID = orgId, IMG_FILE_ID = imgFile.ID, //CODE= PERSON_ID = user.PERSON_ID.Value, NUM = i, CREATER_ID = LoginID, CREATE_TIME = now }); break; case "Nav_CertificateFiles"://证书 Nav_CertificateFiles T_FM_PERSON_CERTIFICATE_FILE listCertificate = new List();//证书 listCertificate.Add(new T_FM_PERSON_CERTIFICATE_FILE() { ID = Guid.NewGuid(), ORG_ID = orgId, IMG_FILE_ID = imgFile.ID, //CODE= PERSON_ID = user.PERSON_ID.Value, NUM = i, CREATER_ID = LoginID, CREATE_TIME = now }); break; default: break; } i++; fileList.Add(file); //imgFileDetailList.Add(detail); } } imgFileList.Add(imgFile); //result.imgFileID = imgFile.ID; //result.imgFilePath = imgFile.Nav_File?.FILE_PATH; } } #endregion var log = GetLog((int)PFSysLogTypeEnum.SYNC_Files, orgId, user.ID, user.CODE + " 附件同步:" + strTYPE, strCODE);//操作日志 #region 数据操作 try { //为了不让隐患上报数据冲突 entity.ID 前端直接传入 this.UnifiedCommit(() => { if (fileList != null && fileList.Any()) BantchSaveEntityNoCommit(fileList); if (imgFileList != null && imgFileList.Any()) BantchSaveEntityNoCommit(imgFileList); if (isAdd) { if (person != null) UpdateEntityNoCommit(person); UpdateEntityNoCommit(user); } if (log != null && log.ID != Guid.Empty) UpdateEntityNoCommit(log); if (listIDCard != null && listIDCard.Any()) BantchSaveEntityNoCommit(listIDCard); if (listPhoto != null && listPhoto.Any()) BantchSaveEntityNoCommit(listPhoto); if (listEducation != null && listEducation.Any()) BantchSaveEntityNoCommit(listEducation); if (listCertificate != null && listCertificate.Any()) BantchSaveEntityNoCommit(listCertificate); }); } catch (Exception ex) { //提交错误 throw new Exception(ex.Message); } #endregion return true; }); } /// /// 根据OrgId获取文件夹名称 /// /// /// private string GetFilePath(Guid OrgId) { string orgid = OrgId.ToString().ToUpperInvariant(); string pathHead = ""; if (OrgId != new Guid()) { List listHead = EnumToList(); var info = listHead.FirstOrDefault(e => e.Desction == orgid); if (info != null) { pathHead = info.EnumName; } } DateTime dtNow = DateTime.Now; var filePath = string.Format("/{0}/{1}/{2}/", "SYNC", dtNow.ToString("yyyyMM"), dtNow.ToString("yyyyMMdd")); return string.IsNullOrEmpty(pathHead) ? filePath : "/" + pathHead + filePath; } /// /// 同步岗位 /// /// /// /// /// /// /// [HttpPost, Route("SyncPost")] public bool SyncPost(List listEntityPass, Guid ORG_ID, int LOG_TYPE, Guid USER_ID, ref string Msg) { //根据CODE 做相同做更新 var listCode = listEntityPass.Select(e => e.CODE).Distinct().ToList(); var listCodeSYNC = GetEntities(e => listCode.Contains(e.CODE), null, null); listEntityPass = listEntityPass.OrderByDescending(e => e.MODIFY_TIME).ToList(); int Count = listEntityPass.Count; T_FM_USER_POST modelChange = null; List listPostUpdate = new List(); List listLog = new List(); for (int i = 0; i < Count; i++) { if (i > 0 && listEntityPass[i].CODE == listEntityPass[i - 1].CODE) continue;//修改 按时间倒序排 如果编号与上一个相同 直接过 modelChange = listCodeSYNC.FirstOrDefault(e => e.CODE == listEntityPass[i].CODE); if (modelChange == null) { listLog.Add(GetLog(LOG_TYPE, ORG_ID, USER_ID, "新增岗位" + listEntityPass[i].NAME, listEntityPass[i].CODE)); modelChange = new T_FM_USER_POST(); modelChange.ID = Guid.NewGuid(); modelChange.ORG_ID = ORG_ID; modelChange.CODE = listEntityPass[i].CODE; } else { if (modelChange.MODIFY_TIME == listEntityPass[i].MODIFY_TIME)//时间为被同步的时间 不处理 continue; listLog.Add(GetLog(LOG_TYPE, ORG_ID, USER_ID, modelChange.NAME + " => " + listEntityPass[i].NAME, listEntityPass[i].CODE)); } modelChange.NAME = listEntityPass[i].NAME; modelChange.STATUS = listEntityPass[i].STATUS; modelChange.MODIFY_TIME = listEntityPass[i].MODIFY_TIME; listPostUpdate.Add(modelChange); } if (listPostUpdate != null && listPostUpdate.Count() > 0) { try { this.UnifiedCommit(() => { BantchSaveEntityNoCommit(listPostUpdate); if (listLog != null && listLog.Any())//日志 BantchSaveEntityNoCommit(listLog); }); } catch (Exception ex) { Msg = ex.Message; return false; } } return true; } /// /// 同步组织 /// /// /// /// /// /// /// private bool SyncDepartment(List listEntityPass, Guid ORG_ID, int LOG_TYPE, Guid USER_ID, ref string Msg) { //根据CODE 做相同做更新 var listCode = listEntityPass.Select(e => e.CODE).ToList(); listCode.AddRange(listEntityPass.Where(e => e.PARENT_CODE != null && e.PARENT_CODE.Length > 0).Select(e => e.PARENT_CODE)); listCode = listCode.Distinct().ToList(); var listCodeSYNC = GetEntities(e => listCode.Contains(e.CODE), null, null); listEntityPass = listEntityPass.OrderByDescending(e => e.MODIFY_TIME).ToList(); int Count = listEntityPass.Count; T_FM_DEPARTMENT modelChange = null; T_FM_DEPARTMENT modelChangeP = null; List listPostUpdate = new List(); List listLog = new List(); for (int i = 0; i < Count; i++) { if (i > 0 && listEntityPass[i].CODE == listEntityPass[i - 1].CODE) continue;//修改 按时间倒序排 如果编号与上一个相同 直接过 modelChange = listCodeSYNC.FirstOrDefault(e => e.CODE == listEntityPass[i].CODE); if (modelChange == null) { listLog.Add(GetLog(LOG_TYPE, ORG_ID, USER_ID, "新增岗位" + listEntityPass[i].NAME, listEntityPass[i].CODE)); modelChange = new T_FM_DEPARTMENT(); modelChange.ID = Guid.NewGuid(); modelChange.ORG_ID = ORG_ID; modelChange.CODE = listEntityPass[i].CODE; } else { if (modelChange.MODIFY_TIME == listEntityPass[i].MODIFY_TIME)//时间为被同步的时间 不处理 continue; listLog.Add(GetLog(LOG_TYPE, ORG_ID, USER_ID, modelChange.NAME + " => " + listEntityPass[i].NAME, listEntityPass[i].CODE)); } modelChange.NAME = listEntityPass[i].NAME; modelChange.ENABLE_STATUS = listEntityPass[i].ENABLE_STATUS; if (!string.IsNullOrEmpty(listEntityPass[i].PARENT_CODE)) { modelChangeP = listCodeSYNC.FirstOrDefault(e => e.CODE == listEntityPass[i].PARENT_CODE); if (modelChangeP != null && modelChange.PARENT_ID != modelChangeP.ID) { modelChange.PARENT_ID = modelChangeP.ID; } } //else //{ // 不要了,万一入参有问题 导致数据丢失了 // modelChange.PARENT_ID = null; //} if (listEntityPass[i].NUM != 0) modelChange.NUM = listEntityPass[i].NUM; //modelChange.PARENT_CODE = listEntityPass[i].PARENT_CODE;//暂时不用 //modelChange.DEPARTMENT_TYPE = listEntityPass[i].DEPARTMENT_TYPE; modelChange.MODIFY_TIME = listEntityPass[i].MODIFY_TIME; listPostUpdate.Add(modelChange); } if (listPostUpdate != null && listPostUpdate.Count() > 0) { try { this.UnifiedCommit(() => { BantchSaveEntityNoCommit(listPostUpdate); if (listLog != null && listLog.Any())//日志 BantchSaveEntityNoCommit(listLog); }); } catch (Exception ex) { Msg = ex.Message; return false; } } return true; } /// /// 同步用户 /// /// /// /// /// /// /// /// private bool SyncUser(List listEntityPass, Guid ORG_ID, int LOG_TYPE, Guid USER_ID, string Tenant, ref string Msg) { //工号唯一 //特殊处理 T_FM_SYNC_USER_RULE 用户 组织 按此配置 否则 取同步数据 listEntityPass = listEntityPass.OrderByDescending(e => e.MODIFY_TIME).ToList(); var listCODE = listEntityPass.Select(e => e.CODE); var listUserRules = GetEntities(e => !e.IS_DELETED && e.DEPARTMENT_ID != Guid.Empty, null, null); var listPOSTCODE = listEntityPass.Select(e => e.POST_CODE); var listUserPOST = GetEntities(e => listPOSTCODE.Contains(e.CODE), null, null); T_FM_USER_POST modelPost = null; var listDEPARTMENTCODE = listEntityPass.Select(e => e.DEPARTMENT_CODE); var listDep = GetEntities(e => listDEPARTMENTCODE.Contains(e.CODE), null, null); T_FM_USER_POST modelDep = null; T_FM_SYNC_USER_RULE modelUserRule = null; var listUser = GetEntities(e => listCODE.Contains(e.CODE), null, null); //if (listUserRules != null && listUserRules.Any()) //{ var listPersonID = listUser.Where(e => e.PERSON_ID.HasValue).Select(e => e.PERSON_ID); IEnumerable listPerson = GetEntities(e => listPersonID.Contains(e.ID), null, null); //} //T_OP_ALLUSER mh_ops ops PHONE int Count = listEntityPass.Count; T_FM_USER modelChange = null; T_FM_PERSON modelPersonChange = null; List listUserUpdate = new List(); List listPersonUpdate = new List(); List listUserALLUpdate = new List();//手机号码改了 要修改 新增人员要修改 T_OP_ALLUSER modelAllUser = null; List listLog = new List(); List Nav_Works = new List();// 工作经历 List Nav_Skills = new List();// 技能等级 for (int i = 0; i < Count; i++) { if (i > 0 && listEntityPass[i].CODE == listEntityPass[i - 1].CODE) continue; modelChange = listUser.FirstOrDefault(e => e.CODE == listEntityPass[i].CODE); modelAllUser = null; if (modelChange == null) { //新增用户 listLog.Add(GetLog(LOG_TYPE, ORG_ID, USER_ID, "新增用户" + modelChange.NAME, listEntityPass[i].CODE)); #region 基础数据完善 modelChange = new T_FM_USER(); modelChange.ID = Guid.NewGuid(); modelChange.ORG_ID = ORG_ID; modelAllUser = new T_OP_ALLUSER(); modelAllUser.ID = Guid.NewGuid(); modelAllUser.ORG_ID = ORG_ID; modelAllUser.CODE = listEntityPass[i].CODE; modelAllUser.PHONE = listEntityPass[i].PHONE; modelPersonChange = new T_FM_PERSON(); modelPersonChange.ID = Guid.NewGuid(); modelPersonChange.ORG_ID = ORG_ID; #endregion } else { if (modelChange.MODIFY_TIME == listEntityPass[i].MODIFY_TIME)//时间为被同步的时间 不处理 continue; //修改用户 listLog.Add(GetLog(LOG_TYPE, ORG_ID, USER_ID, modelChange.NAME + " => " + listEntityPass[i].NAME, listEntityPass[i].CODE)); modelPersonChange = listPerson.FirstOrDefault(e => e.ID == modelChange.PERSON_ID.Value); } #region 人员组织 可能有 特殊配置取值 modelUserRule = listUserRules.FirstOrDefault(e => e.USER_ID == modelChange.ID); if (modelUserRule != null) { modelChange.DEPARTMENT_ID = modelUserRule.DEPARTMENT_ID; } else { modelDep = listDep.FirstOrDefault(e => e.CODE == listEntityPass[i].DEPARTMENT_CODE); if (modelDep != null && modelDep.ID != modelChange.DEPARTMENT_ID) modelChange.DEPARTMENT_ID = modelDep.ID; } #endregion #region model 属性同步 if (modelChange.PHONE != listEntityPass[i].PHONE) { //modelAllUser= //获取全局用户信息 modelAllUser = new T_OP_ALLUSER(); modelAllUser.PHONE = listEntityPass[i].PHONE; modelAllUser.CODE = listEntityPass[i].CODE; } modelChange.CODE = listEntityPass[i].CODE; //POST_CODE modelChange.NAME = listEntityPass[i].NAME; modelChange.PHONE = listEntityPass[i].PHONE; modelChange.SEX = listEntityPass[i].SEX; modelChange.ID_CARD = listEntityPass[i].ID_CARD; modelChange.ENTRYTIME = listEntityPass[i].ENTRYTIME; modelChange.ENABLE_STATUS = listEntityPass[i].ENABLE_STATUS; if (modelPersonChange != null) { modelPersonChange.CODE = listEntityPass[i].CODE; modelPersonChange.NAME = listEntityPass[i].NAME; modelPersonChange.SEX = listEntityPass[i].SEX; modelPersonChange.NATIONALITY = listEntityPass[i].NATIONALITY; modelPersonChange.BIRTHDAY = listEntityPass[i].BIRTHDAY; modelPersonChange.POLITICALSTATUE = listEntityPass[i].POLITICALSTATUE; modelPersonChange.JOBTITLE = listEntityPass[i].JOBTITLE; modelPersonChange.CULTURALLEVEL = listEntityPass[i].CULTURALLEVEL; modelPersonChange.WORKDATE = listEntityPass[i].WORKDATE; modelPost = listUserPOST.FirstOrDefault(e => e.CODE == listEntityPass[i].POST_CODE); if (modelPost != null && modelPost.ID != modelPersonChange.POST_ID) { modelPersonChange.POST_ID = modelPost.ID; } } #endregion #region 人员信息子表 工作经历 技能等级 //工作经历 if (listEntityPass[i].Nav_Works != null && listEntityPass[i].Nav_Works.Count() > 0) { foreach (var item in listEntityPass[i].Nav_Works) { Nav_Works.Add(new T_FM_PERSON_WORK() { ID = Guid.NewGuid(), ORG_ID = ORG_ID, MODIFY_TIME = listEntityPass[i].MODIFY_TIME, PERSON_ID = modelPersonChange.ID, STARTDATE = item.STARTDATE, ENDDATE = item.ENDDATE, WORKPLACE = item.WORKPLACE, POSTNAME = item.POSTNAME, NUM = item.NUM, }); } } //技能等级 if (listEntityPass[i].Nav_Skills != null && listEntityPass[i].Nav_Skills.Count() > 0) { foreach (var item in listEntityPass[i].Nav_Skills) { Nav_Skills.Add(new T_FM_PERSON_SKILLS() { ID = Guid.NewGuid(), ORG_ID = ORG_ID, MODIFY_TIME = listEntityPass[i].MODIFY_TIME, PERSON_ID = modelPersonChange.ID, NAME = item.NAME, LEVEL = item.LEVEL, NUM = item.NUM, }); } } #endregion modelChange.MODIFY_TIME = listEntityPass[i].MODIFY_TIME; listUserUpdate.Add(modelChange); //人员信息 modelPersonChange.MODIFY_TIME = listEntityPass[i].MODIFY_TIME; listPersonUpdate.Add(modelPersonChange); //全局登录信息 if (modelAllUser != null) { listUserALLUpdate.Add(modelAllUser); } } #region 数据信息更新 if (listUserUpdate != null && listUserUpdate.Count() > 0) { try { this.UnifiedCommit(() => { BantchSaveEntityNoCommit(listUserUpdate);//用户信息更新 if (listPersonUpdate != null && listPersonUpdate.Any())//人员信息更新 BantchSaveEntityNoCommit(listPersonUpdate); if (Nav_Works != null && Nav_Works.Any())//工作经历 BantchSaveEntityNoCommit(Nav_Works); if (Nav_Skills != null && Nav_Skills.Any())//工作技能 BantchSaveEntityNoCommit(Nav_Skills); if (listLog != null && listLog.Any())//日志 BantchSaveEntityNoCommit(listLog); }); } catch (Exception ex) { Msg = ex.Message; return false; } #region 登录信息 更新 mh_ops if (listUserALLUpdate != null && listUserALLUpdate.Count() > 0) { try { List listAllUserResult = new List(); using (var context = new MigrationContext(ConfigurationManager.ConnectionStrings["default"])) { var ListCode = listUserALLUpdate.Where(e => e.ID == Guid.Empty).Select(e => e.CODE); IEnumerable listAllUser = null; if (ListCode != null && ListCode.Any()) { listAllUser = context.GetEntities(e => ListCode.Contains(e.CODE), null, null); foreach (var item in listUserALLUpdate) { if (item.ID == Guid.Empty) { modelAllUser = listAllUser.FirstOrDefault(e => e.CODE == item.CODE);//编号为唯一标识符 if (modelAllUser != null) { modelAllUser.TENANT = Tenant; modelAllUser.ORG_ID = ORG_ID; modelAllUser.PHONE = item.PHONE;//只更新手机号码 modelAllUser.MODIFY_TIME = item.MODIFY_TIME; } listAllUserResult.Add(item); } else { listAllUserResult.Add(item); } } } context.UpdateRange(listAllUserResult); context.SaveChanges(); } } catch (Exception ex) { Msg = ex.Message; return false; } } #endregion } #endregion return true; } /// /// 日志 /// /// /// /// /// /// private T_PF_SYS_LOG GetLog(int LOG_TYPE, Guid ORG_ID, Guid USER_ID, string LOG_DATA, string EXT_DATA) { T_PF_SYS_LOG modelLog = new T_PF_SYS_LOG(); modelLog.ID = Guid.NewGuid(); modelLog.ORG_ID = ORG_ID; modelLog.LOG_TYPE = LOG_TYPE; modelLog.USER_ID = USER_ID; modelLog.LOG_DATA = LOG_DATA; modelLog.EXT_DATA = EXT_DATA; modelLog.LOG_TIME = DateTime.Now; modelLog.LOG_TITLE = "数据同步日志"; return modelLog; } } /// /// 数据同步实体 /// public class ListDate { /// /// 公司ID /// public Guid ORG_ID { get; set; } /// /// 同步参数备用字段 /// public string PARAMETER { get; set; } /// /// 岗位信息 /// public List listPost { get; set; } /// /// 部门信息 /// public List listDepartment { get; set; } /// /// 用户信息 /// public List listUser { get; set; } } }