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; namespace IRaCIS.Application.Services { /// /// IR影像阅片 /// [ApiExplorerSettings(GroupName = "Reading")] public class ReadingImageTaskService : BaseService, IReadingImageTaskService { private readonly IMapper mapper; private readonly IRepository _noneDicomStudyRepository; private readonly IRepository _visitTaskRepository; private readonly IRepository _subjectVisitRepository; private readonly IRepository _readingTaskQuestionAnswerRepository; private readonly IRepository _readingQuestionCriterionTrialRepository; private readonly IRepository _readingQuestionTrialRepository; public ReadingImageTaskService( IMapper mapper, IRepository noneDicomStudyRepository, IRepository visitTaskRepository, IRepository subjectVisitRepository, IRepository readingTaskQuestionAnswerRepository, IRepository readingQuestionCriterionTrialRepository, IRepository readingQuestionTrialRepository ) { this.mapper = mapper; this._noneDicomStudyRepository = noneDicomStudyRepository; this._visitTaskRepository = visitTaskRepository; this._subjectVisitRepository = subjectVisitRepository; this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; this._readingQuestionTrialRepository = readingQuestionTrialRepository; } /// /// 获取下一个阅片任务 /// /// /// /// private async Task GetNextTaskId(Guid? subjectId,Guid trialId) { GetReadingTaskDto? task = new GetReadingTaskDto(); if (subjectId != null) { task = await _visitTaskRepository.Where(x => x.TrialId == trialId && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.SubjectId == subjectId.Value).Select(x => new GetReadingTaskDto() { VisistTaskId=x.Id, ReadingCategory = x.ReadingCategory, VisistId = x.ReadingCategory == ReadingCategory.Visit ? x.SourceSubjectVisitId.Value : x.ReadModule.SubjectVisitId, VisitNum = x.ReadingCategory == ReadingCategory.Visit ? x.SubjectVisit.VisitNum : x.ReadModule.VisitNum }).OrderBy(x => x.VisitNum).ThenBy(x => x.ReadingCategory).FirstOrDefaultAsync(); task.SubjectId = subjectId.Value; } else { task = await _visitTaskRepository.Where(x => x.TrialId == trialId && x.ReadingTaskState != ReadingTaskState.HaveSigned).Select(x => new GetReadingTaskDto() { VisistTaskId = x.Id, ReadingCategory = x.ReadingCategory, VisistId = x.ReadingCategory == ReadingCategory.Visit ? x.SourceSubjectVisitId.Value : x.ReadModule.SubjectVisitId, VisitNum = x.ReadingCategory == ReadingCategory.Visit ? x.SubjectVisit.VisitNum : x.ReadModule.VisitNum }).FirstOrDefaultAsync(); task.SubjectId = await _subjectVisitRepository.Where(x => x.Id == task.VisistId).Select(x => x.SubjectId).FirstOrDefaultAsync(); } return task; } /// /// 获取阅片非Dicom文件 /// /// /// [HttpPost] public async Task<(List,object)> GetReadingImageFile(GetReadingImgInDto inDto) { var task=await GetNextTaskId(inDto.SubjectId, inDto.TrialId); 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(); return (result, new { VisitTaskId= task.VisistTaskId }); } /// /// 获取项目已确认的标准 /// /// /// [HttpPost] public async Task> 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; } /// /// 获取项目的阅片问题 /// /// /// [HttpPost] public async Task> GetTrialReadingQuestion(GetTrialReadingQuestionInDto inDto) { var qusetionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.ReadingQuestionCriterionTrialId).OrderBy(x=>x.ShowOrder).ToListAsync(); List groupList = _mapper.Map>(qusetionList.Where(x => x.ParentId == null)); groupList.ForEach(x => { FindChildQuestion(x, qusetionList); }); return groupList; } /// /// 找子问题 /// /// /// private void FindChildQuestion(GetTrialReadingQuestionOutDto trialReadingQuestion, List questionlists) { trialReadingQuestion.Childrens = _mapper.Map>(questionlists.Where(x => x.ParentId == trialReadingQuestion.ReadingQuestionTrialId)); if (trialReadingQuestion.Childrens != null && trialReadingQuestion.Childrens.Count != 0) { trialReadingQuestion.Childrens.ForEach(x => { FindChildQuestion(x, questionlists); }); } } /// /// 提交问题 /// /// /// [NonDynamicMethod] public async Task SubmitVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto) { var subjectId =await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.SubjectId).FirstOrDefaultAsync(); 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 _readingTaskQuestionAnswerRepository.AddRangeAsync(readingTaskAnswerList); await _visitTaskRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask() { ReadingTaskState = ReadingTaskState.HaveSigned }); var result = await _visitTaskRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } } }