配种计划导出更新

This commit is contained in:
zyk
2026-03-07 12:38:24 +08:00
parent 2a39664c38
commit 4755a327eb
4 changed files with 42 additions and 27 deletions

View File

@@ -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);

View File

@@ -140,4 +140,6 @@ public interface IScBreedPlanGenerateService
* @return 耳号列表
*/
public List<String> searchEarNumbers(String query);
void exportEmptyPairTemplate(HttpServletResponse response);
}

View File

@@ -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<Long> eweIds, List<Long> ramIds)
{
try {
// 查询母羊耳号gender=1
List<Map<String, Object>> eweList = scBreedPlanGenerateMapper.selectEarNumbersByIds(eweIds, 1);
// 查询公羊耳号gender=2
List<Map<String, Object>> ramList = scBreedPlanGenerateMapper.selectEarNumbersByIds(ramIds, 2);
// 建立ID->耳号 的快速查找
// ✅ 修复代码:检查后再查询
Map<Long, String> eweEarMap = new HashMap<>();
for (Map<String, Object> e : eweList) {
eweEarMap.put(Long.valueOf(e.get("id").toString()), e.get("manage_tags").toString());
}
Map<Long, String> ramEarMap = new HashMap<>();
for (Map<String, Object> r : ramList) {
ramEarMap.put(Long.valueOf(r.get("id").toString()), r.get("manage_tags").toString());
if (!eweIds.isEmpty()) {
List<Map<String, Object>> eweList = scBreedPlanGenerateMapper.selectEarNumbersByIds(eweIds, 1);
for (Map<String, Object> e : eweList) {
eweEarMap.put(Long.valueOf(e.get("id").toString()), e.get("manage_tags").toString());
}
}
if (!ramIds.isEmpty()) {
List<Map<String, Object>> ramList = scBreedPlanGenerateMapper.selectEarNumbersByIds(ramIds, 2);
for (Map<String, Object> 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();

View File

@@ -354,10 +354,12 @@
FROM bas_sheep
WHERE gender = #{gender}
AND is_delete = 0
AND id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</select>
<!--