diff --git a/zhyc-module/src/main/java/com/zhyc/module/base/controller/SheepFileController.java b/zhyc-module/src/main/java/com/zhyc/module/base/controller/SheepFileController.java index 24a0880..f718ba3 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/base/controller/SheepFileController.java +++ b/zhyc-module/src/main/java/com/zhyc/module/base/controller/SheepFileController.java @@ -209,62 +209,34 @@ public class SheepFileController extends BaseController @PostMapping("/export") public void export(HttpServletResponse response, HttpServletRequest request) { - // 构建查询条件对象 SheepFile sheepFile = new SheepFile(); Map customParams = new HashMap<>(); - - // 解析所有请求参数 Map parameterMap = request.getParameterMap(); + // 1. 更直接地获取前端参数 + String exportIdsStr = request.getParameter("exportIds"); + String visibleColumnsStr = request.getParameter("visibleColumns"); + + // 2. 遍历其他条件 for (Map.Entry entry : parameterMap.entrySet()) { String key = entry.getKey(); String[] values = entry.getValue(); if (values != null && values.length > 0 && StringUtils.isNotBlank(values[0])) { String value = values[0]; - - // 使用若依框架的工具方法处理参数 switch (key) { - // --- 单值参数 --- - case "bsManageTags": - sheepFile.setBsManageTags(convertToString(value)); - break; - case "electronicTags": - sheepFile.setElectronicTags(convertToString(value)); - break; - case "drRanch": - sheepFile.setDrRanch(convertToString(value)); - break; - case "variety": - sheepFile.setVariety(convertToString(value)); - break; - case "name": - sheepFile.setName(convertToString(value)); - break; - case "gender": - sheepFile.setGender(Convert.toLong(value)); - break; - case "statusId": - sheepFile.setStatusId(Convert.toLong(value)); - break; - case "breed": - sheepFile.setBreed(convertToString(value)); - break; - - // --- 新增:处理多选数组参数 --- - // request.getParameterMap 中的值本身就是 String[],可以直接使用 - case "allEarNumbers": - sheepFile.setAllEarNumbers(new ArrayList<>(Arrays.asList(values))); - break; - case "allEleEarNumbers": - sheepFile.setAllEleEarNumbers(new ArrayList<>(Arrays.asList(values))); - break; - case "allBreedingStatus": - sheepFile.setAllBreedingStatus(new ArrayList<>(Arrays.asList(values))); - break; - case "allSheepTypes": - sheepFile.setAllSheepTypes(new ArrayList<>(Arrays.asList(values))); - break; + case "bsManageTags": sheepFile.setBsManageTags(convertToString(value)); break; + case "electronicTags": sheepFile.setElectronicTags(convertToString(value)); break; + case "drRanch": sheepFile.setDrRanch(convertToString(value)); break; + case "variety": sheepFile.setVariety(convertToString(value)); break; + case "name": sheepFile.setName(convertToString(value)); break; + case "gender": sheepFile.setGender(Convert.toLong(value)); break; + case "statusId": sheepFile.setStatusId(Convert.toLong(value)); break; + case "breed": sheepFile.setBreed(convertToString(value)); break; + case "allEarNumbers": sheepFile.setAllEarNumbers(new ArrayList<>(Arrays.asList(values))); break; + case "allEleEarNumbers": sheepFile.setAllEleEarNumbers(new ArrayList<>(Arrays.asList(values))); break; + case "allBreedingStatus": sheepFile.setAllBreedingStatus(new ArrayList<>(Arrays.asList(values))); break; + case "allSheepTypes": sheepFile.setAllSheepTypes(new ArrayList<>(Arrays.asList(values))); break; case "allGenders": List genderList = new ArrayList<>(); for(String v : values){ @@ -273,24 +245,50 @@ public class SheepFileController extends BaseController } sheepFile.setAllGenders(genderList); break; - - case "pageNum": - case "pageSize": - // 忽略分页参数 - break; + case "pageNum": case "pageSize": case "exportIds": case "visibleColumns": + break; // 忽略这些非数据库实体的字段 default: - // 自定义参数 customParams.put(key, value); break; } } } - // 调用Service获取数据 + // 3. 获取数据并执行行过滤 List list = sheepFileService.selectSheepFileListByCondition(customParams, sheepFile); + if (StringUtils.isNotBlank(exportIdsStr)) { + List exportIdList = Arrays.asList(exportIdsStr.split(",")); + list = list.stream() + .filter(item -> exportIdList.contains(String.valueOf(item.getId()))) + .collect(java.util.stream.Collectors.toList()); + } - // 使用若依框架的Excel工具类导出 + // 4. 执行列过滤 ExcelUtil util = new ExcelUtil<>(SheepFile.class); + + if (StringUtils.isNotBlank(visibleColumnsStr)) { + // 清理字符串可能的空格并转为List + List visibleColumns = Arrays.asList(visibleColumnsStr.split("\\s*,\\s*")); + List colsToHide = new ArrayList<>(); + + Class clazz = SheepFile.class; + while (clazz != null) { + for (java.lang.reflect.Field field : clazz.getDeclaredFields()) { + if (field.isAnnotationPresent(com.zhyc.common.annotation.Excel.class)) { + if (!visibleColumns.contains(field.getName())) { + colsToHide.add(field.getName()); + } + } + } + clazz = clazz.getSuperclass(); + } + + // 【核心修复】一次性把所有的字段数组传进去,规避若依底层循环覆盖的 Bug + if (!colsToHide.isEmpty()) { + util.hideColumn(colsToHide.toArray(new String[0])); + } + } + util.exportExcel(response, list, "羊只档案数据"); }