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
continuous-integration/drone/push Build is passing
Details
commit
4889038765
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue