mh_jy_safe/APT.MicroApi/APT.FM.WebApi/Controllers/Api/DataSyncController.cs

1107 lines
52 KiB
C#
Raw Normal View History

2025-08-25 09:56:57 +08:00
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
{
/// <summary>
/// 数据同步
/// </summary>
[Route("api/FM/DataSync")]
public class DataSyncController : APTApiController<T_FM_USER>
{
//1、组织有唯一编号
//2、岗位也有唯一编号
//3、员工工号唯一
//4、根据 MODIFY_TIME 判断是否做信息同步
/// <summary>
/// 信息同步 岗位 部门 人员
/// </summary>
/// <param name="listEntity"></param>
/// <returns></returns>
[HttpPost, Route("Sync")]
public JsonActionResult<bool> 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 = "<RSAKeyValue><Modulus>uegx1Y4vPGdg4qQJOkUyocR4Ir5dKu7+UJRUmPpADwuac9LBTAfiEf7THa5nILLS2iuMR0jBmFZC6WbyMmSAD4fuCYmIUERf6QKAFSctNFk4tXm2dlUWwsB6YurSj0queOhm6egQ+jcjsn8iq3D2+pzQcArXojHwRAUF0Nsa4CVmpLk4YSuADMBPbaT/omON08E+Qv1xw9ho2QIC+HHzvBTHtFVvlpOiAdtnZ0HfSXJ618rs4j5/WVdZ4rbKdgnlnRsMFogOmu+o0rMni4hi+kGZUqSw/heYJOZY2UOIBO6KTDwcFBWhDTbAMvl1NxalsdW1J0RPY6qsVbov4FapuQ==</Modulus><Exponent>AQAB</Exponent><P>30hSFbm0DV4/qtczGiKFdhg2xHTqWmd7lvGOlwb1LYfihiS6sVISiPPL6/etneOxb/zJF6aoldNoTWkSrEhpFvl8hb7jyhktzHBejXOUm2Ro6u7N+6MWUUm3BkOVDmJ3pgDY0lSua5ZBwac7N+N2nDHLg0R7dX/1QyOwdbWQXvs=</P><Q>1SXcOwGErAm99l+LapYgib30oiLVN0fBUTpoICrigYSOKYPxhnPhDYyic1RqpsjFg+cT8YlXe1Kr8WbM9YOGaGM4MzkpCqGnkPMNoYjDQazZ+CQ3Nzkd93/GfzMqOZVksr9ZzfVR9E6Brn4ywJ5j8X/KoGi+6D++omKQ477f69s=</Q><DP>snsZ+nnWPnVfSU36cGK18l+Kr+GRT7C2r0LqKzmJlNqxLW+AuKuVW1oeYMI8SyCuPol/qWM0EYfLMU3Telnrf0zwx+x+I5ea73fHbSS93rUV1O4NQ5/rABF/twcgyD3XzJ+Ssha00hVq/MST5qnxrwty1bxRP+yH/iIyNPVssS8=</DP><DQ>yFSZNOwsYfWWESWjxz3qvwtGDc1nUFmknE+k5fbohIqtgt979b6b2zw+wt6ojrFM0rgwymcnTcVZzb2tDWPcw+fdPmeO52sgLuACA7yip+tpwgtnygNo4uG5EnxoR07eIhIuuaDEsjXHNNVvphI4JRbSvwkzxN2EsuKpAyS3GNk=</DQ><InverseQ>bOC30Dhc63ajKaghFvDnQEBWC60KWTp9dgzES90IIqCOF6l17hDLBy1aKn2I3ixT9y26IFAbBGCK50PNMW6aKvJUK3gBl+rjeWzxTEUFo2A+p0weBxRsRM3AFWObzUgXg292azJW755vFTY8cauC6E5Jgp+lM8zcMvBpCEQn2X0=</InverseQ><D>LEzhezM7nFhCJR/TtxgAPb40porYZr+2yHrgQef4Vd18+7awKy8BtyoTItKJbqhOSIDyF5aF04hSv42xj0KVpZ3NomYsnnv8oujenqvMQNo2AkCzszUJjHUTdPjiHhU8yEERLRII4ac8EW/sUhBEOmod3WUoB1WBHKRZw3BC0kCPWiH1m3zjyyU9IIYBqitqZ5BKaVsAR8jae+HiN7xRO82NkVHMpCFPPJM/yEE8v8XMXdpFVRc9aWfHTtEItqg9z4DSs8PHgdiiOy0dU/nLHz97LGQUSX0CTxUGskYzgSnhtq4X2osAEOSRofioSgO88Go1f3BZLapDq/LunZ2y5Q==</D></RSAKeyValue>"; // 私钥
////////string privateKey2 = "<RSAKeyValue><P>30hSFbm0DV4/qtczGiKFdhg2xHTqWmd7lvGOlwb1LYfihiS6sVISiPPL6/etneOxb/zJF6aoldNoTWkSrEhpFvl8hb7jyhktzHBejXOUm2Ro6u7N+6MWUUm3BkOVDmJ3pgDY0lSua5ZBwac7N+N2nDHLg0R7dX/1QyOwdbWQXvs=</P><Q>1SXcOwGErAm99l+LapYgib30oiLVN0fBUTpoICrigYSOKYPxhnPhDYyic1RqpsjFg+cT8YlXe1Kr8WbM9YOGaGM4MzkpCqGnkPMNoYjDQazZ+CQ3Nzkd93/GfzMqOZVksr9ZzfVR9E6Brn4ywJ5j8X/KoGi+6D++omKQ477f69s=</Q><DP>snsZ+nnWPnVfSU36cGK18l+Kr+GRT7C2r0LqKzmJlNqxLW+AuKuVW1oeYMI8SyCuPol/qWM0EYfLMU3Telnrf0zwx+x+I5ea73fHbSS93rUV1O4NQ5/rABF/twcgyD3XzJ+Ssha00hVq/MST5qnxrwty1bxRP+yH/iIyNPVssS8=</DP><DQ>yFSZNOwsYfWWESWjxz3qvwtGDc1nUFmknE+k5fbohIqtgt979b6b2zw+wt6ojrFM0rgwymcnTcVZzb2tDWPcw+fdPmeO52sgLuACA7yip+tpwgtnygNo4uG5EnxoR07eIhIuuaDEsjXHNNVvphI4JRbSvwkzxN2EsuKpAyS3GNk=</DQ><InverseQ>bOC30Dhc63ajKaghFvDnQEBWC60KWTp9dgzES90IIqCOF6l17hDLBy1aKn2I3ixT9y26IFAbBGCK50PNMW6aKvJUK3gBl+rjeWzxTEUFo2A+p0weBxRsRM3AFWObzUgXg292azJW755vFTY8cauC6E5Jgp+lM8zcMvBpCEQn2X0=</InverseQ><D>LEzhezM7nFhCJR/TtxgAPb40porYZr+2yHrgQef4Vd18+7awKy8BtyoTItKJbqhOSIDyF5aF04hSv42xj0KVpZ3NomYsnnv8oujenqvMQNo2AkCzszUJjHUTdPjiHhU8yEERLRII4ac8EW/sUhBEOmod3WUoB1WBHKRZw3BC0kCPWiH1m3zjyyU9IIYBqitqZ5BKaVsAR8jae+HiN7xRO82NkVHMpCFPPJM/yEE8v8XMXdpFVRc9aWfHTtEItqg9z4DSs8PHgdiiOy0dU/nLHz97LGQUSX0CTxUGskYzgSnhtq4X2osAEOSRofioSgO88Go1f3BZLapDq/LunZ2y5Q==</D></RSAKeyValue>"; // 仅私钥
string publicKey = "<RSAKeyValue><Modulus>uegx1Y4vPGdg4qQJOkUyocR4Ir5dKu7+UJRUmPpADwuac9LBTAfiEf7THa5nILLS2iuMR0jBmFZC6WbyMmSAD4fuCYmIUERf6QKAFSctNFk4tXm2dlUWwsB6YurSj0queOhm6egQ+jcjsn8iq3D2+pzQcArXojHwRAUF0Nsa4CVmpLk4YSuADMBPbaT/omON08E+Qv1xw9ho2QIC+HHzvBTHtFVvlpOiAdtnZ0HfSXJ618rs4j5/WVdZ4rbKdgnlnRsMFogOmu+o0rMni4hi+kGZUqSw/heYJOZY2UOIBO6KTDwcFBWhDTbAMvl1NxalsdW1J0RPY6qsVbov4FapuQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; // 公钥
//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<T_FM_USER>(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<Func<T_FM_SYNC_LIMIT, bool>> 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
});
}
/// <summary>
/// 手动隐患上报 单次 一张图片 必备输入信息 imgID = CONTENT_ID
/// </summary>
/// <returns></returns>
[HttpPost, Route("SyncUploadFile")]
public JsonActionResult<bool> SyncUploadFile()
{
return SafeExecute<bool>(() =>
{
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 = "<RSAKeyValue><Modulus>uegx1Y4vPGdg4qQJOkUyocR4Ir5dKu7+UJRUmPpADwuac9LBTAfiEf7THa5nILLS2iuMR0jBmFZC6WbyMmSAD4fuCYmIUERf6QKAFSctNFk4tXm2dlUWwsB6YurSj0queOhm6egQ+jcjsn8iq3D2+pzQcArXojHwRAUF0Nsa4CVmpLk4YSuADMBPbaT/omON08E+Qv1xw9ho2QIC+HHzvBTHtFVvlpOiAdtnZ0HfSXJ618rs4j5/WVdZ4rbKdgnlnRsMFogOmu+o0rMni4hi+kGZUqSw/heYJOZY2UOIBO6KTDwcFBWhDTbAMvl1NxalsdW1J0RPY6qsVbov4FapuQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; // 公钥
// 签名
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<T_FM_USER>(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<T_PF_FILE> fileList = new List<T_PF_FILE>();
List<T_PF_IMG_FILE> imgFileList = new List<T_PF_IMG_FILE>();
List<T_FM_USER_PHOTO_FILE> listPhoto = null;//照片 new List<T_FM_USER_PHOTO_FILE>();//照片
List<T_FM_PERSON_IDCARD_FILE> listIDCard = null;//身份证 new List<T_FM_PERSON_IDCARD_FILE>();//身份证
List<T_FM_PERSON_EDUCATION_FILE> listEducation = null;//学历证 new List<T_FM_PERSON_EDUCATION_FILE>();//学历证
List<T_FM_PERSON_CERTIFICATE_FILE> listCertificate = null; //学历证 new List<T_FM_PERSON_CERTIFICATE_FILE>();//证书
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<ConvertImageFile> list = new List<ConvertImageFile>();
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<ConvertImageFileParam>(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<T_FM_USER_PHOTO_FILE>();//照片
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<T_FM_PERSON_IDCARD_FILE>();//身份证
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<T_FM_PERSON_EDUCATION_FILE>();//学历证
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<T_FM_PERSON_CERTIFICATE_FILE>();//证书
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;
});
}
/// <summary>
/// 根据OrgId获取文件夹名称
/// </summary>
/// <param name="OrgId"></param>
/// <returns></returns>
private string GetFilePath(Guid OrgId)
{
string orgid = OrgId.ToString().ToUpperInvariant();
string pathHead = "";
if (OrgId != new Guid())
{
List<EnumberEntity> listHead = EnumToList<FilePathHead>();
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;
}
/// <summary>
/// 同步岗位
/// </summary>
/// <param name="listEntityPass"></param>
/// <param name="ORG_ID"></param>
/// <param name="LOG_TYPE"></param>
/// <param name="USER_ID"></param>
/// <param name="Msg"></param>
/// <returns></returns>
[HttpPost, Route("SyncPost")]
public bool SyncPost(List<T_FM_USER_POST> 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<T_FM_USER_POST>(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<T_FM_USER_POST> listPostUpdate = new List<T_FM_USER_POST>();
List<T_PF_SYS_LOG> listLog = new List<T_PF_SYS_LOG>();
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;
}
/// <summary>
/// 同步组织
/// </summary>
/// <param name="listEntityPass"></param>
/// <param name="ORG_ID"></param>
/// <param name="LOG_TYPE"></param>
/// <param name="USER_ID"></param>
/// <param name="Msg"></param>
/// <returns></returns>
private bool SyncDepartment(List<T_FM_DEPARTMENT> 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<T_FM_DEPARTMENT>(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<T_FM_DEPARTMENT> listPostUpdate = new List<T_FM_DEPARTMENT>();
List<T_PF_SYS_LOG> listLog = new List<T_PF_SYS_LOG>();
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;
}
/// <summary>
/// 同步用户
/// </summary>
/// <param name="listEntityPass"></param>
/// <param name="ORG_ID"></param>
/// <param name="LOG_TYPE"></param>
/// <param name="USER_ID"></param>
/// <param name="Tenant"></param>
/// <param name="Msg"></param>
/// <returns></returns>
private bool SyncUser(List<T_FM_USER> 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<T_FM_SYNC_USER_RULE>(e => !e.IS_DELETED && e.DEPARTMENT_ID != Guid.Empty, null, null);
var listPOSTCODE = listEntityPass.Select(e => e.POST_CODE);
var listUserPOST = GetEntities<T_FM_USER_POST>(e => listPOSTCODE.Contains(e.CODE), null, null);
T_FM_USER_POST modelPost = null;
var listDEPARTMENTCODE = listEntityPass.Select(e => e.DEPARTMENT_CODE);
var listDep = GetEntities<T_FM_USER_POST>(e => listDEPARTMENTCODE.Contains(e.CODE), null, null);
T_FM_USER_POST modelDep = null;
T_FM_SYNC_USER_RULE modelUserRule = null;
var listUser = GetEntities<T_FM_USER>(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<T_FM_PERSON> listPerson = GetEntities<T_FM_PERSON>(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<T_FM_USER> listUserUpdate = new List<T_FM_USER>();
List<T_FM_PERSON> listPersonUpdate = new List<T_FM_PERSON>();
List<T_OP_ALLUSER> listUserALLUpdate = new List<T_OP_ALLUSER>();//手机号码改了 要修改 新增人员要修改
T_OP_ALLUSER modelAllUser = null;
List<T_PF_SYS_LOG> listLog = new List<T_PF_SYS_LOG>();
List<T_FM_PERSON_WORK> Nav_Works = new List<T_FM_PERSON_WORK>();// 工作经历
List<T_FM_PERSON_SKILLS> Nav_Skills = new List<T_FM_PERSON_SKILLS>();// 技能等级
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<T_OP_ALLUSER> listAllUserResult = new List<T_OP_ALLUSER>();
using (var context = new MigrationContext(ConfigurationManager.ConnectionStrings["default"]))
{
var ListCode = listUserALLUpdate.Where(e => e.ID == Guid.Empty).Select(e => e.CODE);
IEnumerable<T_OP_ALLUSER> listAllUser = null;
if (ListCode != null && ListCode.Any())
{
listAllUser = context.GetEntities<T_OP_ALLUSER>(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;
}
/// <summary>
/// 日志
/// </summary>
/// <param name="LOG_TYPE"></param>
/// <param name="ORG_ID"></param>
/// <param name="USER_ID"></param>
/// <param name="LOG_DATA"></param>
/// <returns></returns>
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;
}
}
/// <summary>
/// 数据同步实体
/// </summary>
public class ListDate
{
/// <summary>
/// 公司ID
/// </summary>
public Guid ORG_ID { get; set; }
/// <summary>
/// 同步参数备用字段
/// </summary>
public string PARAMETER { get; set; }
/// <summary>
/// 岗位信息
/// </summary>
public List<T_FM_USER_POST> listPost { get; set; }
/// <summary>
/// 部门信息
/// </summary>
public List<T_FM_DEPARTMENT> listDepartment { get; set; }
/// <summary>
/// 用户信息
/// </summary>
public List<T_FM_USER> listUser { get; set; }
}
}