374 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			374 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
| using IRaCIS.Core.Domain.Share;
 | |
| using Microsoft.AspNetCore.Mvc;
 | |
| using IRaCIS.Core.Application.Service.Reading.Dto;
 | |
| using IRaCIS.Core.Infra.EFCore.Common;
 | |
| using IRaCIS.Core.Application.Contracts;
 | |
| using Panda.DynamicWebApi.Attributes;
 | |
| 
 | |
| namespace IRaCIS.Application.Services
 | |
| {
 | |
| 
 | |
|     /// <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<(GetTrialReadingQuestionPageDto, object)> GetTrialReadingQuestion(GetTrialReadingQuestionInDto inDto)
 | |
|         {
 | |
|             if (inDto.VisitTaskId != null)
 | |
|             {
 | |
|                 //await AddDefaultValueToTask(inDto.VisitTaskId.Value);
 | |
|             }
 | |
|           
 | |
|             var result = new GetTrialReadingQuestionPageDto();
 | |
|             var readingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.ReadingTaskState).FirstOrDefaultAsync();
 | |
| 
 | |
| 
 | |
|             var qusetionList = await GetReadingAnswerView(inDto.ReadingQuestionCriterionTrialId, inDto.VisitTaskId);
 | |
| 
 | |
|             var formType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.ReadingQuestionCriterionTrialId).Select(x => x.FormType).FirstOrDefaultAsync();
 | |
|             var groupList = new List<GetTrialReadingQuestionOutDto>();
 | |
| 
 | |
|             var qusetionIds = qusetionList.Select(x => x.Id).ToList();
 | |
|             var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => qusetionIds.Contains(x.ReadingQuestionId))
 | |
|                 .ProjectTo<TableQuestionDataInfo>(_mapper.ConfigurationProvider,x=>new {
 | |
| 
 | |
|                     isEn_Us=_userInfo.IsEn_Us
 | |
| 
 | |
|                 }).OrderBy(x => x.ShowOrder).ToListAsync();
 | |
|             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 == ReadingQestionType.Group || (x.ParentId == null && x.GroupName.IsNullOrEmpty())).ToList();
 | |
|                     pageGroupList.ForEach(x =>
 | |
|                     {
 | |
|                         this.FindChildQuestion(x, newPageQusetionList, tableQuestionList);
 | |
|                     });
 | |
| 
 | |
|                     page.Childrens = pageGroupList.Where(x => !(x.Type == ReadingQestionType.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 == ReadingQestionType.Group || (x.ParentId == null && x.GroupName.IsNullOrEmpty())).ToList();
 | |
|                 groupList.ForEach(x =>
 | |
|                 {
 | |
|                     this.FindChildQuestion(x, qusetionList, tableQuestionList);
 | |
|                 });
 | |
| 
 | |
|                 groupList = groupList.Where(x => !(x.Type == ReadingQestionType.Group && x.Childrens.Count() == 0)).ToList();
 | |
| 
 | |
|                 result.SinglePage = groupList;
 | |
| 
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
|             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,
 | |
|                             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.GroupName == item.GroupName)).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 || (x.ParentId == null && x.GroupName.IsNullOrEmpty())).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.GroupName == item.GroupName)).ToList();
 | |
| 
 | |
|             item.Childrens.AddRange(tableQuestions.Where(x => x.ReadingQuestionId == item.Id).Select(x => new GetSystemReadingQuestionOutDto
 | |
|             {
 | |
|                 Childrens = new List<GetSystemReadingQuestionOutDto>(),
 | |
|                 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,
 | |
|                 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 GetSystemReadingQuestionOutDto
 | |
|                 {
 | |
|                     Childrens = new List<GetSystemReadingQuestionOutDto>(),
 | |
|                     ShowOrder = x.ShowOrder,
 | |
|                     GroupName = string.Empty,
 | |
|                     Id = x.Id,
 | |
|                     DictionaryCode = x.DictionaryCode,
 | |
|                     Type = x.Type,
 | |
|                     TableQuestionType = x.TableQuestionType,
 | |
|                     DependParentId = x.DependParentId,
 | |
|                     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<GetSystemReadingQuestionOutDto>(),
 | |
|                     Remark = x.Remark,
 | |
| 
 | |
|                 }).ToList(),
 | |
|                 Remark = x.Remark,
 | |
| 
 | |
|             }));
 | |
| 
 | |
|             if (item.Childrens != null && item.Childrens.Count != 0)
 | |
|             {
 | |
|                 item.Childrens.ForEach(x =>
 | |
|                 {
 | |
|                     this.FindSystemChildQuestion(x, questionlists, tableQuestions);
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |