diff --git a/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs b/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs index 09623eb25..837807120 100644 --- a/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs +++ b/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs @@ -70,7 +70,7 @@ namespace IRaCIS.Application.Services var attachment = await _attachmentRepository.InsertFromDTOAsync(attachmentViewModel); //intoGroupItem.AttachmentId = attachment.Id; - await _enrollRepository.UpdatePartialNoQueryAsync(intoGroupItem.Id,u=>new Enroll(){AttachmentId = attachment.Id}); + await _enrollRepository.UpdatePartialFromQueryAsync(intoGroupItem.Id,u=>new Enroll(){AttachmentId = attachment.Id}); var success = await _enrollRepository.SaveChangesAsync(); @@ -88,12 +88,12 @@ namespace IRaCIS.Application.Services public async Task DeleteReviewerAckSOW(Guid trialId, Guid doctorId, Guid attachmentId) { var success1 = await _attachmentRepository.BatchDeleteNoTrackingAsync(a => a.Id == attachmentId); - var success2 = await _enrollRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.DoctorId == doctorId, u => + await _enrollRepository.UpdatePartialFromQueryAsync(t => t.TrialId == trialId && t.DoctorId == doctorId, u => new Enroll() { AttachmentId = Guid.Empty - }); - return ResponseOutput.Result(success1 && success2); + },true); + return ResponseOutput.Ok(success1 ); } /// diff --git a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs index d9ad566a3..c7beabb61 100644 --- a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs +++ b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs @@ -702,10 +702,23 @@ namespace IRaCIS.Core.Infra.EFCore.Common subjectVisit = subjectVisit ?? new SubjectVisit(); if (type == "Add") { - await AddInspectionRecordAsync(new InspectionConvertDTO() + //await AddInspectionRecordAsync( new + //{ + // QcQuestionAnswerCommands = await Getdata(entitylist), + //},new InspectionConvertDTO() + //{ + // SiteId = subjectVisit.SiteId, + // Identification = $"{_userInfo.RequestUrl}/{firstEntity.GetType().Name}/{type}", + // SubjectId = subjectVisit.SubjectId, + // SubjectVisitName = subjectVisit.VisitName, + // TrialId = subjectVisit.TrialId, + // SubjectVisitId = subjectVisit.Id, + // GeneralId = subjectVisit.Id, + //}); + + await InsertInspection(firstEntity, type, answer => new InspectionConvertDTO() { SiteId = subjectVisit.SiteId, - Identification = $"{_userInfo.RequestUrl}/{firstEntity.GetType().Name}/{type}", SubjectId = subjectVisit.SubjectId, SubjectVisitName = subjectVisit.VisitName, TrialId = subjectVisit.TrialId, @@ -723,19 +736,33 @@ namespace IRaCIS.Core.Infra.EFCore.Common var createUserId = entitylist.Select(x => x.CreateUserId).FirstOrDefault(); var noUpdateData = _dbContext.TrialQCQuestionAnswer.Where(x => x.CreateUserId == createUserId && x.SubjectVisitId == subjectVisit.Id && !questionIds.Contains(x.Id)).ToList(); entitylist.AddRange(noUpdateData); - await AddInspectionRecordAsync(new InspectionConvertDTO() + + await InsertInspection(firstEntity, type, answer => new InspectionConvertDTO() { - Identification = $"{_userInfo.RequestUrl}/{firstEntity.GetType().Name}/{type}", SiteId = subjectVisit.SiteId, SubjectId = subjectVisit.SubjectId, + SubjectVisitName = subjectVisit.VisitName, TrialId = subjectVisit.TrialId, SubjectVisitId = subjectVisit.Id, - SubjectVisitName = subjectVisit.VisitName, GeneralId = subjectVisit.Id, }, new { QcQuestionAnswerCommands = await Getdata(entitylist), }); + + //await AddInspectionRecordAsync( new + //{ + // QcQuestionAnswerCommands = await Getdata(entitylist), + //},new InspectionConvertDTO() + //{ + // Identification = $"{_userInfo.RequestUrl}/{firstEntity.GetType().Name}/{type}", + // SiteId = subjectVisit.SiteId, + // SubjectId = subjectVisit.SubjectId, + // TrialId = subjectVisit.TrialId, + // SubjectVisitId = subjectVisit.Id, + // SubjectVisitName = subjectVisit.VisitName, + // GeneralId = subjectVisit.Id, + //}); } async Task> Getdata(List questionAnswers) @@ -787,10 +814,30 @@ namespace IRaCIS.Core.Infra.EFCore.Common { Name = doctor.FullName, ChineseName = doctor.ChineseName, - Email=doctor.EMail, - }) ; + Email = doctor.EMail, + IsUploadedACKSOW = entity.AttachmentId != Guid.Empty + }); } + //独立阅片人 状态修改 上传SoW + + if (entitys.Any(x => x.Entity.GetType() == typeof(EnrollReadingCategory))) + { + var list = entitys.Where(x => x.Entity.GetType() == typeof(EnrollReadingCategory)).Select(t => t.Entity as EnrollReadingCategory).ToList(); + var enrollId = list.Select(t => t.EnrollId).FirstOrDefault(); + var enroll = await _dbContext.Enroll.Include(t => t.Doctor).FirstAsync(t => t.Id == enrollId); + + await InsertInspection(enroll, type, x => new InspectionConvertDTO() + { + GeneralId = enroll.Id, + }, new + { + Name = enroll.Doctor.FullName, + ChineseName = enroll.Doctor.ChineseName, + Email = enroll.Doctor.EMail, + ReadingCategoryList = list.Select(t => t.ReadingCategory).ToList() + }); + } //// 医生详情 @@ -815,18 +862,198 @@ namespace IRaCIS.Core.Infra.EFCore.Common /// 表达式 /// 其他对象 /// - public async Task InsertInspection(T data, string type, Expression> expression = null, object otherItem = null, object originaldata = null) where T : class + public async Task InsertInspection(T entityObj, string type, Expression> expression = null, object otherItem = null, object originaldata = null) where T : class { - object entityobj = data; + InspectionConvertDTO inspection = new InspectionConvertDTO(); + if (expression != null) { var f = expression.Compile(); - var entitydata = entityobj as T; - inspection = f(entitydata); + + inspection = f(entityObj); } - var entityTypeName = entityobj.GetType().Name; + + inspection.Identification = await GetInspectionRecordIdentificationAsync(entityObj,type); + + //将实体对象属性 映射到稽查实体 + MapEntityPropertyToAuditEntity(entityObj, inspection); + + var generalData = await GetInspectionGeneralDataAsync(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 + if (inspection.ParentId == null) + { + inspection.ParentId = (await _dbContext.DataInspection.AsQueryable().Where(x => x.TrialId == inspection.TrialId && x.SubjectVisitId == inspection.SubjectVisitId && x.SubjectId == inspection.SubjectId && x.SiteId == inspection.SiteId && x.VisitStageId == inspection.VisitStageId && x.GeneralId == inspection.GeneralId).OrderByDescending(x => x.CreateTime).FirstOrDefaultAsync())?.Id; + } + inspection.CreateUserId = _userInfo.Id; + 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 inspectionData = new InspectionJsonDetail() + { + //稽查实体,加上扩充的信息 + Data = AddJsonItem(entityObj, otherItem), + + //通用信息 + Inspection = generalData + }; + inspection.JsonDetail = inspectionData.ToJsonStr(); + inspection.BatchId = _userInfo.BatchId.Value; + 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); + } + } + } + + + + /// + /// 获取稽查通用数据 (每条稽查记录必须查询的) + /// + /// + /// + public async Task GetInspectionGeneralDataAsync(InspectionConvertDTO inspection) + { + + InspectionGeneralData generalData = new InspectionGeneralData() + { + SiteCode = inspection.SiteCode, + SiteId = inspection.SiteId, + SiteName = inspection.SiteName, + SubjectCode = inspection.SubjectCode, + SubjectId = inspection.SubjectId, + SubjectVisitId = inspection.SubjectVisitId, + SubjectVisitName = inspection.SubjectVisitName, + ResearchProgramNo = inspection.ResearchProgramNo, + TrialId = inspection.TrialId, + TrialName = inspection.TrialName + }; + + + #region 项目名称 + + + if (generalData.TrialId != null) + { + + //项目添加哪里 直接会带信息过来,不用查询数据库 其他的地方需要查询数据库 + if (string.IsNullOrEmpty(generalData.ResearchProgramNo) || string.IsNullOrEmpty(generalData.TrialName)) + { + var trialdata = (await _dbContext.Trial.Select(x => new { x.Id, x.ResearchProgramNo, x.ExperimentName, }).FirstOrDefaultAsync(x => x.Id == generalData.TrialId)).IfNullThrowException(); + + generalData.ResearchProgramNo = trialdata.ResearchProgramNo; + + generalData.TrialName = trialdata.ExperimentName; + } + } + + #endregion + + #region 测试中心名称 + + if (generalData.TrialId != null && generalData.SiteId != null) + { + + generalData.SiteCode = (await _dbContext.TrialSite.IgnoreQueryFilters().Where(x => x.TrialId == generalData.TrialId && x.SiteId == generalData.SiteId).Select(t => t.TrialSiteCode).FirstOrDefaultAsync()).IfNullThrowException(); + + + // 添加Site 哪里会带信息过来 + if (string.IsNullOrEmpty(generalData.SiteName)) + { + generalData.SiteName = (await _dbContext.Site.Where(x => x.Id == generalData.SiteId).Select(x => x.SiteName).FirstOrDefaultAsync()).IfNullThrowException(); + + } + } + + + #endregion + + #region 受试者 + + if (generalData.SubjectId != null) + { + + // 添加Subject 哪里会带信息过来 + if (string.IsNullOrEmpty(generalData.SubjectCode)) + { + generalData.SubjectCode = (await _dbContext.Subject.Where(x => x.Id == generalData.SubjectId).Select(x => x.Code).FirstOrDefaultAsync()).IfNullThrowException(); + + } + } + + #endregion + + #region 访视 + + if (generalData.SubjectVisitId != null) + { + //添加访视的时候,会带信息过来 + if (string.IsNullOrEmpty(generalData.SubjectVisitName)) + { + generalData.SubjectVisitName = (await _dbContext.SubjectVisit.Where(x => x.Id == generalData.SubjectVisitId).Select(x => x.VisitName).FirstOrDefaultAsync()).IfNullThrowException(); + } + } + + + #endregion + + return generalData; + } + + + + /// + /// 获取稽查记录的标识符 部分业务会进行特殊处理 + /// + /// + public async Task GetInspectionRecordIdentificationAsync(T entityObj, string type) + { + var entityTypeName = entityObj.GetType().Name; + + #region 标识符特殊处理 //文档签署这块,不区分系统和项目的 需要处理为同一个标识 if (typeof(T) == typeof(TrialDocUserTypeConfirmedUser) || typeof(T) == typeof(SystemDocConfirmedUser)) @@ -835,7 +1062,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common } dynamic entity; - switch (entityobj.GetType().Name) + switch (entityObj.GetType().Name) { case nameof(QCChallengeDialog): case nameof(QCChallenge): @@ -852,11 +1079,11 @@ namespace IRaCIS.Core.Infra.EFCore.Common } break; case nameof(SystemBasicData): - entity = entityobj as SystemBasicData; + entity = entityObj as SystemBasicData; type = type + (entity.ParentId == null ? "/parent" : string.Empty); break; case nameof(Trial): - entity = entityobj as Trial; + entity = entityObj as Trial; Guid id = entity.Id; Trial oldentity = await _dbContext.Trial.Where(x => x.Id == id).FirstOrDefaultAsync(); switch (_userInfo.RequestUrl.ToLower()) @@ -873,7 +1100,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common } break; case nameof(SubjectVisit): - entity = entityobj as SubjectVisit; + entity = entityObj as SubjectVisit; switch (_userInfo.RequestUrl.ToLower()) { case "qcoperation/obtainorcancelqctask": @@ -892,24 +1119,48 @@ namespace IRaCIS.Core.Infra.EFCore.Common break; } - inspection.Identification = $"{_userInfo.RequestUrl}/{entityTypeName}/{type}"; - - #region 注释 - //if (data != null) - //{ - // var originaldata = data.OriginalValues.ToObject(); - // if (originaldata != null) - // { - // inspection.LastJsonDetail = originaldata.ToJcJson(); - // } - //} #endregion - await AddInspectionRecordAsync(inspection, entityobj, otherItem); + return $"{_userInfo.RequestUrl}/{entityTypeName}/{type}"; + } + + + /// 往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; + } + #region 待废弃 -by zhouhang 调整 /// /// 映射数据 @@ -939,31 +1190,6 @@ namespace IRaCIS.Core.Infra.EFCore.Common } } - /// - /// 将数据库实体属性,映射到稽查实体属性 避免重复赋值 - /// - /// - /// - public void EntityMapPropertyToAuditEntity(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); - } - } - } - /// /// 添加稽查 /// @@ -971,11 +1197,11 @@ namespace IRaCIS.Core.Infra.EFCore.Common /// 数据 /// /// - public async Task AddInspectionRecordAsync(InspectionConvertDTO add, object data, object otherItem = null) + public async Task AddInspectionRecordAsync(T data, InspectionConvertDTO add, object otherItem = null) where T : class { //MapData(data, add); - EntityMapPropertyToAuditEntity(data, add); + MapEntityPropertyToAuditEntity(data, add); InspectionGeneralData generalData = new InspectionGeneralData() { @@ -994,6 +1220,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common }; await SetInspectionNameValue(generalData); + #region 处理标识 var from = await _dbContext.FrontAuditConfig.FirstOrDefaultAsync(x => x.Identification == add.Identification); @@ -1031,43 +1258,6 @@ namespace IRaCIS.Core.Infra.EFCore.Common } - - /// - /// 往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; - - } - - - /// /// 设置项目以及名称 /// @@ -1144,5 +1334,8 @@ namespace IRaCIS.Core.Infra.EFCore.Common } + + #endregion + } } diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index e0216681a..d573b54f8 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -188,7 +188,7 @@ namespace IRaCIS.Core.Infra.EFCore #region Enroll public virtual DbSet DoctorWorkload { get; set; } - public virtual DbSet IntoGroup { get; set; } + public virtual DbSet Enroll { get; set; } public virtual DbSet EnrollReadingCategory { get; set; }