修改关键图裁判选择标记
parent
6d9cfe5e45
commit
0333002ffa
|
@ -546,6 +546,45 @@ namespace IRaCIS.Core.Application.Contracts
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TrialKeyImageExportDTO
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public string ResearchProgramNo { get; set; }
|
||||||
|
public string CriterionName { get; set; }
|
||||||
|
public ArbitrationRule ArbitrationRule { get; set; }
|
||||||
|
|
||||||
|
public bool IsGlobalReading { get; set; }
|
||||||
|
|
||||||
|
public List<decimal> SubjectCriterionReadingPeriodVisitNumList { get; set; }
|
||||||
|
|
||||||
|
public string TrialSiteCode { get; set; }
|
||||||
|
|
||||||
|
public string VisitName { get; set; }
|
||||||
|
|
||||||
|
public Decimal VisitTaskNum { get; set; }
|
||||||
|
|
||||||
|
public string SubjectCode { get; set; }
|
||||||
|
|
||||||
|
public Arm ArmEnum { get; set; }
|
||||||
|
|
||||||
|
public Guid? JudgeResultTaskId { get; set; }
|
||||||
|
|
||||||
|
public bool? IsTrigerJudge { get; set; }
|
||||||
|
public bool? IsJudgeSelect { get; set; }
|
||||||
|
|
||||||
|
public ReadingCategory ReadingCategory { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public List<TrialKeyPicturePath> QuestionMarkPictureList { get; set; }
|
||||||
|
|
||||||
|
public List<TrialKeyPicturePath> TableQuestionRowPictureList { get; set; }
|
||||||
|
}
|
||||||
|
public class TrialKeyPicturePath
|
||||||
|
{
|
||||||
|
public string PicturePath { get; set; }
|
||||||
|
|
||||||
|
public string OtherPicturePath { get; set; }
|
||||||
|
}
|
||||||
public class TrialExportImageCommand
|
public class TrialExportImageCommand
|
||||||
{
|
{
|
||||||
[NotDefault]
|
[NotDefault]
|
||||||
|
|
|
@ -5,8 +5,10 @@ using IRaCIS.Core.Application.Contracts.Dicom.DTO;
|
||||||
using IRaCIS.Core.Application.Filter;
|
using IRaCIS.Core.Application.Filter;
|
||||||
using IRaCIS.Core.Application.Helper;
|
using IRaCIS.Core.Application.Helper;
|
||||||
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
|
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
|
||||||
|
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||||
using IRaCIS.Core.Domain.Models;
|
using IRaCIS.Core.Domain.Models;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
using IRaCIS.Core.Infrastructure;
|
using IRaCIS.Core.Infrastructure;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using MassTransit.Initializers;
|
using MassTransit.Initializers;
|
||||||
|
@ -1260,30 +1262,246 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
if (inCommand.IsKeyImage)
|
if (inCommand.IsKeyImage)
|
||||||
{
|
{
|
||||||
var downloadInfo = _visitTaskRepository.Where(t => t.TrialId == inCommand.TrialId && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.IsAnalysisCreate == false)
|
var downloadInfoList = _visitTaskRepository.Where(t => t.TrialId == inCommand.TrialId && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global)
|
||||||
|
&& t.ReadingTaskState == ReadingTaskState.HaveSigned && t.IsAnalysisCreate == false)
|
||||||
.Where(t => inCommand.SubjectVisitIdList.Contains((Guid)t.SourceSubjectVisitId))
|
.Where(t => inCommand.SubjectVisitIdList.Contains((Guid)t.SourceSubjectVisitId))
|
||||||
.Select(t => new
|
.Select(t => new TrialKeyImageExportDTO()
|
||||||
{
|
{
|
||||||
t.Trial.ResearchProgramNo,
|
ResearchProgramNo = t.Trial.ResearchProgramNo,
|
||||||
CriterionName = t.TrialReadingCriterion.CriterionName,
|
CriterionName = t.TrialReadingCriterion.CriterionName,
|
||||||
|
ArbitrationRule = t.TrialReadingCriterion.ArbitrationRule,
|
||||||
|
IsGlobalReading = t.TrialReadingCriterion.IsGlobalReading,
|
||||||
|
SubjectCriterionReadingPeriodVisitNumList = t.Subject.ReadModuleList
|
||||||
|
.Where(u => u.TrialReadingCriterionId == t.TrialReadingCriterionId && u.ReadingSetType == ReadingSetType.ImageReading).Select(c => c.SubjectVisit.VisitNum).ToList(),
|
||||||
|
|
||||||
TrialSiteCode = t.Subject.TrialSite.TrialSiteCode,
|
TrialSiteCode = t.Subject.TrialSite.TrialSiteCode,
|
||||||
SubjectCode = t.Subject.Code,
|
SubjectCode = t.Subject.Code,
|
||||||
VisitName = (string?)t.SourceSubjectVisit.VisitName,
|
|
||||||
|
ReadingCategory = t.ReadingCategory,
|
||||||
|
|
||||||
|
VisitName = t.ReadingCategory == ReadingCategory.Visit ? t.SourceSubjectVisit.VisitName : "",
|
||||||
|
|
||||||
|
VisitTaskNum = t.VisitTaskNum,
|
||||||
|
|
||||||
ArmEnum = t.ArmEnum,
|
ArmEnum = t.ArmEnum,
|
||||||
|
|
||||||
QuestionMarkPictureList = t.ReadingTaskQuestionMarkList.Select(c => new { c.PicturePath, c.OtherPicturePath }).ToList(),
|
QuestionMarkPictureList = t.ReadingTaskQuestionMarkList.Select(c => new TrialKeyPicturePath { PicturePath = c.PicturePath, OtherPicturePath = c.OtherPicturePath }).ToList(),
|
||||||
|
|
||||||
TableQuestionRowPictureList = t.LesionList.Select(c => new { c.PicturePath, c.OtherPicturePath }).ToList(),
|
TableQuestionRowPictureList = t.LesionList.Select(c => new TrialKeyPicturePath { PicturePath = c.PicturePath, OtherPicturePath = c.OtherPicturePath }).ToList(),
|
||||||
|
|
||||||
|
Id = t.Id,
|
||||||
|
//裁判选择结果
|
||||||
|
JudgeResultTaskId = t.JudgeVisitTask.JudgeResultTaskId,
|
||||||
|
|
||||||
IsJudgeSelect = t.JudgeResultTaskId == t.Id
|
//是否触发裁判
|
||||||
|
IsTrigerJudge = t.JudgeVisitTaskId != null,
|
||||||
|
|
||||||
|
IsJudgeSelect = null
|
||||||
|
|
||||||
|
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
return ResponseOutput.Ok(downloadInfo);
|
foreach (var subjectCriterionGroup in downloadInfoList.GroupBy(t => new { t.SubjectCode, t.CriterionName, t.ArbitrationRule, t.IsGlobalReading }))
|
||||||
|
{
|
||||||
|
var arbitrationRule = subjectCriterionGroup.Key.ArbitrationRule;
|
||||||
|
var isGlobalReading = subjectCriterionGroup.Key.IsGlobalReading;
|
||||||
|
|
||||||
|
foreach (var item in subjectCriterionGroup)
|
||||||
|
{
|
||||||
|
if (arbitrationRule == ArbitrationRule.Visit)
|
||||||
|
{
|
||||||
|
//是否产生裁判
|
||||||
|
|
||||||
|
if (item.IsTrigerJudge == true)
|
||||||
|
{
|
||||||
|
//裁判做完了
|
||||||
|
if (item.JudgeResultTaskId != null)
|
||||||
|
{
|
||||||
|
//裁判选择了自己,那么设置
|
||||||
|
if (item.JudgeResultTaskId == item.Id)
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//没产生 且两个人做完了 默认R1
|
||||||
|
|
||||||
|
if (subjectCriterionGroup.Where(t => t.VisitTaskNum == item.VisitTaskNum && t.SubjectCode == item.SubjectCode).Select(t => t.ArmEnum).Distinct().Count() == 2)
|
||||||
|
{
|
||||||
|
if (item.ArmEnum == Arm.DoubleReadingArm1)
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (arbitrationRule == ArbitrationRule.Reading)
|
||||||
|
{
|
||||||
|
|
||||||
|
//阅片期访视号
|
||||||
|
var subjectReadingPeriondVisitNumList = subjectCriterionGroup.FirstOrDefault()?.SubjectCriterionReadingPeriodVisitNumList;
|
||||||
|
|
||||||
|
//两个人完成最大得任务号(访视+全局)
|
||||||
|
var subjectMaxFinishedTaskNum = subjectCriterionGroup.GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).DefaultIfEmpty().Max();
|
||||||
|
|
||||||
|
var addReadingPeriodNum = isGlobalReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : 0;
|
||||||
|
|
||||||
|
//可能没有配置阅片期 ,或者配置了 没有完成
|
||||||
|
var finishedGlobalCount = 0;
|
||||||
|
|
||||||
|
var globalFinishedVisitTaskNumList = new List<decimal>();
|
||||||
|
|
||||||
|
//没有配置阅片期
|
||||||
|
if (subjectReadingPeriondVisitNumList == null)
|
||||||
|
{
|
||||||
|
finishedGlobalCount = 0;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
globalFinishedVisitTaskNumList = subjectCriterionGroup.Where(t => subjectReadingPeriondVisitNumList.Any(c => (c + addReadingPeriodNum) == t.VisitTaskNum))
|
||||||
|
.Select(t => new { t.VisitTaskNum, t.ArmEnum }).Distinct()
|
||||||
|
.GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).ToList();
|
||||||
|
|
||||||
|
finishedGlobalCount = globalFinishedVisitTaskNumList.Count();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (finishedGlobalCount != 0)
|
||||||
|
{
|
||||||
|
//最大的完成的全局是否产生裁判
|
||||||
|
|
||||||
|
var maxFinishedGlobalNum = globalFinishedVisitTaskNumList.Max();
|
||||||
|
|
||||||
|
var globalMaxTask = subjectCriterionGroup.FirstOrDefault(t => t.VisitTaskNum == maxFinishedGlobalNum);
|
||||||
|
|
||||||
|
// 触发了裁判
|
||||||
|
if (globalMaxTask.IsTrigerJudge == true)
|
||||||
|
{
|
||||||
|
//最大裁判完成了
|
||||||
|
|
||||||
|
var maxJudgeVisitTaskNum = maxFinishedGlobalNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge];
|
||||||
|
|
||||||
|
if (globalMaxTask.JudgeResultTaskId != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
var maxJudgeArmEnum = subjectCriterionGroup.Where(t => t.Id == globalMaxTask.JudgeResultTaskId).FirstOrDefault().ArmEnum;
|
||||||
|
|
||||||
|
if (item.VisitTaskNum < maxJudgeVisitTaskNum)
|
||||||
|
{
|
||||||
|
//触发裁判
|
||||||
|
item.IsTrigerJudge = true;
|
||||||
|
|
||||||
|
if (item.ArmEnum == maxJudgeArmEnum)
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = true;
|
||||||
|
}
|
||||||
|
//裁判没选择的人设置为false
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//最大的裁判未完成
|
||||||
|
|
||||||
|
//找到当前未阅最大裁判之前的已完成的最大裁判任务
|
||||||
|
|
||||||
|
var finishedGlobalFinishedMaxJudge = subjectCriterionGroup.Where(t => globalFinishedVisitTaskNumList.Contains(t.VisitTaskNum) && t.IsTrigerJudge == true && t.JudgeResultTaskId != null).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault();
|
||||||
|
|
||||||
|
|
||||||
|
//未完成裁判之前 没有已完成的全局裁判
|
||||||
|
if (finishedGlobalFinishedMaxJudge == null)
|
||||||
|
{
|
||||||
|
if (item.VisitTaskNum < maxJudgeVisitTaskNum)
|
||||||
|
{
|
||||||
|
item.IsTrigerJudge = true;
|
||||||
|
//item.IsJudgeSelect = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
var maxFinishedJudgeVisitTaskNum = finishedGlobalFinishedMaxJudge.VisitTaskNum + +ReadingCommon.TaskNumDic[ReadingCategory.Judge];
|
||||||
|
|
||||||
|
var maxFinishedJudgeArmEnum = subjectCriterionGroup.Where(t => t.Id == finishedGlobalFinishedMaxJudge.JudgeResultTaskId).FirstOrDefault().ArmEnum;
|
||||||
|
|
||||||
|
if (item.VisitTaskNum < maxFinishedJudgeVisitTaskNum)
|
||||||
|
{
|
||||||
|
item.IsTrigerJudge = true;
|
||||||
|
|
||||||
|
if (item.ArmEnum == maxFinishedJudgeArmEnum)
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = true;
|
||||||
|
}
|
||||||
|
//裁判没选择的人设置为false
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (item.VisitTaskNum > maxFinishedJudgeVisitTaskNum && item.VisitTaskNum < maxJudgeVisitTaskNum)
|
||||||
|
{
|
||||||
|
//完成裁判 和未完成裁判之间的 裁判选择标记默认是null
|
||||||
|
|
||||||
|
item.IsTrigerJudge = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//在未完成全局裁判之后的访视 未知 都是null
|
||||||
|
|
||||||
|
item.IsTrigerJudge = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//最大的全局未产生裁判
|
||||||
|
|
||||||
|
if (item.VisitTaskNum <= maxFinishedGlobalNum)
|
||||||
|
{
|
||||||
|
item.IsTrigerJudge = false;
|
||||||
|
|
||||||
|
if (item.ArmEnum == Arm.DoubleReadingArm1)
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item.IsJudgeSelect = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadInfoList = downloadInfoList.Where(t => t.ReadingCategory == ReadingCategory.Visit).ToList();
|
||||||
|
return ResponseOutput.Ok(downloadInfoList);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue