mh_jy_safe/APT.MicroApi/APT.FM.WebApi/Controllers/Api/DataSyncController.cs
2025-08-25 09:56:57 +08:00

1107 lines
52 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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; }
}
}