diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index dcc53f8e9..8b0bb2450 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -7820,9 +7820,39 @@
+
+ 全局阅片
+
IR影像阅片
+
+ 裁判
+
+
+ 肿瘤学
+
+
+
+
+ 提交全局阅片结果
+
+
+
+
+
+
+ 保存全局阅片结果
+
+
+
+
+
+
+ 获取全局阅片信息
+
+
+
@@ -7911,35 +7941,6 @@
-
-
- 获取肿瘤学任务信息
-
-
-
-
-
-
-
- 修改肿瘤学阅片信息
-
-
-
-
-
-
- 保存全局阅片结果
-
-
-
-
-
-
- 获取全局阅片信息
-
-
-
-
获取下一个阅片任务
@@ -7961,20 +7962,6 @@
-
-
- 获取项目标准的裁判问题
-
-
-
-
-
-
- 设置裁判问题的答案分组
-
-
-
-
获取项目的阅片问题ECRF预览
@@ -8019,19 +8006,6 @@
-
-
- 获取裁判阅片任务信息
-
-
-
-
-
- 保存裁判问题
-
-
-
-
获取既往结果
@@ -8081,27 +8055,6 @@
-
-
- 提交裁判问题
-
-
-
-
-
-
- 提交肿瘤阅片结果
-
-
-
-
-
-
- 提交全局阅片结果
-
-
-
-
签名提交任务修改状态
@@ -8109,22 +8062,58 @@
+
+
+ 完成阅片修改状态
+
+
+
添加阅片期任务
-
+
- 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑
+ 验证任务是否签名
+
+
+
+
+
+
+
+ 获取项目标准的裁判问题
+
+
+
+
+
+
+ 设置裁判问题的答案分组
+
+
+
+
+
+
+ 获取裁判阅片任务信息
-
+
- 添加裁判任务
+ 保存裁判问题
+
+
+
+
+
+ 提交裁判问题
+
+
@@ -8149,10 +8138,31 @@
-
+
- 完成阅片修改状态
+ 获取肿瘤学任务信息
+
+
+
+
+
+ 修改肿瘤学阅片信息
+
+
+
+
+
+
+ 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑
+
+
+
+
+
+ 提交肿瘤阅片结果
+
+
@@ -8274,7 +8284,7 @@
- 设置标准字典
+ 设置标准字典(系统用)
diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs
new file mode 100644
index 000000000..3974caf38
--- /dev/null
+++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingGlobalTaskService.cs
@@ -0,0 +1,209 @@
+using IRaCIS.Core.Domain.Share;
+using Microsoft.AspNetCore.Mvc;
+using IRaCIS.Core.Application.Service.Reading.Dto;
+using MassTransit;
+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;
+
+namespace IRaCIS.Application.Services
+{
+
+ ///
+ /// 全局阅片
+ ///
+ public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
+ {
+ ///
+ /// 提交全局阅片结果
+ ///
+ ///
+ ///
+ //[NonDynamicMethod]
+ public async Task SubmitGlobalReadingInfo(SubmitGlobalReadingInfoInDto inDto)
+ {
+ //var result = await this.SaveGlobalReadingInfo(inDto);
+ await VerifyTaskIsSign(inDto.GlobalTaskId);
+ await this.SubmitTaskChangeState(inDto.GlobalTaskId);
+
+ return ResponseOutput.Ok(true);
+ }
+
+ #region 全局阅片相关
+ ///
+ /// 保存全局阅片结果
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task SaveGlobalReadingInfo(SaveGlobalReadingInfoInDto inDto)
+ {
+ var visitTaskId = inDto.QuestionList.Select(x => x.VisitTaskId).FirstOrDefault();
+
+ foreach (var item in inDto.QuestionList)
+ {
+
+ await _readingGlobalTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.GlobalTaskId == inDto.GlobalTaskId && x.TaskId == visitTaskId && x.GlobalAnswerType == item.GlobalAnswerType && x.QuestionId == item.QuestionId);
+
+ 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,
+ GlobalAnswerType = x.GlobalAnswerType,
+ TaskId = x.VisitTaskId,
+ TrialId = inDto.TrialId,
+ }).ToList());
+
+ await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.GlobalTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading });
+
+ var result = await _readingGlobalTaskInfoRepository.SaveChangesAsync();
+ return ResponseOutput.Ok(result);
+
+ }
+
+
+ ///
+ /// 获取全局阅片信息
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task 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,
+ GlobalUpdateType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == taskInfo.TrialReadingCriterionId).Select(x => x.GlobalUpdateType).FirstOrDefaultAsync(),
+
+ };
+
+ // 一致性分析按照doctorId 其他按照分组
+
+ result.TaskList = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
+ x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId &&
+ 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,
+ BlindName = x.SourceSubjectVisit.BlindName,
+ 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,
+ QuestionType = y.ReadingQuestionTrial.QuestionType,
+ QuestionGenre = y.ReadingQuestionTrial.QuestionGenre,
+ DictionaryCode = y.ReadingQuestionTrial.DictionaryCode,
+
+
+ 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,
+ QuestionType = lr.question.QuestionType,
+ QuestionGenre = lr.question.QuestionGenre,
+ DictionaryCode = lr.question.DictionaryCode,
+ Type = lr.question.Type,
+ GlobalAnswerType = GlobalAnswerType.Question,
+ AnswerGroup = lr.question.AnswerGroup,
+ AnswerCombination = lr.question.AnswerCombination,
+ JudgeType = lr.question.JudgeType,
+ TypeValue = lr.question.TypeValue,
+
+ }).ToList();
+
+ x.AgreeOrNot = new List()
+ {
+ new GlobalQuestionInfo()
+ {
+ Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == GlobalAnswerType.AgreeOrNot).Select(x => x.Answer).FirstOrDefault() ?? "1",
+ QuestionName = "是否同意访视整体评估",
+ Type = "input",
+ GlobalAnswerType=GlobalAnswerType.AgreeOrNot,
+
+ }
+
+ };
+
+ List questionTypes = new List()
+ {
+ new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.UpdateType,QuestionName="评估更新类型" },
+ new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.Reason,QuestionName="全局阅片备注" },
+ //new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.AgreeOrNot,QuestionName="是否同意访视结果" },
+
+ };
+
+
+ foreach (var item in questionTypes)
+ {
+ x.AfterQuestionList.Add(new GlobalQuestionInfo()
+ {
+ Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == item.GlobalAnswerType).Select(x => x.Answer).FirstOrDefault() ?? string.Empty,
+ QuestionName = item.QuestionName,
+ Type = "input",
+ GlobalAnswerType = item.GlobalAnswerType,
+
+ });
+ }
+
+
+
+ });
+
+
+
+ return result;
+ }
+ #endregion
+ }
+}
diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
similarity index 64%
rename from IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs
rename to IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
index 1d97f78fc..dd9b0aa4c 100644
--- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
@@ -17,7 +17,7 @@ namespace IRaCIS.Application.Services
/// IR影像阅片
///
[ApiExplorerSettings(GroupName = "Reading")]
- public class ReadingImageTaskService : BaseService, IReadingImageTaskService
+ public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
{
private readonly IRepository _noneDicomStudyRepository;
@@ -810,328 +810,9 @@ namespace IRaCIS.Application.Services
#endregion
- #region 肿瘤学阅片相关
-
- ///
- /// 获取肿瘤学任务信息
- ///
- ///
- ///
- ///
- [HttpPost]
- public async Task 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.Id== taskInfo.TrialReadingCriterionId).FirstOrDefaultAsync();
-
-
- 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.TrialReadingCriterionId==taskInfo.TrialReadingCriterionId &&
- 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 oncologyVisits = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
- x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId &&
- 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;
-
- }
-
- ///
- /// 修改肿瘤学阅片信息
- ///
- ///
- ///
- [HttpPost]
- public async Task SetOncologyReadingInfo(SetOncologyReadingInfoInDto inDto)
- {
- await _readingOncologyTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.OncologyTaskId == inDto.OncologyTaskId);
-
- var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.OncologyTaskId).FirstNotNullAsync();
-
- List 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);
-
- await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.OncologyTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading });
-
- var result = await _readingOncologyTaskInfoRepository.SaveChangesAsync();
-
- return ResponseOutput.Ok(result);
-
-
- }
- #endregion
-
- #region 全局阅片相关
- ///
- /// 保存全局阅片结果
- ///
- ///
- ///
- [HttpPost]
- public async Task SaveGlobalReadingInfo(SaveGlobalReadingInfoInDto inDto)
- {
- var visitTaskId = inDto.QuestionList.Select(x => x.VisitTaskId).FirstOrDefault();
-
- foreach (var item in inDto.QuestionList)
- {
-
- await _readingGlobalTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.GlobalTaskId == inDto.GlobalTaskId && x.TaskId == visitTaskId && x.GlobalAnswerType == item.GlobalAnswerType && x.QuestionId == item.QuestionId);
-
- 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,
- GlobalAnswerType=x.GlobalAnswerType,
- TaskId = x.VisitTaskId,
- TrialId = inDto.TrialId,
- }).ToList());
-
- await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.GlobalTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading });
-
- var result = await _readingGlobalTaskInfoRepository.SaveChangesAsync();
- return ResponseOutput.Ok(result);
-
- }
-
-
- ///
- /// 获取全局阅片信息
- ///
- ///
- ///
- [HttpPost]
- public async Task 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,
- GlobalUpdateType=await _readingQuestionCriterionTrialRepository.Where(x=>x.Id==taskInfo.TrialReadingCriterionId).Select(x=>x.GlobalUpdateType).FirstOrDefaultAsync(),
-
- };
-
- // 一致性分析按照doctorId 其他按照分组
-
- result.TaskList = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
- x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId &&
- 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,
- BlindName=x.SourceSubjectVisit.BlindName,
- 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,
- QuestionType=y.ReadingQuestionTrial.QuestionType,
- QuestionGenre=y.ReadingQuestionTrial.QuestionGenre,
- DictionaryCode=y.ReadingQuestionTrial.DictionaryCode,
-
-
- 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,
- QuestionType = lr.question.QuestionType,
- QuestionGenre = lr.question.QuestionGenre,
- DictionaryCode = lr.question.DictionaryCode,
- Type = lr.question.Type,
- GlobalAnswerType=GlobalAnswerType.Question,
- AnswerGroup = lr.question.AnswerGroup,
- AnswerCombination = lr.question.AnswerCombination,
- JudgeType = lr.question.JudgeType,
- TypeValue = lr.question.TypeValue,
-
- }).ToList();
-
- x.AgreeOrNot = new List()
- {
- new GlobalQuestionInfo()
- {
- Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == GlobalAnswerType.AgreeOrNot).Select(x => x.Answer).FirstOrDefault() ?? "1",
- QuestionName = "是否同意访视整体评估",
- Type = "input",
- GlobalAnswerType=GlobalAnswerType.AgreeOrNot,
-
- }
-
- };
-
- List questionTypes = new List()
- {
- new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.UpdateType,QuestionName="评估更新类型" },
- new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.Reason,QuestionName="全局阅片备注" },
- //new GetGlobalQuestionType (){GlobalAnswerType=GlobalAnswerType.AgreeOrNot,QuestionName="是否同意访视结果" },
-
- };
-
-
- foreach (var item in questionTypes)
- {
- x.AfterQuestionList.Add(new GlobalQuestionInfo()
- {
- Answer = globalReadingQuestion.Where(y => y.TaskId == x.VisitTaskId && y.GlobalAnswerType == item.GlobalAnswerType).Select(x => x.Answer).FirstOrDefault() ?? string.Empty,
- QuestionName = item.QuestionName,
- Type = "input",
- GlobalAnswerType=item.GlobalAnswerType,
-
- });
- }
-
-
-
- });
-
-
-
- return result;
- }
- #endregion
#region 获取下一个阅片任务
///
@@ -1385,60 +1066,7 @@ namespace IRaCIS.Application.Services
}
#endregion
- #region 配置裁判问题相关
-
- ///
- /// 获取项目标准的裁判问题
- ///
- ///
- ///
- [HttpPost]
- public async Task<(List, object)> GetTrialCriterionJudgeQuestionList(GetTrialCriterionJudgeQuestionListInDto inDto)
- {
- var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id==inDto.TrialReadingCriterionId).FirstNotNullAsync();
-
- var result = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && 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>(x.AnswerGroup.IsNullOrEmpty() ? "[]" : x.AnswerGroup),
- AnswerCombination = JsonConvert.DeserializeObject>(x.AnswerCombination.IsNullOrEmpty() ? "[]" : x.AnswerCombination),
- QuestionName = x.QuestionName,
- PageName = x.ReadingCriterionPage.PageName,
- TypeValue = x.TypeValue,
- JudgeType = x.JudgeType,
- ReadingQuestionTrialId = x.Id
- }).ToListAsync();
-
-
- return (result, new
- {
- IsSign = trialCriterion.ReadingInfoSignTime != null,
- });
-
- }
-
- ///
- /// 设置裁判问题的答案分组
- ///
- ///
- ///
- [HttpPost]
- public async Task 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
+
@@ -1724,194 +1352,7 @@ namespace IRaCIS.Application.Services
- #region 获取裁判阅片任务信息
- ///
- /// 获取裁判阅片任务信息
- ///
- ///
- [HttpPost]
- public async Task 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()
- };
-
- var judgeDataInfo = await _readingJudgeInfoRepository.Where(x => x.JudgeTaskId == inDto.VisitTaskId).FirstNotNullAsync();
-
- var taskids = new List();
-
- 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(),
- };
-
- 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(),
- };
-
- 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 保存裁判问题
- ///
- /// 保存裁判问题
- ///
- ///
- ///
- [HttpPost]
- public async Task 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
+
@@ -2317,83 +1758,13 @@ namespace IRaCIS.Application.Services
return ResponseOutput.Ok(true);
}
- ///
- /// 提交裁判问题
- ///
- ///
- ///
- [NonDynamicMethod]
- public async Task SubmitJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto)
- {
- await VerifyTaskIsSign(inDto.VisitTaskId);
- 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);
- }
+
- ///
- /// 提交肿瘤阅片结果
- ///
- ///
- ///
- [NonDynamicMethod]
- public async Task SubmitOncologyReadingInfo(SubmitOncologyReadingInfoInDto inDto)
- {
- await VerifyTaskIsSign(inDto.OncologyTaskId);
- //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);
- }
-
-
- ///
- /// 提交全局阅片结果
- ///
- ///
- ///
- //[NonDynamicMethod]
- public async Task SubmitGlobalReadingInfo(SubmitGlobalReadingInfoInDto inDto)
- {
- //var result = await this.SaveGlobalReadingInfo(inDto);
- await VerifyTaskIsSign(inDto.GlobalTaskId);
- await this.SubmitTaskChangeState(inDto.GlobalTaskId);
-
- return ResponseOutput.Ok(true) ;
- }
+
///
/// 签名提交任务修改状态
@@ -2492,413 +1863,10 @@ namespace IRaCIS.Application.Services
}
- ///
- /// 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑
- ///
- ///
- [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 _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModuleInfo.TrialReadingCriterionId).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 && x.TrialReadingCriterionId == readModuleInfo.TrialReadingCriterionId
- ).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 needReadList = new List();
-
- 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
- });
- }
- }
-
-
-
- }
- }
-
- #endregion
-
-
-
- #region 阅片任务 -裁判任务的生成和触发
-
-
-
-
-
- ///
- /// 添加裁判任务
- ///
- ///
- 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
- });
- }
-
-
-
- ///
- /// 触发裁判任务(新)
- ///
- ///
- ///
- private async Task TriggerJudgeQuestion(Guid visitTaskId)
- {
- List visitTaskids = new List();
-
- 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 criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == visitTask.TrialReadingCriterionId).Select(x => new
- {
- x.IsArbitrationReading,
- x.ArbitrationRule
- }).FirstNotNullAsync();
-
- var noteEqual = false;
-
- // 判断项目是否设置了裁判
- if (criterionInfo.IsArbitrationReading)
- {
- // 判断数量是否为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 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 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 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 && criterionInfo.ArbitrationRule == ArbitrationRule.Visit) || (visitTask.SouceReadModuleId != null && criterionInfo.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();
- }
- }
- }
-
-
-
-
- ///
- /// 计算返回的结果 为True表示不相等
- ///
- ///
- ///
- private bool ComputeJudgeResult(List 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>(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>(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;
- }
-
- #endregion
+
#region 阅片任务 签名验证
diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs
new file mode 100644
index 000000000..298817c40
--- /dev/null
+++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingJudgeTaskService.cs
@@ -0,0 +1,617 @@
+using IRaCIS.Core.Domain.Share;
+using Microsoft.AspNetCore.Mvc;
+using IRaCIS.Core.Application.Service.Reading.Dto;
+using MassTransit;
+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;
+
+namespace IRaCIS.Application.Services
+{
+
+ ///
+ /// 裁判
+ ///
+ public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
+ {
+ #region 配置裁判问题相关
+
+ ///
+ /// 获取项目标准的裁判问题
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task<(List, object)> GetTrialCriterionJudgeQuestionList(GetTrialCriterionJudgeQuestionListInDto inDto)
+ {
+ var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();
+
+ var result = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId && 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>(x.AnswerGroup.IsNullOrEmpty() ? "[]" : x.AnswerGroup),
+ AnswerCombination = JsonConvert.DeserializeObject>(x.AnswerCombination.IsNullOrEmpty() ? "[]" : x.AnswerCombination),
+ QuestionName = x.QuestionName,
+ PageName = x.ReadingCriterionPage.PageName,
+ TypeValue = x.TypeValue,
+ JudgeType = x.JudgeType,
+ ReadingQuestionTrialId = x.Id
+ }).ToListAsync();
+
+
+ return (result, new
+ {
+ IsSign = trialCriterion.ReadingInfoSignTime != null,
+ });
+
+ }
+
+ ///
+ /// 设置裁判问题的答案分组
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task 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 获取裁判阅片任务信息
+ ///
+ /// 获取裁判阅片任务信息
+ ///
+ ///
+ [HttpPost]
+ public async Task 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()
+ };
+
+ var judgeDataInfo = await _readingJudgeInfoRepository.Where(x => x.JudgeTaskId == inDto.VisitTaskId).FirstNotNullAsync();
+
+ var taskids = new List();
+
+ 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(),
+ };
+
+ 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(),
+ };
+
+ 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 保存裁判问题
+ ///
+ /// 保存裁判问题
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task 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
+
+
+ ///
+ /// 提交裁判问题
+ ///
+ ///
+ ///
+ [NonDynamicMethod]
+ public async Task SubmitJudgeVisitTaskResult(SaveJudgeVisitTaskResult inDto)
+ {
+ await VerifyTaskIsSign(inDto.VisitTaskId);
+ 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);
+ }
+
+ ///
+ /// 触发裁判任务(新)
+ ///
+ ///
+ ///
+ private async Task TriggerJudgeQuestion(Guid visitTaskId)
+ {
+ List visitTaskids = new List();
+
+ 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 criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == visitTask.TrialReadingCriterionId).Select(x => new
+ {
+ x.IsArbitrationReading,
+ x.ArbitrationRule
+ }).FirstNotNullAsync();
+
+ var noteEqual = false;
+
+ // 判断项目是否设置了裁判
+ if (criterionInfo.IsArbitrationReading)
+ {
+ // 判断数量是否为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 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 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 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 && criterionInfo.ArbitrationRule == ArbitrationRule.Visit) || (visitTask.SouceReadModuleId != null && criterionInfo.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();
+ }
+ }
+ }
+
+
+
+
+ ///
+ /// 计算返回的结果 为True表示不相等
+ ///
+ ///
+ ///
+ private bool ComputeJudgeResult(List 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>(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>(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;
+ }
+
+ ///
+ /// 添加裁判任务
+ ///
+ ///
+ 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
+ });
+ }
+ }
+}
diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs
new file mode 100644
index 000000000..61f91fe24
--- /dev/null
+++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs
@@ -0,0 +1,283 @@
+using IRaCIS.Core.Domain.Share;
+using Microsoft.AspNetCore.Mvc;
+using IRaCIS.Core.Application.Service.Reading.Dto;
+using MassTransit;
+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;
+
+namespace IRaCIS.Application.Services
+{
+
+ ///
+ /// 肿瘤学
+ ///
+ public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
+ {
+ #region 肿瘤学阅片相关
+
+ ///
+ /// 获取肿瘤学任务信息
+ ///
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task 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.Id == taskInfo.TrialReadingCriterionId).FirstOrDefaultAsync();
+
+
+ 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.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId &&
+ 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 oncologyVisits = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
+ x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId &&
+ 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;
+
+ }
+
+ ///
+ /// 修改肿瘤学阅片信息
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task SetOncologyReadingInfo(SetOncologyReadingInfoInDto inDto)
+ {
+ await _readingOncologyTaskInfoRepository.BatchDeleteNoTrackingAsync(x => x.OncologyTaskId == inDto.OncologyTaskId);
+
+ var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.OncologyTaskId).FirstNotNullAsync();
+
+ List 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);
+
+ await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.OncologyTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading });
+
+ var result = await _readingOncologyTaskInfoRepository.SaveChangesAsync();
+
+ return ResponseOutput.Ok(result);
+
+
+ }
+ #endregion
+
+
+ ///
+ /// 添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑
+ ///
+ ///
+ [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 _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModuleInfo.TrialReadingCriterionId).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 && x.TrialReadingCriterionId == readModuleInfo.TrialReadingCriterionId
+ ).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 needReadList = new List();
+
+ 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
+ });
+ }
+ }
+
+
+
+ }
+ }
+
+
+ ///
+ /// 提交肿瘤阅片结果
+ ///
+ ///
+ ///
+ [NonDynamicMethod]
+ public async Task SubmitOncologyReadingInfo(SubmitOncologyReadingInfoInDto inDto)
+ {
+ await VerifyTaskIsSign(inDto.OncologyTaskId);
+ //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);
+ }
+ }
+}