From dee6bebcb725443db954daecd7fdaa6ff4cef4b6 Mon Sep 17 00:00:00 2001
From: he <109787524@qq.com>
Date: Wed, 19 Aug 2026 10:34:44 +0800
Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=BA=BF=E9=85=8D=E7=BD=AE=E5=BA=94?=
=?UTF-8?q?=E7=94=A8=E5=88=B0=E5=85=B6=E4=BB=96=E8=AE=BF=E8=A7=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Reading/Dto/ReadingQuestionViewModel.cs | 6 ++
.../ReadingQuestionService.cs | 67 +++++++++++++++++++
2 files changed, 73 insertions(+)
diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs
index 8f09ae0ec..850d2d875 100644
--- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs
+++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingQuestionViewModel.cs
@@ -45,6 +45,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public decimal TargetVisitNum { get; set; }
}
+ public class ApplyBaseLineTrialQuestionVisitJudgeRuleInDto
+ {
+ [NotDefault]
+ public Guid TrialReadingCriterionId { 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 e5c05b668..347d1532b 100644
--- a/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterion/ReadingQuestionService.cs
@@ -183,6 +183,73 @@ namespace IRaCIS.Core.Application.Service
return ResponseOutput.Result(await _readingQuestionVisitJudgeRuleRepository.SaveChangesAsync());
}
+ ///
+ /// 将基线访视(VisitNum = 0)的裁判规则配置应用到其他所有访视。
+ /// 仅复制在基线和目标访视均适用的问题;目标访视不适用的问题保留其已有规则。
+ ///
+ [HttpPost]
+ public async Task ApplyBaseLineTrialQuestionVisitJudgeRule(ApplyBaseLineTrialQuestionVisitJudgeRuleInDto inDto)
+ {
+ var trialCriterion = await _readingQuestionCriterionTrialRepository
+ .Where(x => x.Id == inDto.TrialReadingCriterionId)
+ .FirstNotNullAsync();
+
+ var targetVisitNums = await _visitStageRepository
+ .Where(x => x.TrialId == trialCriterion.TrialId && x.VisitNum != 0)
+ .Select(x => x.VisitNum)
+ .Distinct()
+ .ToListAsync();
+
+ // 计划外访视不在 VisitStage 中,也应同步基线规则。
+ targetVisitNums.Add(-1);
+ targetVisitNums = targetVisitNums.Distinct().ToList();
+
+ var rulesToAdd = new List();
+ foreach (var targetVisitNum in targetVisitNums)
+ {
+ // 仅保留在基线和当前目标访视都显示的问题。
+ var targetQuestionIds = await _readingQuestionTrialRepository
+ .Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion)
+ .Where(x => x.LimitShow == LimitShow.AllShow
+ || (x.LimitShow == LimitShow.ExcludeSomeVisits
+ && !x.ExcludeShowVisitList.Contains(0)
+ && !x.ExcludeShowVisitList.Contains(targetVisitNum)))
+ .Select(x => x.Id)
+ .ToListAsync();
+
+ if (targetQuestionIds.Count == 0)
+ {
+ continue;
+ }
+
+ var baseLineRules = await _readingQuestionVisitJudgeRuleRepository
+ .Where(x => x.VisitNum == 0 && targetQuestionIds.Contains(x.ReadingQuestionId))
+ .ToListAsync();
+
+ await _readingQuestionVisitJudgeRuleRepository.BatchDeleteNoTrackingAsync(x =>
+ x.VisitNum == targetVisitNum && targetQuestionIds.Contains(x.ReadingQuestionId));
+
+ rulesToAdd.AddRange(baseLineRules.Select(rule => new ReadingQuestionVisitJudgeRule
+ {
+ Id = NewId.NextGuid(),
+ ReadingQuestionId = rule.ReadingQuestionId,
+ VisitNum = targetVisitNum,
+ AnswerGroup = rule.AnswerGroup,
+ AnswerCombination = rule.AnswerCombination,
+ JudgeType = rule.JudgeType,
+ JudgeDifferenceValue = rule.JudgeDifferenceValue,
+ JudgeDifferenceType = rule.JudgeDifferenceType,
+ }));
+ }
+
+ if (rulesToAdd.Count > 0)
+ {
+ await _readingQuestionVisitJudgeRuleRepository.AddRangeAsync(rulesToAdd);
+ }
+
+ return ResponseOutput.Result(await _readingQuestionVisitJudgeRuleRepository.SaveChangesAsync());
+ }
+
#endregion