diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs index b1bc46252..60a5e7fb4 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs @@ -2,6 +2,7 @@ using IRaCIS.Core.Application.Service.Reading.Dto; using MassTransit; using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Application.Interfaces; namespace IRaCIS.Application.Services { @@ -11,7 +12,7 @@ namespace IRaCIS.Application.Services [ApiExplorerSettings(GroupName = "Reading")] public class ClinicalDataSetService : BaseService { - + public IClinicalQuestionService _iClinicalQuestionService; public IRepository _subjectVisitRepository; private readonly IRepository _clinicalDataTrialSetRepository; @@ -22,7 +23,7 @@ namespace IRaCIS.Application.Services public ClinicalDataSetService(IRepository subjectVisitRepository, - + IClinicalQuestionService iClinicalQuestionService, IRepository ClinicalDataTrialSetRepository, IRepository ClinicalDataSystemSetRepository, IRepository previousPDFRepository, @@ -32,7 +33,7 @@ namespace IRaCIS.Application.Services ) { - + _iClinicalQuestionService = iClinicalQuestionService; _subjectVisitRepository = subjectVisitRepository; _clinicalDataTrialSetRepository = ClinicalDataTrialSetRepository; @@ -260,7 +261,7 @@ namespace IRaCIS.Application.Services //不存在的时候,就将系统数据同步到项目临床数据配置 if (!await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == trialId && x.SystemClinicalDataSetId != null)) { - var systemClinicalDataList = await _clinicalDataSystemSetRepository.AsQueryable().ToListAsync(); + var systemClinicalDataList = await _clinicalDataSystemSetRepository.Where(x=>x.IsFinish).AsQueryable().ToListAsync(); var systemIds = systemClinicalDataList.Select(x => x.Id).ToList(); var trialSystemClinicalDataSetIds = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialId && x.SystemClinicalDataSetId != null).Select(x => x.SystemClinicalDataSetId.Value).ToListAsync(); @@ -299,6 +300,13 @@ namespace IRaCIS.Application.Services var result = await _clinicalDataTrialSetRepository.SaveChangesAsync(); + + await _iClinicalQuestionService.SynchronizationQuestion(dataSets.Select(x => new SynchronizationQuestionDto() + { + SystemClinicalId = x.SystemClinicalDataSetId.Value, + TrialClinicalId = x.Id, + + }).ToList()); } #endregion diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalQuestionService.cs index 3a408f938..ec6d7c4f4 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalQuestionService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalQuestionService.cs @@ -10,6 +10,7 @@ using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Domain.Share; +using MassTransit; namespace IRaCIS.Core.Application.Service { @@ -17,7 +18,7 @@ namespace IRaCIS.Core.Application.Service /// 临床数据问题 /// [ApiExplorerSettings(GroupName = "Reading")] - public class ClinicalQuestionService : BaseService + public class ClinicalQuestionService : BaseService, IClinicalQuestionService { private readonly IRepository _trialClinicalQuestionRepository; @@ -303,24 +304,120 @@ namespace IRaCIS.Core.Application.Service #region 同步系统问题 + /// + /// 同步系统问题 + /// + /// + /// public async Task SynchronizationQuestion(List inDto) { var trialClinicalId = inDto.Select(x => x.TrialClinicalId).ToList(); var systemClinicalId = inDto.Select(x => x.SystemClinicalId).ToList(); - var questionRelation = _trialClinicalQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).ToDictionary( - x => x.SystemClinicalQuestionId ?? default(Guid), - x => x.Id - ); + var questionRelationList =await _trialClinicalQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic() + { + SystemQuestionId=x.SystemClinicalQuestionId?? default(Guid), + TrialQuestionId=x.Id, + TrialClinicalId=x.TrialClinicalId, + }).ToListAsync(); - var tableQuestionRelation = _trialClinicalTableQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).ToDictionary( - x => x.SystemTableQuestionId ?? default(Guid), - x => x.Id - ); + var tableQuestionRelationList = await _trialClinicalTableQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic() + { + SystemQuestionId = x.SystemTableQuestionId ?? default(Guid), + TrialQuestionId = x.Id, + TrialClinicalId = x.TrialClinicalId, + }).ToListAsync(); + + var newTrialQuestionAll = await _systemClinicalQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId)) + .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + + var newTrialTableQuestionAll = await _systemClinicalTableQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId)) + .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - //var + List addTrialDataList = new List(); + List addTrialTableList = new List(); + foreach (var item in inDto) + { + var questionRelation = questionRelationList.Where(x=>x.TrialClinicalId==item.TrialClinicalId).ToDictionary( + x => x.SystemQuestionId, + x => x.TrialQuestionId + ); + var newTrialQuestionList = newTrialQuestionAll.Where(x => x.SystemClinicalQuestionId == item.SystemClinicalId).ToList(); + newTrialQuestionList.ForEach(x => + { + if (questionRelation.ContainsKey(x.Id)) + { + x.Id = questionRelation[x.Id]; + } + else + { + var newid = NewId.NextGuid(); + questionRelation.Add(x.Id, newid); + x.Id = newid; + } + + x.TrialClinicalId = item.TrialClinicalId; + }); + + var copyNewQuestionList = newTrialQuestionList.Clone(); + foreach (var x in newTrialQuestionList) + { + var question = x.Clone(); + if (question.ParentId != null) + { + question.ParentId = questionRelation[question.ParentId ?? default(Guid)]; + } + if (question.GroupId != null) + { + question.GroupId = questionRelation[question.GroupId ?? default(Guid)]; + } + addTrialDataList.Add(question); + }; + + + + var tableQuestionRelation = tableQuestionRelationList.Where(x => x.TrialClinicalId == item.TrialClinicalId).ToDictionary( + x => x.SystemQuestionId, + x => x.TrialQuestionId + ); + + var newTrialTableQuestionList = newTrialTableQuestionAll.Where(x => x.TrialClinicalId == item.TrialClinicalId) + .ToList(); + + + newTrialTableQuestionList.ForEach(x => + { + if (tableQuestionRelation.ContainsKey(x.Id)) + { + x.Id = tableQuestionRelation[x.Id]; + } + else + { + var newid = NewId.NextGuid(); + tableQuestionRelation.Add(x.Id, newid); + x.Id = newid; + } + }); + + foreach (var x in newTrialTableQuestionList) + { + var tableQuestion = x.Clone(); + tableQuestion.TrialClinicalId = item.TrialClinicalId; + + tableQuestion.QuestionId = copyNewQuestionList.Where(y => y.SystemClinicalQuestionId == x.QuestionId).Select(y => y.Id).FirstOrDefault(); + + + addTrialTableList.Add(tableQuestion); + } + } + + + await _trialClinicalQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId)); + await _trialClinicalQuestionRepository.AddRangeAsync(addTrialDataList); + await _trialClinicalTableQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId) ); + await _trialClinicalTableQuestionRepository.AddRangeAsync(addTrialTableList); } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalQuestionDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalQuestionDto.cs index 9c5cc15f5..fef9c511a 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalQuestionDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalQuestionDto.cs @@ -334,5 +334,18 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid TrialClinicalId { get; set; } } + + public class QuestionDic + { + public Guid SystemQuestionId { get; set; } + + public Guid TrialQuestionId { get; set; } + + /// + /// 项目临床数据Id + /// + public Guid TrialClinicalId { get; set; } + } + #endregion } diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalQuestionService.cs new file mode 100644 index 000000000..f61454573 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalQuestionService.cs @@ -0,0 +1,25 @@ +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2022-08-12 14:07:43 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- + +using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Application.ViewModel; +namespace IRaCIS.Core.Application.Interfaces +{ + /// + /// IClinicalQuestionService + /// + public interface IClinicalQuestionService + { + + + Task SynchronizationQuestion(List inDto); + + + + + + } +} diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs index 0c940d0b3..4e227fb40 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs @@ -980,7 +980,7 @@ namespace IRaCIS.Application.Services x.TrialId = trialCriterion.TrialId; }); var copyNewQuestionList = newTrialQuestionList.Clone(); - var trialQuestionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialCriterion.Id).ToListAsync(); + // var trialQuestionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialCriterion.Id).ToListAsync(); var needAddDatas = new List(); foreach (var x in newTrialQuestionList) diff --git a/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataSystemSet.cs b/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataSystemSet.cs index 2bbf6687e..d6fe0fb4d 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataSystemSet.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataSystemSet.cs @@ -26,10 +26,15 @@ namespace IRaCIS.Core.Domain.Models /// public string ClinicalDataSetName { get; set; } - /// - /// 英文名称 - /// - public string ClinicalDataSetEnName { get; set; } = string.Empty; + /// + /// 是否配置完成 + /// + public bool IsFinish { get; set; } = false; + + /// + /// 英文名称 + /// + public string ClinicalDataSetEnName { get; set; } = string.Empty; /// /// 临床级别 diff --git a/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataTrialSet.cs b/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataTrialSet.cs index 882aec273..4260c2098 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataTrialSet.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalData/ClinicalDataTrialSet.cs @@ -63,6 +63,12 @@ namespace IRaCIS.Core.Domain.Models /// public bool IsConfirm { get; set; } + + /// + /// 是否配置完成 + /// + public bool IsFinish { get; set; } = false; + /// /// 上传角色 ///