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; using IRaCIS.Core.Application.Interfaces; 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 IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository; private readonly IRepository<ReadingOncologyTaskInfo> _readingOncologyTaskInfoRepository; private readonly IVisitTaskHelpeService _visitTaskHelpeService; private readonly IVisitTaskService _visitTaskService; private readonly IReadingClinicalDataService _readingClinicalDataService; private readonly IReadingCalculateService _readingCalculateService; private readonly IRepository<SubjectVisit> _subjectVisitRepository; private readonly IRepository<Subject> _subjectRepository; private readonly IRepository<ReadingGlobalTaskInfo> _readingGlobalTaskInfoRepository; private readonly IRepository<ReadingCriterionPage> _readingCriterionPageRepository; private readonly IRepository<ReadingJudgeInfo> _readingJudgeInfoRepository; private readonly IRepository<ReadModule> _readModuleRepository; private readonly IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository; private readonly IRepository<ReadingTableQuestionSystem> _readingTableQuestionSystemRepository; private readonly IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository; private readonly IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswerRepository; private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository; private readonly IRepository<ReadingQuestionCriterionSystem> _readingQuestionCriterionSystemRepository; private readonly IRepository<ReadingQuestionSystem> _readingQuestionSystem; private readonly IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository; public ReadingImageTaskService( IMapper mapper, IRepository<NoneDicomStudy> noneDicomStudyRepository, IRepository<VisitTask> visitTaskRepository, IRepository<Trial> TrialRepository, IRepository<ReadingTableQuestionAnswer> ReadingTableQuestionAnswerRepository, IRepository<ReadingOncologyTaskInfo> ReadingOncologyTaskInfoRepository, IVisitTaskHelpeService visitTaskHelpeService, IVisitTaskService visitTaskService, IReadingClinicalDataService readingClinicalDataService, IReadingCalculateService readingCalculateService, IRepository<SubjectVisit> subjectVisitRepository, IRepository<Subject> subjectRepository, IRepository<ReadingGlobalTaskInfo> readingGlobalTaskInfoRepository, IRepository<ReadingCriterionPage> readingCriterionPageRepository, IRepository<ReadingJudgeInfo> readingJudgeInfoRepository, IRepository<ReadModule> readModuleRepository, IRepository<ReadingTableAnswerRowInfo> readingTableAnswerRowInfoRepository, IRepository<ReadingTableQuestionSystem> readingTableQuestionSystemRepository, IRepository<ReadingTableQuestionTrial> readingTableQuestionTrialRepository, IRepository<ReadingTaskQuestionAnswer> readingTaskQuestionAnswerRepository, IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository, IRepository<ReadingQuestionCriterionSystem> readingQuestionCriterionSystemRepository, IRepository<ReadingQuestionSystem> ReadingQuestionSystem, IRepository<ReadingQuestionTrial> readingQuestionTrialRepository ) { base._mapper = mapper; this._noneDicomStudyRepository = noneDicomStudyRepository; this._visitTaskRepository = visitTaskRepository; this._trialRepository = TrialRepository; this._readingTableQuestionAnswerRepository = ReadingTableQuestionAnswerRepository; this._readingOncologyTaskInfoRepository = ReadingOncologyTaskInfoRepository; this._visitTaskHelpeService = visitTaskHelpeService; this._visitTaskService = visitTaskService; this._readingClinicalDataService = readingClinicalDataService; this._readingCalculateService = readingCalculateService; this._subjectVisitRepository = subjectVisitRepository; this._subjectRepository = subjectRepository; this._readingGlobalTaskInfoRepository = readingGlobalTaskInfoRepository; this._readingCriterionPageRepository = readingCriterionPageRepository; this._readingJudgeInfoRepository = readingJudgeInfoRepository; this._readModuleRepository = readModuleRepository; this._readingTableAnswerRowInfoRepository = readingTableAnswerRowInfoRepository; this._readingTableQuestionSystemRepository = readingTableQuestionSystemRepository; this._readingTableQuestionTrialRepository = readingTableQuestionTrialRepository; this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; this._readingQuestionCriterionSystemRepository = readingQuestionCriterionSystemRepository; this._readingQuestionSystem = ReadingQuestionSystem; this._readingQuestionTrialRepository = readingQuestionTrialRepository; } #region 表格问题相关 /// <summary> /// 修改Dicom阅片问题 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<IResponseOutput> ChangeDicomReadingQuestionAnswer(ChangeDicomReadingQuestionAnswerInDto inDto) { var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var criterionId = await _readingQuestionCriterionTrialRepository.Where(x => x.IsConfirm && x.TrialId == taskInfo.TrialId).Select(x => x.Id).FirstOrDefaultAsync(); var questionIds = inDto.Answers.Select(x => x.Id).ToList(); await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && questionIds.Contains(x.ReadingQuestionTrialId)); var needAddAnswer = inDto.Answers.Select(x => new ReadingTaskQuestionAnswer() { Answer = x.Answer, SubjectId = taskInfo.SubjectId, ReadingQuestionCriterionTrialId = criterionId, ReadingQuestionTrialId = x.Id, TrialId = taskInfo.TrialId, VisitTaskId = inDto.VisitTaskId, }).ToList(); await _readingTaskQuestionAnswerRepository.AddRangeAsync(needAddAnswer); await _readingTaskQuestionAnswerRepository.SaveChangesAsync(); return ResponseOutput.Ok(true); } /// <summary> /// 删除表格行数据 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<IResponseOutput> DeleteReadingRowAnswer(DeleteReadingRowAnswerInDto inDto) { await _readingTableQuestionAnswerRepository.DeleteFromQueryAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == inDto.RowIndex && x.QuestionId == inDto.QuestionId); await _readingTableAnswerRowInfoRepository.DeleteFromQueryAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == inDto.RowIndex && x.QuestionId == inDto.QuestionId); await _readingTableAnswerRowInfoRepository.SaveChangesAsync(); var indexs =await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == inDto.QuestionId).Select(x => x.RowIndex).Distinct().OrderBy(x => x).ToListAsync(); var index = 1; foreach (var item in indexs) { await _readingTableQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == item && x.QuestionId == inDto.QuestionId, x => new ReadingTableQuestionAnswer() { RowIndex = index }); await _readingTableAnswerRowInfoRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == item && x.QuestionId == inDto.QuestionId, x => new ReadingTableAnswerRowInfo() { RowIndex = index }); index++; } return ResponseOutput.Ok(true); } /// <summary> /// 获取DIcom阅片问题答案 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<(List<DicomReadingQuestionAnswer>,object)> GetDicomReadingQuestionAnswer(GetDicomReadingQuestionAnswerInDto inDto) { var criterionId = await _readingQuestionCriterionTrialRepository.Where(x => x.IsConfirm && x.TrialId == inDto.TrialId).Select(x => x.Id).FirstOrDefaultAsync(); var questions = await _readingQuestionTrialRepository.Where(x => x.IsShowInDicom && x.ReadingQuestionCriterionTrialId == criterionId&&x.Type!=ReadingQestionType.Table) .ProjectTo<DicomReadingQuestionAnswer>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync(); var answers = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId).ToListAsync(); var groups = questions.Where(x => x.Type != ReadingQestionType.Group).Select(x => x.GroupName).ToList(); var result = questions.Where(x => x.Type == ReadingQestionType.Group&&groups.Contains(x.GroupName)).ToList(); foreach (var item in result) { GetDicomReadingAnswer(item, questions, answers); } return (result, new { ReadingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.ReadingTaskState).FirstOrDefaultAsync() }) ; } private void GetDicomReadingAnswer(DicomReadingQuestionAnswer item,List<DicomReadingQuestionAnswer> questions,List<ReadingTaskQuestionAnswer> answers) { item.Answer = answers.Where(x => x.ReadingQuestionTrialId == item.Id).Select(x => x.Answer).FirstIsNullReturnEmpty(); item.Childrens = questions.Where(x => x.ParentId == item.Id||((item.Type == ReadingQestionType.Group && x.Type != ReadingQestionType.Group && x.ParentId == null && x.GroupName == item.GroupName)) ).ToList(); if (item.Childrens != null && item.Childrens.Count > 0) { foreach (var question in item.Childrens) { GetDicomReadingAnswer(question, questions, answers); } } } /// <summary> /// 添加基线表格数据到其他任务 /// </summary> /// <param name="visitTaskId"></param> /// <returns></returns> private async Task<bool> AddBaseLineAnswerToOtherTask(Guid visitTaskId) { var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync(); var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == taskinfo.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync(); // 判断当前任务是否是基线 if (taskinfo.SourceSubjectVisitId != baseLineVisitId) { // 判断当前任务是是否有表格问题答案 if (!(await _readingTableQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == visitTaskId))) { // 找到基线的任务Id var baseLineTaskId = await _visitTaskRepository.Where(x => x.SourceSubjectVisitId == baseLineVisitId && x.TaskState == TaskState.Effect&&x.ArmEnum==taskinfo.ArmEnum).Select(x => x.Id).FirstOrDefaultAsync(); var copyTableAnswers =await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId).Select(x=> new CopyTableAnswerDto() { Answer=x.Answer, QuestionId=x.QuestionId, QuestionMark=x.ReadingTableQuestionTrial.QuestionMark, TableQuestionId=x.TableQuestionId, RowIndex=x.RowIndex, TrialId=x.TrialId }).ToListAsync(); var tableRowAnswers=await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == baseLineTaskId).Select(x=> new ReadingTableAnswerRowInfo() { IsCurrentTaskAdd=false, QuestionId=x.QuestionId, RowIndex=x.RowIndex, TrialId=x.TrialId, VisitTaskId=visitTaskId, }).ToListAsync(); tableRowAnswers.ForEach(x => { x.IsCurrentTaskAdd = false; x.Id = NewId.NextGuid(); }); List<QuestionMark?> notNeedCopyMarks = new List<QuestionMark?>() { QuestionMark.MajorAxis, QuestionMark.ShortAxis, QuestionMark.State, }; var tableAnswers = copyTableAnswers.Select(x => new ReadingTableQuestionAnswer { Id = NewId.NextGuid(), Answer = notNeedCopyMarks.Contains(x.QuestionMark) ? string.Empty : x.Answer, QuestionId = x.QuestionId, RowIndex = x.RowIndex, TableQuestionId = x.TableQuestionId, TrialId = x.TrialId, VisitTaskId = visitTaskId, }); await _readingTableAnswerRowInfoRepository.AddRangeAsync(tableRowAnswers); await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers); await _readingTableQuestionAnswerRepository.SaveChangesAsync(); } } return taskinfo.SourceSubjectVisitId == baseLineVisitId; } /// <summary> /// 获取阅片报告 /// </summary> /// <param name="indto"></param> /// <returns></returns> [HttpPost] public async Task<GetReadingReportEvaluationOutDto> GetReadingReportEvaluation(GetReadingReportEvaluationInDto indto) { GetReadingReportEvaluationOutDto result = new GetReadingReportEvaluationOutDto(); var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).FirstNotNullAsync(); result.ReadingTaskState = visitTaskInfo.ReadingTaskState; var taskInfoList = await _visitTaskRepository.Where(x => (x.SubjectId == visitTaskInfo.SubjectId && x.TaskState == TaskState.Effect && x.ReadingCategory == ReadingCategory.Visit && !x.IsAnalysisCreate && x.ReadingTaskState == ReadingTaskState.HaveSigned)||x.Id== indto.VisitTaskId ).OrderBy(x => x.VisitTaskNum).Select(x => new VisitTaskInfo() { VisitTaskId = x.Id, TaskName = x.TaskName, VisitTaskNum = x.VisitTaskNum, IsCurrentTask=x.Id==indto.VisitTaskId, }).ToListAsync(); result.VisitTaskList = taskInfoList; var visitTaskIds = taskInfoList.Select(x => x.VisitTaskId).ToList(); var criterionId = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == indto.TrialId && x.IsConfirm).Select(x => x.Id).FirstOrDefaultAsync(); var questionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == criterionId).ToListAsync(); var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => x.TrialCriterionId == criterionId).OrderBy(x=>x.ShowOrder).ToListAsync(); var answers = await _readingTaskQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync(); var tableAnswers = await _readingTableQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync(); // 第一级 #region 构造问题 List<ReadingReportDto> questions = questionList.Where(x => x.Type == ReadingQestionType.Group).OrderBy(x => x.ShowOrder).Select(x => new ReadingReportDto() { QuestionId = x.Id, GroupName = x.GroupName, IsShowInDicom=x.IsShowInDicom, Type=x.Type, TypeValue=x.TypeValue, QuestionName = x.QuestionName, ShowOrder = x.ShowOrder, }).ToList(); // 分组 foreach (var item in questions) { item.Childrens = questionList.Where(x => x.GroupName == item.GroupName&&x.Type!= ReadingQestionType.Group).OrderBy(x => x.ShowOrder).Select(x => new ReadingReportDto() { GroupName = x.GroupName, QuestionId = x.Id, IsShowInDicom = x.IsShowInDicom, QuestionName = x.QuestionName, Type=x.Type, TypeValue=x.TypeValue, ShowOrder = x.ShowOrder, OrderMark=x.OrderMark, }).ToList(); // 问题 foreach (var question in item.Childrens) { foreach (var task in taskInfoList) { question.Answer.Add(new TaskQuestionAnswer() { Answer = answers.Where(x => x.VisitTaskId == task.VisitTaskId && x.ReadingQuestionTrialId == question.QuestionId).Select(x => x.Answer).FirstIsNullReturnEmpty(), TaskName = task.TaskName, VisitTaskId = task.VisitTaskId, }); } // 构造表格行数据 var rowIndexs = tableAnswers.Where(x => x.QuestionId == question.QuestionId).Select(x => x.RowIndex).Distinct().OrderBy(x => x).ToList(); question.Childrens = rowIndexs.Select(x => new ReadingReportDto() { QuestionName = question.OrderMark + x.ToString().PadLeft(2, '0'), RowIndex=x, }).ToList(); foreach (var row in question.Childrens) { // tableQuestion row.Childrens = tableQuestionList.Where(x=>x.ReadingQuestionId== question.QuestionId).Select(x => new ReadingReportDto() { QuestionName = x.QuestionName, QuestionId = x.ReadingQuestionId, TableQuestionId = x.Id, Type=x.Type, QuestionMark=x.QuestionMark, TypeValue =x.TypeValue, RowIndex = row.RowIndex, ShowOrder = x.ShowOrder, }).ToList(); foreach (var tableQuestion in row.Childrens) { foreach (var task in taskInfoList) { tableQuestion.Answer.Add(new TaskQuestionAnswer() { Answer = tableAnswers.Where(x => x.VisitTaskId == task.VisitTaskId && x.QuestionId == tableQuestion.QuestionId&&x.RowIndex==tableQuestion.RowIndex&&x.TableQuestionId== tableQuestion.TableQuestionId).Select(x => x.Answer).FirstIsNullReturnEmpty(), TaskName = task.TaskName, VisitTaskId = task.VisitTaskId, }); } } } }; } #endregion result.TaskQuestions = questions; return result; } /// <summary> /// 获取表格答案行信息 /// </summary> /// <param name="inDto"></param> /// <remarks> /// (QuestionId) 可为空 /// </remarks> /// <returns></returns> public async Task<List<GetTableAnswerRowInfoOutDto>> GetTableAnswerRowInfoList(GetTableAnswerRowInfoInDto inDto) { await this.AddBaseLineAnswerToOtherTask(inDto.VisitTaskId); return await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId) .WhereIf(inDto.QuestionId != null, x => x.QuestionId == inDto.QuestionId) .ProjectTo<GetTableAnswerRowInfoOutDto>(_mapper.ConfigurationProvider).OrderBy(x=>x.ShowOrder).ThenBy(x=>x.RowIndex) .ToListAsync(); } /// <summary> /// 获取表格问题及答案(2022-08-26) /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<(GetReadingQuestionAndAnswerOutDto,object)> GetReadingQuestionAndAnswer(GetReadingQuestionAndAnswerInDto inDto) { var result = new GetReadingQuestionAndAnswerOutDto(); var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); result.ReadingTaskState = taskinfo.ReadingTaskState; var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == taskinfo.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync(); result.IsBaseLineTask= taskinfo.SourceSubjectVisitId == baseLineVisitId; var readingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.ReadingTaskState).FirstOrDefaultAsync(); var criterion = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm).FirstNotNullAsync(); #region 获取问题及答案 var qusetionList = await _readingQuestionTrialRepository.Where(x=>x.ReadingQuestionCriterionTrialId== criterion.Id) .ProjectTo<TrialReadQuestionData>(_mapper.ConfigurationProvider).Where(x=>x.IsShowInDicom && (x.Type == ReadingQestionType.Table||x.Type== ReadingQestionType.Group)).OrderBy(x => x.ShowOrder).ToListAsync(); var usedGurops = qusetionList.Where(x => x.Type == ReadingQestionType.Table).Select(x => x.GroupName).ToList(); qusetionList = qusetionList.Where(x =>usedGurops.Contains(x.GroupName)).ToList(); var answers = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId).ToListAsync(); qusetionList.ForEach(x => { x.Answer = answers.Where(y => y.ReadingQuestionTrialId == x.Id).Select(x => x.Answer).FirstOrDefault() ?? string.Empty; }); #endregion var formType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == criterion.Id).Select(x => x.FormType).FirstOrDefaultAsync(); var groupList = new List<TrialReadQuestionData>(); var qusetionIds = qusetionList.Select(x => x.Id).ToList(); var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => qusetionIds.Contains(x.ReadingQuestionId)) .ProjectTo<TableQuestionTrial>(_mapper.ConfigurationProvider) .OrderBy(x => x.ShowOrder).ToListAsync(); 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).ToListAsync(); 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 TrialReadQuestionData() { 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, tableAnswers, tableAnsweRowInfos); }); 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, tableAnswers, tableAnsweRowInfos); }); groupList = groupList.Where(x => !(x.Type == ReadingQestionType.Group && x.Childrens.Count() == 0)).ToList(); result.SinglePage = groupList; } return (result, new { readingTaskState = readingTaskState, FormType = formType }); ; } /// <summary> /// 获取子元素 /// </summary> /// <param name="item"></param> /// <param name="questionlists"></param> /// <param name="tableQuestionLists"></param> private void FindChildQuestion(TrialReadQuestionData item, List<TrialReadQuestionData> questionlists, List<TableQuestionTrial> tableQuestionLists,List<ReadingTableQuestionAnswerInfo> tableAnswers,List<ReadingTableAnswerRowInfo> tableAnsweRowInfos) { 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.TableQuestions = new TrialReadTableQuestion(); item.TableQuestions.Questions = tableQuestionLists.Where(x => x.ReadingQuestionId == item.Id).OrderBy(x=>x.ShowOrder).ToList(); item.TableQuestions.Questions.ForEach(x => { x.RelationQuestions = tableQuestionLists.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, 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<GetTrialReadingQuestionOutDto>(), Remark = x.Remark, }).ToList(); }); var thisAnswer = tableAnswers.Where(x => x.QuestionId == item.Id).ToList(); var orders = thisAnswer.Select(x => x.RowIndex).Distinct().OrderBy(x => x).ToList(); item.TableQuestions.Answers = new List<Dictionary<string, string>>(); orders.ForEach(x => { Dictionary<string, string> answers = new Dictionary<string, string>(); var rowAnswer = thisAnswer.Where(y => y.RowIndex == x).OrderBy(y => y.ShowOrder).ToList(); rowAnswer.ForEach(z => { answers.Add(z.TableQuestionId.ToString(), z.Answer); }); var rowInfo = tableAnsweRowInfos.Where(y => y.RowIndex == x && y.QuestionId == item.Id).FirstOrDefault(); answers.Add("MeasureData", rowInfo==null?string.Empty:rowInfo.MeasureData); answers.Add("RowIndex", x.ToString()); answers.Add("InstanceId", rowInfo == null ? string.Empty : rowInfo.InstanceId.ToString()); answers.Add("SeriesId", rowInfo == null ? string.Empty : rowInfo.SeriesId.ToString()); answers.Add("IsCurrentTaskAdd", rowInfo == null ? false.ToString() : rowInfo.IsCurrentTaskAdd.ToString()); item.TableQuestions.Answers.Add(answers); }); if (item.Childrens != null && item.Childrens.Count != 0) { item.Childrens.ForEach(x => { this.FindChildQuestion(x, questionlists, tableQuestionLists, tableAnswers, tableAnsweRowInfos); }); } } /// <summary> /// 获取关联的阅片任务 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<(List<GetRelatedVisitTaskOutDto>,object)> GetRelatedVisitTask(GetRelatedVisitTaskInDto inDto) { var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var result = await _visitTaskRepository.Where(x => (x.TrialId == taskInfo.TrialId && x.SubjectId == taskInfo.SubjectId && x.ArmEnum == taskInfo.ArmEnum && x.DoctorUserId == taskInfo.DoctorUserId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect && x.IsAnalysisCreate == taskInfo.IsAnalysisCreate && x.ReadingCategory == ReadingCategory.Visit) || x.Id == inDto.VisitTaskId) .Select(x => new GetRelatedVisitTaskOutDto() { TaskBlindName=x.TaskBlindName, TaskName=x.TaskName, VisitId=x.SourceSubjectVisitId, VisitTaskId=x.Id, VisitTaskNum=x.VisitTaskNum, IsCurrentTask=x.Id==inDto.VisitTaskId, }).OrderBy(x => x.VisitTaskNum).ToListAsync(); return (result, new { ReadingTaskState = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => x.ReadingTaskState).FirstOrDefaultAsync() }) ; } #endregion #region 肿瘤学阅片相关 /// <summary> /// 获取肿瘤学任务信息 /// </summary> /// <param name="inDto"></param> /// <returns></returns> /// <exception cref="BusinessValidationFailedException"></exception> [HttpPost] public async Task<GetOncologyReadingInfoOutDto> GetOncologyReadingInfo(GetOncologyReadingInfoInDto inDto) { var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); if (taskInfo.ReadingCategory != ReadingCategory.Oncology) { throw new BusinessValidationFailedException("当前任务不是肿瘤学任务"); } var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == taskInfo.TrialId && x.IsConfirm).FirstOrDefaultAsync(); if (trialCriterion == null) { throw new BusinessValidationFailedException("请先确认一个项目标准。"); } GetOncologyReadingInfoOutDto result = new GetOncologyReadingInfoOutDto() { TrialEvaluationResult= trialCriterion.EvaluationResult, IsShowDetail= trialCriterion.IsShowDetail, TrialEvaluationReason = trialCriterion.EvaluationReason.IsNullOrEmpty()? ReadingCommon.EvaluationReason : trialCriterion.EvaluationReason, OncologyTaskId = inDto.VisitTaskId, ReadingTaskState= taskInfo.ReadingTaskState, }; // 先找到是R1还是R2的阅片 先找到全局阅片 var globalTaskInfo= await _visitTaskRepository .Where(x => x.SubjectId == taskInfo.SubjectId&& x.TaskState== TaskState.Effect&& x.ReadingCategory== ReadingCategory.Global&& x.VisitTaskNum< taskInfo.VisitTaskNum ).OrderByDescending(x=>x.VisitTaskNum) .FirstNotNullAsync(); // 最后取哪组的数据 VisitTask visitTask = new VisitTask(); // 判断是否产生裁判 if (globalTaskInfo.JudgeVisitTaskId == null) { visitTask = globalTaskInfo; } else { var judgeResultTaskId = await _visitTaskRepository.Where(x => x.Id == globalTaskInfo.JudgeVisitTaskId).Select(x => x.JudgeResultTaskId).FirstOrDefaultAsync(); if (judgeResultTaskId == null) { throw new BusinessValidationFailedException("异常,裁判结果为null"); } visitTask = await _visitTaskRepository.Where(x=>x.Id== judgeResultTaskId).FirstOrDefaultAsync(); } result.GlobalTaskId = visitTask.Id; result.SubjectId = visitTask.SubjectId; // 获取全局阅片信息 var globalTaskReadingInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() { UsingOriginalData = true, VisitTaskId = visitTask.Id }); // 找到对应的访视 List<OncologyVisitTaskInfo> oncologyVisits = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.SubjectId == visitTask.SubjectId && x.IsAnalysisCreate == visitTask.IsAnalysisCreate && x.TaskState == TaskState.Effect && x.VisitTaskNum < visitTask.VisitTaskNum) .Where(x => x.DoctorUserId == visitTask.DoctorUserId) .OrderBy(x => x.VisitTaskNum).Select(x => new OncologyVisitTaskInfo() { VisitName = x.SourceSubjectVisit.VisitName, VisitTaskId = x.Id, // QuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder) //.Select(y => new OncologyQuestion() //{ // QuestionId = y.ReadingQuestionTrialId, // QuestionName = y.ReadingQuestionTrial.QuestionName, // Answer = y.GlobalChangeAnswer //}).ToList() }).ToListAsync(); var oncologyReadingQuestions = await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == inDto.VisitTaskId).ToListAsync(); oncologyVisits.ForEach(x => { var oncologyData = oncologyReadingQuestions.Where(y => y.VisitTaskId == x.VisitTaskId).FirstOrDefault(); if (oncologyData != null) { x.EvaluationResult = oncologyData.EvaluationResult; x.EvaluationReason = oncologyData.EvaluationReason; } x.QuestionList = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Where(x => x.QuestionId != null) .Select(y => new OncologyQuestion { QuestionId = y.QuestionId ?? default(Guid), QuestionName = y.QuestionName, Answer = y.Answer }).ToList(); x.IsHaveChange = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Any(y => y.IsHaveChange); x.VisitRemark = globalTaskReadingInfo.TaskList.Where(y => x.VisitTaskId == y.VisitTaskId).SelectMany(y => y.AfterQuestionList).Where(y => y.QuestionId == null).Select(x => x.Answer).FirstOrDefault() ?? string.Empty; }); result.OncologyVisits = oncologyVisits; return result; } /// <summary> /// 修改肿瘤学阅片信息 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<IResponseOutput> SetOncologyReadingInfo(SetOncologyReadingInfoInDto inDto) { await _readingOncologyTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.OncologyTaskId == inDto.OncologyTaskId); var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.OncologyTaskId).FirstNotNullAsync(); List<ReadingOncologyTaskInfo> readingOncologies = inDto.OncologyQuestionList.Select(x => new ReadingOncologyTaskInfo() { EvaluationReason = x.EvaluationReason, SubjectId = taskInfo.SubjectId, EvaluationResult = x.EvaluationResult, OncologyTaskId = inDto.OncologyTaskId, TrialId = taskInfo.TrialId, VisitTaskId = x.VisitTaskId }).ToList(); await _readingOncologyTaskInfoRepository.AddRangeAsync(readingOncologies); var result = await _readingOncologyTaskInfoRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } #endregion #region 全局阅片相关 /// <summary> /// 保存全局阅片结果 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<IResponseOutput> SaveGlobalReadingInfo(SaveGlobalReadingInfoInDto inDto) { var visitTaskId = inDto.QuestionList.Select(x => x.VisitTaskId).FirstOrDefault(); await _readingGlobalTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.GlobalTaskId == inDto.GlobalTaskId&&x.TaskId== visitTaskId); foreach(var item in inDto.QuestionList) { await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == item.QuestionId, x => new ReadingTaskQuestionAnswer() { GlobalChangeAnswer = item.Answer }); } await _readingGlobalTaskInfoRepository.AddRangeAsync(inDto.QuestionList.Select(x => new ReadingGlobalTaskInfo() { Answer = x.Answer, QuestionId = x.QuestionId, SubjectId = inDto.SubjectId, GlobalTaskId = inDto.GlobalTaskId, TaskId = x.VisitTaskId, TrialId = inDto.TrialId, }).ToList()); var result = await _readingGlobalTaskInfoRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } /// <summary> /// 获取全局阅片信息 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<GetGlobalReadingInfoOutDto> GetGlobalReadingInfo(GetGlobalReadingInfoInDto inDto) { var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); if (taskInfo.ReadingCategory != ReadingCategory.Global) { throw new BusinessValidationFailedException("当前任务不是全局阅片任务"); } GetGlobalReadingInfoOutDto result = new GetGlobalReadingInfoOutDto() { GlobalTaskId = inDto.VisitTaskId, ReadingTaskState=taskInfo.ReadingTaskState, }; // 一致性分析按照doctorId 其他按照分组 result.TaskList = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit && x.SubjectId == taskInfo.SubjectId &&x.IsAnalysisCreate== taskInfo.IsAnalysisCreate&&x.TaskState==TaskState.Effect && x.VisitTaskNum < taskInfo.VisitTaskNum) .Where(x => x.DoctorUserId == taskInfo.DoctorUserId) .OrderBy(x => x.VisitTaskNum).Select(x => new GlobalVisitInfo() { VisitName = x.SourceSubjectVisit.VisitName, VisitTaskId = x.Id, ArmEnum= taskInfo.ArmEnum, VisitNum =x.SourceSubjectVisit.VisitNum, VisitId = x.SourceSubjectVisitId.Value, BeforeQuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder) .Select(y => new GlobalQuestionInfo() { QuestionId = y.ReadingQuestionTrialId, QuestionName = y.ReadingQuestionTrial.QuestionName, AnswerGroup=y.ReadingQuestionTrial.AnswerGroup, AnswerCombination=y.ReadingQuestionTrial.AnswerCombination, JudgeType=y.ReadingQuestionTrial.JudgeType, Type = y.ReadingQuestionTrial.Type, TypeValue = y.ReadingQuestionTrial.TypeValue, Answer = y.Answer }).ToList() }).ToListAsync(); var globalReadingQuestion = await _readingGlobalTaskInfoRepository.Where(x => x.GlobalTaskId == inDto.VisitTaskId).ToListAsync(); result.TaskList.ForEach(x => { x.AfterQuestionList = x.BeforeQuestionList.GroupJoin( globalReadingQuestion , l => new { a = l.QuestionId, b = x.VisitTaskId } , r => new { a = r.QuestionId, b = r.TaskId } , (l, r) => new { question = l, global = r }) .SelectMany(lr => lr.global.DefaultIfEmpty(), (lr, r) => new GlobalQuestionInfo { Answer = lr.global == null|| lr.global.Count()==0 ? (inDto.UsingOriginalData?lr.question.Answer: string.Empty) : (lr.global.Select(x => x.Answer).FirstOrDefault().IsNullOrEmpty()&& inDto.UsingOriginalData? lr.question.Answer:lr.global.Select(x => x.Answer).FirstOrDefault() ), IsHaveChange= lr.global==null? false: lr.global.Any(), QuestionId = lr.question.QuestionId, QuestionName = lr.question.QuestionName, Type = lr.question.Type, AnswerGroup = lr.question.AnswerGroup, AnswerCombination = lr.question.AnswerCombination, JudgeType = lr.question.JudgeType, TypeValue = lr.question.TypeValue, }).ToList(); var reason = new GlobalQuestionInfo() { Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.QuestionId == null).Select(x => x.Answer).FirstOrDefault() ?? String.Empty, QuestionName = "原因", Type = "input", }; x.AfterQuestionList.Add(reason); }); return result; } #endregion #region 获取下一个阅片任务 /// <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 :default(Guid) , VisitNum = x.VisitTaskNum, }).FirstOrDefaultAsync(); } else if (inDto.SubjectId != null) { #region 之前的 //var subjectList = await _subjectRepository.Where(t => t.TrialId == inDto.TrialId) //.Select(s => new SubjectTask() //{ // SubjectId = s.Id, // UnReadTaskCount = s.SubjectVisitTaskList.Count(t => t.ReadingTaskState != ReadingTaskState.HaveSigned && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect), //}).OrderBy(x => x.SubjectId).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 && 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 == null ? default(Guid) : x.ReadModule.SubjectVisitId, // VisitNum = x.VisitTaskNum, //}).OrderBy(x => x.VisitNum).ThenBy(x => x.ReadingCategory); #endregion var subjectTaskList = await _visitTaskService.GetOrderReadingIQueryable(inDto.TrialId).Item2.ToListAsync(); var index = 0; subjectTaskList.ForEach(x => { x.Index = index; index++; }); var subjectIndex = subjectTaskList.Where(x => x.SubjectId == inDto.SubjectId&&x.SubjectCode==inDto.SubjectCode).Select(x => x.Index).FirstOrDefault(); var currentSubject = subjectTaskList.Where(x => x.Index >= subjectIndex&&!x.ExistReadingApply).OrderBy(x => x.Index).FirstOrDefault(); if (currentSubject == null) { throw new BusinessValidationFailedException("任务都已经完成"); } task = currentSubject.UnReadTaskList.Select(x => new GetReadingTaskDto() { ReadingCategory = x.ReadingCategory, SubjectCode = currentSubject.SubjectCode, SubjectId = currentSubject.SubjectId, TaskBlindName = x.TaskBlindName, VisitNum = x.VisitNum, VisistId = x.VisistId ?? default(Guid), VisitTaskId = x.Id }).FirstOrDefault(); } 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 == null ? default(Guid) : x.ReadModule.SubjectVisitId, VisitNum = x.VisitTaskNum, 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(); var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == task.VisitTaskId).FirstNotNullAsync(); task.SubjectCode = visitTaskInfo.BlindSubjectCode.IsNullOrEmpty() ? task.SubjectCode : visitTaskInfo.BlindSubjectCode; var trialInfo = await _trialRepository.Where(x => x.Id == visitTaskInfo.TrialId).Select(x => new { x.IsReadingShowPreviousResults, x.IsReadingShowSubjectInfo, x.ClinicalInformationTransmissionEnum, }).FirstOrDefaultAsync(); task.IsReadingShowPreviousResults = trialInfo.IsReadingShowPreviousResults; task.IsReadingShowSubjectInfo = trialInfo.IsReadingShowSubjectInfo; return task; } #endregion #region 获取阅片非Dicom文件 /// <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; } var taskInfo = await _visitTaskRepository.Where(x => x.Id == task.VisitTaskId).FirstNotNullAsync(); return (result, new { VisitTaskId = task.VisitTaskId, SubjectId = task.SubjectId, SubjectCode = taskInfo.BlindSubjectCode.IsNullOrEmpty()? task.SubjectCode: taskInfo.BlindSubjectCode, ReadingCategory = task.ReadingCategory, TaskBlindName = task.TaskBlindName, IsReadingShowPreviousResults = trialInfo.IsReadingShowPreviousResults, IsReadingShowSubjectInfo = trialInfo.IsReadingShowSubjectInfo, IsExistsClinicalData = isExistsClinicalData, }); } #endregion #region 获取项目已确认的标准 /// <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) .Select(x => new GetTrialConfirmCriterionListOutDto() { ReadingQuestionCriterionTrialId = x.Id, ReadingQuestionCriterionTrialName = x.CriterionName }).ToListAsync(); return result; } #endregion #region 配置裁判问题相关 /// <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).FirstNotNullAsync(); 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); } #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) { 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).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> /// 或者阅片答案预览 /// </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, IsRequired = data.IsRequired, ShowQuestion = data.ShowQuestion, LesionType=data.LesionType, 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, }; var qusetionList = await query.Where(x => x.ShowQuestion != ShowQuestion.Hide).OrderBy(x => x.ShowOrder).ToListAsync(); return qusetionList; } #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).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, 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, 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 /// <summary> /// 获取阅片的受试者信息 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<GetReadingSubjectInfoOutDto> GetReadingSubjectInfo(GetReadingSubjectInfoInDto inDto) { var visitTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstOrDefaultAsync(); var subjectCode = await _subjectRepository.Where(x => x.Id == visitTask.SubjectId).Select(x => x.Code).FirstOrDefaultAsync(); var trialInfo = await _trialRepository.Where(x => x.Id == visitTask.TrialId).Select(x => new { x.IsReadingShowPreviousResults, x.IsReadingShowSubjectInfo, x.ClinicalInformationTransmissionEnum, }).FirstOrDefaultAsync(); return new GetReadingSubjectInfoOutDto() { VisitTaskId = visitTask.Id, SubjectId = visitTask.SubjectId, SubjectCode = visitTask.BlindSubjectCode.IsNullOrEmpty() ? subjectCode : visitTask.BlindSubjectCode, ReadingCategory = visitTask.ReadingCategory, TaskBlindName = visitTask.TaskBlindName, IsReadingShowPreviousResults = trialInfo.IsReadingShowPreviousResults, IsReadingShowSubjectInfo = trialInfo.IsReadingShowSubjectInfo, }; } #region 获取裁判阅片任务信息 /// <summary> /// 获取裁判阅片任务信息 /// </summary> /// <returns></returns> [HttpPost] public async Task<GetJudgeReadingInfoOutDto> GetJudgeReadingInfo(GetJudgeReadingInfo inDto) { var visitTask = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstOrDefaultAsync(); GetJudgeReadingInfoOutDto judgeInfo = new GetJudgeReadingInfoOutDto() { ReadingTaskState = visitTask.ReadingTaskState, JudgeResultTaskId = visitTask.JudgeResultTaskId, JudgeResultRemark = visitTask.JudgeResultRemark, JudgeResultImagePath = visitTask.JudgeResultImagePath, VisitInfoList = new List<JudgeReadingInfoDto>() }; var judgeDataInfo = await _readingJudgeInfoRepository.Where(x => x.JudgeTaskId == inDto.VisitTaskId).FirstNotNullAsync(); var taskids = new List<Guid>(); taskids.Add(judgeDataInfo.TaskIdOne); taskids.Add(judgeDataInfo.TaskIdTwo); var taskList = await _visitTaskRepository.Where(x => taskids.Contains(x.Id)).OrderBy(x=>x.ArmEnum).ToListAsync(); judgeInfo.VisitTaskArmList = taskList.Select(x => new VisitTaskArm() { ArmEnum = x.ArmEnum, VisitTaskId = x.Id }).ToList(); var visitIds = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).Select(x => new { x.Id, x.ArmEnum, }).ToListAsync(); switch (taskList[0].ReadingCategory) { case ReadingCategory.Visit: JudgeReadingInfoDto judgeReadingInfoDto = new JudgeReadingInfoDto() { VisitId = taskList[0].SourceSubjectVisitId.Value, VisitName = taskList[0].TaskBlindName, VisitTaskInfoList = new List<JudgeReadingQuestion>(), }; foreach (var item in taskList) { judgeReadingInfoDto.VisitTaskInfoList.Add(new JudgeReadingQuestion() { ArmEnum = item.ArmEnum, VisitTaskId = item.Id, JudgeQuestionList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == item.Id && x.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(x => x.ReadingQuestionTrial.ShowOrder) .Select(x => new JudgeQuestion() { Answer = x.Answer, QuestionId = x.ReadingQuestionTrial.Id, QuestionName = x.ReadingQuestionTrial.QuestionName }).ToListAsync(), }); } judgeInfo.VisitInfoList.Add(judgeReadingInfoDto); break; case ReadingCategory.Global: var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() { UsingOriginalData = true, VisitTaskId = taskList[0].Id }); var taskTwoInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() { UsingOriginalData = true, VisitTaskId = taskList[1].Id }); foreach (var item in taskOneInfo.TaskList) { GlobalVisitInfo twoItem = taskTwoInfo.TaskList.Where(x => x.VisitId == item.VisitId).FirstOrDefault(); JudgeReadingInfoDto judgeReadingInfo = new JudgeReadingInfoDto() { VisitId = item.VisitId, VisitName = item.VisitName, VisitTaskInfoList = new List<JudgeReadingQuestion>(), }; var judgeReadingQuestion = new JudgeReadingQuestion() { ArmEnum = item.ArmEnum, VisitTaskId = item.VisitTaskId, GlobalVisitTaskId= taskList[0].Id, JudgeQuestionList = item.AfterQuestionList.Where(x => x.QuestionId != null).Select(x => new JudgeQuestion() { Answer = x.Answer, QuestionId = x.QuestionId.Value, QuestionName = x.QuestionName }).ToList() }; // 加全局是否更新 和访视点注释 judgeReadingQuestion.JudgeQuestionList.Add( new JudgeQuestion() { Answer= item.AfterQuestionList.Any(x=>x.IsHaveChange), QuestionType= JudgeReadingQuestionType.GlobalChange, }); judgeReadingQuestion.JudgeQuestionList.Add(new JudgeQuestion() { Answer = item.AfterQuestionList.Where(x => x.QuestionId==null).Select(x=>x.Answer).FirstOrDefault(), QuestionType = JudgeReadingQuestionType.VisitRemark, }); judgeReadingInfo.VisitTaskInfoList.Add(judgeReadingQuestion); if (twoItem != null) { var rTwoJudge = new JudgeReadingQuestion() { ArmEnum = twoItem.ArmEnum, VisitTaskId = twoItem.VisitTaskId, GlobalVisitTaskId = taskList[1].Id, JudgeQuestionList = twoItem.AfterQuestionList.Where(x => x.QuestionId != null).Select(x => new JudgeQuestion() { Answer = x.Answer, QuestionId = x.QuestionId.Value, QuestionName = x.QuestionName }).ToList() }; // 加全局是否更新 和访视点注释 rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion() { Answer = twoItem.AfterQuestionList.Any(x => x.IsHaveChange), QuestionType = JudgeReadingQuestionType.GlobalChange, }); rTwoJudge.JudgeQuestionList.Add(new JudgeQuestion() { Answer = twoItem.AfterQuestionList.Where(x => x.QuestionId == null).Select(x => x.Answer).FirstOrDefault(), QuestionType = JudgeReadingQuestionType.VisitRemark, }); judgeReadingInfo.VisitTaskInfoList.Add(rTwoJudge); } judgeInfo.VisitInfoList.Add(judgeReadingInfo); } break; } return judgeInfo; } #endregion #region 保存裁判问题 /// <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); } #endregion #region 获取既往结果 /// <summary> /// 获取既往结果 /// </summary> /// <returns></returns> [HttpPost] public async Task<List<GetReadingPastResultListOutDto>> GetReadingPastResultList(GetReadingPastResultListInDto inDto) { var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); var readingPastResultList = await _visitTaskRepository.Where(x => x.TrialId == taskInfo.TrialId && x.SubjectId == taskInfo.SubjectId && x.ArmEnum== taskInfo.ArmEnum && x.Id != inDto.VisitTaskId && x.DoctorUserId == taskInfo.DoctorUserId && x.ReadingTaskState == ReadingTaskState.HaveSigned&& x.TaskState==TaskState.Effect&& x.IsAnalysisCreate == taskInfo.IsAnalysisCreate) .WhereIf(taskInfo.ReadingCategory!=ReadingCategory.Visit,x=>x.ReadingCategory==taskInfo.ReadingCategory) .ProjectTo<GetReadingPastResultListOutDto>(_mapper.ConfigurationProvider).OrderBy(x=>x.VisitTaskNum).ToListAsync(); return readingPastResultList; } #endregion #region 找子问题 /// <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, 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 GetTrialReadingQuestionOutDto { Childrens = new List<GetTrialReadingQuestionOutDto>(), ShowOrder = x.ShowOrder, GroupName = string.Empty, Id = x.Id, 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<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<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(inDto.VisitTaskId, x => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading, }); await _readingTaskQuestionAnswerRepository.AddRangeAsync(readingTaskAnswerList); var result = await _visitTaskRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } #endregion #region 提交问题 /// <summary> /// 提交表格问题 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<IResponseOutput> SubmitTableQuestion(SubmitTableQuestionInDto inDto) { var tableQuestionIds = inDto.AnswerList.Select(x => x.TableQuestionId).ToList(); var questions = await _readingTableQuestionTrialRepository.Where(x => tableQuestionIds.Contains(x.Id) && x.MaxRowCount != null&&x.MaxRowCount!=0).ToListAsync(); foreach (var item in questions) { var answer = inDto.AnswerList.Where(x => x.TableQuestionId == item.Id).Select(x => x.Answer).FirstOrDefault(); var rowCount = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.TableQuestionId == item.Id && x.Answer == answer&&x.RowIndex!=inDto.RowIndex).CountAsync(); if (rowCount > item.MaxRowCount.Value - 1) { throw new BusinessValidationFailedException($"问题{item.QuestionName}最大相同问题数为{item.MaxRowCount.Value},当前已存在{rowCount}条!"); } } var isCurrentTaskAddList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == inDto.QuestionId && x.TrialId == inDto.TrialId && x.RowIndex == inDto.RowIndex).Select(x => x.IsCurrentTaskAdd).ToListAsync(); bool isCurrentTaskAdd = true; if (isCurrentTaskAddList.Count() > 0) { isCurrentTaskAdd = isCurrentTaskAddList[0]; } await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == inDto.QuestionId && x.TrialId == inDto.TrialId && x.RowIndex == inDto.RowIndex); await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == inDto.QuestionId && x.TrialId == inDto.TrialId && x.RowIndex == inDto.RowIndex); List<ReadingTableQuestionAnswer> answerList = inDto.AnswerList.Select(x => new ReadingTableQuestionAnswer() { Answer=x.Answer, Id= NewId.NextGuid(), TrialId=inDto.TrialId, QuestionId=inDto.QuestionId, TableQuestionId=x.TableQuestionId, RowIndex=inDto.RowIndex, VisitTaskId = inDto.VisitTaskId }).ToList(); await _readingTableAnswerRowInfoRepository.AddAsync(new ReadingTableAnswerRowInfo() { Id = NewId.NextGuid(), TrialId = inDto.TrialId, QuestionId = inDto.QuestionId, MeasureData = inDto.MeasureData, IsCurrentTaskAdd= isCurrentTaskAdd, RowIndex = inDto.RowIndex, InstanceId=inDto.InstanceId, SeriesId=inDto.SeriesId, VisitTaskId = inDto.VisitTaskId, }); await _readingTableQuestionAnswerRepository.AddRangeAsync(answerList); await _readingTableQuestionAnswerRepository.SaveChangesAsync(); await this._readingCalculateService.CalculateTask(new CalculateTaskInDto() { IsChangeOtherTask=false, VisitTaskId=inDto.VisitTaskId, }); return ResponseOutput.Ok(true); } /// <summary> /// 提交访视阅片问题 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [NonDynamicMethod] public async Task<IResponseOutput> SubmitVisitTaskQuestions(SubmitVisitTaskQuestionsInDto inDto) { await this.SaveVisitTaskQuestions(inDto); await this.SubmitTaskChangeState(inDto.VisitTaskId); return ResponseOutput.Ok(true); } /// <summary> /// 提交Dicom阅片信息 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [NonDynamicMethod] public async Task<IResponseOutput> SubmitDicomVisitTask(SubmitDicomVisitTaskInDto inDto) { await this.SubmitTaskChangeState(inDto.VisitTaskId); return ResponseOutput.Ok(true); } /// <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 taskInfo = await _visitTaskRepository.Where(x => x.JudgeVisitTaskId == inDto.VisitTaskId).FirstNotNullAsync(); if (taskInfo.ReadingCategory == ReadingCategory.Global) { if (taskInfo.SouceReadModuleId == null) { throw new BusinessValidationFailedException($"当前裁判的全局任务的SouceId为null"); } var visitId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync(); var oncologModuleId = await _readModuleRepository.Where(x => x.SubjectVisitId == visitId && x.ModuleType == ModuleTypeEnum.Oncology).Select(x => x.Id).FirstOrDefaultAsync(); await AddOncologyTask(oncologModuleId); } var result = await _visitTaskRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } /// <summary> /// 提交肿瘤阅片结果 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [NonDynamicMethod] public async Task<IResponseOutput> SubmitOncologyReadingInfo(SubmitOncologyReadingInfoInDto inDto) { //var result = await this.SaveGlobalReadingInfo(inDto); //await FinishReadUpdateState(inDto.OncologyTaskId); await _visitTaskRepository.UpdatePartialFromQueryAsync( inDto.OncologyTaskId, x => new VisitTask() { ReadingTaskState = ReadingTaskState.HaveSigned, SignTime = DateTime.Now, }); await _visitTaskRepository.SaveChangesAsync(); return ResponseOutput.Ok(true); } /// <summary> /// 提交全局阅片结果 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [NonDynamicMethod] public async Task<IResponseOutput> SubmitGlobalReadingInfo(SubmitGlobalReadingInfoInDto inDto) { //var result = await this.SaveGlobalReadingInfo(inDto); await this.SubmitTaskChangeState(inDto.GlobalTaskId); return ResponseOutput.Ok(true) ; } /// <summary> /// 签名提交任务修改状态 /// </summary> /// <param name="visitTaskId"></param> /// <returns></returns> private async Task SubmitTaskChangeState(Guid visitTaskId) { await _visitTaskRepository.UpdatePartialFromQueryAsync( visitTaskId, x => new VisitTask() { ReadingTaskState = ReadingTaskState.HaveSigned, SignTime = DateTime.Now, }); // 触裁判任务 await this.TriggerJudgeQuestion(visitTaskId); // 添加阅片期任务 await this.AddReadingTask(visitTaskId); // 完成阅片修改状态 //await this.FinishReadUpdateState(visitTaskId); await _visitTaskRepository.SaveChangesAsync(); } #endregion /// <summary> /// 完成阅片修改状态 /// </summary> /// <returns></returns> private async Task FinishReadUpdateState(Guid visitTaskId) { //var taskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync(); //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 (!taskInfo.IsAnalysisCreate) { // 任务类型 switch (taskInfo.ReadingCategory) { case ReadingCategory.Visit: needReadList = await _readModuleRepository.Where(x => x.SubjectVisitId == taskInfo.SourceSubjectVisitId&&x.ReadingSetType==ReadingSetType.ImageReading) .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() { OriginalVisitId= visitTaskId, ReadingCategory = GenerateTaskCategory.Global, TrialId = taskInfo.TrialId, ReadingGenerataTaskList = needReadList }) ; break; // 肿瘤学 case ReadingCategory.Global: var subjectVisitId = await _readModuleRepository.Where(x => x.Id == taskInfo.SouceReadModuleId).Select(x => x.SubjectVisitId).FirstOrDefaultAsync(); var oncologyReadId= await _readModuleRepository.Where(x => x.SubjectVisitId == subjectVisitId && x.ModuleType == ModuleTypeEnum.Oncology).Select(x => x.Id).FirstOrDefaultAsync(); await AddOncologyTask(oncologyReadId); break; } } } /// <summary> /// 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑 /// </summary> /// <returns></returns> [NonDynamicMethod] public async Task AddOncologyTask(Guid oncologModuleId) { // 判断是否读片完成 var finishReading = false; var readModuleInfo = await _readModuleRepository.Where(x => x.Id == oncologModuleId && x.ModuleType == ModuleTypeEnum.Oncology).FirstOrDefaultAsync(); // 如果当前是肿瘤学 if (readModuleInfo != null) { // 先找到对应的全局阅片模块Id var globalreadModuleId = await _readModuleRepository.Where(x => x.SubjectVisitId == readModuleInfo.SubjectVisitId && x.ModuleType == ModuleTypeEnum.Global).Select(x => x.Id).FirstOrDefaultAsync(); // 找到一个全局阅片任务是否有裁判任务 var judgeVisitTaskId = await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalreadModuleId && x.TaskState == TaskState.Effect && x.ReadingCategory == ReadingCategory.Global && x.ReadingTaskState == ReadingTaskState.HaveSigned).Select(x => x.JudgeVisitTaskId).FirstOrDefaultAsync(); // 获取系统配置 var readingType = await _trialRepository.Where(x => x.Id == readModuleInfo.TrialId).Select(x => x.ReadingType).FirstOrDefaultAsync(); // 判断阅片是否完成 if (judgeVisitTaskId == null && (await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalreadModuleId && x.TaskState == TaskState.Effect && x.ReadingCategory == ReadingCategory.Global && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate ).CountAsync() == (int)readingType)) { finishReading = true; } else if(judgeVisitTaskId!=null&& (await _visitTaskRepository.AnyAsync(x=>x.Id== judgeVisitTaskId.Value&&x.ReadingTaskState== ReadingTaskState.HaveSigned))) { finishReading = true; } if (finishReading) { // 获取临床数据 var clinicalData = await _readingClinicalDataService.GetReadingClinicalList(new GetReadingClinicalDataListIndto() { SubjectId = readModuleInfo.SubjectId, ReadingId = readModuleInfo.Id, TrialId = readModuleInfo.TrialId, }); // 判断是否临床数据都已经签名 if (!clinicalData.Any(x => !x.IsSign)) { List<ReadingGenerataTaskDTO> needReadList = new List<ReadingGenerataTaskDTO>(); needReadList.Add(new ReadingGenerataTaskDTO() { IsUrgent = readModuleInfo.IsUrgent ?? false, SubjectId = readModuleInfo.SubjectId, ReadingName = readModuleInfo.ModuleName, VisitNum = readModuleInfo.VisitNum, ReadModuleId = readModuleInfo.Id, ReadingCategory = ReadingCategory.Oncology, }); await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand() { ReadingCategory = GenerateTaskCategory.Oncology, TrialId = readModuleInfo.TrialId, ReadingGenerataTaskList = needReadList }); } } } } /// <summary> /// 触发裁判任务(新) /// </summary> /// <param name="visitTaskId"></param> /// <returns></returns> private async Task TriggerJudgeQuestion(Guid visitTaskId) { List<Guid> visitTaskids = new List<Guid>(); var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).AsNoTracking().FirstNotNullAsync(); // 判断是否是一致性核查产生 if (visitTask.IsAnalysisCreate) { visitTaskids=await _visitTaskRepository.Where(x=>x.ArmEnum== visitTask.ArmEnum&&x.TaskState==TaskState.Effect&&x.SourceSubjectVisitId== visitTask.SourceSubjectVisitId &&x.SouceReadModuleId==visitTask.SouceReadModuleId && x.ReadingCategory != ReadingCategory.Judge && x.ReadingTaskState == ReadingTaskState.HaveSigned).Select(x => x.Id).ToListAsync(); } else { // 这里是非一致性分析产生的 visitTaskids = await _visitTaskRepository.Where(x => x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory != ReadingCategory.Judge && x.TaskState== TaskState.Effect && x.IsAnalysisCreate==false && 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(); var noteEqual = false; // 判断项目是否设置了裁判 if (trialInfo.IsArbitrationReading ?? false) { // 判断数量是否为2 是否仲裁 if (visitTaskids.Count == 2) { switch (visitTask.ReadingCategory) { // 访视 case ReadingCategory.Visit: // 查找两个 访视的阅片答案 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.Select(y => y.Answer).ToList(), }).ToList(); noteEqual = ComputeJudgeResult(groupTasks); break; case ReadingCategory.Global: var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() { UsingOriginalData = true, VisitTaskId = visitTaskids[0] }); var taskTwoInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() { UsingOriginalData = true, VisitTaskId = visitTaskids[1] }); // 判断两个任务是否 if (taskOneInfo.TaskList.Count() != taskTwoInfo.TaskList.Count()) { noteEqual = true; } else { foreach (var item in taskOneInfo.TaskList) { GlobalVisitInfo twoItem = taskTwoInfo.TaskList.Where(x => x.VisitId == item.VisitId).FirstOrDefault(); if (twoItem == null) { noteEqual = true; break; } else { var newlist = item.AfterQuestionList.Where(x => x.QuestionId != null).ToList().Union( twoItem.AfterQuestionList.Where(x => x.QuestionId != null).ToList() ).ToList(); List<GroupTaskAnswerDto> globalGroupTasks = newlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup, x.JudgeType, x.AnswerCombination }).Select(x => new GroupTaskAnswerDto { QuestionId = x.Key.QuestionId.Value, AnswerGroup = x.Key.AnswerGroup, AnswerCombination = x.Key.AnswerCombination, JudgeType = x.Key.JudgeType, TaskAnswerList = x.Select(y => y.Answer).ToList(), }).ToList(); noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks); } } } break; } } else { // 这里判断一致性分析产生的全局阅片 if (visitTask.ReadingCategory == ReadingCategory.Global && visitTask.IsAnalysisCreate&&(visitTask.IsSelfAnalysis??false)) { var taskOneInfo = await this.GetGlobalReadingInfo(new GetGlobalReadingInfoInDto() { UsingOriginalData = true, VisitTaskId = visitTask.Id }); // 找到最后一个任务ID var lastTask = taskOneInfo.TaskList.Last(); if (lastTask == null) { noteEqual = true; } else { var query = from questionAnswet in _readingTaskQuestionAnswerRepository.Where(x => x.VisitTask.IsAnalysisCreate==false&& x.VisitTask.DoctorUserId==visitTask.DoctorUserId&& x.VisitTask.TaskState== TaskState.Effect&& (x.VisitTask.SourceSubjectVisitId??default(Guid))== lastTask.VisitId) join question in _readingQuestionTrialRepository.Where(x => x.IsJudgeQuestion) on new { ReadingQuestionTrialId = questionAnswet.ReadingQuestionTrialId } equals new { ReadingQuestionTrialId = question.Id } select new GlobalQuestionInfo() { Answer = questionAnswet.Answer, AnswerGroup = question.AnswerGroup, AnswerCombination = question.AnswerCombination, JudgeType = question.JudgeType, QuestionId = question.Id, }; var visitTaskQuestions =await query.ToListAsync(); var newlist = visitTaskQuestions.Where(x => x.QuestionId != null).ToList().Union( lastTask.AfterQuestionList.Where(x => x.QuestionId != null).ToList() ).ToList(); List<GroupTaskAnswerDto> globalGroupTasks = newlist.GroupBy(x => new { x.QuestionId, x.AnswerGroup, x.JudgeType, x.AnswerCombination }).Select(x => new GroupTaskAnswerDto { QuestionId = x.Key.QuestionId.Value, AnswerGroup = x.Key.AnswerGroup, AnswerCombination = x.Key.AnswerCombination, JudgeType = x.Key.JudgeType, TaskAnswerList = x.Select(y => y.Answer).ToList(), }).ToList(); noteEqual = noteEqual || ComputeJudgeResult(globalGroupTasks); } } } } 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> /// 计算返回的结果 为True表示不相等 /// </summary> /// <param name="groupTasks"></param> /// <returns></returns> private bool ComputeJudgeResult(List<GroupTaskAnswerDto> groupTasks) { 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 != taskAnswer2) { 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}|")); var itemAnswerGroupsitem2 = answerGroupList.Where(x => x.GroupValue.Contains($"|{taskAnswer2}|")); 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) && x.AnswerGroupB.Contains(taskAnswer2)) { noteEqual = true; } if (x.AnswerGroupB.Contains(taskAnswer1) && x.AnswerGroupA.Contains(taskAnswer2)) { noteEqual = true; } }); break; } } } } return noteEqual; } /// <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 }); } } }