295 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			295 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
using IRaCIS.Core.Application.Contracts;
 | 
						|
using IRaCIS.Core.Application.Filter;
 | 
						|
using IRaCIS.Core.Application.Service.Reading.Dto;
 | 
						|
using IRaCIS.Core.Application.ViewModel;
 | 
						|
using IRaCIS.Core.Domain.Share;
 | 
						|
using MassTransit;
 | 
						|
using Microsoft.AspNetCore.Mvc;
 | 
						|
using Panda.DynamicWebApi.Attributes;
 | 
						|
using System.Linq.Dynamic.Core;
 | 
						|
 | 
						|
namespace IRaCIS.Core.Application.Service
 | 
						|
{
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// 非Dicom
 | 
						|
    /// </summary>
 | 
						|
    public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// 提交访视阅片问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [NonDynamicMethod]
 | 
						|
        public async Task<IResponseOutput> SubmitVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto)
 | 
						|
        {
 | 
						|
            await VerifyTaskIsSign(inDto.VisitTaskId);
 | 
						|
            await this.SaveVisitTaskQuestions(inDto);
 | 
						|
 | 
						|
 | 
						|
            await this.SubmitTaskChangeState(inDto.VisitTaskId);
 | 
						|
            return ResponseOutput.Ok(true);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 添加非Dicom标记并绑定
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput> AddNoneDicomMarkAndBinding(AddNoneDicomMarkAndBinding inDto)
 | 
						|
        {
 | 
						|
            ReadingNoneDicomMark? mark = await _readingNoneDicomMarkRepository.Where(x => x.MarkId == inDto.MarkInfo.MarkId).FirstOrDefaultAsync();
 | 
						|
 | 
						|
            if (mark == null)
 | 
						|
            {
 | 
						|
                mark = await _readingNoneDicomMarkRepository.InsertOrUpdateAsync(new AddNoneDicomMarkInDto()
 | 
						|
                {
 | 
						|
                    MarkId = inDto.MarkInfo.MarkId,
 | 
						|
                    MeasureData = inDto.MarkInfo.MeasureData,
 | 
						|
                    NoneDicomFileId = inDto.MarkInfo.NoneDicomFileId,
 | 
						|
                    Path = inDto.MarkInfo.Path,
 | 
						|
                    StudyId = inDto.MarkInfo.StudyId,
 | 
						|
                    VisitTaskId = inDto.VisitTaskId
 | 
						|
                }, true);
 | 
						|
            }
 | 
						|
 | 
						|
            List<ReadingNoneDicomMarkBinding> markBindings = inDto.BindingList.Select(x => new ReadingNoneDicomMarkBinding()
 | 
						|
            {
 | 
						|
                MarkId = mark.MarkId,
 | 
						|
                VisitTaskId = inDto.VisitTaskId,
 | 
						|
                QuestionId = x.QuestionId,
 | 
						|
                RowId = x.RowId,
 | 
						|
                TableQuestionId = x.TableQuestionId,
 | 
						|
                NoneDicomMarkId = mark.Id
 | 
						|
            }).ToList();
 | 
						|
 | 
						|
            await _readingNoneDicomMarkBindingRepository.AddRangeAsync(markBindings);
 | 
						|
            await _readingNoneDicomMarkBindingRepository.SaveChangesAsync();
 | 
						|
            return ResponseOutput.Ok(mark.Id);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 删除绑定关系
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput> DeleteBinding(DeleteBindingInDto inDto)
 | 
						|
        {
 | 
						|
            await _readingNoneDicomMarkBindingRepository.DeleteFromQueryAsync(x =>x.Id==inDto.BindingIdId, true);
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取非Dicom标记和绑定关系
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<GetNoneDicomMarkAndBindingOutDto> GetNoneDicomMarkAndBinding(GetNoneDicomMarkAndBindingInDto inDto)
 | 
						|
        {
 | 
						|
            GetNoneDicomMarkAndBindingOutDto result=new GetNoneDicomMarkAndBindingOutDto ();
 | 
						|
            result.NoneDicomMarkList = await _readingNoneDicomMarkRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId)
 | 
						|
                .ProjectTo<AddNoneDicomMarkInDto>(_mapper.ConfigurationProvider)
 | 
						|
                .ToListAsync();
 | 
						|
            result.BindingList = await _readingNoneDicomMarkBindingRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId)
 | 
						|
                .ProjectTo<BindingData>(_mapper.ConfigurationProvider)
 | 
						|
                .ToListAsync();
 | 
						|
            return result;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 添加非Dicom标记
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput> AddNoneDicomMark(AddNoneDicomMarkInDto inDto)
 | 
						|
        {
 | 
						|
            var entity = await _readingNoneDicomMarkRepository.InsertOrUpdateAsync(inDto, true);
 | 
						|
            return ResponseOutput.Ok(entity.Id);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取非Dicom标记
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<GetNoneDicomMarkListOutDto> GetNoneDicomMarkListOutDto(GetNoneDicomMarkListInDtoDto inDto)
 | 
						|
        {
 | 
						|
            var result = await _readingNoneDicomMarkRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId)
 | 
						|
 | 
						|
                .ProjectTo<AddNoneDicomMarkInDto>(_mapper.ConfigurationProvider)
 | 
						|
                .ToListAsync();
 | 
						|
 | 
						|
            return new GetNoneDicomMarkListOutDto()
 | 
						|
            {
 | 
						|
                NoneDicomMarkList = result
 | 
						|
            };
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 删除非Dicom标记
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="id"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost("{id:guid}")]
 | 
						|
        public async Task<IResponseOutput> DeleteTrialFileType(Guid id)
 | 
						|
        {
 | 
						|
            var success = await _readingNoneDicomMarkRepository.DeleteFromQueryAsync(t => t.Id == id, true);
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 保存任务问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        [TrialGlobalLimit("AfterStopCannNotOpt")]
 | 
						|
        public async Task<IResponseOutput> SaveVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto)
 | 
						|
        {
 | 
						|
            await VerifyTaskIsSign(inDto.VisitTaskId);
 | 
						|
            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 _readingTaskQuestionAnswerRepository.AddRangeAsync(readingTaskAnswerList);
 | 
						|
            var result = await _visitTaskRepository.SaveChangesAsync();
 | 
						|
            return ResponseOutput.Ok(result);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取阅片非Dicom文件
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput<List<NoneDicomStudyView>>> GetReadingImageFile(GetReadingImgInDto inDto)
 | 
						|
        {
 | 
						|
            var task = await GetNextTask(new GetNextTaskInDto()
 | 
						|
            {
 | 
						|
                TrialId = inDto.TrialId,
 | 
						|
                SubjectId = inDto.SubjectId,
 | 
						|
                VisitTaskId = 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());
 | 
						|
            }
 | 
						|
 | 
						|
            var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisistTaskId).Select(t => new { t.BlindSubjectCode, t.ReadingTaskState, t.TrialReadingCriterionId, t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync();
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            IQueryable<NoneDicomStudyView> noneDicomStudyQueryable = default;
 | 
						|
 | 
						|
            noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.IsReading)
 | 
						|
                .Where(t => visitIds.Contains(t.SubjectVisitId) && t.NoneDicomFileList.Any(t => !t.FileType.Contains(StaticData.FileType.Zip)))
 | 
						|
                .WhereIf(taskinfo.IsImageFilter == true, t => taskinfo.CriterionModalitys.Contains(t.Modality))
 | 
						|
                .ProjectTo<NoneDicomStudyView>(_mapper.ConfigurationProvider, new { isFilterZip = true, isReading = true });
 | 
						|
 | 
						|
            if (inDto.VisistTaskId != null && _noneDicomStudyFileSystem.Any(t => t.VisitTaskId == inDto.VisistTaskId))
 | 
						|
            {
 | 
						|
                noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.IsReading)
 | 
						|
                    .Where(t => t.TaskNoneDicomFileList.Any(t => t.VisitTaskId == inDto.VisistTaskId))
 | 
						|
                .Where(t => taskinfo.IsImageFilter ? ("|" + taskinfo.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true)
 | 
						|
                .Where(t => visitIds.Contains(t.SubjectVisitId))
 | 
						|
                     .ProjectTo<TaskDicomStudyView>(_mapper.ConfigurationProvider, new { isFilterZip = true, isReading = true, visiTaskId = inDto.VisistTaskId });
 | 
						|
            }
 | 
						|
 | 
						|
            List<NoneDicomStudyView> result = await noneDicomStudyQueryable.OrderBy(x => x.ImageDate).ThenBy(x => x.CreateTime).ToListAsync();
 | 
						|
 | 
						|
 | 
						|
            var nonoDicomStudyFileIds = await _readingNoneDicomMarkRepository.Where(x => x.VisitTaskId == inDto.VisistTaskId).ToListAsync();
 | 
						|
            if (nonoDicomStudyFileIds.Count > 0 && taskinfo.ReadingTaskState == ReadingTaskState.HaveSigned)
 | 
						|
            {
 | 
						|
                var studyId = nonoDicomStudyFileIds.Select(x => x.StudyId).FirstOrDefault();
 | 
						|
 | 
						|
                var noneDicomids = nonoDicomStudyFileIds.Select(x => x.NoneDicomFileId).ToList();
 | 
						|
                var noneDicomStudyViewMark = new NoneDicomStudyView() { Id = Guid.NewGuid() };
 | 
						|
                noneDicomStudyViewMark.IsCriticalSequence = true;
 | 
						|
                noneDicomStudyViewMark.NoneDicomStudyFileList = await _noneDicomStudyFileRepository.Where(x => noneDicomids.Contains(x.Id)).ProjectTo<NoneDicomStudyFileView>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
                foreach (var item in noneDicomStudyViewMark.NoneDicomStudyFileList)
 | 
						|
                {
 | 
						|
                    item.MarkTime = nonoDicomStudyFileIds.Where(x => x.NoneDicomFileId == item.Id).Select(x => x.CreateTime).FirstOrDefault();
 | 
						|
                }
 | 
						|
 | 
						|
                noneDicomStudyViewMark.NoneDicomStudyFileList= noneDicomStudyViewMark.NoneDicomStudyFileList.OrderBy(x => x.MarkTime).ToList();
 | 
						|
                result.Insert(0, noneDicomStudyViewMark);
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
            var trialInfo = await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x => new
 | 
						|
            {
 | 
						|
                x.ClinicalInformationTransmissionEnum,
 | 
						|
            }).FirstOrDefaultAsync();
 | 
						|
 | 
						|
 | 
						|
            var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == taskinfo.TrialReadingCriterionId).Select(x => new
 | 
						|
            {
 | 
						|
                x.IsReadingShowPreviousResults,
 | 
						|
                x.IsReadingShowSubjectInfo,
 | 
						|
                x.CriterionName,
 | 
						|
                x.Id,
 | 
						|
                x.ReadingTool,
 | 
						|
 | 
						|
            }).FirstOrDefaultAsync();
 | 
						|
 | 
						|
 | 
						|
            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 ResponseOutput.Ok(result, new
 | 
						|
            {
 | 
						|
                VisitTaskId = task.VisitTaskId,
 | 
						|
                SubjectId = task.SubjectId,
 | 
						|
                SubjectCode = taskInfo.BlindSubjectCode.IsNullOrEmpty() ? task.SubjectCode : taskInfo.BlindSubjectCode,
 | 
						|
                ReadingCategory = task.ReadingCategory,
 | 
						|
                TaskBlindName = task.TaskBlindName,
 | 
						|
                IsReadingShowPreviousResults = criterionInfo.IsReadingShowPreviousResults,
 | 
						|
                IsReadingShowSubjectInfo = criterionInfo.IsReadingShowSubjectInfo,
 | 
						|
                IsExistsClinicalData = isExistsClinicalData,
 | 
						|
                TrialCriterionName = criterionInfo.CriterionName,
 | 
						|
                TrialCriterionId = criterionInfo.Id
 | 
						|
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    }
 | 
						|
}
 |