From 633a0bb7778de16ffcc02f3d57d4166e7315027e Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Tue, 21 Apr 2026 14:51:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=B4=A8=E6=8E=A7=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E5=9C=A8=E4=B8=80=E4=B8=AA=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/QC/DTO/QCListViewModel.cs | 3 ++ .../Service/QC/QCOperationService.cs | 51 +++++++++---------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index dde3d885d..466a14e4a 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -113,6 +113,9 @@ namespace IRaCIS.Core.Application.Contracts public Guid SubjectId { get; set; } [NotDefault] public Guid SubjectVisitId { get; set; } + + + public bool IsSkipCurrentVisit { get; set; } } public class GetNextIQCQualityOutDto diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index cd85f6d77..435464ab9 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -1348,9 +1348,14 @@ namespace IRaCIS.Core.Application.Image.QA .Where(t => t.Subject.Status != SubjectStatus.EndOfVisit) .WhereIf(isDistinguishType, t => isSecondReview == true ? t.SecondReviewState == SecondReviewState.WaitAudit : t.SecondReviewState == SecondReviewState.None) .WhereIf(isDistinguishType, t => ishaveQCChallenge == true ? t.QCChallengeList.Any() : !t.QCChallengeList.Any()) - .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) + .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, SubjectVisitId = t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) .OrderBy(t => t.IshaveQCChallenge).ThenBy(t => t.SecondReviewState).ThenBy(x => x.IsUrgent).ThenBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).ToListAsync(); + //跳过当前访视 + if (inDto.IsSkipCurrentVisit) + { + currentActionList = currentActionList.Where(t => t.SubjectVisitId != inDto.SubjectVisitId).ToList(); + } if (currentActionList.Count() > 0) { @@ -1358,7 +1363,7 @@ namespace IRaCIS.Core.Application.Image.QA { IsReceived = true, SubjectId = currentActionList[0].SubjectId, - VisitId = currentActionList[0].Id, + VisitId = currentActionList[0].SubjectVisitId, }; } @@ -1392,19 +1397,16 @@ namespace IRaCIS.Core.Application.Image.QA .Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.TrialId == inDto.TrialId && x.CurrentActionUserId == null) //.WhereIf(isSecondReview, t => t.PreliminaryAuditUserId != null) //.Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.UserRoleId) - .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) + .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, SubjectVisitId = t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) .OrderBy(t => t.IshaveQCChallenge).ThenBy(t => t.SecondReviewState).ThenBy(x => x.IsUrgent).ThenBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).ToListAsync(); - //var subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId).OrderBy(x => x.VisitNum).FirstOrDefault(); - //if (subjectVisit != null) - //{ - // return new GetNextIQCQualityOutDto() - // { - // SubjectId = subjectVisit.SubjectId, - // VisitId = subjectVisit.Id - // }; - //} + + //跳过当前访视 + if (inDto.IsSkipCurrentVisit) + { + visitList = visitList.Where(t => t.SubjectVisitId != inDto.SubjectVisitId).ToList(); + } var subjectVisit = visitList.FirstOrDefault(); if (subjectVisit != null) @@ -1412,7 +1414,7 @@ namespace IRaCIS.Core.Application.Image.QA return new GetNextIQCQualityOutDto() { SubjectId = subjectVisit.SubjectId, - VisitId = subjectVisit.Id + VisitId = subjectVisit.SubjectVisitId }; } else @@ -1438,19 +1440,16 @@ namespace IRaCIS.Core.Application.Image.QA //.Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.UserRoleId) - .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) + .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, SubjectVisitId = t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) .OrderBy(t => t.IshaveQCChallenge).ThenBy(t => t.SecondReviewState).ThenBy(x => x.IsUrgent).ThenBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).ToListAsync(); - //subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId).OrderBy(x => x.VisitNum).FirstOrDefault(); - //if (subjectVisit != null) - //{ - // return new GetNextIQCQualityOutDto() - // { - // SubjectId = subjectVisit.SubjectId, - // VisitId = subjectVisit.Id - // }; - //} + + //跳过当前访视 + if (inDto.IsSkipCurrentVisit) + { + visitList = visitList.Where(t => t.SubjectVisitId != inDto.SubjectVisitId).ToList(); + } subjectVisit = visitList.FirstOrDefault(); if (subjectVisit != null) @@ -1458,7 +1457,7 @@ namespace IRaCIS.Core.Application.Image.QA return new GetNextIQCQualityOutDto() { SubjectId = subjectVisit.SubjectId, - VisitId = subjectVisit.Id + VisitId = subjectVisit.SubjectVisitId }; } else @@ -1975,7 +1974,7 @@ namespace IRaCIS.Core.Application.Image.QA SubjectVisitId = dbSubjectVisit.Id, ModuleName = $"G-{dbSubjectVisit.VisitName}", ModuleType = ModuleTypeEnum.Global, - ReadModuleAddTypeEnum= dbSubjectVisit.PDState == PDStateEnum.PDProgress? ReadModuleAddType.PDConfirmation : ReadModuleAddType.FinalVisit, + ReadModuleAddTypeEnum = dbSubjectVisit.PDState == PDStateEnum.PDProgress ? ReadModuleAddType.PDConfirmation : ReadModuleAddType.FinalVisit, IsUrgent = dbSubjectVisit.IsUrgent, TrialId = dbSubjectVisit.TrialId, SubjectId = dbSubjectVisit.SubjectId @@ -1984,7 +1983,7 @@ namespace IRaCIS.Core.Application.Image.QA if (await _readingQuestionCriterionTrialRepository.AnyAsync(x => x.Id == trialReadingCriterionId && x.IsOncologyReading)) { - await _readModuleRepository.AddAsync(new ReadModule() + await _readModuleRepository.AddAsync(new ReadModule() { TrialReadingCriterionId = trialReadingCriterionId, ReadingSetType = ReadingSetType.TumorReading, From 53134ee4d2258240275cf3dfdb41259445460334 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Tue, 21 Apr 2026 15:47:07 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=B4=A8=E6=8E=A7=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=B7=B3=E8=BF=87=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=B7=B3=E8=BF=87=E5=BD=93=E5=89=8D=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/Helper/CacheHelper.cs | 1 + .../Service/QC/QCOperationService.cs | 29 +++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/IRaCIS.Core.Application/Helper/CacheHelper.cs b/IRaCIS.Core.Application/Helper/CacheHelper.cs index 804ab7820..5d70a0928 100644 --- a/IRaCIS.Core.Application/Helper/CacheHelper.cs +++ b/IRaCIS.Core.Application/Helper/CacheHelper.cs @@ -71,6 +71,7 @@ public static class CacheKeys public static string TrialDataStoreType(Guid trialId) => $"TrialDataStoreType:{trialId}"; + public static string UserQCSkipTask(Guid userId) => $"UserSKipQCTask:{userId}"; } public static class CacheHelper diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 435464ab9..880a025dc 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -8,6 +8,7 @@ using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using Medallion.Threading; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.Cmp; @@ -1297,6 +1298,21 @@ namespace IRaCIS.Core.Application.Image.QA var isDistinguishType = trialConfig.IsIQCAutoNextTask && trialConfig.IsIQCAutoTaskDistinguishType; + if (inDto.IsSkipCurrentVisit) + { + string cacheKey = CacheKeys.UserQCSkipTask(_userInfo.UserRoleId); + + // 获取当前缓存中的访视Id集合(如果没有则创建空集合) + var skippedVisits = await _fusionCache.GetOrDefaultAsync>(cacheKey, new List()); + + // 如果当前访视Id不在集合中,则添加 + if (!skippedVisits.Contains(inDto.SubjectVisitId)) + { + skippedVisits.Add(inDto.SubjectVisitId); + await _fusionCache.SetAsync(cacheKey, skippedVisits, TimeSpan.FromMinutes(60)); + } + } + if (isDistinguishType == false) { //不区分任务类型,也要按照当前任务类型给,没找到,按照默认规则给任务 无质疑 普通质控任务 @@ -1351,10 +1367,13 @@ namespace IRaCIS.Core.Application.Image.QA .Select(t => new { t.IsUrgent, SubjectCode = t.Subject.Code, t.SubjectId, SubjectVisitId = t.Id, t.VisitNum, IshaveQCChallenge = t.QCChallengeList.Any(), t.SecondReviewState }) .OrderBy(t => t.IshaveQCChallenge).ThenBy(t => t.SecondReviewState).ThenBy(x => x.IsUrgent).ThenBy(x => x.SubjectCode).ThenBy(x => x.VisitNum).ToListAsync(); + + // 获取当前缓存中的访视Id集合(如果没有则创建空集合) + var skippedVisits = await _fusionCache.GetOrDefaultAsync>(CacheKeys.UserQCSkipTask(_userInfo.UserRoleId), new List() { inDto.SubjectVisitId }); //跳过当前访视 if (inDto.IsSkipCurrentVisit) - { - currentActionList = currentActionList.Where(t => t.SubjectVisitId != inDto.SubjectVisitId).ToList(); + { + currentActionList = currentActionList.Where(t => !skippedVisits.Contains(t.SubjectVisitId)).ToList(); } if (currentActionList.Count() > 0) @@ -1404,8 +1423,8 @@ namespace IRaCIS.Core.Application.Image.QA //跳过当前访视 if (inDto.IsSkipCurrentVisit) - { - visitList = visitList.Where(t => t.SubjectVisitId != inDto.SubjectVisitId).ToList(); + { + visitList = visitList.Where(t => !skippedVisits.Contains(t.SubjectVisitId)).ToList(); } var subjectVisit = visitList.FirstOrDefault(); @@ -1448,7 +1467,7 @@ namespace IRaCIS.Core.Application.Image.QA //跳过当前访视 if (inDto.IsSkipCurrentVisit) { - visitList = visitList.Where(t => t.SubjectVisitId != inDto.SubjectVisitId).ToList(); + visitList = visitList.Where(t => !skippedVisits.Contains(t.SubjectVisitId)).ToList(); } subjectVisit = visitList.FirstOrDefault();