diff --git a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs index 4372fc35f..8f8346527 100644 --- a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs +++ b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs @@ -199,29 +199,45 @@ public static class ExcelExportHelper public class DynamicColumnConfig { - //标题动态修改的行 从0 开始算 + /// + /// 增加动态列开始索引 从0 开始算 + /// public int AutoColumnStartIndex { get; set; } - //动态列开始的index 从0开始 - public int AutoColumnRowIndex { get; set; } + /// + /// 动态列开始的行index 从0开始 + /// + public int AutoColumnTitleRowIndex { get; set; } - //动态列后面还有几列数据 - public int BackMoveCount { get; set; } - //动态的列名 - public List ColumnNameList { get; set; } + public int TempalteLastColumnIndex { get; set; } - //动态翻译的字典名 - public List TranslateDicNameList { get; set; } + /// + /// 动态的列名 + /// + public List ColumnNameList { get; set; } = new List(); - //动态取数据的集合名 + /// + /// 动态翻译的字典名 + /// + public List TranslateDicNameList { get; set; } = new List(); + + /// + /// 动态取数据的集合名 + /// public string DynamicListName { get; set; } - //动态数据翻译的取字典的属性名 + /// + /// 动态数据翻译的取字典的属性名 + /// public string DynamicItemDicName { get; set; } - //取值的属性名 + /// + /// 取值的属性名 + /// public string DynamicItemValueName { get; set; } + + public List RemoveColunmIndexList { get; set; } = new List(); } @@ -355,42 +371,92 @@ public static class ExcelExportHelper { var sheet = workbook.GetSheetAt(0); - var row = sheet.GetRow(dynamicColumnConfig.AutoColumnRowIndex); - var templateRow = sheet.GetRow(dynamicColumnConfig.AutoColumnRowIndex + 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 colunmAddIndex = dynamicColumnConfig.AutoColumnStartIndex + dynamicColumnConfig.BackMoveCount; + //原始表 最终索引 + 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 = 0; i < needAddCount; i++) + for (int i = originTotalEndIndex; i < originTotalEndIndex + needAddCount; i++) { - row.CreateCell(i + colunmAddIndex); + titelRow.CreateCell(i + 1); } //移动Title 和下面的模板标识 - for (int i = colunmAddIndex + needAddCount; i < colunmAddIndex; i--) - { - row.GetCell(i).SetCellValue(row.GetCell(i - needAddCount).StringCellValue); + var gap = totalColunmEndIndex - originRemoveEndIndex; - templateRow.GetCell(i).SetCellValue(templateRow.GetCell(i - needAddCount).StringCellValue); + 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); } + + + //设置动态Tilte - for (int i = dynamicColumnConfig.AutoColumnStartIndex; i < dynamicColumnConfig.AutoColumnStartIndex + needAddCount; i++) + for (int i = dynamicColunmStartIndex; i < dynamicColunmStartIndex + needAddCount; i++) { - var name = dynamicColumnConfig.ColumnNameList[i - dynamicColumnConfig.AutoColumnStartIndex]; - row.GetCell(i).SetCellValue(name); + var name = dynamicColumnConfig.ColumnNameList[i - dynamicColunmStartIndex]; + + titelRow.GetCell(i).SetCellValue(name); } } + using (var memoryStream2 = new MemoryStream()) + { + workbook.Write(memoryStream2, true); - var memoryStream2 = new MemoryStream(); - workbook.Write(memoryStream2, true); + memoryStream2.Seek(0, SeekOrigin.Begin); + + templateStream = memoryStream2; + } - memoryStream2.Seek(0, SeekOrigin.Begin); - templateStream = memoryStream2; } #endregion @@ -408,7 +474,6 @@ public static class ExcelExportHelper memoryStream.Seek(0, SeekOrigin.Begin); - if (dynamicColumnConfig != null) { var dynamicTranslateDataList = await _dictionaryService.GetBasicDataSelect(dynamicColumnConfig.TranslateDicNameList.ToArray()); @@ -424,19 +489,21 @@ public static class ExcelExportHelper var index = list.IndexOf(itemResult); //从第四行开始处理动态列 - var row = sheet.GetRow(index + dynamicColumnConfig.AutoColumnRowIndex + 1); + var row = sheet.GetRow(index + dynamicColumnConfig.AutoColumnTitleRowIndex + 1); - var itemDic = itemResult.ConvertToDictionary(); + var itemDic = itemResult.ToDictionary(); var itemList = itemDic[dynamicColumnConfig.DynamicListName] as IList; - foreach (var item in itemList) + foreach (var itemObj in itemList) { - var writeIndex = itemList.IndexOf(item) + dynamicColumnConfig.AutoColumnStartIndex; + var writeIndex = itemList.IndexOf(itemObj) + dynamicColumnConfig.AutoColumnStartIndex; + var iteObjDic = itemObj.ToDictionary(); + + var itemDicName = iteObjDic[dynamicColumnConfig.DynamicItemDicName].ToString(); + var itemValue = iteObjDic[dynamicColumnConfig.DynamicItemValueName].ToString(); - var itemDicName = itemDic[dynamicColumnConfig.DynamicItemDicName].ToString(); - var itemValue = itemDic[dynamicColumnConfig.DynamicItemValueName].ToString(); if (itemDicName.IsNotNullOrEmpty()) { @@ -458,6 +525,7 @@ public static class ExcelExportHelper memoryStream2.Seek(0, SeekOrigin.Begin); memoryStream = memoryStream2; + } diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 9d2723f14..05029cdb8 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -57,6 +57,41 @@ + + + 增加动态列开始索引 从0 开始算 + + + + + 动态列开始的行index 从0开始 + + + + + 动态的列名 + + + + + 动态翻译的字典名 + + + + + 动态取数据的集合名 + + + + + 动态数据翻译的取字典的属性名 + + + + + 取值的属性名 + + 导出文件模板 diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index 0c3353e86..b3fe8dc23 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -2077,12 +2077,14 @@ namespace IRaCIS.Core.Application.Service.Common 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() { AutoColumnRowIndex = 2, AutoColumnStartIndex = 6, BackMoveCount=3, - DynamicItemDicName= "QuestionName", - DynamicItemValueName= "QuestionValue", - DynamicListName= "JudgeQuestionAnswerList", - ColumnNameList = list.FirstOrDefault()?.JudgeQuestionAnswerList.Select(t => t.QuestionName).ToList(), - TranslateDicNameList= list.FirstOrDefault()?.JudgeQuestionAnswerList.Select(t => t.TranslateDicName).ToList() + var dynamicColumnConfig = new DynamicColumnConfig() { AutoColumnTitleRowIndex = 2, AutoColumnStartIndex = 6, + TempalteLastColumnIndex = 8, + DynamicItemDicName = "TranslateDicName", + DynamicItemValueName = "QuestionValue", + DynamicListName = "JudgeQuestionAnswerList", + RemoveColunmIndexList = new List() { 1, 7 }, + ColumnNameList = list.FirstOrDefault()?.JudgeQuestionAnswerList.Select(t => t.QuestionName).ToList() ?? new List(), + TranslateDicNameList = list.FirstOrDefault()?.JudgeQuestionAnswerList.Select(t => t.TranslateDicName).ToList() ?? new List() }; var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.CommonReading_Export, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig); @@ -2196,7 +2198,7 @@ namespace IRaCIS.Core.Application.Service.Common 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() { AutoColumnRowIndex = 2, AutoColumnStartIndex = 6, ColumnNameList = list.FirstOrDefault()?.JudgeQuestionAnswerList.Select(t => t.QuestionName).ToList() }; + var dynamicColumnConfig = new DynamicColumnConfig() { AutoColumnTitleRowIndex = 2, AutoColumnStartIndex = 6, ColumnNameList = list.FirstOrDefault()?.JudgeQuestionAnswerList.Select(t => t.QuestionName).ToList() }; var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.CommonJudgeReadingDetail_Export, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig); @@ -2259,7 +2261,7 @@ namespace IRaCIS.Core.Application.Service.Common 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() { AutoColumnRowIndex = 2, AutoColumnStartIndex = 6, ColumnNameList = list.FirstOrDefault()?.QuestionAnswerList.Select(t => t.QuestionName).ToList() }; + var dynamicColumnConfig = new DynamicColumnConfig() { AutoColumnTitleRowIndex = 2, AutoColumnStartIndex = 6, ColumnNameList = list.FirstOrDefault()?.QuestionAnswerList.Select(t => t.QuestionName).ToList() }; var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.CommonReadingDetail_Export, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig); diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 65c118c37..0431f047b 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -1149,6 +1149,7 @@ namespace IRaCIS.Core.Application.Contracts //在当前访视触发裁判,或者在截止日期小于等于当前访视的阅片期触发裁判 + [DictionaryTranslateAttribute("YesOrNo")] public bool IsTrigerJudge { get; set; } //(如果是访视点裁判,则仅在所选阅片人对应访视 显示;如果是阅片期裁判,则在所选阅片人 阅片期内的所有访视 显示此原因) diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/ObjectExtension.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/ObjectExtension.cs index 9e82dfcbd..0e08f7634 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/ObjectExtension.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/ObjectExtension.cs @@ -32,12 +32,23 @@ namespace IRaCIS.Core.Infrastructure.Extention return JsonConvert.SerializeObject(obj, new JsonSerializerSettings { DateFormatString = "yyyy-MM-dd HH:mm:ss", ReferenceLoopHandling = ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }); } - // 通过类型参数反序列化 JSON 字符串为指定类型的对象 + /// + /// 通过类型参数反序列化 JSON 字符串为指定类型的对象 + /// + /// + /// + /// public static object JsonStrToObject(this string jsonStr, Type type) { return JsonConvert.DeserializeObject(jsonStr, type); } + + public static Dictionary ToDictionary(this object obj) + { + var json = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { DateFormatString = "yyyy-MM-dd HH:mm:ss", Formatting = Formatting.Indented, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Include }); + return JsonConvert.DeserializeObject>(json); + } /// /// 将对象序列化成稽查需要的Json字符串 /// @@ -64,9 +75,7 @@ namespace IRaCIS.Core.Infrastructure.Extention foreach (PropertyInfo property in properties) { string propertyName = property.Name; - Console.WriteLine(propertyName); object propertyValue = property.GetValue(obj); - Console.WriteLine(propertyName); // 如果属性的类型是枚举,将其值保留为整数 if (property.PropertyType.IsEnum || (Nullable.GetUnderlyingType(property.PropertyType)?.IsEnum == true && propertyValue!=null) ) {