Merge branch 'Test_IRC_Net10' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net10
continuous-integration/drone/push Build is passing Details

Test_IRC_Net10
hang 2026-08-18 17:03:34 +08:00
commit 4889038765
8 changed files with 269 additions and 34 deletions

View File

@ -2500,6 +2500,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Guid ReadingQuestionId { get; set; } public Guid ReadingQuestionId { get; set; }
public string QuestionName { get; set; } = string.Empty; public string QuestionName { get; set; } = string.Empty;
public string Type { get; set; } = string.Empty; public string Type { get; set; } = string.Empty;
public ShowQuestion ShowQuestion { get; set; }
public string TypeValue { get; set; } = string.Empty; public string TypeValue { get; set; } = string.Empty;
public int ShowOrder { get; set; } public int ShowOrder { get; set; }
public string Answer { get; set; } = string.Empty; public string Answer { get; set; } = string.Empty;
@ -2508,6 +2510,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public ValueUnit? Unit { get; set; } public ValueUnit? Unit { get; set; }
public string? CustomUnit { get; set; } public string? CustomUnit { get; set; }
public ValueOfType? ValueType { 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; public JudgeReadingQuestionType QuestionType { get; set; } = JudgeReadingQuestionType.Question;
} }

View File

@ -29,6 +29,22 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public List<TrialQuestionVisitJudgeRuleItemDto> QuestionList { get; set; } = new List<TrialQuestionVisitJudgeRuleItemDto>(); public List<TrialQuestionVisitJudgeRuleItemDto> QuestionList { get; set; } = new List<TrialQuestionVisitJudgeRuleItemDto>();
} }
public class CopyTrialQuestionVisitJudgeRuleInDto
{
[NotDefault]
public Guid TrialReadingCriterionId { get; set; }
/// <summary>
/// 来源访视
/// </summary>
public decimal SourceVisitNum { get; set; }
/// <summary>
/// 目标访视
/// </summary>
public decimal TargetVisitNum { get; set; }
}
public class TrialQuestionVisitJudgeRuleItemDto public class TrialQuestionVisitJudgeRuleItemDto
{ {
public Guid ReadingQuestionTrialId { get; set; } public Guid ReadingQuestionTrialId { get; set; }
@ -1729,6 +1745,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public bool IsGetAll { get; set; } = false; public bool IsGetAll { get; set; } = false;
public bool IsGetJudge { get; set; } = false;
} }

View File

@ -386,6 +386,36 @@ namespace IRaCIS.Core.Application.Service.RC
[HttpPost] [HttpPost]
public async Task<IResponseOutput> SetTrialJudgeRuleInfo(SetTrialJudgeRuleInfoInDto inDto) public async Task<IResponseOutput> 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() await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
{ {
JudgeModeEnum = inDto.JudgeModeEnum, JudgeModeEnum = inDto.JudgeModeEnum,

View File

@ -36,12 +36,16 @@ namespace IRaCIS.Core.Application.Service
IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswer, IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswer,
IRepository<PreviousPDF> _previousPDFRepository, IRepository<PreviousPDF> _previousPDFRepository,
IRepository<ReadingQuestionVisitJudgeRule> _readingQuestionVisitJudgeRuleRepository, IRepository<ReadingQuestionVisitJudgeRule> _readingQuestionVisitJudgeRuleRepository,
IRepository<VisitStage> _visitStageRepository,
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IReadingQuestionService IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IReadingQuestionService
{ {
#region 项目访视裁判规则 #region 项目访视裁判规则
/// <summary> /// <summary>
/// 获取项目阅片标准各访视的裁判规则配置。 /// 获取项目阅片标准各访视的裁判规则配置。
/// 未配置规则的访视问题也会返回,供前端直接进行配置。 /// 未配置规则的访视问题也会返回,供前端直接进行配置。
@ -50,8 +54,11 @@ namespace IRaCIS.Core.Application.Service
public async Task<List<TrialQuestionVisitJudgeRuleItemDto>> GetTrialQuestionVisitJudgeRule(GetTrialQuestionVisitJudgeRuleInDto inDto) public async Task<List<TrialQuestionVisitJudgeRuleItemDto>> GetTrialQuestionVisitJudgeRule(GetTrialQuestionVisitJudgeRuleInDto inDto)
{ {
var questionList = await _readingQuestionTrialRepository var questionList = await _readingQuestionTrialRepository
.Where(x=>!x.ExcludeShowVisitList.Contains(inDto.VisitNum))
.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && x.IsJudgeQuestion) .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) .WhereIf(inDto.ReadingQuestionId != null, x => x.Id == inDto.ReadingQuestionId)
.OrderBy(x => x.ShowOrder) .OrderBy(x => x.ShowOrder)
.Select(x => new TrialQuestionVisitJudgeRuleItemDto .Select(x => new TrialQuestionVisitJudgeRuleItemDto
@ -128,6 +135,54 @@ namespace IRaCIS.Core.Application.Service
return ResponseOutput.Result(await _readingQuestionVisitJudgeRuleRepository.SaveChangesAsync()); return ResponseOutput.Result(await _readingQuestionVisitJudgeRuleRepository.SaveChangesAsync());
} }
/// <summary>
/// 复制其他访视的项目阅片标准裁判规则配置。
/// 目标访视不适用的问题保留其已有的不适用规则,不参与复制。
/// </summary>
[HttpPost]
public async Task<IResponseOutput> 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 #endregion
@ -713,9 +768,61 @@ namespace IRaCIS.Core.Application.Service
} }
var entity = await _readingQuestionTrialRepository.InsertOrUpdateAsync(indto, true); var entity = await _readingQuestionTrialRepository.InsertOrUpdateAsync(indto, true);
await AddNAJudgeRule(entity);
return ResponseOutput.Ok(entity.Id.ToString()); return ResponseOutput.Ok(entity.Id.ToString());
} }
/// <summary>
/// 添加问题的不适用规则
/// </summary>
/// <returns></returns>
private async Task AddNAJudgeRule(ReadingQuestionTrial entity)
{
List<decimal> visitNums = new List<decimal>();
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();
}
/// <summary> /// <summary>
/// 获取项目问题(项目) /// 获取项目问题(项目)
/// </summary> /// </summary>
@ -780,6 +887,7 @@ namespace IRaCIS.Core.Application.Service
if (inDto.TrialReadingCriterionId != null) if (inDto.TrialReadingCriterionId != null)
{ {
return await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId) 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") .WhereIf(!inDto.IsGetAll, x => x.DataSource == DataSources.Automatic && x.Type == "number")
.Select(x => new CalculateRelationDto() .Select(x => new CalculateRelationDto()
{ {

View File

@ -26,6 +26,7 @@ namespace IRaCIS.Core.Application.Service
public partial class ReadingImageTaskService( public partial class ReadingImageTaskService(
IRepository<NoneDicomStudy> _noneDicomStudyRepository, IRepository<NoneDicomStudy> _noneDicomStudyRepository,
IRepository<VisitTask> _visitTaskRepository, IRepository<VisitTask> _visitTaskRepository,
IRepository<VisitStage> _visitStageRepository,
IRepository<Trial> _trialRepository, IRepository<Trial> _trialRepository,
IRepository<TaskInstance> _taskInstanceRepository, IRepository<TaskInstance> _taskInstanceRepository,
IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository, IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository,

View File

@ -14,6 +14,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using MimeKit; using MimeKit;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Linq.Dynamic.Core;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
{ {
@ -124,7 +125,7 @@ namespace IRaCIS.Core.Application.Service
.Select(x => x.JudgeRuleEnum) .Select(x => x.JudgeRuleEnum)
.FirstNotNullAsync(); .FirstNotNullAsync();
var displayQuestions = await GetJudgeDisplayQuestions(r1Task.TrialReadingCriterionId, r1Task.VisitTaskNum, judgeRule); var displayQuestions = await GetJudgeDisplayQuestions(r1Task.TrialReadingCriterionId, r1Task.VisitTaskNum, judgeRule, false);
var judgeAnswers = displayQuestions var judgeAnswers = displayQuestions
.Select(x => new SingleVisitJudgeAnswerItemDto .Select(x => new SingleVisitJudgeAnswerItemDto
{ {
@ -174,7 +175,7 @@ namespace IRaCIS.Core.Application.Service
{ {
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); 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 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 questionIds = questionList.Select(x => x.Id).ToList();
var answers = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && questionIds.Contains(x.ReadingQuestionTrialId)).ToListAsync(); var answers = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && questionIds.Contains(x.ReadingQuestionTrialId)).ToListAsync();
@ -187,6 +188,7 @@ namespace IRaCIS.Core.Application.Service
ReadingQuestionId = x.Id, ReadingQuestionId = x.Id,
QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us), QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us),
Type = x.Type, Type = x.Type,
ShowQuestion = x.ShowQuestion,
TypeValue = x.TypeValue, TypeValue = x.TypeValue,
ShowOrder = x.ShowOrder, ShowOrder = x.ShowOrder,
Answer = answers.FirstOrDefault(answer => answer.ReadingQuestionTrialId == x.Id)?.Answer ?? string.Empty, Answer = answers.FirstOrDefault(answer => answer.ReadingQuestionTrialId == x.Id)?.Answer ?? string.Empty,
@ -195,6 +197,11 @@ namespace IRaCIS.Core.Application.Service
Unit = x.Unit, Unit = x.Unit,
CustomUnit = x.CustomUnit, CustomUnit = x.CustomUnit,
ValueType = x.ValueType, ValueType = x.ValueType,
ClassifyQuestionId = x.ClassifyQuestionId,
ClassifyAlgorithms = x.ClassifyAlgorithms,
ClassifyType = x.ClassifyType
}).ToList(), }).ToList(),
}; };
} }
@ -222,7 +229,7 @@ namespace IRaCIS.Core.Application.Service
{ {
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); 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 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(); var submittedQuestionIds = inDto.QuestionList.Select(x => x.ReadingQuestionId).ToList();
@ -267,22 +274,49 @@ namespace IRaCIS.Core.Application.Service
} }
private async Task<List<ReadingQuestionTrial>> GetJudgeDisplayQuestions(Guid trialReadingCriterionId, decimal visitNum, JudgeRule judgeRule) private async Task<List<ReadingQuestionTrial>> GetJudgeDisplayQuestions(Guid trialReadingCriterionId, decimal visitNum, JudgeRule judgeRule,bool isGetShowQuestion)
{ {
var questionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialReadingCriterionId && x.IsJudgeQuestion) var questionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialReadingCriterionId && x.IsJudgeQuestion)
.Where(x=>x.ShowQuestion== ShowQuestion.Show) .WhereIf(!isGetShowQuestion,x=>x.ShowQuestion!= ShowQuestion.Hide)
.OrderBy(x => x.ShowOrder).ToListAsync(); .WhereIf(visitNum == 0, x => x.LimitShow != LimitShow.FollowShow)
var questionIds = questionList.Select(x => x.Id).ToList(); .WhereIf(visitNum != 0, x => x.LimitShow != LimitShow.BaseLineShow)
var visitJudgeRules = judgeRule == JudgeRule.Difference .Where(x=>x.LimitShow!=LimitShow.ExcludeSomeVisits||x.ExcludeShowVisitList.Contains(visitNum))
? await _readingQuestionVisitJudgeRuleRepository.Where(x => questionIds.Contains(x.ReadingQuestionId) && (x.VisitNum == visitNum || x.VisitNum == -1)).ToListAsync() .ToListAsync();
: new List<ReadingQuestionVisitJudgeRule>();
return questionList.Where(x => !x.ExcludeShowVisitList.Contains(visitNum))
.Where(x => judgeRule == JudgeRule.Consistent var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == trialReadingCriterionId).FirstNotNullAsync();
? x.JudgeType != JudgeTypeEnum.NotApplicable var questionIds = questionList.Select(x => x.Id).ToList();
: (visitJudgeRules.FirstOrDefault(rule => rule.ReadingQuestionId == x.Id && rule.VisitNum == visitNum) var visitJudgeRules=new List<ReadingQuestionVisitJudgeRule>();
?? visitJudgeRules.FirstOrDefault(rule => rule.ReadingQuestionId == x.Id && rule.VisitNum == -1))?.JudgeType != JudgeTypeEnum.NotApplicable) if (judgeRule == JudgeRule.Difference)
.ToList(); {
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<List<AnswerCombinationDto>>(x.AnswerCombination.IsNullOrEmpty() ? "[]" : x.AnswerCombination),
AnswerGroup = JsonConvert.DeserializeObject<List<string>>(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)
.OrderBy(x=>x.ShowOrder)
.ToList();
} }
/// <summary> /// <summary>
@ -1162,17 +1196,17 @@ namespace IRaCIS.Core.Application.Service
} }
var questionIds = answerList.Select(x => x.QuestionId).Distinct().ToList(); 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 //var questions = await _readingQuestionTrialRepository.Where(x => questionIds.Contains(x.Id)&&x.LimitShow == LimitShow.ExcludeSomeVisits).Select(x => new
{ //{
x.Id, // x.Id,
x.ExcludeShowVisitList, // x.ExcludeShowVisitList,
}).ToListAsync(); //}).ToListAsync();
var excludedQuestionIds = answerList //var excludedQuestionIds = answerList
.Where(x => questions.FirstOrDefault(question => question.Id == x.QuestionId)?.ExcludeShowVisitList.Contains(x.VisitTaskNum) == true) // .Where(x => questions.FirstOrDefault(question => question.Id == x.QuestionId)?.ExcludeShowVisitList.Contains(x.VisitTaskNum) == true)
.Select(x => x.QuestionId) // .Select(x => x.QuestionId)
.Distinct() // .Distinct()
.ToList(); // .ToList();
answerList.RemoveAll(x => excludedQuestionIds.Contains(x.QuestionId)); //answerList.RemoveAll(x => excludedQuestionIds.Contains(x.QuestionId));
if (judgeRule != JudgeRule.Difference || answerList.Count == 0) if (judgeRule != JudgeRule.Difference || answerList.Count == 0)
{ {

View File

@ -27,15 +27,16 @@ namespace IRaCIS.Core.Application
IRepository<TrialQCQuestion> _trialQCQuestionRepository, IRepository<TrialQCQuestion> _trialQCQuestionRepository,
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository, IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository, IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
IRepository<ReadingQuestionVisitJudgeRule> _readingQuestionVisitJudgeRuleRepository,
IRepository<TrialCriterionDictionaryCode> _trialCriterionDictionaryCode, IRepository<TrialCriterionDictionaryCode> _trialCriterionDictionaryCode,
IRepository<SystemCriterionDictionaryCode> _systemCriterionDictionaryCode, IRepository<SystemCriterionDictionaryCode> _systemCriterionDictionaryCode,
IRepository<ReadingQuestionCriterionSystem> _readingQuestionCriterionSystemRepository, IRepository<ReadingQuestionCriterionSystem> _readingQuestionCriterionSystemRepository,
IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository, IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository,
IRepository<ReadingCriterionPage> _readingCriterionPageRepository, IRepository<ReadingCriterionPage> _readingCriterionPageRepository,
IRepository<SystemCriterionKeyFile> _systemCriterionKeyFileRepository, IRepository<SystemCriterionKeyFile> _systemCriterionKeyFileRepository,
IOSSService _oSSService, IOSSService _oSSService,
IRepository<VisitStage> _visitStageRepository,
IRepository<TrialCriterionKeyFile> _trialCriterionKeyFileRepository, IRepository<TrialCriterionKeyFile> _trialCriterionKeyFileRepository,
IOrganInfoService _iOrganInfoService, IOrganInfoService _iOrganInfoService,
IRepository<TrialBodyPart> _trialBodyPartRepository, IRepository<TrialBodyPart> _trialBodyPartRepository,
IRepository<ReadingSystemCriterionDictionary> _readingCriterionDictionaryRepository, IRepository<ReadingSystemCriterionDictionary> _readingCriterionDictionaryRepository,
@ -48,7 +49,7 @@ namespace IRaCIS.Core.Application
IRepository<SystemBasicData> _systemBasicDataRepository, IRepository<SystemBasicData> _systemBasicDataRepository,
IRepository<SubjectVisit> _subjectVisitRepository, IRepository<SubjectVisit> _subjectVisitRepository,
IRepository<Enroll> _enrollRepository, IRepository<Enroll> _enrollRepository,
IRepository<TrialQCQuestionAnswer> _qcQuestionAnswerRepository, IRepository<TrialQCQuestionAnswer> _qcQuestionAnswerRepository,
IRepository<TrialStateChange> _trialStateChangeRepository, IRepository<TrialStateChange> _trialStateChangeRepository,
IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository, IRepository<TrialDicomAE> _dicomAERepository, IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository, IRepository<TrialDicomAE> _dicomAERepository,
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, ITrialConfigService IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, ITrialConfigService
@ -105,6 +106,40 @@ namespace IRaCIS.Core.Application
throw new BusinessValidationFailedException(_localizer["TrialConfig_JudgeTaskFail"]); 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<string>();
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); return ResponseOutput.Ok(true);
} }

View File

@ -21,7 +21,7 @@ public class ReadingQuestionVisitJudgeRule : BaseAddAuditEntity
public Guid ReadingQuestionId { get; set; } public Guid ReadingQuestionId { get; set; }
/// <summary> /// <summary>
/// 访视Num /// 访视Num (计划外是-1)
/// </summary> /// </summary>
public decimal VisitNum { get; set; } public decimal VisitNum { get; set; }