using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure.Extention; using MassTransit; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; using Newtonsoft.Json; namespace IRaCIS.Core.Infra.EFCore.Common { public interface IAuditingData { Task InsertAddEntitys(List entitys); } public static class AuditOpt { public static readonly string Add = "Add"; public static readonly string Update = "Update"; public static readonly string Deleted = "Deleted"; } /// /// 添加稽查稽查数据 /// public class AuditingData : IAuditingData { /// /// 数据库对象o /// public IRaCISDBContext _dbContext { get; set; } /// /// 用户信息 /// public IUserInfo _userInfo { get; set; } /// /// 构造方法 /// /// /// public AuditingData(IRaCISDBContext dbContext, IUserInfo userInfo) { _dbContext = dbContext; _userInfo = userInfo; _userInfo.BatchId = _userInfo.BatchId == null ? NewId.NextGuid() : _userInfo.BatchId; } /// /// 特殊删除 /// private List NodeleteTableTypes { get { return new List() { typeof(TrialUserRole), typeof(TrialIdentityUser), typeof(TrialSiteSurvey), typeof(TrialSiteUserRole), typeof(VisitStage), typeof(TrialSite) }; } } // 修改为删除 private List UpdateIsDelete { get { return new List() { typeof(TrialDocument) }; } } public string GetEntityAuditOpt(EntityEntry entityEntry) { if (entityEntry.State == EntityState.Added) { return AuditOpt.Add; } else if ( UpdateIsDelete.Contains(entityEntry.Entity.GetType()) && entityEntry.State == EntityState.Modified && (bool)entityEntry.Entity.GetType().GetProperty(nameof(ISoftDelete.IsDeleted)).GetValue(entityEntry.Entity) ) { return AuditOpt.Deleted; } else if (entityEntry.State == EntityState.Deleted || (entityEntry.State == EntityState.Modified && typeof(ISoftDelete).IsAssignableFrom(entityEntry.Entity.GetType()) && (bool)entityEntry.Entity.GetType().GetProperty(nameof(ISoftDelete.IsDeleted)).GetValue(entityEntry.Entity) && entityEntry.State == EntityState.Modified && !NodeleteTableTypes.Contains(entityEntry.Entity.GetType()) ) ) { return AuditOpt.Deleted; } else { return AuditOpt.Update; } } /// /// 插入Add的实体 /// /// public async Task InsertAddEntitys(List entitys) { // 项目 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Trial))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as Trial; var extraIdentification = string.Empty; //阅片标准 var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => t.TrialId == entity.Id && t.IsConfirm).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync(); var memoryCriterionNameList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionCriterionTrial)).Select(t => t.Entity as ReadingQuestionCriterionTrial) .Where(t => t.TrialId == entity.Id && t.IsConfirm).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToList(); //临床数据配置 var clinicalDataSetNameList = await _dbContext.ClinicalDataTrialSet.Where(t => t.TrialId == entity.Id && t.IsConfirm).Select(t => _userInfo.IsEn_Us ? t.ClinicalDataSetEnName : t.ClinicalDataSetName).ToListAsync(); var memoryClinicalDataSetNameList = entitys.Where(x => x.Entity.GetType() == typeof(ClinicalDataTrialSet)).Select(t => t.Entity as ClinicalDataTrialSet) .Where(t => t.TrialId == entity.Id && t.IsConfirm).Select(t => _userInfo.IsEn_Us ? t.ClinicalDataSetEnName : t.ClinicalDataSetName).ToList(); Guid id = entity.Id; var oldentity = await _dbContext.Trial.Where(x => x.Id == id).Select(t => new { t.IsTrialBasicLogicConfirmed, t.IsTrialProcessConfirmed, t.IsTrialUrgentConfirmed, t.IsConfigureEmail, t.IsTrialPACSConfirmed, }).FirstOrDefaultAsync(); switch (_userInfo.RequestUrl) { case "configTrialBasicInfo/ConfigTrialBasicInfoConfirm": extraIdentification = $"/{oldentity.IsTrialBasicLogicConfirmed.ToString()}"; break; case "configTrialBasicInfo/ConfigTrialProcessInfoConfirm": extraIdentification = $"/{oldentity.IsTrialProcessConfirmed.ToString()}"; break; case "configTrialBasicInfo/ConfigTrialUrgentInfoConfirm": extraIdentification = $"/{oldentity.IsTrialUrgentConfirmed.ToString()}"; break; case "configTrialBasicInfo/ConfigTrialPACSInfoConfirm": extraIdentification = $"/{oldentity.IsTrialPACSConfirmed.ToString()}"; break; case "TrialEmailNoticeConfig/setTrialEmail": extraIdentification = oldentity.IsConfigureEmail ? "/EmailUpdate" : "/EmailSave"; break; } await InsertInspection(item.Entity as Trial, type, x => new InspectionConvertDTO() { TrialId = x.Id, ExtraIndentification = extraIdentification, }, new { //TrialDicList = string.Join(",", trialDics) ImageFormatListStr = string.Join("|", entity.ImageFormatList), StudyNamesStr = string.Join("|", entity.StudyNameList.Where(x => x.IsChoose).Select(x => _userInfo.IsEn_Us ? x.EnName : x.Name)), CriterionNames = string.Join(",", criterionNameList.Union(memoryCriterionNameList).Distinct()), ClinicalDataSetNames = string.Join(",", clinicalDataSetNameList.Union(memoryClinicalDataSetNameList).Distinct().OrderBy(t => t)), }); ; } #region 已修改 #region 阅片单元配置 //系统阅片标准 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionCriterionSystem))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingQuestionCriterionSystem; var extraIdentification = string.Empty; if (_dbContext.Entry(entity).Property(t => t.IsMustGlobalReading).IsModified == true) { extraIdentification = $"/IsGlobalReading"; } if (_dbContext.Entry(entity).Property(t => t.IsOncologyReading).IsModified == true) { extraIdentification = $"/IsOncologyReading"; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = /*type == AuditOpt.Update ? true :*/ false, ExtraIndentification = extraIdentification }); } //项目阅片标准 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionCriterionTrial))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingQuestionCriterionTrial; var isDistinctionInterface = false; //设置项目配置 肿瘤学配置 和阅片标准配置 if (_userInfo.RequestUrl == "TrialConfig/setOncologySet" //现在废弃 没用 || _userInfo.RequestUrl == "TrialConfig/setTrialReadingCriterion" //项目流程确认 || _userInfo.RequestUrl == "configTrialBasicInfo/ConfigTrialProcessInfoConfirm" //确认医学审核问题 || _userInfo.RequestUrl == "ReadingMedicineQuestion/ConfirmReadingMedicineQuestion" //阅片单元 保存阅片规则 || _userInfo.RequestUrl == "TrialConfig/setCriterionReadingInfo" || _userInfo.RequestUrl == "configTrialBasicInfo/TrialReadingInfoSign") { isDistinctionInterface = true; } //同步的数据 后面加"/Auto" 因为同步的地方可能会改 所以取反 var extraIdentification = string.Empty; if (_userInfo.RequestUrl != "ReadingQuestion/addOrUpdateReadingQuestionCriterionTrial" && type == AuditOpt.Add) { extraIdentification = "/Auto"; } //保存肿瘤学配置哪里 强行要将 评估结果(中间字典表的多条数据)存到标准稽查上 var dicIdList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingSystemCriterionDictionary)).Select(t => t.Entity as ReadingSystemCriterionDictionary).Where(t => t.CriterionId == entity.Id).Select(t => t.DictionaryId).ToList(); var dicValueList = new List(); if (dicIdList.Count() == 0) { dicValueList = await _dbContext.ReadingSystemCriterionDictionary.Where(t => t.CriterionId == entity.Id).Select(t => t.Dictionary.Value).ToListAsync(); } else { dicValueList = await _dbContext.Dictionary.Where(t => dicIdList.Contains(t.Id)).Select(t => t.Value).ToListAsync(); } // 附加评估 var addtionalAssesementList = await _dbContext.TrialCriterionAdditionalAssessmentType.Where(t => t.TrialReadingCriterionId == entity.Id && t.IsSelected != null) .Select(t => new { t.AdditionalAssessmentType, t.IsSelected }).ToListAsync(); var oncologyAssessIdsStr = string.Empty; var allList = new List(); if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingTrialCriterionDictionary))) { allList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTrialCriterionDictionary)) .Select(t => t.Entity as ReadingTrialCriterionDictionary).ToList().Where(x => x.CriterionId == entity.Id && x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess).ToList(); } else { allList = await _dbContext.ReadingTrialCriterionDictionary.Where(x => x.CriterionId == entity.Id && x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess).ToListAsync(); } //查询出字典的Value ValueCN Des 保存 var diclistOncologyAssess = allList.Select(t => t.DictionaryId).ToList(); var selectList = await _dbContext.Dictionary.Where(x => diclistOncologyAssess.Contains(x.Id)).Select(t => t.ValueCN).ToListAsync(); oncologyAssessIdsStr = string.Join(",", selectList); await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = isDistinctionInterface, TrialReadingCriterionId = entity.Id, ObjectRelationParentId = x.TrialId, ExtraIndentification = extraIdentification }, new { OncologyAssessIdsStr = oncologyAssessIdsStr, EvaluationResultTypes = dicValueList.Count > 0 ? string.Join(",", dicValueList) : string.Empty, AdditionalAssessmentTypeList = addtionalAssesementList }); } // PACS直连 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteDicomAE))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialSiteDicomAE; await InsertInspection(entity, type, x => new InspectionConvertDTO() { ObjectRelationParentId = entity.TrialSiteId, }); } // PACS直连 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialDicomAE))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialDicomAE; await InsertInspection(entity, type, x => new InspectionConvertDTO() { }); } //系统标准问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionSystem))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingQuestionSystem; int? parentQuestionShowOrder = null; int? relavantQuestionShowOrder = null; if (entity.ParentId != null) { parentQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.ParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } if (entity.RelevanceId != null) { relavantQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.RelevanceId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false }, new { ParentQuestionShowOrder = parentQuestionShowOrder, RelavantQuestionShowOrder = relavantQuestionShowOrder }); } //项目标准问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingQuestionTrial))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingQuestionTrial; var isDistinctionInterface = false; var extraIdentification = string.Empty; //同步的数据 后面加"/Auto" 因为同步的地方可能会改 所以取反 if (_userInfo.RequestUrl != "ReadingQuestion/addOrUpdateReadingQuestionTrial" && type == AuditOpt.Add) { extraIdentification = "/Auto"; } //重置仲裁规则 var cloneEntity = entity.Clone(); if (_userInfo.RequestUrl == "ReadingImageTask/setTrialCriterionJudgeQuestionAnswerGroup") { isDistinctionInterface = true; if (entity.JudgeType == JudgeTypeEnum.None) { extraIdentification = "/Reset"; } //翻译 可能自己填写的 也有可能是从字典中获取的 if (entity.QuestionGenre == TableQuestionType.Dictionary && !string.IsNullOrWhiteSpace(entity.DictionaryCode)) { var translateList = _dbContext.Dictionary.Where(t => t.Code == entity.DictionaryCode.Trim()).SelectMany(t => t.ChildList).Select(t => new { t.Code, t.Value, t.ValueCN }).ToList(); foreach (var translateItem in translateList) { cloneEntity.AnswerCombination = cloneEntity.AnswerCombination.Replace($"\"{translateItem.Code}\"", $"\"{translateItem.Value}\""); cloneEntity.AnswerGroup = cloneEntity.AnswerGroup.Replace($"|{translateItem.Code}|", $"|{translateItem.Value}|"); } } } int? parentQuestionShowOrder = null; int? relavantQuestionShowOrder = null; if (entity.ParentId != null) { parentQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.ParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } if (entity.RelevanceId != null) { relavantQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.RelevanceId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = isDistinctionInterface, TrialReadingCriterionId = entity.ReadingQuestionCriterionTrialId, ObjectRelationParentId = x.TrialId, ExtraIndentification = extraIdentification }, new { ParentQuestionShowOrder = parentQuestionShowOrder, RelavantQuestionShowOrder = relavantQuestionShowOrder }); } //系统标准表格问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionSystem))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingTableQuestionSystem; int? dependQuestionShowOrder = null; int? parentQuestionShowOrder = null; int? relavantQuestionShowOrder = null; if (entity.ParentId != null) { parentQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.ParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } if (entity.RelevanceId != null) { relavantQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.RelevanceId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } if (entity.DependParentId != null) { dependQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.DependParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false }, new { ParentQuestionShowOrder = parentQuestionShowOrder, RelavantQuestionShowOrder = relavantQuestionShowOrder, DependQuestionShowOrder = dependQuestionShowOrder }); } //项目标准表格问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionTrial))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingTableQuestionTrial; //同步的数据 后面加"/Auto" 因为同步的地方可能会改 所以取反 var extraIdentification = string.Empty; if (_userInfo.RequestUrl != "ReadingQuestion/addOrUpdateReadingTableQuestionTrial" && type == AuditOpt.Add) { extraIdentification = "/Auto"; } int? dependQuestionShowOrder = null; int? parentQuestionShowOrder = null; int? relavantQuestionShowOrder = null; if (entity.ParentId != null) { parentQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.ParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } if (entity.RelevanceId != null) { relavantQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.RelevanceId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } if (entity.DependParentId != null) { dependQuestionShowOrder = await _dbContext.ReadingQuestionSystem.Where(t => t.Id == entity.DependParentId).Select(t => t.ShowOrder).FirstOrDefaultAsync(); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, TrialId = x.TrialId, TrialReadingCriterionId = entity.TrialCriterionId, ObjectRelationParentId = x.TrialId, ExtraIndentification = extraIdentification }, new { ParentQuestionShowOrder = parentQuestionShowOrder, RelavantQuestionShowOrder = relavantQuestionShowOrder, DependQuestionShowOrder = dependQuestionShowOrder }); } //系统器官 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(OrganInfo))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as OrganInfo; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = entity.SystemCriterionId }); } //项目器官 if (entitys.Any(x => x.Entity.GetType() == typeof(OrganTrialInfo))) { var organTrialEntityEnrtyList = entitys.Where(x => x.Entity.GetType() == typeof(OrganTrialInfo)); var extraIdentification = string.Empty; //同步添加 if (_userInfo.RequestUrl != "OrganInfo/batchAddTrialOrgan" && organTrialEntityEnrtyList.Any(t => GetEntityAuditOpt(t) == AuditOpt.Add)) { extraIdentification = "/Auto"; var list = organTrialEntityEnrtyList.Select(t => t.Entity as OrganTrialInfo); var organIdList = list.Select(t => t.OrganInfoId).ToList(); var organList = await _dbContext.OrganInfo.Where(x => organIdList.Contains(x.Id)).ToListAsync(); var firstEntity = list.FirstOrDefault(); var cloneEntity = firstEntity.Clone(); //保证Id 唯一 cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.TrialId.ToString(), firstEntity.TrialCriterionId.ToString()); await InsertInspection(cloneEntity, AuditOpt.Add, x => new InspectionConvertDTO() { IsDistinctionInterface = false, TrialReadingCriterionId = cloneEntity.TrialCriterionId, ObjectRelationParentId = cloneEntity.TrialCriterionId, ObjectRelationParentId2 = cloneEntity.OrganInfoId, ExtraIndentification = extraIdentification }, new { QuestionAnswerList = list.Join(organList, t => t.OrganInfoId, u => u.Id, (t, u) => u).OrderBy(t => t.ShowOrder).ToList(), }); } else { //手动操作 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(OrganTrialInfo))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as OrganTrialInfo; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, TrialReadingCriterionId = entity.TrialCriterionId, ObjectRelationParentId = entity.TrialCriterionId, ObjectRelationParentId2 = entity.OrganInfoId, ExtraIndentification = extraIdentification }); } } } // 项目 系统公用表 //病灶管理 区分项目 还是系统的 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(CriterionNidusSystem))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as CriterionNidusSystem; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = entity.CriterionId, }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(CriterionNidusTrial))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as CriterionNidusTrial; var extraIdentification = string.Empty; if (_userInfo.RequestUrl != "OrganInfo/addOrUpdateCriterionNidus" && type == AuditOpt.Add) { extraIdentification = "/Auto"; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = entity.CriterionId, TrialReadingCriterionId = entity.CriterionId, ExtraIndentification = extraIdentification }); } //疗效评估 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TumorAssessment_RECIST1Point1))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TumorAssessment_RECIST1Point1; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, //ObjectRelationParentId = entity.CriterionId }); } // 项目 系统公用表 //配置标准 病灶类型 自动计算标识 "LesionType", "QuestionType" if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingSystemCriterionDictionary))) { var type = AuditOpt.Add; var allList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingSystemCriterionDictionary)).Select(t => t.Entity as ReadingSystemCriterionDictionary).ToList(); //查询出字典的Value ValueCN Des 保存 var dicIdList = allList.Select(t => t.DictionaryId).ToList(); var selectList = await _dbContext.Dictionary.Where(x => dicIdList.Contains(x.Id)).Select(t => new { t.Id, t.Value, t.ValueCN, t.Description, t.ShowOrder }).ToListAsync(); foreach (var list in allList.GroupBy(t => t.ParentCode)) { var firstEntity = list.First(); var cloneEntity = list.First().Clone(); //保证Id 唯一 cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.CriterionId.ToString(), firstEntity.ParentCode.ToString()); var extraIdentification = string.Empty; extraIdentification = $"/{cloneEntity.ParentCode}"; await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.CriterionId, TrialReadingCriterionId = x.IsSystemCriterion == false ? x.CriterionId : null, //不显示区分接口 通过是否是系统字典 以及字典Code 区分 IsDistinctionInterface = false, ExtraIndentification = extraIdentification }, new { SelectList = selectList.Join(list, t => t.Id, u => u.DictionaryId, (t, u) => new { Value = t.Value, t.ValueCN, t.Description, t.ShowOrder, u.IsBaseLineUse, u.IsFollowVisitUse } ).OrderBy(t => t.ShowOrder).ToList() }); } } if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingTrialCriterionDictionary))) { var type = AuditOpt.Add; var allList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTrialCriterionDictionary)).Select(t => t.Entity as ReadingTrialCriterionDictionary).ToList(); //查询出字典的Value ValueCN Des 保存 var dicIdList = allList.Select(t => t.DictionaryId).ToList(); var selectList = await _dbContext.Dictionary.Where(x => dicIdList.Contains(x.Id)).Select(t => new { t.Id, Value = _userInfo.IsEn_Us ? t.Value : t.ValueCN, t.ValueCN, t.Description, t.ShowOrder }).ToListAsync(); foreach (var list in allList.GroupBy(t => t.ParentCode)) { var firstEntity = list.First(); var cloneEntity = list.First().Clone(); //保证Id 唯一 cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.CriterionId.ToString(), firstEntity.ParentCode.ToString()); var extraIdentification = string.Empty; extraIdentification = $"/{cloneEntity.ParentCode}/IsTrial"; await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.CriterionId, TrialReadingCriterionId = x.CriterionId, //不显示区分接口 通过是否是系统字典 以及字典Code 区分 IsDistinctionInterface = false, ExtraIndentification = extraIdentification }, new { SelectList = selectList.Join(list, t => t.Id, u => u.DictionaryId, (t, u) => new { Value = _userInfo.IsEn_Us ? t.Value : t.ValueCN, t.ValueCN, t.Description, t.ShowOrder, u.IsBaseLineUse, u.IsFollowVisitUse } ).OrderBy(t => t.ShowOrder).ToList() }); } } #endregion #region 文档相关 // 系统文件签署 父层级未记录稽查(系统文档初始数据) foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SystemDocConfirmedIdentityUser))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as SystemDocConfirmedIdentityUser; var extraIdentification = string.Empty; if (type == AuditOpt.Update) { if (entity.IsDeleted == true) { extraIdentification = "/" + 2; } else { extraIdentification = "/" + 1; } } var systemDocument = await _dbContext.SystemDocument.Where(x => x.Id == entity.SystemDocumentId).FirstOrDefaultAsync(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { GeneralId = x.Id, ExtraIndentification = extraIdentification, ObjectRelationParentId = x.SystemDocumentId }, new { FileTypeId = systemDocument.FileTypeId, Name = systemDocument.Name, UploadTime = systemDocument.CreateTime, CreateUserName = _userInfo.UserName, UserType = _userInfo.UserTypeShortName, IsSigned = entity.ConfirmTime != null, // 是否签署 添加了就是签署了 }); } // 项目文件签署 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialDocConfirmedIdentityUser))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialDocConfirmedIdentityUser; var extraIdentification = string.Empty; if (type == AuditOpt.Update) { if (entity.IsDeleted == true) { extraIdentification = "/" + 2; } else { extraIdentification = "/" + 1; } } var trialDoc = await _dbContext.TrialDocument.Where(x => x.Id == entity.TrialDocumentId).FirstOrDefaultAsync(); await InsertInspection(entity as TrialDocConfirmedIdentityUser, type, x => new InspectionConvertDTO() { TrialId = trialDoc.TrialId, ExtraIndentification = extraIdentification, ObjectRelationParentId = x.TrialDocumentId }, new { UploadTime = trialDoc.CreateTime, CreateUserName = _userInfo.UserName, UserType = _userInfo.UserTypeShortName, IsSigned = entity.ConfirmTime != null }); } //系统文件 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SystemDocument))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as SystemDocument; List needConfirmedUserTypeIdList = new List(); if (entity.NeedConfirmedUserTypeList == null) { needConfirmedUserTypeIdList = await _dbContext.SystemDocNeedConfirmedUserType.Where(x => x.SystemDocumentId == entity.Id).Select(t => t.NeedConfirmUserTypeId).ToListAsync(); } else { needConfirmedUserTypeIdList = entity.NeedConfirmedUserTypeList.Select(t => t.NeedConfirmUserTypeId).ToList(); } var userTypeNameList = await _dbContext.UserType.Where(x => needConfirmedUserTypeIdList.Contains(x.Id)).Select(x => x.UserTypeShortName).ToListAsync(); var userTypeName = string.Join(",", userTypeNameList); await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false }, new { NeedConfirmedUserType = userTypeName, }); } // 项目文档 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialDocument))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialDocument; List needConfirmedUserTypeIdList = new List(); if (entity.NeedConfirmedUserTypeList == null) { needConfirmedUserTypeIdList = await _dbContext.TrialDocNeedConfirmedUserType.Where(x => x.TrialDocumentId == entity.Id).Select(t => t.NeedConfirmUserTypeId).ToListAsync(); } else { needConfirmedUserTypeIdList = entity.NeedConfirmedUserTypeList.Select(t => t.NeedConfirmUserTypeId).ToList(); } var usertypeNames = await _dbContext.UserType.Where(x => needConfirmedUserTypeIdList.Contains(x.Id)).Select(x => x.UserTypeShortName).ToListAsync(); var usertypeName = string.Join(",", usertypeNames); await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = x.TrialId }, new { NeedConfirmedUserType = usertypeName, }); } //项目标准自动发送邮件配置 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialEmailNoticeConfig))) { var type = GetEntityAuditOpt(item); var extraIdentification = string.Empty; var entity = item.Entity as TrialEmailNoticeConfig; //找到配置的用户 var configUserTypeList = entitys.Where(x => x.Entity.GetType() == typeof(TrialEmailNoticeUser)).Select(t => t.Entity as TrialEmailNoticeUser) .Where(t => t.TrialEmailNoticeConfigId == entity.Id).Select(t => new { t.TrialEmailNoticeConfigId, t.EmailUserType, t.UserType }).ToList(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = x.TrialReadingCriterionId, ExtraIndentification = extraIdentification }, new { ToUserTypes = configUserTypeList.Where(t => t.EmailUserType == EmailUserType.To).Select(t => t.UserType).ToList(), CopyUserTypes = configUserTypeList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(t => t.UserType).ToList(), }); } #endregion #region 热键 模板 个性化配置 if (entitys.Any(x => x.Entity.GetType() == typeof(ShortcutKey))) { var type = AuditOpt.Add; var list = entitys.Where(x => x.Entity.GetType() == typeof(ShortcutKey)).Select(t => t.Entity as ShortcutKey); var firstEntity = list.FirstOrDefault(); var cloneEntity = firstEntity.Clone(); //保证Id 唯一 cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.UserId.ToString(), firstEntity.CreateUserId.ToString()); await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO() { //byzhouhang ObjectRelationParentId = x.UserId, IsDistinctionInterface = false, }, new { ShortcutKeyList = list, }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(UserWLTemplate))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as UserWLTemplate; var extraIdentification = string.Empty; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = entity.UserId }); } #endregion #region 附加评估 // 是否参与附加评估记录表 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectCriteriaEvaluation))) { var type = GetEntityAuditOpt(item); //var extraIdentification = string.Empty; var entity = item.Entity as SubjectCriteriaEvaluation; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = x.SubjectId, ObjectRelationParentId2 = x.TrialReadingCriterionId, TrialReadingCriterionId = x.TrialReadingCriterionId, }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectCriteriaEvaluationVisitFilter))) { var type = GetEntityAuditOpt(item); var extraIdentification = string.Empty; var entity = item.Entity as SubjectCriteriaEvaluationVisitFilter; if (type == AuditOpt.Add) { if (entity.IsGeneratedTask) { extraIdentification = "/AutoGenerate"; } else { extraIdentification = "/Add"; } } if (type == AuditOpt.Update) { //手动生成任务 if (entity.IsGeneratedTask) { //Update extraIdentification = "/ManualGenerate"; } //回退接口 else if (_userInfo.RequestUrl == "SubjectCriteriaEvaluation/confirmBackCriteriaVisitTask") { extraIdentification = "/Back"; } else { //筛选影像保存接口 //if (_userInfo.RequestUrl == "SubjectCriteriaEvaluation/batchAddSubjectCriteriaEvaluationVisitStudyFilter") //{ extraIdentification = "/Update"; //} } } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, IsSelfDefine = true, ExtraIndentification = extraIdentification, ObjectRelationParentId = x.SubjectVisitId, ObjectRelationParentId2 = x.TrialReadingCriterionId, TrialReadingCriterionId = x.TrialReadingCriterionId, }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectCriteriaEvaluationVisitStudyFilter))) { var type = GetEntityAuditOpt(item); var extraIdentification = string.Empty; var entity = item.Entity as SubjectCriteriaEvaluationVisitStudyFilter; if (entity.IsConfirmed == true) { extraIdentification = "/Confirm"; } else { extraIdentification = "/Save"; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, IsSelfDefine = true, ExtraIndentification = extraIdentification, ObjectRelationParentId = x.StudyId, ObjectRelationParentId2 = x.SeriesId,//序列有的稽查没有记录,所以StudyId放前面 ObjectRelationParentId3 = x.TrialReadingCriterionId, TrialReadingCriterionId = x.TrialReadingCriterionId, }); } #endregion #region 医学审核 //医学审核 问题答案 if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingMedicineQuestionAnswer))) { var type = AuditOpt.Add; var list = entitys.Where(x => x.Entity.GetType() == typeof(ReadingMedicineQuestionAnswer)).Select(t => t.Entity as ReadingMedicineQuestionAnswer); var questionIdList = list.Select(t => t.ReadingMedicineQuestionId).ToList(); var questionNameList = await _dbContext.ReadingMedicineTrialQuestion.Where(x => questionIdList.Contains(x.Id)).Select(t => new { t.QuestionName, ReadingMedicineQuestionId = t.Id, t.ShowOrder }).ToListAsync(); var firstEntity = list.FirstOrDefault(); var cloneEntity = firstEntity.Clone(); //保证Id 唯一 cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.VisitTaskId.ToString(), firstEntity.TaskMedicalReviewId.ToString()); await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO() { VisitTaskId = x.VisitTaskId, //byzhouhang ObjectRelationParentId = x.TaskMedicalReviewId, IsDistinctionInterface = false, }, new { QuestionAnswerList = list.Join(questionNameList, t => t.ReadingMedicineQuestionId, u => u.ReadingMedicineQuestionId, (t, u) => new { t.Answer, u.QuestionName, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList(), }); } //医学审核对话 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingMedicalReviewDialog))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingMedicalReviewDialog; var extraIdentification = string.Empty; //失效的时候 不区分标识 if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM) { extraIdentification = $"/MIM"; } else { extraIdentification = $"/IR"; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, VisitTaskId = entity.VisitTaskId, ObjectRelationParentId = entity.TaskMedicalReviewId, ExtraIndentification = extraIdentification }); } //医学审核 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TaskMedicalReview))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TaskMedicalReview; var extraIdentification = string.Empty; //失效的时候 不区分标识 if (_dbContext.Entry(entity).Property(t => t.IsInvalid).IsModified == true && entity.IsInvalid == true) { extraIdentification = $"/Invalid"; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { VisitTaskId = entity.VisitTaskId, ObjectRelationParentId = entity.VisitTaskId, ObjectRelationParentId2 = entity.MedicalManagerUserId, ExtraIndentification = extraIdentification, IsDistinctionInterface = (type == AuditOpt.Add || extraIdentification != String.Empty) ? false : true }); } //系统 医学审核问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingMedicineSystemQuestion))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingMedicineSystemQuestion; var parentQuestionName = string.Empty; if (entity.ParentId != null) { parentQuestionName = await _dbContext.ReadingMedicineSystemQuestion.Where(x => x.Id == entity.ParentId).Select(x => x.QuestionName).FirstOrDefaultAsync(); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, }, new { ParentQuestionName = parentQuestionName }); } //项目医学审核问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingMedicineTrialQuestion))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingMedicineTrialQuestion; var parentQuestionName = string.Empty; if (entity.ParentId != null) { parentQuestionName = await _dbContext.ReadingMedicineTrialQuestion.Where(x => x.Id == entity.ParentId).Select(x => x.QuestionName).FirstOrDefaultAsync(); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = entity.TrialId, TrialReadingCriterionId = x.TrialReadingCriterionId, }, new { ParentQuestionName = parentQuestionName }); } #endregion #region QC 质疑 一致性核查 // Qc 问题答案 if (entitys.Any(x => x.Entity.GetType() == typeof(TrialQCQuestionAnswer))) { var entityEntryList = entitys.Where(x => x.Entity.GetType() == typeof(TrialQCQuestionAnswer)); var type = entityEntryList.All(t => t.State == EntityState.Added) ? AuditOpt.Add : AuditOpt.Update; var list = entityEntryList.Select(t => t.Entity as TrialQCQuestionAnswer); var firstEntity = list.FirstOrDefault(); var trialQuestionIdList = list.Select(t => t.TrialQCQuestionConfigureId); var trialQuestionNameList = await _dbContext.TrialQCQuestionConfigure.Where(x => x.TrialId == firstEntity.TrialId).Select(t => new { t.QuestionName, TrialQCQuestionConfigureId = t.Id, t.ShowOrder }).ToListAsync(); var beforeAnswerList = await _dbContext.TrialQCQuestionAnswer.Where(x => x.SubjectVisitId == firstEntity.SubjectVisitId && x.CurrentQCEnum == firstEntity.CurrentQCEnum && x.QCProcessEnum == firstEntity.QCProcessEnum) .Select(u => new { u.TrialQCQuestionConfigureId, u.Answer }).ToListAsync(); var answerList = list.Select(u => new { u.TrialQCQuestionConfigureId, u.Answer }).Union(beforeAnswerList).DistinctBy(t => t.TrialQCQuestionConfigureId); var cloneEntity = firstEntity.Clone(); //保证Id 唯一 cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.SubjectVisitId.ToString(), ((int)firstEntity.QCProcessEnum).ToString(), ((int)firstEntity.CurrentQCEnum).ToString()); await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO() { SubjectVisitId = x.SubjectVisitId, //byzhouhang ObjectRelationParentId = x.SubjectVisitId, }, new { QcQuestionAnswerList = answerList.Join(trialQuestionNameList, t => t.TrialQCQuestionConfigureId, u => u.TrialQCQuestionConfigureId, (t, u) => new { t.Answer, u.QuestionName, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList(), }); } //QC 质疑 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(QCChallenge))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as QCChallenge; await InsertInspection(entity, type, x => new InspectionConvertDTO() { SubjectVisitId = x.SubjectVisitId, ObjectRelationParentId = x.SubjectVisitId }, new { IsOverTime = entity.IsClosed ? entity.ClosedTime > entity.DeadlineTime : DateTime.Now > entity.DeadlineTime, }); } // 质疑 对话 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(QCChallengeDialog))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as QCChallengeDialog; var extraIdentification = string.Empty; var reason = string.Empty; // 对话消息区分用户类型 extraIdentification = "/(" + _userInfo.UserTypeShortName + ")"; if (_userInfo.RequestUrl.ToLower() == "qcoperation/closeqcchallenge") { reason = entity.TalkContent.Substring(entity.TalkContent.LastIndexOf(':') + 1); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { SubjectVisitId = x.SubjectVisitId, //byzhouhang ObjectRelationParentId = entity.QCChallengeId, IsDistinctionInterface = false, ExtraIndentification = extraIdentification, }); } //一致性核查 对话 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(CheckChallengeDialog))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as CheckChallengeDialog; var extraIdentification = string.Empty; var reason = string.Empty; extraIdentification = "/(" + _userInfo.UserTypeShortName + ")"; if (_userInfo.RequestUrl.ToLower() == "qcoperation/closecheckchallenge") { reason = entity.TalkContent.Substring(entity.TalkContent.LastIndexOf(':') + 1); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { SubjectVisitId = x.SubjectVisitId, //byzhouhang IsDistinctionInterface = false, Reason = reason, ExtraIndentification = extraIdentification, ObjectRelationParentId = entity.SubjectVisitId, } ); } // 一致性核查文件 是否需要单独一个表记录? foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(InspectionFile))) { var type = GetEntityAuditOpt(item); await InsertInspection(item.Entity as InspectionFile, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.TrialId }); } #endregion #region 中心调研 // 中心调研表 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteSurvey))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialSiteSurvey; if (entity.TrialSite == null) { entity.TrialSite = await _dbContext.TrialSite.IgnoreQueryFilters().Where(x => x.Id == entity.TrialSiteId && x.TrialId == entity.TrialId).FirstOrDefaultAsync(); } if (entity.PreliminaryUser == null) { entity.PreliminaryUser = await _dbContext.User.Where(x => x.Id == entity.PreliminaryUserId).FirstOrDefaultAsync(); } if (entity.ReviewerUser == null) { entity.ReviewerUser = await _dbContext.User.Where(x => x.Id == entity.ReviewerUserId).FirstOrDefaultAsync(); } var trialSiteId = entity.TrialSite?.Id; await InsertInspection(item.Entity as TrialSiteSurvey, type, x => new InspectionConvertDTO() { ObjectRelationParentId = trialSiteId, }, new { //TrialSiteCode = entity.TrialSite.TrialSiteCode, //TrialSiteAliasName = entity.TrialSite.TrialSiteAliasName, //Phone = entity.Phone, //Email = entity.Email, PreliminaryUser = entity.PreliminaryUser == null ? "" : entity.PreliminaryUser.FullName, ReviewerUser = entity.ReviewerUser == null ? "" : entity.ReviewerUser.FullName, }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteUserSurvey))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialSiteUserSurvey; var trialid = await _dbContext.TrialSiteSurvey.Where(x => x.Id == entity.TrialSiteSurveyId).Select(x => x.TrialId).FirstOrDefaultAsync(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { TrialId = trialid, IsDistinctionInterface = false }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteEquipmentSurvey))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialSiteEquipmentSurvey; var trialid = await _dbContext.TrialSiteSurvey.Where(x => x.Id == entity.TrialSiteSurveyId).Select(x => x.TrialId).FirstOrDefaultAsync(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { TrialId = trialid, IsDistinctionInterface = false }); } #endregion //系统 Qc 问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(QCQuestion))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as QCQuestion; int? parentQuestionOrder = null; string parentQuestionName = string.Empty; if (entity.ParentId != null) { var question = await _dbContext.QCQuestionConfigure.Where(x => x.Id == entity.ParentId).Select(x => new { x.Id, x.ShowOrder, x.QuestionName }).FirstOrDefaultAsync(); parentQuestionOrder = question?.ShowOrder; parentQuestionName = question?.QuestionName; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false }, new { ParentQuestionName = parentQuestionName, ParentQuestionOrder = parentQuestionOrder }); } // 项目QC问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialQCQuestion))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialQCQuestion; int? parentQuestionOrder = null; string parentQuestionName = string.Empty; if (entity.ParentId != null) { var question = entitys.Where(x => x.Entity.GetType() == typeof(TrialQCQuestion)).Select(t => t.Entity as TrialQCQuestion).Select(x => new { x.Id, x.ShowOrder, x.QuestionName }).FirstOrDefault(t => t.Id == entity.ParentId); question = question ?? await _dbContext.TrialQCQuestionConfigure.Where(x => x.Id == entity.ParentId).Select(x => new { x.Id, x.ShowOrder, x.QuestionName }).FirstOrDefaultAsync(); parentQuestionOrder = question?.ShowOrder; parentQuestionName = question?.QuestionName; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.TrialId, IsDistinctionInterface = false }, new { ParentQuestionName = parentQuestionName, ParentQuestionOrder = parentQuestionOrder }); } // 签名模板 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SystemBasicData))) { var type = GetEntityAuditOpt(item); var extraIdentification = string.Empty; var basicData = item.Entity as SystemBasicData; extraIdentification = (basicData.ParentId == null ? "/parent" : string.Empty); await InsertInspection(item.Entity as SystemBasicData, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ExtraIndentification = extraIdentification }); } #region 项目参与人员 项目site // 项目中心 Site未稽查 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSite))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialSite; if (entity.Site == null && entity.SiteId != null) { entity.Site = await _dbContext.Site.Where(x => x.Id == entity.SiteId).FirstOrDefaultAsync(); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = type == AuditOpt.Update ? true : false, TrialId = x.TrialId, ObjectRelationParentId = x.TrialId }, new { //兼容之前的配置 冗余该字段 SiteCode = entity.TrialSiteCode, //Site 没记录稽查 必须查询存 SiteName = entity.TrialSiteName }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(UserRole))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as UserRole; //var user = await _dbContext.Users.Include(x => x.UserTypeRole).FirstOrDefaultAsync(x => x.Id == entity.UserId); await InsertInspection(entity, type, x => new InspectionConvertDTO { IsDistinctionInterface = type == AuditOpt.Update ? true : false, }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(IdentityUser))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as IdentityUser; await InsertInspection(entity, type, x => new InspectionConvertDTO { IsDistinctionInterface = type == AuditOpt.Update ? true : false, }); } // 项目参与人员 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialIdentityUser))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialIdentityUser; string extraIndentification = string.Empty; var identityUser = await _dbContext.IdentityUser.AsNoTracking().Where(x => x.Id == entity.IdentityUserId).FirstOrDefaultAsync(); // 变更维护数据,会维护数据,不能插入稽查 if (_userInfo.IsNotNeedInspection == false) { await InsertInspection(entity, type, x => new InspectionConvertDTO { //IsDistinctionInterface = true , TrialId = x.TrialId, IsDistinctionInterface = false, ObjectRelationParentId = x.TrialId, ExtraIndentification = extraIndentification, //ObjectRelationParentId2 = x.IdentityUserId, }, new { identityUser.FullName, identityUser.EMail, identityUser.Code, identityUser.UserCode, identityUser.UserName, identityUser.DepartmentName, identityUser.Phone, identityUser.OrganizationName, }); } } // 项目人员 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialUserRole))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialUserRole; string extraIndentification = string.Empty; if (type == AuditOpt.Update) { extraIndentification = "/" + entity.IsDeleted.ToString(); } var userTypeEnum = await _dbContext.Users.Where(x => x.Id == entity.UserId).Select(x => x.UserTypeEnum).FirstOrDefaultAsync(); //var user = await _dbContext.Users.Include(x => x.UserTypeRole).FirstOrDefaultAsync(x => x.Id == entity.UserId); await InsertInspection(entity, type, x => new InspectionConvertDTO { IsDistinctionInterface = false, TrialId = x.TrialId, ObjectRelationParentId = x.TrialId, ExtraIndentification = extraIndentification, ObjectRelationParentId2 = x.UserId, }, new { UserTypeEnum = userTypeEnum, }); } // 项目中心人员 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialSiteUserRole))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialSiteUserRole; if (entity.TrialSite == null) { entity.TrialSite = await _dbContext.TrialSite.Where(x => x.Id == entity.TrialSiteId).IgnoreQueryFilters().FirstOrDefaultAsync(); } await InsertInspection(item.Entity as TrialSiteUserRole, type, x => new InspectionConvertDTO { IsDistinctionInterface = type == AuditOpt.Update ? true : false, TrialId = x.TrialId, ObjectRelationParentId = entity.TrialSite.Id, ObjectRelationParentId2 = x.UserId, }); } #endregion // 受试者 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Subject))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as Subject; var finalSubjectVisitName = await _dbContext.SubjectVisit.AsNoTracking().Where(x => x.Id == entity.FinalSubjectVisitId && entity.FinalSubjectVisitId != null).Select(x => x.VisitName).FirstOrDefaultAsync(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { SubjectId = x.Id, TrialSiteId = x.TrialSiteId, //项目的信息 找离的最近的项目稽查信息 ObjectRelationParentId = entity.TrialSiteId, }, new { FinalSubjectVisitName = finalSubjectVisitName, //变换名称 兼容之前做的稽查 冗余 SubjectCode = entity.Code, }); } // 访视计划 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(VisitStage))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as VisitStage; await InsertInspection(item.Entity as VisitStage, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.TrialId }); #region Old //var visitPlanStatus = await this._dbContext.Trial.Where(x => x.Id == entity.TrialId).Select(x => x.VisitPlanConfirmed).FirstOrDefaultAsync(); //if (type == "Add") //{ // visitPlanStatus = false; //} //await InsertInspection(item.Entity as VisitStage, type, x => new InspectionConvertDTO() //{ // ObjectRelationParentId = x.TrialId //}, new //{ // VisitPlanStatus = visitPlanStatus, //}); #endregion } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectVisitImageBackRecord))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as SubjectVisitImageBackRecord; var extraIdentification = string.Empty; var isDistinctionInterface = true; var reason = string.Empty; #region 处理标识 #endregion var SubjectId = await _dbContext.SubjectVisit.Where(x => x.Id == entity.SubjectVisitId).Select(x => x.SubjectId).FirstOrDefaultAsync(); await InsertInspection(item.Entity as SubjectVisitImageBackRecord, type, x => new InspectionConvertDTO() { IsDistinctionInterface = isDistinctionInterface, Reason = reason, //Subject的信息 找离的最近的Subject稽查信息 ObjectRelationParentId = x.SubjectVisitId, SubjectId = SubjectId, SubjectVisitId = x.Id, ExtraIndentification = extraIdentification, } ); } // 访视 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectVisit))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as SubjectVisit; var extraIdentification = string.Empty; var isDistinctionInterface = true; var reason = string.Empty; #region 处理标识 switch (_userInfo.RequestUrl.ToLower()) { //待处理? case "qcoperation/qcpassedorfailed": extraIdentification = "/" + (40 % (int)entity.AuditState).ToString(); break; //设置核查通过 case "qcoperation/setcheckpass": reason = entity.ManualPassReason; break; //领取或者取消QC任务 case "qcoperation/obtainorcancelqctask": type = type + "/" + entity.IsTake.ToString(); break; //确认重阅 区分用户类型 case "visittask/confirmrereading": if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM) { type = type + "/" + 1; } else { //SPM type = type + "/" + 2; } break; } if (entity.CheckChallengeState == CheckChanllengeTypeEnum.CRCWaitPMReply || entity.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply) { //发送对话 修改质疑状态 不需要区分接口 isDistinctionInterface = false; extraIdentification = "/ModifyCheckChallengeState"; } #endregion await InsertInspection(item.Entity as SubjectVisit, type, x => new InspectionConvertDTO() { IsDistinctionInterface = isDistinctionInterface, Reason = reason, //Subject的信息 找离的最近的Subject稽查信息 ObjectRelationParentId = x.SubjectId, SubjectId = x.SubjectId, SubjectVisitId = x.Id, TrialSiteId = x.TrialSiteId, ExtraIndentification = extraIdentification, }, //兼容之前的配置名 new { SubjectVisitName = entity.VisitName } ); } #region Dicom 非Dicom 既往手术史..临床数据 // Dicom foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(DicomStudy))) { var type = GetEntityAuditOpt(item); var extraIdentification = string.Empty; switch (_userInfo.RequestUrl) { case "QCOperation/updateModality": if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator) { extraIdentification = "/2"; } break; } await InsertInspection(item.Entity as DicomStudy, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.SubjectVisitId, ExtraIndentification = extraIdentification }); } // 后处理Dicom影像 // TaskStudy foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TaskStudy))) { var entity = item.Entity as TaskStudy; var type = GetEntityAuditOpt(item); var armEnum = await _dbContext.VisitTask.Where(x => x.Id == entity.VisitTaskId).Select(x => x.ArmEnum).FirstOrDefaultAsync(); await InsertInspection(item.Entity as TaskStudy, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.VisitTaskId, }, new { ArmEnum = armEnum, }); } // 序列 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(DicomSeries))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as DicomSeries; await InsertInspection(item.Entity as DicomSeries, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.StudyId } ); } // foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(DicomInstance))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as DicomInstance; await InsertInspection(item.Entity as DicomInstance, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.SeriesId, ObjectRelationParentId2 = x.StudyId, } ); } // 非Dicom foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(NoneDicomStudy))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as NoneDicomStudy; var extraIdentification = string.Empty; if (_userInfo.RequestUrl.ToLower() == "nonedicomstudy/addorupdatenonedicomstudy") { extraIdentification = "/(" + _userInfo.UserTypeShortName + ")"; } await InsertInspection(item.Entity as NoneDicomStudy, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.SubjectVisitId, ExtraIndentification = extraIdentification }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(NoneDicomStudyFile))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as NoneDicomStudyFile; var extraIdentification = string.Empty; Arm armEnum = Arm.SingleReadingArm; if (entity.VisitTaskId != null) { extraIdentification = "/VisitTask"; armEnum = await _dbContext.VisitTask.Where(x => x.Id == entity.VisitTaskId).Select(x => x.ArmEnum).FirstOrDefaultAsync(); } var noneDicomStudy = await _dbContext.NoneDicomStudy.Where(x => x.Id == entity.NoneDicomStudyId).IgnoreQueryFilters().FirstNotNullAsync(); await InsertInspection(item.Entity as NoneDicomStudyFile, type, x => new InspectionConvertDTO() { SubjectVisitId = noneDicomStudy.SubjectVisitId, SubjectId = noneDicomStudy.SubjectId, ObjectRelationParentId = x.VisitTaskId, ExtraIndentification = extraIdentification }, new { ArmEnum = armEnum, }); } // 既往手术史 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(PreviousSurgery))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as PreviousSurgery; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, SubjectVisitId = x.SubjectVisitId, ObjectRelationParentId = x.SubjectVisitId, ObjectRelationParentId2 = x.ClinicalDataTrialSetId, }, new { ClinicalDataLevel = ClinicalLevel.Subject, Type = ClinicalFileType.PreviousSurgery }); } // 既往放疗史 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(PreviousHistory))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as PreviousHistory; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, SubjectVisitId = x.SubjectVisitId, ObjectRelationParentId2 = x.ClinicalDataTrialSetId, ObjectRelationParentId = x.SubjectVisitId, }, new { ClinicalDataLevel = ClinicalLevel.Subject, Type = ClinicalFileType.PreviousHistory }); } // 其他治疗史 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(PreviousOther))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as PreviousOther; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, SubjectVisitId = x.SubjectVisitId, ObjectRelationParentId2 = x.ClinicalDataTrialSetId, ObjectRelationParentId = x.SubjectVisitId, }, new { ClinicalDataLevel = ClinicalLevel.Subject, Type = ClinicalFileType.PreviousOther }); } #endregion #region 阅片人入组 //阅片人入组 父层级未记录稽查(医生) foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(Enroll))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as Enroll; var doctor = await _dbContext.Doctor.FirstOrDefaultAsync(x => x.Id == entity.DoctorId); var readingCategoryList = await _dbContext.EnrollReadingCategory.Where(x => x.EnrollId == entity.Id).Select(t => t.ReadingCategory).ToListAsync(); await InsertInspection(item.Entity as Enroll, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.TrialId }, new { //父层级的数据 暂时没有记录稽查 所以这里必须查 Name = doctor.FullName, ChineseName = doctor.ChineseName, Email = doctor.EMail, IsUploadedACKSOW = entity.AttachmentId != Guid.Empty, //子层级的数据 记录到父层级 必须查询 不然找上一条时数据不准 ReadingCategoryList = readingCategoryList }); } //独立阅片人 设置阅片类型 这里对于操作人 不区分 添加 编辑 删除 只有设置(相当于更新) if (entitys.Any(x => x.Entity.GetType() == typeof(EnrollReadingCategory))) { var type = AuditOpt.Update; var addList = entitys.Where(x => x.Entity.GetType() == typeof(EnrollReadingCategory) && x.State == EntityState.Added).Select(t => t.Entity as EnrollReadingCategory).ToList(); var deleteList = entitys.Where(x => x.Entity.GetType() == typeof(EnrollReadingCategory) && x.State == EntityState.Deleted).Select(t => t.Entity as EnrollReadingCategory).ToList(); var first = addList.Union(deleteList).FirstOrDefault(); var enrollId = first.EnrollId; Guid? trialId = Guid.Empty; if (first.Enroll != null) { trialId = first.Enroll.TrialId; } else { trialId = await _dbContext.Enroll.Where(x => x.Id == enrollId).Select(t => t.TrialId).FirstOrDefaultAsync(); } await InsertInspection(first, type, x => new InspectionConvertDTO() { //GeneralId 和ObjectRelationParentId 一样 会成环 所以查询的时候 需要排除自身 GeneralId = enrollId, TrialId = trialId, ObjectRelationParentId = enrollId, IsDistinctionInterface = false }, new { ReadingCategoryList = addList.Select(t => t.ReadingCategory).ToList(), }); } #endregion #region 阅片期临床数据 //临床数据上传PDF foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingClinicalDataPDF))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingClinicalDataPDF; var clinicalData = await _dbContext.ReadingClinicalData.Where(t => t.Id == entity.ReadingClinicalDataId).FirstOrDefaultAsync(); if (clinicalData != null) { var clinicalDataTrialSet = await _dbContext.ClinicalDataTrialSet.Where(t => t.Id == clinicalData.ClinicalDataTrialSetId).FirstOrDefaultAsync(); SubjectVisit? visit = await _dbContext.SubjectVisit.Where(x => x.Id == clinicalData.ReadingId).FirstOrDefaultAsync(); TrialSite? siteInfo = null; Subject? subject = null; //阅片标准 var trialReadingCriterionIdList = await _dbContext.TrialClinicalDataSetCriterion.Where(t => t.TrialClinicalDataSetId == clinicalDataTrialSet.Id).Select(t => t.TrialReadingCriterionId).ToListAsync(); //阅片标准 var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => trialReadingCriterionIdList.Contains(t.Id)).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync(); if (visit != null) { siteInfo = await _dbContext.TrialSite.Where(x => x.Id == visit.TrialSiteId).FirstOrDefaultAsync(); subject = await _dbContext.Subject.Where(x => x.Id == clinicalData.SubjectId).FirstOrDefaultAsync(); } Guid? subjectVisitId = visit == null ? null : visit.Id; await InsertInspection(entity, type, x => new InspectionConvertDTO() { TrialId = clinicalData.TrialId, SubjectId = clinicalData.SubjectId, SubjectVisitId = subjectVisitId, }, new { SiteCode = siteInfo == null ? "" : siteInfo.TrialSiteCode, SubjectCode = subject == null ? "" : subject.Code, VisitName = visit == null ? "" : visit.VisitName, clinicalDataTrialSet.ClinicalDataSetName, clinicalDataTrialSet.ClinicalDataLevel, clinicalDataTrialSet.ClinicalUploadType, CriterionNames = string.Join(",", criterionNameList.Distinct()), FileCount = 1, }); } } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ClinicalForm))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ClinicalForm; var clinicalDataTrialSet = await _dbContext.ClinicalDataTrialSet.Where(t => t.Id == entity.ClinicalDataTrialSetId).FirstOrDefaultAsync(); SubjectVisit? visit = await _dbContext.SubjectVisit.Where(x => x.Id == entity.ReadingId).FirstOrDefaultAsync(); TrialSite? siteInfo = null; Subject? subject = null; //阅片标准 var trialReadingCriterionIdList = await _dbContext.TrialClinicalDataSetCriterion.Where(t => t.TrialClinicalDataSetId == clinicalDataTrialSet.Id).Select(t => t.TrialReadingCriterionId).ToListAsync(); //阅片标准 var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => trialReadingCriterionIdList.Contains(t.Id)).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync(); if (visit != null) { siteInfo = await _dbContext.TrialSite.Where(x => x.Id == visit.TrialSiteId).FirstOrDefaultAsync(); subject = await _dbContext.Subject.Where(x => x.Id == entity.SubjectId).FirstOrDefaultAsync(); } Guid? subjectVisitId = visit == null ? null : visit.Id; await InsertInspection(entity, type, x => new InspectionConvertDTO() { TrialId = entity.TrialId, SubjectId = entity.SubjectId, SubjectVisitId = subjectVisitId, }, new { SiteCode = siteInfo == null ? "" : siteInfo.TrialSiteCode, SubjectCode = subject == null ? "" : subject.Code, VisitName = visit == null ? "" : visit.VisitName, clinicalDataTrialSet.ClinicalDataSetName, clinicalDataTrialSet.ClinicalDataLevel, clinicalDataTrialSet.ClinicalUploadType, CriterionNames = string.Join(",", criterionNameList.Distinct()), }); } //系统临床数据配置 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ClinicalDataSystemSet))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ClinicalDataSystemSet; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, }); } //项目临床数据配置 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ClinicalDataTrialSet))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ClinicalDataTrialSet; var extraIdentification = string.Empty; if (_userInfo.RequestUrl == "configTrialBasicInfo/ConfigTrialProcessInfoConfirm") { extraIdentification = "/ConfirmSelect"; } else if (_userInfo.RequestUrl == "ClinicalDataSet/applyTrialClinical") { extraIdentification = "/applyTrialClinical"; } //获取配置的标准名称 //List trialDics = new List(); //var dictionaryIds = new List(); //if (entity.TrialDicList == null || entity.TrialDicList.Count == 0) //{ // dictionaryIds = await this._dbContext.TrialDictionary.Where(x => x.TrialId == entity.Id && x.KeyName == "Criterion").Select(x => x.DictionaryId).ToListAsync(); //} //else //{ // dictionaryIds = entity.TrialDicList.Select(x => x.DictionaryId).ToList(); //} //trialDics = await this._dbContext.Dictionary.Where(x => dictionaryIds.Contains(x.Id)).Select(x => x.ValueCN).ToListAsync(); var trialReadingCritiralIdList = new List(); var criterionNameList = new List(); if (entity.TrialClinicalDataSetCriteriaList == null || entity.TrialClinicalDataSetCriteriaList.Count() == 0) { criterionNameList = await _dbContext.TrialClinicalDataSetCriterion.Where(t => t.TrialClinicalDataSetId == entity.Id).Select(t => t.TrialReadingCriterion.CriterionName).ToListAsync(); } else { var ids = entity.TrialClinicalDataSetCriteriaList.Select(t => t.TrialReadingCriterionId).ToList(); criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => ids.Contains(t.Id)).Select(t => t.CriterionName).ToListAsync(); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = entity.TrialId, ExtraIndentification = extraIdentification, }, new { CriterionNames = criterionNameList?.Count() > 0 ? string.Join(",", criterionNameList) : string.Empty }); } //临床数据问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialClinicalQuestion))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialClinicalQuestion; var trialId = await _dbContext.ClinicalDataTrialSet.Where(t => t.Id == entity.TrialClinicalId).Select(t => t.TrialId).FirstOrDefaultAsync(); var GroupName = entity.GroupId == null ? entity.QuestionName : _dbContext.TrialClinicalQuestion.Where(t => t.Id == entity.GroupId).Select(t => t.QuestionName).FirstOrDefault(); var GroupEnName = entity.GroupId == null ? entity.QuestionEnName : _dbContext.TrialClinicalQuestion.Where(t => t.Id == entity.GroupId).Select(t => t.QuestionEnName).FirstOrDefault(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { TrialId = trialId, }, new { GroupName = GroupName, GroupEnName = GroupEnName, } ); } //临床数据表格问题 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TrialClinicalTableQuestion))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TrialClinicalTableQuestion; var trialId = await _dbContext.ClinicalDataTrialSet.Where(t => t.Id == entity.TrialClinicalId).Select(t => t.TrialId).FirstOrDefaultAsync(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { TrialId = trialId, } ); } // CRC PM 临床数据 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingClinicalData))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingClinicalData; var config = await _dbContext.ClinicalDataTrialSet.FindAsync(entity.ClinicalDataTrialSetId); await InsertInspection(item.Entity as ReadingClinicalData, type, x => new InspectionConvertDTO() { IsDistinctionInterface = type == AuditOpt.Update ? true : false, SubjectVisitId = x.IsVisit ? x.ReadingId : null, ObjectRelationParentId = entity.ClinicalDataTrialSetId, //ObjectRelationParentId2 = x.IsVisit == false?x.ReadingId:null }, new { FileCountViewStr = config?.ClinicalDataLevel == ClinicalLevel.Subject && config?.ClinicalUploadType == ClinicalUploadType.Table ? "NA" : entity.FileCount.ToString() }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingConsistentClinicalData))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingConsistentClinicalData; var config = await _dbContext.ClinicalDataTrialSet.FindAsync(entity.ClinicalDataTrialSetId); await InsertInspection(item.Entity as ReadingConsistentClinicalData, type, x => new InspectionConvertDTO() { IsDistinctionInterface = type == AuditOpt.Update ? true : false, SubjectVisitId = x.IsVisit ? x.ReadingId : null, ObjectRelationParentId = entity.ClinicalDataTrialSetId, //ObjectRelationParentId2 = x.IsVisit == false?x.ReadingId:null }, new { FileCountViewStr = config?.ClinicalDataLevel == ClinicalLevel.Subject && config?.ClinicalUploadType == ClinicalUploadType.Table ? "NA" : entity.FileCount.ToString() }); } //阅片期计划 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingPeriodSet))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingPeriodSet; var siteCodes = string.Empty; if (entity.ReadingScope == ReadingScopeEnum.Site) { var siteIds = entity.ReadingPeriodSites.Select(t => t.TrialSiteId).ToList(); var nameList = _dbContext.TrialSite.Where(c => c.TrialId == entity.TrialId && siteIds.Contains(c.Id)).Select(t => t.TrialSiteCode).ToList(); siteCodes = String.Join(',', nameList); } await InsertInspection(item.Entity as ReadingPeriodSet, type, x => new InspectionConvertDTO() { ObjectRelationParentId = x.VisitStageId, ObjectRelationParentId2 = entity.TrialReadingCriterionId, }, new { SiteCodes = siteCodes }); } #region 阅片期临时数据不记录 //foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingPeriodPlan))) //{ // var entity = item.Entity as ReadingPeriodPlan; // if (entity.ReadingPeriodSet == null) // { // entity.ReadingPeriodSet = _dbContext.ReadingPeriodSet.Find(entity.ReadingPeriodSetId); // } // await InsertInspection(item.Entity as ReadingPeriodPlan, type, x => new InspectionConvertDTO() // { // GeneralId = x.Id, // SubjectVisitId = x.SubjectVisitId, // }, new // { // entity.ReadingPeriodSet.ReadingPeriodName, // entity.ReadingPeriodSet.EffectOfTime, // entity.ReadingPeriodSet.ExpirationDate // }); //} #endregion //阅片期 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadModule))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadModule; string extraIndentification = string.Empty; object objData = new { }; //临床数据表单确认 if (_userInfo.RequestUrl == "ClinicalAnswer/cRCConfirmClinical") { extraIndentification = "/" + _userInfo.RequestUrl; var readModuleCriterionFromList = entitys.Where(x => x.Entity.GetType() == typeof(ReadModuleCriterionFrom)).ToList(); if (readModuleCriterionFromList.Count() > 0) { var readModuleCriterionFrom = readModuleCriterionFromList.FirstOrDefault().Entity as ReadModuleCriterionFrom; var clinicalFormIds = new List(); var criterionIds = new List(); readModuleCriterionFromList.ForEach(x => { var form = x.Entity as ReadModuleCriterionFrom; clinicalFormIds.Add(form.ClinicalFormId); }); var clinicalFormList = await _dbContext.ClinicalForm.Where(t => clinicalFormIds.Contains(t.Id)).ToListAsync(); var clinicalDataTrialSetIds = clinicalFormList.Select(x => x.ClinicalDataTrialSetId).ToList().Distinct(); var readModule = await _dbContext.ReadModule.Where(t => t.Id == readModuleCriterionFrom.ReadModuleId).Include(x => x.SubjectVisit).FirstOrDefaultAsync(); var latestScanDate = readModule.SubjectVisit.LatestScanDate; var clinicalDataTrialSetList = await _dbContext.ClinicalDataTrialSet.Where(t => clinicalDataTrialSetIds.Contains(t.Id)).ToListAsync(); var clinicalSetIds = clinicalDataTrialSetList.Select(x => x.Id).ToList(); // 项目临床数据和标准的关联 var trialReadingCriterionIdList = await _dbContext.TrialClinicalDataSetCriterion.Where(x => clinicalSetIds.Contains(x.TrialClinicalDataSetId)).Select(x => x.TrialReadingCriterionId).Distinct().ToListAsync(); // 标准 var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => trialReadingCriterionIdList.Contains(t.Id)).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync(); Subject subject = await _dbContext.Subject.Where(x => x.Id == readModule.SubjectId).FirstOrDefaultAsync(); TrialSite siteInfo = await _dbContext.TrialSite.Where(x => x.Id == subject.TrialSiteId).FirstOrDefaultAsync(); var clinicalDataSetNameList = clinicalDataTrialSetList.Select(x => x.ClinicalDataSetName).ToList(); objData = new { SiteCode = siteInfo == null ? "" : siteInfo.TrialSiteCode, SubjectCode = subject == null ? "" : subject.Code, LatestScanDate = latestScanDate, ClinicalDataSetName = string.Join(",", clinicalDataSetNameList), ClinicalDataLevel = clinicalDataTrialSetList.Select(x => x.ClinicalDataLevel).FirstOrDefault(), ClinicalUploadType = clinicalDataTrialSetList.Select(x => x.ClinicalUploadType).FirstOrDefault(), CriterionNames = string.Join(",", criterionNameList.Distinct()), RecordNumber = readModuleCriterionFromList.Count(), }; } } List urlList = new List() { "ClinicalAnswer/cRCCancelConfirmClinical", "ClinicalAnswer/PMConfirmClinical" }; if (urlList.Contains(_userInfo.RequestUrl)) { extraIndentification = "/" + _userInfo.RequestUrl; string status = string.Empty; if (!entity.IsCRCConfirm && _userInfo.RequestUrl == "ClinicalAnswer/PMConfirmClinical") { status = "已撤回"; extraIndentification += "/revocation"; } else if (entity.IsPMConfirm && _userInfo.RequestUrl == "ClinicalAnswer/PMConfirmClinical") { status = "已核对"; extraIndentification += "/Confirm"; } var readModuleCriterionFrom = await _dbContext.ReadModuleCriterionFrom.Where(t => t.ReadModuleId == entity.Id).FirstOrDefaultAsync(); var latestScanDate = await _dbContext.ReadModule.Where(t => t.Id == entity.Id).Select(x => x.SubjectVisit.LatestScanDate).FirstOrDefaultAsync(); TrialSite? siteInfo = null; Subject? subject = null; //阅片标准 var clinicalFormIds = await _dbContext.ReadModuleCriterionFrom.Where(x => x.ReadModuleId == entity.Id).Select(x => x.ClinicalFormId).ToListAsync(); var clinicalDataTrialSetIds = await _dbContext.ClinicalForm.Where(x => clinicalFormIds.Contains(x.Id)).Select(x => x.ClinicalDataTrialSetId).Distinct().ToListAsync(); // 临床数据 var clinicalDataTrialSetList = await _dbContext.ClinicalDataTrialSet.Where(x => clinicalDataTrialSetIds.Contains(x.Id)).ToListAsync(); var clinicalSetIds = clinicalDataTrialSetList.Select(x => x.Id).ToList(); // 项目临床数据和标准的关联 var trialReadingCriterionIdList = await _dbContext.TrialClinicalDataSetCriterion.Where(x => clinicalSetIds.Contains(x.TrialClinicalDataSetId)).Select(x => x.TrialReadingCriterionId).Distinct().ToListAsync(); // 标准 var criterionNameList = await _dbContext.ReadingQuestionCriterionTrial.Where(t => trialReadingCriterionIdList.Contains(t.Id)).OrderBy(t => t.ShowOrder).Select(t => t.CriterionName).ToListAsync(); subject = await _dbContext.Subject.Where(x => x.Id == entity.SubjectId).FirstOrDefaultAsync(); siteInfo = await _dbContext.TrialSite.Where(x => x.Id == subject.TrialSiteId).FirstOrDefaultAsync(); var clinicalDataSetNameList = clinicalDataTrialSetList.Select(x => x.ClinicalDataSetName).ToList().Distinct(); objData = new { SiteCode = siteInfo == null ? "" : siteInfo.TrialSiteCode, SubjectCode = subject == null ? "" : subject.Code, LatestScanDate = latestScanDate, ClinicalDataSetName = string.Join(",", clinicalDataSetNameList), ClinicalDataLevel = clinicalDataTrialSetList.Select(x => x.ClinicalDataLevel).FirstOrDefault(), ClinicalUploadType = clinicalDataTrialSetList.Select(x => x.ClinicalUploadType).FirstOrDefault(), CriterionNames = string.Join(",", criterionNameList.Distinct()), RecordNumber = clinicalFormIds.Count(), Status = status, }; } await InsertInspection(item.Entity as ReadModule, type, x => new InspectionConvertDTO() { ObjectRelationParentId = entity.SubjectVisitId, ObjectRelationParentId2 = entity.TrialReadingCriterionId, ExtraIndentification = extraIndentification, //SubjectVisitId = x.SubjectVisitId, IsDistinctionInterface = false, }, objData); } #endregion #region 阅片 //用户添加 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(UserRole))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as UserRole; var extraIdentification = string.Empty; //保存其他个性化配置 if (_userInfo.RequestUrl == "UserWLTemplate/setAutoCutNextTask") { extraIdentification = "/Personalization"; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ExtraIndentification = extraIdentification }, new { UserRealName = entity.FullName, } ); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(IdentityUser))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as IdentityUser; var extraIdentification = string.Empty; //保存其他个性化配置 if (_userInfo.RequestUrl == "UserWLTemplate/setAutoCutNextTask") { extraIdentification = "/Personalization"; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ExtraIndentification = extraIdentification }, new { UserRealName = entity.FullName, } ); } //分配规则 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TaskAllocationRule))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TaskAllocationRule; var userRealName = await _dbContext.User.Where(x => x.Id == entity.DoctorUserId).Select(x => x.FullName).FirstOrDefaultAsync(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = entity.EnrollId, ObjectRelationParentId2 = entity.DoctorUserId }, new { UserRealName = userRealName }); } // suject 医生绑定关系 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectUser))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as SubjectUser; await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = false, ObjectRelationParentId = entity.SubjectId, ObjectRelationParentId2 = entity.DoctorUserId, ObjectRelationParentId3 = entity.TrialReadingCriterionId, }, new { ArmToTask = entity.ArmEnum }); } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(SubjectCanceDoctor))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as SubjectCanceDoctor; await InsertInspection(entity, type, x => new InspectionConvertDTO() { ObjectRelationParentId = entity.SubjectId, ObjectRelationParentId3 = entity.TrialReadingCriterionId, }, new { }); } //申请重阅记录表 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(VisitTaskReReading))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as VisitTaskReReading; var extraIdentification = string.Empty; var reason = entity.RequestReReadingReason; switch (_userInfo.RequestUrl) { case "VisitTask/applyReReading": extraIdentification = "/" + (int)entity.RequestReReadingType; break; case "VisitTask/ConfirmReReading": if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM) { extraIdentification = "/" + 1; } else { extraIdentification = "/" + 2; } reason = entity.RequestReReadingRejectReason; if (entity.RequestReReadingResultEnum == RequestReReadingResult.Agree) { extraIdentification = extraIdentification + "/" + 1; } else if (entity.RequestReReadingResultEnum == RequestReReadingResult.Reject) { extraIdentification = extraIdentification + "/" + 2; } break; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { VisitTaskId = entity.OriginalReReadingTaskId, Reason = reason, ObjectRelationParentId = entity.OriginalReReadingTaskId, ExtraIndentification = extraIdentification, }); } //一致性分析规则 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(TaskConsistentRule))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as TaskConsistentRule; var extraIdentification = string.Empty; //自身一致性分析 if (entity.IsSelfAnalysis == true) { extraIdentification = "/" + 1; } //组件一致性分析 else { extraIdentification = "/" + 2; } await InsertInspection(entity, type, x => new InspectionConvertDTO() { IsDistinctionInterface = true, ObjectRelationParentId = entity.TrialId, ObjectRelationParentId2 = entity.TrialReadingCriterionId, ExtraIndentification = extraIdentification, }); } #endregion #region 阅片结果 #region 暂时不区分标准 //保存影像质量 多条记录,只记录一条稽查 if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingTaskQuestionAnswer))) { //判断是否不需要记录稽查 if (_userInfo.IsNotNeedInspection) { _userInfo.IsNotNeedInspection = false; } else { // 保存影像质量 、 修改整体肿瘤评估结果 、 非dicom 保存访视阅片结果 、附加评估 if (_userInfo.RequestUrl == "ReadingImageTask/changeDicomReadingQuestionAnswer" || _userInfo.RequestUrl == "ReadingImageTask/saveImageQuality" || _userInfo.RequestUrl.Contains("SaveTaskQuestion") || _userInfo.RequestUrl == "ReadingImageTask/saveVisitTaskQuestions" || _userInfo.RequestUrl == "ReadingImageTask/changeCalculationAnswer" || _userInfo.RequestUrl == "ReadingImageTask/submitTaskAdditionalQuestion") { var type = AuditOpt.Add; List unitDataList = (await _dbContext.Dictionary.Where(x => x.Parent.Code == "ValueUnit").Where(x => x.Code != "0").ToListAsync()).Select(x => new UnitData() { Unit = (ValueUnit)int.Parse(x.Code), UnitName = x.Value.ToString(), }).ToList(); var extraIdentification = string.Empty; //具体的答案 var taskQuestionAnswerList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTaskQuestionAnswer)).Select(t => t.Entity as ReadingTaskQuestionAnswer).ToList(); //获取问题名称 组合成数组 var quesionList = await _dbContext.ReadingQuestionTrial.Where(t => taskQuestionAnswerList.Select(k => k.ReadingQuestionTrialId).Contains(t.Id)).IgnoreQueryFilters().Select(t => new { QuestionName = t.QuestionName, t.QuestionEnName, QuestionId = t.Id, t.DictionaryCode, t.Unit, t.ShowOrder, AnswerType = t.Type, }).OrderBy(t => t.ShowOrder).ToListAsync(); var firstEntity = taskQuestionAnswerList.First(); var cloneEntity = firstEntity.Clone(); //保证Id 唯一 cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.ReadingQuestionCriterionTrialId.ToString(), firstEntity.ReadingQuestionTrialId.ToString(), firstEntity.VisitTaskId.ToString()); dynamic tableQuesionAndAnswerList = null; //自定义特有标识 if (await _dbContext.ReadingQuestionCriterionTrial.AnyAsync(t => t.Id == firstEntity.ReadingQuestionCriterionTrialId && t.CriterionType == CriterionType.SelfDefine)) { extraIdentification = "/Self"; //还会把病灶问题答案更新 var tableQuestionAnswerList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer)).Select(t => t.Entity as ReadingTableQuestionAnswer).ToList(); //获取表格问题名称 组合成数组 var tableQuesionList = await _dbContext.ReadingTableQuestionTrial.Where(t => tableQuestionAnswerList.Select(k => k.TableQuestionId).Contains(t.Id)).Select(t => new { TrialReadingCriterionId = t.ReadingQuestionTrial.ReadingQuestionCriterionTrialId, //标准Id Type = t.ReadingQuestionTrial.QuestionName, //病灶类型 t.ReadingQuestionTrial.Unit, t.ReadingQuestionTrial.CustomUnit, t.DictionaryCode, t.QuestionName, t.QuestionEnName, QuestionId = t.Id, t.ShowOrder, AnswerType = t.Type, }) .OrderBy(t => t.ShowOrder).ToListAsync(); tableQuesionAndAnswerList = tableQuestionAnswerList.Join(tableQuesionList, t => t.TableQuestionId, u => u.QuestionId, (t, u) => new { //如果问题类型是附件 特殊处理 方便前端解析 Answer = u.AnswerType == "upload" ? "❄❅❆❇❈❉❊" + t.Answer : t.Answer, u.QuestionName, u.QuestionEnName, u.DictionaryCode, u.ShowOrder, t.RowId } ).OrderBy(t => t.RowId).ThenBy(t => t.ShowOrder).ToList(); } await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO() { VisitTaskId = x.VisitTaskId, ObjectRelationParentId = x.VisitTaskId, TrialReadingCriterionId = x.ReadingQuestionCriterionTrialId, ExtraIndentification = extraIdentification, }, new { QuestionAnswerList = taskQuestionAnswerList.Join(quesionList, t => t.ReadingQuestionTrialId, u => u.QuestionId, (t, u) => new { Answer = u.AnswerType == "upload" ? "❄❅❆❇❈❉❊" + t.Answer : t.Answer + unitDataList.Where(y => y.Unit == u.Unit).Select(x => x.UnitName).FirstIsNullReturnEmpty() , u.DictionaryCode, u.QuestionName, u.QuestionEnName, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList() , TableQuestionAndAnswerList = tableQuesionAndAnswerList } ); } } } foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingTaskQuestionMark))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingTaskQuestionMark; var answer = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer)).Select(x => x.Entity as ReadingTableQuestionAnswer) .Where(x => x.RowId == entity.RowId && x.TableQuestionId == entity.TableQuestionId).Select(x => x.Answer).FirstOrDefault(); var liverSegmentation = await _dbContext.ReadingTableQuestionAnswer.Where(x => x.RowId == entity.RowId && x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.liverSegmentation).Select(x => x.Answer).FirstOrDefaultAsync(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { VisitTaskId = entity.VisitTaskId, ObjectRelationParentId = entity.VisitTaskId, }, new { Answer = answer, LiverSegmentation = liverSegmentation, }); } //病灶这里操作 ReadingTableAnswerRowInfo ReadingTableQuestionAnswer foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableAnswerRowInfo))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as ReadingTableAnswerRowInfo; var tableQuestionAnswerList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer)).Select(t => t.Entity as ReadingTableQuestionAnswer).Where(t => t.RowId == entity.Id).ToList(); List unitDataList = (await _dbContext.Dictionary.Where(x => x.Parent.Code == "ValueUnit").Where(x => x.Code != "0").ToListAsync()).Select(x => new UnitData() { Unit = (ValueUnit)int.Parse(x.Code), }).ToList(); //获取表格问题名称 组合成数组 var tableQuesionList = await _dbContext.ReadingTableQuestionTrial.Where(t => tableQuestionAnswerList.Select(k => k.TableQuestionId).Contains(t.Id)).Select(t => new { TrialReadingCriterionId = t.ReadingQuestionTrial.ReadingQuestionCriterionTrialId, //标准Id Type = t.ReadingQuestionTrial.QuestionName, //病灶类型 t.ReadingQuestionTrial.Unit, t.ReadingQuestionTrial.CustomUnit, t.DictionaryCode, t.QuestionName, t.QuestionEnName, QuestionId = t.Id, t.ShowOrder, AnswerType = t.Type, }) .OrderBy(t => t.ShowOrder).ToListAsync(); var trialReadingCriterionId = tableQuesionList.FirstOrDefault()?.TrialReadingCriterionId; //获取表名称 类型名称(病灶类型) 不用查 从项目问题的稽查记录里面去取 //var tableName = await _dbContext.ReadingQuestionTrial.Where(t => t.Id == entity.QuestionId).Select(t => t.QuestionName).FirstOrDefaultAsync(); //分裂病灶 需要原病灶的标识 //if (_userInfo.RequestUrl == " ReadingImageTask/splitLesion") var originalRowMark = string.Empty; if (entity.SplitRowId != null) { originalRowMark = await _dbContext.ReadingTableAnswerRowInfo.Where(t => t.Id == entity.SplitRowId).Select(t => t.RowMark).FirstOrDefaultAsync(); } //处理标识 因为触发器在稽查后才进行操作 if (entity.OrderMark == string.Empty) { entity.OrderMark = await _dbContext.ReadingQuestionTrial.Where(x => x.Id == entity.QuestionId).Select(x => x.OrderMark).FirstOrDefaultAsync(); } entity.RowMark = entity.OrderMark + entity.RowIndex.GetLesionMark(); await InsertInspection(entity, type, x => new InspectionConvertDTO() { VisitTaskId = x.VisitTaskId, ObjectRelationParentId = x.VisitTaskId, TrialReadingCriterionId = trialReadingCriterionId, ObjectRelationParentId2 = x.QuestionId }, new { OriginalRowMark = originalRowMark, //TableName = tableName, QuestionAnswerList = //需要手动添加病灶类型 tableQuestionAnswerList.Join(tableQuesionList, t => t.TableQuestionId, u => u.QuestionId, (t, u) => new { //如果问题类型是附件 特殊处理 方便前端解析 Answer = u.AnswerType == "upload" ? "❄❅❆❇❈❉❊" + t.Answer : t.Answer + unitDataList.Where(y => y.Unit == u.Unit).Select(x => x.UnitName).FirstIsNullReturnEmpty(), //t.Answer /*u.Unit==ValueUnit.Custom? t.Answer+u.CustomUnit:(u.Unit != ValueUnit.None|| u.Unit != null)*/, u.QuestionName, u.QuestionEnName, u.DictionaryCode, u.ShowOrder } ).OrderBy(t => t.ShowOrder).ToList() }, _userInfo.AuditIdentification); ////添加/修改病灶接口 只会对单个病灶进行操作 //if (_userInfo.RequestUrl == "ReadingImageTask/submitTableQuestion") //{ //} ////删除病灶接口 里面也有更新 //if (_userInfo.RequestUrl == "ReadingImageTask/deleteReadingRowAnswer") //{ // //有删除 有修改 多条稽查记录 // var deleteList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer) && GetEntityAuditOpt(x) == AuditOpt.Deleted).Select(t => t.Entity as ReadingTableQuestionAnswer).ToList(); // var updateList = entitys.Where(x => x.Entity.GetType() == typeof(ReadingTableQuestionAnswer) && GetEntityAuditOpt(x) == AuditOpt.Update).Select(t => t.Entity as ReadingTableQuestionAnswer).ToList(); //} } #endregion #region 肿瘤学阅片结果 记录表格 废弃 //if (entitys.Any(x => x.entity.gettype() == typeof(readingoncologytaskinfo))) //{ // var type = auditopt.add; // var oncologyanswerlist = entitys.where(x => x.entity.gettype() == typeof(readingoncologytaskinfo)).select(t => t.entity as readingoncologytaskinfo); // var visittaskidlist = oncologyanswerlist.select(t => t.visittaskid).tolist(); // var visittasklist = await _dbcontext.visittask.where(t => visittaskidlist.contains(t.id)).select(t => new { visittaskid = t.id, t.taskname, t.taskblindname, t.visittasknum, t.subjectid }).tolistasync(); // var modifyvisitlist = await _dbcontext.readingglobaltaskinfo.where(t => visittaskidlist.contains(t.taskid) && t.visittask.taskstate == taskstate.effect).groupby(t => t.taskid).select(g => new // { // visittaskid = g.key, // globalresult = g.select(c => new { c.answer, c.questionid }) // }).tolistasync(); // //var oncologyanswervisitlist = visittasklist.join(oncologyanswerlist, t => t.visittaskid, u => u.visittaskid, (t, u) => new { t.visittaskid, t.taskblindname, t.taskname, u.evaluationreason, u.evaluationresult }).tolist(); // var query = from answer in oncologyanswerlist // join visittask in visittasklist on answer.visittaskid equals visittask.visittaskid // join modifyvisit in modifyvisitlist on answer.visittaskid equals modifyvisit.visittaskid into cc // from modifyvisit in cc.defaultifempty() // select new // { // visittask.taskblindname, // visittask.taskname, // answer.evaluationreason, // answer.evaluationresult, // isglobalmodify = modifyvisit != null, // reason = modifyvisit != null ? modifyvisit.globalresult.where(t => t.questionid == null).firstordefault()?.answer : string.empty // }; // var result = query.tolist(); // var oncologyanswer = oncologyanswerlist.first(); // var cloneentity = oncologyanswer.clone(); // cloneentity.id = newid.nextguid(); // await insertinspection(oncologyanswer, type, x => new inspectionconvertdto() // { // visittaskid = oncologyanswer.visittaskid, // objectrelationparentid = oncologyanswer.visittaskid, // }, new { oncologyanswerlist = result }); //} #endregion // 全局 阅片结果 if (entitys.Any(x => x.Entity.GetType() == typeof(ReadingGlobalTaskInfo))) { var type = AuditOpt.Add; var list = entitys.Where(x => x.Entity.GetType() == typeof(ReadingGlobalTaskInfo)).Select(t => t.Entity as ReadingGlobalTaskInfo); //不是固定问题的问题 var firstEntity = list.First(); var cloneEntity = firstEntity.Clone(); var criterion = await _dbContext.VisitTask.Where(t => t.Id == cloneEntity.GlobalTaskId).Select(t => new { t.TrialReadingCriterionId, t.TrialReadingCriterion.CriterionType }).FirstOrDefaultAsync(); //保证Id 唯一 cloneEntity.Id = IdentifierHelper.CreateGuid(firstEntity.GlobalTaskId.ToString(), criterion.TrialReadingCriterionId.ToString()); var extraIdentification = string.Empty; var objList = new List(); foreach (var group in list.GroupBy(t => t.TaskId)) { var questionAnswerList = group.Where(t => t.QuestionId != null).ToList(); var questionIdList = questionAnswerList.Select(t => t.QuestionId).ToList(); var quesionList = await _dbContext.ReadingQuestionTrial.Where(t => questionIdList.Contains(t.Id)).Select(t => new { QuestionName = t.QuestionName, t.QuestionEnName, QuestionId = t.Id, t.DictionaryCode, t.ShowOrder }).OrderBy(t => t.ShowOrder).ToListAsync(); //pcwg3 的问题没有提交过来,是通过固定的方式去查询出来 if (criterion.CriterionType == CriterionType.PCWG3) { extraIdentification = "/PCWG3"; //获取访视的评估结果 也要记录稽查 var visitAnswerList = await _dbContext.ReadingTaskQuestionAnswer.Where(t => t.VisitTaskId == group.Key && t.ReadingQuestionTrial.GlobalReadingShowType != GlobalReadingShowType.NotShow).Select(u => new { TaskBlindName = u.VisitTask.TaskBlindName, QuestionId = u.ReadingQuestionTrialId, QuestionName = u.ReadingQuestionTrial.QuestionName, u.ReadingQuestionTrial.QuestionEnName, u.ReadingQuestionTrial.DictionaryCode, u.ReadingQuestionTrial.ShowOrder, u.Answer }).OrderBy(t => t.ShowOrder).ToListAsync(); var obj = new { TaskBlindName = visitAnswerList.Select(t => t.TaskBlindName).FirstOrDefault(), VisitQuestionAnswerList = visitAnswerList, Reason = group.Where(t => t.QuestionId == null && t.GlobalAnswerType == GlobalAnswerType.Reason).FirstOrDefault()?.Answer, QuestionAnswerList = questionAnswerList.Join(quesionList, t => t.QuestionId, u => u.QuestionId, (t, u) => new { t.Answer, u.QuestionName, u.QuestionEnName, u.DictionaryCode, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList() }; objList.Add(obj); } else { //获取访视的评估结果 也要记录稽查 var visitAnswerList = await _dbContext.ReadingTaskQuestionAnswer.Where(t => t.VisitTaskId == group.Key && questionIdList.Contains(t.ReadingQuestionTrialId)).Select(u => new { TaskBlindName = u.VisitTask.TaskBlindName, QuestionId = u.ReadingQuestionTrialId, u.Answer }).ToListAsync(); var obj = new { TaskBlindName = visitAnswerList.Select(t => t.TaskBlindName).FirstOrDefault(), VisitQuestionAnswerList = visitAnswerList.Join(quesionList, t => t.QuestionId, u => u.QuestionId, (t, u) => new { t.Answer, u.QuestionName, u.DictionaryCode, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList(), Reason = group.Where(t => t.QuestionId == null && t.GlobalAnswerType == GlobalAnswerType.Reason).FirstOrDefault()?.Answer, AgreeOrNot = group.Where(t => t.QuestionId == null && t.GlobalAnswerType == GlobalAnswerType.AgreeOrNot).FirstOrDefault()?.Answer, UpdateType = group.Where(t => t.QuestionId == null && t.GlobalAnswerType == GlobalAnswerType.UpdateType).FirstOrDefault()?.Answer, QuestionAnswerList = questionAnswerList.Join(quesionList, t => t.QuestionId, u => u.QuestionId, (t, u) => new { t.Answer, u.QuestionName, u.QuestionEnName, u.DictionaryCode, u.ShowOrder }).OrderBy(t => t.ShowOrder).ToList() }; objList.Add(obj); } } await InsertInspection(cloneEntity, type, x => new InspectionConvertDTO() { VisitTaskId = x.GlobalTaskId, TrialReadingCriterionId = criterion.TrialReadingCriterionId, ObjectRelationParentId = x.TaskId, ExtraIndentification = extraIdentification }, new { GlobalAnswerList = objList }); } //肿瘤学阅片结果 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(ReadingOncologyTaskInfo))) { var type = AuditOpt.Add; var entity = item.Entity as ReadingOncologyTaskInfo; await InsertInspection(entity, type, x => new InspectionConvertDTO() { VisitTaskId = entity.VisitTaskId, ObjectRelationParentId = entity.VisitTaskId, }); } #endregion //任务 foreach (var item in entitys.Where(x => x.Entity.GetType() == typeof(VisitTask))) { var type = GetEntityAuditOpt(item); var entity = item.Entity as VisitTask; var userRealName = await _dbContext.User.Where(x => x.Id == entity.DoctorUserId).Select(x => x.FullName).FirstOrDefaultAsync(); VisitTaskAuditingDto obj = new VisitTaskAuditingDto() { UserRealName = userRealName, }; var extraIdentification = string.Empty; var isDistinctionInterface = true; #region 标识区分 if (type == AuditOpt.Add) { isDistinctionInterface = false; //生成一致性分析任务 if (entity.IsSelfAnalysis == true) { extraIdentification = "/SelfAnalysis"; } else if (entity.IsSelfAnalysis == false) { extraIdentification = "/GroupAnalysis"; } else { extraIdentification = "/NotAnalysis"; } //区分任务类型 extraIdentification = extraIdentification + "/" + (int)entity.ReadingCategory; } else { switch (_userInfo.RequestUrl) { //申请重阅 case "VisitTask/applyReReading": extraIdentification = "/" + (int)entity.ReReadingApplyState; //PM 申请重阅,区分不了是否有SPM参与 if (entity.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed) { //var hasSPM = _dbContext.VisitTaskReReading.Any(t => t.OriginalReReadingTaskId == entity.Id); var hasSPM = entitys.Where(x => x.Entity.GetType() == typeof(VisitTaskReReading)) .Select(t => t.Entity as VisitTaskReReading).Any(t => t.OriginalReReadingTaskId == entity.Id); if (!hasSPM) { //有SPM 是5 没有SPM是6 extraIdentification = "/" + 6; } } break; //同意重阅 case "VisitTask/ConfirmReReading": if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM) { extraIdentification = "/" + 1; } else { extraIdentification = "/" + 2; } break; case "VisitTask/PMSetTaskBack": if (entity.PMBackReason.IsNotNullOrEmpty()) { extraIdentification = "/" + "Reason"; } break; case "ReadingImageTask/SubmitVisitTaskQuestions": //访视任务-- 非Dicom 阅片 if (entity.ReadingTaskState != ReadingTaskState.HaveSigned) { //提交访视任务的时候 会多次更新同一个记录 只记录最后一次 return; } break; //Dicom 阅片 签名 case "ReadingImageTask/SubmitDicomVisitTask": //跳转阅片结果需要该参数 var subjectCode = _dbContext.Subject.Where(t => t.Id == entity.SubjectId).Select(t => t.Code).First(); obj.SubjectCode = subjectCode; break; case "ReadingImageTask/resetReadingTask": //跳转阅片结果需要该参数 obj.IsReadingReset = true; break; } #region 裁判、肿瘤学、全局 都是通用的 //裁判任务 结果的保存 和签名提交 if (entity.JudgeResultTaskId != null && (_userInfo.RequestUrl == "ReadingImageTask/SaveJudgeVisitTaskResult" || _userInfo.RequestUrl == "ReadingImageTask/SubmitJudgeVisitTaskResult")) { var visitTaskNum = entity.VisitTaskNum - ReadingCommon.TaskNumDic[ReadingCategory.Judge]; var list = await _dbContext.VisitTask.Where(t => t.TaskState == TaskState.Effect && t.SubjectId == entity.SubjectId && t.VisitTaskNum == visitTaskNum && t.JudgeVisitTaskId == entity.Id && t.TrialReadingCriterionId == entity.TrialReadingCriterionId).Select(t => new { t.Id, t.DoctorUser.FullName, t.ArmEnum }).OrderBy(t => t.ArmEnum).ToListAsync(); var r1 = list.Where(t => t.ArmEnum == Arm.DoubleReadingArm1).FirstOrDefault(); var r2 = list.Where(t => t.ArmEnum == Arm.DoubleReadingArm2).FirstOrDefault(); obj.R1 = r1.FullName; obj.R2 = r2.FullName; obj.SelectResult = r1.Id == entity.JudgeResultTaskId ? "R1" : "R2"; } #endregion //增加进入阅片中的稽查 //重置阅片也会从待阅片 变为阅片中,因为复制病灶依赖这个改变 if (obj.IsReadingReset != true) { if (entity.ReadingTaskState == ReadingTaskState.Reading) { if (_dbContext.VisitTask.Where(t => t.Id == entity.Id).Any(t => t.ReadingTaskState == ReadingTaskState.WaitReading)) { isDistinctionInterface = false; extraIdentification = "/ChangeToReading"; } } } if (entity.IsReadClinicalData == true) { if (_dbContext.VisitTask.Where(t => t.Id == entity.Id).Any(t => t.IsReadClinicalData == false)) { isDistinctionInterface = false; extraIdentification = "/ReadClinicalData"; } } if(entity.TaskBlindName.Contains("Timepoint Ran")) { if(_dbContext.VisitTask.Where(t => t.Id == entity.Id).Any(t => !t.TaskBlindName.Contains("Timepoint Ran"))) { isDistinctionInterface = false; extraIdentification = "/TriggerSystemBlindingName"; } } } #region 通过链接跳转 2022 12-19 ////肿瘤学任务 //if (entity.ReadingTaskState == ReadingTaskState.HaveSigned && _userInfo.RequestUrl == "ReadingImageTask/SubmitOncologyReadingInfo") //{ // var oncologyAnswerList = await _dbContext.ReadingOncologyTaskInfo.Where(t => t.OncologyTaskId == entity.Id).Select(t => new { t.VisitTask.TaskBlindName, t.VisitTask.TaskName, t.EvaluationReason, t.EvaluationResult, t.VisitTask.VisitTaskNum, VisitTaskId = t.VisitTask.Id }).ToListAsync(); // var golbalTaskInfo = await _dbContext.VisitTask.Where(t => t.SubjectId == entity.SubjectId && t.ReadingCategory == ReadingCategory.Global && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == entity.IsAnalysisCreate && t.VisitTaskNum == (entity.VisitTaskNum - ReadingCommon.TaskNumDic[ReadingCategory.Oncology] + ReadingCommon.TaskNumDic[ReadingCategory.Global])).Select(t => new { GlobalTaskId = t.Id }).FirstNotNullAsync(); // var globalResultList = await _dbContext.ReadingGlobalTaskInfo.Where(t => t.GlobalTaskId == golbalTaskInfo.GlobalTaskId).ToListAsync(); // var modifyVisitList = globalResultList // .GroupBy(t => t.TaskId).Select(g => new // { // VisitTaskId = g.Key, // GlobalResult = g.Select(c => new { c.Answer, c.QuestionId }) // }).ToList(); // var query = from answer in oncologyAnswerList // join modifyVisit in modifyVisitList on answer.VisitTaskId equals modifyVisit.VisitTaskId into cc // from modifyVisit in cc.DefaultIfEmpty() // select new // { // answer.TaskBlindName, // answer.TaskName, // answer.EvaluationReason, // answer.EvaluationResult, // IsGlobalModify = modifyVisit != null, // Reason = modifyVisit != null ? modifyVisit.GlobalResult.Where(t => t.QuestionId == null).FirstOrDefault()?.Answer : String.Empty // }; // var result = query.ToList(); // obj = new { OncologyAnswerList = result }; //} ////全局任务 //if (entity.ReadingTaskState == ReadingTaskState.HaveSigned && _userInfo.RequestUrl == "ReadingImageTask/SubmitGlobalReadingInfo") //{ // var globalResultList = await _dbContext.ReadingGlobalTaskInfo.Where(t => t.GlobalTaskId == entity.Id).Select(t => new { VisitTaskId = t.TaskId, t.QuestionId, t.Answer, t.VisitTask.TaskBlindName, t.VisitTask.TaskName, t.TrialReadingQuestion.QuestionName }).ToListAsync(); // var visitTaskIdList = globalResultList.Select(t => t.VisitTaskId).ToList(); // var visitResultList = await _dbContext.ReadingTaskQuestionAnswer.Where(t => visitTaskIdList.Contains(t.VisitTaskId) && t.ReadingQuestionTrial.IsJudgeQuestion).Select(t => new { t.VisitTaskId, t.VisitTask.TaskBlindName, t.VisitTask.TaskName, t.VisitTask.VisitTaskNum, t.ReadingQuestionTrial.QuestionName, t.ReadingQuestionTrial.ShowOrder, t.Answer, t.ReadingQuestionTrialId }) // .OrderBy(t => t.VisitTaskNum).ToListAsync(); // var query = visitResultList.GroupBy(t => new { t.VisitTaskId, t.VisitTaskNum, t.TaskName, t.TaskBlindName }).Select(g => new // { // VisitTaskId = g.Key.VisitTaskId, // VisitTaskNum = g.Key.VisitTaskNum, // TaskName = g.Key.TaskName, // TaskBlindName = g.Key.TaskBlindName, // VisitQuestionAnswerList = g.OrderBy(t => t.ShowOrder).Select(u => new { u.QuestionName, u.Answer }).ToList(), // GlobalQuestionAnswerList = g.OrderBy(t => t.ShowOrder).Select(u => new { u.QuestionName, Answer = globalResultList.Where(t => t.VisitTaskId == g.Key.VisitTaskId && t.QuestionId == u.ReadingQuestionTrialId).FirstOrDefault()?.Answer ?? String.Empty }).ToList(), // Reason = globalResultList.Where(t => t.VisitTaskId == g.Key.VisitTaskId && t.QuestionId == null).FirstOrDefault()?.Answer ?? String.Empty // }); // var result = query.ToList(); // obj = new { GlobalAnswerList = result }; //} #endregion #endregion if (entity.SouceReadModuleId != null) { var subjectVisitId = await _dbContext.ReadModule.Where(x => x.Id == entity.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync(); obj.CutOffVisitName = await _dbContext.SubjectVisit.Where(x => x.Id == subjectVisitId).Select(x => x.BlindName).FirstOrDefaultAsync(); } await InsertInspection(entity, type, x => new InspectionConvertDTO() { VisitTaskId = x.Id, IsDistinctionInterface = isDistinctionInterface, ExtraIndentification = extraIdentification, ObjectRelationParentId = entity.SourceSubjectVisitId != null ? entity.SourceSubjectVisitId : entity.SouceReadModuleId, ObjectRelationParentId2 = entity.DoctorUserId, ObjectRelationParentId3 = entity.TrialReadingCriterionId, }, obj); } #endregion } /// /// 插入稽查实体 /// /// 泛型 /// 数据 /// 类型 /// 表达式 /// 其他对象 /// public async Task InsertInspection(T entityObj, string type, Expression> expression = null, object otherItem = null, string auditIdentification = "") where T : Entity { InspectionConvertDTO inspection = new InspectionConvertDTO(); if (expression != null) { var f = expression.Compile(); inspection = f(entityObj); } //避免重复赋值 有些特殊的GeneralId var generalId = (inspection.GeneralId != null && inspection.GeneralId != Guid.Empty) ? inspection.GeneralId : entityObj.Id; inspection.GeneralId = generalId; inspection.Identification = GetInspectionRecordIdentification(entityObj, type, inspection.IsDistinctionInterface, inspection.IsSelfDefine, auditIdentification) + inspection.ExtraIndentification; //将实体对象属性 映射到稽查实体 MapEntityPropertyToAuditEntity(entityObj, inspection); //var generalData = await GetInspectionGeneralDataAsync(inspection); var generalData = await GetInspectionGeneralGuidAsync(inspection); //不可少 因为稽查实体可能某些Id没有 MapEntityPropertyToAuditEntity(generalData, inspection); #region 处理标识 var from = await _dbContext.FrontAuditConfig.FirstOrDefaultAsync(x => x.Identification == inspection.Identification); inspection.ObjectTypeId = from?.ObjectTypeId; inspection.OptTypeId = from?.OptTypeId; //inspection.ChildrenTypeId = from?.ChildrenTypeId; inspection.ModuleTypeId = from?.ModuleTypeId; #endregion inspection.CreateUserName = _userInfo.UserName; inspection.CreateUserRealName = _userInfo.FullName; inspection.RoleName = _userInfo.UserTypeShortName; inspection.CreateUserId = _userInfo.UserRoleId; inspection.IP = _userInfo.IP; inspection.CreateTime = inspection.CreateTime == default(DateTime) ? DateTime.Now : inspection.CreateTime; if (_userInfo.SignId != null) { inspection.SignId = _userInfo.SignId; inspection.IsSign = true; } var entityName = entityObj.GetType().Name; inspection.JsonDetail = new InspectionJsonDetail { //稽查实体,加上扩充的信息 //Data = AddJsonItem(entityObj, otherItem), //通用信息 每条稽查必须记录的 //CommonData = generalData EntityName = entityName, //Data 仅仅记录稽查实体的信息 CommonData 存放关联数据的信息(特殊情况下会单独赋值) //后期通过关联 就不需要把 OtherItem 并入到Data中 Data = AddJsonItem(entityObj, otherItem), //准确来讲 此处称之为 RelationData 更贴合 为了兼容之前的数据 CommonData = new { SiteCode = generalData.SiteCode, SubjectCode = generalData.SubjectCode }, }.ToJsonStr(); inspection.BatchId = _userInfo.BatchId.Value; inspection.EntityName = entityName; await _dbContext.DataInspection.AddAsync(inspection); //await AddInspectionRecordAsync( entityObj, inspection, otherItem); } /// /// 将数据库实体属性,映射到稽查实体属性 避免重复赋值 /// /// /// public void MapEntityPropertyToAuditEntity(object data, DataInspection auditEntity) { foreach (var auditEntityPropertyInfo in auditEntity.GetType().GetProperties()) { var excepetNameList = typeof(Entity).GetProperties().Select(t => t.Name) .Concat(typeof(ISoftDelete).GetProperties().Select(t => t.Name)) .Concat(typeof(IAuditAdd<>).GetProperties().Select(t => t.Name)) .Concat(typeof(IAuditUpdate<>).GetProperties().Select(t => t.Name)); var filterProperties = data.GetType().GetProperties().Where(t => !excepetNameList.Any(u => u == t.Name)); if (filterProperties.Any(t => t.Name == auditEntityPropertyInfo.Name)) { var value = data.GetType().GetProperty(auditEntityPropertyInfo.Name).GetValue(data); auditEntity.GetType().GetProperty(auditEntityPropertyInfo.Name).SetValue(auditEntity, value); } } } /// /// 获取稽查通用Guid数据 (每条稽查记录必须查询的) /// /// /// public async Task GetInspectionGeneralGuidAsync(InspectionConvertDTO inspection) { InspectionGeneralData generalData = new InspectionGeneralData() { TrialSiteId = inspection.TrialSiteId, SubjectId = inspection.SubjectId, SubjectVisitId = inspection.SubjectVisitId, TrialId = inspection.TrialId, TrialReadingCriterionId = inspection.TrialReadingCriterionId }; if (inspection.VisitTaskId != null) { if (generalData.TrialId == null || generalData.TrialSiteId == null || generalData.SubjectId == null || generalData.TrialReadingCriterionId == null) { var info = await _dbContext.VisitTask.Where(x => x.Id == inspection.VisitTaskId).Select(x => new { SubjectCode = x.Subject.Code, TrialSiteCode = x.Subject.TrialSite.TrialSiteCode, SubjectId = x.SubjectId, x.Subject.TrialSiteId, x.TrialId, x.SourceSubjectVisitId, ReadModuleSubjectVisitId = (Guid?)x.ReadModule.SubjectVisitId, x.TrialReadingCriterionId }).FirstOrDefaultAsync(); generalData.TrialReadingCriterionId = info?.TrialReadingCriterionId ?? generalData.TrialReadingCriterionId; generalData.TrialId = info?.TrialId ?? generalData.TrialId; generalData.SubjectId = info?.SubjectId ?? generalData.SubjectId; generalData.TrialSiteId = info?.TrialSiteId ?? generalData.TrialSiteId; generalData.SubjectVisitId = info?.SourceSubjectVisitId != null ? info?.SourceSubjectVisitId : (info?.ReadModuleSubjectVisitId != null ? info?.ReadModuleSubjectVisitId : null); //以后移除 generalData.SiteCode = info?.TrialSiteCode ?? generalData.SiteCode; generalData.SubjectCode = info?.SubjectCode ?? generalData.SubjectCode; } } if (inspection.TrialReadingCriterionId != null) { if (generalData.TrialId == null) { var info = await _dbContext.ReadingQuestionCriterionTrial.Where(x => x.Id == inspection.TrialReadingCriterionId).Select(x => new { x.TrialId }).FirstOrDefaultAsync(); generalData.TrialId = info?.TrialId ?? generalData.TrialId; } } // Suject visit 都进行了设置 不用处理 if (inspection.SubjectVisitId != null) { if (generalData.TrialId == null || generalData.TrialSiteId == null || generalData.SubjectId == null) { var info = await _dbContext.SubjectVisit.Where(x => x.Id == generalData.SubjectVisitId).Select(x => new { x.SubjectId, x.TrialSiteId, x.TrialId, SubjectCode = x.Subject.Code, TrialSiteCode = x.Subject.TrialSite.TrialSiteCode }).FirstOrDefaultAsync(); generalData.TrialId = info?.TrialId ?? generalData.TrialId; generalData.TrialSiteId = info?.TrialSiteId ?? generalData.TrialSiteId; generalData.SubjectId = info?.SubjectId ?? generalData.SubjectId; //以后移除 generalData.SiteCode = info?.TrialSiteCode ?? generalData.SiteCode; generalData.SubjectCode = info?.SubjectCode ?? generalData.SubjectCode; } } if (generalData.SubjectId != null) { if (generalData.TrialId == null || generalData.TrialSiteId == null) { var info = await _dbContext.Subject.Where(x => x.Id == generalData.SubjectId).Select(x => new { SubjectId = x.Id, x.TrialSiteId, x.TrialId, SubjectCode = x.Code, TrialSiteCode = x.TrialSite.TrialSiteCode }).FirstOrDefaultAsync(); if (info == null) { var subject = _dbContext.Subject.Find(generalData.SubjectId); generalData.TrialId = subject?.TrialId; generalData.TrialSiteId = subject?.TrialSiteId; } else { generalData.TrialId = info?.TrialId ?? generalData.TrialId; generalData.TrialSiteId = info?.TrialSiteId ?? generalData.TrialSiteId; } //以后移除 generalData.SiteCode = info?.TrialSiteCode ?? generalData.SiteCode; generalData.SubjectCode = info?.SubjectCode ?? generalData.SubjectCode; } } return generalData; } /// /// 获取稽查记录的标识符 部分业务会进行特殊处理 /// /// public string GetInspectionRecordIdentification(T entityObj, string type, bool IsDistinctionInterface = true, bool isSelfDefine = false, string auditIdentification = "") { //var entityType = _dbContext.Model.FindEntityType(entityObj.GetType()); //var tableName = entityType.GetTableName(); var entityTypeName = entityObj.GetType().Name; //文档签署这块,不区分系统和项目的 需要处理为同一个标识 //if (typeof(T) == typeof(TrialDocConfirmedUser) || typeof(T) == typeof(SystemDocConfirmedUser)) //{ // entityTypeName = "New/" + "UserSigned"; //} string result = string.Empty; //默认规则 if (IsDistinctionInterface) { //自定义 标识后面 补充由代码上层的 extraIdentification 附加 if (isSelfDefine) { result = $"{_userInfo.RequestUrl}/{entityTypeName}"; } else { result = $"{_userInfo.RequestUrl}/{entityTypeName}/{type}"; } } else { //自定义 标识后面 补充由代码上层的 extraIdentification 附加 if (isSelfDefine) { result = $"{entityTypeName}"; } else { result = $"{entityTypeName}/{type}"; } } if (auditIdentification.IsNotNullOrEmpty()) { result = result + "/" + auditIdentification; } return result; } /// 往json里面添加属性 /// /// json /// 添加对象 /// public IDictionary AddJsonItem(object jsonObj, object otherItem = null) { var JsonData = JsonConvert.DeserializeObject>((jsonObj).ToJsonStr()); if (otherItem == null) { return JsonData; } var other = JsonConvert.DeserializeObject>(otherItem.ToJsonStr()); foreach (var item in other) { if (JsonData.ContainsKey(item.Key)) { JsonData[item.Key] = item.Value; } else { JsonData.Add(item.Key, item.Value); } } return JsonData; } } }