|
|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
using IRaCIS.Application.Contracts;
|
|
|
|
|
using DocumentFormat.OpenXml.Spreadsheet;
|
|
|
|
|
using IRaCIS.Application.Contracts;
|
|
|
|
|
using IRaCIS.Application.Interfaces;
|
|
|
|
|
using IRaCIS.Core.Application.Helper;
|
|
|
|
|
using IRaCIS.Core.Application.ViewModel;
|
|
|
|
|
@ -10,7 +11,9 @@ using Microsoft.AspNetCore.Hosting;
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
using MiniExcelLibs;
|
|
|
|
|
using MiniExcelLibs.OpenXml;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using NPOI.SS.Formula.Functions;
|
|
|
|
|
using Org.BouncyCastle.Asn1.X509;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
@ -226,6 +229,7 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
.Select(t => new IVUS_OCTBaseDto()
|
|
|
|
|
{
|
|
|
|
|
ResearchProgramNo = t.Trial.ResearchProgramNo,
|
|
|
|
|
TrialSiteCode = t.Subject.TrialSite.TrialSiteCode,
|
|
|
|
|
SubjectCode = t.Subject.Code,
|
|
|
|
|
UserName = t.DoctorUser.UserName,
|
|
|
|
|
ArmEnum = t.ArmEnum,
|
|
|
|
|
@ -278,6 +282,7 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
.Select(c => new TumorCommonQustionInfo()
|
|
|
|
|
{
|
|
|
|
|
QuestionType = c.ReadingQuestionTrial.QuestionType,
|
|
|
|
|
OptionTypeEnum = c.ReadingQuestionTrial.OptionTypeEnum,
|
|
|
|
|
QuestionId = c.ReadingQuestionTrial.Id,
|
|
|
|
|
QuestionName = isEn_Us ? c.ReadingQuestionTrial.QuestionEnName : c.ReadingQuestionTrial.QuestionName,
|
|
|
|
|
QuestionValue = c.IsGlobalChange ? c.GlobalChangeAnswer : c.Answer,
|
|
|
|
|
@ -300,6 +305,7 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
RowId = k.RowId,
|
|
|
|
|
OptionTypeEnum = k.ReadingTableQuestionTrial.OptionTypeEnum,
|
|
|
|
|
TranslateDicName = k.ReadingTableQuestionTrial.DictionaryCode,
|
|
|
|
|
QuestionMark = k.ReadingTableQuestionTrial.QuestionMark,
|
|
|
|
|
TableQuesionId = k.ReadingTableQuestionTrial.Id,
|
|
|
|
|
@ -358,8 +364,11 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
|
|
|
|
|
#region 字典和各个表的数组准备
|
|
|
|
|
|
|
|
|
|
var dicNameList = new List<string>() { "ArmEnum", "ValueUnit" }
|
|
|
|
|
.Distinct().ToArray();
|
|
|
|
|
var dicNameList = taskList.SelectMany(t => t.QuestionAnswerList).Select(t => t.TranslateDicName)
|
|
|
|
|
.Union(taskList.SelectMany(t => t.LesionList).SelectMany(t => t.LessionAnswerList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(c => c.TranslateDicName))
|
|
|
|
|
.Union(new List<string>() { "ArmEnum", "ValueUnit" })
|
|
|
|
|
.Distinct().ToArray();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//翻译字典
|
|
|
|
|
var translateDataList = await _dictionaryService.GetBasicDataSelect(dicNameList);
|
|
|
|
|
@ -392,7 +401,9 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//靶段
|
|
|
|
|
ivus.TARGETV = task.QuestionAnswerList.Where(t => t.QuestionType == QuestionType.TargetSegment).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
var target = task.QuestionAnswerList.Where(t => t.QuestionType == QuestionType.TargetSegment).FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
ivus.TARGETV = translateDataList[target?.TranslateDicName].Where(t => t.Code.ToLower() == target?.QuestionValue?.ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var marks = task.QuestionAnswerList.Where(t => t.QuestionType == QuestionType.TargetSegmentRemarks).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
@ -431,7 +442,7 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
ivus.TOTALPA = findStatLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.EEMSubtractLumenSum).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
//冠状动脉粥样硬化体积百分比(PAV)
|
|
|
|
|
|
|
|
|
|
ivus.TOTALPA = findPAVLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.PAV).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
ivus.PAV = findPAVLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.PAV).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
|
|
|
|
|
ivusList.Add(ivus);
|
|
|
|
|
|
|
|
|
|
@ -459,12 +470,12 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
{
|
|
|
|
|
pNoIndex++;
|
|
|
|
|
|
|
|
|
|
foreach (var lessionAnswer in fctLesion?.LessionAnswerList.Where(t => t.QuestionMark != QuestionMark.PlaqueNumber).OrderBy(t=>t.ShowOrder))
|
|
|
|
|
foreach (var lessionAnswer in fctLesion?.LessionAnswerList.Where(t => t.QuestionMark != QuestionMark.PlaqueNumber).OrderBy(t => t.ShowOrder))
|
|
|
|
|
{
|
|
|
|
|
var mark = string.Empty;
|
|
|
|
|
switch (lessionAnswer.QuestionMark)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case QuestionMark.FirstFCT:
|
|
|
|
|
mark = "FCTMV1";
|
|
|
|
|
break;
|
|
|
|
|
@ -475,30 +486,30 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
mark = "FCTMV3";
|
|
|
|
|
break;
|
|
|
|
|
case QuestionMark.AvgFCT:
|
|
|
|
|
mark = "AVGFCT";
|
|
|
|
|
break;
|
|
|
|
|
case QuestionMark.MacrophageInfiltration:
|
|
|
|
|
mark = "AVGFCT";
|
|
|
|
|
break;
|
|
|
|
|
case QuestionMark.MacrophageInfiltrationMeasurement:
|
|
|
|
|
mark = "MACRI";
|
|
|
|
|
break;
|
|
|
|
|
case QuestionMark.MacrophageExtensionAngle:
|
|
|
|
|
case QuestionMark.MacrophageInfiltrationAngle:
|
|
|
|
|
mark = "MIARC";
|
|
|
|
|
break;
|
|
|
|
|
case QuestionMark.Microchannels:
|
|
|
|
|
case QuestionMark.MicrochannelMeasurement:
|
|
|
|
|
mark = "MC";
|
|
|
|
|
break;
|
|
|
|
|
case QuestionMark.CholesterolCrystallization:
|
|
|
|
|
case QuestionMark.CholesterolCrystalMeasurement:
|
|
|
|
|
mark = "CCS";
|
|
|
|
|
break;
|
|
|
|
|
case QuestionMark.LumenArea:
|
|
|
|
|
case QuestionMark.LumenAreaMeasurement:
|
|
|
|
|
mark = "LUMEN";
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mark.IsNotNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
var oct = CreatOCT(task, pNo);
|
|
|
|
|
var oct = CreatOCT(task, pNo, translateDataList);
|
|
|
|
|
|
|
|
|
|
// 测量标识 阅片人_斑块号_表格_行号
|
|
|
|
|
|
|
|
|
|
@ -629,7 +640,7 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
|
|
|
|
|
if (findAngle != null)
|
|
|
|
|
{
|
|
|
|
|
var oct = CreatOCT(task, pNo);
|
|
|
|
|
var oct = CreatOCT(task, pNo, translateDataList);
|
|
|
|
|
|
|
|
|
|
// 测量标识
|
|
|
|
|
|
|
|
|
|
@ -697,15 +708,20 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private OctExportDto CreatOCT(IVUS_OCTBaseDto task, string pNo)
|
|
|
|
|
private OctExportDto CreatOCT(IVUS_OCTBaseDto task, string pNo, Dictionary<string, List<BasicDicSelectCopy>> translateDataList)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
|
|
|
|
|
|
|
|
|
|
var oct = _mapper.Map<OctExportDto>(task);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//靶段
|
|
|
|
|
//靶段
|
|
|
|
|
oct.TARGETV = task.QuestionAnswerList.Where(t => t.QuestionType == QuestionType.TargetSegment).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
|
|
|
|
|
var target = task.QuestionAnswerList.Where(t => t.QuestionType == QuestionType.TargetSegment).FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
oct.TARGETV = translateDataList[target?.TranslateDicName].Where(t => t.Code.ToLower() == target?.QuestionValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var marks = task.QuestionAnswerList.Where(t => t.QuestionType == QuestionType.TargetSegmentRemarks).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
@ -722,7 +738,44 @@ public class IVUS_OCTExportService(IRepository<ReadingQuestionCriterionTrial> _r
|
|
|
|
|
&& t.LessionAnswerList.Any(t => t.QuestionMark == QuestionMark.PlaqueNumber && t.QuestionValue == pNo)).FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
// 斑块类型
|
|
|
|
|
oct.PLATYPE = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.Undetermined).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
var undetermined = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.Undetermined).FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
if (undetermined?.OptionTypeEnum == OptionType.Multiple)
|
|
|
|
|
{
|
|
|
|
|
var qValue = undetermined?.QuestionValue;
|
|
|
|
|
int[] enumValues = new int[0];
|
|
|
|
|
// 1. 反序列化 JSON 数组 (字符串枚举)
|
|
|
|
|
if (!qValue.StartsWith("[") || !qValue.EndsWith("]"))
|
|
|
|
|
{
|
|
|
|
|
enumValues = new int[1] { int.Parse(qValue) };
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
enumValues = JsonConvert.DeserializeObject<int[]>(qValue) ?? new int[0];
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. 翻译每一项并输出逗号拼接字符串
|
|
|
|
|
var tValue = string.Join(",",
|
|
|
|
|
enumValues.Select(code =>
|
|
|
|
|
translateDataList[undetermined.TranslateDicName]
|
|
|
|
|
.FirstOrDefault(t =>
|
|
|
|
|
string.Equals(code.ToString(), t.Code, StringComparison.OrdinalIgnoreCase)
|
|
|
|
|
) is var r && r != null
|
|
|
|
|
? (isEn_US ? r.Value : r.ValueCN)
|
|
|
|
|
: string.Empty
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
oct.PLATYPE = tValue;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
oct.PLATYPE = translateDataList[undetermined?.TranslateDicName].Where(t => t.Code.ToLower() == undetermined?.QuestionValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 匹配动脉段最小FCT
|
|
|
|
|
oct.MINFCT = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MiniMumFCT).FirstOrDefault()?.QuestionValue ?? string.Empty;
|
|
|
|
|
// 平均最小FCT
|
|
|
|
|
|