From bcd1476d2db619e32e4478b66cad1c6a08dfbfa8 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 7 Jul 2023 16:18:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=98=85=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs | 7 +- .../IRaCIS.Core.Application.xml | 12 +- .../Allocation/DTO/VisitTaskViewModel.cs | 38 +++- .../Service/Allocation/VisitTaskService.cs | 191 +++++++----------- .../Service/Allocation/_MapConfig.cs | 6 +- .../ReadingImageTaskService.cs | 34 +++- .../Triggers/VisitTaskIAfterSignTrigger.cs | 85 ++++---- ...askIsFrontTaskNeedSignButNotSignTrigger.cs | 102 ---------- IRaCIS.Core.Domain/Allocation/VisitTask.cs | 15 ++ 9 files changed, 196 insertions(+), 294 deletions(-) diff --git a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs index 8e737a5a2..5ce0f00d7 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs @@ -44,11 +44,8 @@ namespace IRaCIS.Core.API triggerOptions.AddTrigger(); //triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); - - - - - + triggerOptions.AddTrigger(); + }); diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index ef6169522..bb9980db9 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -280,10 +280,11 @@ - + - Subject 任务类型 统计 +分配情况 + 获取项目下 阅片人下拉 + @@ -294,13 +295,6 @@ - - - 裁判任务 - - - - PM阅片跟踪 diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index 88beec092..01b6b0444 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -147,6 +147,23 @@ namespace IRaCIS.Core.Application.ViewModel } + public class PIReaingTaskView: ReadingTaskView + { + public Guid? FirstAuditUserId { get; set; } + + public string FirstAuditUserName { get; set; } + public DateTime? FirstAuditTime { get; set; } + + public int AuditResultEnum { get; set; } + + public Guid? LatestReplyUserId { get; set; } + + public string LatestReplyUserName { get; set; } + public DateTime? LatestReplyTime { get; set; } + + + } + public class ReadingTaskView : VisitTaskView { @@ -159,7 +176,9 @@ namespace IRaCIS.Core.Application.ViewModel public Guid? SourceSubjectVisitId { get; set; } public Guid? SouceReadModuleId { get; set; } - //public bool IsAfterConvertedTask { get; set; } + + + } @@ -360,6 +379,23 @@ namespace IRaCIS.Core.Application.ViewModel public PIAuditState? PIAuditState { get; set; } + + + public string? FirstAuditUserName { get; set; } + + + public bool? IsWaitPIAudit { get; set; } + + public int? AuditResultEnum { get; set; } + + + public string? LatestReplyUserName { get; set; } + + public DateTime? FirstAuditTimeBegin { get; set; } + public DateTime? FirstAuditTimeEnd { get; set; } + public DateTime? LatestReplyTimeBegin { get; set; } + public DateTime? LatestReplyTimeEnd { get; set; } + } diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 48071ca4a..509433c0a 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -109,53 +109,35 @@ namespace IRaCIS.Core.Application.Service.Allocation .Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, IsAutoCreate = t.IsAutoCreate, IsAdditionalAssessment = t.IsAdditionalAssessment, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, ReadingType = t.ReadingType, ReadingInfoSignTime = t.ReadingInfoSignTime }) .ToListAsync(); - //if (list.Count == 0) - //{ - // //---该项目还未确认任何一个阅片标准 - // throw new BusinessValidationFailedException(_localizer["VisitTask_VisitTask_TaskAlreadyApplied"]); - - //} - - return list.AsQueryable().WhereIf(isHaveSigned == true, t => t.ReadingInfoSignTime != null) .WhereIf(isAutoCreate == false, t => t.IsAutoCreate == isAutoCreate).ToList(); } - - /// - /// Subject 任务类型 统计 +分配情况 + /// 获取项目下 阅片人下拉 /// + /// /// - [HttpPost] - public async Task<(PageOutput, object?)> GetSubjectAssignAndTaskStatList(SubjectAssignStatQuery querySubjectAssign) + [HttpGet("{trialId:guid}")] + public async Task> GetTrialDoctorUserSelectList(Guid trialId) { + var query = from trialUser in _trialRepository.Where(t => t.Id == trialId ).SelectMany(t=>t.TrialUserList).Where(t=>t.User.UserTypeEnum==UserTypeEnum.SR || t.User.UserTypeEnum == UserTypeEnum.PI) + + select new TrialDoctorUserSelectView() + { + TrialId = trialUser.TrialId, + //ReadingType = enroll.Trial.ReadingType, + DoctorUserId = trialUser.UserId, + FullName = trialUser.User.FullName, + UserCode = trialUser.User.UserCode, + UserName = trialUser.User.UserName, + UserTypeEnum = trialUser.User.UserTypeRole.UserTypeEnum + }; - var isAddtinoarlCriterion = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == querySubjectAssign.TrialReadingCriterionId && t.IsAutoCreate == false); - - var subjectQuery = _subjectRepository.Where(t => t.TrialId == querySubjectAssign.TrialId && t.SubjectVisitTaskList.Any()) - .WhereIf(querySubjectAssign.SiteId != null, t => t.SiteId == querySubjectAssign.SiteId) - .WhereIf(querySubjectAssign.SubjectId != null, t => t.Id == querySubjectAssign.SubjectId) - .WhereIf(querySubjectAssign.DoctorUserId != null, t => t.SubjectDoctorList.Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId && t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId)) - .WhereIf(!string.IsNullOrEmpty(querySubjectAssign.SubjectCode), t => t.Code.Contains(querySubjectAssign.SubjectCode)) - .WhereIf(isAddtinoarlCriterion, t => t.SubjectCriteriaEvaluationList.Where(t => t.TrialReadingCriterionId == querySubjectAssign.TrialReadingCriterionId).Any(t => t.IsJoinEvaluation)) - - - .ProjectTo(_mapper.ConfigurationProvider, new { trialReadingCriterionId = querySubjectAssign.TrialReadingCriterionId }); - - - var pageList = await subjectQuery.ToPagedListAsync(querySubjectAssign.PageIndex, querySubjectAssign.PageSize, string.IsNullOrWhiteSpace(querySubjectAssign.SortField) ? nameof(querySubjectAssign.SubjectId) : querySubjectAssign.SortField, querySubjectAssign.Asc); - - - - var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == querySubjectAssign.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType, x.IsArbitrationReading, x.IsOncologyReading, x.IsGlobalReading }).FirstOrDefaultAsync()).IfNullThrowException(); - - return (pageList, criterionConfig); + return await query.ToListAsync(); } - - /// /// 访视任务 /// @@ -203,56 +185,9 @@ namespace IRaCIS.Core.Application.Service.Allocation - /// - /// 裁判任务 - /// - /// - /// - [HttpPost] - public async Task/*, object)*/> GetJudgeVisitTaskList(VisitTaskQuery queryVisitTask) - { - - var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false) - .Where(t => t.ReadingCategory == ReadingCategory.Judge) - - .WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) - .WhereIf(queryVisitTask.ReadingCategory != null, t => t.ReadingCategory == queryVisitTask.ReadingCategory) - .WhereIf(queryVisitTask.SiteId != null, t => t.Subject.SiteId == queryVisitTask.SiteId) - .WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) - .WhereIf(queryVisitTask.IsUrgent != null, t => t.IsUrgent == queryVisitTask.IsUrgent) - .WhereIf(queryVisitTask.DoctorUserId != null, t => t.DoctorUserId == queryVisitTask.DoctorUserId) - .WhereIf(queryVisitTask.TaskAllocationState != null, t => t.TaskAllocationState == queryVisitTask.TaskAllocationState) - .WhereIf(queryVisitTask.ReadingTaskState != null, t => t.ReadingTaskState == queryVisitTask.ReadingTaskState) - .WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId) - - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate == false)) - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.TaskName.Contains(queryVisitTask.TaskName) || t.TaskBlindName.Contains(queryVisitTask.TaskName)) - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate)) - .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate) - .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) - .ProjectTo(_mapper.ConfigurationProvider); - - var defalutSortArray = new string[] { nameof(VisitTask.IsUrgent) + " desc", nameof(VisitTask.SubjectId), nameof(VisitTaskView.VisitTaskNum) }; - - var pageList = await visitTaskQueryable.ToPagedListAsync(queryVisitTask.PageIndex, queryVisitTask.PageSize, queryVisitTask.SortField, queryVisitTask.Asc, string.IsNullOrWhiteSpace(queryVisitTask.SortField), defalutSortArray); - - return pageList; - //var trialTaskConfig = _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault(); - - //return (pageList, trialTaskConfig); - } - - - /// - /// PM阅片跟踪 - /// - /// - /// - [HttpPost] - public async Task<(PageOutput, object?)> GetReadingTaskList(VisitTaskQuery queryVisitTask) + private IQueryable GetReadingTaskQueryable(VisitTaskQuery queryVisitTask) { var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false) - //.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null) .WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) .WhereIf(queryVisitTask.SiteId != null, t => t.Subject.SiteId == queryVisitTask.SiteId) @@ -274,6 +209,49 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate)) .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate) .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) + + .WhereIf(queryVisitTask.IsWaitPIAudit ==true, t => t.FirstAuditUserId==null) + .WhereIf(queryVisitTask.IsWaitPIAudit == false, t => t.FirstAuditUserId != null) + + .WhereIf(queryVisitTask.FirstAuditTimeBegin != null, t => t.AllocateTime > queryVisitTask.FirstAuditTimeBegin) + .WhereIf(queryVisitTask.FirstAuditTimeEnd != null, t => t.AllocateTime < queryVisitTask.FirstAuditTimeEnd) + .WhereIf(queryVisitTask.LatestReplyTimeBegin != null, t => t.AllocateTime > queryVisitTask.LatestReplyTimeBegin) + .WhereIf(queryVisitTask.LatestReplyTimeEnd != null, t => t.AllocateTime < queryVisitTask.LatestReplyTimeEnd) + .WhereIf(queryVisitTask.AuditResultEnum != null, t => t.AuditResultEnum == queryVisitTask.AuditResultEnum) + + + ; + + return visitTaskQueryable; + } + + [HttpPost] + public async Task> > GetPIReadingAuditList(VisitTaskQuery queryVisitTask) + { + + var visitTaskQueryable = GetReadingTaskQueryable(queryVisitTask) + .ProjectTo(_mapper.ConfigurationProvider); + + var defalutSortArray = new string[] { nameof(VisitTask.IsUrgent) + " desc", nameof(VisitTask.SubjectId), nameof(VisitTask.VisitTaskNum) }; + + var pageList = await visitTaskQueryable.ToPagedListAsync(queryVisitTask.PageIndex, queryVisitTask.PageSize, queryVisitTask.SortField, queryVisitTask.Asc, string.IsNullOrWhiteSpace(queryVisitTask.SortField), defalutSortArray); + + var trialTaskConfig = _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault(); + + return ResponseOutput.Ok(pageList, trialTaskConfig); + } + + + + /// + /// PM阅片跟踪 + /// + /// + /// + [HttpPost] + public async Task>> GetReadingTaskList(VisitTaskQuery queryVisitTask) + { + var visitTaskQueryable = GetReadingTaskQueryable(queryVisitTask) .ProjectTo(_mapper.ConfigurationProvider); var defalutSortArray = new string[] { nameof(VisitTask.IsUrgent) + " desc", nameof(VisitTask.SubjectId), nameof(VisitTask.VisitTaskNum) }; @@ -282,10 +260,13 @@ namespace IRaCIS.Core.Application.Service.Allocation var trialTaskConfig = _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault(); - return (pageList, trialTaskConfig); + return ResponseOutput.Ok (pageList, trialTaskConfig); } + + + /// /// PM 重阅追踪 /// @@ -382,42 +363,6 @@ namespace IRaCIS.Core.Application.Service.Allocation } - //SPM 能看到项目组申请记录 - [HttpPost] - public async Task> GetSPMReReadingTaskList(VisitTaskQuery queryVisitTask) - { - var visitTaskQueryable = _visitTaskReReadingRepository.Where(t => t.RequestReReadingType == RequestReReadingType.TrialGroupApply && t.OriginalReReadingTask.IsAnalysisCreate == false) - .Where(t => t.OriginalReReadingTask.TrialId == queryVisitTask.TrialId) - .WhereIf(queryVisitTask.RootReReadingTaskId != null, t => t.RootReReadingTaskId == queryVisitTask.RootReReadingTaskId || t.OriginalReReadingTaskId == queryVisitTask.RootReReadingTaskId) - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskCode), t => t.OriginalReReadingTask.TaskCode.Contains(queryVisitTask.TaskCode!) || t.RootReReadingTask.TaskCode.Contains(queryVisitTask.TaskCode!)) - .WhereIf(queryVisitTask.TaskState != null, t => t.OriginalReReadingTask.TaskState == queryVisitTask.TaskState) - .WhereIf(queryVisitTask.SiteId != null, t => t.OriginalReReadingTask.Subject.SiteId == queryVisitTask.SiteId) - .WhereIf(queryVisitTask.SubjectId != null, t => t.OriginalReReadingTask.SubjectId == queryVisitTask.SubjectId) - .WhereIf(queryVisitTask.IsUrgent != null, t => t.OriginalReReadingTask.IsUrgent == queryVisitTask.IsUrgent) - .WhereIf(queryVisitTask.DoctorUserId != null, t => t.OriginalReReadingTask.DoctorUserId == queryVisitTask.DoctorUserId) - .WhereIf(queryVisitTask.ReadingTaskState != null, t => t.OriginalReReadingTask.ReadingTaskState == queryVisitTask.ReadingTaskState) - .WhereIf(queryVisitTask.TaskAllocationState != null, t => t.OriginalReReadingTask.TaskAllocationState == queryVisitTask.TaskAllocationState) - .WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.OriginalReReadingTask.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId) - - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false)) - - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(queryVisitTask.TaskName) || t.NewReReadingTask.TaskBlindName.Contains(queryVisitTask.TaskName)) - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate)) - .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > queryVisitTask.BeginAllocateDate) - .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) - .ProjectTo(_mapper.ConfigurationProvider); - - var defalutSortArray = new string[] { nameof(ReReadingTaskView.RequestReReadingTime) }; - - //var defalutSortArray = new string[] { nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.IsUrgent) + " desc", nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.SubjectId), nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.VisitTaskNum) }; - - var pageList = await visitTaskQueryable.ToPagedListAsync(queryVisitTask.PageIndex, queryVisitTask.PageSize, queryVisitTask.SortField, queryVisitTask.Asc, string.IsNullOrWhiteSpace(queryVisitTask.SortField), defalutSortArray); - - return pageList; - } - - - /// /// IR 待阅片任务列表 /// @@ -575,10 +520,14 @@ namespace IRaCIS.Core.Application.Service.Allocation var visitQuery = _visitTaskRepository .Where(x => x.TrialId == inDto.TrialId && x.TaskState == TaskState.Effect) + + //PI 读基线的时候,subject 如果基线没阅片完,SR就不能看 .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline, t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned)) + + //PI 读随访的时候, subject 如果基线没阅片完,SR就不能看 .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit, - 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 && t.TaskState==TaskState.Effect)) .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR, t => t.Subject.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.Id)) // 仅仅SR阅片 PI 没有任务列表 diff --git a/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs b/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs index e5c0a0f2a..608fc9c20 100644 --- a/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs @@ -142,9 +142,11 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.HistoryReadingDoctorUserList, t => t.MapFrom(u => u.JudgeVisitList)); - CreateMap().IncludeBase() + CreateMap().IncludeBase(); - ; + CreateMap().IncludeBase() + .ForMember(o => o.FirstAuditUserName, t => t.MapFrom(u => u.FirstAuditUser.UserName)) + .ForMember(o => o.LatestReplyUserName, t => t.MapFrom(u => u.LatestReplyUser.UserName)); CreateMap().IncludeBase() .ForMember(o => o.IsReReadingOrBackInfluenceAnalysis, t => t.MapFrom(u => u.Subject.IsReReadingOrBackInfluenceAnalysis)); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 3215f66f5..6924da860 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -624,6 +624,10 @@ namespace IRaCIS.Application.Services throw new BusinessValidationFailedException(_localizer["ReadingImage_BeSigned"]); } + if(await _visitTaskRepository.AnyAsync(x=> x.Id == visitTaskid && x.DoctorUserId != _userInfo.Id && x.Subject.ClaimUserId != _userInfo.Id)) + { + throw new BusinessValidationFailedException("当前任务领取人不是你,不允许提交签名"); + } if (await _visitTaskRepository.AnyAsync(x => x.Id == visitTaskid && x.TaskState != TaskState.Effect)) { @@ -2336,7 +2340,7 @@ namespace IRaCIS.Application.Services if (task != null) { // 有序 自动领取该Subject - await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, SubejctId = task.SubjectId, IsInOrder = true }, _schedulerFactory); + await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, SubejctId = task.SubjectId, IsInOrder = true }); } } else @@ -2362,7 +2366,7 @@ namespace IRaCIS.Application.Services if (task != null) { // 有序 自动领取该Subject - await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, VisitTaskId = task.VisitTaskId, IsInOrder = false }, _schedulerFactory); + await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, VisitTaskId = task.VisitTaskId, IsInOrder = false }); } } @@ -2496,15 +2500,26 @@ namespace IRaCIS.Application.Services [HttpPost] - public async Task ClaimOrCancelSubjectAsync(ClaimSubjectDto claimSubjectDto, ISchedulerFactory _schedulerFactory) + public async Task ClaimOrCancelSubjectAsync(ClaimSubjectDto claimSubjectDto) { IScheduler scheduler = await _schedulerFactory.GetScheduler(); if (claimSubjectDto.IsInOrder) { + if (claimSubjectDto.IsClaim) { - await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.SubejctId, u => new Subject() { ClaimUserId = _userInfo.Id }, true); + + if(_subjectRepository.Any(t=>t.Id== claimSubjectDto.SubejctId && t.ClaimUserId != _userInfo.Id)) + { + throw new BusinessValidationFailedException("当前任务已被其他人领取,请进行其他的阅片任务"); + } + else + { + await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.SubejctId, u => new Subject() { ClaimUserId = _userInfo.Id }, true); + + } + //定时任务24h取消 @@ -2535,7 +2550,16 @@ namespace IRaCIS.Application.Services { if (claimSubjectDto.IsClaim) { - await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.VisitTaskId, u => new VisitTask() { DoctorUserId = _userInfo.Id }, true); + if (_visitTaskRepository.Any(t => t.Id == claimSubjectDto.VisitTaskId && t.DoctorUserId != _userInfo.Id)) + { + throw new BusinessValidationFailedException("当前任务已被其他人领取,请进行其他的阅片任务"); + } + else + { + 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.Application/Triggers/VisitTaskIAfterSignTrigger.cs b/IRaCIS.Core.Application/Triggers/VisitTaskIAfterSignTrigger.cs index ebff97d6e..70c90c2f3 100644 --- a/IRaCIS.Core.Application/Triggers/VisitTaskIAfterSignTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/VisitTaskIAfterSignTrigger.cs @@ -1,61 +1,48 @@ -//using AutoMapper; -//using EasyCaching.Core; -//using EntityFrameworkCore.Triggered; -//using IRaCIS.Core.Application.Service; -//using IRaCIS.Core.Application.ViewModel; -//using IRaCIS.Core.Domain.Share; -//using IRaCIS.Core.Infrastructure; -//using System.Linq.Expressions; +using AutoMapper; +using EasyCaching.Core; +using EntityFrameworkCore.Triggered; +using IRaCIS.Core.Application.Service; +using IRaCIS.Core.Application.ViewModel; +using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infrastructure; +using System.Linq.Expressions; -//namespace IRaCIS.Core.Application.Triggers -//{ - -// public class VisitTaskIAfterSignTrigger : IAfterSaveTrigger -// { +namespace IRaCIS.Core.Application.Triggers +{ -// private readonly IRepository _visitTaskRepository; + public class VisitTaskIAfterSignTrigger : IAfterSaveTrigger + { + + private readonly IRepository _visitTaskRepository; + + private readonly IRepository _subjectRepository; -// public VisitTaskIAfterSignTrigger( -// IRepository visitTaskRepository) -// { - -// _visitTaskRepository = visitTaskRepository; -// } + public VisitTaskIAfterSignTrigger(IRepository visitTaskRepository, IRepository subjectRepository) + { + _visitTaskRepository = visitTaskRepository; + _subjectRepository = subjectRepository; + } -// //添加任务的时候 如果需要签名 并且已经签名了 那么要维护该标准 该Subject IsFrontTaskNeedSignButNotSign字段 -// public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) -// { -// var visitTask = context.Entity; + //添加任务的时候 如果需要签名 并且已经签名了 + public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken) + { + var visitTask = context.Entity; -// if(visitTask.SignTime!=null && visitTask.ReadingTaskState == ReadingTaskState.HaveSigned) -// { -// switch (visitTask.ReadingCategory) -// { -// case ReadingCategory.Visit: + if (visitTask.SignTime != null && visitTask.ReadingTaskState == ReadingTaskState.HaveSigned + && _subjectRepository.Where(t=>t.Id==visitTask.SubjectId).SelectMany(c=>c.SubjectVisitList) + .Any(t=>t.Id==visitTask.SourceSubjectVisitId && t.IsBaseLine)) + { -// break; -// case ReadingCategory.Global: - -// break; -// case ReadingCategory.Judge: - -// break; -// case ReadingCategory.Oncology: - -// break; - -// default: -// break; -// } -// } - - -// } + await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SubjectId , t=>new Subject() { ClaimUserId=null}); + } -// } -//} \ No newline at end of file + } + + + } +} \ No newline at end of file diff --git a/IRaCIS.Core.Application/Triggers/VisitTaskIsFrontTaskNeedSignButNotSignTrigger.cs b/IRaCIS.Core.Application/Triggers/VisitTaskIsFrontTaskNeedSignButNotSignTrigger.cs index 481420b17..86fb420db 100644 --- a/IRaCIS.Core.Application/Triggers/VisitTaskIsFrontTaskNeedSignButNotSignTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/VisitTaskIsFrontTaskNeedSignButNotSignTrigger.cs @@ -102,108 +102,6 @@ namespace IRaCIS.Core.Application.Triggers } - #region 附加评估 暂时废弃 -// //从未签名状态 改为签名状态时 判断是否进行了附加评估,将附加评估的结果冗余 -// if (context.ChangeType == ChangeType.Modified && visitTask.ReadingTaskState == ReadingTaskState.HaveSigned && context.UnmodifiedEntity.ReadingTaskState != ReadingTaskState.HaveSigned) -// { - -// var criterion = _trialReadingCriterionRepository.Where(t => t.Id == visitTask.TrialReadingCriterionId).FirstOrDefault(); - -// //如果是附加评估 -// if (criterion.IsAdditionalAssessment) -// { - - -// if (visitTask.ReadingCategory == ReadingCategory.Visit) -// { - - -// switch (criterion.CriterionType) -// { -// case CriterionType.RECIST1Point1: -// var isbaseLine = _visitTaskRepository.Where(t => t.Id == visitTask.Id).Select(t => t.SourceSubjectVisit.IsBaseLine).FirstOrDefault(); - - - -// if (isbaseLine) -// { -// var currentTaskAdditionarlAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == visitTask.Id && -// t.ReadingQuestionTrial.IsAdditional == true && t.ReadingQuestionTrial.Type != "group" -// ).Include(t => t.ReadingQuestionTrial).FirstOrDefaultAsync(); - - -// //双重阅片完成了 -// if (criterion.ReadingType == ReadingMethod.Double && -//(_visitTaskRepository.Where(t => t.SubjectId == visitTask.SubjectId && t.TaskName == visitTask.TaskName && t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == 2) -// ) -// { - -// var otherTaskId = await _visitTaskRepository.Where(t => t.SubjectId == visitTask.SubjectId && t.TaskName == visitTask.TaskName && t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.Id != visitTask.Id) -// .Select(t => t.Id).FirstOrDefaultAsync(); - - -// var otherTaskAdditionarlAnswer = await _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == otherTaskId && -// t.ReadingQuestionTrial.IsAdditional == true && t.ReadingQuestionTrial.Type != "group" -// ).Include(t => t.ReadingQuestionTrial).FirstOrDefaultAsync(); - - - -// await _subjectAdditionalEvaluationResultRepository.AddAsync(new SubjectAdditionalEvaluationResult() -// { -// TrialReadingCriterionId = visitTask.TrialReadingCriterionId, -// IsFinalResult = true, -// SubjectId = visitTask.SubjectId, -// TrialReadingQuestionId = currentTaskAdditionarlAnswer.ReadingQuestionTrialId, -// FinalAnswer = currentTaskAdditionarlAnswer.Answer, -// FinalTranslateDictionaryCode = currentTaskAdditionarlAnswer.ReadingQuestionTrial.DictionaryCode, - -// }); - -// } -// if (criterion.ReadingType == ReadingMethod.Single) -// { - -// await _subjectAdditionalEvaluationResultRepository.AddAsync(new SubjectAdditionalEvaluationResult() -// { -// TrialReadingCriterionId = visitTask.TrialReadingCriterionId, -// IsFinalResult = true, -// SubjectId = visitTask.SubjectId, -// TrialReadingQuestionId = currentTaskAdditionarlAnswer.ReadingQuestionTrialId, -// FinalAnswer = currentTaskAdditionarlAnswer.Answer, -// FinalTranslateDictionaryCode = currentTaskAdditionarlAnswer.ReadingQuestionTrial.DictionaryCode, - -// }); - -// } - - - -// } - -// break; -// default: -// break; -// } - - - - - -// } - - - - - - - - -// } -// } - - - #endregion - } diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index a6ad76911..f9426ee6c 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -426,6 +426,21 @@ namespace IRaCIS.Core.Domain.Models } } + [JsonIgnore] + public User FirstAuditUser { get; set; } + + [JsonIgnore] + public User LatestReplyUser { get; set; } + + + public Guid? FirstAuditUserId { get; set; } + public DateTime? FirstAuditTime { get; set; } + + public int AuditResultEnum { get; set; } + + public Guid? LatestReplyUserId { get;set; } + public DateTime? LatestReplyTime { get; set; } + } ///