Uat_Study
he 2022-09-07 15:47:54 +08:00
parent 6295820804
commit d751bca3ea
4 changed files with 205 additions and 56 deletions

View File

@ -30,6 +30,8 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
public Guid? DoctorUserId { get; set; }
public Guid SubjectVisitId { get; set; } public Guid SubjectVisitId { get; set; }
public bool IsChangeOtherTask { get; set; } public bool IsChangeOtherTask { get; set; }
@ -96,6 +98,9 @@ namespace IRaCIS.Core.Application.ViewModel
public class VisitTaskAnswerInfo public class VisitTaskAnswerInfo
{ {
public Guid VisitTaskId { get; set; }
public Guid QuestionId { get; set; }
public string VisitName { get; set; } public string VisitName { get; set; }
public decimal SOD { get; set; } public decimal SOD { get; set; }

View File

@ -353,7 +353,14 @@ namespace IRaCIS.Application.Services
[HttpDelete("{readModuleId:guid}")] [HttpDelete("{readModuleId:guid}")]
public async Task<IResponseOutput> DeleteReadModule(Guid readModuleId) public async Task<IResponseOutput> DeleteReadModule(Guid readModuleId)
{ {
var readModule = await _readModuleRepository.Where(x => x.Id == readModuleId).FirstNotNullAsync();
if (readModule.ModuleType==ModuleTypeEnum.Global&&(await _readModuleRepository.AnyAsync(x=>x.ModuleType==ModuleTypeEnum.Oncology&&x.SubjectVisitId== readModule.SubjectVisitId)))
{
throw new BusinessValidationFailedException("当前访视存在肿瘤学阅片,请先删除肿瘤学阅片");
}
if (await _visitTaskRepository.AnyAsync(x => readModuleId==x.SouceReadModuleId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect)) if (await _visitTaskRepository.AnyAsync(x => readModuleId==x.SouceReadModuleId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect))
{ {
throw new BusinessValidationFailedException("当前阅片已生成任务并且阅片完成,操作失败。"); throw new BusinessValidationFailedException("当前阅片已生成任务并且阅片完成,操作失败。");

View File

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

View File

@ -1867,6 +1867,12 @@ namespace IRaCIS.Application.Services
} }
} }
var isCurrentTaskAddList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == inDto.QuestionId && x.TrialId == inDto.TrialId && x.RowIndex == inDto.RowIndex).Select(x => x.IsCurrentTaskAdd).ToListAsync();
bool isCurrentTaskAdd = true;
if (isCurrentTaskAddList.Count() > 0)
{
isCurrentTaskAdd = isCurrentTaskAddList[0];
}
await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == inDto.QuestionId && x.TrialId == inDto.TrialId && x.RowIndex == inDto.RowIndex); await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == inDto.QuestionId && x.TrialId == inDto.TrialId && x.RowIndex == inDto.RowIndex);
@ -1883,13 +1889,14 @@ namespace IRaCIS.Application.Services
VisitTaskId = inDto.VisitTaskId VisitTaskId = inDto.VisitTaskId
}).ToList(); }).ToList();
await _readingTableAnswerRowInfoRepository.AddAsync(new ReadingTableAnswerRowInfo() await _readingTableAnswerRowInfoRepository.AddAsync(new ReadingTableAnswerRowInfo()
{ {
Id = NewId.NextGuid(), Id = NewId.NextGuid(),
TrialId = inDto.TrialId, TrialId = inDto.TrialId,
QuestionId = inDto.QuestionId, QuestionId = inDto.QuestionId,
MeasureData = inDto.MeasureData, MeasureData = inDto.MeasureData,
IsCurrentTaskAdd=true, IsCurrentTaskAdd= isCurrentTaskAdd,
RowIndex = inDto.RowIndex, RowIndex = inDto.RowIndex,
InstanceId=inDto.InstanceId, InstanceId=inDto.InstanceId,
SeriesId=inDto.SeriesId, SeriesId=inDto.SeriesId,