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 { /// /// 添加稽查稽查数据 /// public class AuditingData : IAuditingData { /// /// 数据库对象 /// public IRaCISDBContext _dbContext { get; set; } /// /// 用户信息 /// public IUserInfo _userInfo { get; set; } /// /// 构造方法 /// /// /// public AuditingData(IRaCISDBContext dbContext, IUserInfo userInfo) { _dbContext = dbContext; _userInfo = userInfo; } /// /// 传入实体对象 /// public async Task IncomingEntitys(List 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"); } /// /// 插入Add的实体 /// /// public async Task InsertAddEntitys(List entitys,string type) { // 项目人员 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialUser))) { await InsertInspection(item, type, x => new DataInspection() { GeneralId = x.Id }); } // 受试者 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Subject))) { await InsertInspection(item, type, x => new DataInspection() { SubjectId=x.Id }); } } /// /// 插入稽查实体 /// /// 泛型 /// 数据 /// 类型 /// 表达式 /// public async Task InsertInspection(EntityEntry data, string type, Expression> 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); } /// /// 获取URl参数 /// /// public string GetRequestUrl() { return _userInfo.RequestUrl; } /// /// 映射数据 /// /// /// 要赋值的对象 public void MapData(dynamic data, dynamic mapData) { List column = new List() { "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); } /// /// IsNullOrEmpty /// /// /// private bool IsNullOrEmpty(object value) { if (value == null || value.ToString() == string.Empty) { return true; } else { return false; } } /// /// 设置项目以及名称 /// /// /// 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 } /// /// 格式化日期和时间 /// /// 稽查数据 /// public async Task 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>(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; } } }