修改冲突
continuous-integration/drone/push Build is running Details

IRC_NewDev
hang 2024-09-25 14:47:20 +08:00
commit 282ba96c61
5 changed files with 360 additions and 7 deletions

View File

@ -3946,6 +3946,12 @@
<param name="inDto"></param> <param name="inDto"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.OCTCalculateService.UploadOCTFCTTemplate">
<summary>
导入OCT-FCT数据
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.OCTCalculateService.GetOCTLipidAngleTemplate(IRaCIS.Core.Application.Service.Reading.Dto.GetExportTemplateInDto)"> <member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.OCTCalculateService.GetOCTLipidAngleTemplate(IRaCIS.Core.Application.Service.Reading.Dto.GetExportTemplateInDto)">
<summary> <summary>
获取OCT-脂质角度模板 获取OCT-脂质角度模板
@ -3953,6 +3959,12 @@
<param name="inDto"></param> <param name="inDto"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.OCTCalculateService.UploadOCTLipidAngleTemplate">
<summary>
导入OCT-脂质角度数据
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.OCTCalculateService.ReadingCalculate(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto,System.Collections.Generic.List{IRaCIS.Core.Domain.Share.QuestionType})"> <member name="M:IRaCIS.Core.Application.Service.ReadingCalculate.OCTCalculateService.ReadingCalculate(IRaCIS.Core.Application.Service.Reading.Dto.ReadingCalculateDto,System.Collections.Generic.List{IRaCIS.Core.Domain.Share.QuestionType})">
<summary> <summary>
自动计算 自动计算
@ -6517,6 +6529,26 @@
外弹力膜面积- 管腔面积 外弹力膜面积- 管腔面积
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTFCTUploadData.PlaqueNum">
<summary>
斑块编号
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTFCTUploadData.FirstData">
<summary>
第一次
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTFCTUploadData.SecondData">
<summary>
第二次
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTFCTUploadData.ThirdData">
<summary>
第三次
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTInfo.PlaqueNum"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.OCTInfo.PlaqueNum">
<summary> <summary>
斑块编号 斑块编号

View File

@ -234,6 +234,34 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
} }
} }
public class OCTFCTUploadData
{
/// <summary>
/// 斑块编号
/// </summary>
public int PlaqueNum { get; set; }
/// <summary>
/// 第一次
/// </summary>
public int FirstData { get; set; }
/// <summary>
/// 第二次
/// </summary>
public int SecondData { get; set; }
/// <summary>
/// 第三次
/// </summary>
public int ThirdData { get; set; }
public decimal Avg { get {
return ( FirstData*1m + SecondData * 1m + ThirdData * 1m) / 3;
} }
}
public class OCTInfo public class OCTInfo
{ {

View File

@ -665,19 +665,19 @@ namespace IRaCIS.Core.Application.Service.RC
//needAddQuestionList.AddRange(readingQuestionTrialList); //needAddQuestionList.AddRange(readingQuestionTrialList);
}); });
// 标准的默认值 // 标准的默认值 标准默认值
foreach (var criterion in needAddCriterionList) foreach (var criterion in needAddCriterionList)
{ {
switch (criterion.CriterionType) switch (criterion.CriterionType)
{ {
case CriterionType.IVUS: case CriterionType.IVUS:
criterion.IsImageFilter = true; criterion.IsImageFilter = false;
criterion.IsReadingTaskViewInOrder = ReadingOrder.SubjectRandom; criterion.IsReadingTaskViewInOrder = ReadingOrder.SubjectRandom;
criterion.ImageDownloadEnum = ReadingImageDownload.Subejct; criterion.ImageDownloadEnum = ReadingImageDownload.Subejct;
criterion.ImageUploadEnum = ReadingImageUpload.IRReadingSubejctEnable; criterion.ImageUploadEnum = ReadingImageUpload.IRReadingSubejctEnable;
break; break;
case CriterionType.OCT: case CriterionType.OCT:
criterion.IsImageFilter = true; criterion.IsImageFilter = false;
criterion.IsReadingPeriod = false; criterion.IsReadingPeriod = false;
criterion.IsGlobalReading = false; criterion.IsGlobalReading = false;
criterion.IsReadingTaskViewInOrder = ReadingOrder.SubjectRandom; criterion.IsReadingTaskViewInOrder = ReadingOrder.SubjectRandom;

View File

@ -2,7 +2,9 @@
using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure;
using MassTransit; using MassTransit;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -18,6 +20,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository, IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository,
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository, IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
IRepository<OrganInfo> _organInfoRepository, IRepository<OrganInfo> _organInfoRepository,
IHttpContextAccessor httpContext,
IRepository<ReadingGlobalTaskInfo> _readingGlobalTaskInfoRepository, IRepository<ReadingGlobalTaskInfo> _readingGlobalTaskInfoRepository,
IRepository<SubjectVisit> _subjectVisitRepository, IRepository<SubjectVisit> _subjectVisitRepository,
IRepository<TumorAssessment_IRECIST1Point1> _tumorAssessmentRepository, IRepository<TumorAssessment_IRECIST1Point1> _tumorAssessmentRepository,
@ -456,6 +459,159 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}); });
} }
/// <summary>
/// 导入OCT-FCT数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task UploadOCTFCTTemplate()
{
var request = httpContext.HttpContext!.Request;
var file = request.Form.Files[0];
Guid visitTaskId = Guid.Parse(request.Form["VisitTaskId"]);
var dataTable = await _generalCalculateService.GetDataTableFromUpload(file);
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Include(x => x.Subject).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
var values = new
{
SubjectID = taskinfo.BlindSubjectCode.IsNullOrEmpty() ? taskinfo.Subject.Code : taskinfo.BlindSubjectCode,
TaskBlindName = taskinfo.TaskBlindName,
};
if (values.SubjectID != dataTable.Rows[0]["B"].ToString() || values.TaskBlindName != dataTable.Rows[1]["B"].ToString())
{
throw new BusinessValidationFailedException(_localizer["IVUS_UploadVisitTaskError"]);
}
List<OCTFCTUploadData> measuredValueList = new List<OCTFCTUploadData>();
try
{
for (int i = 3; i < dataTable.Rows.Count; i++)
{
measuredValueList.Add(new OCTFCTUploadData()
{
PlaqueNum = int.Parse(dataTable.Rows[i]["A"].ToString()),
FirstData = int.Parse(dataTable.Rows[i]["B"].ToString()),
SecondData = int.Parse(dataTable.Rows[i]["C"].ToString()),
ThirdData = int.Parse(dataTable.Rows[i]["D"].ToString()),
});
}
}
catch (Exception)
{
throw new BusinessValidationFailedException(_localizer["IVUS_UplpadDataError"]);
}
var questionInfo = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId && x.LesionType == LesionType.FCT).FirstNotNullAsync();
var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == questionInfo.Id).ToListAsync();
List<ReadingTableAnswerRowInfo> tableAnsweRowInfos = new List<ReadingTableAnswerRowInfo>();
List<ReadingTableQuestionAnswer> tableAnswers = new List<ReadingTableQuestionAnswer>();
var maxnum = 0;
foreach (var item in measuredValueList)
{
maxnum = maxnum + 1;
var newRowId = NewId.NextGuid();
// 斑块数据统计
tableAnsweRowInfos.Add(new ReadingTableAnswerRowInfo()
{
Id = newRowId,
QuestionId = questionInfo.Id,
VisitTaskId = taskinfo.Id,
TrialId = taskinfo.TrialId,
RowIndex = maxnum,
IsCurrentTaskAdd = true,
BlindName = taskinfo.TaskBlindName,
OrderMark = questionInfo.OrderMark,
FristAddTaskNum = taskinfo.VisitTaskNum,
FristAddTaskId = taskinfo.Id,
RowMark = questionInfo.OrderMark + decimal.Parse(maxnum.ToString()).GetLesionMark()
});
// 编号
tableAnswers.Add(new ReadingTableQuestionAnswer()
{
Answer = item.PlaqueNum.ToString(),
QuestionId = questionInfo.Id,
TrialId = taskinfo.TrialId,
VisitTaskId = taskinfo.Id,
RowId = newRowId,
RowIndex = maxnum,
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.PlaqueNumber).Select(x => x.Id).FirstOrDefault(),
});
var avg = item.Avg.ToString();
if (taskinfo.TrialReadingCriterion.DigitPlaces != -1)
{
var digitPlaces = taskinfo.TrialReadingCriterion.DigitPlaces ?? 0;
avg = decimal.Round(decimal.Parse(avg ?? "0"), digitPlaces).ToString("F" + digitPlaces.ToString());
}
// 第一次
tableAnswers.Add(new ReadingTableQuestionAnswer()
{
Answer = item.FirstData.ToString(),
QuestionId = questionInfo.Id,
TrialId = taskinfo.TrialId,
VisitTaskId = taskinfo.Id,
RowId = newRowId,
RowIndex = maxnum,
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.FirstFCT).Select(x => x.Id).FirstOrDefault(),
});
tableAnswers.Add(new ReadingTableQuestionAnswer()
{
Answer = item.SecondData.ToString(),
QuestionId = questionInfo.Id,
TrialId = taskinfo.TrialId,
VisitTaskId = taskinfo.Id,
RowId = newRowId,
RowIndex = maxnum,
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.SecondFCT).Select(x => x.Id).FirstOrDefault(),
});
tableAnswers.Add(new ReadingTableQuestionAnswer()
{
Answer = item.ThirdData.ToString(),
QuestionId = questionInfo.Id,
TrialId = taskinfo.TrialId,
VisitTaskId = taskinfo.Id,
RowId = newRowId,
RowIndex = maxnum,
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.ThirdFCT).Select(x => x.Id).FirstOrDefault(),
});
tableAnswers.Add(new ReadingTableQuestionAnswer()
{
Answer = avg,
QuestionId = questionInfo.Id,
TrialId = taskinfo.TrialId,
VisitTaskId = taskinfo.Id,
RowId = newRowId,
RowIndex = maxnum,
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.AvgFCT).Select(x => x.Id).FirstOrDefault(),
});
}
await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.QuestionId == questionInfo.Id && x.VisitTaskId == taskinfo.Id);
await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.QuestionId == questionInfo.Id && x.VisitTaskId == taskinfo.Id);
await _readingTableAnswerRowInfoRepository.AddRangeAsync(tableAnsweRowInfos);
await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers);
await _readingTableQuestionAnswerRepository.SaveChangesAsync();
await this.CalculateTask(new CalculateTaskInDto()
{
VisitTaskId = taskinfo.Id,
});
}
/// <summary> /// <summary>
/// 获取OCT-脂质角度模板 /// 获取OCT-脂质角度模板
/// </summary> /// </summary>
@ -478,6 +634,125 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}); });
} }
/// <summary>
/// 导入OCT-脂质角度数据
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task UploadOCTLipidAngleTemplate()
{
var request = httpContext.HttpContext!.Request;
var file = request.Form.Files[0];
Guid visitTaskId = Guid.Parse(request.Form["VisitTaskId"]);
var dataTable = await _generalCalculateService.GetDataTableFromUpload(file);
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Include(x => x.Subject).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
var values = new
{
SubjectID = taskinfo.BlindSubjectCode.IsNullOrEmpty() ? taskinfo.Subject.Code : taskinfo.BlindSubjectCode,
TaskBlindName = taskinfo.TaskBlindName,
};
if (values.SubjectID != dataTable.Rows[0]["B"].ToString() || values.TaskBlindName != dataTable.Rows[1]["B"].ToString())
{
throw new BusinessValidationFailedException(_localizer["IVUS_UploadVisitTaskError"]);
}
List<OCTFCTUploadData> measuredValueList = new List<OCTFCTUploadData>();
try
{
for (int i = 3; i < dataTable.Rows.Count; i++)
{
measuredValueList.Add(new OCTFCTUploadData()
{
PlaqueNum = int.Parse(dataTable.Rows[i]["A"].ToString()),
FirstData = int.Parse(dataTable.Rows[i]["B"].ToString()),
});
}
}
catch (Exception)
{
throw new BusinessValidationFailedException(_localizer["IVUS_UplpadDataError"]);
}
var questionInfo = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId && x.LesionType == LesionType.LipidAngle).FirstNotNullAsync();
var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == questionInfo.Id).ToListAsync();
List<ReadingTableAnswerRowInfo> tableAnsweRowInfos = new List<ReadingTableAnswerRowInfo>();
List<ReadingTableQuestionAnswer> tableAnswers = new List<ReadingTableQuestionAnswer>();
var maxnum = 0;
foreach (var item in measuredValueList)
{
maxnum = maxnum + 1;
var newRowId = NewId.NextGuid();
// 斑块数据统计
tableAnsweRowInfos.Add(new ReadingTableAnswerRowInfo()
{
Id = newRowId,
QuestionId = questionInfo.Id,
VisitTaskId = taskinfo.Id,
TrialId = taskinfo.TrialId,
RowIndex = maxnum,
IsCurrentTaskAdd = true,
BlindName = taskinfo.TaskBlindName,
OrderMark = questionInfo.OrderMark,
FristAddTaskNum = taskinfo.VisitTaskNum,
FristAddTaskId = taskinfo.Id,
RowMark = questionInfo.OrderMark + decimal.Parse(maxnum.ToString()).GetLesionMark()
});
// 编号
tableAnswers.Add(new ReadingTableQuestionAnswer()
{
Answer = item.PlaqueNum.ToString(),
QuestionId = questionInfo.Id,
TrialId = taskinfo.TrialId,
VisitTaskId = taskinfo.Id,
RowId = newRowId,
RowIndex = maxnum,
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.PlaqueNumber).Select(x => x.Id).FirstOrDefault(),
});
var avg = item.Avg.ToString();
if (taskinfo.TrialReadingCriterion.DigitPlaces != -1)
{
var digitPlaces = taskinfo.TrialReadingCriterion.DigitPlaces ?? 0;
avg = decimal.Round(decimal.Parse(avg ?? "0"), digitPlaces).ToString("F" + digitPlaces.ToString());
}
// 脂质角度
tableAnswers.Add(new ReadingTableQuestionAnswer()
{
Answer = item.FirstData.ToString(),
QuestionId = questionInfo.Id,
TrialId = taskinfo.TrialId,
VisitTaskId = taskinfo.Id,
RowId = newRowId,
RowIndex = maxnum,
TableQuestionId = tableQuestionList.Where(x => x.ReadingQuestionId == questionInfo.Id && x.QuestionMark == QuestionMark.LipidAngle).Select(x => x.Id).FirstOrDefault(),
});
}
await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.QuestionId == questionInfo.Id && x.VisitTaskId == taskinfo.Id);
await _readingTableQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.QuestionId == questionInfo.Id && x.VisitTaskId == taskinfo.Id);
await _readingTableAnswerRowInfoRepository.AddRangeAsync(tableAnsweRowInfos);
await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers);
await _readingTableQuestionAnswerRepository.SaveChangesAsync();
await this.CalculateTask(new CalculateTaskInDto()
{
VisitTaskId = taskinfo.Id,
});
}
/// <summary> /// <summary>
/// 自动计算 /// 自动计算
@ -702,7 +977,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
// 匹配动脉段最小FCT // 匹配动脉段最小FCT
tableAnswers.Add(new ReadingTableQuestionAnswer() tableAnswers.Add(new ReadingTableQuestionAnswer()
{ {
Answer = GetDigitPlacesData(oCTFCTInfos.Where(x => x.PlaqueNum == item).MinOrDefault(x => x.Data).ToString()), Answer = oCTFCTInfos.Count()==0? "0.00" : GetDigitPlacesData(oCTFCTInfos.Where(x => x.PlaqueNum == item).MinOrDefault(x => x.Data).ToString()),
Id = NewId.NextGuid(), Id = NewId.NextGuid(),
QuestionId = patchDataStatisticsInfo.Id, QuestionId = patchDataStatisticsInfo.Id,
TrialId = inDto.TrialId, TrialId = inDto.TrialId,
@ -715,7 +990,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
// 平均最小FCT // 平均最小FCT
tableAnswers.Add(new ReadingTableQuestionAnswer() tableAnswers.Add(new ReadingTableQuestionAnswer()
{ {
Answer = GetDigitPlacesData(oCTFCTInfos.Where(x => x.PlaqueNum == item).Average(x => x.Data).ToString()), Answer = oCTFCTInfos.Count() == 0 ? "0.00" : GetDigitPlacesData(oCTFCTInfos.Where(x => x.PlaqueNum == item).Average(x => x.Data).ToString()),
Id = NewId.NextGuid(), Id = NewId.NextGuid(),
QuestionId = patchDataStatisticsInfo.Id, QuestionId = patchDataStatisticsInfo.Id,
TrialId = inDto.TrialId, TrialId = inDto.TrialId,
@ -728,7 +1003,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
// 脂质角度平均值 // 脂质角度平均值
tableAnswers.Add(new ReadingTableQuestionAnswer() tableAnswers.Add(new ReadingTableQuestionAnswer()
{ {
Answer = GetDigitPlacesData(lipidAngleInfos.Where(x => x.PlaqueNum == item).Average(x => x.Data).ToString()), Answer = lipidAngleInfos.Count() == 0 ? "0.00" : GetDigitPlacesData(lipidAngleInfos.Where(x => x.PlaqueNum == item).Average(x => x.Data).ToString()),
Id = NewId.NextGuid(), Id = NewId.NextGuid(),
QuestionId = patchDataStatisticsInfo.Id, QuestionId = patchDataStatisticsInfo.Id,
TrialId = inDto.TrialId, TrialId = inDto.TrialId,
@ -741,7 +1016,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
// 脂质角度最大值 // 脂质角度最大值
tableAnswers.Add(new ReadingTableQuestionAnswer() tableAnswers.Add(new ReadingTableQuestionAnswer()
{ {
Answer = GetDigitPlacesData(lipidAngleInfos.Where(x => x.PlaqueNum == item).MaxOrDefault(x => x.Data).ToString()), Answer = lipidAngleInfos.Count() == 0 ? "0.00" : GetDigitPlacesData(lipidAngleInfos.Where(x => x.PlaqueNum == item).MaxOrDefault(x => x.Data).ToString()),
Id = NewId.NextGuid(), Id = NewId.NextGuid(),
QuestionId = patchDataStatisticsInfo.Id, QuestionId = patchDataStatisticsInfo.Id,
TrialId = inDto.TrialId, TrialId = inDto.TrialId,
@ -751,6 +1026,19 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
TableQuestionId = patchDataTableQuestion.Where(x => x.QuestionMark == QuestionMark.MaxAvgLipidAngle).Select(x => x.Id).FirstOrDefault(), TableQuestionId = patchDataTableQuestion.Where(x => x.QuestionMark == QuestionMark.MaxAvgLipidAngle).Select(x => x.Id).FirstOrDefault(),
}); });
// 待定指标
tableAnswers.Add(new ReadingTableQuestionAnswer()
{
Answer = string.Empty,
Id = NewId.NextGuid(),
QuestionId = patchDataStatisticsInfo.Id,
TrialId = inDto.TrialId,
VisitTaskId = inDto.VisitTaskId,
RowId = newRowId,
RowIndex = item,
TableQuestionId = patchDataTableQuestion.Where(x => x.QuestionMark == QuestionMark.Undetermined).Select(x => x.Id).FirstOrDefault(),
});
} }
await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x =>x.QuestionId== patchDataStatisticsInfo.Id && x.VisitTaskId == inDto.VisitTaskId); await _readingTableAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x =>x.QuestionId== patchDataStatisticsInfo.Id && x.VisitTaskId == inDto.VisitTaskId);

View File

@ -2146,6 +2146,11 @@ public enum SUVChangeVSBaseline
/// </summary> /// </summary>
MaxAvgLipidAngle = 1020, MaxAvgLipidAngle = 1020,
/// <summary>
/// 待定指标
/// </summary>
Undetermined = 1021,
} }