@@ -11,6 +11,7 @@ using IRaCIS.Core.Application.ViewModel;
using Panda.DynamicWebApi.Attributes ;
using IRaCIS.Core.Domain.Share ;
using IRaCIS.Core.Infra.EFCore.Common ;
using Microsoft.Extensions.Caching.Memory ;
namespace IRaCIS.Core.Application.Service
{
@@ -36,7 +37,6 @@ namespace IRaCIS.Core.Application.Service
IRepository < ReadingQuestionCriterionTrial > readingQuestionCriterionTrialRepository ,
IRepository < ReadingTableQuestionTrial > readingTableQuestionTrialRepository ,
IRepository < ReadingQuestionTrial > readingQuestionTrialRepository ,
IRepository < SubjectVisit > subjectVisitRepository ,
IRepository < TumorAssessment > tumorAssessmentRepository ,
IRepository < ReadingTaskQuestionAnswer > readingTaskQuestionAnswerRepository
@@ -52,6 +52,10 @@ namespace IRaCIS.Core.Application.Service
this . _readingTaskQuestionAnswerRepository = readingTaskQuestionAnswerRepository ;
}
#region 临 时 对 象 单 个 请 求 的 生 命 周 期 避 免 重 复 查 询 数 据 库
private List < VisitTaskAnswerInfo > visitTaskAnswerList ;
#endregion
/// <summary>
/// 计算任务
/// </summary>
@@ -107,6 +111,7 @@ namespace IRaCIS.Core.Application.Service
CriterionId = criterionId ,
IsChangeOtherTask = inDto . IsChangeOtherTask ,
TrialId = visitTask . TrialId ,
DoctorUserId = visitTask . DoctorUserId ,
} ;
await ReadingCalculate ( readingData ) ;
}
@@ -122,21 +127,57 @@ namespace IRaCIS.Core.Application.Service
// 找到所有访视任务的Id
var visitTaskIds = await _visitTaskRepository . Where ( x = > ! x . IsAnalysisCreate & & x . ReadingCategory = = ReadingCategory . Visit & &
x . TaskState = = TaskState . Effect & & x . ReadingTaskState = = ReadingTaskState . HaveSigned ) . Select ( x = > x . Id ) . ToListAsync ( ) ;
x . TaskState = = TaskState . Effect & & x . ReadingTaskState = = ReadingTaskState . HaveSigned & & x . DoctorUserId = = inDto . DoctorUserId ) . Select ( x = > x . Id ) . ToListAsync ( ) ;
var needAddList = new List < ReadingTaskQuestionAnswer > ( ) ;
foreach ( var item in inDto . QuestionInfo . Where ( x = > x . QuestionType ! = null ) )
#region 先 计 算
// 先计算然后保存结果 因为计算的结果在下面的计算可能会用到
var needFirstCalculateTypes = new List < QuestionType ? > ( )
{
QuestionType . SOD ,
} ;
var needFirstAddList = new List < ReadingTaskQuestionAnswer > ( ) ;
foreach ( var item in inDto . QuestionInfo . Where ( x = > needFirstCalculateTypes . Contains ( x . QuestionType ) ) )
{
switch ( item . QuestionType )
{
// 靶病灶径线之和(SOD)
case QuestionType . SOD :
needAddList . Add ( new ReadingTaskQuestionAnswer ( )
needFirstAddList . Add ( new ReadingTaskQuestionAnswer ( )
{
Answer = ( await GetSODData ( inDto ) ) . ToString ( ) ,
ReadingQuestionTrialId = item . QuestionId ,
ReadingQuestionTrialId = item . QuestionId ,
} ) ;
break ;
}
}
var needFirstAddIds = needFirstAddList . Select ( x = > x . ReadingQuestionTrialId ) . ToList ( ) ;
await _readingTaskQuestionAnswerRepository . BatchDeleteNoTrackingAsync ( x = > needFirstAddIds . Contains ( x . ReadingQuestionTrialId ) & & x . VisitTaskId = = inDto . VisitTaskId ) ;
needFirstAddList . ForEach ( x = >
{
x . SubjectId = inDto . SubjectId ;
x . ReadingQuestionCriterionTrialId = inDto . CriterionId ;
x . VisitTaskId = inDto . VisitTaskId ;
x . TrialId = inDto . TrialId ;
x . SubjectId = inDto . SubjectId ;
} ) ;
await _readingTaskQuestionAnswerRepository . AddRangeAsync ( needFirstAddList ) ;
await _readingTaskQuestionAnswerRepository . SaveChangesAsync ( ) ;
#endregion
var needAddList = new List < ReadingTaskQuestionAnswer > ( ) ;
// 循环找要计算的值进行计算
foreach ( var item in inDto . QuestionInfo . Where ( x = > x . QuestionType ! = null ) )
{
switch ( item . QuestionType )
{
// 非淋巴结靶病灶长径之和
case QuestionType . SumOfDiameter :
needAddList . Add ( new ReadingTaskQuestionAnswer ( )
@@ -163,32 +204,59 @@ namespace IRaCIS.Core.Application.Service
break ;
// 与整个访视期间最低点相比增加的值(mm) 其他任务需要改
case QuestionType . LowestIncrease :
needAddList . Add ( new ReadingTaskQuestionAnswer ( )
if ( ! inDto . IsChangeOtherTask )
{
Answer = ( await GetLowestIncrease ( inDto ) ) . ToString ( ) ,
ReadingQuestionTrialId = item . QuestionId ,
} ) ;
needAddList . Add ( new ReadingTaskQuestionAnswer ( )
{
Answer = ( await GetLowestIncrease ( inDto ) ) . ToString ( ) ,
ReadingQuestionTrialId = item . QuestionId ,
} ) ;
}
else
{
await ChangeAllLowestIncrease ( inDto , item . QuestionId ) ;
}
break ;
// 与整个访视期间最低点相比增加的百分比 其他任务需要改
case QuestionType . LowPercent :
needAddList . Add ( new ReadingTaskQuestionAnswer ( )
if ( ! inDto . IsChangeOtherTask )
{
Answer = ( await GetLowPercent ( inDto ) ) . ToString ( ) ,
ReadingQuestionTrialId = item . QuestionId ,
} ) ;
needAddList . Add ( new ReadingTaskQuestionAnswer ( )
{
Answer = ( await GetLowPercent ( inDto ) ) . ToString ( ) ,
ReadingQuestionTrialId = item . QuestionId ,
} ) ;
}
else
{
await ChangeAllLowPercent ( inDto , item . QuestionId ) ;
}
break ;
// 整个访视期间最低点访视名称 其他任务需要改
case QuestionType . LowVisit :
var answer = ( await GetLowVisit ( inDto ) ) . ToString ( ) ;
needAddList . Add ( new ReadingTaskQuestionAnswer ( )
if ( ! inDto . IsChangeOtherTask )
{
Answer = answer ,
ReadingQuestionTrialId = item . QuestionId ,
} ) ;
if ( inDto . IsChangeOtherTask )
{
await this . ChangeAllVisitTaskAnswer ( visitTaskIds , item . QuestionId , answer ) ;
needAddList . Add ( new ReadingTaskQuestionAnswer ( )
{
Answer = answer ,
ReadingQuestionTrialId = item . QuestionId ,
} ) ;
}
else
{
if ( inDto . IsChangeOtherTask )
{
await this . ChangeAllVisitTaskAnswer ( visitTaskIds , item . QuestionId , answer ) ;
}
}
break ;
// 是否存在非淋巴结靶病灶
case QuestionType . IsLymphTarget :
@@ -381,7 +449,7 @@ namespace IRaCIS.Core.Application.Service
}
else
{
return decimal . Round ( thisSOD * 100 / minSOD , 2 ) ;
return decimal . Round ( ( thisSOD - minSOD ) * 100 / minSOD , 2 ) ;
}
@@ -495,6 +563,68 @@ namespace IRaCIS.Core.Application.Service
}
#endregion
#region 修 改 其 他 标 准
#region 修 改 与 整 个 访 视 期 间 最 低 点 相 比 增 加 的 值 ( mm )
/// <summary>
/// 修改与整个访视期间最低点相比增加的值(mm)
/// </summary>
/// <param name="inDto"></param>
/// <param name="questionId"></param>
/// <returns></returns>
public async Task ChangeAllLowestIncrease ( ReadingCalculateDto inDto , Guid questionId )
{
var visitTaskList = await GetVisitTaskAnswerList ( inDto ) ;
var lowSod = visitTaskList . Select ( x = > x . SOD ) . OrderBy ( x = > x ) . FirstOrDefault ( ) ;
foreach ( var item in visitTaskList )
{
await _readingTaskQuestionAnswerRepository . BatchUpdateNoTrackingAsync ( x = > x . VisitTaskId = = item . VisitTaskId & & x . ReadingQuestionTrialId = = questionId , x = > new ReadingTaskQuestionAnswer ( )
{
Answer = ( item . SOD - lowSod ) . ToString ( )
} ) ;
}
}
#endregion
#region 修 改 整 个 访 视 期 间 最 低 点 相 比 增 加 的 百 分 比
/// <summary>
/// 修改整个访视期间最低点相比增加的百分比
/// </summary>
/// <param name="inDto"></param>
/// <param name="questionId"></param>
/// <returns></returns>
public async Task ChangeAllLowPercent ( ReadingCalculateDto inDto , Guid questionId )
{
var visitTaskList = await GetVisitTaskAnswerList ( inDto ) ;
var lowSod = visitTaskList . Select ( x = > x . SOD ) . OrderBy ( x = > x ) . FirstOrDefault ( ) ;
foreach ( var item in visitTaskList )
{
decimal percent = 0 ;
if ( lowSod = = 0 )
{
percent = 100 ;
}
else
{
percent = decimal . Round ( ( item . SOD - lowSod ) * 100 / lowSod , 2 ) ;
}
await _readingTaskQuestionAnswerRepository . BatchUpdateNoTrackingAsync ( x = > x . VisitTaskId = = item . VisitTaskId & & x . ReadingQuestionTrialId = = questionId , x = > new ReadingTaskQuestionAnswer ( )
{
Answer = percent . ToString ( )
} ) ;
}
}
#endregion
#endregion
#region 通 用 方 法
#region 修 改 所 有 访 视 任 务 的 答 案
@@ -523,53 +653,53 @@ namespace IRaCIS.Core.Application.Service
/// <returns></returns>
private async Task < decimal > GetBaseLineSOD ( ReadingCalculateDto inDto )
{
if ( await _visitTaskRepository . AnyAsync ( x = > x . Id = = inDto . VisitTaskId & & x . SourceSubjectVisit . IsBaseLine & & ! x . IsAnalysisCreate ) )
if ( await _visitTaskRepository . AnyAsync ( x = > x . Id = = inDto . VisitTaskId & & x . SourceSubjectVisit . IsBaseLine & & ! x . IsAnalysisCreate & & x . DoctorUserId = = inDto . DoctorUserId ) )
{
return 0 ;
}
// 先找到基线的任务
var baseLineTaskId = await _visitTaskRepository . Where ( x = > x . SubjectId = = inDto . SubjectId & & x . ReadingCategory = = ReadingCategory . Visit
& & x . SourceSubjectVisit . IsBaseLine & & x . TaskState = = TaskState . Effect & & ! x . IsAnalysisCreate )
& & x . SourceSubjectVisit . IsBaseLine & & x . TaskState = = TaskState . Effect & & ! x . IsAnalysisCreate & & x . DoctorUserId = = inDto . DoctorUserId )
. Select ( x = > x . Id ) . FirstOrDefaultAsync ( ) ;
var baseLineSOD = decimal . Parse ( ( await _readingTaskQuestionAnswerRepository . Where ( x = > x . VisitTaskId = = baseLineTaskId & & x . ReadingQuestionTrial . QuestionType = = QuestionType . SOD ) . Select ( x = > x . Answer ) . FirstOrDefaultAsync ( ) ) . IsNullOrEmptyReturn0 ( ) ) ;
return baseLineSOD ;
}
#endregion
#endregion
#region 获 取 访 视 任 务 信 息
/// <summary>
/// 获取访视任务信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
private async Task < List < VisitTaskAnswerInfo > > GetVisitTaskAnswerList ( ReadingCalculateDto inDto )
{
var answerList = await _readingTaskQuestionAnswerRepository . Where ( x = > x . VisitTask . ReadingCategory = = ReadingCategory . Visit
& & x . SubjectId = = inDto . SubjectId & & x . VisitTask . ReadingTaskState = = ReadingTaskState . HaveSigned & & x . VisitTask . TaskState = = TaskState . Effect & & x . ReadingQuestionTrial . QuestionType = = QuestionType . SOD )
. Select ( x = > new
{
VisitName = x . VisitTask . SourceSubjectVisit . VisitName ,
SOD = x . Answer
} ) . ToListAsync ( ) ;
#region 获 取 访 视 任 务 信 息
/// <summary>
/// 获取访视任务信息
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task < List < VisitTaskAnswerInfo > > GetVisitTaskAnswerList ( ReadingCalculateDto inDto )
{
if ( visitTaskAnswerList = = null )
{
visitTaskAnswerList = await _readingTaskQuestionAnswerRepository . Where ( x = > x . VisitTask . ReadingCategory = = ReadingCategory . Visit
& & x . SubjectId = = inDto . SubjectId & & x . VisitTask . ReadingTaskState = = ReadingTaskState . HaveSigned & & x . VisitTask . TaskState = = TaskState . Effect & & x . ReadingQuestionTrial . QuestionType = = QuestionType . SOD )
. Select ( x = > new VisitTaskAnswerInfo
{
VisitTaskId = x . VisitTaskId ,
QuestionId = x . ReadingQuestionTrialId ,
VisitName = x . VisitTask . SourceSubjectVisit . VisitName ,
SOD = decimal . Parse ( x . Answer . IsNullOrEmptyReturn0 ( ) ) ,
} ) . ToListAsync ( ) ;
var decimalAnswerList = answerList . Select ( x = > new VisitTaskAnswerInfo
{
VisitName = x . VisitName ,
SOD = decimal . Parse ( x . SOD . IsNullOrEmptyReturn0 ( ) ) ,
} ) . ToList ( ) ;
}
return decimalAnswerList ;
}
#endregion
return visitTaskAnswerList ;
}
#endregion
/// <summary>
/// 获取上一个访视任务Id
/// </summary>
/// <returns></returns>
private async Task < Guid > GetLastVisitTaskId ( ReadingCalculateDto inDto )
/// <summary>
/// 获取上一个访视任务Id
/// </summary>
/// <returns></returns>
private async Task < Guid > GetLastVisitTaskId ( ReadingCalculateDto inDto )
{
// 拿到这一个访视
var thisNum = await _subjectVisitRepository . Where ( x = > x . Id = = inDto . SubjectVisitId ) . Select ( x = > x . VisitNum ) . FirstOrDefaultAsync ( ) ;
@@ -579,7 +709,7 @@ namespace IRaCIS.Core.Application.Service
// 找到访视任务Id
var LastVisitTaskId = await _visitTaskRepository . Where ( x = > x . ReadingCategory = = ReadingCategory . Visit & & x . TaskState = = TaskState . Effect & & ! x . IsAnalysisCreate & & x . SourceSubjectVisitId = = lastVisitId ) . Select ( x = > x . Id ) . FirstOrDefaultAsync ( ) ;
var LastVisitTaskId = await _visitTaskRepository . Where ( x = > x . ReadingCategory = = ReadingCategory . Visit & & x . TaskState = = TaskState . Effect & & ! x . IsAnalysisCreate & & x . SourceSubjectVisitId = = lastVisitId & & x . DoctorUserId = = inDto . DoctorUserId ) . Select ( x = > x . Id ) . FirstOrDefaultAsync ( ) ;
return LastVisitTaskId ;
}