From df87c5654428bbbce1646bec69535ac39f0223c0 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 5 Sep 2025 16:34:48 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=AF=BC=E8=A1=A8Excel=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FileDocProcess/ExcelExportHelper.cs | 450 ++++++- .../IRaCIS.Core.Application.xml | 35 +- .../Service/Common/ExcelExportService.cs | 1141 +++++++++-------- .../Service/QC/DTO/QCListViewModel.cs | 58 +- .../Service/QC/_MapConfig.cs | 70 +- 5 files changed, 1185 insertions(+), 569 deletions(-) diff --git a/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs b/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs index 68ca83452..a0305fc0b 100644 --- a/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs +++ b/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs @@ -74,14 +74,15 @@ public static class ExcelExportHelper { var itemDic = item.ConvertToDictionary(); - //处理集合里面时间类型,根据当前语言将时间转变为字符串 - foreach (var itemValuePair in itemDic) - { - if (DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result)) - { - itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result); - } - } + ////处理集合里面时间类型,根据当前语言将时间转变为字符串 + //foreach (var itemValuePair in itemDic) + //{ + // // 临床数据 1,1 会变成2024-01-01 + // if (itemValuePair.Value?.ToString().Length > 8 && DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result)) + // { + // itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result); + // } + //} foreach (var needTranslateProperty in needTranslatePropertyList) @@ -242,6 +243,7 @@ public static class ExcelExportHelper } + public class DynamicColumnConfig { /// @@ -254,13 +256,19 @@ public static class ExcelExportHelper /// public int AutoColumnTitleRowIndex { get; set; } - + /// + /// 模板列最后的索引 + /// public int TempalteLastColumnIndex { get; set; } + public bool IsCDISCExport { get; set; } = false; + + //public List CDISCList { get; set; } = new List(); + /// - /// 动态的列名 + /// 动态的列名 如果Id 重复,那么就按照名称填充,否则就按照Id 填充列数据 /// - public List ColumnNameList { get; set; } = new List(); + public List ColumnIdNameList { get; set; } /// /// 动态翻译的字典名 @@ -287,7 +295,31 @@ public static class ExcelExportHelper /// public string DynamicItemTitleName { get; set; } + public string DynamicItemTitleId { get; set; } + public List RemoveColunmIndexList { get; set; } = new List(); + + public class ColumItem + { + public Guid Id { get; set; } + public string Name { get; set; } + + public string CDISCCode { get; set; } + + public override bool Equals(object obj) + { + if (obj is not ColumItem other) return false; + return Id == other.Id && Name == other.Name; + } + + public override int GetHashCode() + { + return HashCode.Combine(Id, Name); + } + } + + public List ColumnIdList => ColumnIdNameList == null ? new List() : ColumnIdNameList.Select(t => t.Id.ToString()).ToList(); + public List ColumnNameList => ColumnIdNameList == null ? new List() : ColumnIdNameList.Select(t => t.Name).ToList(); } @@ -334,14 +366,14 @@ public static class ExcelExportHelper //var itemDic = JsonConvert.DeserializeObject>(item.ToJsonNotIgnoreNull()); var itemDic = item.ConvertToDictionary(); - //处理集合里面时间类型,根据当前语言将时间转变为字符串 - foreach (var itemValuePair in itemDic) - { - if (DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result)) - { - itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result); - } - } + ////处理集合里面时间类型,根据当前语言将时间转变为字符串 + //foreach (var itemValuePair in itemDic) + //{ + // if (itemValuePair.Value?.ToString().Length > 8 && DateTime.TryParse(itemValuePair.Value?.ToString(), out DateTime result)) + // { + // itemDic[itemValuePair.Key] = ExportExcelConverterDate.DateTimeInternationalToString(result); + // } + //} foreach (var needTranslateProperty in needTranslatePropertyList) { @@ -420,7 +452,7 @@ public static class ExcelExportHelper workbook.RemoveSheetAt(1); } - //中文替换项目术语 + #region 中文替换项目术语 if (data.TrialObjectNameList?.Count > 0) { var replaceObjectList = data.TrialObjectNameList; @@ -456,21 +488,378 @@ public static class ExcelExportHelper } } } + #endregion + + if (dynamicColumnConfig != null) { + //var isCdics = dynamicColumnConfig.CDISCList.Count > 0; + + var isCdics = dynamicColumnConfig.IsCDISCExport; + var sheet = workbook.GetSheetAt(0); + var cdicsRow = sheet.GetRow(dynamicColumnConfig.AutoColumnTitleRowIndex - 1); var titelRow = sheet.GetRow(dynamicColumnConfig.AutoColumnTitleRowIndex); var templateRow = sheet.GetRow(dynamicColumnConfig.AutoColumnTitleRowIndex + 1); //动态移除列的数量 var dynamicRemoveColunmCount = dynamicColumnConfig.RemoveColunmIndexList.Count(); + //在动态列开始前移除的数量 var beforeDynamicRemoveCount = dynamicColumnConfig.RemoveColunmIndexList.Where(t => t < dynamicColumnConfig.AutoColumnStartIndex).Count(); //动态添加列的数量 - var needAddCount = dynamicColumnConfig.ColumnNameList.Count; + var needAddCount = dynamicColumnConfig.ColumnIdNameList.Count; + + //原始表 最终索引 + var originTotalEndIndex = dynamicColumnConfig.TempalteLastColumnIndex; + + //减去动态移除后原始结束索引 + var originRemoveEndIndex = originTotalEndIndex - dynamicRemoveColunmCount; + + //最终表 动态列开始索引 + var dynamicColunmStartIndex = dynamicColumnConfig.AutoColumnStartIndex - beforeDynamicRemoveCount; + + //最终表 动态列的终止索引 + var dynamicColunmEndIndex = dynamicColunmStartIndex + needAddCount - 1; + + //最终表 最终索引 + var totalColunmEndIndex = originTotalEndIndex + needAddCount - dynamicRemoveColunmCount; + + + //动态列后需要移动的数量 + var backMoveCount = totalColunmEndIndex - dynamicColunmEndIndex; + + //删除需要动态删除的列 从大到小移除,否则索引会变 + foreach (var removeIndex in dynamicColumnConfig.RemoveColunmIndexList.OrderByDescending(t => t)) + { + //将后面的列向前移动 + for (var i = 0; i < originTotalEndIndex - removeIndex; i++) + { + Console.WriteLine(titelRow.GetCell(removeIndex + i + 1).StringCellValue); + titelRow.GetCell(removeIndex + i).SetCellValue(titelRow.GetCell(removeIndex + i + 1).StringCellValue); + templateRow.GetCell(removeIndex + i).SetCellValue(templateRow.GetCell(removeIndex + i + 1).StringCellValue); + + //后面的数据要清空 + titelRow.GetCell(removeIndex + i + 1).SetCellValue(""); + templateRow.GetCell(removeIndex + i + 1).SetCellValue(""); + + } + + } + + //创建新的列 + for (int i = originRemoveEndIndex; i < originRemoveEndIndex + needAddCount; i++) + { + + titelRow.CreateCell(i + 1); + templateRow.CreateCell(i + 1); + + if (isCdics) + { + cdicsRow.CreateCell(i + 1); + } + } + //移动Title 和下面的模板标识 + + var gap = totalColunmEndIndex - originRemoveEndIndex; + + for (int i = totalColunmEndIndex; i > dynamicColunmEndIndex; i--) + { + + titelRow.GetCell(i).SetCellValue(titelRow.GetCell(i - gap).StringCellValue); + + templateRow.GetCell(i).SetCellValue(templateRow.GetCell(i - gap).StringCellValue); + + if (isCdics) + { + cdicsRow.GetCell(i).SetCellValue(cdicsRow.GetCell(i - gap).StringCellValue); + } + } + + + + //设置动态Tilte + + for (int i = dynamicColunmStartIndex; i < dynamicColunmStartIndex + needAddCount; i++) + { + + var name = dynamicColumnConfig.ColumnIdNameList[i - dynamicColunmStartIndex].Name; + + titelRow.GetCell(i).SetCellValue(name); + templateRow.GetCell(i).SetCellValue(""); + + if (isCdics) + { + var cdicsCode = dynamicColumnConfig.ColumnIdNameList[i - dynamicColunmStartIndex].CDISCCode; + + cdicsRow.GetCell(i).SetCellValue(cdicsCode); + } + } + + } + + + using (var memoryStream2 = new MemoryStream()) + { + workbook.Write(memoryStream2, true); + + memoryStream2.Seek(0, SeekOrigin.Begin); + + templateStream = memoryStream2; + } + + } + + #endregion + + #region MiniExcel + + var memoryStream = new MemoryStream(); + + var config = new OpenXmlConfiguration() + { + IgnoreTemplateParameterMissing = true, + }; + + //await MiniExcel.SaveAsByTemplateAsync("testmini.xlsx", templateStream.ToArray(), translateData); + + await MiniExcel.SaveAsByTemplateAsync(memoryStream, templateStream.ToArray(), translateData, config); + + + memoryStream.Seek(0, SeekOrigin.Begin); + + if (dynamicColumnConfig != null) + { + //Excel 列是按照名称填充 还是Id 填充 + var isExcelAddDataWithName = dynamicColumnConfig.ColumnIdNameList.Select(t => t.Id).Distinct().Count() == 1; + + var dynamicTranslateDataList = await _dictionaryService.GetBasicDataSelect(dynamicColumnConfig.TranslateDicNameList.ToArray()); + + // 使用NPOI 进行二次处理 + var wb = new XSSFWorkbook(memoryStream); + var sheet = wb.GetSheetAt(0); + + var list = translatedDic["List"] as IList; + + foreach (var itemResult in list) + { + var index = list.IndexOf(itemResult); + + //从第四行开始处理动态列 + var row = sheet.GetRow(index + dynamicColumnConfig.AutoColumnTitleRowIndex + 1); + + var itemDic = itemResult.ToDictionary(); + + var itemList = itemDic[dynamicColumnConfig.DynamicListName] as IList; + + //这个数组是动态的,有的多,有的少,所以在此对比Title 一致才赋值 + foreach (var itemObj in itemList) + { + + var iteObjDic = itemObj.ToDictionary(); + + var itemDicName = iteObjDic.ContainsKey(dynamicColumnConfig.DynamicItemDicName) ? iteObjDic[dynamicColumnConfig.DynamicItemDicName]?.ToString() : ""; + var itemValue = iteObjDic[dynamicColumnConfig.DynamicItemValueName]?.ToString(); + + //var writeIndex = itemList.IndexOf(itemObj) + dynamicColumnConfig.AutoColumnStartIndex; + + var writeIndex = 0; + + if (isExcelAddDataWithName) + { + writeIndex = dynamicColumnConfig.ColumnNameList.IndexOf(iteObjDic[dynamicColumnConfig.DynamicItemTitleName].ToString()) + dynamicColumnConfig.AutoColumnStartIndex; + } + else + { + writeIndex = dynamicColumnConfig.ColumnIdList.IndexOf(iteObjDic[dynamicColumnConfig.DynamicItemTitleId].ToString()) + dynamicColumnConfig.AutoColumnStartIndex; + } + + + if (itemDicName.IsNotNullOrEmpty()) + { + + var translatedItemData = dynamicTranslateDataList[itemDicName].Where(t => t.Code.ToLower() == itemValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + + row.GetCell(writeIndex).SetCellValue(translatedItemData); + } + else + { + row.GetCell(writeIndex).SetCellValue(itemValue); + + } + + } + } + + var memoryStream2 = new MemoryStream(); + wb.Write(memoryStream2, true); + memoryStream2.Seek(0, SeekOrigin.Begin); + + memoryStream = memoryStream2; + + } + + + return (memoryStream, fileName); + + + + + #endregion + } + + /// + /// 暂时废弃--合并到上面 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task<(MemoryStream, string)> CDISC_DataExport_Async(string code, ExcelExportInfo data, IRepository _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null, DynamicColumnConfig? dynamicColumnConfig = null) + { + var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; + //判断是否有字典翻译 + + object translateData = data; + + Dictionary translatedDic = default; + + if (_dictionaryService != null && translateType != null) + { + + //一个值 对应不同的字典翻译 + var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true)) + .SelectMany(c => + c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false).Select(f => (DictionaryTranslateAttribute?)f).Where(t => t.CriterionType == criterionType || t.CriterionType == null) + .Select(k => new { c.Name, k.DicParentCode, k.IsTranslateDenpendOtherProperty, k.DependPropertyName, k.DependPropertyValueStr }) + ).ToList(); + + + + //字典表查询出所有需要翻译的数据 + + var translateDataList = await _dictionaryService.GetBasicDataSelect(needTranslatePropertyList.Select(t => t.DicParentCode).Distinct().ToArray()); + + var dic = data.ConvertToDictionary(); + //var dic = (JsonConvert.DeserializeObject>(data.ToJsonNotIgnoreNull())).IfNullThrowException(); + + foreach (var key in dic.Keys) + { + //是数组 那么找到对应的属性 进行翻译 + if (dic[key] != null && dic[key].GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>))) + //if (dic[key].GetType().IsAssignableFrom(typeof(JArray))) + { + + var newObjList = new List(); + var no = 1; + foreach (var item in dic[key] as IList) + //foreach (var item in dic[key] as JArray) + { + //var itemDic = JsonConvert.DeserializeObject>(item.ToJsonNotIgnoreNull()); + var itemDic = item.ConvertToDictionary(); + + foreach (var needTranslateProperty in needTranslatePropertyList) + { + if (itemDic.Keys.Any(t => t == needTranslateProperty.Name)) + { + //翻译的属性依赖其他属性 + if (needTranslateProperty.IsTranslateDenpendOtherProperty) + { + if (itemDic[needTranslateProperty.DependPropertyName]?.ToString().ToLower() == needTranslateProperty.DependPropertyValueStr.ToLower()) + { + var beforeValue = itemDic[needTranslateProperty.Name]?.ToString(); + + itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + } + } + //普通翻译 或者某一标准翻译 + else + { + var beforeValue = itemDic[needTranslateProperty.Name]?.ToString(); + + + itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).Select(t => isEn_US ? t.Value : t.ValueCN).FirstOrDefault() ?? String.Empty; + } + } + + + + + } + + itemDic.Add("No", no++); + newObjList.Add(itemDic); + } + + dic[key] = newObjList; + + } + } + + + //data = dic; + translateData = dic; + translatedDic = dic; + + } + + + var (physicalPath, fileName) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code); + + + //模板路径 + var tplPath = physicalPath; + + #region 根据中英文 删除模板sheet + + // 打开模板文件 + var templateFile = new FileStream(tplPath, FileMode.Open, FileAccess.Read); + + // 获取文件流 + var templateStream = new MemoryStream(); + templateFile.CopyTo(templateStream); + templateStream.Seek(0, SeekOrigin.Begin); + + var workbook = new XSSFWorkbook(templateStream); + + int sheetCount = workbook.NumberOfSheets; + + if (sheetCount == 2) + { + if (isEn_US) + { + workbook.RemoveSheetAt(0); + } + else + { + workbook.RemoveSheetAt(1); + } + + if (dynamicColumnConfig != null) + { + var sheet = workbook.GetSheetAt(0); + + + var cdicsRow = sheet.GetRow(dynamicColumnConfig.AutoColumnTitleRowIndex - 1); + var titelRow = sheet.GetRow(dynamicColumnConfig.AutoColumnTitleRowIndex); + var templateRow = sheet.GetRow(dynamicColumnConfig.AutoColumnTitleRowIndex + 1); + + //动态移除列的数量 + var dynamicRemoveColunmCount = dynamicColumnConfig.RemoveColunmIndexList.Count(); + + //在动态列开始前移除的数量 + var beforeDynamicRemoveCount = dynamicColumnConfig.RemoveColunmIndexList.Where(t => t < dynamicColumnConfig.AutoColumnStartIndex).Count(); + + //动态添加列的数量 + var needAddCount = dynamicColumnConfig.ColumnIdNameList.Count; //原始表 最终索引 var originTotalEndIndex = dynamicColumnConfig.TempalteLastColumnIndex; @@ -512,6 +901,7 @@ public static class ExcelExportHelper //创建新的列 for (int i = originTotalEndIndex; i < originTotalEndIndex + needAddCount; i++) { + cdicsRow.CreateCell(i + 1); titelRow.CreateCell(i + 1); templateRow.CreateCell(i + 1); } @@ -533,8 +923,11 @@ public static class ExcelExportHelper for (int i = dynamicColunmStartIndex; i < dynamicColunmStartIndex + needAddCount; i++) { - var name = dynamicColumnConfig.ColumnNameList[i - dynamicColunmStartIndex]; + var name = dynamicColumnConfig.ColumnIdNameList[i - dynamicColunmStartIndex].Name; + var cdicsCode = dynamicColumnConfig.ColumnIdNameList[i - dynamicColunmStartIndex].CDISCCode; + + cdicsRow.GetCell(i).SetCellValue(cdicsCode); titelRow.GetCell(i).SetCellValue(name); templateRow.GetCell(i).SetCellValue(""); } @@ -568,6 +961,8 @@ public static class ExcelExportHelper if (dynamicColumnConfig != null) { + var isExcelAddDataWithName = dynamicColumnConfig.ColumnIdNameList.Select(t => t.Id).Count() == 1; + var dynamicTranslateDataList = await _dictionaryService.GetBasicDataSelect(dynamicColumnConfig.TranslateDicNameList.ToArray()); // 使用NPOI 进行二次处理 @@ -598,7 +993,15 @@ public static class ExcelExportHelper //var writeIndex = itemList.IndexOf(itemObj) + dynamicColumnConfig.AutoColumnStartIndex; - var writeIndex = dynamicColumnConfig.ColumnNameList.IndexOf(iteObjDic[dynamicColumnConfig.DynamicItemTitleName].ToString()) + dynamicColumnConfig.AutoColumnStartIndex; + var writeIndex = 0; + if (isExcelAddDataWithName) + { + writeIndex = dynamicColumnConfig.ColumnNameList.IndexOf(iteObjDic[dynamicColumnConfig.DynamicItemTitleName].ToString()) + dynamicColumnConfig.AutoColumnStartIndex; + } + else + { + writeIndex = dynamicColumnConfig.ColumnIdList.IndexOf(iteObjDic[dynamicColumnConfig.DynamicItemTitleId].ToString()) + dynamicColumnConfig.AutoColumnStartIndex; + } if (itemDicName.IsNotNullOrEmpty()) { @@ -634,6 +1037,7 @@ public static class ExcelExportHelper } + /// /// 导出文件模板 /// diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 4f362836d..8cfe8b9b9 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -42,9 +42,14 @@ 动态列开始的行index 从0开始 - + - 动态的列名 + 模板列最后的索引 + + + + + 动态的列名 如果Id 重复,那么就按照名称填充,否则就按照Id 填充列数据 @@ -72,6 +77,20 @@ Excel Title Name + + + 暂时废弃--合并到上面 + + + + + + + + + + + 导出文件模板 @@ -861,16 +880,6 @@ - - - 一致性分析结果导出 7 8 分别是自身 和组件一致性 - - - - - - - 获取阅片标准可以导出的列表 @@ -878,7 +887,7 @@ - + 阅片结果表、阅片结果明细,评估病灶明细表, 裁判明细表导出,条件通过 ReadingExportType ( 1,2,3,4)区分 diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index 5ffb38984..0d31f69b6 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -1204,8 +1204,53 @@ namespace IRaCIS.Core.Application.Service.Common } + public List DealOncologyResult(IRepository _oncologyRepository, bool isOncology, List list) where T : CommonEvaluationExport + { + if (isOncology) + { - public List DealJudgeMark(ArbitrationRule arbitrationRule, IEnumerable list) where T : CommonEvaluationExport + var subjectIdList = list.Select(t => t.SubjectId).Distinct().ToList(); + + //已阅片完的肿瘤学结果 + var oncologyResultList = _oncologyRepository.Where(t => subjectIdList.Contains(t.OncologyVisitTask.SubjectId) + && t.OncologyVisitTask.IsAnalysisCreate == false && t.OncologyVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned && t.OncologyVisitTask.TaskState == TaskState.Effect) + + .Select(t => new { t.OncologyVisitTask.SubjectId, OncologyVisitTaskNum = t.OncologyVisitTask.VisitTaskNum, OncologyUserName = t.OncologyVisitTask.DoctorUser.UserName, t.VisitTask.VisitTaskNum, t.VisitTaskId, t.EvaluationReason, t.EvaluationResult }) + .ToList(); + + foreach (var subjectOncologyResult in oncologyResultList.GroupBy(t => t.SubjectId)) + { + //最后已完成的肿瘤学任务号 + var lastOncologyVisitTaskNum = subjectOncologyResult.OrderByDescending(t => t.OncologyVisitTaskNum).FirstOrDefault().OncologyVisitTaskNum; + + //需要填充的肿瘤学结果 + var subjectOncologyList = subjectOncologyResult.Where(t => t.OncologyVisitTaskNum == lastOncologyVisitTaskNum).ToList(); + + + foreach (var subjectOncology in subjectOncologyList) + { + + foreach (var item in list) + { + if (item.SubjectId == subjectOncology.SubjectId && item.VisitTaskNum == subjectOncology.VisitTaskNum) + { + item.OncologyReason = subjectOncology.EvaluationReason; + item.OncologyResult = subjectOncology.EvaluationResult; + item.OncologyUserName = subjectOncology.OncologyUserName; + } + } + } + + + + } + + + } + + return list; + } + public List DealJudgeMark(ArbitrationRule arbitrationRule, bool isGlobalReading, IEnumerable list) where T : CommonEvaluationExport { //处理访视任务的裁判标记 var resultExceptJudgeList = list.Where(t => t.ReadingCategory != ReadingCategory.Judge).ToList(); @@ -1225,6 +1270,8 @@ namespace IRaCIS.Core.Application.Service.Common if (findJudge.ReadingTaskState == ReadingTaskState.HaveSigned) { item.IsJudgeSelect = findJudge.JudgeArmEnum == item.ArmEnum ? true : false; + + item.JudgeNote = findJudge.JudgeArmEnum == item.ArmEnum ? findJudge.JudgeNote : string.Empty; } else { @@ -1234,8 +1281,9 @@ namespace IRaCIS.Core.Application.Service.Common } else { + //两个人都做了 - if (resultExceptJudgeList.Count(t => t.VisitTaskNum == item.VisitTaskNum && t.SubjectCode == item.SubjectCode) == 2) + if (resultExceptJudgeList.Where(t => t.VisitTaskNum == item.VisitTaskNum && t.SubjectCode == item.SubjectCode).Select(t => t.ArmEnum).Distinct().Count() == 2) { //如果没有产生裁判,默认选择R1 if (item.ArmEnum == Arm.DoubleReadingArm1) @@ -1253,11 +1301,13 @@ namespace IRaCIS.Core.Application.Service.Common item.IsTrigerJudge = null; } + + } } } - if (arbitrationRule == ArbitrationRule.Reading) + else if (arbitrationRule == ArbitrationRule.Reading) { //处理访视裁判标记 foreach (var visitItem in resultExceptJudgeList.Where(t => t.ReadingCategory == ReadingCategory.Visit)) @@ -1265,104 +1315,170 @@ namespace IRaCIS.Core.Application.Service.Common ////默认设置为false 只处理为true 和 空的情况 //visitItem.IsJudgeSelect = false; - if (judegeList.Count > 0) + var subjectJudgeList = judegeList.Where(t => t.SubjectCode == visitItem.SubjectCode).ToList(); + + //阅片期访视号 + var subjectReadingPeriondVisitNumList = resultExceptJudgeList.Where(t => t.SubjectCode == visitItem.SubjectCode).FirstOrDefault()?.SubjectCriterionReadingPeriodVisitNumList; + + //两个人完成最大得任务号(访视+全局) + var subjectMaxFinishedTaskNum = resultExceptJudgeList.Where(t => t.SubjectCode == visitItem.SubjectCode) + .GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).DefaultIfEmpty().Max(); + + var addReadingPeriodNum = isGlobalReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : 0; + + var finishedGlobalCount = 0; + + //没有配置阅片期 + if (subjectReadingPeriondVisitNumList == null) { - - var maxFinishedJudge = judegeList.Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault(); - - var maxNotFinishedJudge = judegeList.Where(t => t.ReadingTaskState != ReadingTaskState.HaveSigned).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault(); - - - //n个裁判任务都未完成 - if (maxFinishedJudge == null && maxNotFinishedJudge != null) - { - if (visitItem.VisitTaskNum < maxNotFinishedJudge.VisitTaskNum) - { - visitItem.IsJudgeSelect = null; - } - else - { - //大于当前未完成的全局裁判 后续 肯定是未知的 - visitItem.IsTrigerJudge = null; - visitItem.IsJudgeSelect = null; - } - - - } - //n个全局裁判都完成了,那么以最后一次裁判选择的为准 - else if (maxFinishedJudge != null && maxNotFinishedJudge == null) - { - if (visitItem.ArmEnum == maxFinishedJudge.JudgeArmEnum && visitItem.VisitTaskNum < maxFinishedJudge.VisitTaskNum) - { - visitItem.IsJudgeSelect = true; - visitItem.JudgeNote = maxFinishedJudge.JudgeNote; - } - //裁判没选择的人设置为false - else if (visitItem.VisitTaskNum < maxFinishedJudge.VisitTaskNum) - { - visitItem.IsJudgeSelect = false; - } - else - { - //裁判都完成的后续 没有其他裁判任务 肯定也是未知的 - visitItem.IsTrigerJudge = null; - visitItem.IsJudgeSelect = null; - } - } - else - { - //两个都不为null 肯定是不同的裁判 - - //在未完成裁判之后的 - if (visitItem.VisitTaskNum > maxNotFinishedJudge.VisitTaskNum) - { - visitItem.IsTrigerJudge = null; - visitItem.IsJudgeSelect = null; - } - //完成裁判之后的 ,和未完成裁判之前的 - else if (visitItem.VisitTaskNum < maxNotFinishedJudge.VisitTaskNum && visitItem.VisitTaskNum > maxFinishedJudge.VisitTaskNum) - { - visitItem.IsTrigerJudge = true; - visitItem.IsJudgeSelect = null; - } - else if (visitItem.ArmEnum == maxFinishedJudge.JudgeArmEnum && visitItem.VisitTaskNum < maxFinishedJudge.VisitTaskNum) - { - visitItem.IsJudgeSelect = true; - visitItem.JudgeNote = maxFinishedJudge.JudgeNote; - } - else if (visitItem.VisitTaskNum < maxFinishedJudge.VisitTaskNum) - { - visitItem.IsJudgeSelect = false; - } - - } + finishedGlobalCount = 0; } else { - //没有产生裁判 有可能一个人没做完,也有可能做完了没产生裁判 - //两个人都做了 - if (resultExceptJudgeList.Count(t => t.VisitTaskNum == visitItem.VisitTaskNum && t.SubjectCode == visitItem.SubjectCode) == 2) + //已完成的全局数量 + finishedGlobalCount = resultExceptJudgeList.Where(t => t.SubjectCode == visitItem.SubjectCode && subjectReadingPeriondVisitNumList.Any(c => (c + addReadingPeriodNum) == t.VisitTaskNum) + /*&& t.ReadingCategory == ReadingCategory.Global*/) + .Select(t => new { t.VisitTaskNum, t.ArmEnum }).Distinct() + .GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).Count(); + } + + + visitItem.IsJudgeSelect = null; + visitItem.IsTrigerJudge = null; + + if (finishedGlobalCount != 0) + { + //最大的全局是否产生裁判 + + var subjectMaxFinishedGlobalTaskNum = resultExceptJudgeList.Where(t => t.SubjectCode == visitItem.SubjectCode && subjectReadingPeriondVisitNumList.Any(c => (c + addReadingPeriodNum) == t.VisitTaskNum) + /*&& t.ReadingCategory == ReadingCategory.Global*/) + .Select(t => new { t.VisitTaskNum, t.ArmEnum }).Distinct() + .GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).DefaultIfEmpty().Max(); + + //最大的完成的全局是否产生裁判 + if (subjectJudgeList.Any(t => t.VisitTaskNum == (subjectMaxFinishedGlobalTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge]))) { - //不存在裁判 将R1设置 - if (visitItem.ArmEnum == Arm.DoubleReadingArm1) + + var maxJudge = subjectJudgeList.FirstOrDefault(t => t.VisitTaskNum == (subjectMaxFinishedGlobalTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge])); + + //最大裁判完成了 + if (maxJudge.ReadingTaskState == ReadingTaskState.HaveSigned) { - visitItem.IsJudgeSelect = true; + if (visitItem.VisitTaskNum < maxJudge.VisitTaskNum) + { + //触发裁判 + visitItem.IsTrigerJudge = true; + + if (visitItem.ArmEnum == maxJudge.JudgeArmEnum) + { + visitItem.IsJudgeSelect = true; + visitItem.JudgeNote = maxJudge.JudgeNote; + } + //裁判没选择的人设置为false + else + { + visitItem.IsJudgeSelect = false; + } + } + else + { + //后续访视 未知 默认都是null + + } } else { - visitItem.IsJudgeSelect = false; + //找到当前未阅最大裁判之前的已完成的最大裁判任务 + var maxFinishedJudge = subjectJudgeList.Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault(); + + if (maxFinishedJudge == null) + { + // 为空 裁判选择标记默认就是null 不用处理 + + if (visitItem.VisitTaskNum < maxJudge.VisitTaskNum) + { + visitItem.IsTrigerJudge = true; + } + + } + else + { + if (visitItem.VisitTaskNum < maxFinishedJudge.VisitTaskNum) + { + visitItem.IsTrigerJudge = true; + + if (visitItem.ArmEnum == maxFinishedJudge.JudgeArmEnum) + { + visitItem.IsJudgeSelect = true; + visitItem.JudgeNote = maxFinishedJudge.JudgeNote; + } + //裁判没选择的人设置为false + else + { + visitItem.IsJudgeSelect = false; + } + } + else if (visitItem.VisitTaskNum > maxFinishedJudge.VisitTaskNum && visitItem.VisitTaskNum < maxJudge.VisitTaskNum) + { + //完成裁判 和未完成裁判之间的 裁判选择标记默认是null + + visitItem.IsTrigerJudge = true; + } + else + { + //在未完成全局裁判之后的访视 未知 默认都是null + + + } + + } + } + + } else { - visitItem.IsJudgeSelect = null; - visitItem.IsTrigerJudge = null; + //最大的完成的全局未产生裁判 + + if (visitItem.VisitTaskNum <= subjectMaxFinishedGlobalTaskNum) + { + visitItem.IsTrigerJudge = false; + + if (visitItem.ArmEnum == Arm.DoubleReadingArm1) + { + visitItem.IsJudgeSelect = true; + + } + else + { + visitItem.IsJudgeSelect = false; + } + } + else + { + //未产生裁判的全局之后的访视 两个标记都是null (后续可能还有全局,但是全局两个人没做完) + } + + } } + + + } } + else + { + foreach (var visitItem in resultExceptJudgeList.Where(t => t.ReadingCategory == ReadingCategory.Visit)) + { + visitItem.IsJudgeSelect = null; + visitItem.IsTrigerJudge = null; + } + + } return resultExceptJudgeList; } @@ -1373,240 +1489,8 @@ namespace IRaCIS.Core.Application.Service.Common #region 通用阅片结果导出 - /// - /// 一致性分析结果导出 7 8 分别是自身 和组件一致性 - /// - /// - /// - /// - /// - /// - [HttpPost] - public async Task GetAnalysisTaskList_Export(VisitTaskQuery inQuery, - [FromServices] IRepository _commonDocumentRepository, - [FromServices] IDictionaryService _dictionaryService, - [FromServices] IRepository _trialRepository) - { - //每次查询必须是单标准的 - var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); - var query = _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.TaskAllocationState == TaskAllocationState.Allocated && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze)) - - //一致性分析 - .WhereIf(inQuery.ReadingExportType == ExportResult.DetailedTableOfIntraReaderAnalysisResults, t => t.IsSelfAnalysis == true || t.IsSelfAnalysis == null) - .WhereIf(inQuery.ReadingExportType == ExportResult.DetailedTableOfIntraReaderAnalysisResults, t => t.IsSelfAnalysis == null ? t.Subject.SubjectVisitTaskList.Any(u => u.IsSelfAnalysis == true && u.VisitTaskNum == t.VisitTaskNum && u.DoctorUserId == t.DoctorUserId && u.TrialReadingCriterionId == t.TrialReadingCriterionId) : true) - .WhereIf(inQuery.ReadingExportType == ExportResult.DetailedTableOfInterReaderAnalysisResults, t => t.IsSelfAnalysis == false || t.IsSelfAnalysis == null) - - //访视和全局查询已签名完成的,裁判可以是未签名,未完成的 - .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.IsUrgent != null, t => t.IsUrgent == inQuery.IsUrgent) - .WhereIf(inQuery.DoctorUserId != null, t => t.DoctorUserId == inQuery.DoctorUserId) - .WhereIf(inQuery.ReadingCategory != null, t => t.ReadingCategory == inQuery.ReadingCategory) - //.WhereIf(inQuery.ReadingTaskState != null, t => t.ReadingTaskState == inQuery.ReadingTaskState) - .WhereIf(inQuery.TaskAllocationState != null, t => t.TaskAllocationState == inQuery.TaskAllocationState) - .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)) - .WhereIf(inQuery.BeginAllocateDate != null, t => t.AllocateTime > inQuery.BeginAllocateDate) - .WhereIf(inQuery.EndAllocateDate != null, t => t.AllocateTime < inQuery.EndAllocateDate); - - var list = await query.ProjectTo(_mapper.ConfigurationProvider, - new - { - readingExportType = inQuery.ReadingExportType, - criterionType = criterion.CriterionType, - trialReadingCriterionId = inQuery.TrialReadingCriterionId, - isEn_Us = _userInfo.IsEn_Us - }).ToListAsync(); - - list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum).ToList(); - - - var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - exportInfo.CriterionName = criterion.CriterionName; - - #region 处理系统标准存在疾病和整体肿瘤合并 - - //如果是以合并后的找翻译字典,会少,所以必须放在前面 - var translateDicNameList = list.SelectMany(t => t.QuestionAnswerList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(t => t.TranslateDicName).Distinct().ToList(); - - //针对1.1 整体肿瘤评估 有的两列要合并一列 - if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB || criterion.CriterionType == CriterionType.IRECIST1Point1) - { - foreach (var item in list) - { - //处理合并表头 - - var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.Tumor; - - var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault(); - - if (findItem != null) - { - findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估"; - } - - - if (item.IsBaseline == true) - { - item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.Tumor).ToList(); - } - else - { - item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList(); - } - } - } - else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) - { - - foreach (var item in list) - { - //处理合并表头 - - var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.ImgOncology; - - var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault(); - - if (findItem != null) - { - findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估"; - } - - if (item.IsBaseline == true) - { - item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ImgOncology).ToList(); - } - else - { - item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList(); - } - } - } - else if (criterion.CriterionType == CriterionType.PCWG3) - { - - } - - #endregion - - var export_Template = StaticData.Export.TrialSelfAnalysisList_Export; - - if (inQuery.ReadingExportType == ExportResult.DetailedTableOfIntraReaderAnalysisResults) - { - //找到非一致性分析的任务 - var selfExportList = list.Where(t => t.IsSelfAnalysis == null).ToList(); - - //处理一致性分析结果是否和原始阅片是否一致 - foreach (var item in selfExportList) - { - //找到一致性分析的结果 - var selfAnalysisTask = list.Where(t => t.IsSelfAnalysis == true && t.SubjectCode == item.SubjectCode && t.VisitTaskNum == item.VisitTaskNum && t.TaskName == t.TaskName && t.UserName == item.UserName).FirstOrDefault(); - - //将自身一致性分析的字段 赋值到访视任务这个字段 - item.IsAnalysisDiffToOriginalData = selfAnalysisTask?.IsAnalysisDiffToOriginalData; - - //处理再次阅片人的结果 - if (selfAnalysisTask != null) - { - var cloneQuestionAnswerList = selfAnalysisTask.QuestionAnswerList.Clone(); - - foreach (var qItem in cloneQuestionAnswerList) - { - qItem.QuestionName = qItem.QuestionName + $"{(_userInfo.IsEn_Us ? "(Again)" : "(再次)")}"; - } - - item.QuestionAnswerList = item.QuestionAnswerList.Union(cloneQuestionAnswerList).ToList(); - } - } - - list = selfExportList; - } - else - { - export_Template = StaticData.Export.TrialGroupAnalysisList_Export; - - var newList = new List(); - - foreach (var group in list.GroupBy(t => new { t.SubjectCode, t.VisitTaskNum, t.TaskName }).OrderBy(g => g.Key.SubjectCode).ThenBy(g => g.Key.VisitTaskNum)) - { - var subjectVisitGroupList = group.ToList(); - - - //找到当前访视组间一致性分析的任务结果 - - var groupOtherTaskList = subjectVisitGroupList.Where(t => t.IsSelfAnalysis == false).ToList(); - - foreach (var subjectVisitTaskArm in subjectVisitGroupList.Where(t => t.IsSelfAnalysis == null).OrderBy(t => t.ArmEnum)) - { - foreach (var otherTask in groupOtherTaskList) - { - //非一致性分析任务 - var cloneObj = subjectVisitTaskArm.Clone(); - - var otherTaskQuestionAnserList = otherTask.QuestionAnswerList.Clone(); - - foreach (var qItem in otherTaskQuestionAnserList) - { - qItem.QuestionName = qItem.QuestionName + $"{(_userInfo.IsEn_Us ? "(Again)" : "(再次)")}"; - } - - //处理 再次阅片人,再次阅片人角色 两列 - var addQuestionList = new List(); - - addQuestionList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Reviwer(Again)" : "阅片人(再次)", QuestionValue = otherTask.UserName }); - addQuestionList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Reviwer Role(Again)" : "阅片人角色(再次)", QuestionValue = ((int)otherTask.ArmEnum).ToString(), TranslateDicName = "ArmEnum" }); - - - cloneObj.QuestionAnswerList = cloneObj.QuestionAnswerList.Union(addQuestionList).Union(otherTaskQuestionAnserList).ToList(); - - - cloneObj.IsGroupAnalysisDiffToOriginalData = cloneObj.ArmEnum == Arm.DoubleReadingArm1 ? otherTask.IsGroupDiffArm1 : otherTask.IsGroupDiffArm2; - - newList.Add(cloneObj); - } - } - } - translateDicNameList.Add("ArmEnum"); - - list = newList; - - } - - var columNameList = list.SelectMany(t => t.QuestionAnswerList).Where(t => t.QuestionName.IsNotNullOrEmpty()).Select(t => t.QuestionName).Distinct().ToList(); - - exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list.Where(t => t.ReadingCategory != ReadingCategory.Global).ToList(), _userInfo.TimeZoneId); - exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); - - var dynamicColumnConfig = new DynamicColumnConfig() - { - AutoColumnTitleRowIndex = 2, - AutoColumnStartIndex = 5, - TempalteLastColumnIndex = 4, - DynamicItemDicName = "TranslateDicName", - DynamicItemValueName = "QuestionValue", - DynamicItemTitleName = "QuestionName", - DynamicListName = "QuestionAnswerList", - RemoveColunmIndexList = new List() { }, - ColumnNameList = columNameList ?? new List(), - TranslateDicNameList = translateDicNameList ?? new List() - }; - - - var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(AnalysisDynamicCommonExport), criterion.CriterionType, dynamicColumnConfig); - - return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") - { - FileDownloadName = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}_{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx" - }; - - } - /// /// 获取阅片标准可以导出的列表 @@ -1618,72 +1502,53 @@ namespace IRaCIS.Core.Application.Service.Common var list = new List(); - var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionGroup, t.CriterionName, t.ArbitrationRule, t.IsArbitrationReading }).FirstNotNullAsync(); list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReading_Export, ExportCatogory = ExportResult.TableOfAssessmentResults }); list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReadingDetail_Export, ExportCatogory = ExportResult.DetailedTableOfAssessmentResults }); + if (criterion.IsArbitrationReading) + { + //仲裁阅片 才有裁判阅片明细表 同时要把模板里面的三列给去掉 + list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonJudgeReadingDetail_Export, ExportCatogory = ExportResult.DetailedTableOfAdjudicationResults }); + } - //list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonJudgeReadingDetail_Export, ExportCatogory = ExportResult.DetailedTableOfAdjudicationResults }); - - - if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB - || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.Lugano2014 - || criterion.CriterionType == CriterionType.Lugano2014WithoutPET || criterion.CriterionType == CriterionType.PCWG3) + if (criterion.CriterionGroup == CriterionGroup.Tumor) { list.Add(new ExportDocumentDes() { Code = StaticData.Export.ReadingLession_Export, ExportCatogory = ExportResult.DetailedTableOfLesions }); } - //if (criterion.CriterionType == CriterionType.OCT) + if (criterion.CriterionType == CriterionType.OCT) + { + list.Add(new ExportDocumentDes() { Code = StaticData.Export.OCT_ReadingLession_Export, ExportCatogory = ExportResult.OCT_ReadingLession_Export }); + } + //else if (criterion.CriterionType == CriterionType.SelfDefine) //{ - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OCT_ReadingLession_Export, ExportCatogory = ExportResult.OCT_ReadingLession_Export }); + // list.Add(new ExportDocumentDes() { Code = StaticData.Export.CDISC_Reading_Export, ExportCatogory = ExportResult.CDISC }); //} - //switch (criterion.ArbitrationRule) - //{ - // case ArbitrationRule.None: - // break; + switch (criterion.ArbitrationRule) + { + case ArbitrationRule.None: + break; - // case ArbitrationRule.Visit: - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.VisitJudgeRatio_Export, ExportCatogory = ExportResult.VisitJudgeRatio_Export }); + case ArbitrationRule.Visit: + list.Add(new ExportDocumentDes() { Code = StaticData.Export.VisitJudgeRatio_Export, ExportCatogory = ExportResult.VisitJudgeRatio_Export }); - // break; - // case ArbitrationRule.Reading: - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.ReadingPeriodJudgeRatio_Export, ExportCatogory = ExportResult.ReadingPeriodJudgeRatio_Export }); + break; + case ArbitrationRule.Reading: + list.Add(new ExportDocumentDes() { Code = StaticData.Export.ReadingPeriodJudgeRatio_Export, ExportCatogory = ExportResult.ReadingPeriodJudgeRatio_Export }); - // break; - // case ArbitrationRule.NA: - // break; - // default: - // break; - //} + break; + case ArbitrationRule.NA: + break; + default: + break; + } - //if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB) - //{ - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.EvaluationOfTumorEfficacy }); - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); - //} - - //else if (criterion.CriterionType == CriterionType.PCWG3) - //{ - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); - //} - //else if (criterion.CriterionType == CriterionType.IRECIST1Point1) - //{ - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.IRECIST1Point1EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); - //} - //else if (criterion.CriterionType == CriterionType.Lugano2014) - //{ - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); - // list.Add(new ExportDocumentDes() { Code = StaticData.Export.Lugano2014EvaluationOfTumorEfficacy_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); - //} - var result = _commonDocumentRepository.Where(t => list.Select(c => c.Code).Contains(t.Code)).Select(c => new ExportDocumentDes() { Code = c.Code, FileName = _userInfo.IsEn_Us ? c.Name : c.NameCN }).ToList(); foreach (var item in list) @@ -1704,11 +1569,16 @@ namespace IRaCIS.Core.Application.Service.Common [HttpPost] public async Task GetCommonEvaluationList_Export(VisitTaskQuery inQuery, [FromServices] IRepository _commonDocumentRepository, + [FromServices] IRepository _trialReadingQuestionRepository, + [FromServices] IRepository _trialReadingTableQuestionRepository, + [FromServices] IRepository _oncologyRepository, [FromServices] IDictionaryService _dictionaryService, [FromServices] IRepository _trialRepository) { + var trialId = inQuery.TrialId; + var trialReadingCriterionId = inQuery.TrialReadingCriterionId; //每次查询必须是单标准的 - var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); + var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionGroup, t.IsGlobalReading, t.IsArbitrationReading, t.IsOncologyReading, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); var query = _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.IsAnalysisCreate == false && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze)) @@ -1733,18 +1603,41 @@ namespace IRaCIS.Core.Application.Service.Common var list = new List(); + var taskList = new List(); + #region 区分导表类型 + var removeColumnIndexList = new List() { }; + + if (inQuery.ReadingExportType == ExportResult.DetailedTableOfAdjudicationResults || + inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults || + inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions || + inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults) + { + if (!criterion.IsArbitrationReading) + { + //仲裁阅片 才有裁判阅片明细表 同时要把模板里面的三列给去掉 + //removeColumnIndexList = new List() { 6, 7, 8 }; + + // HIR模板直接没有 不用去掉 + } + + //阅片结果表 和阅片结果明细表 没有肿瘤学的时候需要移除肿瘤学三个字段 + + if (!criterion.IsOncologyReading) + { + if (inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults || inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults) + { + //HIR 这边是 5 6 7 替换 9, 10, 11 + removeColumnIndexList = removeColumnIndexList.Union(new List() { 5, 6, 7 }).ToList(); + } + } + } + var export_Template = StaticData.Export.CommonReading_Export; if (inQuery.ReadingExportType == ExportResult.DetailedTableOfAdjudicationResults) { - //R1 R2 两个人的访视都阅片完成了才可以,去除只有一个人阅片完成的访视 - - //找到只有一个人阅片的受试者 和访视 - var exceptVisit = list.GroupBy(t => new { t.SubjectCode, t.TaskName }).Where(g => g.Count() == 1).Select(g => new { g.Key.SubjectCode, g.Key.TaskName }).ToList(); - list = list.Where(t => !exceptVisit.Any(ev => ev.SubjectCode == t.SubjectCode && ev.TaskName == t.TaskName)).ToList(); - //裁判明表 export_Template = StaticData.Export.CommonJudgeReadingDetail_Export; } @@ -1757,12 +1650,28 @@ namespace IRaCIS.Core.Application.Service.Common { //病灶明细表 export_Template = StaticData.Export.ReadingLession_Export; + } + else if (inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults) + { + //阅片结果表 + export_Template = StaticData.Export.CommonReading_Export; + } + else if (inQuery.ReadingExportType == ExportResult.OCT_ReadingLession_Export) + { + //OCT + export_Template = StaticData.Export.OCT_ReadingLession_Export; } - //病灶明细表 需要单独处理 - if (inQuery.ReadingExportType != ExportResult.DetailedTableOfLesions && inQuery.ReadingExportType != ExportResult.OCT_ReadingLession_Export) + + // 肿瘤标准 按照任务级别 + if ((inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults || + inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults || + inQuery.ReadingExportType == ExportResult.DetailedTableOfAdjudicationResults) && + (criterion.CriterionGroup == CriterionGroup.Tumor) + ) + { //其他可以统一处理 list = await query.ProjectTo(_mapper.ConfigurationProvider, @@ -1774,85 +1683,182 @@ namespace IRaCIS.Core.Application.Service.Common trialReadingCriterionId = inQuery.TrialReadingCriterionId, isEn_Us = _userInfo.IsEn_Us }).ToListAsync(); + } - else + //肿瘤标准 病灶明细表 按照病灶级别 (OCT 暂时不删除,先看是否能覆盖) + else if ( + (inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions && + criterion.CriterionGroup == CriterionGroup.Tumor + ) || inQuery.ReadingExportType == ExportResult.OCT_ReadingLession_Export + ) { - //病灶明细表 - if (inQuery.ReadingExportType == ExportResult.OCT_ReadingLession_Export) + + taskList = await query.ProjectTo(_mapper.ConfigurationProvider, + new { - export_Template = StaticData.Export.OCT_ReadingLession_Export; + readingExportType = inQuery.ReadingExportType, + criterionType = criterion.CriterionType, + arbitrationRule = criterion.ArbitrationRule, + trialReadingCriterionId = inQuery.TrialReadingCriterionId, + isEn_Us = _userInfo.IsEn_Us + }).ToListAsync(); + + } + + + + #endregion + + + + + + var dynamicColumnConfig = new DynamicColumnConfig(); + + //查询配置的问题名称,不是从答案表中连接取问题名称,因为目前有些保存,有些问题,虽然配置了,但是没填,导致导表有些配置的列没出来 + var trialConfigQuestionList = _trialReadingQuestionRepository.Where(t => t.TrialId == trialId && t.ReadingQuestionCriterionTrialId == trialReadingCriterionId).Where(t => t.ExportResultStr.Contains(((int)inQuery.ReadingExportType).ToString())).OrderBy(t => t.ShowOrder).Select(t => new ExportQuestionBasicInfo() + { + QuestionId = t.Id, + QuestionType = t.QuestionType, + TableName = "", + QuestionName = _userInfo.IsEn_Us ? t.QuestionEnName : t.QuestionName, + TranslateDicName = t.DictionaryCode, + GroupName = _userInfo.IsEn_Us ? t.GroupInfo.GroupEnName : t.GroupInfo.GroupName + }).ToList(); + + + + + + //最终EXCEL 列 + var configCoumNameList = new List(); + + //最终翻译字典 + var translateDicNameList = new List(); + + + //表格全问题名 + var trialConfigTableQuestionList = _trialReadingTableQuestionRepository.Where(t => t.TrialId == trialId && t.TrialCriterionId == trialReadingCriterionId).Where(t => t.ExportResultStr.Contains(((int)inQuery.ReadingExportType).ToString())) + .OrderBy(t => t.ShowOrder).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, + TranslateDicName = t.DictionaryCode + }).ToList(); + + + + var fistLeveLNameList = new List(); + + //肿瘤评估,非CDISC 导出 + if (criterion.CriterionGroup == CriterionGroup.Tumor) + { + #region 外层问题处理 + + if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB + || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC) + { + + fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem() + { + Id = Guid.Empty, + Name = (t.QuestionType == QuestionType.ExistDisease || t.QuestionType == QuestionType.Tumor) ? (_userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估") : t.QuestionName + }).Distinct().ToList(); + + + + } - - var taskList = await query.ProjectTo(_mapper.ConfigurationProvider, - new - { - readingExportType = inQuery.ReadingExportType, - criterionType = criterion.CriterionType, - arbitrationRule = criterion.ArbitrationRule, - trialReadingCriterionId = inQuery.TrialReadingCriterionId, - isEn_Us = _userInfo.IsEn_Us - }).ToListAsync(); - - //动态列,以不同的病灶配置的问题取并集 - var lessionAnserList = taskList.Where(t => t.LesionList.Count() > 0).FirstOrDefault()?.LesionList.FirstOrDefault()?.LessionAnswerList ?? new List(); - - var dynamicExtraAddTitleList = new List(); - - if (lessionAnserList.Count() > 0) + else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) { - var lessionInfo = lessionAnserList.First(); - if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB - || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) + fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem() { - dynamicExtraAddTitleList.Add(new DymamicQuestionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion ID" : "病灶编号" }); - dynamicExtraAddTitleList.Add(new DymamicQuestionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型" }); - } - else if (criterion.CriterionType == CriterionType.PCWG3) + Id = Guid.Empty, + Name = (t.QuestionType == QuestionType.ExistDisease || t.QuestionType == QuestionType.ImgOncology) ? (_userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估") : t.QuestionName + }).Distinct().ToList(); + + } + else if (criterion.CriterionType == CriterionType.PCWG3) + { + fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem() { - dynamicExtraAddTitleList.Add(new DymamicQuestionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型" }); - } + Id = Guid.Empty, + Name = t.QuestionName + }).Distinct().ToList(); } - //通过问题标识取并集 + #endregion - var dynamicLessionTitleList = lessionAnserList.Select(t => new DymamicQuestionInfo { QuestionMark = t.QuestionMark, QuestionName = t.QuestionName, TranslateDicName = t.TranslateDicName }).Distinct(); - var dynamicTitleList = dynamicExtraAddTitleList.Union(dynamicLessionTitleList).ToList(); + var exTralDicNameList = new List() { "LesionType" }; - //最终的病灶列表 要把裁判的也要加进去 - list = new List(); + translateDicNameList = trialConfigQuestionList.Union(trialConfigTableQuestionList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(t => t.TranslateDicName).Union(exTralDicNameList).Distinct().ToList(); + + #region 表格问题处理 肿瘤 表格问题直接去重、同时添加一些列 + var extralNameList = new List(); + + if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB + || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC + || criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) + { + + //if(inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions) + { + extralNameList.Add(new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = _userInfo.IsEn_Us ? "Lesion ID" : "病灶编号" }); + extralNameList.Add(new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型" }); + } + + } + else if (criterion.CriterionType == CriterionType.PCWG3) + { + //if (inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions) + { + extralNameList.Add(new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型" }); + + } + } + + //肿瘤评估标准目前是去重 按照问题名称填充 不是Id + var tableQuestionNameList = trialConfigTableQuestionList.Select(t => t.QuestionName).Distinct().Select(t => new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = t }).Distinct().ToList(); + + //有表格问题 那么就是三部分,否则就是外层问题 + configCoumNameList = tableQuestionNameList.Count == 0 ? fistLeveLNameList : fistLeveLNameList.Union(extralNameList).Union(tableQuestionNameList).ToList(); - foreach (var item in taskList) + #region 扩展病灶 + + + //最终的病灶列表 要把裁判的也要加进去,需要处理裁判标记 + + foreach (var item in taskList.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum)) { if (item.LesionList.Count > 0) { - foreach (var lession in item.LesionList) + foreach (var lession in item.LesionList.OrderBy(t => t.LessionType).ThenBy(t => t.LessionCode)) { - var firstLessionAnser = lession.LessionAnswerList.FirstOrDefault() ?? new CommonLessionQuestionAnswerInfo(); var addLessionInfoList = new List(); if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB - || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) + || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC + || criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) { //病灶编号 和病灶类型没有配置,但是需要有的 - addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion ID" : "病灶编号", QuestionValue = firstLessionAnser.LessionCode }); - addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型", QuestionValue = firstLessionAnser.LessionType, TranslateDicName = "LesionType" }); + addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion ID" : "病灶编号", QuestionValue = lession.LessionCode }); + addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型", QuestionValue = lession.LessionType, TranslateDicName = "LesionType" }); } else if (criterion.CriterionType == CriterionType.PCWG3) { - addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型", QuestionValue = firstLessionAnser.LessionType, TranslateDicName = "LesionType" }); + addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型", QuestionValue = lession.LessionType, TranslateDicName = "LesionType" }); } - var dynamicPartialLessionInfoList = lession.LessionAnswerList.Select(t => new CommonQuesionInfo() { QuestionName = t.QuestionName, QuestionValue = t.QuestionValue, TranslateDicName = t.TranslateDicName }); - //有三部分组成 外层问题+ 没有配置病灶编号和类型+ 动态的表格问题 - var dynamicLessionInfoList = addLessionInfoList.Union(dynamicPartialLessionInfoList).Union(item.QuestionAnswerList).ToList(); + var dynamicLessionInfoList = item.QuestionAnswerList.Union(addLessionInfoList).Union(dynamicPartialLessionInfoList).ToList(); //OCT 多个表格,但是只导出一个表格,有的问题答案就是空的 if (dynamicLessionInfoList.Count > 0) @@ -1872,120 +1878,247 @@ namespace IRaCIS.Core.Application.Service.Common list.Add(item); } + } + + #endregion + + #region 不管是list 还是taskList 最终处理的数据都是list 处理好数据后合并 + if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB + || criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC) + { + //针对1.1 整体肿瘤评估 有的两列要合并一列 + foreach (var item in list) + { + //处理合并表头 + + var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.Tumor; + + var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault(); + + if (findItem != null) + { + findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估"; + } + + + if (item.IsBaseline == true) + { + item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.Tumor).ToList(); + } + else + { + item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList(); + } + } + } + else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) + { + foreach (var item in list) + { + //处理合并表头 + + var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.ImgOncology; + + var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault(); + + if (findItem != null) + { + findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估"; + } + + if (item.IsBaseline == true) + { + item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ImgOncology).ToList(); + } + else + { + item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList(); + } + } + } + + #endregion + + #endregion + } + else + //非肿瘤评估,非CDISC 导出 + { + //外层问题处理 + fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem() + { + Id = t.QuestionId, + Name = t.QuestionName + }).ToList(); + + translateDicNameList = trialConfigQuestionList.Union(trialConfigTableQuestionList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(t => t.TranslateDicName).Distinct().ToList(); + + #region 表格问题处理 问题名称是 表格名称_表格子问题名 + + var isMutiTable = trialConfigTableQuestionList.Select(t => t.TableName).Distinct().Count() > 1; + + //多表格问题 + if (isMutiTable) + { + //多表格,增加的一列,就用Guid.Empty 标识 + var extralNameList = new List() { new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = _userInfo.IsEn_Us ? "Table Name" : "表格名称" } }; + + var tableQuestionNameList = trialConfigTableQuestionList.OrderBy(t => t.TableName).Select(t => new DynamicColumnConfig.ColumItem() { Id = t.QuestionId, Name = t.TableName + "_" + t.QuestionName }).ToList(); + + configCoumNameList = fistLeveLNameList.Union(extralNameList).Union(tableQuestionNameList).ToList(); + } + else + { + //单表格问题(直接用表格问题名称) 或者没有表格问题 + + var tableNameList = trialConfigTableQuestionList.Select(t => new DynamicColumnConfig.ColumItem() { Id = t.QuestionId, Name = t.QuestionName }).ToList(); + + configCoumNameList = fistLeveLNameList.Union(tableNameList).ToList(); + } + #region 扩展表格问题 + + + //最终的病灶列表 要把裁判的也要加进去,需要处理裁判标记 + 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 firstLessionAnser = lession.LessionAnswerList.FirstOrDefault(); + + var dynamicLessionInfoList = new List(); + + if (isMutiTable) + { + var addLessionInfoList = new List(); + + addLessionInfoList.Add(new CommonQuesionInfo() { QuestionId = Guid.Empty, QuestionName = _userInfo.IsEn_Us ? "Table Name" : "表格名称", QuestionValue = firstLessionAnser.TableName }); + + var dynamicPartialLessionInfoList = lession.LessionAnswerList.Select(t => new CommonQuesionInfo() { QuestionId = t.TableQuesionId, QuestionName = t.TableName + "_" + t.QuestionName, QuestionValue = t.QuestionValue, TranslateDicName = t.TranslateDicName }); + + //有三部分组成 外层问题+ 固定列表格名称 + 动态的表格问题 + dynamicLessionInfoList = item.QuestionAnswerList.Union(addLessionInfoList).Union(dynamicPartialLessionInfoList).ToList(); + } + else + { + var dynamicPartialLessionInfoList = lession.LessionAnswerList.Select(t => new CommonQuesionInfo() { QuestionId = t.TableQuesionId, QuestionName = t.QuestionName, QuestionValue = t.QuestionValue, TranslateDicName = t.TranslateDicName }); + + //两部分组成 外层问题+ 动态的表格问题 + dynamicLessionInfoList = item.QuestionAnswerList.Union(dynamicPartialLessionInfoList).ToList(); + } + + + + var cloneItem = item.Clone(); + cloneItem.QuestionAnswerList = dynamicLessionInfoList; + list.Add(cloneItem); + } + + } + } + else + { + //要把裁判任务加进去 裁判任务上没有病灶 + + list.Add(item); + } + } + #endregion + + #endregion } - #endregion + dynamicColumnConfig = new DynamicColumnConfig() + { + AutoColumnTitleRowIndex = 2, + AutoColumnStartIndex = 5, + TempalteLastColumnIndex = 7, + DynamicItemDicName = "TranslateDicName", + DynamicItemValueName = "QuestionValue", + DynamicItemTitleName = "QuestionName", + DynamicItemTitleId = "QuestionId", + DynamicListName = "QuestionAnswerList", + RemoveColunmIndexList = removeColumnIndexList, + ColumnIdNameList = configCoumNameList, + //CDISCList = new List(), + TranslateDicNameList = translateDicNameList + }; + + if (export_Template == StaticData.Export.ReadingLession_Export || export_Template == StaticData.Export.CommonJudgeReadingDetail_Export) + { + //HIR 这边是4 没有裁判的3个字段 和中心编号 + dynamicColumnConfig.TempalteLastColumnIndex = 4; + } + + + + + #region 最终导出参数处理 + + //裁判阅片明细表 + if (export_Template == StaticData.Export.CommonJudgeReadingDetail_Export) + { + //R1 R2 两个人的访视都阅片完成了才可以,去除只有一个人阅片完成的访视 + //找到只有一个人阅片的受试者 和访视 + var exceptVisit = list.Where(t => t.ReadingCategory == ReadingCategory.Visit) + .GroupBy(t => new { t.SubjectCode, t.TaskName }).Where(g => g.Count() == 1).Select(g => new { g.Key.SubjectCode, g.Key.TaskName }).ToList(); + + list = list.Where(t => !exceptVisit.Any(ev => ev.SubjectCode == t.SubjectCode && ev.TaskName == t.TaskName)).ToList(); + + } + list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum).ToList(); + //处理裁判标记 + list = DealJudgeMark(criterion.ArbitrationRule, criterion.IsGlobalReading, list); + + //处理肿瘤学结果 + list = DealOncologyResult(_oncologyRepository, criterion.IsOncologyReading, list); + + //裁判阅片明细表 处理完标记后处理 + if (export_Template == StaticData.Export.CommonJudgeReadingDetail_Export) + { + //裁判产生标记为空的数据过滤掉 + list = list.Where(t => t.IsTrigerJudge != null).ToList(); + } + + var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.CriterionName = criterion.CriterionName; - //处理裁判标记 - list = DealJudgeMark(criterion.ArbitrationRule, list); - - - #region 系统标准处理整体肿瘤评估合并 - - var translateDicNameList = list.SelectMany(t => t.QuestionAnswerList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(t => t.TranslateDicName).Distinct().ToList(); - - - //针对1.1 整体肿瘤评估 有的两列要合并一列 - if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB || criterion.CriterionType == CriterionType.IRECIST1Point1) - { - foreach (var item in list) - { - //处理合并表头 - - var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.Tumor; - - var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault(); - - if (findItem != null) - { - findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估"; - } - - - if (item.IsBaseline == true) - { - item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.Tumor).ToList(); - } - else - { - item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList(); - } - } - } - else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET) - { - - foreach (var item in list) - { - //处理合并表头 - - var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.ImgOncology; - - var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault(); - - if (findItem != null) - { - findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估"; - } - - if (item.IsBaseline == true) - { - item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ImgOncology).ToList(); - } - else - { - item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList(); - } - } - } - else if (criterion.CriterionType == CriterionType.PCWG3) - { - - } - - var columNameList = list.SelectMany(t => t.QuestionAnswerList).Where(t => t.QuestionName.IsNotNullOrEmpty()).Select(t => t.QuestionName).Distinct().ToList(); - - #endregion - - - - exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list.Where(t => t.ReadingCategory != ReadingCategory.Global).ToList(), _userInfo.TimeZoneId); exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); - var dynamicColumnConfig = new DynamicColumnConfig() - { - AutoColumnTitleRowIndex = 2, - AutoColumnStartIndex = 5, - TempalteLastColumnIndex = 4, - DynamicItemDicName = "TranslateDicName", - DynamicItemValueName = "QuestionValue", - DynamicItemTitleName = "QuestionName", - DynamicListName = "QuestionAnswerList", - RemoveColunmIndexList = new List() { }, - ColumnNameList = columNameList ?? new List(), - TranslateDicNameList = translateDicNameList ?? new List() - }; + exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list.Where(t => t.ReadingCategory != ReadingCategory.Global).ToList(), _userInfo.TimeZoneId); - var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig); + MemoryStream? memoryStream = null; + + string fileName = ""; + + + (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig); + return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}_{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx" }; + + #endregion } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 5a044557f..fa89c036b 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -1140,22 +1140,49 @@ namespace IRaCIS.Core.Application.Contracts public class CommonQuesionInfo { + //问题标识,肿瘤评估用于区分是什么问题 public QuestionType? QuestionType { get; set; } + + + public Guid QuestionId { get; set; } public string QuestionName { get; set; } public string QuestionValue { get; set; } public string TranslateDicName { get; set; } + + public string CDISCCode { get; set; } + + //外层问题会重复,所以需要分组名 + + public string Group { get; set; } + } + + public class ExportQuestionBasicInfo + { + public QuestionType? QuestionType { get; set; } + public string TableName { get; set; } + public Guid QuestionId { get; set; } + public string QuestionName { get; set; } + public string TranslateDicName { get; set; } + + public string GroupName { get; set; } + + public int ShowOrder { get; set; } } public class CommonEvaluationExport { public List QuestionAnswerList { get; set; } + public List SubjectCriterionReadingPeriodVisitNumList { get; set; } + public String TrialSiteCode { get; set; } = String.Empty; public string SubjectCode { get; set; } = String.Empty; public Guid Id { get; set; } + public Guid SubjectId { get; set; } + public Guid? DoctorUserId { get; set; } public string TaskName { get; set; } @@ -1191,6 +1218,19 @@ namespace IRaCIS.Core.Application.Contracts public string JudgeNote { get; set; } = string.Empty; public string VisitNote { get; set; } + + + #region 肿瘤学结果 + + [DictionaryTranslateAttribute("OncologyAssessType")] + public string OncologyResult { get; set; } = string.Empty; + + public string OncologyReason { get; set; } = string.Empty; + + public string OncologyUserName { get; set; } + + #endregion + } public class CommonLessionExport : CommonEvaluationExport @@ -1219,13 +1259,23 @@ namespace IRaCIS.Core.Application.Contracts public class CommonLessionQuestionAnswerInfo { - public string LessionCode { get; set; } - - public string LessionType { get; set; } - + #region 肿瘤评估标准的时候需要 public QuestionMark? QuestionMark { get; set; } + #endregion + + + + + #region 自定义表格名 特殊处理 + + public string TableName { get; set; } + #endregion + + + public Guid TableQuesionId { get; set; } + public string QuestionName { get; set; } public string QuestionValue { get; set; } diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index 15670b6e2..f7075ff93 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -203,29 +203,29 @@ namespace IRaCIS.Core.Application.Service ExportResult readingExportType = ExportResult.None; CreateMap() - // .ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName)) - .ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine)) - .ForMember(o => o.JudgeArmEnum, t => t.MapFrom(u => u.JudgeResultTask.ArmEnum)) + // .ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName)) + .ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine)) + .ForMember(o => o.JudgeArmEnum, t => t.MapFrom(u => u.JudgeResultTask.ArmEnum)) - .ForMember(o => o.IsTrigerJudge, t => t.MapFrom(u => arbitrationRule == ArbitrationRule.Visit ? u.JudgeResultTaskId != null : - (arbitrationRule == ArbitrationRule.Reading ? - u.Subject.SubjectVisitTaskList.Any(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Judge && t.TrialReadingCriterionId == trialReadingCriterionId && u.VisitTaskNum < t.VisitTaskNum) : - false))) + .ForMember(o => o.IsTrigerJudge, t => t.MapFrom(u => arbitrationRule == ArbitrationRule.Visit ? u.JudgeResultTaskId != null : + (arbitrationRule == ArbitrationRule.Reading ? + u.Subject.SubjectVisitTaskList.Any(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Judge && t.TrialReadingCriterionId == trialReadingCriterionId && u.VisitTaskNum < t.VisitTaskNum) : + false))) - .ForMember(o => o.JudgeNote, t => t.MapFrom(u => u.JudgeResultRemark)) + .ForMember(o => o.JudgeNote, t => t.MapFrom(u => u.JudgeResultRemark)) - .ForMember(o => o.VisitNote, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.AdjustReason).FirstOrDefault()!.Answer)) + .ForMember(o => o.VisitNote, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.AdjustReason).FirstOrDefault()!.Answer)) - .ForMember(o => o.OverallTumorEvaluationResult, t => t.MapFrom(u => - criterionType == CriterionType.PCWG3 ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstOrDefault()!.Answer : - (u.SourceSubjectVisit.IsBaseLine == true ? - u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault()!.Answer : - u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).Select(t => t.IsGlobalChange ? t.GlobalChangeAnswer : t.Answer).FirstOrDefault()) - )) + .ForMember(o => o.OverallTumorEvaluationResult, t => t.MapFrom(u => + criterionType == CriterionType.PCWG3 ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstOrDefault()!.Answer : + (u.SourceSubjectVisit.IsBaseLine == true ? + u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault()!.Answer : + u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).Select(t => t.IsGlobalChange ? t.GlobalChangeAnswer : t.Answer).FirstOrDefault()) + )) - .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) - .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) - .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)); + .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) + .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) + .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)); CreateMap() .ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine)) @@ -240,7 +240,10 @@ namespace IRaCIS.Core.Application.Service QuestionType = c.ReadingQuestionTrial.QuestionType, QuestionName = isEn_Us ? c.ReadingQuestionTrial.QuestionEnName : c.ReadingQuestionTrial.QuestionName, QuestionValue = c.IsGlobalChange ? c.GlobalChangeAnswer : c.Answer, - TranslateDicName = c.ReadingQuestionTrial.DictionaryCode + QuestionId = c.ReadingQuestionTrial.Id, + TranslateDicName = c.ReadingQuestionTrial.DictionaryCode, + //CDISCCode = c.ReadingQuestionTrial.CDISCCode, + Group = isEn_Us ? c.ReadingQuestionTrial.GroupEnName : c.ReadingQuestionTrial.GroupName, }))) ; @@ -253,9 +256,19 @@ namespace IRaCIS.Core.Application.Service (arbitrationRule == ArbitrationRule.Reading ? u.Subject.SubjectVisitTaskList.Any(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Judge && t.TrialReadingCriterionId == trialReadingCriterionId && u.VisitTaskNum < t.VisitTaskNum) : false))) - .ForMember(o => o.JudgeNote, t => t.MapFrom(u => u.JudgeVisitTask.JudgeResultRemark)) + .ForMember(o => o.JudgeNote, t => t.MapFrom(u => u.ReadingCategory == ReadingCategory.Judge ? u.JudgeResultRemark : "")) .ForMember(o => o.VisitNote, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.AdjustReason).FirstOrDefault()!.Answer)) - //.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) + //.ForMember(o => o.IsSubjectHaveReadingPeriod, t => t.MapFrom(u => arbitrationRule == ArbitrationRule.Reading ? + //u.Subject.ReadModuleList.Any(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.ReadingSetType == ReadingSetType.ImageReading) : false)) + + + .ForMember(o => o.SubjectCriterionReadingPeriodVisitNumList, t => t.MapFrom(u => + u.Subject.ReadModuleList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.ReadingSetType == ReadingSetType.ImageReading).Select(c => c.SubjectVisit.VisitNum))) + + //.ForMember(o => o.ResearchProgramNo, t => t.MapFrom(u => u.Trial.ResearchProgramNo)) + //.ForMember(o => o.VisitName, t => t.MapFrom(u => u.SourceSubjectVisit.VisitName)) + .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) + //.ForMember(o => o.LatestScanDate, t => t.MapFrom(u => u.SourceSubjectVisit.LatestScanDate)) .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)) .ForMember(o => o.QuestionAnswerList, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList @@ -264,9 +277,10 @@ namespace IRaCIS.Core.Application.Service .Select(c => new CommonQuesionInfo() { 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 + QuestionValue = c.IsGlobalChange ? c.GlobalChangeAnswer : c.Answer, + TranslateDicName = c.ReadingQuestionTrial.DictionaryCode, }))) ; @@ -279,11 +293,17 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.LessionAnswerList, t => t.MapFrom(u => u.LesionAnswerList.Where(c => c.ReadingTableQuestionTrial.ExportResultStr.Contains(((int)readingExportType).ToString())))); 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.LessionCode, t => t.MapFrom(u => u.Lesion.RowMark)) + //.ForMember(o => o.LessionType, t => t.MapFrom(u => (int?)u.ReadingQuestionTrial.LesionType)) + //.ForMember(o => o.ShowOrder, t => t.MapFrom(u => u.ReadingTableQuestionTrial.ShowOrder)) + //.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.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)) + .ForMember(o => o.TableName, t => t.MapFrom(u => isEn_Us ? u.ReadingQuestionTrial.QuestionEnName : u.ReadingQuestionTrial.QuestionName)) .ForMember(o => o.TranslateDicName, t => t.MapFrom(u => u.ReadingTableQuestionTrial.DictionaryCode)) ; From d1e08b0fc0a7cf46db12f446b23aef05a57e8a95 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 8 Sep 2025 10:30:15 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=BC=8F=E6=8F=90=E4=BA=A4=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/Service/Management/UserService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/Management/UserService.cs b/IRaCIS.Core.Application/Service/Management/UserService.cs index 3b041089c..92f12e3bb 100644 --- a/IRaCIS.Core.Application/Service/Management/UserService.cs +++ b/IRaCIS.Core.Application/Service/Management/UserService.cs @@ -597,7 +597,7 @@ namespace IRaCIS.Core.Application.Service }; - await _trialIdentityUserRepository.AddAsync(currentUser); + await _trialIdentityUserRepository.AddAsync(currentUser,true); } } From 26e7305bcfe6a9fa9d47d693ff3a90e974eee567 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 8 Sep 2025 14:44:30 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E8=BF=94=E5=9B=9E=E8=AF=BE=E9=A2=98?= =?UTF-8?q?=E7=BB=84=E7=BC=96=E7=A0=81=20=E5=92=8CAE=20=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRC.Core.SCP/Service/CStoreSCPService.cs | 14 ++++++++++---- .../Service/Management/DTO/UserModel.cs | 2 ++ .../Service/Management/_MapConfig.cs | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/IRC.Core.SCP/Service/CStoreSCPService.cs b/IRC.Core.SCP/Service/CStoreSCPService.cs index 7f55d3ed3..462bad2e2 100644 --- a/IRC.Core.SCP/Service/CStoreSCPService.cs +++ b/IRC.Core.SCP/Service/CStoreSCPService.cs @@ -108,20 +108,26 @@ namespace IRaCIS.Core.SCP.Service var _hospitalGroupRepository = _serviceProvider.GetService>(); + var _dicomAERepository = _serviceProvider.GetService>(); + + var aeList = _dicomAERepository/*.Where(t => t.PacsTypeEnum == PacsType.PacsServer)*/.Select(t => t.CalledAE).ToList(); + var list = _hospitalGroupRepository.Where(t => t.IsEnable).ToList(); - CurrentHospitalGroup = list.FirstOrDefault(t => t.CallingAE == Association.CallingAE); + CurrentHospitalGroup = list.FirstOrDefault(t => t.CallingAE == association.CallingAE); + var unionAEList = aeList.Union(list.Select(t => t.CallingAE)).ToList(); + var calledAEList = option.CalledAEList; - if (!calledAEList.Contains(association.CalledAE)) + if (!calledAEList.Contains(association.CalledAE) || !unionAEList.Any(t => t == association.CallingAE)) { - Log.Logger.Warning($"拒绝CalledAE:{association.CalledAE}的连接"); + Log.Logger.Warning($"拒绝CalledAE:{association.CalledAE} CallingAE:{association.CallingAE}连接"); return SendAssociationRejectAsync( DicomRejectResult.Permanent, @@ -332,7 +338,7 @@ namespace IRaCIS.Core.SCP.Service #region 1帧拆成多个固定大小的,方便移动端浏览 // 回到开头,读取 dicom - ms.Position = 0; + ms.Position = 0; var dicomFile = DicomFile.Open(ms); var pixelData = DicomPixelData.Create(dicomFile.Dataset); diff --git a/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs b/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs index 9246de335..bb05a5d8a 100644 --- a/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs +++ b/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs @@ -261,6 +261,8 @@ namespace IRaCIS.Application.Contracts public class UserHospitalGroupInfoWithName : UserHospitalGroupInfo { public string Name { get; set; } + + public string Code { get; set; } } public class UserHospitalGroupInfo diff --git a/IRaCIS.Core.Application/Service/Management/_MapConfig.cs b/IRaCIS.Core.Application/Service/Management/_MapConfig.cs index eabc93639..024876d0d 100644 --- a/IRaCIS.Core.Application/Service/Management/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Management/_MapConfig.cs @@ -74,7 +74,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.UserType, u => u.MapFrom(t => t.UserTypeName)); CreateMap() - .ForMember(d => d.HospitalGroupList, u => u.MapFrom(s => s.IdentityUserHospitalGroupList.Select(t => new UserHospitalGroupInfoWithName() { HospitalGroupId = t.HospitalGroupId, IsDisabled = t.IsDisabled, Name = t.HospitalGroup.Name }))); + .ForMember(d => d.HospitalGroupList, u => u.MapFrom(s => s.IdentityUserHospitalGroupList.Select(t => new UserHospitalGroupInfoWithName() { HospitalGroupId = t.HospitalGroupId, IsDisabled = t.IsDisabled, Name = t.HospitalGroup.Name,Code=t.HospitalGroup.Code }))); CreateMap() From aafc1cd064fed03fa4be649da913e13cf39dfab6 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 8 Sep 2025 15:26:08 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=BD=93=E5=89=8D=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=BE=97=E8=AF=BE=E9=A2=98=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs | 2 +- IRaCIS.Core.Application/Service/Management/_MapConfig.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs b/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs index bb05a5d8a..c9412e436 100644 --- a/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs +++ b/IRaCIS.Core.Application/Service/Management/DTO/UserModel.cs @@ -262,7 +262,7 @@ namespace IRaCIS.Application.Contracts { public string Name { get; set; } - public string Code { get; set; } + public string CallingAE { get; set; } = string.Empty; } public class UserHospitalGroupInfo diff --git a/IRaCIS.Core.Application/Service/Management/_MapConfig.cs b/IRaCIS.Core.Application/Service/Management/_MapConfig.cs index 024876d0d..ccc84333a 100644 --- a/IRaCIS.Core.Application/Service/Management/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Management/_MapConfig.cs @@ -74,7 +74,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.UserType, u => u.MapFrom(t => t.UserTypeName)); CreateMap() - .ForMember(d => d.HospitalGroupList, u => u.MapFrom(s => s.IdentityUserHospitalGroupList.Select(t => new UserHospitalGroupInfoWithName() { HospitalGroupId = t.HospitalGroupId, IsDisabled = t.IsDisabled, Name = t.HospitalGroup.Name,Code=t.HospitalGroup.Code }))); + .ForMember(d => d.HospitalGroupList, u => u.MapFrom(s => s.IdentityUserHospitalGroupList.Select(t => new UserHospitalGroupInfoWithName() { HospitalGroupId = t.HospitalGroupId, IsDisabled = t.IsDisabled, Name = t.HospitalGroup.Name, CallingAE = t.HospitalGroup.CallingAE }))); CreateMap() From 79d39125ff161d4f6fba7d407aa52e33166a55eb Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 8 Sep 2025 15:35:07 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=88=96=E8=80=85=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Common/CommonDocumentService.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/Service/Common/CommonDocumentService.cs b/IRaCIS.Core.Application/Service/Common/CommonDocumentService.cs index 5ea3f87dc..b10058954 100644 --- a/IRaCIS.Core.Application/Service/Common/CommonDocumentService.cs +++ b/IRaCIS.Core.Application/Service/Common/CommonDocumentService.cs @@ -16,10 +16,20 @@ namespace IRaCIS.Core.Application.Service /// 系统模板文档配置表 /// [ApiExplorerSettings(GroupName = "Common")] - public class CommonDocumentService(IRepository _commonDocumentRepository, + public class CommonDocumentService(IRepository _commonDocumentRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService, ICommonDocumentService { + public async Task GetCommonDocument(string code) + { + var first = await _commonDocumentRepository.Where(t => t.Code == code) + .ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, userId = _userInfo.UserRoleId }) + .FirstNotNullAsync(); + + + return first; + } + [HttpPost] public async Task> GetCommonDocumentList(CommonDocumentQuery queryCommonDocument) { From 076d99c6ba9d7d69aaf6f448ce37b1faf384b756 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 8 Sep 2025 15:38:30 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E8=BF=94=E5=9B=9E=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Common/CommonDocumentService.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Common/CommonDocumentService.cs b/IRaCIS.Core.Application/Service/Common/CommonDocumentService.cs index b10058954..2942a21cb 100644 --- a/IRaCIS.Core.Application/Service/Common/CommonDocumentService.cs +++ b/IRaCIS.Core.Application/Service/Common/CommonDocumentService.cs @@ -20,13 +20,13 @@ namespace IRaCIS.Core.Application.Service IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService, ICommonDocumentService { - public async Task GetCommonDocument(string code) + + [HttpGet] + public async Task GetCommonDocument(string code) { var first = await _commonDocumentRepository.Where(t => t.Code == code) - .ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, userId = _userInfo.UserRoleId }) .FirstNotNullAsync(); - return first; }