irc-netcore-api/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs

907 lines
44 KiB
C#

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
{
/// <summary>
/// IR影像阅片
/// </summary>
[ApiExplorerSettings(GroupName = "Reading")]
public class ReadingImageTaskService : BaseService, IReadingImageTaskService
{
private readonly IRepository<NoneDicomStudy> _noneDicomStudyRepository;
private readonly IRepository<VisitTask> _visitTaskRepository;
private readonly IRepository<Trial> _trialRepository;
private readonly IVisitTaskHelpeService _visitTaskHelpeService;
private readonly IReadingClinicalDataService _readingClinicalDataService;
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<ReadingCriterionPage> _readingCriterionPageRepository;
private readonly IRepository<ReadingJudgeInfo> _readingJudgeInfoRepository;
private readonly IRepository<ReadModule> _readModuleRepository;
private readonly IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswerRepository;
private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository;
private readonly IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository;
public ReadingImageTaskService(
IMapper mapper,
IRepository<NoneDicomStudy> noneDicomStudyRepository,
IRepository<VisitTask> visitTaskRepository,
IRepository<Trial> TrialRepository,
IVisitTaskHelpeService visitTaskHelpeService,
IReadingClinicalDataService readingClinicalDataService,
IRepository<SubjectVisit> subjectVisitRepository,
IRepository<Subject> subjectRepository,
IRepository<ReadingCriterionPage> readingCriterionPageRepository,
IRepository<ReadingJudgeInfo> readingJudgeInfoRepository,
IRepository<ReadModule> readModuleRepository,
IRepository<ReadingTaskQuestionAnswer> readingTaskQuestionAnswerRepository,
IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository,
IRepository<ReadingQuestionTrial> readingQuestionTrialRepository
)
{
base._mapper = mapper;
this._noneDicomStudyRepository = noneDicomStudyRepository;
this._visitTaskRepository = visitTaskRepository;
this._trialRepository = TrialRepository;
this._visitTaskHelpeService = visitTaskHelpeService;
this._readingClinicalDataService = readingClinicalDataService;
this._subjectVisitRepository = subjectVisitRepository;
this._subjectRepository = subjectRepository;
this._readingCriterionPageRepository = readingCriterionPageRepository;
this._readingJudgeInfoRepository = readingJudgeInfoRepository;
this._readModuleRepository = readModuleRepository;
this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository;
this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
this._readingQuestionTrialRepository = readingQuestionTrialRepository;
}
/// <summary>
/// 获取下一个阅片任务
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<GetReadingTaskDto> 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 : x.ReadModule.SubjectVisitId,
VisitNum = x.SourceSubjectVisitId != null ? x.SourceSubjectVisit.VisitNum : x.ReadModule.VisitNum,
}).FirstOrDefaultAsync();
}
else if (inDto.SubjectId != null)
{
var subjectList =await _subjectRepository.Where(t => t.TrialId == inDto.TrialId)
.Where(t => t.SubjectDoctorList.Any(t => t.DoctorUserId == _userInfo.Id))
.Select(s => new SubjectTask()
{
SubjectId = s.Id,
UnReadTaskCount = s.SubjectVisitTaskList.Count(t => t.ReadingTaskState != ReadingTaskState.HaveSigned && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect),
}).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).Select(x => new GetReadingTaskDto()
{
VisitTaskId = x.Id,
TaskBlindName=x.TaskBlindName,
ReadingCategory = x.ReadingCategory,
VisistId = x.SourceSubjectVisitId != null ? x.SourceSubjectVisitId.Value : x.ReadModule.SubjectVisitId,
VisitNum = x.SourceSubjectVisitId != null ? x.SourceSubjectVisit.VisitNum : x.ReadModule.VisitNum,
}).OrderBy(x => x.VisitNum).ThenBy(x => x.ReadingCategory);
task =await taskquery.FirstOrDefaultAsync();
if (task == null)
{
throw new BusinessValidationFailedException("任务都已经完成");
}
task.SubjectId = inDto.SubjectId.Value;
}
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.SubjectVisitId,
VisitNum = x.SourceSubjectVisitId != null ? x.SourceSubjectVisit.VisitNum : x.ReadModule.VisitNum,
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();
return task;
}
/// <summary>
/// 获取阅片非Dicom文件
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<(List<NoneDicomStudyView>,object)> GetReadingImageFile(GetReadingImgInDto inDto)
{
var task=await GetNextTask( new GetNextTaskInDto() {
TrialId=inDto.TrialId,
SubjectId=inDto.SubjectId,
VisistTaskId=inDto.VisistTaskId,
});
List<Guid> visitIds = new List<Guid>();
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<NoneDicomStudyView> result=await _noneDicomStudyRepository.Where(t => visitIds.Contains(t.SubjectVisitId))
.ProjectTo<NoneDicomStudyView>(_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;
}
return (result, new {
VisitTaskId= task.VisitTaskId,
SubjectId=task.SubjectId,
SubjectCode=task.SubjectCode,
ReadingCategory= task.ReadingCategory,
TaskBlindName=task.TaskBlindName,
IsReadingShowPreviousResults = trialInfo.IsReadingShowPreviousResults,
IsReadingShowSubjectInfo=trialInfo.IsReadingShowSubjectInfo,
IsExistsClinicalData= isExistsClinicalData,
});
}
/// <summary>
/// 获取项目已确认的标准
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<GetTrialConfirmCriterionListOutDto>> GetTrialConfirmCriterionList(GetConfirmCriterionInDto inDto)
{
var result= await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId&&x.IsConfirm&&x.IsCompleteConfig)
.Select(x => new GetTrialConfirmCriterionListOutDto()
{
ReadingQuestionCriterionTrialId = x.Id,
ReadingQuestionCriterionTrialName = x.CriterionName
}).ToListAsync();
return result;
}
/// <summary>
/// 获取项目标准的裁判问题
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<(List<GetTrialCriterionJudgeQuestionListOutDto>,object)> GetTrialCriterionJudgeQuestionList(GetTrialCriterionJudgeQuestionListInDto inDto)
{
var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm).FirstOrDefaultAsync();
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<List<string>>(x.AnswerGroup.IsNullOrEmpty()?"[]": x.AnswerGroup),
AnswerCombination = JsonConvert.DeserializeObject<List<AnswerCombinationDto>>(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,
});
}
/// <summary>
/// 设置裁判问题的答案分组
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> 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);
}
/// <summary>
/// 获取项目的阅片问题
/// </summary>
/// <remarks>
/// SinglePage 单页
///
/// MultiPage 多页
///
/// PublicPage 公共
/// </remarks>
/// <param name="inDto"></param>
/// <returns></returns>
[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,
ShowOrder=data.ShowOrder,
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.OrderBy(x=>x.ShowOrder).ToListAsync();
var formType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.ReadingQuestionCriterionTrialId).Select(x => x.FormType).FirstOrDefaultAsync();
var groupList = new List<GetTrialReadingQuestionOutDto>();
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<GetTrialReadingQuestionOutDto> groupList = qusetionList.Where(x => x.ParentId == null).ToList();
//groupList.ForEach(x =>
//{
// this.FindChildQuestion(x, qusetionList);
//});
return (result, new
{
readingTaskState = readingTaskState,
FormType= formType
}); ;
}
/// <summary>
/// 获取阅片任务和答案
/// </summary>
/// <returns></returns>
private async Task<List<GetTrialReadingQuestionOutDto>> 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<GetTrialReadingQuestionOutDto> groupList = qusetionList.Where(x => x.ParentId == null).ToList();
groupList.ForEach(x =>
{
this.FindChildQuestion(x, qusetionList);
});
return groupList;
}
/// <summary>
/// 获取裁判阅片任务信息
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<GetJudgeReadingInfoOutDto> GetJudgeReadingInfo(GetJudgeReadingInfo inDto)
{
var visitTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => new
{
x.ReadingTaskState,
x.JudgeResultTaskId,
x.JudgeResultRemark,
x.JudgeResultImagePath,
}).FirstOrDefaultAsync();
GetJudgeReadingInfoOutDto judgeInfo = new GetJudgeReadingInfoOutDto()
{
ReadingTaskState = visitTask.ReadingTaskState,
JudgeResultTaskId = visitTask.JudgeResultTaskId,
JudgeResultRemark=visitTask.JudgeResultRemark,
JudgeResultImagePath= visitTask.JudgeResultImagePath,
VisitTaskInfoList = new List<JudgeReadingInfoDto>()
};
var visitIds = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).Select(x => new
{
x.Id,
x.ArmEnum,
}).ToListAsync();
foreach (var item in visitIds)
{
var taskReadingQuestionList = await this.GetTaskAndAnswer(item.Id);
judgeInfo.VisitTaskInfoList.Add(
new JudgeReadingInfoDto()
{
JudgeQuestionAnswerInfoList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == item.Id).Select(x => new JudgeQuestionAnswerInfo {
Answer = x.Answer,
QuestionName = x.ReadingQuestionTrial.QuestionName,
}).ToListAsync(),
VisitTaskId = item.Id,
ArmEnum = item.ArmEnum,
TaskReadingQuestionList = taskReadingQuestionList,
});
}
return judgeInfo;
}
/// <summary>
/// 保存裁判问题
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> 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);
}
/// <summary>
/// 提交裁判问题
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[NonDynamicMethod]
public async Task<IResponseOutput> 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 result = await _visitTaskRepository.SaveChangesAsync();
return ResponseOutput.Ok(result);
}
/// <summary>
/// 获取既往结果
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<List<GetReadingPastResultListOutDto>> GetReadingPastResultList(GetReadingPastResultListInDto inDto)
{
var readingPastResultList =await _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId&&x.SubjectId==inDto.SubjectId && x.DoctorUserId == _userInfo.Id
&&x.Id!=inDto.VisitTaskId&&x.ReadingTaskState== ReadingTaskState.HaveSigned).ProjectTo<GetReadingPastResultListOutDto>(_mapper.ConfigurationProvider).ToListAsync();
return readingPastResultList;
}
/// <summary>
/// 找子问题
/// </summary>
/// <param name="trialReadingQuestion"></param>
/// <param name="questionlists"></param>
[NonDynamicMethod]
public void FindChildQuestion(GetTrialReadingQuestionOutDto trialReadingQuestion, List<GetTrialReadingQuestionOutDto> 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);
});
}
}
/// <summary>
/// 保存任务问题
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> 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<ReadingTaskQuestionAnswer> 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);
}
/// <summary>
/// 提交问题
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[NonDynamicMethod]
public async Task<IResponseOutput> SubmitVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto)
{
await this.SaveVisitTaskQuestions(inDto);
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
{
ReadingTaskState = ReadingTaskState.HaveSigned,
SignTime=DateTime.Now,
});
var result = await _visitTaskRepository.SaveChangesAsync();
// 触裁判任务
await this.TriggerJudgeQuestion(inDto.VisitTaskId);
// 添加阅片期任务
await this.AddReadingTask(inDto.VisitTaskId);
// 完成阅片修改状态
await this.FinishReadUpdateState(inDto.VisitTaskId);
return ResponseOutput.Ok(result);
}
/// <summary>
/// 完成阅片修改状态
/// </summary>
/// <returns></returns>
private async Task FinishReadUpdateState(Guid visitTaskId)
{
var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstOrDefaultAsync();
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();
}
}
/// <summary>
/// 添加阅片期任务
/// </summary>
/// <returns></returns>
private async Task AddReadingTask(Guid visitTaskId)
{
// ****** 先生成阅片期 阅片期任务阅片完成之后生成肿瘤学的 如果没有阅片期 直接生成肿瘤学 *********////
#region 建立关系
Dictionary<ModuleTypeEnum, ReadingCategory> typeChangeDic = new Dictionary<ModuleTypeEnum, ReadingCategory>();
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<ReadingGenerataTaskDTO> needReadList = new List<ReadingGenerataTaskDTO>();
if ((!await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == taskInfo.SourceSubjectVisitId&&x.SouceReadModuleId== taskInfo.SouceReadModuleId && x.ReadingTaskState != ReadingTaskState.HaveSigned))
&&!taskInfo.IsAnalysisCreate
)
{
// 任务类型
switch (taskInfo.ReadingCategory)
{
case ReadingCategory.Visit:
needReadList = await _readModuleRepository.Where(x => x.SubjectVisitId == taskInfo.SourceSubjectVisitId)
.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()
{
ReadingCategory = GenerateTaskCategory.Global,
TrialId = taskInfo.TrialId,
ReadingGenerataTaskList = needReadList
}) ;
break;
// 肿瘤学
case ReadingCategory.Global:
var subjectId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync();
needReadList=await _readModuleRepository.Where(x => x.SubjectVisitId == subjectId&&x.ModuleType==ModuleTypeEnum.Oncology)
.Select(x => new ReadingGenerataTaskDTO
{
IsUrgent = x.IsUrgent ?? false,
SubjectId = x.SubjectId,
ReadingName = x.ModuleName,
VisitNum = x.VisitNum,
ReadModuleId = x.Id,
ReadingCategory = typeChangeDic[x.ModuleType],
}).ToListAsync();
needReadList = needReadList.Where(x => _visitTaskRepository.Where(y => y.SouceReadModuleId == x.ReadModuleId).Count() == 0).ToList();
await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
{
ReadingCategory = GenerateTaskCategory.Oncology,
TrialId = taskInfo.TrialId,
ReadingGenerataTaskList = needReadList
});
break;
}
}
}
/// <summary>
/// 触发裁判任务(新)
/// </summary>
/// <param name="visitTaskId"></param>
/// <returns></returns>
private async Task TriggerJudgeQuestion(Guid visitTaskId)
{
List<Guid> visitTaskids = new List<Guid>();
//x.ReReadingApplyState!=ReReadingApplyState.Agree 排除重阅的
var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).AsNoTracking().FirstNotNullAsync();
if (visitTask.IsAnalysisCreate&& visitTask.ConsistentAnalysisOriginalTaskId!=null)
{
visitTaskids.Add(visitTask.Id);
if (visitTask.ConsistentAnalysisOriginalTaskId != null)
{
visitTaskids.Add(visitTask.ConsistentAnalysisOriginalTaskId.Value);
}
// 这种情况是新产生的阅片期
if (visitTask.SouceReadModuleId != null)
{
var visitNum = await _readModuleRepository.Where(x => x.Id == visitTask.SouceReadModuleId).Select(x => x.VisitNum).FirstOrDefaultAsync();
var lastVisitId = await _visitTaskRepository.Where(x => !x.IsAnalysisCreate && x.SouceReadModuleId == visitTask.SouceReadModuleId && x.ReadModule.VisitNum <= visitNum).OrderByDescending(x => x.ReadModule.VisitNum).Select(x => x.Id).FirstOrDefaultAsync();
visitTaskids.Add(lastVisitId);
}
}
else
{
visitTaskids = await _visitTaskRepository.Where(x => x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory != ReadingCategory.Judge && x.ReReadingApplyState != ReReadingApplyState.Agree && 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();
if (visitTaskids.Count == 2&& (trialInfo.IsArbitrationReading??false))
{
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<GroupTaskAnswerDto> 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.ToList(),
}).ToList();
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.Answer != taskAnswer2.Answer)
{
switch (item.JudgeType)
{
case JudgeTypeEnum.AnswerDisaffinity:
noteEqual = true;
break;
case JudgeTypeEnum.AnswerGroup:
var answerGroupList = JsonConvert.DeserializeObject<List<string>>(item.AnswerGroup).Select(x => new AnswerGroup()
{
GroupId = NewId.NextGuid(),
GroupValue = x
}).ToList();
var itemAnswerGroupsitem1 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer1.Answer}|"));
var itemAnswerGroupsitem2 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer2.Answer}|"));
var unionList = itemAnswerGroupsitem1.Intersect(itemAnswerGroupsitem2).ToList();
if (unionList.Count < 1)
{
noteEqual =true;
}
break;
case JudgeTypeEnum.AnswerCombination:
var answerCombinationList = JsonConvert.DeserializeObject<List<AnswerCombinationDto>>(item.AnswerCombination == string.Empty ? "[]" : item.AnswerCombination).ToList();
answerCombinationList.ForEach(x =>
{
if (x.AnswerGroupA.Contains(taskAnswer1.Answer) && x.AnswerGroupB.Contains(taskAnswer2.Answer))
{
noteEqual = true;
}
if (x.AnswerGroupB.Contains(taskAnswer1.Answer) && x.AnswerGroupA.Contains(taskAnswer2.Answer))
{
noteEqual = true;
}
});
break;
}
}
}
}
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();
}
}
}
}
/// <summary>
/// 添加裁判任务
/// </summary>
/// <returns></returns>
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
});
}
}
}