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 fc135fe28..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); @@ -1636,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], @@ -1688,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/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/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.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index 556ccf5ff..b899b9a48 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -293,10 +293,10 @@ 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(转化的任务才有该值) @@ -304,15 +304,15 @@ namespace IRaCIS.Core.Domain.Models public Guid? BeforeConvertedTaskId { get; set; } - // [Projectable] + [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(); + 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