From 7a0b29bda63019baad8614b2fe50004e34fd1c93 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Tue, 9 Dec 2025 14:37:42 +0800 Subject: [PATCH] =?UTF-8?q?ivus-oct-=E5=AF=BC=E8=A1=A8=E4=BF=AE=E6=94=B9-u?= =?UTF-8?q?at-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common/Export/CDISCExportBaseModel.cs | 4 + .../Common/Export/IVUS_OCTExportService.cs | 94 ++++++++++++++----- 2 files changed, 77 insertions(+), 21 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Common/Export/CDISCExportBaseModel.cs b/IRaCIS.Core.Application/Service/Common/Export/CDISCExportBaseModel.cs index ebcebb267..5ad053587 100644 --- a/IRaCIS.Core.Application/Service/Common/Export/CDISCExportBaseModel.cs +++ b/IRaCIS.Core.Application/Service/Common/Export/CDISCExportBaseModel.cs @@ -15,6 +15,8 @@ public class TumorCommonQustionInfo //问题标识,肿瘤评估用于区分是什么问题 public QuestionType? QuestionType { get; set; } + public OptionType OptionTypeEnum { get; set; } + public Guid QuestionId { get; set; } public string QuestionName { get; set; } @@ -51,6 +53,8 @@ public class TumorLessionAnswerInfo { public QuestionMark? QuestionMark { get; set; } + public OptionType OptionTypeEnum { get; set; } + //病灶Id public Guid RowId { get; set; } diff --git a/IRaCIS.Core.Application/Service/Common/Export/IVUS_OCTExportService.cs b/IRaCIS.Core.Application/Service/Common/Export/IVUS_OCTExportService.cs index abb0d9279..64cb33046 100644 --- a/IRaCIS.Core.Application/Service/Common/Export/IVUS_OCTExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/Export/IVUS_OCTExportService.cs @@ -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,7 +229,7 @@ public class IVUS_OCTExportService(IRepository _r .Select(t => new IVUS_OCTBaseDto() { ResearchProgramNo = t.Trial.ResearchProgramNo, - TrialSiteCode=t.Subject.TrialSite.TrialSiteCode, + TrialSiteCode = t.Subject.TrialSite.TrialSiteCode, SubjectCode = t.Subject.Code, UserName = t.DoctorUser.UserName, ArmEnum = t.ArmEnum, @@ -279,6 +282,7 @@ public class IVUS_OCTExportService(IRepository _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, @@ -301,6 +305,7 @@ public class IVUS_OCTExportService(IRepository _r { RowId = k.RowId, + OptionTypeEnum = k.ReadingTableQuestionTrial.OptionTypeEnum, TranslateDicName = k.ReadingTableQuestionTrial.DictionaryCode, QuestionMark = k.ReadingTableQuestionTrial.QuestionMark, TableQuesionId = k.ReadingTableQuestionTrial.Id, @@ -359,8 +364,11 @@ public class IVUS_OCTExportService(IRepository _r #region 字典和各个表的数组准备 - var dicNameList = new List() { "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() { "ArmEnum", "ValueUnit" }) + .Distinct().ToArray(); + //翻译字典 var translateDataList = await _dictionaryService.GetBasicDataSelect(dicNameList); @@ -393,7 +401,9 @@ public class IVUS_OCTExportService(IRepository _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; @@ -460,12 +470,12 @@ public class IVUS_OCTExportService(IRepository _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; @@ -476,30 +486,30 @@ public class IVUS_OCTExportService(IRepository _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); // 测量标识 阅片人_斑块号_表格_行号 @@ -630,7 +640,7 @@ public class IVUS_OCTExportService(IRepository _r if (findAngle != null) { - var oct = CreatOCT(task, pNo); + var oct = CreatOCT(task, pNo, translateDataList); // 测量标识 @@ -698,15 +708,20 @@ public class IVUS_OCTExportService(IRepository _r } - private OctExportDto CreatOCT(IVUS_OCTBaseDto task, string pNo) + private OctExportDto CreatOCT(IVUS_OCTBaseDto task, string pNo, Dictionary> translateDataList) { + + var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; + var oct = _mapper.Map(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; @@ -723,7 +738,44 @@ public class IVUS_OCTExportService(IRepository _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(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