修改一版

Test.EIImageViewer
he 2022-10-26 11:44:53 +08:00
parent b80fd3cd25
commit a2f5f9abc2
6 changed files with 434 additions and 85 deletions

View File

@ -113,6 +113,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public string BlindName { get; set; }
public decimal VisitTaskNum { get; set; }
public Guid VisitTaskId { get; set; }
public Guid BaseLineTaskId { get; set; }
@ -219,6 +221,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public string BlindName { get; set; }
public decimal SOD { get; set; }
public decimal VisitTaskNum { get; set; }
public decimal NewLesionsCount { get; set; }
}
public class ChangeAllTaskDto
@ -234,6 +240,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Func<ReadingCalculateDto, Task<decimal>> GetDecimalFun { get; set; }
public Func<ReadingCalculateDto, Task<int>> GetIntFun { get; set; }
public Func<ReadingCalculateDto, Task<decimal?>> GetDecimalNullFun { get; set; }
public Func<ReadingCalculateDto, Task<string>> GetStringFun { get; set; }

View File

@ -997,7 +997,8 @@ namespace IRaCIS.Application.Services
if (rowCount > item.MaxRowCount.Value - 1)
{
throw new BusinessValidationFailedException($"问题{item.QuestionName}最大相同问题数为{item.MaxRowCount.Value},当前已存在{rowCount}条!");
//throw new BusinessValidationFailedException($"问题{item.QuestionName}最大相同问题数为{item.MaxRowCount.Value},当前已存在{rowCount}条!");
throw new BusinessValidationFailedException($"当前器官上已有{rowCount}个病灶!");
}
}

View File

@ -127,6 +127,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
ArmEnum = visitTask.ArmEnum,
VisitName = subjectVisit.VisitName,
BlindName = subjectVisit.BlindName,
VisitTaskNum = visitTask.VisitTaskNum,
};
return readingData;

View File

@ -1,6 +1,15 @@
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Models;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.ViewModel;
using Panda.DynamicWebApi.Attributes;
using IRaCIS.Core.Infra.EFCore.Common;
using Microsoft.Extensions.Caching.Memory;
using IRaCIS.Core.Infrastructure;
using MassTransit;
namespace IRaCIS.Core.Application.Service.ReadingCalculate
@ -50,107 +59,370 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
public async Task<AddTaskLesionAnswerFromLastTaskOutDto> AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto)
{
return new AddTaskLesionAnswerFromLastTaskOutDto();
//var visitTaskId = inDto.VisitTaskId;
//var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
var visitTaskId = inDto.VisitTaskId;
//var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == taskinfo.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync();
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
//// 判断当前任务是否是基线
//if (taskinfo.SourceSubjectVisitId != baseLineVisitId)
//{
// // 判断当前任务是是否有表格问题答案
// if (!(await _readingTableQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == visitTaskId)))
// {
// var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
// x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
// x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum
// ).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync();
var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == taskinfo.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync();
// var copyTableAnswers = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == LastVisitTaskId
// ).Select(x => new CopyTableAnswerDto()
// {
// Answer = x.Answer,
// QuestionId = x.QuestionId,
// RowId = x.RowId,
// QuestionMark = x.ReadingTableQuestionTrial.QuestionMark,
// TableQuestionId = x.TableQuestionId,
// RowIndex = x.RowIndex,
// TrialId = x.TrialId
// }).ToListAsync();
// 判断当前任务是否是基线
if (taskinfo.SourceSubjectVisitId != baseLineVisitId)
{
// 判断当前任务是是否有表格问题答案
if (!(await _readingTableQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == visitTaskId)))
{
var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum
).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync();
// var tableRowAnswers = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == LastVisitTaskId).ProjectTo<CopyTableAnswerRowInfo>(_mapper.ConfigurationProvider).ToListAsync();
var copyTableAnswers = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == LastVisitTaskId
).Select(x => new CopyTableAnswerDto()
{
Answer = x.Answer,
QuestionId = x.QuestionId,
RowId = x.RowId,
QuestionMark = x.ReadingTableQuestionTrial.QuestionMark,
TableQuestionId = x.TableQuestionId,
RowIndex = x.RowIndex,
TrialId = x.TrialId
}).ToListAsync();
// tableRowAnswers.ForEach(x =>
// {
// x.VisitTaskId = visitTaskId;
// x.IsCurrentTaskAdd = false;
// x.Id = NewId.NextGuid();
// x.SeriesId = null;
// x.InstanceId = null;
// x.MeasureData = string.Empty;
// });
var tableRowAnswers = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == LastVisitTaskId).ProjectTo<CopyTableAnswerRowInfo>(_mapper.ConfigurationProvider).ToListAsync();
// tableRowAnswers.ForEach(x =>
// {
// x.SplitRowId = tableRowAnswers.Where(y => y.OriginalId == x.SplitRowId).Select(y => y.Id).FirstOrDefault();
// x.MergeRowId = tableRowAnswers.Where(y => y.OriginalId == x.MergeRowId).Select(y => y.Id).FirstOrDefault();
// });
tableRowAnswers.ForEach(x =>
{
x.VisitTaskId = visitTaskId;
x.IsCurrentTaskAdd = false;
x.Id = NewId.NextGuid();
x.SeriesId = null;
x.InstanceId = null;
x.MeasureData = string.Empty;
});
// List<QuestionMark?> notNeedCopyMarks = new List<QuestionMark?>()
// {
// QuestionMark.State,
// };
tableRowAnswers.ForEach(x =>
{
x.SplitRowId = tableRowAnswers.Where(y => y.OriginalId == x.SplitRowId).Select(y => y.Id).FirstOrDefault();
x.MergeRowId = tableRowAnswers.Where(y => y.OriginalId == x.MergeRowId).Select(y => y.Id).FirstOrDefault();
x.MergeRow = null;
x.SplitRow = null;
});
// var tableAnswers = copyTableAnswers.Select(x => new ReadingTableQuestionAnswer
// {
// Id = NewId.NextGuid(),
// Answer = notNeedCopyMarks.Contains(x.QuestionMark) ? string.Empty : x.Answer,
// QuestionId = x.QuestionId,
// RowIndex = x.RowIndex,
// RowId = tableRowAnswers.Where(y => y.OriginalId == x.RowId).Select(x => x.Id).FirstOrDefault(),
// TableQuestionId = x.TableQuestionId,
// TrialId = x.TrialId,
// VisitTaskId = visitTaskId,
// });
List<QuestionMark?> notNeedCopyMarks = new List<QuestionMark?>()
{
QuestionMark.State,
};
var tableAnswers = copyTableAnswers.Select(x => new ReadingTableQuestionAnswer
{
Id = NewId.NextGuid(),
Answer = notNeedCopyMarks.Contains(x.QuestionMark) ? string.Empty : x.Answer,
QuestionId = x.QuestionId,
RowIndex = x.RowIndex,
RowId = tableRowAnswers.Where(y => y.OriginalId == x.RowId).Select(x => x.Id).FirstOrDefault(),
TableQuestionId = x.TableQuestionId,
TrialId = x.TrialId,
VisitTaskId = visitTaskId,
});
// await _visitTaskRepository.UpdatePartialFromQueryAsync(visitTaskId, x => new VisitTask()
// {
// ReadingTaskState = ReadingTaskState.Reading,
try
{
var newLesionQuestion = await _readingQuestionTrialRepository.Where(x => x.LesionType == LesionType.NewLesions && x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId).FirstNotNullAsync();
var alwaysNewLesionsQuestion = await _readingQuestionTrialRepository.Where(x => x.LesionType == LesionType.AlwaysNewLesions && x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId).FirstNotNullAsync();
var newLesionTableQuestions = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == newLesionQuestion.Id).ToListAsync();
var alwaysNewLesionsTableQuestions = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == alwaysNewLesionsQuestion.Id).ToListAsync();
// });
Dictionary<Guid, Guid> alwaysTableQuestionIdDic = new Dictionary<Guid, Guid>();
// tableRowAnswers.ForEach(x =>
// {
// x.MergeRow = null;
// x.SplitRow = null;
// });
newLesionTableQuestions.ForEach(x =>
{
alwaysTableQuestionIdDic.Add(
x.Id,
alwaysNewLesionsTableQuestions.Where(y => y.QuestionName == x.QuestionName).Select(y => y.Id).FirstOrDefault()
);
});
var maxNewLesionsRowIndex = tableRowAnswers.Where(x => x.QuestionId == newLesionQuestion.Id).OrderByDescending(x => x.RowIndex).Select(x => x.RowIndex).FirstOrDefault();
maxNewLesionsRowIndex = Math.Floor(maxNewLesionsRowIndex);
foreach (var item in tableRowAnswers.Where(x => x.QuestionId == newLesionQuestion.Id).OrderBy(x=>x.RowIndex))
{
maxNewLesionsRowIndex++;
item.QuestionId = alwaysNewLesionsQuestion.Id;
item.RowIndex = maxNewLesionsRowIndex;
foreach (var tableAnswer in tableAnswers.Where(y=>y.RowId== item.Id))
{
tableAnswer.QuestionId= alwaysNewLesionsQuestion.Id;
tableAnswer.TableQuestionId = alwaysTableQuestionIdDic[tableAnswer.TableQuestionId];
}
}
}
catch (Exception)
{
throw new BusinessValidationFailedException($"PCWG3标准配置异常");
}
await _visitTaskRepository.UpdatePartialFromQueryAsync(visitTaskId, x => new VisitTask()
{
ReadingTaskState = ReadingTaskState.Reading,
});
// await _readingTableAnswerRowInfoRepository.AddRangeAsync(tableRowAnswers);
// await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers);
// await _readingTableQuestionAnswerRepository.SaveChangesAsync();
await _readingTableAnswerRowInfoRepository.AddRangeAsync(tableRowAnswers);
await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers);
await _readingTableQuestionAnswerRepository.SaveChangesAsync();
// }
//}
}
}
//return new AddTaskLesionAnswerFromLastTaskOutDto()
//{
return new AddTaskLesionAnswerFromLastTaskOutDto()
{
// IsBaseLine = taskinfo.SourceSubjectVisitId == baseLineVisitId,
//};
IsBaseLine = taskinfo.SourceSubjectVisitId == baseLineVisitId,
};
}
/// <summary>
/// 计算任务
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task CalculateTask(CalculateTaskInDto inDto)
{
ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
readingData.IsChangeOtherTask = inDto.IsChangeOtherTask;
await ReadingCalculate(readingData);
}
/// <summary>
/// 自动计算
/// </summary>
/// <param name="inDto"></param>
/// <param name="calculateType"></param>
/// <returns></returns>
public async Task ReadingCalculate(ReadingCalculateDto inDto, List<QuestionType> calculateType = null)
{
#region 计算 这里顺序非常重要 后面计算的值要依赖前面计算的结果
var needAddList = new List<ReadingTaskQuestionAnswer>();
List<ReadingCalculateData> calculateList = new List<ReadingCalculateData>()
{
// 基线病灶计数
new ReadingCalculateData (){QuestionType=QuestionType.BaseLineLesionsCount,GetIntFun=GetBaseLineLesionsCount},
// 新病灶计数
new ReadingCalculateData (){QuestionType=QuestionType.NewLesionsCount,GetIntFun=GetNewLesionsCount},
// 既往新病灶
new ReadingCalculateData (){QuestionType=QuestionType.AlwaysNewLesionsCount,GetIntFun=GetAlwaysNewLesionsCount},
// 自治疗后第二个访视点以来持续的新骨病变数量
new ReadingCalculateData (){QuestionType=QuestionType.NewBoneLesionsCount,GetIntFun=GetNewBoneLesionCount},
};
if (calculateType != null)
{
calculateList = calculateList.Where(x => calculateType.Contains(x.QuestionType)).ToList();
}
foreach (var calculate in calculateList)
{
var item = inDto.QuestionInfo.FirstOrDefault(x => x.QuestionType == calculate.QuestionType);
if (item != null)
{
//计算答案
if (inDto.IsOnlyChangeAllTask == false)
{
#region 计算答案
var value = await calculate.GetIntFun(inDto);
switch (calculate.QuestionType)
{
case QuestionType.NewLesionsCount:
if (inDto.VisitTaskNum >= 1)
{
item.Answer = value.ToString();
}
else
{
item.Answer = nameof(YesOrNoOrNa.NA);
}
break;
case QuestionType.AlwaysNewLesionsCount:
if (inDto.VisitTaskNum >= 2)
{
item.Answer = value.ToString();
}
else
{
item.Answer = nameof(YesOrNoOrNa.NA);
}
break;
case QuestionType.NewBoneLesionsCount:
if (inDto.VisitTaskNum >= 3)
{
item.Answer = value.ToString();
}
else
{
item.Answer = nameof(YesOrNoOrNa.NA);
}
break;
default:
item.Answer = value.ToString();
break;
}
#endregion
needAddList.Add(new ReadingTaskQuestionAnswer()
{
Answer = item.Answer,
ReadingQuestionTrialId = item.QuestionId,
});
}
// 修改全局
if (inDto.IsChangeOtherTask && calculate.ChangeAllTaskFun != null)
{
await calculate.ChangeAllTaskFun(new ChangeAllTaskDto()
{
calculateDto = inDto,
QuestionId = item.QuestionId,
});
}
}
}
var questionIds = needAddList.Select(x => x.ReadingQuestionTrialId).ToList();
await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => questionIds.Contains(x.ReadingQuestionTrialId) && x.VisitTaskId == inDto.VisitTaskId);
needAddList.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(needAddList);
await _readingTaskQuestionAnswerRepository.SaveChangesAsync();
#endregion
}
#region 基线病灶计数
/// <summary>
/// 基线病灶计数
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<int> GetBaseLineLesionsCount(ReadingCalculateDto inDto)
{
return inDto.QuestionInfo.Where(x => x.LesionType == LesionType.BaselineLesions).Select(x => x.TableRowInfoList).Count();
}
#endregion
#region 新病灶计数
/// <summary>
/// 获取新病灶计数
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<int> GetNewLesionsCount(ReadingCalculateDto inDto)
{
return inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NewLesions).SelectMany(x => x.TableRowInfoList)
.Where(x=>x.TableQuestionList.Any(y=>y.QuestionMark==QuestionMark.State&&y.Answer== EvaluationOfState.Exists.GetEnumInt()))
.Count();
}
#endregion
#region 既往新病灶计数
/// <summary>
/// 既往新病灶计数
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<int> GetAlwaysNewLesionsCount(ReadingCalculateDto inDto)
{
return inDto.QuestionInfo.Where(x => x.LesionType == LesionType.AlwaysNewLesions).SelectMany(x => x.TableRowInfoList)
.Where(x => x.TableQuestionList.Any(y => y.QuestionMark == QuestionMark.State && y.Answer == EvaluationOfState.Exists.GetEnumInt()))
.Count();
}
#endregion
#region 既往新病灶计数
/// <summary>
/// 自治疗后第二个访视点以来持续的新骨病变数量
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<int> GetNewBoneLesionCount(ReadingCalculateDto inDto)
{
if (inDto.VisitTaskNum < 3)
{
return 0;
}
List<VisitTaskAnswerInfo> visitTaskAnswerList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId != inDto.VisitTaskId && x.VisitTask.ReadingCategory == ReadingCategory.Visit
&& x.VisitTask.IsAnalysisCreate == inDto.IsAnalysisCreate
&& x.VisitTask.IsSelfAnalysis == inDto.IsSelfAnalysis
&& x.SubjectId == inDto.SubjectId && x.VisitTask.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTask.ArmEnum == inDto.ArmEnum && x.VisitTask.TaskState == TaskState.Effect && x.ReadingQuestionTrial.QuestionType == QuestionType.NewLesionsCount)
.Select(x => new VisitTaskAnswerInfo
{
VisitTaskId = x.VisitTaskId,
QuestionId = x.ReadingQuestionTrialId,
VisitName = x.VisitTask.SourceSubjectVisit.VisitName,
BlindName = x.VisitTask.SourceSubjectVisit.BlindName,
VisitTaskNum=x.VisitTask.VisitTaskNum,
NewLesionsCount = x.Answer.IsNullOrEmptyReturn0(),
}).ToListAsync();
visitTaskAnswerList = visitTaskAnswerList.Where(x => x.VisitTaskNum >= 2).ToList();
return int.Parse( Math.Floor(visitTaskAnswerList.Sum(x => x.NewLesionsCount)).ToString());
}
#endregion
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
{
return new() {

View File

@ -64,16 +64,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
Type thisServiceType = CalculateServiceDic[thisCriterionType];
_useCriterion = _criterionServices.FirstOrDefault(x => x.GetType().Name == thisServiceType.Name + "Proxy");
if (criterionType == null)
{
throw new BusinessValidationFailedException($"当前标准计算未开发好");
}
}
catch (Exception)
{
throw new BusinessValidationFailedException($"当前标准计算未开发好");
_useCriterion = null;
}
return _useCriterion;
@ -93,8 +90,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
public async Task CalculateTask(CalculateTaskInDto inDto)
{
var service = await this.GetService(inDto.VisitTaskId);
await service.CalculateTask(inDto);
if (service != null)
{
await service.CalculateTask(inDto);
}
}
/// <summary>
@ -105,7 +107,11 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
{
var service = await this.GetService(inDto.VisitTaskId);
await service.VerifyVisitTaskQuestions(inDto);
if (service != null)
{
await service.VerifyVisitTaskQuestions(inDto);
}
}
/// <summary>
@ -116,7 +122,15 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
public async Task<AddTaskLesionAnswerFromLastTaskOutDto> AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto)
{
var service = await this.GetService(inDto.VisitTaskId);
return await service.AddTaskLesionAnswerFromLastTask(inDto);
if (service != null)
{
return await service.AddTaskLesionAnswerFromLastTask(inDto);
}
else
{
return new AddTaskLesionAnswerFromLastTaskOutDto();
}
}
/// <summary>
@ -127,7 +141,16 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
public async Task<object> GetReportVerify(GetReportVerifyInDto inDto)
{
var service = await this.GetService(inDto.VisitTaskId);
return await service.GetReportVerify(inDto);
if (service != null)
{
return await service.GetReportVerify(inDto);
}
else
{
return new { };
}
}
}

View File

@ -317,6 +317,30 @@ namespace IRaCIS.Core.Domain.Share
}
/// <summary>
/// 病灶评估状态
/// </summary>
public enum EvaluationOfState
{
/// <summary>
/// 消失
/// </summary>
Loss = 1,
/// <summary>
/// 存在
/// </summary>
Exists = 2,
/// <summary>
/// 良性或不可评估
/// </summary>
Benign = 3
}
/// <summary>
/// 新病灶评估
/// </summary>
@ -900,6 +924,26 @@ namespace IRaCIS.Core.Domain.Share
/// 是否存在疾病
/// </summary>
ExistDisease = 15,
/// <summary>
/// 基线病灶计数
/// </summary>
BaseLineLesionsCount = 16,
/// <summary>
/// 新病灶计数
/// </summary>
NewLesionsCount = 17,
/// <summary>
/// 既往新病灶
/// </summary>
AlwaysNewLesionsCount = 18,
/// <summary>
/// 自治疗后第二个访视点以来持续的新骨病变数量
/// </summary>
NewBoneLesionsCount = 19,
}
/// <summary>