irc-netcore-api/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs

332 lines
11 KiB
C#

using IRaCIS.Core.Domain.Common;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common.Dto;
using IRaCIS.Core.Infra.EFCore.Dto;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Infra.EFCore.Common
{
/// <summary>
/// 添加稽查稽查数据
/// </summary>
public class AuditingData : IAuditingData
{
/// <summary>
/// 数据库对象
/// </summary>
public IRaCISDBContext _dbContext { get; set; }
/// <summary>
/// 用户信息
/// </summary>
public IUserInfo _userInfo { get; set; }
/// <summary>
/// 构造方法
/// </summary>
/// <param name="dbContext"></param>
/// <param name="userInfo"></param>
public AuditingData(IRaCISDBContext dbContext, IUserInfo userInfo)
{
_dbContext = dbContext;
_userInfo = userInfo;
}
/// <summary>
/// 传入实体对象
/// </summary>
public async Task IncomingEntitys(List<EntityEntry> entitys)
{
// 新增
await InsertAddEntitys(entitys.Where(x => x.State == EntityState.Added).ToList(), "Add");
// 修改
await InsertAddEntitys(entitys.Where(x => x.State == EntityState.Modified).ToList(), "Update");
// 删除
await InsertAddEntitys(entitys.Where(x => x.State == EntityState.Deleted).ToList(), "Deleted");
}
/// <summary>
/// 插入Add的实体
/// </summary>
/// <param name="entitys"></param>
public async Task InsertAddEntitys(List<EntityEntry> entitys,string type)
{
// 项目人员
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialUser)))
{
await InsertInspection<TrialUser>(item, type, x => new DataInspection()
{
GeneralId = x.Id
});
}
// 受试者
foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Subject)))
{
await InsertInspection<Subject>(item, type, x => new DataInspection() {
SubjectId=x.Id
});
}
}
/// <summary>
/// 插入稽查实体
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="data">数据</param>
/// <param name="type">类型</param>
/// <param name="expression">表达式</param>
/// <returns></returns>
public async Task InsertInspection<T>(EntityEntry data, string type, Expression<Func<T, DataInspection>> expression = null) where T:class
{
DataInspection inspection = new DataInspection();
inspection.Identification = $"{GetRequestUrl()}/{ data.GetType().ToString().Substring(data.GetType().ToString().LastIndexOf('.') + 1)}/{type}";
if (expression != null)
{
var f = expression.Compile();
var entity = data.Entity as T;
inspection = f(entity);
}
var originaldata = data.OriginalValues as T;
if (originaldata != null)
{
inspection.LastJsonDetail = originaldata.ToJcJson();
}
await AddInspectionRecordAsync(inspection, data.Entity);
}
/// <summary>
/// 获取URl参数
/// </summary>
/// <returns></returns>
public string GetRequestUrl()
{
return _userInfo.RequestUrl;
}
/// <summary>
/// 映射数据
/// </summary>
/// <param name="data"></param>
/// <param name="mapData">要赋值的对象</param>
public void MapData(dynamic data, dynamic mapData)
{
List<string> column = new List<string>() { "TrialId", "SiteId", "SubjectId", "SubjectVisitId", "CreateUserName", "TrialName", "SiteName", "SubjectCode", "SubjectVisitName", "RoleName", "SiteCode", "ResearchProgramNo" };
foreach (var item in column)
{
try
{
var i = mapData.GetType().GetProperty(item).GetValue(mapData);
if (i == null)
{
var value = data.GetType().GetProperty(item).GetValue(data);
mapData.GetType().GetProperty(item).SetValue(mapData, value);
}
}
catch (Exception)
{
continue;
}
}
}
public async Task AddInspectionRecordAsync(DataInspection add, dynamic data)
{
MapData(data, add);
InspectionGeneralData generalData = new InspectionGeneralData();
MapData(add, generalData);
await SetInspectionNameValue(generalData);
#region 处理标识
try
{
var from = await _dbContext.FrontAuditConfig.FirstOrDefaultAsync(x => x.Identification == add.Identification);
add.ObjectType = from?.ObjectTypeId;
add.OptType = from?.OptTypeId;
add.ChildrenType = from?.ChildrenTypeId;
add.ModuleType = from?.ModuleTypeId;
}
catch (Exception)
{
throw new BusinessValidationFailedException("操作标识异常");
}
#endregion
if (add.ParentId == null)
{
add.ParentId = (await _dbContext.DataInspection.AsQueryable().Where(x => x.TrialId == add.TrialId && x.SubjectVisitId == add.SubjectVisitId && x.SubjectId == add.SubjectId && x.SiteId == add.SiteId && x.VisitStageId == add.VisitStageId && x.GeneralId == add.GeneralId).OrderByDescending(x => x.CreateTime).FirstOrDefaultAsync())?.Id;
}
add.CreateUserId = _userInfo.Id;
add.IP = _userInfo.IP;
if (add.CreateTime == default(DateTime))
{
add.CreateTime = DateTime.Now;
}
if (_userInfo.SignId!=null)
{
add.SignId = _userInfo.SignId;
add.IsSign = true;
}
var inspectionData = new InspectionData()
{
Data = data,
Inspection = generalData
};
add.JsonDetail = inspectionData.ToJcJson();
await SetDataInspectionDateType(add);
await _dbContext.DataInspection.AddAsync(add);
}
/// <summary>
/// IsNullOrEmpty
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private bool IsNullOrEmpty(object value)
{
if (value == null || value.ToString() == string.Empty)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 设置项目以及名称
/// </summary>
/// <param name="Data"></param>
/// <returns></returns>
public async Task SetInspectionNameValue(InspectionGeneralData Data)
{
#region 项目名称
var trialdata = await _dbContext.Trial.Select(x => new { x.Id, x.ResearchProgramNo, x.ExperimentName, }).FirstOrDefaultAsync(x => x.Id == Data.TrialId);
if (IsNullOrEmpty(Data.ResearchProgramNo))
{
Data.ResearchProgramNo = trialdata?.ResearchProgramNo;
}
if (IsNullOrEmpty(Data.TrialName))
{
Data.TrialName = trialdata?.ExperimentName;
}
#endregion
#region 测试中心名称
Data.SiteCode = (await _dbContext.TrialSite.IgnoreQueryFilters().FirstOrDefaultAsync(x => x.TrialId == Data.TrialId && x.SiteId == Data.SiteId))?.TrialSiteCode;
if (IsNullOrEmpty(Data.SiteName) && Data.SiteId != null)
{
var sitedata = await _dbContext.Site.Where(x => x.Id == Data.SiteId).Select(x => new { x.SiteName }).FirstOrDefaultAsync();
Data.SiteName = sitedata?.SiteName;
}
#endregion
#region 受试者
if (IsNullOrEmpty(Data.SubjectCode) && Data.SubjectId != null)
{
Data.SubjectCode = (await _dbContext.Subject.Where(x => x.Id == Data.SubjectId).Select(x => new { x.Code }).FirstOrDefaultAsync())?.Code;
}
#endregion
#region 访视
if (IsNullOrEmpty(Data.SubjectVisitName))
{
Data.SubjectVisitName = (await _dbContext.SubjectVisit.Where(x => x.Id == Data.SubjectVisitId).Select(x => new { x.VisitName }).FirstOrDefaultAsync())?.VisitName;
}
#endregion
#region 创建者
if (IsNullOrEmpty(Data.CreateUserName))
{
Data.CreateUserName = _userInfo.RealName;
}
if (IsNullOrEmpty(Data.RoleName))
{
Data.RoleName = _userInfo.UserTypeShortName;
}
#endregion
}
/// <summary>
/// 格式化日期和时间
/// </summary>
/// <param name="Data">稽查数据</param>
/// <returns></returns>
public async Task<DataInspection> SetDataInspectionDateType(DataInspection Data)
{
var list = await (from parent in _dbContext.FrontAuditConfig.AsQueryable().Where(x => x.Identification == Data.Identification)
join child in _dbContext.FrontAuditConfig.AsQueryable().Where(x => x.EnumType == "Date") on parent.Id equals child.ParentId
select new DateDto()
{
Code = child.Code,
DateType = child.DateType,
}).ToListAsync();
var JsonData = JsonConvert.DeserializeObject<IDictionary<string, object>>(Data.JsonDetail);
foreach (var item in JsonData.Keys)
{
var datefirst = list.FirstOrDefault(x => x.Code.ToLower() == item.ToLower());
if (datefirst != null && !IsNullOrEmpty(JsonData[item]))
{
try
{
if (datefirst.DateType == "Date")
{
JsonData[item] = DateTime.Parse(JsonData[item].ToString()).ToString("yyyy-MM-dd");
}
if (datefirst.DateType == "DateTime")
{
JsonData[item] = DateTime.Parse(JsonData[item].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
}
}
catch (Exception)
{
continue;
}
}
}
Data.JsonDetail = JsonConvert.SerializeObject(JsonData);
return Data;
}
}
}