From d2251e4cb24ff52543f142af6583e58c9d3025a8 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 7 Jul 2023 11:21:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=87=8D=E9=98=85=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BackGroundJob/CancelTaskQuartZJob.cs | 2 +- .../IRaCIS.Core.Application.xml | 64 -- .../Allocation/DTO/VisitTaskViewModel.cs | 27 - .../Service/Allocation/VisitTaskService.cs | 996 +----------------- .../ReadingImageTaskService.cs | 2 +- IRaCIS.Core.Domain/Allocation/VisitTask.cs | 2 - 6 files changed, 16 insertions(+), 1077 deletions(-) diff --git a/IRaCIS.Core.Application/BackGroundJob/CancelTaskQuartZJob.cs b/IRaCIS.Core.Application/BackGroundJob/CancelTaskQuartZJob.cs index 7a74f8ece..fdb402ecb 100644 --- a/IRaCIS.Core.Application/BackGroundJob/CancelTaskQuartZJob.cs +++ b/IRaCIS.Core.Application/BackGroundJob/CancelTaskQuartZJob.cs @@ -48,7 +48,7 @@ namespace IRaCIS.Application.Services.BackGroundJob { Guid id = (Guid)dataMap.Get("VisitTaskId"); - await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == id, u => new VisitTask() { ClaimUserId = null }, true); + await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == id && t.ReadingTaskState!=ReadingTaskState.HaveSigned, u => new VisitTask() { DoctorUserId = null }, true); } } diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 1947d3750..ef6169522 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -286,70 +286,6 @@ - - - 一次性分配所有医生 批量分配(添加),后端现在没限制 - - - - - - - 阅片人维度 Subject统计表 - - - - - - - - 获取Subject 分配医生情况 - - - - - - - - 取消Subject 分配的医生 - - - - - - - - 任务 手动分配 重新分配 确认 取消分配 - 分配 - - - - - - 获取手动分配 未分配的Subject列表(IsHaveAssigned 传递false) - - - - - - 批量为 多个Subject 分配医生 手动分配 IsReAssign 为true 批量删除 重新分配 - - - - - - - 批量取消Subject 分配的医生 - - 数量 - - - - 手动分配确认 绑定该Subject的已存在的任务给医生 - - - - 访视任务 diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index 7ac16c2c3..88beec092 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -108,33 +108,6 @@ namespace IRaCIS.Core.Application.ViewModel public CriterionType CriterionType { get; set; } - - ///// - ///// 仲裁对象 - ///// - //public ArbitrationRule ArbitrationRule { get; set; } = ArbitrationRule.Reading; - - - ///// - ///// 阅片模式 - ///// - //public ReadingMethod ReadingType { get; set; } = ReadingMethod.Double; - - ///// - ///// 全局阅片 - ///// - //public bool IsGlobalReading { get; set; } = true; - - ///// - ///// 仲裁阅片 - ///// - //public bool IsArbitrationReading { get; set; } = true; - - - ///// - ///// 肿瘤学阅片 原字段 IsClinicalReading - ///// - //public bool IsOncologyReading { get; set; } #endregion } diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index e1ed42cee..48071ca4a 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -154,492 +154,6 @@ namespace IRaCIS.Core.Application.Service.Allocation return (pageList, criterionConfig); } - /// - /// 一次性分配所有医生 批量分配(添加),后端现在没限制 - /// - /// - /// - [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task BatchAssignDoctorToSubject(BatchAssignDoctorToSubjectCommand command) - { - //var inOrder = _trialRepository.Where(t => t.Id == command.TrialId).Select(t => t.IsReadingTaskViewInOrder).FirstOrDefault(); - - //var inOrder = _trialReadingCriterionRepository.Where(t => t.Id == command.TrialReadingCriterionId).Select(t => t.IsReadingTaskViewInOrder).FirstOrDefault(); - - - foreach (var subjectId in command.SubjectIdList) - { - foreach (var doctorArm in command.DoctorArmList) - { - if (!await _subjectUserRepository.Where(t => t.TrialReadingCriterionId == command.TrialReadingCriterionId).AnyAsync(t => t.SubjectId == subjectId && t.DoctorUserId == doctorArm.DoctorUserId && t.ArmEnum == doctorArm.ArmEnum && t.IsConfirmed && t.OrignalSubjectUserId == null)) - { - await _subjectUserRepository.AddAsync(new SubjectUser() { TrialId = command.TrialId, TrialReadingCriterionId = command.TrialReadingCriterionId, ArmEnum = doctorArm.ArmEnum, DoctorUserId = doctorArm.DoctorUserId, SubjectId = subjectId, AssignTime = DateTime.Now }); - - //task.SuggesteFinishedTime = task.IsUrgent ? DateTime.Now.AddDays(2) : DateTime.Now.AddDays(7); - - } - - - Expression> updateWhere = t => t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.SubjectId == subjectId && t.ArmEnum == doctorArm.ArmEnum && t.TrialId == command.TrialId && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false; - - //if (inOrder) - //{ - // //针对有序阅片 只分配< 最小的 不是一致性核查通过状态 和不是失访 的访视 的任务 - // if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == subjectId && t.CheckState != CheckStateEnum.CVPassed && t.IsLostVisit == false)) - // { - // var notCheckPassedMinVisitNum = await _subjectVisitRepository.Where(t => t.SubjectId == subjectId && t.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitNum).Select(t => t.VisitNum).FirstOrDefaultAsync(); - - // updateWhere = updateWhere.And(t => t.VisitTaskNum < notCheckPassedMinVisitNum); - - // } - - //} - - - await _visitTaskRepository - .UpdatePartialFromQueryAsync(updateWhere, - u => new VisitTask() - { - AllocateTime = DateTime.Now, - DoctorUserId = doctorArm.DoctorUserId, - TaskAllocationState = TaskAllocationState.Allocated, - - SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget), - }); - } - } - - await _subjectUserRepository.SaveChangesAsync(); - - - - - - return ResponseOutput.Ok(); - } - - - - /// - /// 阅片人维度 Subject统计表 - /// - /// - /// - /// - public async Task<(List, object)> GetDoctorSubjectStat(Guid trialId, Guid trialReadingCriterionId) - { - var list = await _taskAllocationRuleRepository.Where(t => t.TrialId == trialId) - .Where(t => t.Enroll.EnrollReadingCategoryList.Any(t => t.TrialReadingCriterionId == trialReadingCriterionId)) - .ProjectTo(_mapper.ConfigurationProvider, new { trialReadingCriterionId = trialReadingCriterionId }).ToListAsync(); - - var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == trialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType, x.IsArbitrationReading, x.IsOncologyReading }).FirstOrDefaultAsync()).IfNullThrowException(); - - return (list, criterionConfig); - } - - - /// - /// 获取Subject 分配医生情况 - /// - /// - /// - /// - public async Task<(List, object)> GetSubjectAssignedDoctorList(Guid subjectId, Guid trialReadingCriterionId) - { - var list = await _subjectUserRepository.Where(t => t.SubjectId == subjectId && t.OrignalSubjectUserId == null && t.IsConfirmed && t.TrialReadingCriterionId == trialReadingCriterionId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - - var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == trialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType, x.IsGlobalReading, x.IsOncologyReading, x.IsArbitrationReading }).FirstOrDefaultAsync()).IfNullThrowException(); - - return (list, criterionConfig); - } - - - /// - /// 取消Subject 分配的医生 - /// - /// - /// - /// - [HttpPost] - [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task CancelSubjectAssignedDoctor(CancelSubjectDoctorCommand cancelCommand) - { - foreach (var command in cancelCommand.CancelList.Where(t => t.IsCancelAssign)) - { - if (await _visitTaskRepository.AnyAsync(t => t.TrialReadingCriterionId == cancelCommand.TrialReadingCriterionId && t.SubjectId == command.SubjectId && t.DoctorUserId == command.DoctorUserId && t.ArmEnum == command.ArmEnum && t.ReadingTaskState != ReadingTaskState.WaitReading)) - { - //---当前医生已开始做该Subject 该标准的任务,不允许取消分配 - throw new BusinessValidationFailedException(_localizer["VisitTask_DoctorConfigNotFound"]); - } - - await _subjectUserRepository.DeleteFromQueryAsync(t => t.Id == command.Id); - - await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.TrialReadingCriterionId == cancelCommand.TrialReadingCriterionId && t.SubjectId == command.SubjectId && t.DoctorUserId == command.DoctorUserId && t.ArmEnum == command.ArmEnum && t.ReadingTaskState == ReadingTaskState.WaitReading && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false, u => new VisitTask() - { - AllocateTime = null, - DoctorUserId = null, - TaskAllocationState = TaskAllocationState.NotAllocate, - SuggesteFinishedTime = null - }); - } - - var subjectId = cancelCommand.CancelList.First().SubjectId; - - await _repository.AddAsync(new SubjectCanceDoctor() { SubjectId = subjectId, Note = cancelCommand.Note }); - - await _visitTaskRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(); - } - - - - - /// - /// 任务 手动分配 重新分配 确认 取消分配 - /// 分配 - /// - /// - [HttpPost] - [UnitOfWork] - [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task AssignSubjectTaskToDoctor(AssignSubjectTaskToDoctorCommand assignSubjectTaskToDoctorCommand) - { - var visitTask = await _visitTaskRepository.FirstOrDefaultAsync(t => t.Id == assignSubjectTaskToDoctorCommand.Id); - - if (assignSubjectTaskToDoctorCommand.TaskOptType == TaskOptType.Assign || assignSubjectTaskToDoctorCommand.TaskOptType == TaskOptType.ReAssign) - { - //手动分配验证规则 - - if (visitTask.SourceSubjectVisitId != null) - { - - if (await _visitTaskRepository.AnyAsync(t => t.SourceSubjectVisitId == visitTask.SourceSubjectVisitId && t.TaskAllocationState == TaskAllocationState.Allocated && t.DoctorUserId == assignSubjectTaskToDoctorCommand.DoctorUserId && t.Id != visitTask.Id)) - { - //---其中一个任务已分配给该医生,不允许分配 - return ResponseOutput.NotOk(_localizer["VisitTask_BackendDataError"]); - } - } - else if (visitTask.SouceReadModuleId != null) - { - if (await _visitTaskRepository.AnyAsync(t => t.SouceReadModuleId == visitTask.SouceReadModuleId && t.TaskAllocationState == TaskAllocationState.Allocated && t.DoctorUserId == assignSubjectTaskToDoctorCommand.DoctorUserId && t.Id != visitTask.Id)) - { - //---其中一个任务已分配给该医生,不允许分配 - return ResponseOutput.NotOk(_localizer["VisitTask_BackendDataError"]); - } - } - else - { - //---出现脏数据 任务来源字段没有值 - throw new BusinessValidationFailedException(_localizer["VisitTask_DirtyData"]); - } - - //PM 回退了 但是还没生成任务 当前任务编号前有访视进行了回退就不允许分配 - if (await _subjectVisitRepository.AnyAsync(t => t.SubjectId == visitTask.SubjectId && t.IsPMBackOrReReading && t.VisitNum <= visitTask.VisitTaskNum)) - { - //---该受试者有访视进入了退回流程,还未经过一致性核查通过,不允许分配 - return ResponseOutput.NotOk(_localizer["VisitTask_MissingTaskSource"]); - } - - - visitTask.AllocateTime = DateTime.Now; - visitTask.DoctorUserId = assignSubjectTaskToDoctorCommand.DoctorUserId; - visitTask.TaskAllocationState = TaskAllocationState.Allocated; - - visitTask.SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget); - - - - //await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SourceSubjectVisitId, u => new SubjectVisit() { ReadingStatus = ReadingStatusEnum.ImageReading }); - - //await _readModuleRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SouceReadModuleId, u => new ReadModule() { ReadingStatus = ReadingStatusEnum.ImageReading }); - } - - else if (assignSubjectTaskToDoctorCommand.TaskOptType == TaskOptType.ReAssign) - { - //验证 是不是两个任务都给了同一个医生 - - - - //是否删除配置规则表里的 Subject 医生绑定关系 重新添加绑定关系 - - //是否其该Subject 其他访视 绑定的医生 也同时变更? - - - } - - else if (assignSubjectTaskToDoctorCommand.TaskOptType == TaskOptType.Confirm) - { - visitTask.TaskAllocationState = TaskAllocationState.Allocated; - } - else if (assignSubjectTaskToDoctorCommand.TaskOptType == TaskOptType.CancelAssign) - { - visitTask.AllocateTime = null; - visitTask.DoctorUserId = null; - visitTask.TaskAllocationState = TaskAllocationState.NotAllocate; - - //await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SourceSubjectVisitId, u => new SubjectVisit() { ReadingStatus = ReadingStatusEnum.TaskAllocate }); - - //await _readModuleRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SouceReadModuleId, u => new ReadModule() { ReadingStatus = ReadingStatusEnum.TaskAllocate }); - } - await _visitTaskRepository.SaveChangesAsync(); - return ResponseOutput.Ok(); - } - - - - - /// - /// 获取手动分配 未分配的Subject列表(IsHaveAssigned 传递false) - /// - /// - [HttpPost] - public async Task> GetSubjectAssignList(SubjectAssignQuery querySubjectAssign) - { - var subjectQuery = _subjectRepository.Where(t => t.TrialId == querySubjectAssign.TrialId) - .WhereIf(querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectVisitTaskList.Where(t => t.ArmEnum != Arm.JudgeArm).Any()) - .WhereIf(querySubjectAssign.IsJudgeDoctor, t => t.SubjectVisitTaskList.Where(t => t.ArmEnum == Arm.JudgeArm).Any()) - - .WhereIf(querySubjectAssign.SiteId != null, t => t.SiteId == querySubjectAssign.SiteId) - .WhereIf(querySubjectAssign.SubjectId != null, t => t.Id == querySubjectAssign.SubjectId) - - .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == true && querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).Any()) - .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == true && querySubjectAssign.IsJudgeDoctor, t => t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Any()) - .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == false && querySubjectAssign.IsJudgeDoctor == false, t => !t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).Any()) - .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == false && querySubjectAssign.IsJudgeDoctor, t => !t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Any()) - - - .WhereIf(querySubjectAssign.IsAssignConfirmed != null && querySubjectAssign.IsAssignConfirmed == true && querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).All(u => u.IsConfirmed)) - .WhereIf(querySubjectAssign.IsAssignConfirmed != null && querySubjectAssign.IsAssignConfirmed == true && querySubjectAssign.IsJudgeDoctor, t => t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).All(u => u.IsConfirmed)) - - .WhereIf(querySubjectAssign.IsAssignConfirmed != null && querySubjectAssign.IsAssignConfirmed == false && querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).Any(u => u.IsConfirmed == false)) - .WhereIf(querySubjectAssign.IsAssignConfirmed != null && querySubjectAssign.IsAssignConfirmed == false && querySubjectAssign.IsJudgeDoctor, t => t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Any(u => u.IsConfirmed == false)) - - .WhereIf(querySubjectAssign.DoctorUserId != null && querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId)) - .WhereIf(querySubjectAssign.DoctorUserId != null && querySubjectAssign.IsJudgeDoctor, t => t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId)) - .ProjectTo(_mapper.ConfigurationProvider, new { isJudgeDoctor = querySubjectAssign.IsJudgeDoctor }); - - var pageList = await subjectQuery.ToPagedListAsync(querySubjectAssign.PageIndex, querySubjectAssign.PageSize, string.IsNullOrWhiteSpace(querySubjectAssign.SortField) ? nameof(querySubjectAssign.SubjectId) : querySubjectAssign.SortField, querySubjectAssign.Asc); - - return pageList; - } - - - /// - /// 批量为 多个Subject 分配医生 手动分配 IsReAssign 为true 批量删除 重新分配 - /// - /// - /// - [HttpPost] - [UnitOfWork] - [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task AssignSubjectDoctor(AssginSubjectDoctorCommand assginSubjectDoctorCommand) - { - var trialId = assginSubjectDoctorCommand.TrialId; - var doctorUserIdList = assginSubjectDoctorCommand.DoctorUserIdArmList.Select(t => t.DoctorUserId).ToList(); - - if (assginSubjectDoctorCommand.IsJudgeDoctor) - { - if (assginSubjectDoctorCommand.IsReAssign) - { - - //if (await _visitTaskRepository.AnyAsync(t => assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.DoctorUserId != null && t.ArmEnum == Arm.JudgeArm)) - //{ - // throw new BusinessValidationFailedException("有Subject任务已应用,不允许重新分配"); - //} - - - await _subjectUserRepository.BatchDeleteNoTrackingAsync(t => doctorUserIdList.Contains(t.DoctorUserId) && assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.ArmEnum == Arm.JudgeArm); - } - - - } - else - { - if (assginSubjectDoctorCommand.IsReAssign) - { - - //if (await _visitTaskRepository.AnyAsync(t => assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm)) - //{ - // throw new BusinessValidationFailedException("有Subject任务已应用,不允许重新分配"); - //} - - - await _subjectUserRepository.BatchDeleteNoTrackingAsync(t => doctorUserIdList.Contains(t.DoctorUserId) && assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.ArmEnum != Arm.JudgeArm); - } - - - - } - foreach (var subjectId in assginSubjectDoctorCommand.SubjectIdList) - { - foreach (var doctorUserId in doctorUserIdList) - { - - var armEnum = assginSubjectDoctorCommand.DoctorUserIdArmList.Where(t => t.DoctorUserId == doctorUserId).First().ArmEnum; - - - if (await _subjectUserRepository.AnyAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.DoctorUserId == doctorUserId && t.ArmEnum != armEnum && t.OrignalSubjectUserId == null)) - { - //---有Subject 在其他Arm组已有该医生,不允许在新的组添加该医生 - throw new BusinessValidationFailedException(_localizer["VisitTask_InconsistentSubjectStatus"]); - } - - if (await _subjectUserRepository.AnyAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.DoctorUserId == doctorUserId && t.ArmEnum == armEnum && t.OrignalSubjectUserId == null)) - { - //---有Subject 已有该Arm组的医生,不允许继续分配,请刷新页面,确认页面数据是否过期 - throw new BusinessValidationFailedException(_localizer["VisitTask_DuplicateDoctorInArm"]); - } - else - { - await _subjectUserRepository.AddAsync(new SubjectUser() { TrialId = trialId, SubjectId = subjectId, DoctorUserId = doctorUserId, ArmEnum = armEnum, AssignTime = DateTime.Now }); - - } - - } - - } - - - await _subjectUserRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(); - } - - /// - /// 批量取消Subject 分配的医生 - /// - /// 数量 - [HttpPost] - [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task CancelSubjectAssignDoctor(CancelSubjectAssignCommand cancelSubjectAssignCommand) - { - if (cancelSubjectAssignCommand.IsJudgeDoctor) - { - foreach (var subjectId in cancelSubjectAssignCommand.SubjectIdList) - { - if (await _visitTaskRepository.AnyAsync(t => t.SubjectId == subjectId && t.DoctorUserId != null && t.ArmEnum == Arm.JudgeArm)) - { - //---有Subject任务已应用,不允许取消分配 - throw new BusinessValidationFailedException(_localizer["VisitTask_DoctorAlreadyInArm"]); - } - - await _subjectUserRepository.DeleteFromQueryAsync(t => t.SubjectId == subjectId && t.ArmEnum == Arm.JudgeArm); - } - } - else - { - foreach (var subjectId in cancelSubjectAssignCommand.SubjectIdList) - { - if (await _visitTaskRepository.AnyAsync(t => t.SubjectId == subjectId && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm)) - { - //---有Subject任务已应用,不允许取消分配 - throw new BusinessValidationFailedException(_localizer["VisitTask_DoctorAlreadyInArm"]); - } - - await _subjectUserRepository.DeleteFromQueryAsync(t => t.SubjectId == subjectId && t.ArmEnum != Arm.JudgeArm); - } - } - - await _subjectUserRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(); - } - - - /// - /// 手动分配确认 绑定该Subject的已存在的任务给医生 - /// - /// - /// - [HttpPost] - [UnitOfWork] - [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] - public async Task ManualAssignDoctorApplyTask(AssignConfirmCommand assignConfirmCommand) - { - var trialId = assignConfirmCommand.TrialId; - - //获取项目配置 判断应该分配几个医生 - //var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.ReadingType, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.TaskAllocateObjEnum }).FirstOrDefaultAsync()).IfNullThrowException(); - - //需要确认的Subject - var subjectIdList = assignConfirmCommand.SubjectDoctorUserList.Select(t => t.SubjectId).ToList(); - - //将关系确认 - if (assignConfirmCommand.SubjectDoctorUserList.Count == 0) - { - await _subjectUserRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.IsConfirmed == false && t.OrignalSubjectUserId == null, u => new SubjectUser() { IsConfirmed = true }); - } - else - { - await _subjectUserRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.IsConfirmed == false && t.OrignalSubjectUserId == null - && subjectIdList.Contains(t.SubjectId), u => new SubjectUser() { IsConfirmed = true }); - } - - - var taskList = _visitTaskRepository.Where(t => t.TrialId == assignConfirmCommand.TrialId && t.DoctorUserId == null, true) - .WhereIf(subjectIdList.Count() > 0 && assignConfirmCommand.IsJudgeDoctor == false, t => subjectIdList.Contains(t.SubjectId) && t.Subject.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).Any()) - .WhereIf(subjectIdList.Count() > 0 && assignConfirmCommand.IsJudgeDoctor, t => subjectIdList.Contains(t.SubjectId) && t.Subject.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Any()) - //过滤掉 那些回退的subject - .Where(t => !t.Subject.SubjectVisitList.Any(t => t.IsPMBackOrReReading)) - - .ToList(); - - - foreach (var subjectTaskGroup in taskList.GroupBy(t => t.SubjectId)) - { - var subjectId = subjectTaskGroup.Key; - - - - //如果数据为空 那么就是确认所有已分配的 - List subjectDoctorIdArmList = new List(); - - if (assignConfirmCommand.SubjectDoctorUserList.Count == 0) - { - subjectDoctorIdArmList = _subjectUserRepository.Where(t => t.SubjectId == subjectId && t.OrignalSubjectUserId == null).Select(t => new DoctorArm() { DoctorUserId = t.DoctorUserId, ArmEnum = t.ArmEnum }).ToList(); - } - else - { - subjectDoctorIdArmList = assignConfirmCommand.SubjectDoctorUserList.Where(t => t.SubjectId == subjectId).First().DoctorUserIdArmList; - } - - - foreach (var task in subjectTaskGroup.OrderBy(t => t.ArmEnum).ToList()) - { - - var subjectDoctorArm = subjectDoctorIdArmList.Where(t => t.ArmEnum == task.ArmEnum).FirstOrDefault(); - - if (subjectDoctorArm != null) - { - task.DoctorUserId = subjectDoctorArm.DoctorUserId; - task.AllocateTime = DateTime.Now; - task.TaskAllocationState = TaskAllocationState.Allocated; - - task.SuggesteFinishedTime = /*task.IsUrgent ? DateTime.Now.AddDays(2) : DateTime.Now.AddDays(7)*/ GetSuggessFinishTime(true, UrgentType.NotUrget); - - await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == task.SourceSubjectVisitId, u => new SubjectVisit() { ReadingStatus = ReadingStatusEnum.ImageReading }); - - await _readModuleRepository.BatchUpdateNoTrackingAsync(t => t.Id == task.SouceReadModuleId, u => new ReadModule() { ReadingStatus = ReadingStatusEnum.ImageReading }); - - - } - else - { - //---在配置表中未找到配置的医生,无法应用绑定,请核对数据 - throw new BusinessValidationFailedException(_localizer["VisitTask_TaskAlreadyApplied"]); - } - - } - } - - - - await _visitTaskRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(); - } - /// @@ -1062,7 +576,7 @@ namespace IRaCIS.Core.Application.Service.Allocation var visitQuery = _visitTaskRepository .Where(x => x.TrialId == inDto.TrialId && x.TaskState == TaskState.Effect) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline, - t=>t.Subject.SubjectVisitTaskList.Any(c=>c.SourceSubjectVisit.IsBaseLine==true && c.ReadingTaskState==ReadingTaskState.HaveSigned)) + t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned)) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit, t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned)) @@ -1333,7 +847,7 @@ namespace IRaCIS.Core.Application.Service.Allocation } - if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer) + if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI) { task.ReReadingApplyState = ReReadingApplyState.DocotorHaveApplyed; @@ -1360,7 +874,7 @@ namespace IRaCIS.Core.Application.Service.Allocation var originalTask = pmApply.OriginalReReadingTask; //PM 有序影响列表 - if (await _visitTaskRepository.Where(t => t.TrialId == originalTask.TrialId && t.SubjectId == originalTask.SubjectId && t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.TrialReadingCriterionId == originalTask.TrialReadingCriterionId && t.VisitTaskNum >= originalTask.VisitTaskNum) + if (await _visitTaskRepository.Where(t => t.TrialId == originalTask.TrialId && t.SubjectId == originalTask.SubjectId && t.TaskState == TaskState.Effect /*&& t.TaskAllocationState == TaskAllocationState.Allocated*/ && t.IsAnalysisCreate == false && t.TrialReadingCriterionId == originalTask.TrialReadingCriterionId && t.VisitTaskNum >= originalTask.VisitTaskNum) .AnyAsync(t => t.VisitTaskNum == task.VisitTaskNum)) { //---当前为有序阅片,影像存在问题,项目组已申请回退,暂不能申请重阅 @@ -1540,7 +1054,7 @@ namespace IRaCIS.Core.Application.Service.Allocation visitTaskReReadingAppply.RequestReReadingRejectReason = agreeReReadingCommand.RequestReReadingRejectReason; - Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == origenalTask.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) && t.TaskAllocationState == TaskAllocationState.Allocated; + Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == origenalTask.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze); //是否是一致性分析任务 正常申请 会影响一致性分析任务 filterExpression = filterExpression.And(t => t.IsAnalysisCreate == origenalTask.IsAnalysisCreate); @@ -1586,289 +1100,18 @@ namespace IRaCIS.Core.Application.Service.Allocation if (agreeReReadingCommand.RequestReReadingResultEnum == RequestReReadingResult.Agree) { - //PM申请 SPM / CPM审批 回退访视,在此不生成访视任务 影响多个标准的任务 - if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.TrialGroupApply && (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM)) + + //IR申请 PM 审批 注意这里有一致性分析的申请同意 不会回退访视,在此要生成影响的访视任务 + if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.DocotorApply && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager ) { - #region PM 申请两个IR 同一访视,其他人的申请记录也设置为同意 不会出现,因为在未处理前 一个Subject只能申请一次 - - - // await _visitTaskReReadingRepository.BatchUpdateNoTrackingAsync(t => t.OriginalReReadingTask.SubjectId == origenalTask.SubjectId && - // t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed && - // t.RequestReReadingType == RequestReReadingType.TrialGroupApply && - //t.OriginalReReadingTask.VisitTaskNum == origenalTask.VisitTaskNum && - //t.Id != item.Id, u => new VisitTaskReReading() - //{ - // RequestReReadingConfirmUserId = _userInfo.Id, - // RequestReReadingResultEnum = RequestReReadingResult.Agree, - //}); - - // //只更新 PM 申请 同一访视的数据 - // await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == origenalTask.SubjectId && - // t.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed && - // t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId && - // t.IsAnalysisCreate == origenalTask.IsAnalysisCreate && - // t.VisitTaskNum == origenalTask.VisitTaskNum && - // t.Id != origenalTask.Id, u => new VisitTask() - // { - // ReReadingApplyState = ReReadingApplyState.Agree - // }); - #endregion - - // 不管有序 无序 都会 回退访视 - if (origenalTask.ReadingCategory == ReadingCategory.Visit) - { - //执行类似一致性核查回退流程 - await VisitBackAsync(origenalTask.SourceSubjectVisitId); - - } - else - { - //---仅允许同意访视类型的任务重阅 - throw new BusinessValidationFailedException(_localizer["VisitTask_ReReadTaskNotApplied"]); - } //有序阅片 if (criterionConfig.IsReadingTaskViewInOrder) { - - //访视影响当前以及当前之后的 两个阅片人的 filterExpression = filterExpression.And(t => t.VisitTaskNum >= origenalTask.VisitTaskNum); - #region 影响的任务 - - - - var influenceTaskList = await _visitTaskRepository.Where(filterExpression, true).ToListAsync(); - - var trakingOrigenalTask = influenceTaskList.Where(t => t.Id == origenalTask.Id).FirstOrDefault(); - - foreach (var influenceTask in influenceTaskList) - { - //处理申请的任务 - if (influenceTask.Id == origenalTask.Id) - { - ReReadingTaskTrackingDeal(influenceTask, agreeReReadingCommand); - - await InfluenceAddtioncalEvaluationCritrionAsync(origenalTask, influenceTaskList.Where(t => t.Id != origenalTask.Id).Where(t => t.SourceSubjectVisitId != null).Select(t => (Guid)t.SourceSubjectVisitId).Distinct().ToList()); - - await SetReReadingOrBackInfluenceAnalysisAsync(origenalTask.SubjectId); - - await SetMedicalReviewInvalidAsync(influenceTaskList); - - } - - - if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) - { - influenceTask.TaskState = TaskState.HaveReturned; - - trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); - } - else - { - influenceTask.TaskState = TaskState.Adbandon; - - trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Abandon }); - } - - #region 废弃 分配 留存 - - ////申请的访视 要不是重阅重置,要不就是失效 不会存在取消分配 - //if (influenceTask.ReadingCategory == ReadingCategory.Visit && influenceTask.VisitTaskNum != origenalTask.VisitTaskNum) - //{ - // if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) - // { - // influenceTask.TaskState = TaskState.HaveReturned; - - // trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); - // } - // else if (influenceTask.ReadingTaskState == ReadingTaskState.Reading) - // { - // influenceTask.TaskState = TaskState.Adbandon; - // trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Abandon }); - // } - // else - // { - // influenceTask.DoctorUserId = null; - // influenceTask.AllocateTime = null; - // influenceTask.SuggesteFinishedTime = null; - // influenceTask.TaskAllocationState = TaskAllocationState.NotAllocate; - - // trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.CancelAssign }); - // } - //} - ////当前访视 - //else - //{ - // if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) - // { - // influenceTask.TaskState = TaskState.HaveReturned; - - // trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); - // } - // else - // { - // influenceTask.TaskState = TaskState.Adbandon; - - // trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Abandon }); - // } - - //} - - #endregion - - - } - #endregion - } - //无序阅片 没有 全局 肿瘤学 - else - { - - // 1.当前任务及裁判任务 - // 2.影响所有阅片人的任务 - - var judegTaskNum = origenalTask.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge]; - - filterExpression = filterExpression.And(t => t.VisitTaskNum == origenalTask.VisitTaskNum || t.VisitTaskNum == judegTaskNum); - - - var influenceTaskList = await _visitTaskRepository.Where(filterExpression, true).ToListAsync(); - - //影像列表为空就为null - var trakingOrigenalTask = influenceTaskList.Where(t => t.Id == origenalTask.Id).FirstOrDefault(); - - foreach (var influenceTask in influenceTaskList) - { - //处理申请的任务 - if (influenceTask.Id == origenalTask.Id) - { - ReReadingTaskTrackingDeal(influenceTask, agreeReReadingCommand); - - - await SetReReadingOrBackInfluenceAnalysisAsync(origenalTask.SubjectId); - - await SetMedicalReviewInvalidAsync(influenceTaskList); - - trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); - } - else - { - if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) - { - influenceTask.TaskState = TaskState.HaveReturned; - - trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); - } - else - { - influenceTask.TaskState = TaskState.Adbandon; - - trakingOrigenalTask?.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Abandon }); - } - } - } - - } - - - - } - //IR申请 PM 审批 注意这里有一致性分析的申请同意 不会回退访视,在此要生成影响的访视任务 - else if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.DocotorApply && (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.AIR)) - { - - - - //有序阅片 - if (criterionConfig.IsReadingTaskViewInOrder) - { - #region 有序 IR 申请 重阅 影响的其他访视查询 - - - - switch (origenalTask.ReadingCategory) - { - case ReadingCategory.Visit: - //影响后续访视已经读完的,正在读的,未读的不做处理 以及其他类型任务 - - //申请的是转化的,那么影响列表要排除转化之前的 - if (criterionConfig.CriterionType == CriterionType.IRECIST1Point1 && origenalTask.BeforeConvertedTaskId != null) - { - - - filterExpression = filterExpression.And(t => (t.VisitTaskNum > origenalTask.VisitTaskNum && - ( - ((t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) && t.DoctorUserId == origenalTask.DoctorUserId) - // 裁判 肿瘤学是另外的医生做 - || t.ReadingCategory == ReadingCategory.Judge - || t.ReadingCategory == ReadingCategory.Oncology - )) || t.Id == origenalTask.Id) - ; - } - else if (isIR1Point1AdditionalAssessmentBaseline) - { - filterExpression = filterExpression.And(t => t.VisitTaskNum >= origenalTask.VisitTaskNum && - ((( - ((t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) && t.DoctorUserId == origenalTask.DoctorUserId) - // 裁判 肿瘤学是另外的医生做 - || t.ReadingCategory == ReadingCategory.Judge - || t.ReadingCategory == ReadingCategory.Oncology - ) && t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId) || (t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB)) - ); - } - else - { - filterExpression = filterExpression.And(t => t.VisitTaskNum >= origenalTask.VisitTaskNum && - ( - ((t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) && t.DoctorUserId == origenalTask.DoctorUserId) - // 裁判 肿瘤学是另外的医生做 - || t.ReadingCategory == ReadingCategory.Judge - || t.ReadingCategory == ReadingCategory.Oncology - ) - ); - } - - - - - - - break; - - - //不影响后续访视: (t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState != ReadingTaskState.WaitReading) || - case ReadingCategory.Global: - - filterExpression = filterExpression.And(t => t.VisitTaskNum > origenalTask.VisitTaskNum && - ((t.DoctorUserId == origenalTask.DoctorUserId && t.ReadingCategory == ReadingCategory.Global) - || (t.ReadingCategory == ReadingCategory.Oncology) || (t.ReadingCategory == ReadingCategory.Judge)) || t.Id == origenalTask.Id); - break; - - case ReadingCategory.Oncology: - - //仅仅影响自己 后续任务如果是访视任务、全局任务或裁判任务,均不处理 - filterExpression = filterExpression.And(t => t.Id == origenalTask.Id); - break; - - case ReadingCategory.Judge: - - //裁判的影响自己 和后续肿瘤学阅片(不是自己做的) - filterExpression = filterExpression.And(t => t.Id == origenalTask.Id || t.VisitTaskNum > origenalTask.VisitTaskNum && t.ReadingCategory == ReadingCategory.Oncology); - - break; - - - default: - //---不支持重阅的任务类型 - throw new BusinessValidationFailedException(_localizer["VisitTask_UnsupportedTaskType"]); - - } - - #endregion - #region 这里时影响其他的任务 /*不包括申请的任务 申请的任务,在上面会统一处理*/ @@ -1989,18 +1232,6 @@ namespace IRaCIS.Core.Application.Service.Allocation _ = _readingTaskQuestionAnswerRepository.AddRangeAsync(list).Result; } - //else if (origenalTask.ReadingCategory == ReadingCategory.Global) - //{ - // var list = _repository.Where(t => t.GlobalTaskId == origenalTask.Id).ToList(); - - // foreach (var item in list) - // { - // item.Id = Guid.Empty; - // item.GlobalTaskId = newTask.Id; - // } - - // _ = _repository.AddRangeAsync(list).Result; - //} } @@ -2020,18 +1251,7 @@ namespace IRaCIS.Core.Application.Service.Allocation _ = _readingTaskQuestionAnswerRepository.AddRangeAsync(list).Result; } - //else if (origenalTask.ReadingCategory == ReadingCategory.Global) - //{ - // var list = _repository.Where(t => t.GlobalTaskId == origenalTask.Id).ToList(); - - // foreach (var item in list) - // { - // item.Id = Guid.Empty; - // item.GlobalTaskId = newTask.Id; - // } - - // _ = _repository.AddRangeAsync(list).Result; - //} + } } @@ -2257,7 +1477,7 @@ namespace IRaCIS.Core.Application.Service.Allocation return ResponseOutput.NotOk(_localizer["VisitTask_ConsistencyTaskCannotBeReturned"]); } - Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == task.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) && t.TaskAllocationState == TaskAllocationState.Allocated; + Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == task.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) /*&& t.TaskAllocationState == TaskAllocationState.Allocated*/; if (criterionConfig.CriterionType == CriterionType.RECIST1Point1 && criterionConfig.IsAdditionalAssessment) @@ -2291,7 +1511,6 @@ namespace IRaCIS.Core.Application.Service.Allocation if (criterionConfig.IsReadingTaskViewInOrder) { - //Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == task.SubjectId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated; filterExpression = filterExpression.And(t => t.IsAnalysisCreate == false); @@ -2348,50 +1567,7 @@ namespace IRaCIS.Core.Application.Service.Allocation origenalTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Abandon }); } - #region 废弃取消分配留存 - ////申请的访视 要不是重阅重置,要不就是失效 不会存在取消分配 - //if (influenceTask.ReadingCategory == ReadingCategory.Visit && influenceTask.VisitTaskNum != task.VisitTaskNum) - //{ - // //后续访视处理访视 - // if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) - // { - // influenceTask.TaskState = TaskState.HaveReturned; - - // origenalTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); - // } - // else if (influenceTask.ReadingTaskState == ReadingTaskState.Reading) - // { - // influenceTask.TaskState = TaskState.Adbandon; - // origenalTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Abandon }); - // } - // else - // { - // influenceTask.DoctorUserId = null; - // influenceTask.AllocateTime = null; - // influenceTask.SuggesteFinishedTime = null; - // influenceTask.TaskAllocationState = TaskAllocationState.NotAllocate; - - // origenalTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.CancelAssign }); - // } - //} - //else - //{ - // //申请的访视 全局肿瘤学 - - // if (influenceTask.ReadingTaskState == ReadingTaskState.HaveSigned) - // { - // influenceTask.TaskState = TaskState.HaveReturned; - // origenalTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Return }); - // } - // else - // { - // influenceTask.TaskState = TaskState.Adbandon; - // origenalTask.TaskInfluenceList.Add(new TaskInfluence() { InfluenceTaskId = influenceTask.Id, OptType = ReReadingOrBackOptType.Abandon }); - // } - - //} - #endregion @@ -2442,11 +1618,6 @@ namespace IRaCIS.Core.Application.Service.Allocation return ResponseOutput.NotOk(_localizer["VisitTask_PMOnlyAllowedForReturn"]); } - - - - - await _visitTaskRepository.SaveChangesAsync(); return ResponseOutput.Ok(); @@ -2593,11 +1764,10 @@ namespace IRaCIS.Core.Application.Service.Allocation var filterObj = (await _visitTaskRepository.FirstOrDefaultNoTrackingAsync(t => t.Id == taskId)).IfNullThrowException(); var trialId = filterObj.TrialId; - //var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.IsReadingTaskViewInOrder, t.ReadingType }).FirstOrDefaultAsync()).IfNullThrowException(); var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == filterObj.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.CriterionType, x.IsAdditionalAssessment, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException(); - Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == filterObj.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) && t.TaskAllocationState == TaskAllocationState.Allocated; + Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == filterObj.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) /*&& t.TaskAllocationState == TaskAllocationState.Allocated*/; //是否是一致性分析任务 (一致性分析的任务 不会产生裁判 肿瘤学 仅仅有生成的访视和全局) @@ -2654,8 +1824,8 @@ namespace IRaCIS.Core.Application.Service.Allocation //IR 申请 PM 同意 仅仅影响自己 - if ((_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.IndependentReviewer)) - || (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer && applyId == null)) + if ((_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && (t.CreateUser.UserTypeEnum == UserTypeEnum.SR|| t.CreateUser.UserTypeEnum == UserTypeEnum.PI))) + || ( (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR|| _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI) && applyId == null)) { //当前任务及其之后的所有访视任务、全局任务、裁判任务、肿瘤学阅片任务 @@ -2664,100 +1834,7 @@ namespace IRaCIS.Core.Application.Service.Allocation if (criterionConfig.IsReadingTaskViewInOrder) { - switch (filterObj.ReadingCategory) - { - case ReadingCategory.Visit: - //影响当前医生 以及当前医生之后的 1、访视任务 已经读完的 - //2、后续任务如果是全局、肿瘤学阅片任务,状态为阅片完成标记为重阅重置;若在阅片中,则标记为失效;若为待阅片,则标记为失效; - //3、当前任务、后续访视任务或者全局任务触发了裁判任务,若裁判任务状态为阅片完成,则标记为重阅重置;若在阅片中或待阅片,则标记为失效 - - //申请的是转化的,那么影响列表要排除转化之前的 - if (criterionConfig.CriterionType == CriterionType.IRECIST1Point1 && filterObj.BeforeConvertedTaskId != null) - { - - - filterExpression = filterExpression.And(t => (t.VisitTaskNum > filterObj.VisitTaskNum && - ( - ((t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) && t.DoctorUserId == filterObj.DoctorUserId) - // 裁判 肿瘤学是另外的医生做 - || t.ReadingCategory == ReadingCategory.Judge - || t.ReadingCategory == ReadingCategory.Oncology - )) || t.Id == filterObj.Id) - ; - } - // IR 申请1.1 基线重阅,影响附加评估所有的任务 - else if (isIR1Point1AdditionalAssessmentBaseline) - { - filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum && - ((( - ((t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) && t.DoctorUserId == filterObj.DoctorUserId) - // 裁判 肿瘤学是另外的医生做 - || t.ReadingCategory == ReadingCategory.Judge - || t.ReadingCategory == ReadingCategory.Oncology - ) && t.TrialReadingCriterionId == filterObj.TrialReadingCriterionId) || (t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB)) - ); - } - else - { - filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum && - ( - ((t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global) && t.DoctorUserId == filterObj.DoctorUserId) - // 裁判 肿瘤学是另外的医生做 - || t.ReadingCategory == ReadingCategory.Judge - || t.ReadingCategory == ReadingCategory.Oncology - ) - ); - } - - - - - - break; - - case ReadingCategory.Global: - - // 1、后续任务如果是访视任务,均不处理; - //2、后续任务如果是全局、状态为阅片完成则标记为重阅重置,若阅片中或待阅片则不处理; - //3、当前任务或者全局任务触发了裁判任务,若裁判任务状态为阅片完成,则标记为重阅重置;若在阅片中或待阅片,则标记为失效 - //4、后续任务为肿瘤学阅片任务,状态为阅片完成标记为重阅重置;若在阅片中,则标记为失效;若为待阅片,则标记为失效; - - //filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum && - //((t.DoctorUserId == filterObj.DoctorUserId && ((t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned) || t.ReadingCategory == ReadingCategory.Global)) || (t.ReadingCategory == ReadingCategory.Oncology) || (t.ReadingCategory == ReadingCategory.Judge))); - - - filterExpression = filterExpression.And(t => t.VisitTaskNum > filterObj.VisitTaskNum && - ( - (t.DoctorUserId == filterObj.DoctorUserId && t.ReadingCategory == ReadingCategory.Global) - || (t.ReadingCategory == ReadingCategory.Oncology) - || (t.ReadingCategory == ReadingCategory.Judge) - ) || t.Id == filterObj.Id); - - break; - - //1、后续任务如果是访视任务、全局任务或裁判任务,均不处理; - case ReadingCategory.Oncology: - - //仅仅影响自己 - filterExpression = filterExpression.And(t => t.Id == filterObj.Id); - break; - - //(只允许申请该阅片人最后一次完成裁判的任务重阅)申请的时候做了限制 - case ReadingCategory.Judge: - - // 1、后续任务如果是访视任务、全局任务,均不处理; - //2、后续若有肿瘤学阅片,若肿瘤学阅片任务状态为阅片完成,则标记为重阅重置;若为阅片中则标记为失效,如为待阅片,则取消分配 - - //裁判的影响自己 和后续肿瘤学阅片(不是自己做的) - filterExpression = filterExpression.And(t => t.Id == filterObj.Id || t.VisitTaskNum > filterObj.VisitTaskNum && t.ReadingCategory == ReadingCategory.Oncology); - - break; - - - default: - //---不支持重阅的任务类型 - throw new BusinessValidationFailedException(_localizer["VisitTask_UnsupportedTaskType"]); - } + filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum); } //无序 else @@ -2770,51 +1847,6 @@ namespace IRaCIS.Core.Application.Service.Allocation //throw new BusinessValidationFailedException("仅允许PM 同意 IR 申请的任务"); } - //PM 影响所有阅片人 仅仅针对访视 SPM CPM 掉用 - - else if (((_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM) && applyId != null && await _visitTaskReReadingRepository.AnyAsync(t => t.Id == applyId && t.CreateUser.UserTypeEnum == UserTypeEnum.ProjectManager) && filterObj.IsAnalysisCreate == false && filterObj.ReadingCategory == ReadingCategory.Visit) - || (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager && applyId == null)) - { - - - - - //有序 - if (criterionConfig.IsReadingTaskViewInOrder) - { - switch (filterObj.ReadingCategory) - { - case ReadingCategory.Visit: - - //访视影响当前以及当前之后的 两个阅片人的 - filterExpression = filterExpression.And(t => t.VisitTaskNum >= filterObj.VisitTaskNum); - - break; - - default: - //---不支持重阅的任务类型 - throw new BusinessValidationFailedException(_localizer["VisitTask_UnsupportedTaskType"]); - } - - if (await _visitTaskReReadingRepository.AnyAsync(t => t.RequestReReadingType == RequestReReadingType.DocotorApply && t.RequestReReadingResultEnum == RequestReReadingResult.Default && - t.OriginalReReadingTask.VisitTaskNum >= filterObj.VisitTaskNum && t.OriginalReReadingTask.SubjectId == filterObj.SubjectId && t.OriginalReReadingTask.TrialReadingCriterionId == filterObj.TrialReadingCriterionId && t.OriginalReReadingTask.IsAnalysisCreate == filterObj.IsAnalysisCreate)) - { - isIRAppyTaskInfluenced = true; - } - } - //无序 - else - { - // 1.当前任务及裁判任务 - // 2.影响所有阅片人的任务 - - var judegTaskNum = filterObj.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge]; - - filterExpression = filterExpression.And(t => t.VisitTaskNum == filterObj.VisitTaskNum || t.VisitTaskNum == judegTaskNum); - } - - //throw new BusinessValidationFailedException("仅允许SPM CPM 同意 PM 申请的非 一致性分析的访视任务"); - } else { //---当前用户查看列表未定义 @@ -3041,6 +2073,6 @@ namespace IRaCIS.Core.Application.Service.Allocation return list; } - + } } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 0030802b5..3215f66f5 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -2535,7 +2535,7 @@ namespace IRaCIS.Application.Services { if (claimSubjectDto.IsClaim) { - await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.VisitTaskId, u => new VisitTask() { ClaimUserId = _userInfo.Id }, true); + await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.VisitTaskId, u => new VisitTask() { DoctorUserId = _userInfo.Id }, true); IJobDetail job = JobBuilder.Create() .UsingJobData("VisitTaskId",(Guid) claimSubjectDto.VisitTaskId) // 传递GUID参数给任务 diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index e471274f9..a6ad76911 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -426,8 +426,6 @@ namespace IRaCIS.Core.Domain.Models } } - public Guid? ClaimUserId { get; set; } - } ///