From f19fc0e92f98154362c77b9c861453ecfc550be1 Mon Sep 17 00:00:00 2001
From: hang <872297557@qq.com>
Date: Thu, 27 Nov 2025 10:56:05 +0800
Subject: [PATCH] =?UTF-8?q?ivus-=E5=AF=BC=E8=A1=A8=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Attribute/DictionaryTranslateAttribute.cs | 12 +
.../Service/Common/ExcelExportService.cs | 5 +
.../Service/Common/IVUS_OCTExportService.cs | 1017 +++++++++++++++++
.../Service/Common/_MapConfig.cs | 4 +
IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs | 29 +-
.../_IRaCIS/ObjectExtension.cs | 7 +
.../_IRaCIS/_Config/_StaticData.cs | 4 +
7 files changed, 1077 insertions(+), 1 deletion(-)
create mode 100644 IRaCIS.Core.Application/Service/Common/IVUS_OCTExportService.cs
diff --git a/IRaCIS.Core.Application/Helper/FileDocProcess/Attribute/DictionaryTranslateAttribute.cs b/IRaCIS.Core.Application/Helper/FileDocProcess/Attribute/DictionaryTranslateAttribute.cs
index 051b72909..e54a72747 100644
--- a/IRaCIS.Core.Application/Helper/FileDocProcess/Attribute/DictionaryTranslateAttribute.cs
+++ b/IRaCIS.Core.Application/Helper/FileDocProcess/Attribute/DictionaryTranslateAttribute.cs
@@ -60,4 +60,16 @@ namespace IRaCIS.Core.Application.Helper
}
}
+
+ [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
+ public class DateTimeTranaslateAttribute : Attribute
+ {
+ public string Formart { get; set; }
+
+ public DateTimeTranaslateAttribute(string formart)
+ {
+ Formart = formart;
+
+ }
+ }
}
diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs
index 6d302a3f4..203ec15a3 100644
--- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs
+++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs
@@ -2765,6 +2765,11 @@ namespace IRaCIS.Core.Application.Service.Common
if (criterion.CriterionType == CriterionType.OCT)
{
list.Add(new ExportDocumentDes() { Code = StaticData.Export.OCT_ReadingLession_Export, ExportCatogory = ExportResult.OCT_ReadingLession_Export });
+ list.Add(new ExportDocumentDes() { Code = StaticData.Export.OCT_CDISC_Export, ExportCatogory = ExportResult.OCT_CDISC_Export });
+ }
+ if (criterion.CriterionType == CriterionType.IVUS)
+ {
+ list.Add(new ExportDocumentDes() { Code = StaticData.Export.IVUS_CDISC_Export, ExportCatogory = ExportResult.IVUS_CDISC_Export });
}
if (criterion.CriterionGroup != CriterionGroup.Tumor)
diff --git a/IRaCIS.Core.Application/Service/Common/IVUS_OCTExportService.cs b/IRaCIS.Core.Application/Service/Common/IVUS_OCTExportService.cs
new file mode 100644
index 000000000..8796c4f77
--- /dev/null
+++ b/IRaCIS.Core.Application/Service/Common/IVUS_OCTExportService.cs
@@ -0,0 +1,1017 @@
+using IRaCIS.Application.Contracts;
+using IRaCIS.Application.Interfaces;
+using IRaCIS.Core.Application.Helper;
+using IRaCIS.Core.Application.ViewModel;
+using IRaCIS.Core.Domain.Share;
+using IRaCIS.Core.Infra.EFCore.Common;
+using IRaCIS.Core.Infrastructure.Extention;
+using MassTransit;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using MiniExcelLibs;
+using MiniExcelLibs.OpenXml;
+using NPOI.SS.Formula.Functions;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IRaCIS.Core.Application.Service.Common;
+
+#region 模型
+
+///
+/// 公共影像导表基类(IVUS / OCT 通用)
+///
+public class IVUS_OCTBaseDto
+{
+ /// 研究标识符
+ public string ResearchProgramNo { get; set; }
+
+ /// 中心编号
+ public string TrialSiteCode { get; set; }
+
+ /// 受试者标识符
+ public string SubjectCode { get; set; }
+
+ /// 受试者唯一标识
+ public string USUBJID => ResearchProgramNo + "_" + SubjectCode;
+
+ /// 访视名称
+ public string? VisitName { get; set; }
+
+ /// 阅片人角色
+ [DictionaryTranslateAttribute("ArmEnum")]
+ public Arm ArmEnum { get; set; }
+
+ /// 拍片日期
+ [DateTimeTranaslateAttribute("yyyy-MM-dd")]
+ public DateTime? LatestScanDate { get; set; }
+
+ [DateTimeTranaslateAttribute("yyyy-MM-dd")]
+ public DateTime? EarliestScanDate { get; set; }
+
+ /// 阅片完成时间
+ [DateTimeTranaslateAttribute("yyyy-MM-dd")]
+ public DateTime? SignTime { get; set; }
+
+ ///
+ /// 访视编号 VISITNUM
+ ///
+ public decimal? VisitNum { get; set; }
+
+ public string TaskName { get; set; }
+
+ public string UserName { get; set; }
+
+ public Guid VisitTaskId { get; set; }
+
+ public string CriterionName { get; set; }
+ #region 查询 导出
+ public List LesionList { get; set; } = new List();
+
+ public List QuestionAnswerList { get; set; }
+
+ public List GlobalResultList { get; set; }
+
+
+ public DateTime? JudgeSignTime { get; set; }
+
+ public Guid? SourceSubjectVisitId { get; set; }
+
+ public List SubjectCriterionReadingPeriodVisitNumList { get; set; }
+
+ public decimal VisitTaskNum { get; set; }
+
+ public ReadingTaskState ReadingTaskState { get; set; }
+
+ public ReadingCategory ReadingCategory { get; set; }
+
+ //裁判选择标记 裁判结果选择的访视或者全局任务Id
+ [DictionaryTranslateAttribute("ArmEnum")]
+ public Arm? JudgeArmEnum { get; set; }
+ [DictionaryTranslate("YesOrNo")]
+ public bool? IsJudgeSelect { get; set; }
+ //在当前访视触发裁判,或者在截止日期小于等于当前访视的阅片期触发裁判
+ [DictionaryTranslate("YesOrNo")]
+ public bool? IsTrigerJudge { get; set; }
+
+ //裁判选择原因(如果是访视点裁判,则仅在所选阅片人对应访视 显示;如果是阅片期裁判,则在所选阅片人 阅片期内的所有访视 显示此原因)
+ public string JudgeNote { get; set; } = string.Empty;
+ /// 访视点备注
+ public string VisitNote { get; set; }
+
+ #endregion
+
+
+}
+
+
+///
+/// IVUS 导表模型
+///
+public class IvusExportDto : IVUS_OCTBaseDto
+{
+ /// 靶段
+ public string TARGETV { get; set; }
+
+ /// 斑块编号
+ public string PLAQUE { get; set; }
+
+ /// 外弹力膜面积
+ public string EEM { get; set; }
+
+ /// 管腔面积
+ public string LUMEN { get; set; }
+
+ /// 外弹力膜与管腔面积差值
+ public string PA { get; set; }
+
+ /// 回撤中的图像帧数
+ public string PFC { get; set; }
+
+ /// 分析图像帧数
+ public string FC { get; set; }
+
+ /// 总外弹力膜面积 (如无可不填)
+ public string TOTALEEM { get; set; }
+
+ /// 总 PA (如无可不填)
+ public string TOTALPA { get; set; }
+
+ /// PAV (如无可不填)
+ public string PAV { get; set; }
+}
+
+///
+/// OCT 导表模型
+///
+public class OctExportDto : IVUS_OCTBaseDto
+{
+ /// 靶段
+ public string TARGETV { get; set; }
+
+ /// 斑块编号
+ public string PLAQUE { get; set; }
+
+ /// 测量标识
+ public string TestID { get; set; }
+
+ /// 测量参数名称
+ public string TESTCD { get; set; }
+
+ /// 测量参数值
+ public string ORRES { get; set; }
+
+ /// 测量值单位
+ public string ORRESU { get; set; }
+
+ /// 斑块类型
+ public string PLATYPE { get; set; }
+
+ /// 最小纤维帽厚度
+ public string MINFCT { get; set; }
+
+ /// 平均纤维帽厚度
+ public string AVGMFCT { get; set; }
+
+ /// 脂质角度平均值
+ public string LAMEAN { get; set; }
+
+ /// 脂质角度最大值
+ public string LAMAX { get; set; }
+
+ /// 巨噬细胞浸润
+ public string MACRI { get; set; }
+
+ /// 巨噬细胞浸润角度
+ public string MIARC { get; set; }
+
+ /// 微通道
+ public string MC { get; set; }
+
+ /// 胆固醇结晶
+ public string CCS { get; set; }
+}
+
+
+
+#endregion
+
+[ApiExplorerSettings(GroupName = "Common")]
+public class IVUS_OCTExportService(IRepository _readingQuestionCriterionTrialRepository, IRepository _visitTaskRepository,
+ IRepository _subjectVisitTaskRepository,
+ IMapper _mapper, IUserInfo _userInfo, IRepository _commonDocumentRepository, IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService
+{
+
+ private IQueryable GetCIDSCQueryable(VisitTaskQuery inQuery, ArbitrationRule arbitrationRule, Guid trialReadingCriterionId)
+ {
+ var isEn_Us = _userInfo.IsEn_Us;
+
+
+ var query = _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.IsAnalysisCreate == false && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze))
+
+ //访视和全局查询已签名完成的,裁判可以是未签名,未完成的
+ .Where(t => (t.ReadingTaskState == ReadingTaskState.HaveSigned && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global)) || t.ReadingCategory == ReadingCategory.Judge)
+ .WhereIf(inQuery.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
+ .WhereIf(inQuery.TrialSiteId != null, t => t.Subject.TrialSiteId == inQuery.TrialSiteId)
+
+ .WhereIf(inQuery.ArmEnum != null, t => t.ArmEnum == inQuery.ArmEnum)
+ .WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate == false))
+ .WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.TaskName.Contains(inQuery.TaskName) || t.TaskBlindName.Contains(inQuery.TaskName))
+ .WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.Subject.Code.Contains(inQuery.SubjectCode))
+ .Select(t => new IVUS_OCTBaseDto()
+ {
+ ResearchProgramNo = t.Trial.ResearchProgramNo,
+ SubjectCode = t.Subject.Code,
+ UserName = t.DoctorUser.UserName,
+ ArmEnum = t.ArmEnum,
+
+ TaskName = t.TaskName,
+ SignTime = t.SignTime,
+ JudgeSignTime = t.ReadingCategory == ReadingCategory.Judge ? t.SignTime : null,
+ SourceSubjectVisitId = t.SourceSubjectVisitId,
+ VisitTaskNum = t.VisitTaskNum,
+ VisitNum = t.VisitTaskNum,
+ VisitName = t.SourceSubjectVisit.VisitName,
+ EarliestScanDate = t.SourceSubjectVisit.EarliestScanDate,
+ LatestScanDate = t.SourceSubjectVisit.LatestScanDate,
+ VisitTaskId = t.Id,
+ CriterionName = t.TrialReadingCriterion.CriterionName,
+
+
+
+ ReadingCategory = t.ReadingCategory,
+ ReadingTaskState = t.ReadingTaskState,
+
+
+ //以最后为准,没法直接获取(涉及到全局,裁判)
+ SubjectCriterionReadingPeriodVisitNumList = t.Subject.ReadModuleList.Where(u => u.TrialReadingCriterionId == trialReadingCriterionId && u.ReadingSetType == ReadingSetType.ImageReading).Select(c => c.SubjectVisit.VisitNum).ToList(),
+
+ IsJudgeSelect = null,
+
+ JudgeArmEnum = t.JudgeResultTask.ArmEnum,
+
+ IsTrigerJudge = arbitrationRule == ArbitrationRule.Visit ? t.JudgeVisitTaskId != null :
+ (arbitrationRule == ArbitrationRule.Reading ?
+ t.Subject.SubjectVisitTaskList.Any(c => c.TaskState == TaskState.Effect && c.IsAnalysisCreate == false && c.ReadingCategory == ReadingCategory.Judge && c.TrialReadingCriterionId == trialReadingCriterionId && t.VisitTaskNum < c.VisitTaskNum) :
+ false),
+ JudgeNote = t.ReadingCategory == ReadingCategory.Judge ? t.JudgeResultRemark : "",
+
+ //全局 访视上修改会要求填写
+ VisitNote = t.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.AdjustReason).FirstOrDefault()!.Answer,
+
+ GlobalResultList = t.GlobalVisitResultList.Where(t => t.GlobalAnswerType == GlobalAnswerType.Reason || t.GlobalAnswerType == GlobalAnswerType.UpdateType).Select(t => new TumorGlobalQuestionAnserInfo()
+ {
+ TaskId = t.TaskId,
+ GlobalAnswerType = t.GlobalAnswerType,
+ Answer = t.Answer
+ }).ToList(),
+
+
+
+ QuestionAnswerList = t.ReadingTaskQuestionAnswerList
+ .OrderBy(u => u.ReadingQuestionTrial.ShowOrder)
+ .Select(c => new TumorCommonQustionInfo()
+ {
+ QuestionType = c.ReadingQuestionTrial.QuestionType,
+ QuestionId = c.ReadingQuestionTrial.Id,
+ QuestionName = isEn_Us ? c.ReadingQuestionTrial.QuestionEnName : c.ReadingQuestionTrial.QuestionName,
+ QuestionValue = c.IsGlobalChange ? c.GlobalChangeAnswer : c.Answer,
+ TranslateDicName = c.ReadingQuestionTrial.DictionaryCode,
+ ValueType = c.ReadingQuestionTrial.ValueType,
+ Unit = c.ReadingQuestionTrial.Unit
+ }).ToList(),
+
+ LesionList = t.LesionList.OrderBy(t => t.RowMark).Select(c => new TumorLessionInfo()
+ {
+ Id = c.Id,
+ OrganInfoId = c.OrganInfoId,
+ LessionType = c.ReadingQuestionTrial.LesionType,
+ LessionCode = c.RowMark,
+ SplitRowId = c.SplitRowId,
+ DicomModality = c.DicomSeries.DicomStudy.ModalityForEdit,
+ NoneDicomModality = c.NoneDicomStudy.Modality,
+
+ LessionAnswerList = c.LesionAnswerList.Select(k => new TumorLessionAnswerInfo()
+ {
+
+ RowId = k.RowId,
+ TranslateDicName = k.ReadingTableQuestionTrial.DictionaryCode,
+ QuestionMark = k.ReadingTableQuestionTrial.QuestionMark,
+ TableQuesionId = k.ReadingTableQuestionTrial.Id,
+ QuestionName = isEn_Us ? k.ReadingTableQuestionTrial.QuestionEnName : k.ReadingTableQuestionTrial.QuestionName,
+ QuestionValue = k.Answer,
+ ShowOrder = k.ReadingTableQuestionTrial.ShowOrder,
+ Unit = k.ReadingTableQuestionTrial.Unit
+
+ }).ToList(),
+
+ }).ToList()
+
+ });
+
+ return query;
+ }
+
+
+ [HttpPost]
+ public async Task GetTumor_CDISC_Export(VisitTaskQuery inQuery,
+ [FromServices] IRepository _visitTaskReReadingRepository,
+ [FromServices] IDictionaryService _dictionaryService,
+ [FromServices] IRepository _trialOrganRepository,
+ [FromServices] IRepository _trialReadingQuestionRepository,
+ [FromServices] IRepository _trialReadingTableQuestionRepository,
+ [FromServices] IRepository _trialRepository)
+ {
+ //每次查询必须是单标准的
+ var criterion = await _readingQuestionCriterionTrialRepository
+ .WhereIf(inQuery.TrialReadingCriterionId != null, t => t.Id == inQuery.TrialReadingCriterionId)
+ .WhereIf(inQuery.CriterionType != null, t => t.CriterionType == inQuery.CriterionType)
+ .Select(t => new { t.Id, t.CriterionType, t.CriterionGroup, t.IsGlobalReading, t.IsArbitrationReading, t.IsOncologyReading, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync();
+
+ var arbitrationRule = criterion.ArbitrationRule;
+
+ var isEn_Us = _userInfo.IsEn_Us;
+
+ var query = GetCIDSCQueryable(inQuery, arbitrationRule, criterion.Id);
+
+ //任务排序
+ var taskList = await query.OrderBy(t => t.SubjectCode).ThenBy(t => t.VisitTaskNum).ThenBy(t => t.ArmEnum).ToListAsync();
+
+ //重阅信息
+ var reReadingList = _visitTaskReReadingRepository.Where(t => t.TrialId == inQuery.TrialId && t.RequestReReadingType == RequestReReadingType.DocotorApply).Select(t => new
+ {
+ t.OriginalReReadingTask.VisitTaskNum,
+ t.OriginalReReadingTask.ArmEnum,
+ t.OriginalReReadingTask.DoctorUser.UserName,
+ t.RequestReReadingReason
+ }).ToList();
+
+ //处理裁判标记
+ taskList = DealJudgeMark(criterion.ArbitrationRule, criterion.IsGlobalReading, taskList);
+
+
+
+ #region 字典和各个表的数组准备
+
+ var dicNameList = new List() { "ArmEnum", "ValueUnit" }
+ .Distinct().ToArray();
+
+ //翻译字典
+ var translateDataList = await _dictionaryService.GetBasicDataSelect(dicNameList);
+
+ var ivusList = new List();
+
+ var octList = new List();
+
+ var exportCode = string.Empty;
+
+ var data = new object();
+
+ #endregion
+
+
+ foreach (var task in taskList)
+ {
+
+ if (task.ReadingCategory == ReadingCategory.Judge || task.ReadingCategory == ReadingCategory.Global)
+ {
+ continue;
+ }
+
+ if (criterion.CriterionType == CriterionType.IVUS)
+ {
+ //一个斑块一条记录
+ foreach (var lesion in task.LesionList.Where(t => t.LessionType == LesionType.MatchValues))
+ {
+ var ivus = _mapper.Map(task);
+
+ //靶段
+ ivus.TARGETV = task.QuestionAnswerList.Where(t => t.QuestionName == "靶段").FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+
+ //斑块编号
+ ivus.PLAQUE = lesion.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.PlaqueNumber).FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+ //外弹力膜面积
+ ivus.EEM = lesion.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.ElasticArea).FirstOrDefault()?.QuestionValue ?? string.Empty;
+ //管腔面积
+ ivus.LUMEN = lesion.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.LumenArea).FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+ //外弹力膜与管腔面积差值
+ ivus.PA = lesion.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.ElasticAreaDiffValue).FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+
+ //回撤中的图像帧数
+ ivus.PFC = task.QuestionAnswerList.Where(t => t.QuestionName == "回撤中的图像帧数").FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+ //分析图像帧数
+ ivus.FC = task.QuestionAnswerList.Where(t => t.QuestionName == "分析图像帧数").FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+ var findStatLession = task.LesionList.FirstOrDefault(t => t.LessionType == LesionType.PatchDataStatistics && t.LessionAnswerList.Any(t => t.QuestionMark == QuestionMark.PlaqueNumber && t.QuestionValue == ivus.PLAQUE));
+ var findPAVLession = task.LesionList.FirstOrDefault(t => t.LessionType == LesionType.PAV && t.LessionAnswerList.Any(t => t.QuestionMark == QuestionMark.PlaqueNumber && t.QuestionValue == ivus.PLAQUE));
+
+
+ //EEM求和
+ ivus.TOTALEEM = findStatLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.EEMSum).FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+ //(EEM-Lumen)求和
+ 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;
+
+ ivusList.Add(ivus);
+
+ }
+
+
+
+ }
+ else if (criterion.CriterionType == CriterionType.OCT)
+ {
+ //找到所有的斑块编号 排序
+
+ var noList = task.LesionList.Where(t => t.LessionType == LesionType.FCT).SelectMany(t => t.LessionAnswerList.Where(a => a.QuestionMark == QuestionMark.PlaqueNumber)
+ .Select(a => a.QuestionValue)).Where(v => !string.IsNullOrEmpty(v)).Distinct()
+ .OrderBy(v => int.Parse(v)) // 按数字排序
+ .ToList(); // 最终是字符串列表
+
+
+ foreach (var pNo in noList)
+ {
+ var pNoIndex = 0;
+ //一个斑块 一次测量(FCT 脂质角度)一条记录
+ foreach (var fctLesion in task.LesionList.Where(t => t.LessionType == LesionType.FCT
+ && t.LessionAnswerList.Any(t => t.QuestionMark == QuestionMark.PlaqueNumber && t.QuestionValue == pNo)))
+ {
+ pNoIndex++;
+
+ var findFct1= fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.FirstFCT).FirstOrDefault();
+
+ if (findFct1 != null)
+ {
+ var oct = CreatOCT(task, pNo);
+
+ // 测量标识
+
+ oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}";
+
+ // 测量参数名称
+
+ oct.TESTCD = "FCTMV1";
+
+ // 测量参数值
+ oct.ORRES = findFct1?.QuestionValue??string.Empty;
+
+ // 测量值单位
+ oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct1.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty;
+
+ octList.Add(oct);
+ }
+
+ var findFct2 = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.SecondFCT).FirstOrDefault();
+
+ if (findFct2 != null)
+ {
+ var oct = CreatOCT(task, pNo);
+
+ // 测量标识
+
+ oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}";
+
+ // 测量参数名称
+
+ oct.TESTCD = "FCTMV2";
+
+ // 测量参数值
+ oct.ORRES = findFct2?.QuestionValue ?? string.Empty;
+
+ // 测量值单位
+ oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct2.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty;
+
+ octList.Add(oct);
+ }
+
+ var findFct3 = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.ThirdFCT).FirstOrDefault();
+
+ if (findFct3 != null)
+ {
+ var oct = CreatOCT(task, pNo);
+
+ // 测量标识
+
+ oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}";
+
+ // 测量参数名称
+
+ oct.TESTCD = "FCTMV3";
+
+ // 测量参数值
+ oct.ORRES = findFct3?.QuestionValue ?? string.Empty;
+
+ // 测量值单位
+ oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findFct3.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty;
+
+ octList.Add(oct);
+ }
+
+
+ var avgFct = fctLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.AvgFCT).FirstOrDefault();
+
+ if (avgFct != null)
+ {
+ var oct = CreatOCT(task, pNo);
+
+ // 测量标识
+
+ oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_L_{pNoIndex}";
+
+ // 测量参数名称
+
+ oct.TESTCD = "AVGFCT";
+
+ // 测量参数值
+ oct.ORRES = avgFct?.QuestionValue ?? string.Empty;
+
+ // 测量值单位
+ oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)avgFct.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty;
+
+ octList.Add(oct);
+ }
+
+ }
+
+ var lNoIndex = 0;
+ //纸质角度
+ foreach (var liLesion in task.LesionList.Where(t => t.LessionType == LesionType.LipidAngle
+ && t.LessionAnswerList.Any(t => t.QuestionMark == QuestionMark.PlaqueNumber && t.QuestionValue == pNo)))
+ {
+ lNoIndex++;
+
+ var findAngle = liLesion?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.LipidAngle).FirstOrDefault();
+
+ if (findAngle != null)
+ {
+ var oct = CreatOCT(task, pNo);
+
+ // 测量标识
+
+ oct.TestID = $"{(task.ArmEnum == Arm.DoubleReadingArm1 ? "R1" : "R2")}_{pNo}_A_{lNoIndex}";
+
+ // 测量参数名称
+
+ oct.TESTCD = "LIPIDA";
+
+ // 测量参数值
+ oct.ORRES = findAngle?.QuestionValue ?? string.Empty;
+
+ // 测量值单位
+ oct.ORRESU = translateDataList["ValueUnit"].Where(t => t.Code.ToLower() == ((int?)findAngle.Unit)?.ToString().ToLower()).Select(t => isEn_Us ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty;
+
+ octList.Add(oct);
+ }
+ }
+ }
+
+
+
+
+ }
+
+
+
+ }
+
+
+
+ var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
+ exportInfo.CriterionName = criterion.CriterionName;
+
+
+
+
+ if (criterion.CriterionType == CriterionType.IVUS)
+ {
+ exportCode = StaticData.Export.IVUS_CDISC_Export;
+
+ data = ivusList;
+
+ data = await TranslateDataList(new { List = data }, _dictionaryService, typeof(IvusExportDto));
+ }
+ else if (criterion.CriterionType == CriterionType.OCT)
+ {
+ exportCode = StaticData.Export.OCT_CDISC_Export;
+
+ data = octList;
+
+ data = await TranslateDataList(new { List = data }, _dictionaryService, typeof(OctExportDto));
+ }
+
+ var (physicalPath, fileName) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, exportCode);
+
+ var exportFileNamePrefix = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}";
+
+ var fileDownloadName = $"{(string.IsNullOrEmpty(exportFileNamePrefix) ? "" : exportFileNamePrefix + "_")}{Path.GetFileNameWithoutExtension(fileName)}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
+
+ return await DataExportAsync(data, fileDownloadName, physicalPath);
+
+
+
+
+ }
+
+ private OctExportDto CreatOCT(IVUS_OCTBaseDto task, string pNo)
+ {
+ var oct = _mapper.Map(task);
+
+
+
+ //靶段
+ oct.TARGETV = task.QuestionAnswerList.Where(t => t.QuestionName == "靶段").FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+ //斑块编号
+ oct.PLAQUE = pNo;
+
+ var findLession = task.LesionList.Where(t => t.LessionType == LesionType.PatchDataStatistics
+ && 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;
+ // 匹配动脉段最小FCT
+ oct.MINFCT = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MiniMumFCT).FirstOrDefault()?.QuestionValue ?? string.Empty;
+ // 平均最小FCT
+ oct.AVGMFCT = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.AvgMinFCT).FirstOrDefault()?.QuestionValue ?? string.Empty;
+ // 脂质角度平均值
+ oct.LAMEAN = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.AvgLipidAngle).FirstOrDefault()?.QuestionValue ?? string.Empty;
+ // 脂质角度最大值
+ oct.LAMAX = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MaxAvgLipidAngle).FirstOrDefault()?.QuestionValue ?? string.Empty;
+ // 巨噬细胞浸润
+ oct.MACRI = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MacrophageInfiltration).FirstOrDefault()?.QuestionValue ?? string.Empty;
+ // 巨噬细胞浸润角度
+ oct.MIARC = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.MacrophageExtensionAngle).FirstOrDefault()?.QuestionValue ?? string.Empty;
+ // 微通道
+ oct.MC = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.Microchannels).FirstOrDefault()?.QuestionValue ?? string.Empty;
+ // 胆固醇结晶
+ oct.CCS = findLession?.LessionAnswerList.Where(t => t.QuestionMark == QuestionMark.CholesterolCrystallization).FirstOrDefault()?.QuestionValue ?? string.Empty;
+
+ return oct;
+ }
+
+ public static async Task