301 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
| using DocumentFormat.OpenXml.Office2019.Excel.ThreadedComments;
 | |
| using IRaCIS.Core.Application.Contracts;
 | |
| using IRaCIS.Core.Application.Service.Reading.Dto;
 | |
| using IRaCIS.Core.Domain.Share;
 | |
| using IRaCIS.Core.Infra.EFCore.Common;
 | |
| using Microsoft.AspNetCore.Mvc;
 | |
| using NPOI.POIFS.Properties;
 | |
| using Panda.DynamicWebApi.Attributes;
 | |
| using System.Collections.Generic;
 | |
| 
 | |
| namespace IRaCIS.Core.Application.Service
 | |
| {
 | |
| 
 | |
|     /// <summary>
 | |
|     /// 问题
 | |
|     /// </summary>
 | |
|     public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
 | |
|     {
 | |
|         #region 获取项目已确认的标准
 | |
|         /// <summary>
 | |
|         /// 获取项目已确认的标准
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<List<GetTrialConfirmCriterionListOutDto>> GetTrialConfirmCriterionList(GetConfirmCriterionInDto inDto)
 | |
|         {
 | |
|             var result = await _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.TrialReadingCriterion.IsConfirm)
 | |
|                 .WhereIf(inDto.VisitTaskId != null, t => t.Id == inDto.VisitTaskId)
 | |
|                .Select(x => new GetTrialConfirmCriterionListOutDto()
 | |
|                {
 | |
|                    ReadingQuestionCriterionTrialId = x.TrialReadingCriterion.Id,
 | |
|                    ReadingQuestionCriterionTrialName = x.TrialReadingCriterion.CriterionName
 | |
|                }).Distinct().ToListAsync();
 | |
|             return result;
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region 获取项目的阅片问题
 | |
|         /// <summary>
 | |
|         /// 获取项目的阅片问题ECRF预览
 | |
|         /// </summary>
 | |
|         /// <remarks>
 | |
|         /// SinglePage  单页
 | |
|         /// 
 | |
|         /// MultiPage   多页
 | |
|         /// 
 | |
|         /// PublicPage  公共
 | |
|         /// </remarks>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<(GetReadingTableQuestionOutDto, object)> GetTrialReadingQuestion(GetTrialReadingQuestionInDto inDto)
 | |
|         {
 | |
|             var readingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.ReadingTaskState).FirstOrDefaultAsync();
 | |
|             var formType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.ReadingQuestionCriterionTrialId).Select(x => x.FormType).FirstOrDefaultAsync();
 | |
|             if (inDto.FormType != null)
 | |
|             {
 | |
|                 formType = inDto.FormType.Value;
 | |
|             }
 | |
|             var tableAnswers = await _readingTableQuestionAnswerRepository
 | |
|              .ProjectTo<ReadingTableQuestionAnswerInfo>(_mapper.ConfigurationProvider)
 | |
|            .Where(x => x.VisitTaskId == inDto.VisitTaskId).ToListAsync();
 | |
| 
 | |
|             var tableAnsweRowInfos = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId).ProjectTo<TableAnsweRowInfo>(_mapper.ConfigurationProvider).ToListAsync();
 | |
| 
 | |
|             var organIds = tableAnsweRowInfos.Where(x => x.OrganInfoId != null).Select(x => x.OrganInfoId).Distinct().ToList();
 | |
|             var organList = await _organInfoRepository.Where(x => organIds.Contains(x.Id)).ToListAsync();
 | |
|             var result = await GetReadingTableQuestion(new GetReadingTableQuestionOrAnswerInDto()
 | |
|             {
 | |
| 
 | |
|                 TrialReadingCriterionId = inDto.ReadingQuestionCriterionTrialId,
 | |
|                 TaskId = inDto.VisitTaskId,
 | |
|                 TableAnswers = tableAnswers,
 | |
|                 TableAnsweRowInfos = tableAnsweRowInfos,
 | |
|                 OrganInfos = organList,
 | |
|                 QuestionClassify = null,
 | |
| 
 | |
|             });
 | |
| 
 | |
| 
 | |
|             return (result, new
 | |
|             {
 | |
|                 readingTaskState = readingTaskState,
 | |
|                 FormType = formType
 | |
| 
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 项目配置的阅片问题(不包含表格问题) 以及配置的分页 和任务对应的答案 一维表   --   非dicom 阅片
 | |
|         /// </summary>
 | |
|         /// <param name="readingQuestionCriterionTrialId"></param>
 | |
|         /// <param name="visitTaskId"></param>
 | |
|         /// <returns></returns>
 | |
|         private async Task<List<GetTrialReadingQuestionOutDto>> GetReadingAnswerView(Guid readingQuestionCriterionTrialId, Guid? visitTaskId)
 | |
|         {
 | |
|             var query = from data in _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == 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 == visitTaskId) on data.Id equals questionAnswer.ReadingQuestionTrialId into questionAnswerTemp
 | |
|                         from leftquestionAnswer in questionAnswerTemp.DefaultIfEmpty()
 | |
|                         select new GetTrialReadingQuestionOutDto()
 | |
|                         {
 | |
| 
 | |
|                             Id = data.Id,
 | |
|                             ReadingQuestionCriterionTrialId = data.ReadingQuestionCriterionTrialId,
 | |
|                             TrialId = data.TrialId,
 | |
|                             Type = data.Type,
 | |
|                             ParentTriggerValue = data.ParentTriggerValue,
 | |
|                             GroupName = data.GroupName.LanguageName(data.GroupEnName, _userInfo.IsEn_Us),
 | |
|                             QuestionName = data.QuestionName.LanguageName(data.QuestionEnName, _userInfo.IsEn_Us),
 | |
|                             IsRequired = data.IsRequired,
 | |
|                             ShowQuestion = data.ShowQuestion,
 | |
|                             LesionType = data.LesionType,
 | |
|                             QuestionGenre = data.QuestionGenre,
 | |
|                             DictionaryCode = data.DictionaryCode,
 | |
|                             GroupId = data.GroupId,
 | |
|                             ShowOrder = data.ShowOrder,
 | |
|                             RelevanceId = data.RelevanceId,
 | |
|                             IsShowInDicom = data.IsShowInDicom,
 | |
|                             MaxQuestionCount = data.MaxQuestionCount,
 | |
|                             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,
 | |
|                             DefaultValue = data.DefaultValue,
 | |
|                         };
 | |
| 
 | |
|             var qusetionList = await query.Where(x => x.ShowQuestion != ShowQuestion.Hide).OrderBy(x => x.ShowOrder).ToListAsync();
 | |
| 
 | |
|             qusetionList.ForEach(x =>
 | |
|             {
 | |
|                 x.Answer = x.Answer.IsNullOrEmpty() ? x.DefaultValue : x.Answer;
 | |
|             });
 | |
| 
 | |
|             return qusetionList;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 找子问题
 | |
|         /// </summary>
 | |
|         /// <param name="item"></param>
 | |
|         /// <param name="questionlists"></param>
 | |
|         /// <param name="tableQuestions"></param>
 | |
|         [NonDynamicMethod]
 | |
|         public void FindChildQuestion(GetTrialReadingQuestionOutDto item, List<GetTrialReadingQuestionOutDto> questionlists, List<TableQuestionDataInfo> tableQuestions)
 | |
|         {
 | |
|             item.Childrens = questionlists.Where(x => x.ParentId == item.Id || (item.Type == ReadingQestionType.Group && x.Type != ReadingQestionType.Group && x.ParentId == null && x.GroupId == item.Id)).ToList();
 | |
| 
 | |
| 
 | |
|             item.Childrens.AddRange(tableQuestions.Where(x => x.ReadingQuestionId == item.Id).Select(x => new GetTrialReadingQuestionOutDto
 | |
|             {
 | |
|                 Childrens = new List<GetTrialReadingQuestionOutDto>(),
 | |
|                 ShowOrder = x.ShowOrder,
 | |
|                 GroupName = string.Empty,
 | |
|                 Id = x.Id,
 | |
|                 Type = x.Type,
 | |
|                 DictionaryCode = x.DictionaryCode,
 | |
|                 TableQuestionType = x.TableQuestionType,
 | |
|                 DependParentId = x.DependParentId,
 | |
|                 IsDepend = x.IsDepend,
 | |
|                 QuestionMark = x.QuestionMark,
 | |
|                 QuestionGenre = x.QuestionGenre,
 | |
|                 TypeValue = x.TypeValue,
 | |
|                 RelevanceId = x.RelevanceId,
 | |
|                 IsRequired = x.IsRequired,
 | |
|                 RelevanceValue = x.RelevanceValue,
 | |
|                 ImageCount = 0,
 | |
|                 ParentId = item.Id,
 | |
|                 DataTableColumn = x.DataTableColumn,
 | |
|                 LesionType = item.LesionType,
 | |
|                 QuestionName = x.QuestionName,
 | |
|                 RelationQuestions = tableQuestions.Where(z => (z.DependParentId ?? default(Guid)) == x.Id).Select(x => new GetTrialReadingQuestionOutDto
 | |
|                 {
 | |
|                     Childrens = new List<GetTrialReadingQuestionOutDto>(),
 | |
|                     ShowOrder = x.ShowOrder,
 | |
|                     GroupName = string.Empty,
 | |
|                     Id = x.Id,
 | |
|                     Type = x.Type,
 | |
|                     QuestionGenre = x.QuestionGenre,
 | |
|                     TableQuestionType = x.TableQuestionType,
 | |
|                     DependParentId = x.DependParentId,
 | |
|                     DictionaryCode = x.DictionaryCode,
 | |
|                     IsDepend = x.IsDepend,
 | |
|                     QuestionMark = x.QuestionMark,
 | |
|                     TypeValue = x.TypeValue,
 | |
|                     RelevanceId = x.RelevanceId,
 | |
|                     RelevanceValue = x.RelevanceValue,
 | |
|                     ImageCount = 0,
 | |
|                     ParentId = item.Id,
 | |
|                     DataTableColumn = x.DataTableColumn,
 | |
|                     LesionType = item.LesionType,
 | |
|                     QuestionName = x.QuestionName,
 | |
|                     RelationQuestions = new List<GetTrialReadingQuestionOutDto>(),
 | |
|                     Remark = x.Remark,
 | |
| 
 | |
|                 }).ToList(),
 | |
|                 Remark = x.Remark,
 | |
| 
 | |
|             }));
 | |
|             if (item.Childrens != null && item.Childrens.Count != 0)
 | |
|             {
 | |
|                 item.Childrens.ForEach(x =>
 | |
|                 {
 | |
|                     this.FindChildQuestion(x, questionlists, tableQuestions);
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region 获取系统的阅片问题
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取系统的阅片问题
 | |
|         /// </summary>
 | |
|         /// <param name="inDto"></param>
 | |
|         /// <returns></returns>
 | |
|         [HttpPost]
 | |
|         public async Task<GetSystemReadingQuestionPageDto> GetSystemReadingQuestion(GetSystemReadingQuestionInDto inDto)
 | |
|         {
 | |
|             var result = new GetSystemReadingQuestionPageDto();
 | |
|             var qusetionList = await _readingQuestionSystem.Where(x => x.ReadingQuestionCriterionSystemId == inDto.Id)
 | |
|                          .ProjectTo<GetSystemReadingQuestionOutDto>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync();
 | |
| 
 | |
| 
 | |
|             var questionIds = qusetionList.Select(x => x.Id).ToList();
 | |
|             var tableQuestionList = await _readingTableQuestionSystemRepository.Where(x => questionIds.Contains(x.ReadingQuestionId))
 | |
|                  .ProjectTo<TableQuestionDataInfo>(_mapper.ConfigurationProvider, new
 | |
|                  {
 | |
|                      isEn_Us = _userInfo.IsEn_Us,
 | |
|                  }).OrderBy(x => x.ShowOrder).ToListAsync();
 | |
| 
 | |
|             var groupList = new List<GetSystemReadingQuestionOutDto>();
 | |
| 
 | |
|             //qusetionList = qusetionList.Where(x => x.ParentId == null).ToList();
 | |
| 
 | |
|             groupList = qusetionList.Where(x => x.Type == ReadingQestionType.Group).ToList();
 | |
|             groupList.ForEach(x =>
 | |
|             {
 | |
|                 this.FindSystemChildQuestion(x, qusetionList, tableQuestionList);
 | |
|             });
 | |
| 
 | |
|             groupList = groupList.Where(x => !(x.Type == ReadingQestionType.Group && x.Childrens.Count() == 0)).ToList();
 | |
| 
 | |
|             result.SinglePage = groupList;
 | |
| 
 | |
| 
 | |
|             return result;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 获取系统
 | |
|         /// </summary>
 | |
|         /// <param name="item"></param>
 | |
|         /// <param name="questionlists"></param>
 | |
|         /// <param name="tableQuestions"></param>
 | |
|         public void FindSystemChildQuestion(GetSystemReadingQuestionOutDto item, List<GetSystemReadingQuestionOutDto> questionlists, List<TableQuestionDataInfo> tableQuestions)
 | |
|         {
 | |
|             item.Childrens = questionlists.Where(x => x.ParentId == item.Id || (item.Type == ReadingQestionType.Group && x.Type != ReadingQestionType.Group && x.ParentId == null && x.GroupId == item.Id)).ToList();
 | |
|             var itemChild = _mapper.Map<List<GetSystemReadingQuestionOutDto>>(tableQuestions.Where(x => x.ReadingQuestionId == item.Id).ToList());
 | |
|             itemChild.ForEach(x =>
 | |
|             {
 | |
|                 x.Childrens = new List<GetSystemReadingQuestionOutDto>();
 | |
|                 x.GroupName = string.Empty;
 | |
|                 x.ImageCount = 0;
 | |
|                 var relationQuestions= _mapper.Map<List<GetSystemReadingQuestionOutDto>>(tableQuestions.Where(z => (z.DependParentId ?? default(Guid)) == x.Id).ToList());
 | |
|                 relationQuestions.ForEach(y =>
 | |
|                 {
 | |
|                     y.Childrens = new List<GetSystemReadingQuestionOutDto>();
 | |
|                     y.GroupName = string.Empty;
 | |
|                     y.ImageCount = 0;
 | |
|                     y.LesionType = item.LesionType;
 | |
|                     y.RelationQuestions = new List<GetSystemReadingQuestionOutDto>();
 | |
|                 });
 | |
| 
 | |
|                 x.RelationQuestions= relationQuestions;
 | |
|             });
 | |
|             item.Childrens.AddRange(itemChild);
 | |
|             if (item.Childrens != null && item.Childrens.Count != 0)
 | |
|             {
 | |
|                 item.Childrens.ForEach(x =>
 | |
|                 {
 | |
|                     this.FindSystemChildQuestion(x, questionlists, tableQuestions);
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |