diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/controller/ScBreedPlanGenerateController.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/controller/ScBreedPlanGenerateController.java index 91dbb4d..e060ede 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/controller/ScBreedPlanGenerateController.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/controller/ScBreedPlanGenerateController.java @@ -94,6 +94,12 @@ public class ScBreedPlanGenerateController extends BaseController : obj instanceof Long ? (Long) obj : Long.valueOf(obj.toString())) .collect(Collectors.toList()); + // eweIds 和 ramIds 均为空时,直接导出只含表头的空白模板,不查数据库(避免 IN () 语法错误) + if (eweIds.isEmpty() && ramIds.isEmpty()) { + scBreedPlanGenerateService.exportEmptyPairTemplate(response); + return; + } + scBreedPlanGenerateService.exportSelectedPairs(response, eweIds, ramIds); } catch (Exception e) { logger.error("导出配对表失败", e); diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/IScBreedPlanGenerateService.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/IScBreedPlanGenerateService.java index 0509b50..4c9d7e8 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/IScBreedPlanGenerateService.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/IScBreedPlanGenerateService.java @@ -140,4 +140,6 @@ public interface IScBreedPlanGenerateService * @return 耳号列表 */ public List searchEarNumbers(String query); + + void exportEmptyPairTemplate(HttpServletResponse response); } \ No newline at end of file diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/impl/ScBreedPlanGenerateServiceImpl.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/impl/ScBreedPlanGenerateServiceImpl.java index 14d1849..8de39c2 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/impl/ScBreedPlanGenerateServiceImpl.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/impl/ScBreedPlanGenerateServiceImpl.java @@ -1,10 +1,6 @@ package com.zhyc.module.produce.breed.service.impl; -import java.util.List; -import java.util.Map; -import java.util.HashMap; -import java.util.ArrayList; -import java.util.Date; +import java.util.*; import java.text.SimpleDateFormat; import java.io.IOException; import java.io.InputStream; @@ -83,6 +79,11 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi return scBreedPlanGenerateMapper.selectEligibleRam(sheepFile); } + public void exportEmptyPairTemplate(HttpServletResponse response) { + // 和 exportSelectedPairs 传空 List 一样的逻辑, + // 只写表头行,不写数据行 + exportSelectedPairs(response, Collections.emptyList(), Collections.emptyList()); + } /** * 导出已选母羊公羊配对表 * 按轮询方式将母羊分配给公羊,导出Excel,两列:母羊耳号、公羊耳号 @@ -95,19 +96,23 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi public void exportSelectedPairs(HttpServletResponse response, List eweIds, List ramIds) { try { - // 查询母羊耳号(gender=1) - List> eweList = scBreedPlanGenerateMapper.selectEarNumbersByIds(eweIds, 1); - // 查询公羊耳号(gender=2) - List> ramList = scBreedPlanGenerateMapper.selectEarNumbersByIds(ramIds, 2); - // 建立ID->耳号 的快速查找 + // ✅ 修复代码:检查后再查询 Map eweEarMap = new HashMap<>(); - for (Map e : eweList) { - eweEarMap.put(Long.valueOf(e.get("id").toString()), e.get("manage_tags").toString()); - } Map ramEarMap = new HashMap<>(); - for (Map r : ramList) { - ramEarMap.put(Long.valueOf(r.get("id").toString()), r.get("manage_tags").toString()); + + if (!eweIds.isEmpty()) { + List> eweList = scBreedPlanGenerateMapper.selectEarNumbersByIds(eweIds, 1); + for (Map e : eweList) { + eweEarMap.put(Long.valueOf(e.get("id").toString()), e.get("manage_tags").toString()); + } + } + + if (!ramIds.isEmpty()) { + List> ramList = scBreedPlanGenerateMapper.selectEarNumbersByIds(ramIds, 2); + for (Map r : ramList) { + ramEarMap.put(Long.valueOf(r.get("id").toString()), r.get("manage_tags").toString()); + } } // 母羊列、公羊列各自独立写入,行数取两者最大值,不做轮询配对 @@ -169,10 +174,10 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi sheet.setColumnWidth(1, 5000); // 响应头 - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setCharacterEncoding("utf-8"); - String fileName = java.net.URLEncoder.encode("配种配对表", "UTF-8").replaceAll("\\+", "%20"); - response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + response.setCharacterEncoding("UTF-8"); + String fileName = "配种配对表.xlsx"; + response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); workbook.write(response.getOutputStream()); workbook.close(); @@ -681,10 +686,10 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi if (sheet.getColumnWidth(i) < 2000) sheet.setColumnWidth(i, 2000); } - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - response.setCharacterEncoding("utf-8"); - String fileName = java.net.URLEncoder.encode(planGenerate.getPlanName() + "_配种计划详情", "UTF-8").replaceAll("\\+", "%20"); - response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + response.setCharacterEncoding("UTF-8"); + String fileName = planGenerate.getPlanName() + "_配种计划详情.xlsx"; + response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); workbook.write(response.getOutputStream()); workbook.close(); diff --git a/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedPlanGenerateMapper.xml b/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedPlanGenerateMapper.xml index e5d52e6..d81c79f 100644 --- a/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedPlanGenerateMapper.xml +++ b/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedPlanGenerateMapper.xml @@ -354,10 +354,12 @@ FROM bas_sheep WHERE gender = #{gender} AND is_delete = 0 - AND id IN - - #{id} - + + AND id IN + + #{id} + +