diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index d0288c364..153e78ebb 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -1705,6 +1705,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { public Guid VisitTaskId { get; set; } } + + public class SetSkipReadingCacheInDto + { + public Guid VisitTaskId { get; set; } + } public class GetNextTaskInDto { diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index fe00f7d4e..d67e162c0 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -22,6 +22,7 @@ using AutoMapper.QueryableExtensions; using IRaCIS.Application.Contracts; using IRaCIS.Core.Domain.Models; using Microsoft.Extensions.Options; +using System.Linq; namespace IRaCIS.Application.Services { @@ -2700,7 +2701,44 @@ namespace IRaCIS.Application.Services return ResponseOutput.Ok(true); } + /// + /// 清除跳过阅片的缓存 + /// + /// + [HttpPost] + public async Task ClearSkipReadingCache() + { + var clearSkipReadingCacheKey = _userInfo.Id.ToString() + "SkipReadingCache"; + _provider.Remove(clearSkipReadingCacheKey); + return true; + } + /// + /// 设置跳过阅片的缓存 + /// + /// + /// + [HttpPost] + public async Task SetSkipReadingCache(SetSkipReadingCacheInDto inDto ) + { + var clearSkipReadingCacheKey = _userInfo.Id.ToString() + "SkipReadingCache"; + var clearSkipReadingCache = _provider.Get(clearSkipReadingCacheKey).Value; + if (clearSkipReadingCache == null|| clearSkipReadingCache==string.Empty) + { + List cacheIds = new List(); + cacheIds.Add(inDto.VisitTaskId); + + _provider.Set(clearSkipReadingCacheKey, JsonConvert.SerializeObject(cacheIds), TimeSpan.FromHours(24)); + } + else + { + List? cacheIds=JsonConvert.DeserializeObject>(clearSkipReadingCache); + cacheIds.Add(inDto.VisitTaskId); + _provider.Set(clearSkipReadingCacheKey, JsonConvert.SerializeObject(cacheIds), TimeSpan.FromHours(24)); + } + + return true; + } /// @@ -2728,6 +2766,19 @@ namespace IRaCIS.Application.Services var trialReadingCriterion = await _readingQuestionCriterionTrialRepository.FindAsync(trialReadingCriterionId ?? Guid.Empty); + + #region 跳过阅片 + var clearSkipReadingCacheKey = _userInfo.Id.ToString() + "SkipReadingCache"; + var clearSkipReadingCache = _provider.Get(clearSkipReadingCacheKey).Value; + List cacheSkipIds = new List(); + if (clearSkipReadingCache != null && clearSkipReadingCache != string.Empty) + { + cacheSkipIds = JsonConvert.DeserializeObject>(clearSkipReadingCache); + } + #endregion + + + if (inDto.VisitTaskId != null) { task = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => new GetReadingTaskDto() @@ -2746,6 +2797,7 @@ namespace IRaCIS.Application.Services trialReadingCriterionId = task.TrialReadingCriterionId; } + // 有序 else if (inDto.SubjectId != null && trialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.InOrder) { var subjectTaskList = (await _visitTaskService.GetSubjectReadingIQueryable(new GetReadingIQueryableInDto() @@ -2766,14 +2818,22 @@ namespace IRaCIS.Application.Services var subjectIndex = subjectTaskList.Where(x => x.SubjectId == inDto.SubjectId && x.SubjectCode == inDto.SubjectCode).Select(x => x.Index).FirstOrDefault(); - var currentSubject = subjectTaskList.Where(x => x.Index >= subjectIndex && !x.ExistReadingApply).OrderBy(x => x.Index).FirstOrDefault(); + + var currentSubject = subjectTaskList.Where(x => x.Index >= subjectIndex && !x.ExistReadingApply) + // 排除跳过的 + .Where(x=> x.UnReadCanReadTaskList.Select(y => y.Id).Except(cacheSkipIds).Count()>0) + .OrderBy(x => x.Index).FirstOrDefault(); + if (currentSubject == null) { throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"], ApiResponseCodeEnum.CloseCurrentWindows); } - task = currentSubject.UnReadCanReadTaskList.Select(x => new GetReadingTaskDto() + task = currentSubject.UnReadCanReadTaskList + // 排除跳过的 + .Where(x=> !cacheSkipIds.Contains(x.Id)) + .Select(x => new GetReadingTaskDto() { ReadingCategory = x.ReadingCategory, SubjectCode = currentSubject.SubjectCode, @@ -2789,8 +2849,12 @@ namespace IRaCIS.Application.Services } + // 受试者无序 else if (inDto.SubjectId != null && trialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom) { + + + var subjectTaskList = (await _visitTaskService.GetSubjectReadingIQueryable(new GetReadingIQueryableInDto() { TrialId = inDto.TrialId, @@ -2802,6 +2866,11 @@ namespace IRaCIS.Application.Services })).CurrentPageData; + + subjectTaskList = subjectTaskList + // 排除跳过的 + .Where(x => x.UnReadCanReadTaskList.Select(y => y.Id).Except(cacheSkipIds).Count() > 0).ToList(); + if (subjectTaskList.Count() == 0) { throw new BusinessValidationFailedException(_localizer["ReadingImage_TaskFinish"], ApiResponseCodeEnum.CloseCurrentWindows); @@ -2829,11 +2898,14 @@ namespace IRaCIS.Application.Services }).FirstOrDefaultAsync(); } + // 完全随机 else { var query = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.TrialReadingCriterionId == trialReadingCriterionId && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.DoctorUserId == _userInfo.Id && x.TrialReadingCriterionId == trialReadingCriterionId - && x.TaskState == TaskState.Effect); + && x.TaskState == TaskState.Effect) + // 排除跳过的 + .Where(x => !cacheSkipIds.Contains(x.Id)); var count = await query.CountAsync(); if (count == 0) {