From 13a942c6c51aeff56213b40b149dde47b1987899 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 09:24:57 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReadingImageTaskService.cs | 1 + .../ReadingJudgeTaskService.cs | 50 ++++++++++++++----- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 636644bd0..9eadeaed8 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -26,6 +26,7 @@ namespace IRaCIS.Core.Application.Service public partial class ReadingImageTaskService( IRepository _noneDicomStudyRepository, IRepository _visitTaskRepository, + IRepository _visitStageRepository, IRepository _trialRepository, IRepository _taskInstanceRepository, IRepository _noneDicomStudyFileRepository, diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index 9a765d0f3..36c25cd81 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -14,6 +14,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using MimeKit; using Newtonsoft.Json; +using System.Linq.Dynamic.Core; namespace IRaCIS.Core.Application.Service { @@ -270,19 +271,44 @@ namespace IRaCIS.Core.Application.Service private async Task> GetJudgeDisplayQuestions(Guid trialReadingCriterionId, decimal visitNum, JudgeRule judgeRule) { var questionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialReadingCriterionId && x.IsJudgeQuestion) - .Where(x=>x.ShowQuestion== ShowQuestion.Show) - .OrderBy(x => x.ShowOrder).ToListAsync(); - var questionIds = questionList.Select(x => x.Id).ToList(); - var visitJudgeRules = judgeRule == JudgeRule.Difference - ? await _readingQuestionVisitJudgeRuleRepository.Where(x => questionIds.Contains(x.ReadingQuestionId) && (x.VisitNum == visitNum || x.VisitNum == -1)).ToListAsync() - : new List(); + .WhereIf(visitNum == 0, x => x.LimitShow != LimitShow.FollowShow) + .WhereIf(visitNum != 0, x => x.LimitShow != LimitShow.BaseLineShow) + .Where(x=>x.LimitShow!=LimitShow.ExcludeSomeVisits||x.ExcludeShowVisitList.Contains(visitNum)) + .ToListAsync(); - return questionList.Where(x => !x.ExcludeShowVisitList.Contains(visitNum)) - .Where(x => judgeRule == JudgeRule.Consistent - ? x.JudgeType != JudgeTypeEnum.NotApplicable - : (visitJudgeRules.FirstOrDefault(rule => rule.ReadingQuestionId == x.Id && rule.VisitNum == visitNum) - ?? visitJudgeRules.FirstOrDefault(rule => rule.ReadingQuestionId == x.Id && rule.VisitNum == -1))?.JudgeType != JudgeTypeEnum.NotApplicable) - .ToList(); + + var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == trialReadingCriterionId).FirstNotNullAsync(); + var questionIds = questionList.Select(x => x.Id).ToList(); + var visitJudgeRules=new List(); + if (judgeRule == JudgeRule.Difference) + { + if (await _visitStageRepository.AnyAsync(x => x.TrialId == trialCriterion.TrialId && x.VisitNum == visitNum)) + { + visitJudgeRules = await _readingQuestionVisitJudgeRuleRepository.Where(x => questionIds.Contains(x.ReadingQuestionId) && x.VisitNum == visitNum).ToListAsync(); + } + else + { + visitJudgeRules = await _readingQuestionVisitJudgeRuleRepository.Where(x => questionIds.Contains(x.ReadingQuestionId) && x.VisitNum == -1).ToListAsync(); + } + + } + else + { + visitJudgeRules = questionList.Select(x => new ReadingQuestionVisitJudgeRule() + { + ReadingQuestionId = x.Id, + AnswerCombination = JsonConvert.DeserializeObject>(x.AnswerCombination.IsNullOrEmpty() ? "[]" : x.AnswerCombination), + AnswerGroup = JsonConvert.DeserializeObject>(x.AnswerGroup.IsNullOrEmpty() ? "[]" : x.AnswerGroup), + JudgeDifferenceType = x.JudgeDifferenceType, + JudgeType = x.JudgeType, + JudgeDifferenceValue = x.JudgeDifferenceValue, + }).ToList(); + } + + + return questionList + .Where(x => visitJudgeRules.FirstOrDefault(rule => rule.ReadingQuestionId == x.Id && rule.VisitNum == -1)?.JudgeType != JudgeTypeEnum.NotApplicable) + .ToList(); } /// From 73c86666b4ac60170f12445fac733fb1bc85ec96 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 10:25:01 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=A3=81=E5=88=A4?= =?UTF-8?q?=E7=9A=84=E8=AE=A1=E7=AE=97=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Reading/Dto/ReadingQuestionViewModel.cs | 2 ++ .../Service/Reading/ReadingCriterion/ReadingQuestionService.cs | 1 + 2 files changed, 3 insertions(+) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs index e323cf048..6101cc51d 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs @@ -1729,6 +1729,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsGetAll { get; set; } = false; + public bool IsGetJudge { get; set; } = false; + } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs index 712625bcc..8c99a7088 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs @@ -780,6 +780,7 @@ namespace IRaCIS.Core.Application.Service if (inDto.TrialReadingCriterionId != null) { return await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId) + .WhereIf(inDto.IsGetJudge,x=>x.IsJudgeQuestion) .WhereIf(!inDto.IsGetAll, x => x.DataSource == DataSources.Automatic && x.Type == "number") .Select(x => new CalculateRelationDto() { From e70ee70f6bf3562b5d87b1394fb3aab14cb30926 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 11:19:06 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E4=B8=8D=E9=80=82=E7=94=A8=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReadingQuestionService.cs | 53 +++++++++++++++++++ .../ReadingQuestionVisitJudgeRule.cs | 2 +- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs index 8c99a7088..44f0b2173 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs @@ -36,6 +36,7 @@ namespace IRaCIS.Core.Application.Service IRepository _readingTaskQuestionAnswer, IRepository _previousPDFRepository, IRepository _readingQuestionVisitJudgeRuleRepository, + IRepository _visitStageRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IReadingQuestionService { @@ -713,9 +714,61 @@ namespace IRaCIS.Core.Application.Service } var entity = await _readingQuestionTrialRepository.InsertOrUpdateAsync(indto, true); + await AddNAJudgeRule(entity); return ResponseOutput.Ok(entity.Id.ToString()); } + /// + /// 添加问题的不适用规则 + /// + /// + private async Task AddNAJudgeRule(ReadingQuestionTrial entity) + { + List visitNums = new List(); + if (entity.IsJudgeQuestion) + { + var visitStageNums = await _visitStageRepository + .Where(x => x.TrialId == entity.TrialId) + .Select(x => x.VisitNum) + .Distinct() + .ToListAsync(); + + switch (entity.LimitShow) + { + case LimitShow.BaseLineShow: + visitNums = visitStageNums.Where(x => x > 0).ToList(); + visitNums.Add(-1); + break; + case LimitShow.FollowShow: + visitNums.Add(0); + break; + case LimitShow.ExcludeSomeVisits: + visitNums = entity.ExcludeShowVisitList; + break; + } + } + + if (visitNums.Count==0) + { + return; + } + + + await _readingQuestionVisitJudgeRuleRepository.BatchDeleteNoTrackingAsync(x => + x.ReadingQuestionId == entity.Id && visitNums.Contains(x.VisitNum)); + + var rules = visitNums.Select(visitNum => new ReadingQuestionVisitJudgeRule + { + Id = NewId.NextGuid(), + ReadingQuestionId = entity.Id, + VisitNum = visitNum, + JudgeType = JudgeTypeEnum.None, + }).ToList(); + + await _readingQuestionVisitJudgeRuleRepository.AddRangeAsync(rules); + await _readingQuestionVisitJudgeRuleRepository.SaveChangesAsync(); + } + /// /// 获取项目问题(项目) /// diff --git a/IRaCIS.Core.Domain/Reading/ReadingCriterionQuestion/ReadingQuestionVisitJudgeRule.cs b/IRaCIS.Core.Domain/Reading/ReadingCriterionQuestion/ReadingQuestionVisitJudgeRule.cs index 67dcf892d..e44d8c6b1 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingCriterionQuestion/ReadingQuestionVisitJudgeRule.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingCriterionQuestion/ReadingQuestionVisitJudgeRule.cs @@ -21,7 +21,7 @@ public class ReadingQuestionVisitJudgeRule : BaseAddAuditEntity public Guid ReadingQuestionId { get; set; } /// - /// 访视Num + /// 访视Num (计划外是-1) /// public decimal VisitNum { get; set; } From ac4e3346429a061a5856dfcfbafabc5864d18f6e Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 11:27:14 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E4=B8=8D=E9=80=82=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E8=AE=BF=E8=A7=86=E4=B8=8D=E8=BF=94=E5=9B=9E=E8=A3=81=E5=88=A4?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reading/ReadingCriterion/ReadingQuestionService.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs index 44f0b2173..440d2d13f 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs @@ -51,8 +51,11 @@ namespace IRaCIS.Core.Application.Service public async Task> GetTrialQuestionVisitJudgeRule(GetTrialQuestionVisitJudgeRuleInDto inDto) { var questionList = await _readingQuestionTrialRepository - .Where(x=>!x.ExcludeShowVisitList.Contains(inDto.VisitNum)) .Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion) + .Where(x => x.LimitShow == LimitShow.AllShow + || (x.LimitShow == LimitShow.BaseLineShow && inDto.VisitNum == 0) + || (x.LimitShow == LimitShow.FollowShow && inDto.VisitNum != 0) + || (x.LimitShow == LimitShow.ExcludeSomeVisits && !x.ExcludeShowVisitList.Contains(inDto.VisitNum))) .WhereIf(inDto.ReadingQuestionId != null, x => x.Id == inDto.ReadingQuestionId) .OrderBy(x => x.ShowOrder) .Select(x => new TrialQuestionVisitJudgeRuleItemDto From 5e44f796dd0c1a05c9f830ddac7112dea4301874 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 13:12:30 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E8=A3=81=E5=88=A4?= =?UTF-8?q?=E8=A7=84=E5=88=99=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReadingCriterionService.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingCriterionService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingCriterionService.cs index 4b9eaa2c9..5ec42ce6d 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingCriterionService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingCriterionService.cs @@ -386,6 +386,36 @@ namespace IRaCIS.Core.Application.Service.RC [HttpPost] public async Task SetTrialJudgeRuleInfo(SetTrialJudgeRuleInfoInDto inDto) { + if (inDto.JudgeRuleEnum == JudgeRule.Consistent) + { + if (await _readingQuestionTrialRepository.AnyAsync(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId&& x.IsJudgeQuestion && x.LimitShow != LimitShow.AllShow)) + { + + + var questionList = await _readingQuestionTrialRepository + .Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion && x.LimitShow != LimitShow.AllShow) + .OrderBy(x => x.ShowOrder) + .Select(x => new TrialQuestionVisitJudgeRuleItemDto + { + ReadingQuestionTrialId = x.Id, + QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us), + ShowOrder = x.ShowOrder, + Type = x.Type, + TypeValue = x.TypeValue, + QuestionGenre = x.QuestionGenre, + DictionaryCode = x.DictionaryCode, + Unit = x.Unit, + CustomUnit = x.CustomUnit, + }) + .ToListAsync(); + + var questionName=string.Join(",", questionList.Select(x => x.QuestionName)); + + + //---当前标准裁判规则为一致性,但存在非全部显示的裁判问题,操作失败 + throw new BusinessValidationFailedException(_localizer["JudgeCanNotLimitShow", questionName]); + } + } await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial() { JudgeModeEnum = inDto.JudgeModeEnum, From a0193fc69473f5f6f744b2f3281f8b3f849a29d3 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 13:53:27 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E9=98=85=E7=89=87=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E7=AD=BE=E5=90=8D=E9=AA=8C=E8=AF=81=E6=8E=A5=E5=8F=A3=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TrialSiteUser/TrialConfigService.cs | 45 ++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index aab463e19..262d25d62 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -27,15 +27,16 @@ namespace IRaCIS.Core.Application IRepository _trialQCQuestionRepository, IRepository _readingQuestionCriterionTrialRepository, IRepository _readingQuestionTrialRepository, + IRepository _readingQuestionVisitJudgeRuleRepository, IRepository _trialCriterionDictionaryCode, IRepository _systemCriterionDictionaryCode, IRepository _readingQuestionCriterionSystemRepository, IRepository _clinicalDataTrialSetRepository, IRepository _readingCriterionPageRepository, - IRepository _systemCriterionKeyFileRepository, - IOSSService _oSSService, - - IRepository _trialCriterionKeyFileRepository, + IRepository _systemCriterionKeyFileRepository, + IOSSService _oSSService, + IRepository _visitStageRepository, + IRepository _trialCriterionKeyFileRepository, IOrganInfoService _iOrganInfoService, IRepository _trialBodyPartRepository, IRepository _readingCriterionDictionaryRepository, @@ -48,7 +49,7 @@ namespace IRaCIS.Core.Application IRepository _systemBasicDataRepository, IRepository _subjectVisitRepository, IRepository _enrollRepository, - IRepository _qcQuestionAnswerRepository, + IRepository _qcQuestionAnswerRepository, IRepository _trialStateChangeRepository, IRepository _readingTableQuestionTrialRepository, IRepository _dicomAERepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, ITrialConfigService @@ -105,6 +106,40 @@ namespace IRaCIS.Core.Application throw new BusinessValidationFailedException(_localizer["TrialConfig_JudgeTaskFail"]); } + if (trialCriterion.JudgeRuleEnum == JudgeRule.Difference) + { + var visitStageList = await _visitStageRepository.Where(x => x.TrialId == trialCriterion.TrialId).ToListAsync(); + + visitStageList.Add(new VisitStage() + { + VisitName = "Out of Plan", + VisitNum=-1, + }); + + + + var judgeCount = await _readingQuestionTrialRepository.CountAsync(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion); + + var ruleList = await _readingQuestionVisitJudgeRuleRepository.Where(x => x.ReadingQuestionTrial.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId).ToListAsync(); + + var errorList = new List(); + + visitStageList.ForEach(x => + { + if (judgeCount != ruleList.Count(y => y.VisitNum == x.VisitNum)) + { + errorList.Add(x.VisitName); + } + + }); + + if (errorList.Count() > 0) + { + throw new BusinessValidationFailedException(_localizer["TrialConfig_VisitjudgeDeficiency", string.Join(",", errorList)]); + } + + + } return ResponseOutput.Ok(true); } From 4ccf8362759c3d2c4d94fc0a7c0230ae430ca055 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 13:57:01 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E8=A3=81=E5=88=A4=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E8=BF=94=E5=9B=9EShowQuestion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Reading/Dto/ReadingImageTaskViewModel.cs | 2 ++ .../Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs | 1 + 2 files changed, 3 insertions(+) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index 1d435bd13..d688c4e1b 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -2500,6 +2500,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid ReadingQuestionId { get; set; } public string QuestionName { get; set; } = string.Empty; public string Type { get; set; } = string.Empty; + + public ShowQuestion ShowQuestion { get; set; } public string TypeValue { get; set; } = string.Empty; public int ShowOrder { get; set; } public string Answer { get; set; } = string.Empty; diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index 36c25cd81..00e0ec4f5 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -188,6 +188,7 @@ namespace IRaCIS.Core.Application.Service ReadingQuestionId = x.Id, QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us), Type = x.Type, + ShowQuestion = x.ShowQuestion, TypeValue = x.TypeValue, ShowOrder = x.ShowOrder, Answer = answers.FirstOrDefault(answer => answer.ReadingQuestionTrialId == x.Id)?.Answer ?? string.Empty, From cbd1457699dfc3c98cd3794b0245e1cc789b3da8 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 14:14:04 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E8=A3=81=E5=88=A4=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E6=8E=92=E9=99=A4=E8=AE=BF=E8=A7=86=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReadingJudgeTaskService.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index 00e0ec4f5..5f28e2ce1 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -1189,17 +1189,17 @@ namespace IRaCIS.Core.Application.Service } var questionIds = answerList.Select(x => x.QuestionId).Distinct().ToList(); - var questions = await _readingQuestionTrialRepository.Where(x => questionIds.Contains(x.Id)&&x.LimitShow == LimitShow.ExcludeSomeVisits).Select(x => new - { - x.Id, - x.ExcludeShowVisitList, - }).ToListAsync(); - var excludedQuestionIds = answerList - .Where(x => questions.FirstOrDefault(question => question.Id == x.QuestionId)?.ExcludeShowVisitList.Contains(x.VisitTaskNum) == true) - .Select(x => x.QuestionId) - .Distinct() - .ToList(); - answerList.RemoveAll(x => excludedQuestionIds.Contains(x.QuestionId)); + //var questions = await _readingQuestionTrialRepository.Where(x => questionIds.Contains(x.Id)&&x.LimitShow == LimitShow.ExcludeSomeVisits).Select(x => new + //{ + // x.Id, + // x.ExcludeShowVisitList, + //}).ToListAsync(); + //var excludedQuestionIds = answerList + // .Where(x => questions.FirstOrDefault(question => question.Id == x.QuestionId)?.ExcludeShowVisitList.Contains(x.VisitTaskNum) == true) + // .Select(x => x.QuestionId) + // .Distinct() + // .ToList(); + //answerList.RemoveAll(x => excludedQuestionIds.Contains(x.QuestionId)); if (judgeRule != JudgeRule.Difference || answerList.Count == 0) { From 80706c407d6ec41b09af93d29adf753b58cef3ad Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 14:24:54 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E8=A1=A8=E5=8D=95=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Reading/Dto/ReadingImageTaskViewModel.cs | 7 +++++++ .../Reading/ReadingImageTask/ReadingJudgeTaskService.cs | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index d688c4e1b..1b9f72a09 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -2510,6 +2510,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public ValueUnit? Unit { get; set; } public string? CustomUnit { get; set; } public ValueOfType? ValueType { get; set; } + public string ClassifyAlgorithms { get; set; } + + public ClassifyType? ClassifyType { get; set; } + + public Guid? ClassifyQuestionId { get; set; } + + public JudgeReadingQuestionType QuestionType { get; set; } = JudgeReadingQuestionType.Question; } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index 5f28e2ce1..c75874879 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -197,6 +197,11 @@ namespace IRaCIS.Core.Application.Service Unit = x.Unit, CustomUnit = x.CustomUnit, ValueType = x.ValueType, + + + ClassifyQuestionId = x.ClassifyQuestionId, + ClassifyAlgorithms = x.ClassifyAlgorithms, + ClassifyType = x.ClassifyType }).ToList(), }; } From 2ba162347e7249cd5d70ab3d887d48d8118f2b4e Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 14:36:19 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=A3=81=E5=88=A4?= =?UTF-8?q?=E5=8D=95=E4=B8=AA=E6=95=B0=E6=8D=AE=E6=8E=92=E9=99=A4=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reading/ReadingImageTask/ReadingJudgeTaskService.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index c75874879..885471e8f 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -125,7 +125,7 @@ namespace IRaCIS.Core.Application.Service .Select(x => x.JudgeRuleEnum) .FirstNotNullAsync(); - var displayQuestions = await GetJudgeDisplayQuestions(r1Task.TrialReadingCriterionId, r1Task.VisitTaskNum, judgeRule); + var displayQuestions = await GetJudgeDisplayQuestions(r1Task.TrialReadingCriterionId, r1Task.VisitTaskNum, judgeRule, false); var judgeAnswers = displayQuestions .Select(x => new SingleVisitJudgeAnswerItemDto { @@ -175,7 +175,7 @@ namespace IRaCIS.Core.Application.Service { var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var judgeRule = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == taskInfo.TrialReadingCriterionId).Select(x => x.JudgeRuleEnum).FirstNotNullAsync(); - var questionList = await GetJudgeDisplayQuestions(taskInfo.TrialReadingCriterionId, taskInfo.VisitTaskNum, judgeRule); + var questionList = await GetJudgeDisplayQuestions(taskInfo.TrialReadingCriterionId, taskInfo.VisitTaskNum, judgeRule, true); var questionIds = questionList.Select(x => x.Id).ToList(); var answers = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && questionIds.Contains(x.ReadingQuestionTrialId)).ToListAsync(); @@ -229,7 +229,7 @@ namespace IRaCIS.Core.Application.Service { var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var judgeRule = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == taskInfo.TrialReadingCriterionId).Select(x => x.JudgeRuleEnum).FirstNotNullAsync(); - var displayQuestionIds = (await GetJudgeDisplayQuestions(taskInfo.TrialReadingCriterionId, taskInfo.VisitTaskNum, judgeRule)).Select(x => x.Id).ToList(); + var displayQuestionIds = (await GetJudgeDisplayQuestions(taskInfo.TrialReadingCriterionId, taskInfo.VisitTaskNum, judgeRule, true)).Select(x => x.Id).ToList(); var submittedQuestionIds = inDto.QuestionList.Select(x => x.ReadingQuestionId).ToList(); @@ -274,9 +274,10 @@ namespace IRaCIS.Core.Application.Service } - private async Task> GetJudgeDisplayQuestions(Guid trialReadingCriterionId, decimal visitNum, JudgeRule judgeRule) + private async Task> GetJudgeDisplayQuestions(Guid trialReadingCriterionId, decimal visitNum, JudgeRule judgeRule,bool isGetShowQuestion) { var questionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialReadingCriterionId && x.IsJudgeQuestion) + .WhereIf(!isGetShowQuestion,x=>x.ShowQuestion!= ShowQuestion.Hide) .WhereIf(visitNum == 0, x => x.LimitShow != LimitShow.FollowShow) .WhereIf(visitNum != 0, x => x.LimitShow != LimitShow.BaseLineShow) .Where(x=>x.LimitShow!=LimitShow.ExcludeSomeVisits||x.ExcludeShowVisitList.Contains(visitNum)) From 46d42ddf2ada60edfcf3df60fed369dfac06390e Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 14:53:15 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs index 885471e8f..c4f098367 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs @@ -315,6 +315,7 @@ namespace IRaCIS.Core.Application.Service return questionList .Where(x => visitJudgeRules.FirstOrDefault(rule => rule.ReadingQuestionId == x.Id && rule.VisitNum == -1)?.JudgeType != JudgeTypeEnum.NotApplicable) + .OrderBy(x=>x.ShowOrder) .ToList(); } From 81257808d8c9e61fb0c6385304a4ec2a7871c4b9 Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 18 Aug 2026 15:14:17 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E5=A4=8D=E5=88=B6=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E8=AE=BF=E8=A7=86=E7=9A=84=E9=A1=B9=E7=9B=AE=E9=98=85=E7=89=87?= =?UTF-8?q?=E6=A0=87=E5=87=86=E8=A3=81=E5=88=A4=E8=A7=84=E5=88=99=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reading/Dto/ReadingQuestionViewModel.cs | 16 ++++++ .../ReadingQuestionService.cs | 51 +++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs index 6101cc51d..8f09ae0ec 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs @@ -29,6 +29,22 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public List QuestionList { get; set; } = new List(); } + public class CopyTrialQuestionVisitJudgeRuleInDto + { + [NotDefault] + public Guid TrialReadingCriterionId { get; set; } + + /// + /// 来源访视 + /// + public decimal SourceVisitNum { get; set; } + + /// + /// 目标访视 + /// + public decimal TargetVisitNum { get; set; } + } + public class TrialQuestionVisitJudgeRuleItemDto { public Guid ReadingQuestionTrialId { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs index 440d2d13f..e5c05b668 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs @@ -43,6 +43,9 @@ namespace IRaCIS.Core.Application.Service #region 项目访视裁判规则 + + + /// /// 获取项目阅片标准各访视的裁判规则配置。 /// 未配置规则的访视问题也会返回,供前端直接进行配置。 @@ -132,6 +135,54 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.Result(await _readingQuestionVisitJudgeRuleRepository.SaveChangesAsync()); } + /// + /// 复制其他访视的项目阅片标准裁判规则配置。 + /// 目标访视不适用的问题保留其已有的不适用规则,不参与复制。 + /// + [HttpPost] + public async Task CopyTrialQuestionVisitJudgeRule(CopyTrialQuestionVisitJudgeRuleInDto inDto) + { + var targetQuestionIds = await _readingQuestionTrialRepository + .Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion) + .Where(x => x.LimitShow == LimitShow.AllShow + || (x.LimitShow == LimitShow.BaseLineShow && inDto.TargetVisitNum == 0) + || (x.LimitShow == LimitShow.FollowShow && inDto.TargetVisitNum != 0) + || (x.LimitShow == LimitShow.ExcludeSomeVisits && !x.ExcludeShowVisitList.Contains(inDto.TargetVisitNum))) + .Select(x => x.Id) + .ToListAsync(); + + if (targetQuestionIds.Count == 0) + { + return ResponseOutput.Ok(); + } + + var sourceRules = await _readingQuestionVisitJudgeRuleRepository + .Where(x => x.VisitNum == inDto.SourceVisitNum && targetQuestionIds.Contains(x.ReadingQuestionId)) + .ToListAsync(); + + await _readingQuestionVisitJudgeRuleRepository.BatchDeleteNoTrackingAsync(x => + x.VisitNum == inDto.TargetVisitNum && targetQuestionIds.Contains(x.ReadingQuestionId)); + + var targetRules = sourceRules.Select(rule => new ReadingQuestionVisitJudgeRule + { + Id = NewId.NextGuid(), + ReadingQuestionId = rule.ReadingQuestionId, + VisitNum = inDto.TargetVisitNum, + AnswerGroup = rule.AnswerGroup, + AnswerCombination = rule.AnswerCombination, + JudgeType = rule.JudgeType, + JudgeDifferenceValue = rule.JudgeDifferenceValue, + JudgeDifferenceType = rule.JudgeDifferenceType, + }).ToList(); + + if (targetRules.Count > 0) + { + await _readingQuestionVisitJudgeRuleRepository.AddRangeAsync(targetRules); + } + + return ResponseOutput.Result(await _readingQuestionVisitJudgeRuleRepository.SaveChangesAsync()); + } + #endregion