Uat_Study
parent
812c82a38b
commit
98ae77d866
|
@ -7820,9 +7820,39 @@
|
|||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Application.Services.ReadingImageTaskService">
|
||||
<summary>
|
||||
全局阅片
|
||||
</summary>
|
||||
<summary>
|
||||
IR影像阅片
|
||||
</summary>
|
||||
<summary>
|
||||
裁判
|
||||
</summary>
|
||||
<summary>
|
||||
肿瘤学
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SubmitGlobalReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.SubmitGlobalReadingInfoInDto)">
|
||||
<summary>
|
||||
提交全局阅片结果
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SaveGlobalReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.SaveGlobalReadingInfoInDto)">
|
||||
<summary>
|
||||
保存全局阅片结果
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetGlobalReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.GetGlobalReadingInfoInDto)">
|
||||
<summary>
|
||||
获取全局阅片信息
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SplitLesion(IRaCIS.Core.Application.Service.Reading.Dto.SplitLesionInDto)">
|
||||
<summary>
|
||||
|
@ -7911,35 +7941,6 @@
|
|||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetOncologyReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.GetOncologyReadingInfoInDto)">
|
||||
<summary>
|
||||
获取肿瘤学任务信息
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SetOncologyReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.SetOncologyReadingInfoInDto)">
|
||||
<summary>
|
||||
修改肿瘤学阅片信息
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SaveGlobalReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.SaveGlobalReadingInfoInDto)">
|
||||
<summary>
|
||||
保存全局阅片结果
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetGlobalReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.GetGlobalReadingInfoInDto)">
|
||||
<summary>
|
||||
获取全局阅片信息
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetNextTask(IRaCIS.Core.Application.Service.Reading.Dto.GetNextTaskInDto)">
|
||||
<summary>
|
||||
获取下一个阅片任务
|
||||
|
@ -7961,20 +7962,6 @@
|
|||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetTrialCriterionJudgeQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.GetTrialCriterionJudgeQuestionListInDto)">
|
||||
<summary>
|
||||
获取项目标准的裁判问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SetTrialCriterionJudgeQuestionAnswerGroup(IRaCIS.Core.Application.Service.Reading.Dto.SetTrialCriterionJudgeQuestionAnswerGroupInDto)">
|
||||
<summary>
|
||||
设置裁判问题的答案分组
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetTrialReadingQuestion(IRaCIS.Core.Application.Service.Reading.Dto.GetTrialReadingQuestionInDto)">
|
||||
<summary>
|
||||
获取项目的阅片问题ECRF预览
|
||||
|
@ -8019,19 +8006,6 @@
|
|||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetJudgeReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.GetJudgeReadingInfo)">
|
||||
<summary>
|
||||
获取裁判阅片任务信息
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SaveJudgeVisitTaskResult(IRaCIS.Core.Application.Service.Reading.Dto.SaveJudgeVisitTaskResult)">
|
||||
<summary>
|
||||
保存裁判问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetReadingPastResultList(IRaCIS.Core.Application.Service.Reading.Dto.GetReadingPastResultListInDto)">
|
||||
<summary>
|
||||
获取既往结果
|
||||
|
@ -8081,27 +8055,6 @@
|
|||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SubmitJudgeVisitTaskResult(IRaCIS.Core.Application.Service.Reading.Dto.SaveJudgeVisitTaskResult)">
|
||||
<summary>
|
||||
提交裁判问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SubmitOncologyReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.SubmitOncologyReadingInfoInDto)">
|
||||
<summary>
|
||||
提交肿瘤阅片结果
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SubmitGlobalReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.SubmitGlobalReadingInfoInDto)">
|
||||
<summary>
|
||||
提交全局阅片结果
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SubmitTaskChangeState(System.Guid)">
|
||||
<summary>
|
||||
签名提交任务修改状态
|
||||
|
@ -8109,22 +8062,58 @@
|
|||
<param name="visitTaskId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.FinishReadUpdateState(System.Guid)">
|
||||
<summary>
|
||||
完成阅片修改状态
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.AddReadingTask(System.Guid)">
|
||||
<summary>
|
||||
添加阅片期任务
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.AddOncologyTask(System.Guid)">
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.VerifyTaskIsSign(System.Guid)">
|
||||
<summary>
|
||||
添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑
|
||||
验证任务是否签名
|
||||
</summary>
|
||||
<param name="visitTaskid"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetTrialCriterionJudgeQuestionList(IRaCIS.Core.Application.Service.Reading.Dto.GetTrialCriterionJudgeQuestionListInDto)">
|
||||
<summary>
|
||||
获取项目标准的裁判问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SetTrialCriterionJudgeQuestionAnswerGroup(IRaCIS.Core.Application.Service.Reading.Dto.SetTrialCriterionJudgeQuestionAnswerGroupInDto)">
|
||||
<summary>
|
||||
设置裁判问题的答案分组
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetJudgeReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.GetJudgeReadingInfo)">
|
||||
<summary>
|
||||
获取裁判阅片任务信息
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SaveJudgeTask(IRaCIS.Core.Application.Service.Reading.Dto.SaveJudgeTaskDto)">
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SaveJudgeVisitTaskResult(IRaCIS.Core.Application.Service.Reading.Dto.SaveJudgeVisitTaskResult)">
|
||||
<summary>
|
||||
添加裁判任务
|
||||
保存裁判问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SubmitJudgeVisitTaskResult(IRaCIS.Core.Application.Service.Reading.Dto.SaveJudgeVisitTaskResult)">
|
||||
<summary>
|
||||
提交裁判问题
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.TriggerJudgeQuestion(System.Guid)">
|
||||
|
@ -8149,10 +8138,31 @@
|
|||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.FinishReadUpdateState(System.Guid)">
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.GetOncologyReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.GetOncologyReadingInfoInDto)">
|
||||
<summary>
|
||||
完成阅片修改状态
|
||||
获取肿瘤学任务信息
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SetOncologyReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.SetOncologyReadingInfoInDto)">
|
||||
<summary>
|
||||
修改肿瘤学阅片信息
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.AddOncologyTask(System.Guid)">
|
||||
<summary>
|
||||
添加肿瘤学阅片任务 其实这里无非是要判断临床数据是否签名 但是对于添加新的阅片期 其实没有临床数据 可以走之前的逻辑
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SubmitOncologyReadingInfo(IRaCIS.Core.Application.Service.Reading.Dto.SubmitOncologyReadingInfoInDto)">
|
||||
<summary>
|
||||
提交肿瘤阅片结果
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Application.Services.ReadingPeriodSetService">
|
||||
|
@ -8274,7 +8284,7 @@
|
|||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingQuestionService.SetAssessType(IRaCIS.Core.Application.Service.Reading.Dto.SetAssessTypeInDto)">
|
||||
<summary>
|
||||
设置标准字典
|
||||
设置标准字典(系统用)
|
||||
</summary>
|
||||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 全局阅片
|
||||
/// </summary>
|
||||
public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
|
||||
{
|
||||
/// <summary>
|
||||
/// 提交全局阅片结果
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
//[NonDynamicMethod]
|
||||
public async Task<IResponseOutput> SubmitGlobalReadingInfo(SubmitGlobalReadingInfoInDto inDto)
|
||||
{
|
||||
//var result = await this.SaveGlobalReadingInfo(inDto);
|
||||
await VerifyTaskIsSign(inDto.GlobalTaskId);
|
||||
await this.SubmitTaskChangeState(inDto.GlobalTaskId);
|
||||
|
||||
return ResponseOutput.Ok(true);
|
||||
}
|
||||
|
||||
#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();
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <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,
|
||||
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<GlobalQuestionInfo>()
|
||||
{
|
||||
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<GetGlobalQuestionType> questionTypes = new List<GetGlobalQuestionType>()
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 裁判
|
||||
/// </summary>
|
||||
public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
|
||||
{
|
||||
#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.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<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();
|
||||
|
||||
|
||||
return (result, new
|
||||
{
|
||||
IsSign = trialCriterion.ReadingInfoSignTime != 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>
|
||||
/// 获取裁判阅片任务信息
|
||||
/// </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
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 提交裁判问题
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[NonDynamicMethod]
|
||||
public async Task<IResponseOutput> 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);
|
||||
}
|
||||
|
||||
/// <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 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<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 && 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 肿瘤学
|
||||
/// </summary>
|
||||
public partial class ReadingImageTaskService : BaseService, IReadingImageTaskService
|
||||
{
|
||||
#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.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<OncologyVisitTaskInfo> 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;
|
||||
|
||||
}
|
||||
|
||||
/// <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);
|
||||
|
||||
await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == inDto.OncologyTaskId, u => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading });
|
||||
|
||||
var result = await _readingOncologyTaskInfoRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok(result);
|
||||
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
/// <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 _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<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="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[NonDynamicMethod]
|
||||
public async Task<IResponseOutput> 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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue