using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Filter;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
using Microsoft.AspNetCore.Authorization;
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Service.Reading.Dto;
using MassTransit;
using IRaCIS.Core.Application.Service.Reading;
using IRaCIS.Core.Infra.EFCore.Common;
using Panda.DynamicWebApi.Attributes;
using AutoMapper;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Infrastructure;
using Newtonsoft.Json;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.ViewModel;
namespace IRaCIS.Application.Services
{
///
/// IR影像阅片
///
[ApiExplorerSettings(GroupName = "Reading")]
public class ReadingImageTaskService : BaseService, IReadingImageTaskService
{
private readonly IRepository _noneDicomStudyRepository;
private readonly IRepository _visitTaskRepository;
private readonly IRepository _trialRepository;
private readonly IRepository _readingOncologyTaskInfoRepository;
private readonly IVisitTaskHelpeService _visitTaskHelpeService;
private readonly IVisitTaskService _visitTaskService;
private readonly IReadingClinicalDataService _readingClinicalDataService;
private readonly IRepository _subjectVisitRepository;
private readonly IRepository _subjectRepository;
private readonly IRepository _readingGlobalTaskInfoRepository;
private readonly IRepository _readingCriterionPageRepository;
private readonly IRepository _readingJudgeInfoRepository;
private readonly IRepository _readModuleRepository;
private readonly IRepository _readingTaskQuestionAnswerRepository;
private readonly IRepository _readingQuestionCriterionTrialRepository;
private readonly IRepository _readingQuestionCriterionSystemRepository;
private readonly IRepository _readingQuestionSystem;
private readonly IRepository _readingQuestionTrialRepository;
public ReadingImageTaskService(
IMapper mapper,
IRepository noneDicomStudyRepository,
IRepository visitTaskRepository,
IRepository TrialRepository,
IRepository ReadingOncologyTaskInfoRepository,
IVisitTaskHelpeService visitTaskHelpeService,
IVisitTaskService visitTaskService,
IReadingClinicalDataService readingClinicalDataService,
IRepository subjectVisitRepository,
IRepository subjectRepository,
IRepository readingGlobalTaskInfoRepository,
IRepository readingCriterionPageRepository,
IRepository readingJudgeInfoRepository,
IRepository readModuleRepository,
IRepository readingTaskQuestionAnswerRepository,
IRepository readingQuestionCriterionTrialRepository,
IRepository readingQuestionCriterionSystemRepository,
IRepository ReadingQuestionSystem,
IRepository readingQuestionTrialRepository
)
{
base._mapper = mapper;
this._noneDicomStudyRepository = noneDicomStudyRepository;
this._visitTaskRepository = visitTaskRepository;
this._trialRepository = TrialRepository;
this._readingOncologyTaskInfoRepository = ReadingOncologyTaskInfoRepository;
this._visitTaskHelpeService = visitTaskHelpeService;
this._visitTaskService = visitTaskService;
this._readingClinicalDataService = readingClinicalDataService;
this._subjectVisitRepository = subjectVisitRepository;
this._subjectRepository = subjectRepository;
this._readingGlobalTaskInfoRepository = readingGlobalTaskInfoRepository;
this._readingCriterionPageRepository = readingCriterionPageRepository;
this._readingJudgeInfoRepository = readingJudgeInfoRepository;
this._readModuleRepository = readModuleRepository;
this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository;
this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
this._readingQuestionCriterionSystemRepository = readingQuestionCriterionSystemRepository;
this._readingQuestionSystem = ReadingQuestionSystem;
this._readingQuestionTrialRepository = readingQuestionTrialRepository;
}
#region 肿瘤学阅片相关
///
/// 获取肿瘤学任务信息
///
///
///
///
[HttpPost]
public async Task GetOncologyReadingInfo(GetOncologyReadingInfoInDto inDto)
{
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
if (taskInfo.ReadingCategory != ReadingCategory.Oncology)
{
throw new BusinessValidationFailedException("当前任务不是肿瘤学任务");
}
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == taskInfo.TrialId && x.IsConfirm).FirstOrDefaultAsync();
if (trialCriterion == null)
{
throw new BusinessValidationFailedException("请先确认一个项目标准。");
}
GetOncologyReadingInfoOutDto result = new GetOncologyReadingInfoOutDto() {
TrialEvaluationResult= trialCriterion.EvaluationResult,
IsShowDetail= trialCriterion.IsShowDetail,
TrialEvaluationReason = trialCriterion.EvaluationReason.IsNullOrEmpty()? ReadingCommon.EvaluationReason : trialCriterion.EvaluationReason,
OncologyTaskId = inDto.VisitTaskId,
ReadingTaskState= taskInfo.ReadingTaskState,
};
// 先找到是R1还是R2的阅片 先找到全局阅片
var globalTaskInfo= await _visitTaskRepository
.Where(x => x.SubjectId == taskInfo.SubjectId&&
x.TaskState== TaskState.Effect&&
x.ReadingCategory== ReadingCategory.Global&&
x.VisitTaskNum< taskInfo.VisitTaskNum
).OrderByDescending(x=>x.VisitTaskNum)
.FirstNotNullAsync();
// 最后取哪组的数据
VisitTask visitTask = new VisitTask();
// 判断是否产生裁判
if (globalTaskInfo.JudgeVisitTaskId == null)
{
visitTask = globalTaskInfo;
}
else
{
var judgeResultTaskId = await _visitTaskRepository.Where(x => x.Id == globalTaskInfo.JudgeVisitTaskId).Select(x => x.JudgeResultTaskId).FirstOrDefaultAsync();
if (judgeResultTaskId == null)
{
throw new BusinessValidationFailedException("异常,裁判结果为null");
}
visitTask = await _visitTaskRepository.Where(x=>x.Id== judgeResultTaskId).FirstOrDefaultAsync();
}
result.GlobalTaskId = visitTask.Id;
result.SubjectId = visitTask.SubjectId;
// 获取全局阅片信息
var globalTaskReadingInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto()
{
UsingOriginalData = true,
VisitTaskId = visitTask.Id
});
// 找到对应的访视
List oncologyVisits = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.SubjectId == visitTask.SubjectId && x.IsAnalysisCreate == visitTask.IsAnalysisCreate && x.TaskState == TaskState.Effect && x.VisitTaskNum < visitTask.VisitTaskNum)
.Where(x => x.DoctorUserId == visitTask.DoctorUserId)
.OrderBy(x => x.VisitTaskNum).Select(x => new OncologyVisitTaskInfo()
{
VisitName = x.SourceSubjectVisit.VisitName,
VisitTaskId = x.Id,
// QuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder)
//.Select(y => new OncologyQuestion()
//{
// QuestionId = y.ReadingQuestionTrialId,
// QuestionName = y.ReadingQuestionTrial.QuestionName,
// Answer = y.GlobalChangeAnswer
//}).ToList()
}).ToListAsync();
var oncologyReadingQuestions = await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == inDto.VisitTaskId).ToListAsync();
oncologyVisits.ForEach(x =>
{
var oncologyData = oncologyReadingQuestions.Where(y => y.VisitTaskId == x.VisitTaskId).FirstOrDefault();
if (oncologyData != null)
{
x.EvaluationResult = oncologyData.EvaluationResult;
x.EvaluationReason = oncologyData.EvaluationReason;
}
x.QuestionList = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Where(x => x.QuestionId != null)
.Select(y => new OncologyQuestion
{
QuestionId = y.QuestionId ?? default(Guid),
QuestionName = y.QuestionName,
Answer = y.Answer
}).ToList();
x.IsHaveChange = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Any(y => y.IsHaveChange);
x.VisitRemark = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Where(y => y.QuestionId == null).Select(x => x.Answer).FirstOrDefault() ?? string.Empty;
});
result.OncologyVisits = oncologyVisits;
return result;
}
///
/// 修改肿瘤学阅片信息
///
///
///
[HttpPost]
public async Task SetOncologyReadingInfo(SetOncologyReadingInfoInDto inDto)
{
await _readingOncologyTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.OncologyTaskId == inDto.OncologyTaskId);
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.OncologyTaskId).FirstNotNullAsync();
List readingOncologies = inDto.OncologyQuestionList.Select(x => new ReadingOncologyTaskInfo()
{
EvaluationReason = x.EvaluationReason,
SubjectId = taskInfo.SubjectId,
EvaluationResult = x.EvaluationResult,
OncologyTaskId = inDto.OncologyTaskId,
TrialId = taskInfo.TrialId,
VisitTaskId = x.VisitTaskId
}).ToList();
await _readingOncologyTaskInfoRepository.AddRangeAsync(readingOncologies);
var result = await _readingOncologyTaskInfoRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
#endregion
#region 全局阅片相关
///
/// 保存全局阅片结果
///
///
///
[HttpPost]
public async Task SaveGlobalReadingInfo(SaveGlobalReadingInfoInDto inDto)
{
var visitTaskId = inDto.QuestionList.Select(x => x.VisitTaskId).FirstOrDefault();
await _readingGlobalTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.GlobalTaskId == inDto.GlobalTaskId&&x.TaskId== visitTaskId);
foreach(var item in inDto.QuestionList)
{
await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == item.QuestionId, x => new ReadingTaskQuestionAnswer()
{
GlobalChangeAnswer = item.Answer
});
}
await _readingGlobalTaskInfoRepository.AddRangeAsync(inDto.QuestionList.Select(x => new ReadingGlobalTaskInfo()
{
Answer = x.Answer,
QuestionId = x.QuestionId,
SubjectId = inDto.SubjectId,
GlobalTaskId = inDto.GlobalTaskId,
TaskId = x.VisitTaskId,
TrialId = inDto.TrialId,
}).ToList());
var result = await _readingGlobalTaskInfoRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
///
/// 获取全局阅片信息
///
///
///
[HttpPost]
public async Task GetGlobalReadingInfo(GetGlobalReadingInfoInDto inDto)
{
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
if (taskInfo.ReadingCategory != ReadingCategory.Global)
{
throw new BusinessValidationFailedException("当前任务不是全局阅片任务");
}
GetGlobalReadingInfoOutDto result = new GetGlobalReadingInfoOutDto()
{
GlobalTaskId = inDto.VisitTaskId,
ReadingTaskState=taskInfo.ReadingTaskState,
};
// 一致性分析按照doctorId 其他按照分组
result.TaskList = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.SubjectId == taskInfo.SubjectId &&x.IsAnalysisCreate== taskInfo.IsAnalysisCreate&&x.TaskState==TaskState.Effect && x.VisitTaskNum < taskInfo.VisitTaskNum)
.Where(x => x.DoctorUserId == taskInfo.DoctorUserId)
.OrderBy(x => x.VisitTaskNum).Select(x => new GlobalVisitInfo()
{
VisitName = x.SourceSubjectVisit.VisitName,
VisitTaskId = x.Id,
ArmEnum= taskInfo.ArmEnum,
VisitNum =x.SourceSubjectVisit.VisitNum,
VisitId = x.SourceSubjectVisitId.Value,
BeforeQuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder)
.Select(y => new GlobalQuestionInfo()
{
QuestionId = y.ReadingQuestionTrialId,
QuestionName = y.ReadingQuestionTrial.QuestionName,
AnswerGroup=y.ReadingQuestionTrial.AnswerGroup,
AnswerCombination=y.ReadingQuestionTrial.AnswerCombination,
JudgeType=y.ReadingQuestionTrial.JudgeType,
Type = y.ReadingQuestionTrial.Type,
TypeValue = y.ReadingQuestionTrial.TypeValue,
Answer = y.Answer
}).ToList()
}).ToListAsync();
var globalReadingQuestion = await _readingGlobalTaskInfoRepository.Where(x => x.GlobalTaskId == inDto.VisitTaskId).ToListAsync();
result.TaskList.ForEach(x =>
{
x.AfterQuestionList = x.BeforeQuestionList.GroupJoin(
globalReadingQuestion
, l => new { a = l.QuestionId, b = x.VisitTaskId }
, r => new { a = r.QuestionId, b = r.TaskId }
, (l, r) => new { question = l, global = r })
.SelectMany(lr => lr.global.DefaultIfEmpty(), (lr, r) => new GlobalQuestionInfo
{
Answer = lr.global == null|| lr.global.Count()==0 ?
(inDto.UsingOriginalData?lr.question.Answer: string.Empty) :
(lr.global.Select(x => x.Answer).FirstOrDefault().IsNullOrEmpty()&& inDto.UsingOriginalData?
lr.question.Answer:lr.global.Select(x => x.Answer).FirstOrDefault()
),
IsHaveChange= lr.global==null? false: lr.global.Any(),
QuestionId = lr.question.QuestionId,
QuestionName = lr.question.QuestionName,
Type = lr.question.Type,
AnswerGroup = lr.question.AnswerGroup,
AnswerCombination = lr.question.AnswerCombination,
JudgeType = lr.question.JudgeType,
TypeValue = lr.question.TypeValue,
}).ToList();
var reason = new GlobalQuestionInfo()
{
Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.QuestionId == null).Select(x => x.Answer).FirstOrDefault() ?? String.Empty,
QuestionName = "原因",
Type = "input",
};
x.AfterQuestionList.Add(reason);
});
return result;
}
#endregion
#region 获取下一个阅片任务
///
/// 获取下一个阅片任务
///
///
///
[HttpPost]
public async Task GetNextTask(GetNextTaskInDto inDto)
{
GetReadingTaskDto? task = new GetReadingTaskDto();
if (inDto.VisistTaskId != null)
{
task = await _visitTaskRepository.Where(x => x.Id == inDto.VisistTaskId).Select(x => new GetReadingTaskDto()
{
VisitTaskId = x.Id,
TaskBlindName = x.TaskBlindName,
SubjectId = x.SubjectId,
ReadingCategory = x.ReadingCategory,
VisistId = x.SourceSubjectVisitId != null ? x.SourceSubjectVisitId.Value :default(Guid) ,
VisitNum = x.VisitTaskNum,
}).FirstOrDefaultAsync();
}
else if (inDto.SubjectId != null)
{
#region 之前的
//var subjectList = await _subjectRepository.Where(t => t.TrialId == inDto.TrialId)
//.Select(s => new SubjectTask()
//{
// SubjectId = s.Id,
// UnReadTaskCount = s.SubjectVisitTaskList.Count(t => t.ReadingTaskState != ReadingTaskState.HaveSigned && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect),
//}).OrderBy(x => x.SubjectId).ToListAsync();
//subjectList = subjectList.Select((x, index) => new SubjectTask()
//{
// Index = index,
// SubjectId = x.SubjectId,
// UnReadTaskCount = x.UnReadTaskCount,
//}).ToList();
//var subjectIndex = subjectList.Where(x => x.SubjectId == inDto.SubjectId).Select(x => x.Index).FirstOrDefault();
//var newSubjectId = subjectList.Where(x => x.Index >= subjectIndex && x.UnReadTaskCount != 0).Select(x => x.SubjectId).FirstOrDefault();
//var taskquery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.SubjectId == newSubjectId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect).Select(x => new GetReadingTaskDto()
//{
// VisitTaskId = x.Id,
// TaskBlindName = x.TaskBlindName,
// ReadingCategory = x.ReadingCategory,
// VisistId = x.SourceSubjectVisitId != null ? x.SourceSubjectVisitId.Value : x.ReadModule == null ? default(Guid) : x.ReadModule.SubjectVisitId,
// VisitNum = x.VisitTaskNum,
//}).OrderBy(x => x.VisitNum).ThenBy(x => x.ReadingCategory);
#endregion
var subjectTaskList = await _visitTaskService.GetOrderReadingIQueryable(inDto.TrialId).Item2.ToListAsync();
var index = 0;
subjectTaskList.ForEach(x =>
{
x.Index = index;
index++;
});
var subjectIndex = subjectTaskList.Where(x => x.SubjectId == inDto.SubjectId&&x.SubjectCode==inDto.SubjectCode).Select(x => x.Index).FirstOrDefault();
var currentSubject = subjectTaskList.Where(x => x.Index >= subjectIndex&&!x.ExistReadingApply).OrderBy(x => x.Index).FirstOrDefault();
if (currentSubject == null)
{
throw new BusinessValidationFailedException("任务都已经完成");
}
task = currentSubject.UnReadTaskList.Select(x => new GetReadingTaskDto()
{
ReadingCategory = x.ReadingCategory,
SubjectCode = currentSubject.SubjectCode,
SubjectId = currentSubject.SubjectId,
TaskBlindName = x.TaskBlindName,
VisitNum = x.VisitNum,
VisistId = x.VisistId ?? default(Guid),
VisitTaskId = x.Id
}).FirstOrDefault();
}
else
{
task = await _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect).Select(x => new GetReadingTaskDto()
{
VisitTaskId = x.Id,
TaskBlindName = x.TaskBlindName,
ReadingCategory = x.ReadingCategory,
VisistId = x.SourceSubjectVisitId != null ? x.SourceSubjectVisitId.Value : x.ReadModule == null ? default(Guid) : x.ReadModule.SubjectVisitId,
VisitNum = x.VisitTaskNum,
SubjectId = x.SubjectId,
SubjectCode = x.Subject.Code,
}).FirstOrDefaultAsync();
if (task == null)
{
throw new BusinessValidationFailedException("任务都已经完成");
}
}
if (task.SubjectCode.IsNullOrEmpty())
{
task.SubjectCode = await _subjectRepository.Where(x => x.Id == task.SubjectId).Select(x => x.Code).FirstOrDefaultAsync();
}
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == task.VisitTaskId && x.FirstReadingTime == null, x => new VisitTask()
{
FirstReadingTime = DateTime.Now,
});
await _visitTaskRepository.SaveChangesAsync();
var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == task.VisitTaskId).FirstNotNullAsync();
task.SubjectCode = visitTaskInfo.BlindSubjectCode.IsNullOrEmpty() ? task.SubjectCode : visitTaskInfo.BlindSubjectCode;
var trialInfo = await _trialRepository.Where(x => x.Id == visitTaskInfo.TrialId).Select(x => new
{
x.IsReadingShowPreviousResults,
x.IsReadingShowSubjectInfo,
x.ClinicalInformationTransmissionEnum,
}).FirstOrDefaultAsync();
task.IsReadingShowPreviousResults = trialInfo.IsReadingShowPreviousResults;
task.IsReadingShowSubjectInfo = trialInfo.IsReadingShowSubjectInfo;
return task;
}
#endregion
#region 获取阅片非Dicom文件
///
/// 获取阅片非Dicom文件
///
///
///
[HttpPost]
public async Task<(List, object)> GetReadingImageFile(GetReadingImgInDto inDto)
{
var task = await GetNextTask(new GetNextTaskInDto()
{
TrialId = inDto.TrialId,
SubjectId = inDto.SubjectId,
VisistTaskId = inDto.VisistTaskId,
});
List visitIds = new List();
if (task.ReadingCategory == ReadingCategory.Visit)
{
visitIds.Add(task.VisistId);
}
else
{
// 阅片期取前面所有的图像
visitIds.AddRange(await _subjectVisitRepository.Where(x => x.VisitNum <= task.VisitNum && x.SubjectId == task.SubjectId).Select(x => x.Id).ToListAsync());
}
List result = await _noneDicomStudyRepository.Where(t => visitIds.Contains(t.SubjectVisitId))
.ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken }).ToListAsync();
var trialInfo = await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x => new
{
x.IsReadingShowPreviousResults,
x.IsReadingShowSubjectInfo,
x.ClinicalInformationTransmissionEnum,
}).FirstOrDefaultAsync();
#region 临床数据
#endregion
bool isExistsClinicalData = false;
if (trialInfo.ClinicalInformationTransmissionEnum == 1)
{
isExistsClinicalData = (await _readingClinicalDataService.GetClinicalDataList(new GetReadingOrTaskClinicalDataListInDto()
{
SubjectId = task.SubjectId,
TrialId = inDto.TrialId,
VisitTaskId = task.VisitTaskId,
})).Count() > 0;
}
var taskInfo = await _visitTaskRepository.Where(x => x.Id == task.VisitTaskId).FirstNotNullAsync();
return (result, new
{
VisitTaskId = task.VisitTaskId,
SubjectId = task.SubjectId,
SubjectCode = taskInfo.BlindSubjectCode.IsNullOrEmpty()? task.SubjectCode: taskInfo.BlindSubjectCode,
ReadingCategory = task.ReadingCategory,
TaskBlindName = task.TaskBlindName,
IsReadingShowPreviousResults = trialInfo.IsReadingShowPreviousResults,
IsReadingShowSubjectInfo = trialInfo.IsReadingShowSubjectInfo,
IsExistsClinicalData = isExistsClinicalData,
});
}
#endregion
#region 获取项目已确认的标准
///
/// 获取项目已确认的标准
///
///
///
[HttpPost]
public async Task> GetTrialConfirmCriterionList(GetConfirmCriterionInDto inDto)
{
var result = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm)
.Select(x => new GetTrialConfirmCriterionListOutDto()
{
ReadingQuestionCriterionTrialId = x.Id,
ReadingQuestionCriterionTrialName = x.CriterionName
}).ToListAsync();
return result;
}
#endregion
#region 配置裁判问题相关
///
/// 获取项目标准的裁判问题
///
///
///
[HttpPost]
public async Task<(List, object)> GetTrialCriterionJudgeQuestionList(GetTrialCriterionJudgeQuestionListInDto inDto)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm).FirstNotNullAsync();
var result = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.ReadingQuestionCriterionTrialId && x.IsJudgeQuestion)
.WhereIf(trialCriterion.FormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null)
.WhereIf(trialCriterion.FormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null)
.Select(x => new GetTrialCriterionJudgeQuestionListOutDto()
{
AnswerGroup = JsonConvert.DeserializeObject>(x.AnswerGroup.IsNullOrEmpty() ? "[]" : x.AnswerGroup),
AnswerCombination = JsonConvert.DeserializeObject>(x.AnswerCombination.IsNullOrEmpty() ? "[]" : x.AnswerCombination),
QuestionName = x.QuestionName,
PageName = x.ReadingCriterionPage.PageName,
TypeValue = x.TypeValue,
JudgeType = x.JudgeType,
ReadingQuestionTrialId = x.Id
}).ToListAsync();
var signTime = await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x => x.ReadingInfoSignTime).FirstOrDefaultAsync();
return (result, new
{
IsSign = signTime != null,
});
}
///
/// 设置裁判问题的答案分组
///
///
///
[HttpPost]
public async Task SetTrialCriterionJudgeQuestionAnswerGroup(SetTrialCriterionJudgeQuestionAnswerGroupInDto inDto)
{
await _readingQuestionTrialRepository.UpdatePartialFromQueryAsync(inDto.ReadingQuestionTrialId, x => new ReadingQuestionTrial()
{
AnswerGroup = JsonConvert.SerializeObject(inDto.AnswerGroup),
AnswerCombination = JsonConvert.SerializeObject(inDto.AnswerCombination),
JudgeType = inDto.JudgeType,
});
var result = await _readingQuestionTrialRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
#endregion
#region 获取项目的阅片问题
///
/// 获取项目的阅片问题
///
///
/// SinglePage 单页
///
/// MultiPage 多页
///
/// PublicPage 公共
///
///
///
[HttpPost]
public async Task<(GetTrialReadingQuestionPageDto, object)> GetTrialReadingQuestion(GetTrialReadingQuestionInDto inDto)
{
var result = new GetTrialReadingQuestionPageDto();
var readingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.ReadingTaskState).FirstOrDefaultAsync();
var query = from data in _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.ReadingQuestionCriterionTrialId)
join page in _readingCriterionPageRepository.AsQueryable() on data.ReadingCriterionPageId ?? default(Guid) equals page.Id into pageTemp
from leftpage in pageTemp.DefaultIfEmpty()
join questionAnswer in _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId) on data.Id equals questionAnswer.ReadingQuestionTrialId into questionAnswerTemp
from leftquestionAnswer in questionAnswerTemp.DefaultIfEmpty()
select new GetTrialReadingQuestionOutDto()
{
ReadingQuestionTrialId = data.Id,
ReadingQuestionCriterionTrialId = data.ReadingQuestionCriterionTrialId,
TrialId = data.TrialId,
Type = data.Type,
ParentTriggerValue = data.ParentTriggerValue,
GroupName = data.GroupName,
QuestionName = data.QuestionName,
IsRequired = data.IsRequired,
ShowQuestion=data.ShowQuestion,
ShowOrder = data.ShowOrder,
RelevanceId=data.RelevanceId,
RelevanceValue=data.RelevanceValue,
ImageCount=data.ImageCount,
ParentId = data.ParentId,
TypeValue = data.TypeValue,
Answer = leftquestionAnswer.Answer,
ReadingCriterionPageId = data.ReadingCriterionPageId,
PageName = leftpage.PageName,
PageShowOrder = leftpage.ShowOrder,
IsPublicPage = leftpage.IsPublicPage,
};
var qusetionList = await query.Where(x=>x.ShowQuestion!=ShowQuestion.Hide).OrderBy(x => x.ShowOrder).ToListAsync();
var formType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.ReadingQuestionCriterionTrialId).Select(x => x.FormType).FirstOrDefaultAsync();
var groupList = new List();
if (inDto.FormType != null)
{
formType = inDto.FormType.Value;
}
if (formType == FormType.MultiplePage)
{
qusetionList = qusetionList.Where(x => x.ReadingCriterionPageId != null).ToList();
var readingCriterionPageIds = qusetionList.OrderBy(x => x.PageShowOrder).Select(x => x.ReadingCriterionPageId).Distinct().ToList();
foreach (var item in readingCriterionPageIds)
{
var newPageQusetionList = qusetionList.Where(x => x.ReadingCriterionPageId == item).ToList();
var firstData = newPageQusetionList.FirstOrDefault();
var page = new GetTrialReadingQuestionOutDto()
{
PageName = firstData.PageName,
IsPage = true,
IsPublicPage = firstData.IsPublicPage,
};
var pageGroupList = newPageQusetionList.Where(x => x.Type == "group" || (x.ParentId == null && x.GroupName.IsNullOrEmpty())).ToList();
pageGroupList.ForEach(x =>
{
this.FindChildQuestion(x, newPageQusetionList);
});
page.Childrens = pageGroupList.Where(x => !(x.Type == "group" && x.Childrens.Count() == 0)).ToList();
groupList.Add(page);
}
result.PublicPage = groupList.Where(x => x.IsPublicPage.Value).ToList();
result.MultiPage = groupList.Where(x => !x.IsPublicPage.Value).ToList();
}
else
{
qusetionList = qusetionList.Where(x => x.ReadingCriterionPageId == null).ToList();
groupList = qusetionList.Where(x => x.Type == "group" || (x.ParentId == null && x.GroupName.IsNullOrEmpty())).ToList();
groupList.ForEach(x =>
{
this.FindChildQuestion(x, qusetionList);
});
groupList = groupList.Where(x => !(x.Type == "group" && x.Childrens.Count() == 0)).ToList();
result.SinglePage = groupList;
}
//List groupList = qusetionList.Where(x => x.ParentId == null).ToList();
//groupList.ForEach(x =>
//{
// this.FindChildQuestion(x, qusetionList);
//});
return (result, new
{
readingTaskState = readingTaskState,
FormType = formType
}); ;
}
#endregion
#region 获取系统的阅片问题
///
/// 获取系统的阅片问题
///
///
///
[HttpPost]
public async Task GetSystemReadingQuestion(GetSystemReadingQuestionInDto inDto)
{
var result = new GetTrialReadingQuestionPageDto();
var query = from data in _readingQuestionSystem.Where(x => x.ReadingQuestionCriterionSystemId == inDto.Id)
select new GetTrialReadingQuestionOutDto()
{
ReadingQuestionTrialId = data.Id,
ParentTriggerValue = data.ParentTriggerValue,
GroupName = data.GroupName,
QuestionName = data.QuestionName,
IsRequired = data.IsRequired,
ShowOrder = data.ShowOrder,
ParentId = data.ParentId,
TypeValue = data.TypeValue,
Answer = string.Empty,
ShowQuestion=data.ShowQuestion,
PageShowOrder = data.ShowOrder,
Type=data.Type,
};
var qusetionList = await query.OrderBy(x => x.ShowOrder).ToListAsync();
var groupList = new List();
qusetionList = qusetionList.Where(x => x.ReadingCriterionPageId == null).ToList();
groupList = qusetionList.Where(x => x.Type == "group" || (x.ParentId == null && x.GroupName.IsNullOrEmpty())).ToList();
groupList.ForEach(x =>
{
this.FindChildQuestion(x, qusetionList);
});
groupList = groupList.Where(x => !(x.Type == "group" && x.Childrens.Count() == 0)).ToList();
result.SinglePage = groupList;
return (result);
}
#endregion
#region 获取阅片任务和答案
///
/// 获取阅片任务和答案
///
///
private async Task> GetTaskAndAnswer(Guid visitTaskId)
{
var taskQuery = from questionAnswer in _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == visitTaskId)
join trialQuestion in _readingQuestionTrialRepository.AsQueryable() on questionAnswer.ReadingQuestionTrialId equals trialQuestion.Id
select new GetTrialReadingQuestionOutDto()
{
ReadingQuestionTrialId = trialQuestion.Id,
ReadingQuestionCriterionTrialId = trialQuestion.ReadingQuestionCriterionTrialId,
TrialId = trialQuestion.TrialId,
Type = trialQuestion.Type,
ParentTriggerValue = trialQuestion.ParentTriggerValue,
GroupName = trialQuestion.GroupName,
QuestionName = trialQuestion.QuestionName,
IsRequired = trialQuestion.IsRequired,
ShowOrder = trialQuestion.ShowOrder,
ParentId = trialQuestion.ParentId,
TypeValue = trialQuestion.TypeValue,
Answer = questionAnswer.Answer
};
var qusetionList = await taskQuery.OrderBy(x => x.ShowOrder).ToListAsync();
List groupList = qusetionList.Where(x => x.ParentId == null).ToList();
groupList.ForEach(x =>
{
this.FindChildQuestion(x, qusetionList);
});
return groupList;
}
#endregion
///
/// 获取阅片的受试者信息
///
///
///
[HttpPost]
public async Task GetReadingSubjectInfo(GetReadingSubjectInfoInDto inDto)
{
var visitTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstOrDefaultAsync();
var subjectCode = await _subjectRepository.Where(x => x.Id == visitTask.SubjectId).Select(x => x.Code).FirstOrDefaultAsync();
var trialInfo = await _trialRepository.Where(x => x.Id == visitTask.TrialId).Select(x => new
{
x.IsReadingShowPreviousResults,
x.IsReadingShowSubjectInfo,
x.ClinicalInformationTransmissionEnum,
}).FirstOrDefaultAsync();
return new GetReadingSubjectInfoOutDto()
{
VisitTaskId = visitTask.Id,
SubjectId = visitTask.SubjectId,
SubjectCode = visitTask.BlindSubjectCode.IsNullOrEmpty() ? subjectCode : visitTask.BlindSubjectCode,
ReadingCategory = visitTask.ReadingCategory,
TaskBlindName = visitTask.TaskBlindName,
IsReadingShowPreviousResults = trialInfo.IsReadingShowPreviousResults,
IsReadingShowSubjectInfo = trialInfo.IsReadingShowSubjectInfo,
};
}
#region 获取裁判阅片任务信息
///
/// 获取裁判阅片任务信息
///
///
[HttpPost]
public async Task GetJudgeReadingInfo(GetJudgeReadingInfo inDto)
{
var visitTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstOrDefaultAsync();
GetJudgeReadingInfoOutDto judgeInfo = new GetJudgeReadingInfoOutDto()
{
ReadingTaskState = visitTask.ReadingTaskState,
JudgeResultTaskId = visitTask.JudgeResultTaskId,
JudgeResultRemark = visitTask.JudgeResultRemark,
JudgeResultImagePath = visitTask.JudgeResultImagePath,
VisitInfoList = new List()
};
var judgeDataInfo = await _readingJudgeInfoRepository.Where(x => x.JudgeTaskId == inDto.VisitTaskId).FirstNotNullAsync();
var taskids = new List();
taskids.Add(judgeDataInfo.TaskIdOne);
taskids.Add(judgeDataInfo.TaskIdTwo);
var taskList = await _visitTaskRepository.Where(x => taskids.Contains(x.Id)).OrderBy(x=>x.ArmEnum).ToListAsync();
judgeInfo.VisitTaskArmList = taskList.Select(x => new VisitTaskArm()
{
ArmEnum = x.ArmEnum,
VisitTaskId = x.Id
}).ToList();
var visitIds = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).Select(x => new
{
x.Id,
x.ArmEnum,
}).ToListAsync();
switch (taskList[0].ReadingCategory)
{
case ReadingCategory.Visit:
JudgeReadingInfoDto judgeReadingInfoDto = new JudgeReadingInfoDto() {
VisitId = taskList[0].SourceSubjectVisitId.Value,
VisitName = taskList[0].TaskBlindName,
VisitTaskInfoList = new List(),
};
foreach (var item in taskList)
{
judgeReadingInfoDto.VisitTaskInfoList.Add(new JudgeReadingQuestion()
{
ArmEnum = item.ArmEnum,
VisitTaskId = item.Id,
JudgeQuestionList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == item.Id && x.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(x => x.ReadingQuestionTrial.ShowOrder)
.Select(x => new JudgeQuestion()
{
Answer = x.Answer,
QuestionId = x.ReadingQuestionTrial.Id,
QuestionName = x.ReadingQuestionTrial.QuestionName
}).ToListAsync(),
});
}
judgeInfo.VisitInfoList.Add(judgeReadingInfoDto);
break;
case ReadingCategory.Global:
var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto()
{
UsingOriginalData = true,
VisitTaskId = taskList[0].Id
});
var taskTwoInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto()
{
UsingOriginalData = true,
VisitTaskId = taskList[1].Id
});
foreach (var item in taskOneInfo.TaskList)
{
GlobalVisitInfo twoItem = taskTwoInfo.TaskList.Where(x => x.VisitId == item.VisitId).FirstOrDefault();
JudgeReadingInfoDto judgeReadingInfo = new JudgeReadingInfoDto()
{
VisitId = item.VisitId,
VisitName = item.VisitName,
VisitTaskInfoList = new List(),
};
var judgeReadingQuestion = new JudgeReadingQuestion()
{
ArmEnum = item.ArmEnum,
VisitTaskId = item.VisitTaskId,
GlobalVisitTaskId= taskList[0].Id,
JudgeQuestionList = item.AfterQuestionList.Where(x => x.QuestionId != null).Select(x => new JudgeQuestion()
{
Answer = x.Answer,
QuestionId = x.QuestionId.Value,
QuestionName = x.QuestionName
}).ToList()
};
// 加全局是否更新 和访视点注释
judgeReadingQuestion.JudgeQuestionList.Add( new JudgeQuestion() {
Answer= item.AfterQuestionList.Any(x=>x.IsHaveChange),
QuestionType= JudgeReadingQuestionType.GlobalChange,
});
judgeReadingQuestion.JudgeQuestionList.Add(new JudgeQuestion()
{
Answer = item.AfterQuestionList.Where(x => x.QuestionId==null).Select(x=>x.Answer).FirstOrDefault(),
QuestionType = JudgeReadingQuestionType.VisitRemark,
});
judgeReadingInfo.VisitTaskInfoList.Add(judgeReadingQuestion);
if (twoItem != null)
{
var rTwoJudge = new JudgeReadingQuestion()
{
ArmEnum = twoItem.ArmEnum,
VisitTaskId = twoItem.VisitTaskId,
GlobalVisitTaskId = taskList[1].Id,
JudgeQuestionList = twoItem.AfterQuestionList.Where(x => x.QuestionId != null).Select(x => new JudgeQuestion()
{
Answer = x.Answer,
QuestionId = x.QuestionId.Value,
QuestionName = x.QuestionName
}).ToList()
};
// 加全局是否更新 和访视点注释
rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion()
{
Answer = twoItem.AfterQuestionList.Any(x => x.IsHaveChange),
QuestionType = JudgeReadingQuestionType.GlobalChange,
});
rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion()
{
Answer = twoItem.AfterQuestionList.Where(x => x.QuestionId == null).Select(x => x.Answer).FirstOrDefault(),
QuestionType = JudgeReadingQuestionType.VisitRemark,
});
judgeReadingInfo.VisitTaskInfoList.Add(rTwoJudge);
}
judgeInfo.VisitInfoList.Add(judgeReadingInfo);
}
break;
}
return judgeInfo;
}
#endregion
#region 保存裁判问题
///
/// 保存裁判问题
///
///
///
[HttpPost]
public async Task SaveJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto)
{
await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.VisitTaskId, x => new VisitTask()
{
JudgeResultTaskId = inDto.JudgeResultTaskId,
JudgeResultRemark = inDto.JudgeResultRemark,
JudgeResultImagePath = inDto.JudgeResultImagePath,
});
var result = await _visitTaskRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
#endregion
#region 获取既往结果
///
/// 获取既往结果
///
///
[HttpPost]
public async Task> GetReadingPastResultList(GetReadingPastResultListInDto inDto)
{
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
var readingPastResultList = await _visitTaskRepository.Where(x =>
x.TrialId == taskInfo.TrialId &&
x.SubjectId == taskInfo.SubjectId &&
x.ArmEnum== taskInfo.ArmEnum &&
x.Id != inDto.VisitTaskId &&
x.DoctorUserId == taskInfo.DoctorUserId &&
x.ReadingTaskState == ReadingTaskState.HaveSigned&&
x.TaskState==TaskState.Effect&&
x.IsAnalysisCreate == taskInfo.IsAnalysisCreate)
.WhereIf(taskInfo.ReadingCategory!=ReadingCategory.Visit,x=>x.ReadingCategory==taskInfo.ReadingCategory)
.ProjectTo(_mapper.ConfigurationProvider).OrderBy(x=>x.VisitTaskNum).ToListAsync();
return readingPastResultList;
}
#endregion
#region 找子问题
///
/// 找子问题
///
///
///
[NonDynamicMethod]
public void FindChildQuestion(GetTrialReadingQuestionOutDto trialReadingQuestion, List questionlists)
{
trialReadingQuestion.Childrens = questionlists.Where(x => x.ParentId == trialReadingQuestion.ReadingQuestionTrialId || (trialReadingQuestion.Type == "group" && x.Type != "group" && x.ParentId == null && x.GroupName == trialReadingQuestion.GroupName)).ToList();
if (trialReadingQuestion.Childrens != null && trialReadingQuestion.Childrens.Count != 0)
{
trialReadingQuestion.Childrens.ForEach(x =>
{
this.FindChildQuestion(x, questionlists);
});
}
}
#endregion
#region 保存任务问题
///
/// 保存任务问题
///
///
///
[HttpPost]
public async Task SaveVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto)
{
var subjectId = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.SubjectId).FirstOrDefaultAsync();
await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.ReadingQuestionCriterionTrialId == inDto.ReadingQuestionCriterionTrialId);
List readingTaskAnswerList = inDto.AnswerList.Select(x => new ReadingTaskQuestionAnswer()
{
Id = NewId.NextGuid(),
SubjectId = subjectId,
Answer = x.Answer,
ReadingQuestionCriterionTrialId = inDto.ReadingQuestionCriterionTrialId,
ReadingQuestionTrialId = x.ReadingQuestionTrialId,
VisitTaskId = inDto.VisitTaskId,
TrialId = inDto.TrialId
}).ToList();
await _visitTaskRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
{
ReadingTaskState = ReadingTaskState.Reading,
});
await _readingTaskQuestionAnswerRepository.AddRangeAsync(readingTaskAnswerList);
var result = await _visitTaskRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
#endregion
#region 提交问题
///
/// 提交访视阅片问题
///
///
///
[NonDynamicMethod]
public async Task SubmitVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto)
{
await this.SaveVisitTaskQuestions(inDto);
await this.SubmitTaskChangeState(inDto.VisitTaskId);
return ResponseOutput.Ok(true);
}
///
/// 提交裁判问题
///
///
///
[NonDynamicMethod]
public async Task SubmitJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto)
{
await _visitTaskRepository.UpdatePartialFromQueryAsync(inDto.VisitTaskId, x => new VisitTask()
{
JudgeResultTaskId = inDto.JudgeResultTaskId,
ReadingTaskState = ReadingTaskState.HaveSigned,
JudgeResultRemark = inDto.JudgeResultRemark,
SignTime = DateTime.Now,
JudgeResultImagePath = inDto.JudgeResultImagePath,
});
// 需要判断是否添加肿瘤学任务
var taskInfo = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).FirstNotNullAsync();
if (taskInfo.ReadingCategory == ReadingCategory.Global)
{
if (taskInfo.SouceReadModuleId == null)
{
throw new BusinessValidationFailedException($"当前裁判的全局任务的SouceId为null");
}
var visitId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync();
var oncologModuleId = await _readModuleRepository.Where(x => x.SubjectVisitId == visitId && x.ModuleType == ModuleTypeEnum.Oncology).Select(x => x.Id).FirstOrDefaultAsync();
await AddOncologyTask(oncologModuleId);
}
var result = await _visitTaskRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
///
/// 提交肿瘤阅片结果
///
///
///
[NonDynamicMethod]
public async Task SubmitOncologyReadingInfo(SubmitOncologyReadingInfoInDto inDto)
{
//var result = await this.SaveGlobalReadingInfo(inDto);
await FinishReadUpdateState(inDto.OncologyTaskId);
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.OncologyTaskId, x => new VisitTask()
{
ReadingTaskState = ReadingTaskState.HaveSigned,
SignTime = DateTime.Now,
});
await _visitTaskRepository.SaveChangesAsync();
return ResponseOutput.Ok(true);
}
///
/// 提交全局阅片结果
///
///
///
[NonDynamicMethod]
public async Task SubmitGlobalReadingInfo(SubmitGlobalReadingInfoInDto inDto)
{
//var result = await this.SaveGlobalReadingInfo(inDto);
await this.SubmitTaskChangeState(inDto.GlobalTaskId);
return ResponseOutput.Ok(true) ;
}
///
/// 签名提交任务修改状态
///
///
///
private async Task SubmitTaskChangeState(Guid visitTaskId)
{
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == visitTaskId, x => new VisitTask()
{
ReadingTaskState = ReadingTaskState.HaveSigned,
SignTime = DateTime.Now,
});
// 触裁判任务
await this.TriggerJudgeQuestion(visitTaskId);
// 添加阅片期任务
await this.AddReadingTask(visitTaskId);
// 完成阅片修改状态
await this.FinishReadUpdateState(visitTaskId);
}
#endregion
///
/// 完成阅片修改状态
///
///
private async Task FinishReadUpdateState(Guid visitTaskId)
{
var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
if (!await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId && x.SouceReadModuleId == taskInfo.SouceReadModuleId && x.ReadingTaskState != ReadingTaskState.HaveSigned))
{
if (taskInfo.SouceReadModuleId != null)
{
await _readModuleRepository.UpdatePartialFromQueryAsync(taskInfo.SouceReadModuleId.Value, x => new ReadModule
{
ReadingStatus = ReadingStatusEnum.ReadCompleted
});
}
else if (taskInfo.SourceSubjectVisitId != null)
{
await _subjectVisitRepository.UpdatePartialFromQueryAsync(taskInfo.SourceSubjectVisitId.Value, x => new SubjectVisit
{
ReadingStatus = ReadingStatusEnum.ReadCompleted
});
}
await _subjectVisitRepository.SaveChangesAsync();
}
}
///
/// 添加阅片期任务
///
///
private async Task AddReadingTask(Guid visitTaskId)
{
// ****** 先生成阅片期 阅片期任务阅片完成之后生成肿瘤学的 如果没有阅片期 直接生成肿瘤学 *********////
#region 建立关系
// 访视阅完产生 全局
Dictionary typeChangeDic = new Dictionary();
typeChangeDic.Add(ModuleTypeEnum.InPlanSubjectVisit, ReadingCategory.Visit);
typeChangeDic.Add(ModuleTypeEnum.OutPlanSubjectVisit, ReadingCategory.Visit);
//typeChange.Add(ModuleTypeEnum.Read, ReadingCategory.ReadingPeriod);
typeChangeDic.Add(ModuleTypeEnum.Global, ReadingCategory.Global);
typeChangeDic.Add(ModuleTypeEnum.Referee, ReadingCategory.Judge);
typeChangeDic.Add(ModuleTypeEnum.Oncology, ReadingCategory.Oncology);
#endregion
var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
List needReadList = new List();
if (!taskInfo.IsAnalysisCreate)
{
// 任务类型
switch (taskInfo.ReadingCategory)
{
case ReadingCategory.Visit:
needReadList = await _readModuleRepository.Where(x => x.SubjectVisitId == taskInfo.SourceSubjectVisitId&&x.ReadingSetType==ReadingSetType.ImageReading)
.Select(x => new ReadingGenerataTaskDTO
{
IsUrgent = x.IsUrgent ?? false,
SubjectId = x.SubjectId,
VisitNum=x.VisitNum,
ReadingName = x.ModuleName,
ReadModuleId = x.Id,
ReadingCategory = typeChangeDic[x.ModuleType],
}).ToListAsync();
if (needReadList.Any(x => x.ReadingCategory == ReadingCategory.Global))
{
needReadList = needReadList.Where(x => x.ReadingCategory != ReadingCategory.Oncology).ToList();
}
//needReadList = needReadList.Where(x => _visitTaskRepository.Where(y => y.SouceReadModuleId == x.ReadModuleId).Count() == 0).ToList();
await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
{
OriginalVisitId= visitTaskId,
ReadingCategory = GenerateTaskCategory.Global,
TrialId = taskInfo.TrialId,
ReadingGenerataTaskList = needReadList
}) ;
break;
// 肿瘤学
case ReadingCategory.Global:
var subjectVisitId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync();
var oncologyReadId= await _readModuleRepository.Where(x => x.SubjectVisitId == subjectVisitId && x.ModuleType == ModuleTypeEnum.Oncology).Select(x => x.Id).FirstOrDefaultAsync();
await AddOncologyTask(oncologyReadId);
break;
}
}
}
///
/// 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑
///
///
[NonDynamicMethod]
public async Task AddOncologyTask(Guid oncologModuleId)
{
// 判断是否读片完成
var finishReading = false;
var readModuleInfo = await _readModuleRepository.Where(x => x.Id == oncologModuleId && x.ModuleType == ModuleTypeEnum.Oncology).FirstOrDefaultAsync();
// 如果当前是肿瘤学
if (readModuleInfo != null)
{
// 先找到对应的全局阅片模块Id
var globalreadModuleId = await _readModuleRepository.Where(x => x.SubjectVisitId == readModuleInfo.SubjectVisitId && x.ModuleType == ModuleTypeEnum.Global).Select(x => x.Id).FirstOrDefaultAsync();
// 找到一个全局阅片任务是否有裁判任务
var judgeVisitTaskId = await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalreadModuleId && x.TaskState == TaskState.Effect && x.ReadingCategory == ReadingCategory.Global
&& x.ReadingTaskState == ReadingTaskState.HaveSigned).Select(x => x.JudgeVisitTaskId).FirstOrDefaultAsync();
// 获取系统配置
var readingType = await _trialRepository.Where(x => x.Id == readModuleInfo.TrialId).Select(x => x.ReadingType).FirstOrDefaultAsync();
// 判断阅片是否完成
if (judgeVisitTaskId == null && (await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalreadModuleId && x.TaskState == TaskState.Effect && x.ReadingCategory == ReadingCategory.Global
&& x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate
).CountAsync() == (int)readingType))
{
finishReading = true;
}
else if(judgeVisitTaskId!=null&& (await _visitTaskRepository.AnyAsync(x=>x.Id== judgeVisitTaskId.Value&&x.ReadingTaskState== ReadingTaskState.HaveSigned)))
{
finishReading = true;
}
if (finishReading)
{
// 获取临床数据
var clinicalData = await _readingClinicalDataService.GetReadingClinicalList(new GetReadingClinicalDataListIndto()
{
SubjectId = readModuleInfo.SubjectId,
ReadingId = readModuleInfo.Id,
TrialId = readModuleInfo.TrialId,
});
// 判断是否临床数据都已经签名
if (!clinicalData.Any(x => !x.IsSign))
{
List needReadList = new List();
needReadList.Add(new ReadingGenerataTaskDTO()
{
IsUrgent = readModuleInfo.IsUrgent ?? false,
SubjectId = readModuleInfo.SubjectId,
ReadingName = readModuleInfo.ModuleName,
VisitNum = readModuleInfo.VisitNum,
ReadModuleId = readModuleInfo.Id,
ReadingCategory = ReadingCategory.Oncology,
});
await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
{
ReadingCategory = GenerateTaskCategory.Oncology,
TrialId = readModuleInfo.TrialId,
ReadingGenerataTaskList = needReadList
});
}
}
}
}
///
/// 触发裁判任务(新)
///
///
///
private async Task TriggerJudgeQuestion(Guid visitTaskId)
{
List visitTaskids = new List();
var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).AsNoTracking().FirstNotNullAsync();
// 判断是否是一致性核查产生
if (visitTask.IsAnalysisCreate)
{
visitTaskids=await _visitTaskRepository.Where(x=>x.ArmEnum== visitTask.ArmEnum&&x.TaskState==TaskState.Effect&&x.SourceSubjectVisitId== visitTask.SourceSubjectVisitId
&&x.SouceReadModuleId==visitTask.SouceReadModuleId && x.ReadingCategory != ReadingCategory.Judge && x.ReadingTaskState == ReadingTaskState.HaveSigned).Select(x => x.Id).ToListAsync();
}
else
{
// 这里是非一致性分析产生的
visitTaskids = await _visitTaskRepository.Where(x => x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory != ReadingCategory.Judge
&& x.TaskState== TaskState.Effect
&& x.IsAnalysisCreate==false
&& x.SourceSubjectVisitId == visitTask.SourceSubjectVisitId && x.SouceReadModuleId == visitTask.SouceReadModuleId).Select(x => x.Id).ToListAsync();
}
var trialInfo = await _trialRepository.Where(x => x.Id == visitTask.TrialId).Select(x=> new {
x.IsArbitrationReading,
x.ArbitrationRule
}).FirstNotNullAsync();
var noteEqual = false;
// 判断项目是否设置了裁判
if (trialInfo.IsArbitrationReading ?? false)
{
// 判断数量是否为2 是否仲裁
if (visitTaskids.Count == 2)
{
switch (visitTask.ReadingCategory)
{
// 访视
case ReadingCategory.Visit:
// 查找两个 访视的阅片答案
var query = from questionAnswet in _readingTaskQuestionAnswerRepository.Where(x => visitTaskids.Contains(x.VisitTaskId))
join question in _readingQuestionTrialRepository.Where(x => x.IsJudgeQuestion) on new { ReadingQuestionTrialId = questionAnswet.ReadingQuestionTrialId } equals new { ReadingQuestionTrialId = question.Id }
select new TaskAnswerDto()
{
Answer = questionAnswet.Answer,
AnswerGroup = question.AnswerGroup,
AnswerCombination = question.AnswerCombination,
JudgeType = question.JudgeType,
QuestionId = question.Id,
VisitTaskId = questionAnswet.VisitTaskId,
};
var questionAnswerlist = await query.ToListAsync();
// 将答案进行分组
List groupTasks = questionAnswerlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup, x.JudgeType, x.AnswerCombination }).Select(x => new GroupTaskAnswerDto
{
QuestionId = x.Key.QuestionId,
AnswerGroup = x.Key.AnswerGroup,
AnswerCombination = x.Key.AnswerCombination,
JudgeType = x.Key.JudgeType,
TaskAnswerList = x.Select(y => y.Answer).ToList(),
}).ToList();
noteEqual = ComputeJudgeResult(groupTasks);
break;
case ReadingCategory.Global:
var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto()
{
UsingOriginalData = true,
VisitTaskId = visitTaskids[0]
});
var taskTwoInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto()
{
UsingOriginalData = true,
VisitTaskId = visitTaskids[1]
});
// 判断两个任务是否
if (taskOneInfo.TaskList.Count() != taskTwoInfo.TaskList.Count())
{
noteEqual = true;
}
else
{
foreach (var item in taskOneInfo.TaskList)
{
GlobalVisitInfo twoItem = taskTwoInfo.TaskList.Where(x => x.VisitId == item.VisitId).FirstOrDefault();
if (twoItem == null)
{
noteEqual = true;
break;
}
else
{
var newlist = item.AfterQuestionList.Where(x => x.QuestionId != null).ToList().Union(
twoItem.AfterQuestionList.Where(x => x.QuestionId != null).ToList()
).ToList();
List globalGroupTasks = newlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup, x.JudgeType, x.AnswerCombination }).Select(x => new GroupTaskAnswerDto
{
QuestionId = x.Key.QuestionId.Value,
AnswerGroup = x.Key.AnswerGroup,
AnswerCombination = x.Key.AnswerCombination,
JudgeType = x.Key.JudgeType,
TaskAnswerList = x.Select(y => y.Answer).ToList(),
}).ToList();
noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks);
}
}
}
break;
}
}
else
{
// 这里判断一致性分析产生的全局阅片
if (visitTask.ReadingCategory == ReadingCategory.Global && visitTask.IsAnalysisCreate&&(visitTask.IsSelfAnalysis??false))
{
var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto()
{
UsingOriginalData = true,
VisitTaskId = visitTask.Id
});
// 找到最后一个任务ID
var lastTask = taskOneInfo.TaskList.Last();
if (lastTask == null)
{
noteEqual = true;
}
else {
var query = from questionAnswet in _readingTaskQuestionAnswerRepository.Where(x =>
x.VisitTask.IsAnalysisCreate==false&&
x.VisitTask.DoctorUserId==visitTask.DoctorUserId&&
x.VisitTask.TaskState== TaskState.Effect&&
(x.VisitTask.SourceSubjectVisitId??default(Guid))== lastTask.VisitId)
join question in _readingQuestionTrialRepository.Where(x => x.IsJudgeQuestion) on new { ReadingQuestionTrialId = questionAnswet.ReadingQuestionTrialId } equals new { ReadingQuestionTrialId = question.Id }
select new GlobalQuestionInfo()
{
Answer = questionAnswet.Answer,
AnswerGroup = question.AnswerGroup,
AnswerCombination = question.AnswerCombination,
JudgeType = question.JudgeType,
QuestionId = question.Id,
};
var visitTaskQuestions =await query.ToListAsync();
var newlist = visitTaskQuestions.Where(x => x.QuestionId != null).ToList().Union(
lastTask.AfterQuestionList.Where(x => x.QuestionId != null).ToList()
).ToList();
List globalGroupTasks = newlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup, x.JudgeType, x.AnswerCombination }).Select(x => new GroupTaskAnswerDto
{
QuestionId = x.Key.QuestionId.Value,
AnswerGroup = x.Key.AnswerGroup,
AnswerCombination = x.Key.AnswerCombination,
JudgeType = x.Key.JudgeType,
TaskAnswerList = x.Select(y => y.Answer).ToList(),
}).ToList();
noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks);
}
}
}
}
if (noteEqual)
{
if (visitTask.IsAnalysisCreate)
{
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == visitTaskId, x => new VisitTask()
{
IsAnalysisDiffToOriginalData = true
});
await _visitTaskRepository.SaveChangesAsync();
}
else
{
if ((visitTask.SourceSubjectVisitId != null && trialInfo.ArbitrationRule == ArbitrationRule.Visit) || (visitTask.SouceReadModuleId != null && trialInfo.ArbitrationRule == ArbitrationRule.Reading))
{
await this.SaveJudgeTask(new SaveJudgeTaskDto()
{
VisitTaskIds = visitTaskids,
});
}
}
}
else
{
if (visitTask.IsAnalysisCreate)
{
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == visitTaskId, x => new VisitTask()
{
IsAnalysisDiffToOriginalData = false
});
await _visitTaskRepository.SaveChangesAsync();
}
}
}
///
/// 计算返回的结果 为True表示不相等
///
///
///
private bool ComputeJudgeResult(List groupTasks)
{
var noteEqual = false;
foreach (var item in groupTasks)
{
if (item.TaskAnswerList.Count() != 2)
{
noteEqual = true;
break;
}
else
{
var taskAnswer1 = item.TaskAnswerList[0];
var taskAnswer2 = item.TaskAnswerList[1];
if (taskAnswer1 != taskAnswer2)
{
switch (item.JudgeType)
{
case JudgeTypeEnum.AnswerDisaffinity:
noteEqual = true;
break;
case JudgeTypeEnum.AnswerGroup:
var answerGroupList = JsonConvert.DeserializeObject>(item.AnswerGroup).Select(x => new AnswerGroup()
{
GroupId = NewId.NextGuid(),
GroupValue = x
}).ToList();
var itemAnswerGroupsitem1 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer1}|"));
var itemAnswerGroupsitem2 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer2}|"));
var unionList = itemAnswerGroupsitem1.Intersect(itemAnswerGroupsitem2).ToList();
if (unionList.Count < 1)
{
noteEqual = true;
}
break;
case JudgeTypeEnum.AnswerCombination:
var answerCombinationList = JsonConvert.DeserializeObject>(item.AnswerCombination == string.Empty ? "[]" : item.AnswerCombination).ToList();
answerCombinationList.ForEach(x =>
{
if (x.AnswerGroupA.Contains(taskAnswer1) && x.AnswerGroupB.Contains(taskAnswer2))
{
noteEqual = true;
}
if (x.AnswerGroupB.Contains(taskAnswer1) && x.AnswerGroupA.Contains(taskAnswer2))
{
noteEqual = true;
}
});
break;
}
}
}
}
return noteEqual;
}
///
/// 添加裁判任务
///
///
private async Task SaveJudgeTask(SaveJudgeTaskDto inDto)
{
var trialId = await _visitTaskRepository.Where(x => inDto.VisitTaskIds.Contains(x.Id)).Select(x => x.TrialId).FirstOrDefaultAsync();
await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
{
JudgeVisitTaskIdList= inDto.VisitTaskIds,
ReadingCategory= GenerateTaskCategory.Judge,
TrialId= trialId
});
}
}
}