修改
This commit is contained in:
@@ -0,0 +1,196 @@
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
{
|
||||
public class GeneralCalculateService : BaseService, IGeneralCalculateService
|
||||
{
|
||||
|
||||
private readonly IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository;
|
||||
private readonly IRepository<VisitTask> _visitTaskRepository;
|
||||
private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository;
|
||||
private readonly IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository;
|
||||
private readonly IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository;
|
||||
private readonly IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository;
|
||||
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
||||
private readonly IRepository<TumorAssessment_RECIST1Point1> _tumorAssessmentRepository;
|
||||
private readonly IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswerRepository;
|
||||
|
||||
public GeneralCalculateService(
|
||||
IRepository<ReadingTableQuestionAnswer> readingTableQuestionAnswerRepository,
|
||||
IRepository<VisitTask> visitTaskRepository,
|
||||
IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository,
|
||||
IRepository<ReadingTableQuestionTrial> readingTableQuestionTrialRepository,
|
||||
IRepository<ReadingTableAnswerRowInfo> readingTableAnswerRowInfoRepository,
|
||||
IRepository<ReadingQuestionTrial> readingQuestionTrialRepository,
|
||||
IRepository<SubjectVisit> subjectVisitRepository,
|
||||
IRepository<TumorAssessment_RECIST1Point1> tumorAssessmentRepository,
|
||||
IRepository<ReadingTaskQuestionAnswer> readingTaskQuestionAnswerRepository
|
||||
)
|
||||
{
|
||||
this._readingTableQuestionAnswerRepository = readingTableQuestionAnswerRepository;
|
||||
this._visitTaskRepository = visitTaskRepository;
|
||||
this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
|
||||
this._readingTableQuestionTrialRepository = readingTableQuestionTrialRepository;
|
||||
this._readingTableAnswerRowInfoRepository = readingTableAnswerRowInfoRepository;
|
||||
this._readingQuestionTrialRepository = readingQuestionTrialRepository;
|
||||
this._subjectVisitRepository = subjectVisitRepository;
|
||||
this._tumorAssessmentRepository = tumorAssessmentRepository;
|
||||
this._readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取ReadingCalculateDto
|
||||
/// </summary>
|
||||
/// <param name="visitTaskId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<ReadingCalculateDto> GetReadingCalculateDto(Guid visitTaskId)
|
||||
{
|
||||
var visitTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
|
||||
|
||||
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == visitTask.TrialReadingCriterionId).FirstNotNullAsync();
|
||||
var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == (visitTask.SourceSubjectVisitId ?? default(Guid))).FirstOrDefaultAsync();
|
||||
|
||||
var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == visitTask.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == visitTaskId).ToListAsync();
|
||||
|
||||
var baseLinetaskId = await _visitTaskRepository.Where(x => x.SourceSubjectVisitId == baseLineVisitId && x.TaskState == TaskState.Effect
|
||||
&& x.TrialReadingCriterionId == visitTask.TrialReadingCriterionId
|
||||
&& x.ArmEnum == visitTask.ArmEnum).Select(x => x.Id).FirstOrDefaultAsync();
|
||||
|
||||
List<QuestionInfo> questionInfos = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == visitTask.TrialReadingCriterionId).Select(x => new QuestionInfo()
|
||||
{
|
||||
LesionType = x.LesionType,
|
||||
QuestionId = x.Id,
|
||||
QuesionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us),
|
||||
QuestionType = x.QuestionType,
|
||||
ValueType = x.ValueType,
|
||||
}).ToListAsync();
|
||||
|
||||
var questionAnswers = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == visitTaskId).Select(x => new
|
||||
{
|
||||
x.ReadingQuestionTrialId,
|
||||
x.Answer
|
||||
}).ToListAsync();
|
||||
|
||||
var tableQuestion = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == visitTaskId).Include(x => x.ReadingTableQuestionTrial).Select(x => new TableQuestionInfo()
|
||||
{
|
||||
Answer = x.Answer,
|
||||
AnswerId=x.Id,
|
||||
QuestionMark = x.ReadingTableQuestionTrial.QuestionMark,
|
||||
TableQuestionId = x.TableQuestionId,
|
||||
QuestionId = x.QuestionId,
|
||||
QuestionType = x.ReadingQuestionTrial.QuestionType,
|
||||
RowIndex = x.RowIndex,
|
||||
RowId = x.RowId,
|
||||
}).ToListAsync();
|
||||
|
||||
foreach (var item in questionInfos)
|
||||
{
|
||||
item.Answer = questionAnswers.Where(y => y.ReadingQuestionTrialId == item.QuestionId).Select(x => x.Answer).FirstOrDefault() ?? string.Empty;
|
||||
|
||||
|
||||
var thisItemRowInfo = rowInfoList.Where(x => x.QuestionId == item.QuestionId).ToList();
|
||||
|
||||
var thisItemTableQuestions = tableQuestion.Where(x => x.QuestionId == item.QuestionId).ToList();
|
||||
|
||||
item.TableRowInfoList = thisItemRowInfo.Select(x => new TableRowInfo()
|
||||
{
|
||||
RowIndex = x.RowIndex,
|
||||
MeasureData = x.MeasureData,
|
||||
FristAddTaskNum=x.FristAddTaskNum,
|
||||
TableQuestionList = tableQuestion.Where(y => y.QuestionId == item.QuestionId && y.RowId == x.Id).ToList(),
|
||||
|
||||
}).ToList();
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
ReadingCalculateDto readingData = new ReadingCalculateDto()
|
||||
{
|
||||
SubjectId = visitTask.SubjectId,
|
||||
TaskBlindName= visitTask.TaskBlindName,
|
||||
VisitTaskId = visitTaskId,
|
||||
SubjectVisitId = visitTask.SourceSubjectVisitId!.Value,
|
||||
QuestionInfo = questionInfos,
|
||||
CriterionId = visitTask.TrialReadingCriterionId,
|
||||
TrialId = visitTask.TrialId,
|
||||
IsAnalysisCreate = visitTask.IsAnalysisCreate,
|
||||
IsSelfAnalysis = visitTask.IsSelfAnalysis,
|
||||
IsBaseLine = subjectVisit!.IsBaseLine,
|
||||
DoctorUserId = visitTask.DoctorUserId,
|
||||
TrialReadingCriterionId = visitTask.TrialReadingCriterionId,
|
||||
BaseLineTaskId = baseLinetaskId,
|
||||
ArmEnum = visitTask.ArmEnum,
|
||||
VisitName = subjectVisit.VisitName,
|
||||
BlindName = subjectVisit.BlindName,
|
||||
VisitTaskNum = visitTask.VisitTaskNum,
|
||||
DigitPlaces= criterionInfo.DigitPlaces??2,
|
||||
};
|
||||
|
||||
return readingData;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取阅片报告任务List
|
||||
/// </summary>
|
||||
/// <param name="visitTaskId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<VisitTaskInfo>> GetReadingReportTaskList(Guid visitTaskId)
|
||||
{
|
||||
var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
|
||||
|
||||
var isAdditionalQuestionId = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == visitTaskInfo.TrialReadingCriterionId && x.IsAdditional).IgnoreQueryFilters().Select(x => x.Id).ToListAsync();
|
||||
|
||||
var taskquery = _visitTaskRepository
|
||||
.Where(x => (x.SubjectId == visitTaskInfo.SubjectId && x.TaskState == TaskState.Effect
|
||||
&& x.IsAnalysisCreate == visitTaskInfo.IsAnalysisCreate
|
||||
&& x.DoctorUserId == visitTaskInfo.DoctorUserId
|
||||
&& x.IsSelfAnalysis == visitTaskInfo.IsSelfAnalysis
|
||||
&& x.VisitTaskNum <= visitTaskInfo.VisitTaskNum
|
||||
&& x.ArmEnum == visitTaskInfo.ArmEnum
|
||||
&& x.TrialReadingCriterionId == visitTaskInfo.TrialReadingCriterionId
|
||||
&& x.ReadingCategory == ReadingCategory.Visit && x.ReadingTaskState == ReadingTaskState.HaveSigned) || x.Id == visitTaskId
|
||||
);
|
||||
if(visitTaskInfo.ReadingTaskState==ReadingTaskState.HaveSigned)
|
||||
{
|
||||
taskquery = _visitTaskRepository.Where(x => visitTaskInfo.RelatedVisitTaskIdList.Contains(x.Id)||x.Id==visitTaskInfo.Id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
var taskInfoList = await taskquery.OrderBy(x => x.VisitTaskNum).Select(x => new VisitTaskInfo()
|
||||
{
|
||||
BlindName = x.TaskBlindName,
|
||||
IsBaseLine = x.SourceSubjectVisit.IsBaseLine,
|
||||
VisitTaskId = x.Id,
|
||||
|
||||
TaskName = x.TaskName,
|
||||
LatestScanDate= x.SourceSubjectVisit!=null?x.SourceSubjectVisit.LatestScanDate : null,
|
||||
VisitTaskNum = x.VisitTaskNum,
|
||||
IsCurrentTask = x.Id == visitTaskId,
|
||||
|
||||
}).ToListAsync();
|
||||
|
||||
var taskIds = taskInfoList.Select(x => x.VisitTaskId).ToList();
|
||||
|
||||
var isHaveAdditionalTaskIds = await _readingTaskQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId) && isAdditionalQuestionId.Contains(x.ReadingQuestionTrialId)).Select(x => x.VisitTaskId).Distinct().ToListAsync();
|
||||
|
||||
taskInfoList.ForEach(x => {
|
||||
x.IsHaveAdditionalQuestion = isHaveAdditionalTaskIds.Contains(x.VisitTaskId);
|
||||
});
|
||||
return taskInfoList;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,233 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||||
{
|
||||
[ApiExplorerSettings(GroupName = "Image")]
|
||||
public class ReadingCalculateService: BaseService, IReadingCalculateService
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 标准和服务对应
|
||||
/// </summary>
|
||||
Dictionary<CriterionType, Type> CalculateServiceDic = new Dictionary<CriterionType, Type>()
|
||||
{
|
||||
{CriterionType.RECIST1Point1,typeof(RECIST1Point1CalculateService) }, //RECIST1.1
|
||||
{CriterionType.PCWG3,typeof(PCWG3CalculateService) },
|
||||
{CriterionType.SelfDefine,typeof(SelfDefineCalculateService) },
|
||||
{CriterionType.RECIST1Pointt1_MB,typeof(RECIST1Point1_BMCalculateService) },
|
||||
{CriterionType.IRECIST1Point1,typeof(IRECIST1Point1CalculateService) }
|
||||
};
|
||||
|
||||
|
||||
|
||||
private readonly IEnumerable<ICriterionCalculateService> _criterionServices;
|
||||
private readonly IRepository<VisitTask> _visitTaskRepository;
|
||||
private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository;
|
||||
private ICriterionCalculateService _useCriterion;
|
||||
|
||||
|
||||
public ReadingCalculateService(IEnumerable<ICriterionCalculateService> criterionServices,
|
||||
IRepository<VisitTask> visitTaskRepository,
|
||||
IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository
|
||||
|
||||
)
|
||||
{
|
||||
|
||||
_criterionServices = criterionServices;
|
||||
this._visitTaskRepository = visitTaskRepository;
|
||||
this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取Service
|
||||
/// </summary>
|
||||
/// <param name="visitTaskId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<ICriterionCalculateService> GetService(Guid visitTaskId)
|
||||
{
|
||||
if (_useCriterion == null)
|
||||
{
|
||||
var criterionId = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(x => x.TrialReadingCriterionId).FirstNotNullAsync();
|
||||
|
||||
var criterionType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == criterionId).Select(x => x.CriterionType).FirstOrDefaultAsync();
|
||||
|
||||
if (criterionType == null)
|
||||
{
|
||||
throw new BusinessValidationFailedException(_localizer["ReadingCalculate_NoDeveloped"]);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
CriterionType thisCriterionType = criterionType;
|
||||
Type thisServiceType = CalculateServiceDic[thisCriterionType];
|
||||
_useCriterion = _criterionServices.FirstOrDefault(x => x.GetType().Name == thisServiceType.Name + "Proxy");
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
_useCriterion = null;
|
||||
}
|
||||
|
||||
return _useCriterion;
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return _useCriterion;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自动计算 并修改值
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task CalculateTask(CalculateTaskInDto inDto)
|
||||
{
|
||||
|
||||
var service = await this.GetService(inDto.VisitTaskId);
|
||||
if (service != null)
|
||||
{
|
||||
await service.CalculateTask(inDto);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 验证访视提交
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
|
||||
{
|
||||
var service = await this.GetService(inDto.VisitTaskId);
|
||||
if (service != null)
|
||||
{
|
||||
await service.VerifyVisitTaskQuestions(inDto);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将上一次的访视病灶添加到这一次
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<AddTaskLesionAnswerFromLastTaskOutDto> AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto)
|
||||
{
|
||||
var service = await this.GetService(inDto.VisitTaskId);
|
||||
var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||||
if (service != null&& visitTaskInfo.SourceSubjectVisitId!=null)
|
||||
{
|
||||
var readingTaskState = visitTaskInfo.ReadingTaskState;
|
||||
var result = new AddTaskLesionAnswerFromLastTaskOutDto();
|
||||
|
||||
if (readingTaskState == ReadingTaskState.WaitReading)
|
||||
{
|
||||
result= await service.AddTaskLesionAnswerFromLastTask(inDto);
|
||||
await service.CalculateTask(new CalculateTaskInDto()
|
||||
{
|
||||
IsChangeOtherTask = false,
|
||||
VisitTaskId = inDto.VisitTaskId,
|
||||
});
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x=>x.Id==inDto.VisitTaskId, x => new VisitTask()
|
||||
{
|
||||
ReadingTaskState = ReadingTaskState.Reading,
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return new AddTaskLesionAnswerFromLastTaskOutDto();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取报告验证的信息(这里每个标准可能不一样 返回用object)
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
|
||||
{
|
||||
|
||||
var service = await this.GetService(inDto.VisitTaskId);
|
||||
|
||||
if (service != null)
|
||||
{
|
||||
return await service.GetReportVerify(inDto);
|
||||
}
|
||||
else
|
||||
{
|
||||
return new { };
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取阅片报告
|
||||
/// </summary>
|
||||
/// <param name="indto"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<GetReadingReportEvaluationOutDto> GetReadingReportEvaluation(GetReadingReportEvaluationInDto inDto)
|
||||
{
|
||||
var service = await this.GetService(inDto.VisitTaskId);
|
||||
|
||||
if (service != null)
|
||||
{
|
||||
|
||||
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||||
if (taskInfo.ReadingTaskState != ReadingTaskState.HaveSigned&&inDto.IsCalculate)
|
||||
{
|
||||
await service.CalculateTask(new CalculateTaskInDto()
|
||||
{
|
||||
|
||||
VisitTaskId = inDto.VisitTaskId
|
||||
});
|
||||
}
|
||||
|
||||
return await service.GetReadingReportEvaluation(inDto);
|
||||
}
|
||||
else
|
||||
{
|
||||
return new GetReadingReportEvaluationOutDto();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 删除病灶获取起始病灶序号
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<int> GetDeleteLesionStatrIndex(DeleteReadingRowAnswerInDto inDto)
|
||||
{
|
||||
var service = await this.GetService(inDto.VisitTaskId);
|
||||
|
||||
if (service != null)
|
||||
{
|
||||
return await service.GetDeleteLesionStatrIndex(inDto);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user