diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 4e69e0b8f..d815c27fd 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -6095,6 +6095,139 @@ 是否是系统数据 + + + 任务类型 + + + + + 分配时间 + + + + + 加急类型 + + + + + 任务加急类型 + + + + + 是否和编辑加急状态 + + + + + 0 代表 单重阅片 产生的任务 否则就是双重 任务 1 任务 2 + + + + + 分配状态 + + + + + 重阅状态 + + + + + 是否是重阅产生的,方便过滤数据 + + + + + PM 对该任务进行了回退 影响的任务不设置 + + + + 裁判结果的任务ID + + + + 首次阅片时间 + + + + + 全局是否有更新 + + + + + IR是否阅读临床数据 + + + + + 关联的访视任务ID (当前任务是访视任务的话会有自己) + + + + + 关联的访视任务ID (当前任务是访视任务的话会有自己)集合 + + + + + 既往任务Id 不包括自己 + + + + + 既往任务Id 不包括自己集合 + + + + + 裁判结果的备注 + + + + + 裁判结果的图片路径 + + + + + 阅片结果是否和原数据有差异 + + + + + 组件一致性和原Arm1是否有差异 + + + + + 组件一致性和原Arm2是否有差异 + + + + + 是否是一致性分析产生 + + + + + 转换之前的任务Id(转化的任务才有该值) + + + + + 针对产生的一致性任务而言,这个字段存储的是原始任务 + + + + + 裁判结果图片地址 + + 阅片医学审核 diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index 356d0c5b3..49b3858d4 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -119,22 +119,22 @@ namespace IRaCIS.Core.Application.Service var taskInfo = await _visitTaskRepository.Where(x => x.Id == taskId).IgnoreAutoIncludes().AsNoTracking().FirstNotNullAsync(); taskInfo.ReadingTaskState = ReadingTaskState.Reading; - taskInfo.IsConvertedTask = true; + //taskInfo.IsConvertedTask = true; taskInfo.BeforeConvertedTaskId = taskId; taskInfo.Id = NewId.NextGuid(); - await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => - x.IsAnalysisCreate == taskInfo.IsAnalysisCreate - && x.IsSelfAnalysis == taskInfo.IsSelfAnalysis - && x.VisitTaskNum > taskInfo.VisitTaskNum - && x.DoctorUserId == taskInfo.DoctorUserId - && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId - && x.SubjectId == taskInfo.SubjectId - && x.ArmEnum == taskInfo.ArmEnum && - x.TaskState == TaskState.Effect, x => new VisitTask() - { - IsConvertedTask = true - }); + //await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => + // x.IsAnalysisCreate == taskInfo.IsAnalysisCreate + // && x.IsSelfAnalysis == taskInfo.IsSelfAnalysis + // && x.VisitTaskNum > taskInfo.VisitTaskNum + // && x.DoctorUserId == taskInfo.DoctorUserId + // && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId + // && x.SubjectId == taskInfo.SubjectId + // && x.ArmEnum == taskInfo.ArmEnum && + // x.TaskState == TaskState.Effect, x => new VisitTask() + // { + // IsConvertedTask = true + // }); await _visitTaskRepository.AddAsync(taskInfo); @@ -146,8 +146,7 @@ namespace IRaCIS.Core.Application.Service var taskAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == taskId && x.ReadingQuestionTrial.Type != "calculation").IgnoreAutoIncludes().AsNoTracking().ToListAsync(); - taskAnswer.ForEach(x => - { + taskAnswer.ForEach(x => { x.VisitTaskId = taskInfo.Id; @@ -623,38 +622,6 @@ namespace IRaCIS.Core.Application.Service } - //private async Task IsConvertedTask(Guid trialReadingCriterionId, Guid subjectId, decimal visitTaskNum, Guid? doctorUserId) - //{ - - // var criterion = await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId); - // if (criterion.CriterionType == CriterionType.IRECIST1Point1) - // { - - // if (doctorUserId == null) - // { - // return false; - // } - // else - // { - // if (await _visitTaskRepository.AnyAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectId && t.DoctorUserId == doctorUserId && t.VisitTaskNum <= visitTaskNum && t.IsConvertedTask && t.TaskState == TaskState.Effect)) - // { - // return true; - // } - // else - // { - // return false; - // } - // } - - - // } - // else - // { - // return false; - // } - //} - - public DateTime GetSuggessFinishTime(bool isInOrder, UrgentType urgentType) { @@ -1434,7 +1401,6 @@ namespace IRaCIS.Core.Application.Service { taskUrgent = TaskUrgentType.VisitUrgent; } - bool isCanEditUrgent = taskUrgent == TaskUrgentType.EnrollmentConfirm || taskUrgent == TaskUrgentType.PDProgress ? false : true; var newTask = await _visitTaskRepository.AddAsync(new VisitTask() { @@ -1468,18 +1434,6 @@ namespace IRaCIS.Core.Application.Service IsNeedClinicalDataSign = reReadingVisitTask.IsNeedClinicalDataSign, IsClinicalDataSign = reReadingVisitTask.IsClinicalDataSign, - - - //生成的任务分配给原始医生 - DoctorUserId = reReadingVisitTask.DoctorUserId, - TaskAllocationState = TaskAllocationState.Allocated, - AllocateTime = DateTime.Now, - SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget), - - //IR 重阅的任务这两个字段和之前任务保持一致 - //IsConvertedTask = await IsConvertedTask(reReadingVisitTask.TrialReadingCriterionId, reReadingVisitTask.SubjectId, reReadingVisitTask.VisitTaskNum, reReadingVisitTask.DoctorUserId), - //BeforeConvertedTaskId = reReadingVisitTask.BeforeConvertedTaskId, - // TaskAllocationState = reReadingVisitTask.TaskAllocationState, // AllocateTime = DateTime.Now, //DoctorUserId = reReadingVisitTask.DoctorUserId, @@ -1682,7 +1636,7 @@ namespace IRaCIS.Core.Application.Service var task1 = await _visitTaskRepository.AddAsync(new VisitTask() { TrialId = trialId, - IsConvertedTask = originalTaskInfo.IsConvertedTask, + //IsConvertedTask = originalTaskInfo.IsConvertedTask, SubjectId = item.SubjectId, IsUrgent = originalTaskInfo.IsUrgent, VisitTaskNum = item.VisitNum + ReadingCommon.TaskNumDic[ReadingCategory.Global], @@ -1734,7 +1688,7 @@ namespace IRaCIS.Core.Application.Service SubjectId = item.SubjectId, IsUrgent = originalTaskInfo.IsUrgent, TaskName = item.ReadingName, - IsConvertedTask = originalTaskInfo.IsConvertedTask, + //IsConvertedTask = originalTaskInfo.IsConvertedTask, // 原任务是全局任务 加0.03 就好 VisitTaskNum = originalTaskInfo.VisitTaskNum + 0.03m, ArmEnum = Arm.TumorArm, //特殊 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index 4932bb811..cb8db141f 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -274,6 +274,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsCurrentTask { get; set; } + public Guid? BeforeConvertedTaskId { get; set; } + + public bool IsConvertedTask { get; set; } + public List CrterionDictionaryGroup { get; set; } } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/VisitTaskDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/VisitTaskDto.cs new file mode 100644 index 000000000..6bb245d0b --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/Dto/VisitTaskDto.cs @@ -0,0 +1,322 @@ +using IRaCIS.Core.Domain.Share; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Application.Service.Reading.Dto +{ + public class VisitTaskDto + { + public Guid Id { get; set; } + public string TaskName { get; set; } = string.Empty; + public string TaskBlindName { get; set; } = string.Empty; + + + //任务来源访视Id 方便回更访视读片状态 + public Guid? SourceSubjectVisitId { get; set; } + public Guid? SouceReadModuleId { get; set; } + + + /// + /// 任务类型 + /// + public ReadingCategory ReadingCategory { get; set; } + + + + public Guid CreateUserId { get; set; } + public DateTime CreateTime { get; set; } + public DateTime UpdateTime { get; set; } + public Guid UpdateUserId { get; set; } + public Guid TrialId { get; set; } + + + /// + /// 分配时间 + /// + public DateTime? AllocateTime { get; set; } + + public Guid SubjectId { get; set; } + + + public int Code { get; set; } + + public string TaskCode { get; set; } = string.Empty; + + public bool IsUrgent { get; set; } + + /// + /// 加急类型 + /// + public TaskUrgentType? TaskUrgentType { get; set; } + + /// + /// 任务加急类型 + /// + public string TaskUrgentRemake { get; set; } = string.Empty; + + /// + /// 是否和编辑加急状态 + /// + public bool IsCanEditUrgentState { get; set; } = true; + + /// + /// 0 代表 单重阅片 产生的任务 否则就是双重 任务 1 任务 2 + /// + [Required] + public Arm ArmEnum { get; set; } + + /// + /// 分配状态 + /// + public TaskAllocationState TaskAllocationState { get; set; } + + + public TaskState TaskState { get; set; } + + + /// + /// 重阅状态 + /// + public ReReadingApplyState ReReadingApplyState { get; set; } + + public Guid? DoctorUserId { get; set; } + + + public Guid TrialReadingCriterionId { get; set; } + + //裁判任务的Id + public Guid? JudgeVisitTaskId { get; set; } + + //任务阅片状态 + public ReadingTaskState ReadingTaskState { get; set; } + + //签名时间 + public DateTime? SignTime { get; set; } + + public DateTime? SuggesteFinishedTime { get; set; } + + + /// + /// 是否是重阅产生的,方便过滤数据 + /// + public bool IsReReadingCreate { get; set; } + + /// + /// PM 对该任务进行了回退 影响的任务不设置 + /// + public bool IsPMSetBack { get; set; } + + + /// 裁判结果的任务ID + public Guid? JudgeResultTaskId { get; set; } + + //随访任务号 取访视的号 计划外是 访视+0.1 裁判任务在访视任务上+0.002 全局任务在截止访视号上+0.03 肿瘤待定 + public decimal VisitTaskNum { get; set; } + + + + /// + /// 首次阅片时间 + /// + public DateTime? FirstReadingTime { get; set; } + + /// + /// 全局是否有更新 + /// + public bool? IsGlobalHaveUpdate { get; set; } + + /// + /// IR是否阅读临床数据 + /// + public bool IsReadClinicalData { get; set; } = false; + + /// + /// 关联的访视任务ID (当前任务是访视任务的话会有自己) + /// + public string RelatedVisitTaskIds { get; set; } = "[]"; + + /// + /// 关联的访视任务ID (当前任务是访视任务的话会有自己)集合 + /// + [NotMapped] + public List RelatedVisitTaskIdList + { + get + { + + try + { + + return JsonConvert.DeserializeObject>(this.RelatedVisitTaskIds); + } + catch (Exception) + { + + return new List(); + } + + } + } + + /// + /// 既往任务Id 不包括自己 + /// + + public string PastResultTaskIds { get; set; } = "[]"; + + + + /// + /// 既往任务Id 不包括自己集合 + /// + [NotMapped] + public List PastResultTaskIdList + { + get + { + + try + { + return JsonConvert.DeserializeObject>(this.PastResultTaskIds); + } + catch (Exception) + { + + return new List(); + } + + } + } + + #region 裁判任务特有 + + /// + /// 裁判结果的备注 + /// + public string JudgeResultRemark { get; set; } = string.Empty; + /// + /// 裁判结果的图片路径 + /// + public string JudgeResultImagePath { get; set; } = string.Empty; + + #endregion + + + #region 一致性分析的任务特有数据 + + /// + /// 阅片结果是否和原数据有差异 + /// + public bool? IsAnalysisDiffToOriginalData { get; set; } + + /// + /// 组件一致性和原Arm1是否有差异 + /// + public bool? IsGroupDiffArm1 { get; set; } + + /// + /// 组件一致性和原Arm2是否有差异 + /// + public bool? IsGroupDiffArm2 { get; set; } + + /// + /// 是否是一致性分析产生 + /// + public bool IsAnalysisCreate { get; set; } + + + + + /// + /// 转换之前的任务Id(转化的任务才有该值) + /// + public Guid? BeforeConvertedTaskId { get; set; } + + + // [Projectable] + + public bool IsConvertedTask { get; set; } + + [NotMapped] + public List CrterionDictionaryGroup + { + get + { + + //try + //{ + // if (this.IsConvertedTask) + // { + // return new List() { Share.CrterionDictionaryGroup.General, Share.CrterionDictionaryGroup.Converted }; + // } + // else + // { + // return new List() { Share.CrterionDictionaryGroup.General, Share.CrterionDictionaryGroup.BeforeConvert }; + // } + //} + //catch (Exception) + //{ + + return new List(); + //} + + } + } + + + + public bool? IsSelfAnalysis { get; set; } + + public string BlindSubjectCode { get; set; } = string.Empty; + public string BlindTrialSiteCode { get; set; } = string.Empty; + + //一致性分析规则Id 用于最后统计 + //public Guid? TaskConsistentRuleId { get; set; } + + /// + /// 针对产生的一致性任务而言,这个字段存储的是原始任务 + /// + public Guid? ConsistentAnalysisOriginalTaskId { get; set; } + + #endregion + + + //临床数据 + + public bool IsNeedClinicalDataSign { get; set; } + + public bool IsClinicalDataSign { get; set; } + + //前序任务需要签名 但是未签名 + public bool IsFrontTaskNeedSignButNotSign { get; set; } + + + /// + /// 裁判结果图片地址 + /// + [NotMapped] + public List JudgeResultImagePathList + { + get + { + + try + { + return this.JudgeResultImagePath.Trim().Split(',').ToList(); + } + catch (Exception) + { + + return new List(); + } + + } + } + } +} diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index e791fd1d2..438621ad7 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -640,7 +640,7 @@ namespace IRaCIS.Application.Services { answers = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == visitTaskId).ToListAsync(); - var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync(); + var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); questions.ForEach(x => { x.CrterionDictionaryGroup = taskinfo.CrterionDictionaryGroup; @@ -726,7 +726,7 @@ namespace IRaCIS.Application.Services .ToListAsync(); - var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); + var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); if (taskInfo.IsConvertedTask &&taskInfo.BeforeConvertedTaskId!=null) { @@ -865,10 +865,10 @@ namespace IRaCIS.Application.Services isEn_Us = _userInfo.IsEn_Us }).OrderBy(x => x.ShowOrder).ToListAsync(); - var taskInfo = new VisitTask(); + var taskInfo = new VisitTaskDto(); if (inDto.TaskId != null) { - taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.TaskId).FirstNotNullAsync(); + taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.TaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); qusetionList.ForEach(x => { @@ -945,7 +945,7 @@ namespace IRaCIS.Application.Services if (inDto.TaskId != null) { - taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.TaskId).FirstNotNullAsync(); + taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.TaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); // 取基线 var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == taskInfo.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstNotNullAsync(); @@ -978,17 +978,7 @@ namespace IRaCIS.Application.Services lastTaskTableAnswer= await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == laskTaskId).Include(x => x.ReadingTableQuestionTrial).ToListAsync(); - if (taskInfo.IsConvertedTask && - !(await _visitTaskRepository.AnyAsync(x => x.IsAnalysisCreate == taskInfo.IsAnalysisCreate - && x.IsSelfAnalysis == taskInfo.IsSelfAnalysis - && x.VisitTaskNum < taskInfo.VisitTaskNum - && x.DoctorUserId == taskInfo.DoctorUserId - && x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId - && !x.IsConvertedTask - && x.SubjectId == taskInfo.SubjectId - && x.ArmEnum == taskInfo.ArmEnum && - x.TaskState == TaskState.Effect)) - ) + if (taskInfo.BeforeConvertedTaskId!=null ) { isFirstChangeTask = true; @@ -2248,7 +2238,7 @@ namespace IRaCIS.Application.Services }); await _visitTaskRepository.SaveChangesAsync(); - var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == task.VisitTaskId).FirstNotNullAsync(); + var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == task.VisitTaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); task.SubjectCode = visitTaskInfo.BlindSubjectCode.IsNullOrEmpty() ? task.SubjectCode : visitTaskInfo.BlindSubjectCode; @@ -2378,13 +2368,14 @@ namespace IRaCIS.Application.Services var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Include(x=>x.TrialReadingCriterion).FirstNotNullAsync(); + var isConvertedTask=await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(x=>x.IsConvertedTask).FirstNotNullAsync(); switch (taskinfo.TrialReadingCriterion.CriterionType) { case CriterionType.IRECIST1Point1: - if (!taskinfo.IsConvertedTask && + if (!isConvertedTask && (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == visitTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.Tumor && x.Answer==(((int)OverallAssessment.PD)).ToString())) ) diff --git a/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs b/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs index 86d716f30..0bb8cad44 100644 --- a/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs @@ -17,6 +17,7 @@ namespace IRaCIS.Core.Application.Service //是否英文环境 var isEn_Us=false; + CreateMap(); CreateMap(); CreateMap(); diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs index 733d2435a..ac5fc0623 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/General/GeneralCalculateService.cs @@ -179,6 +179,8 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate TaskName = x.TaskName, LatestScanDate= x.SourceSubjectVisit!=null?x.SourceSubjectVisit.LatestScanDate : null, VisitTaskNum = x.VisitTaskNum, + IsConvertedTask=x.IsConvertedTask, + BeforeConvertedTaskId=x.BeforeConvertedTaskId, IsCurrentTask = x.Id == visitTaskId, }).ToListAsync(); diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs index 2828e69ec..756f1d7b1 100644 --- a/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs +++ b/IRaCIS.Core.Application/Service/ReadingCalculate/IRECIST1Point1CalculateService.cs @@ -723,7 +723,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate { var visitTaskId = inDto.VisitTaskId; - var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync(); + var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync(); var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == taskinfo.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync(); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 4711debda..9259b46b9 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -113,7 +113,8 @@ namespace IRaCIS.Core.Application if (existsJudge && trialCriterion.IsArbitrationReading) { - throw new BusinessValidationFailedException("有裁判问题未配置产生裁判阅片任务的条件,操作失败!"); + //---有裁判问题未配置产生裁判阅片任务的条件,操作失败! + throw new BusinessValidationFailedException(_localizer["TrialConfig_JudgeTaskFail"]); } return ResponseOutput.Ok(true); @@ -153,7 +154,8 @@ namespace IRaCIS.Core.Application if (existsJudge && trialCriterion.IsArbitrationReading) { - throw new BusinessValidationFailedException("有裁判问题未配置产生裁判阅片任务的条件,操作失败!"); + //---有裁判问题未配置产生裁判阅片任务的条件,操作失败! + throw new BusinessValidationFailedException(_localizer["TrialConfig_JudgeTaskFail"]); } await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial() @@ -504,7 +506,8 @@ namespace IRaCIS.Core.Application if (count == 0) { - throw new BusinessValidationFailedException("当前标准下未配置问题"); + //---当前标准下未配置问题 + throw new BusinessValidationFailedException(_localizer["TrialConfig_StdConfigMissing"]); } } @@ -665,7 +668,8 @@ namespace IRaCIS.Core.Application if (signRawText == null) { - return ResponseOutput.NotOk("该操作需要电子签名确认,但未在系统中找到该场景的签名模板。"); + //---该操作需要电子签名确认,但未在系统中找到该场景的签名模板。 + return ResponseOutput.NotOk(_localizer["TrialConfig_SignTemplateMissing"]); } return ResponseOutput.Ok(new @@ -683,7 +687,8 @@ namespace IRaCIS.Core.Application { if (!await _trialRepository.AnyAsync(t => t.Id == trialId && (t.TrialStatusStr == StaticData.TrialState.TrialInitializing || t.TrialStatusStr == StaticData.TrialState.TrialOngoing))) { - throw new BusinessValidationFailedException("该项目已结束或停止,不允许修改配置。"); + //---该项目已结束或停止,不允许修改配置。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_ProjectEnded"]); } } @@ -711,23 +716,27 @@ namespace IRaCIS.Core.Application { if (showOrderList.Count == 0) { - throw new BusinessValidationFailedException("当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。"); + //---当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_NoImageAuditQuestion"]); } } if (showOrderList.Count() != showOrderList.Select(t => t.ShowOrder).Distinct().Count()) { - throw new BusinessValidationFailedException("影像质控审核问题显示序号不能重复。"); + //---影像质控审核问题显示序号不能重复。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_DuplicateAuditQuestionId"]); } if (showOrderList.Where(t => t.ParentShowOrder != null).Any(t => t.ParentShowOrder > t.ShowOrder)) { - throw new BusinessValidationFailedException("父问题的显示序号要比子问题的显示序号小,请确认。"); + //---父问题的显示序号要比子问题的显示序号小,请确认。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_InvalidParentQuestionId"]); } if (await _trialRepository.AnyAsync(t => t.Id == signConfirmDTO.TrialId && t.QCQuestionConfirmedUserId != null && t.QCQuestionConfirmedUserId != _userInfo.Id)) { - throw new BusinessValidationFailedException("影像质控审核问题已被其他人员确认,不允许再次确认。"); + //---影像质控审核问题已被其他人员确认,不允许再次确认。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_AuditQuestionConfirmed"]); } return ResponseOutput.Ok(); @@ -777,23 +786,27 @@ namespace IRaCIS.Core.Application { if (showOrderList.Count == 0) { - throw new BusinessValidationFailedException("当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。"); + //---当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_NoImageAuditQuestion"]); } } if (showOrderList.Count() != showOrderList.Select(t => t.ShowOrder).Distinct().Count()) { - throw new BusinessValidationFailedException("影像质控审核问题显示序号不能重复。"); + //---影像质控审核问题显示序号不能重复。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_DuplicateAuditQuestionId"]); } if (showOrderList.Where(t => t.ParentShowOrder != null).Any(t => t.ParentShowOrder > t.ShowOrder)) { - throw new BusinessValidationFailedException("父问题的显示序号要比子问题的显示序号小,请确认。"); + //---父问题的显示序号要比子问题的显示序号小,请确认。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_InvalidParentQuestionId"]); } if (await _trialRepository.AnyAsync(t => t.Id == signConfirmDTO.TrialId && t.QCQuestionConfirmedUserId != null && t.QCQuestionConfirmedUserId != _userInfo.Id)) { - throw new BusinessValidationFailedException("影像质控审核问题已被其他人员确认,不允许再次确认。"); + //---影像质控审核问题已被其他人员确认,不允许再次确认。 + throw new BusinessValidationFailedException(_localizer["TrialConfig_AuditQuestionConfirmed"]); } await _trialQCQuestionRepository.UpdatePartialFromQueryAsync(t => t.TrialId == signConfirmDTO.TrialId, x => new TrialQCQuestion @@ -847,7 +860,8 @@ namespace IRaCIS.Core.Application { if (!await _trialRepository.Where(t => t.Id == trialConfig.TrialId).IgnoreQueryFilters().AnyAsync(t => t.TrialStatusStr == StaticData.TrialState.TrialInitializing)) { - return ResponseOutput.NotOk("该项目当前状态不是初始化,不允许进行该操作。"); + //---该项目当前状态不是初始化,不允许进行该操作。 + return ResponseOutput.NotOk(_localizer["TrialConfig_ProjectNotInitialized"]); } @@ -951,7 +965,8 @@ namespace IRaCIS.Core.Application var canOPt = await _trialRepository.AnyAsync(trial => trial.Id == trialId && trial.IsTrialBasicLogicConfirmed && trial.IsTrialProcessConfirmed && trial.IsTrialUrgentConfirmed && trial.VisitPlanConfirmed); - return ResponseOutput.Ok(canOPt, msg: canOPt ? "" : "该项目的项目配置(基础配置、流程配置、加急配置) 、访视管理,有配置未确认,不能设置项目状态为启动。"); + //---该项目的项目配置(基础配置、流程配置、加急配置) 、访视管理,有配置未确认,不能设置项目状态为启动。 + return ResponseOutput.Ok(canOPt, msg: canOPt ? "" : _localizer["TrialConfig_UnconfirmedConfiguration"]); } /// @@ -978,13 +993,15 @@ namespace IRaCIS.Core.Application } else { - return ResponseOutput.NotOk("无法变更项目状态。该项目的项目配置、访视管理中,有未确认项"); + //---无法变更项目状态。该项目的项目配置、访视管理中,有未确认项 + return ResponseOutput.NotOk(_localizer["TrialConfig_UnconfirmedUNACKD"]); } } if ((trialStatusStr == StaticData.TrialState.TrialStopped || trialStatusStr == StaticData.TrialState.TrialCompleted) && trial.TrialStatusStr != StaticData.TrialState.TrialOngoing) { - return ResponseOutput.NotOk("项目没有进入启动状态,不能设置为停止或完成状态"); + //---项目没有进入启动状态,不能设置为停止或完成状态 + return ResponseOutput.NotOk(_localizer["TrialConfig_ProjectNotStarted"]); } //if (trialStatusStr != StaticData.TrialState.TrialOngoing) diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index d23b1fd75..55f7ac0a8 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -293,17 +293,28 @@ namespace IRaCIS.Core.Domain.Models public bool IsAnalysisCreate { get; set; } - /// - /// 是否是转变的任务(转为IRECIST) - /// - public bool IsConvertedTask { get; set; } = false; + ///// + ///// 是否是转变的任务(转为IRECIST) + ///// + //public bool IsConvertedTask { get; set; } = false; /// - /// 转换之前的任务Id + /// 转换之前的任务Id(转化的任务才有该值) /// public Guid? BeforeConvertedTaskId { get; set; } - [NotMapped] + + [Projectable] + + public bool IsConvertedTask => Subject.SubjectVisitTaskList.Where(t => (t.TrialReadingCriterionId == TrialReadingCriterionId + && t.DoctorUserId == DoctorUserId && t.BeforeConvertedTaskId != null + && t.TaskState == TaskState.Effect && + t.VisitTaskNum < VisitTaskNum + && t.IsSelfAnalysis == IsSelfAnalysis + && t.ArmEnum == ArmEnum) || BeforeConvertedTaskId != null + ).Any(); + + //[NotMapped] public List CrterionDictionaryGroup { get @@ -311,7 +322,16 @@ namespace IRaCIS.Core.Domain.Models try { - if (this.IsConvertedTask) + + var isConverted= Subject.SubjectVisitTaskList.Where(t => (t.TrialReadingCriterionId == TrialReadingCriterionId + && t.DoctorUserId == DoctorUserId && t.BeforeConvertedTaskId != null + && t.TaskState == TaskState.Effect && + t.VisitTaskNum < VisitTaskNum + && t.IsSelfAnalysis == IsSelfAnalysis + && t.ArmEnum == ArmEnum) || BeforeConvertedTaskId != null + ).Any(); + + if (isConverted) { return new List() { Share.CrterionDictionaryGroup.General, Share.CrterionDictionaryGroup.Converted }; } @@ -361,15 +381,7 @@ namespace IRaCIS.Core.Domain.Models public Trial Trial { get; set; } - [Projectable] - - public bool IsAfterConvertedTask=>Subject.SubjectVisitTaskList.Where(t=>t.TrialReadingCriterionId == TrialReadingCriterionId - && t.DoctorUserId==DoctorUserId && t.IsConvertedTask - && t.TaskState==TaskState.Effect && - t.VisitTaskNum