From 2cb196200a22136d23f5c023a518da78555dff2d Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Wed, 4 Jun 2025 10:20:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9CDISC=20=E5=A4=9A=E8=A1=A8?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FileDocProcess/ExcelExportHelper.cs | 1 + .../Service/Common/ExcelExportService.cs | 175 +++++++++++++++++- .../Common/Interface/IDictionaryService.cs | 2 + .../Service/QC/DTO/QCListViewModel.cs | 29 +++ .../Service/QC/_MapConfig.cs | 5 +- .../_IRaCIS/_Config/_StaticData.cs | 2 + 6 files changed, 211 insertions(+), 3 deletions(-) diff --git a/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs b/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs index c79bf6a2e..3bd3111cd 100644 --- a/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs +++ b/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs @@ -243,6 +243,7 @@ public static class ExcelExportHelper } + public class DynamicColumnConfig { /// diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index f69d06a00..53b837533 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -2880,13 +2880,184 @@ namespace IRaCIS.Core.Application.Service.Common TranslateDicNameList = translateDicNameList }; - + if (export_Template == StaticData.Export.ReadingLession_Export || export_Template == StaticData.Export.CommonJudgeReadingDetail_Export) + { + dynamicColumnConfig.TempalteLastColumnIndex = 8; + } } else { - //CDISC 导出 只到外层问题级别 使用Id 填充Excel + + if (criterion.CriterionType == CriterionType.SelfDefine) + { + //最终EXCEL 列 + var configCoumNameList = new List(); + + //表格全问题名 + var trialConfigTableQuestionList = _trialReadingTableQuestionRepository.Where(t => t.TrialId == trialId && t.TrialCriterionId == trialReadingCriterionId).Where(t => t.ExportResultStr.Contains(((int)inQuery.ReadingExportType).ToString())) + .Select(t => new ExportQuestionBasicInfo() + { + QuestionId = t.Id, + TableName = _userInfo.IsEn_Us ? t.ReadingQuestionTrial.QuestionEnName : t.ReadingQuestionTrial.QuestionName, + QuestionName = _userInfo.IsEn_Us ? t.QuestionEnName : t.QuestionName, + CDISCCode = t.CDISCCode, + TranslateDicName = t.DictionaryCode, + ShowOrder = t.ShowOrder + }).OrderBy(t => t.TableName).ThenBy(t => t.ShowOrder).ToList(); + + var isMutiTable = trialConfigTableQuestionList.Select(t => t.TableName).Distinct().Count() > 1; + + + //外层问题处理 + var fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem() + { + Id = t.QuestionId, + Name = t.QuestionName, + CDISCCode = t.CDISCCode + }).ToList(); + + var translateDicNameList = trialConfigQuestionList.Union(trialConfigTableQuestionList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(t => t.TranslateDicName).Distinct().ToList(); + + //单表格问题(直接用表格问题名称) 或者没有表格问题 + if (isMutiTable == false) + { + //一个表格,或者没有表格 + var tableNameList = trialConfigTableQuestionList.Select(t => new DynamicColumnConfig.ColumItem() { Id = t.QuestionId, Name = t.QuestionName, CDISCCode = t.CDISCCode }).ToList(); + + configCoumNameList = fistLeveLNameList.Union(tableNameList).ToList(); + + //最终的病灶列表 要把裁判的也要加进去,需要处理裁判标记 + foreach (var item in taskList.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum)) + { + //有病灶,并且至少配置了一个病灶问题 + if (item.LesionList.Count > 0 && item.LesionList.SelectMany(t => t.LessionAnswerList).Any()) + { + foreach (var lession in item.LesionList.OrderBy(t => t.LessionType).ThenBy(t => t.LessionCode)) + { + //病灶配置了问题 才进行导出 + if (lession.LessionAnswerList.Count > 0) + { + + var dynamicLessionInfoList = new List(); + + + var dynamicPartialLessionInfoList = lession.LessionAnswerList.Select(t => new CommonQuesionInfo() { QuestionId = t.TableQuesionId, QuestionName = t.QuestionName, QuestionValue = t.QuestionValue, TranslateDicName = t.TranslateDicName, CDISCCode = t.CDISCCode }); + + //两部分组成 外层问题+ 动态的表格问题 + dynamicLessionInfoList = item.QuestionAnswerList.Union(dynamicPartialLessionInfoList).ToList(); + + var cloneItem = item.Clone(); + cloneItem.QuestionAnswerList = dynamicLessionInfoList; + list.Add(cloneItem); + } + + } + } + else + { + //要把裁判任务加进去 裁判任务上没有病灶 + + list.Add(item); + } + + } + } + else + { + //多表格问题,需要用新的模板,并且用行的方式展示 (不是之前表格名称_表格子问题名的方式) + + export_Template = StaticData.Export.CDISC_MutiTable_Reading_Export; + + configCoumNameList = fistLeveLNameList.ToList(); + + var translateUnitList = await _dictionaryService.GetBasicDataSelect("ValueUnit"); + + + foreach (var item in taskList.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum)) + { + //有病灶,并且至少配置了一个病灶问题 + if (item.LesionList.Count > 0 && item.LesionList.SelectMany(t => t.LessionAnswerList).Any()) + { + foreach (var lession in item.LesionList.OrderBy(t => t.LessionType).ThenBy(t => t.LessionCode)) + { + //病灶配置了问题 才进行导出 + if (lession.LessionAnswerList.Count > 0) + { + + //遍历病灶的每个问题 + foreach (var lessionItem in lession.LessionAnswerList) + { + + var cloneItem = item.Clone(); + + + string unitText = lessionItem.Unit switch + { + ValueUnit.Custom => lessionItem.CustomUnit, + null => "", + _ => _userInfo.IsEn_Us ? translateUnitList.FirstOrDefault(t => t.Code == ((int)lessionItem.Unit).ToString())?.Value ?? "" + : translateUnitList.FirstOrDefault(t => t.Code == ((int)lessionItem.Unit).ToString())?.ValueCN ?? "" + }; + + + cloneItem.Group = lessionItem.TableName; + cloneItem.TRLINKID = lessionItem.RowId.ToString(); + cloneItem.TRORRES = lessionItem.CDISCCode; + cloneItem.TRTEST = lessionItem.QuestionValue; + cloneItem.TRORRESU = unitText; + + + list.Add(cloneItem); + } + + //var dynamicLessionInfoList = new List(); + + //var dynamicPartialLessionInfoList = lession.LessionAnswerList.Select(t => new CommonQuesionInfo() { QuestionId = t.TableQuesionId, QuestionName = t.QuestionName, QuestionValue = t.QuestionValue, TranslateDicName = t.TranslateDicName, CDISCCode = t.CDISCCode }); + + ////两部分组成 外层问题+ 动态的表格问题 + //dynamicLessionInfoList = item.QuestionAnswerList.Union(dynamicPartialLessionInfoList).ToList(); + + } + + } + } + else + { + //要把裁判任务加进去 裁判任务上没有病灶 + + list.Add(item); + } + + } + + + } + + + + dynamicColumnConfig = new DynamicColumnConfig() + { + AutoColumnTitleRowIndex = 1, + AutoColumnStartIndex = 6, + TempalteLastColumnIndex = 15, + DynamicItemDicName = "TranslateDicName", + DynamicItemValueName = "QuestionValue", + DynamicItemTitleName = "QuestionName", + DynamicItemTitleId = "QuestionId", + DynamicListName = "QuestionAnswerList", + RemoveColunmIndexList = removeColumnIndexList, + ColumnIdNameList = configCoumNameList, + IsCDISCExport = true, + //CDISCList = cdiscCodeList, + TranslateDicNameList = translateDicNameList + }; + + } + else + { + //CDISC 导出 只到外层问题级别 使用Id 填充Excel var totalConfigCoumNameList = trialConfigQuestionList.ToList(); diff --git a/IRaCIS.Core.Application/Service/Common/Interface/IDictionaryService.cs b/IRaCIS.Core.Application/Service/Common/Interface/IDictionaryService.cs index 7054cfc80..502af8f0c 100644 --- a/IRaCIS.Core.Application/Service/Common/Interface/IDictionaryService.cs +++ b/IRaCIS.Core.Application/Service/Common/Interface/IDictionaryService.cs @@ -31,5 +31,7 @@ namespace IRaCIS.Application.Interfaces Task>> GetBasicDataSelect(string[] searchArray); + Task> GetBasicDataSelect(string searchKey); + } } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 0126d8a27..1e8bf4b26 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -1310,6 +1310,7 @@ namespace IRaCIS.Core.Application.Contracts //阅片完成时间 public DateTime? SignTime { get; set; } + #endregion #region 肿瘤学结果 @@ -1322,6 +1323,23 @@ namespace IRaCIS.Core.Application.Contracts public string OncologyUserName { get; set; } #endregion + + #region CDISC 固定字段 + //组 + public string Group { get; set; } + + //行标识 + public string TRLINKID { get; set; } + + //列名 + public string TRTEST { get; set; } + + //值 + public string TRORRES { get; set; } + + //单位 + public string TRORRESU { get; set; } + #endregion } public class CommonLessionExport : CommonEvaluationExport @@ -1356,6 +1374,17 @@ namespace IRaCIS.Core.Application.Contracts public string CDISCCode { get; set; } + + //病灶Id + public Guid RowId { get; set; } + + //如果是4 就取CustomUnit 否则就是字典翻译 + [Comment("单位")] + public ValueUnit? Unit { get; set; } + + [Comment("自定义单位")] + public string CustomUnit { get; set; } = string.Empty; + #endregion diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index f47db5d29..75a1b5933 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -299,8 +299,11 @@ namespace IRaCIS.Core.Application.Service CreateMap() //.ForMember(o => o.LessionCode, t => t.MapFrom(u => u.Lesion.RowMark)) //.ForMember(o => o.LessionType, t => t.MapFrom(u => (int?)u.ReadingQuestionTrial.LesionType)) + + .ForMember(o => o.CustomUnit, t => t.MapFrom(u => u.ReadingTableQuestionTrial.CustomUnit)) + .ForMember(o => o.Unit, t => t.MapFrom(u => u.ReadingTableQuestionTrial.Unit)) + .ForMember(o => o.TableQuesionId, t => t.MapFrom(u => u.ReadingTableQuestionTrial.Id)) .ForMember(o => o.QuestionMark, t => t.MapFrom(u => u.ReadingTableQuestionTrial.QuestionMark)) - .ForMember(o => o.TableQuesionId, t => t.MapFrom(u => u.ReadingTableQuestionTrial.Id)) .ForMember(o => o.QuestionName, t => t.MapFrom(u => isEn_Us ? u.ReadingTableQuestionTrial.QuestionEnName : u.ReadingTableQuestionTrial.QuestionName)) .ForMember(o => o.QuestionValue, t => t.MapFrom(u => u.Answer)) .ForMember(o => o.CDISCCode, t => t.MapFrom(u => u.ReadingTableQuestionTrial.CDISCCode)) diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs index 432b9e16d..735cc0eb9 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs @@ -287,7 +287,9 @@ public static class StaticData public const string OCT_ReadingLession_Export = "OCT_ReadingLession_Export"; public const string CDISC_Reading_Export = "CDISC_Reading_Export"; + public const string CDISC_MutiTable_Reading_Export = "CDISC_MutiTable_Reading_Export"; + public const string IVUSTheMeasuredValueOfEachMatchedFragment = "IVUS_TheMeasuredValueOfEachMatchedFragment";