diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 796ff7bf5..e4064895b 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -8783,6 +8783,20 @@ + + + 获取附加评估选项列表 + + + + + + + 保存附加评估设置 (自动添加 或者删除附加评估问题) + + + + 获取签名文本 diff --git a/IRaCIS.Core.Application/Service/Fixed/CriterionAdditionalAssessment.cs b/IRaCIS.Core.Application/Service/Fixed/CriterionAdditionalAssessment.cs new file mode 100644 index 000000000..27ccafcf3 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Fixed/CriterionAdditionalAssessment.cs @@ -0,0 +1,45 @@ +using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Domain.Share.Reading; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Application.Service +{ + + + public class CriterionAdditionalAssessment + { + public CriterionType CriterionType { get; set; } + + public AdditionalAssessmentType AdditionalAssessmentType { get; set; } + + //附加评估问题 + public List AdditionalQuestionList { get; set; } + + } + + + public static class AdditionalAssessment + { + + public static List SystemDefeaultAdditionalAssessmentList { get; set; } = new List(); + static AdditionalAssessment() + { + //Resist1.1 脑转移 默认评估问题 + SystemDefeaultAdditionalAssessmentList.Add(new CriterionAdditionalAssessment() { CriterionType = CriterionType.RECIST1Point1, AdditionalAssessmentType = AdditionalAssessmentType.BrainMetastasis }); + } + + + public static List GetSystemDefeaultAdditionalAssessmentList(CriterionType criterionType, AdditionalAssessmentType? additionalAssessmentType=null) + { + + return SystemDefeaultAdditionalAssessmentList.Where(t => t.CriterionType == criterionType) + .WhereIf(additionalAssessmentType!=null,t=>t.AdditionalAssessmentType==additionalAssessmentType).ToList(); + } + } + + +} diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs index a511edc47..ae71c012e 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs @@ -1711,8 +1711,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public Guid? Id { get; set; } - - public Guid TrialId { get; set; } + public bool IsAdditional { get; set; } + public Guid TrialId { get; set; } /// /// 是否复制病灶 diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs index d38885b24..fe0c4589b 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs @@ -1,5 +1,6 @@ using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Domain.Share.Reading; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -337,6 +338,8 @@ namespace IRaCIS.Core.Application.Contracts /// public Guid TrialId { get; set; } + + public CriterionType CriterionType { get; set; } /// /// 是否有阅片期 /// @@ -806,12 +809,29 @@ namespace IRaCIS.Core.Application.Contracts public bool IsSignSave { get; set; } = false; } + + public class AddOrUpdateTrialCriterionAdditional + { + public Guid Id { get; set; } + public Guid TrialReadingCriterionId { get; set; } + + + public CriterionType CriterionType { get; set; } + + + public AdditionalAssessmentType AdditionalAssessmentType { get; set; } + + public bool? IsSelected { get; set; } + } + + public class SetCriterionReadingInfoInDto { //是否附加评估 public bool IsAdditionalAssessment { get; set; } + public CriterionType CriterionType { get; set; } //自动 手动生成任务 public bool IsAutoCreate { get; set; } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 8e95155c4..6a3d1ba64 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -16,6 +16,9 @@ using IRaCIS.Core.Application.ViewModel; using MassTransit; using IRaCIS.Core.Application.Filter; using static IRaCIS.Core.Domain.Share.StaticData; +using IRaCIS.Core.Application.Service; +using DocumentFormat.OpenXml.Office.CustomUI; +using IRaCIS.Core.Application.Service; namespace IRaCIS.Core.Application { @@ -36,7 +39,7 @@ namespace IRaCIS.Core.Application private readonly IRepository _taskAllocationRuleRepository; private readonly IRepository _readingCriterionDictionaryRepository; private readonly IReadingQuestionService iReadingQuestionService; - + private readonly IRepository _trialCriterionAdditionalAssessmentTypeRepository; private readonly IRepository _readingTaskQuestionAnswer; @@ -60,7 +63,7 @@ namespace IRaCIS.Core.Application IReadingQuestionService iReadingQuestionService, IEasyCachingProvider provider, IOrganInfoService iOrganInfoService, - + IRepository trialCriterionAdditionalAssessmentTypeRepository, IRepository visitTaskRepository, IRepository readingTableQuestionTrialRepository, IRepository readingTableQuestionAnswerRepository, @@ -69,6 +72,7 @@ namespace IRaCIS.Core.Application ) { + _trialCriterionAdditionalAssessmentTypeRepository = trialCriterionAdditionalAssessmentTypeRepository; _trialRepository = trialRepository; _taskAllocationRuleRepository = taskAllocationRuleRepository; this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository; @@ -154,7 +158,7 @@ namespace IRaCIS.Core.Application await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial() { - IsSigned=true, + IsSigned = true, ReadingInfoSignTime = DateTime.Now }); @@ -196,7 +200,7 @@ namespace IRaCIS.Core.Application if (trialCriterion.ReadingQuestionCriterionSystemId != null) { - + if (trialCriterion.SynchronizeOriginalTime == null) { @@ -222,10 +226,11 @@ namespace IRaCIS.Core.Application await _trialCriterionDictionaryCode.BatchDeleteNoTrackingAsync(x => x.TrialCriterionId == trialCriterion.Id); await _readingCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.CriterionId == trialCriterion.Id); - var criterionDictionaryCodeList=await _systemCriterionDictionaryCode.Where(x => x.SystemCriterionId == trialCriterion.ReadingQuestionCriterionSystemId.Value) - .Select(x=>new TrialCriterionDictionaryCode() { - Code=x.Code, - TrialCriterionId= trialCriterion.Id, + var criterionDictionaryCodeList = await _systemCriterionDictionaryCode.Where(x => x.SystemCriterionId == trialCriterion.ReadingQuestionCriterionSystemId.Value) + .Select(x => new TrialCriterionDictionaryCode() + { + Code = x.Code, + TrialCriterionId = trialCriterion.Id, }).ToListAsync(); criterionDictionaryCodeList.ForEach(x => @@ -265,13 +270,13 @@ namespace IRaCIS.Core.Application var tableQuestionQuery = _readingTableQuestionTrialRepository.Where(x => x.TrialCriterionId == inDto.TrialReadingCriterionId).AsQueryable(); - await _readingTaskQuestionAnswer.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId&&x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId== inDto.TrialReadingCriterionId && questionQuery.Count(y => y.Id == x.ReadingQuestionTrialId) == 0); - await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && questionQuery.Count(y => y.Id == x.QuestionId) == 0); - await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId &&x.ReadingTableQuestionTrial.TrialCriterionId== inDto.TrialReadingCriterionId && tableQuestionQuery.Count(y => y.Id == x.TableQuestionId) == 0); + await _readingTaskQuestionAnswer.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && questionQuery.Count(y => y.Id == x.ReadingQuestionTrialId) == 0); + await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && questionQuery.Count(y => y.Id == x.QuestionId) == 0); + await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTask.TrialReadingCriterionId == inDto.TrialReadingCriterionId && x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.ReadingTableQuestionTrial.TrialCriterionId == inDto.TrialReadingCriterionId && tableQuestionQuery.Count(y => y.Id == x.TableQuestionId) == 0); } - + await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial() { @@ -281,7 +286,7 @@ namespace IRaCIS.Core.Application await _readingCriterionDictionaryRepository.SaveChangesAsync(); - + } return ResponseOutput.Ok(true); @@ -458,7 +463,7 @@ namespace IRaCIS.Core.Application /// /// [HttpPost] - public async Task<(GetTrialReadingCriterionInfoOutDto,bool)> GetTrialReadingCriterionInfo(GetTrialReadingInfoInDto inDto) + public async Task<(GetTrialReadingCriterionInfoOutDto, bool)> GetTrialReadingCriterionInfo(GetTrialReadingInfoInDto inDto) { GetTrialReadingCriterionInfoOutDto result = new GetTrialReadingCriterionInfoOutDto(); result.ReadingCriterionPageList = await _readingCriterionPageRepository.Where(x => x.TrialId == inDto.TrialId).ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); @@ -477,7 +482,7 @@ namespace IRaCIS.Core.Application && x.ReadingCriterionPageId == null) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); - return (result,true); + return (result, true); } @@ -552,12 +557,34 @@ namespace IRaCIS.Core.Application IsGlobalReading = inDto.IsGlobalReading, IsArbitrationReading = inDto.IsArbitrationReading, IsOncologyReading = inDto.IsOncologyReading, - IsAdditionalAssessment=inDto.IsAdditionalAssessment, - IsAutoCreate=inDto.IsAutoCreate + IsAdditionalAssessment = inDto.IsAdditionalAssessment, + IsAutoCreate = inDto.IsAutoCreate }); + //判断是否存在附加评估,存在,就将标准对应的附加评估选项加进去 + if (inDto.IsAdditionalAssessment) + { + if (!await _trialCriterionAdditionalAssessmentTypeRepository.AnyAsync(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId)) + { + var addList = AdditionalAssessment.GetSystemDefeaultAdditionalAssessmentList(inDto.CriterionType); + foreach (var addItem in addList) + { + await _trialCriterionAdditionalAssessmentTypeRepository.AddAsync(new TrialCriterionAdditionalAssessmentType() + { + CriterionType = inDto.CriterionType, + TrialReadingCriterionId = inDto.TrialReadingCriterionId, + AdditionalAssessmentType = addItem.AdditionalAssessmentType + }); + } + } + } + else + { + //删除附加问题 + await _readingQuestionTrialRepository.BatchDeleteNoTrackingAsync(t => t.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && t.IsAdditional == true); + } var result = await _readingQuestionCriterionTrialRepository.SaveChangesAsync(); @@ -565,6 +592,54 @@ namespace IRaCIS.Core.Application return ResponseOutput.Ok(result); } + /// + /// 获取附加评估选项列表 + /// + /// + /// + public async Task> GetTrialCriterionAdditionalAssessmentOptionList(Guid trialReadingCriterionId) + { + return await _trialCriterionAdditionalAssessmentTypeRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).ToListAsync(); + } + + + /// + /// 保存附加评估设置 (自动添加 或者删除附加评估问题) + /// + /// + /// + public async Task SetTrialCriterionAdditionalAssessment(List updateList) + { + foreach (var updateItem in updateList) + { + if (updateItem.IsSelected == true) + { + //添加默认问题 + + var addTypeList = AdditionalAssessment.GetSystemDefeaultAdditionalAssessmentList(updateItem.CriterionType, updateItem.AdditionalAssessmentType); + + foreach (var addType in addTypeList) + { + foreach (var question in addType.AdditionalQuestionList) + { + await _readingQuestionTrialRepository.AddAsync(question); + } + } + } + else + { + //删除附加问题 + + await _readingQuestionTrialRepository.BatchDeleteNoTrackingAsync(t => t.ReadingQuestionCriterionTrialId == updateItem.TrialReadingCriterionId && t.IsAdditional == true); + } + + await _trialCriterionAdditionalAssessmentTypeRepository.UpdatePartialFromQueryAsync(updateItem.Id, t => new TrialCriterionAdditionalAssessmentType() { IsSelected = updateItem.IsSelected }); + } + + return ResponseOutput.Ok(); + } + + /// /// 获取签名文本 /// diff --git a/IRaCIS.Core.Domain.Share/Reading/UrgentType.cs b/IRaCIS.Core.Domain.Share/Reading/UrgentType.cs index 270e3b869..7c4515320 100644 --- a/IRaCIS.Core.Domain.Share/Reading/UrgentType.cs +++ b/IRaCIS.Core.Domain.Share/Reading/UrgentType.cs @@ -24,5 +24,16 @@ namespace IRaCIS.Core.Domain.Share.Reading + } + + public enum AdditionalAssessmentType + { + //脑转移 + BrainMetastasis = 1, + + //TNM分期 + + TNM = 2 + } } diff --git a/IRaCIS.Core.Domain/Reading/ReadingCriterion/TrialCriterionAdditionalAssessmentType.cs b/IRaCIS.Core.Domain/Reading/ReadingCriterion/TrialCriterionAdditionalAssessmentType.cs new file mode 100644 index 000000000..3f385cdde --- /dev/null +++ b/IRaCIS.Core.Domain/Reading/ReadingCriterion/TrialCriterionAdditionalAssessmentType.cs @@ -0,0 +1,69 @@ + +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2023-03-16 13:21:14 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +using System; +using IRaCIS.Core.Domain.Share; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using IRaCIS.Core.Domain.Share.Reading; + +namespace IRaCIS.Core.Domain.Models +{ + /// + ///TrialCriterionAdditionalAssessmentType + /// + [Table("TrialCriterionAdditionalAssessmentType")] + public class TrialCriterionAdditionalAssessmentType : Entity, IAuditUpdate, IAuditAdd + { + + + /// + /// TrialReadingCriterionId + /// + [Required] + public Guid TrialReadingCriterionId { get; set; } + + /// + /// CriterionType + /// + + public CriterionType CriterionType { get; set; } + + + public AdditionalAssessmentType AdditionalAssessmentType { get; set; } + + /// + /// IsSelected + /// + public bool? IsSelected { get; set; } + + /// + /// CreateTime + /// + [Required] + public DateTime CreateTime { get; set; } + + /// + /// CreateUserId + /// + [Required] + public Guid CreateUserId { get; set; } + + /// + /// UpdateTime + /// + [Required] + public DateTime UpdateTime { get; set; } + + /// + /// UpdateUserId + /// + [Required] + public Guid UpdateUserId { get; set; } + + + } + +} diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index c69be1f41..f0c107a80 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -268,6 +268,9 @@ namespace IRaCIS.Core.Infra.EFCore public virtual DbSet TrialClinicalDataSetCriterion { get; set; } + public virtual DbSet TrialCriterionAdditionalAssessmentType { get; set; } + + //public virtual DbSet TrialClinicalDataCriterion { get; set; } //public virtual DbSet SystemClinicalDataCriterion { get; set; } diff --git a/IRaCIS.Core.Test/DbHelper.ttinclude b/IRaCIS.Core.Test/DbHelper.ttinclude index 956e4eb0c..cc63dbf70 100644 --- a/IRaCIS.Core.Test/DbHelper.ttinclude +++ b/IRaCIS.Core.Test/DbHelper.ttinclude @@ -4,7 +4,7 @@ public static readonly string ConnectionString = "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_New_Tet;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true"; public static readonly string DbDatabase = "IRaCIS_New_Tet"; //ַ,ƴ - public static readonly string TableName = "DefaultShortcutKey"; + public static readonly string TableName = "TrialCriterionAdditionalAssessmentType"; //ļ service Ƿҳ } #>