配种计划最终完善,产羔页面bug修复

This commit is contained in:
zyk
2026-02-01 09:58:49 +08:00
parent 219ac30e28
commit 1736b51fea
9 changed files with 130 additions and 36 deletions

View File

@@ -9,14 +9,7 @@ import com.zhyc.module.produce.breed.domain.ScBreedPlanGenerate;
import com.zhyc.module.produce.breed.service.IScBreedPlanGenerateService; import com.zhyc.module.produce.breed.service.IScBreedPlanGenerateService;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.zhyc.common.annotation.Log; import com.zhyc.common.annotation.Log;
import com.zhyc.common.core.controller.BaseController; import com.zhyc.common.core.controller.BaseController;
import com.zhyc.common.core.domain.AjaxResult; import com.zhyc.common.core.domain.AjaxResult;
@@ -54,9 +47,9 @@ public class ScBreedPlanGenerateController extends BaseController
*/ */
@PreAuthorize("@ss.hasPermi('mating_plan:generate:selectEwe')") @PreAuthorize("@ss.hasPermi('mating_plan:generate:selectEwe')")
@GetMapping("/selectEwe") @GetMapping("/selectEwe")
public AjaxResult selectEligibleEwe() public AjaxResult selectEligibleEwe(@RequestParam(value = "manageTags", required = false) String manageTags)
{ {
List<Map<String, Object>> eligibleEwe = scBreedPlanGenerateService.selectEligibleEwe(); List<Map<String, Object>> eligibleEwe = scBreedPlanGenerateService.selectEligibleEwe(manageTags);
return success(eligibleEwe); return success(eligibleEwe);
} }
@@ -65,9 +58,9 @@ public class ScBreedPlanGenerateController extends BaseController
*/ */
@PreAuthorize("@ss.hasPermi('mating_plan:generate:selectRam')") @PreAuthorize("@ss.hasPermi('mating_plan:generate:selectRam')")
@GetMapping("/selectRam") @GetMapping("/selectRam")
public AjaxResult selectEligibleRam() public AjaxResult selectEligibleRam(@RequestParam(value = "manageTags", required = false) String manageTags)
{ {
List<Map<String, Object>> eligibleRam = scBreedPlanGenerateService.selectEligibleRam(); List<Map<String, Object>> eligibleRam = scBreedPlanGenerateService.selectEligibleRam(manageTags);
return success(eligibleRam); return success(eligibleRam);
} }
@@ -249,4 +242,19 @@ public class ScBreedPlanGenerateController extends BaseController
{ {
return toAjax(scBreedPlanGenerateService.deleteScBreedPlanGenerateByIds(ids)); return toAjax(scBreedPlanGenerateService.deleteScBreedPlanGenerateByIds(ids));
} }
/**
* 模糊查询母羊耳号列表
*/
@PreAuthorize("@ss.hasPermi('mating_plan:generate:query')") // 根据实际权限修改
@GetMapping("/search_ear_numbers")
public AjaxResult searchEarNumbers(@RequestParam("query") String query) {
try {
List<String> earNumbers = scBreedPlanGenerateService.searchEarNumbers(query);
return success(earNumbers);
} catch (Exception e) {
logger.error("搜索耳号异常", e);
return error("搜索耳号失败:" + e.getMessage());
}
}
} }

View File

@@ -1,6 +1,8 @@
package com.zhyc.module.produce.breed.domain; package com.zhyc.module.produce.breed.domain;
import java.util.Date; import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@@ -65,4 +67,15 @@ public class ScBreedPlanGenerate extends BaseEntity
/** 审批意见 */ /** 审批意见 */
private String approveRemark; private String approveRemark;
/** 全部羊耳号列表(用于多耳号查询) */
private List<String> allEarNumbers;
public List<String> getAllEarNumbers() {
return allEarNumbers;
}
public void setAllEarNumbers(List<String> allEarNumbers) {
this.allEarNumbers = allEarNumbers;
}
} }

View File

@@ -141,7 +141,7 @@ public class ScLambDetail extends BaseEntity
/** 是否留养0-否1-是 */ /** 是否留养0-否1-是 */
@Excel(name = "是否留养") @Excel(name = "是否留养")
private Integer isRetained; private Boolean isRetained;
/** 家系 */ /** 家系 */
@Excel(name = "家系") @Excel(name = "家系")

View File

@@ -128,4 +128,12 @@ public interface ScBreedPlanGenerateMapper
* @return 结果 * @return 结果
*/ */
public int deleteTempBreedPlanByPlanId(Long planGenerateId); public int deleteTempBreedPlanByPlanId(Long planGenerateId);
/**
* 模糊查询母羊耳号列表
*
* @param query 查询关键字
* @return 耳号列表
*/
List<String> searchEarNumbers(@Param("query") String query);
} }

View File

@@ -4,6 +4,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.zhyc.module.produce.breed.domain.ScBreedPlanGenerate; import com.zhyc.module.produce.breed.domain.ScBreedPlanGenerate;
import org.springframework.web.bind.annotation.RequestParam;
/** /**
* 配种计划生成Service接口 * 配种计划生成Service接口
@@ -34,14 +35,14 @@ public interface IScBreedPlanGenerateService
* *
* @return 符合条件的母羊列表 * @return 符合条件的母羊列表
*/ */
public List<Map<String, Object>> selectEligibleEwe(); public List<Map<String, Object>> selectEligibleEwe(@RequestParam(value = "manageTags", required = false) String manageTags);
/** /**
* 筛选符合条件的公羊 * 筛选符合条件的公羊
* *
* @return 符合条件的公羊列表 * @return 符合条件的公羊列表
*/ */
public List<Map<String, Object>> selectEligibleRam(); public List<Map<String, Object>> selectEligibleRam(@RequestParam(value = "manageTags", required = false) String manageTags);
/** /**
* 自动生成配种计划 * 自动生成配种计划
@@ -120,4 +121,12 @@ public interface IScBreedPlanGenerateService
* @return 结果 * @return 结果
*/ */
public int deleteScBreedPlanGenerateById(Long id); public int deleteScBreedPlanGenerateById(Long id);
/**
* 模糊查询母羊耳号列表
*
* @param query 查询关键字
* @return 耳号列表
*/
public List<String> searchEarNumbers(String query);
} }

View File

@@ -119,4 +119,6 @@ public interface IScBreedRecordService
* @return 配种记录集合 * @return 配种记录集合
*/ */
public List<ScBreedRecord> getBreedRecordsByTimeRange(Long sheepId, String startDate, String endDate); public List<ScBreedRecord> getBreedRecordsByTimeRange(Long sheepId, String startDate, String endDate);
ScBreedRecord getAutomaticBreedMatch(String manageTags);
} }

View File

@@ -21,6 +21,7 @@ import org.springframework.util.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.bind.annotation.RequestParam;
/** /**
* 配种计划生成Service业务层处理 * 配种计划生成Service业务层处理
@@ -67,7 +68,7 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi
* @return 符合条件的母羊列表 * @return 符合条件的母羊列表
*/ */
@Override @Override
public List<Map<String, Object>> selectEligibleEwe() public List<Map<String, Object>> selectEligibleEwe(@RequestParam(value = "manageTags", required = false) String manageTags)
{ {
return scBreedPlanGenerateMapper.selectEligibleEwe(); return scBreedPlanGenerateMapper.selectEligibleEwe();
} }
@@ -78,7 +79,7 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi
* @return 符合条件的公羊列表 * @return 符合条件的公羊列表
*/ */
@Override @Override
public List<Map<String, Object>> selectEligibleRam() public List<Map<String, Object>> selectEligibleRam(@RequestParam(value = "manageTags", required = false) String manageTags)
{ {
return scBreedPlanGenerateMapper.selectEligibleRam(); return scBreedPlanGenerateMapper.selectEligibleRam();
} }
@@ -102,7 +103,16 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi
// 自动生成计划名称:日期+计划类型 // 自动生成计划名称:日期+计划类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(new Date()); String dateStr = sdf.format(new Date());
String planTypeName = (planType == 1) ? "同期发情配种计划" : "本交配种计划"; String planTypeName = "";
switch (planType) {
case 1: planTypeName = "供体母羊配种计划"; break;
case 2: planTypeName = "同期发情人工授精计划"; break;
case 3: planTypeName = "本交配种计划"; break;
case 4: planTypeName = "自然发情人工授精计划"; break;
default: planTypeName = "未知配种计划"; break;
}
planName = dateStr + planTypeName; planName = dateStr + planTypeName;
planGenerate.setPlanName(planName); planGenerate.setPlanName(planName);
@@ -137,21 +147,15 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi
for (int i = 0; i < eweIds.size(); i++) { for (int i = 0; i < eweIds.size(); i++) {
ScBreedPlan breedPlan = new ScBreedPlan(); ScBreedPlan breedPlan = new ScBreedPlan();
// 存储公羊ID而不是字符串
breedPlan.setRamId(ramIds.get(ramIndex).toString()); breedPlan.setRamId(ramIds.get(ramIndex).toString());
breedPlan.setEweId(eweIds.get(i).toString()); breedPlan.setEweId(eweIds.get(i).toString());
// 根据计划类型设置配种类型:同期发情配种计划->同期发情,本交配种计划->本交 // 2. 修改:直接使用 planType 作为 breedType (假设一一对应)
if (planType == 1) { // 1=供体母羊配种, 2=同期发情人工授精, 3=本交, 4=自然发情人工授精
breedPlan.setBreedType(1L); // 同期发情 breedPlan.setBreedType(Long.valueOf(planType));
} else {
breedPlan.setBreedType(2L); // 本交
}
// 插入临时配种计划,关联到生成记录
scBreedPlanGenerateMapper.insertTempBreedPlan(planGenerateId, breedPlan); scBreedPlanGenerateMapper.insertTempBreedPlan(planGenerateId, breedPlan);
// 每个公羊配种指定数量的母羊后,切换到下一个公羊
if ((i + 1) % ewesPerRam == 0 && ramIndex < ramIds.size() - 1) { if ((i + 1) % ewesPerRam == 0 && ramIndex < ramIds.size() - 1) {
ramIndex++; ramIndex++;
} }
@@ -356,10 +360,32 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi
// 空行 // 空行
rowNum++; rowNum++;
String typeName = "";
switch (planGenerate.getPlanType()) {
case 1: typeName = "供体母羊配种计划"; break;
case 2: typeName = "同期发情人工授精计划"; break;
case 3: typeName = "本交配种计划"; break;
case 4: typeName = "自然发情人工授精计划"; break;
default: typeName = "未知"; break;
}
// 基本信息 // 基本信息
Row infoRow1 = sheet.createRow(rowNum++); Row infoRow1 = sheet.createRow(rowNum++);
infoRow1.createCell(0).setCellValue("计划类型:"); infoRow1.createCell(0).setCellValue("计划类型:");
infoRow1.createCell(1).setCellValue(planGenerate.getPlanType() == 1 ? "同期发情配种计划" : "本交配种计划"); String planTypeNameStr;
Integer type = planGenerate.getPlanType();
if (type != null) {
switch (type) {
case 1: planTypeNameStr = "供体母羊配种计划"; break;
case 2: planTypeNameStr = "同期发情人工授精计划"; break;
case 3: planTypeNameStr = "本交配种计划"; break;
case 4: planTypeNameStr = "自然发情人工授精计划"; break;
default: planTypeNameStr = "未知类型";
}
} else {
planTypeNameStr = "";
}
infoRow1.createCell(1).setCellValue(planTypeNameStr);
infoRow1.createCell(3).setCellValue("计划日期:"); infoRow1.createCell(3).setCellValue("计划日期:");
infoRow1.createCell(4).setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(planGenerate.getPlanDate())); infoRow1.createCell(4).setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(planGenerate.getPlanDate()));
@@ -447,14 +473,23 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi
dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_current_weight")); dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_current_weight"));
// 配种类型 // 配种类型
Object breedType = detail.get("breed_type"); Object breedTypeObj = detail.get("breed_type");
String breedTypeName = "未知类型"; String breedTypeName = "未知类型";
if (breedType != null) { if (breedTypeObj != null) {
int typeValue = Integer.parseInt(breedType.toString()); try {
breedTypeName = typeValue == 1 ? "同期发情" : (typeValue == 2 ? "本交" : "未知类型"); int typeValue = Integer.parseInt(breedTypeObj.toString());
switch (typeValue) {
case 1: breedTypeName = "供体母羊配种"; break;
case 2: breedTypeName = "同期发情人工授精"; break;
case 3: breedTypeName = "本交"; break;
case 4: breedTypeName = "自然发情人工授精"; break;
default: breedTypeName = "未知类型";
}
} catch (NumberFormatException e) {
// ignore
}
} }
dataRow.createCell(colNum++).setCellValue(breedTypeName); dataRow.createCell(colNum++).setCellValue(breedTypeName);
// 应用数据样式 // 应用数据样式
for (int j = 0; j < headers.length; j++) { for (int j = 0; j < headers.length; j++) {
if (dataRow.getCell(j) != null) { if (dataRow.getCell(j) != null) {
@@ -537,4 +572,8 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi
scBreedPlanGenerateMapper.deleteTempBreedPlanByPlanId(id); scBreedPlanGenerateMapper.deleteTempBreedPlanByPlanId(id);
return scBreedPlanGenerateMapper.deleteScBreedPlanGenerateById(id); return scBreedPlanGenerateMapper.deleteScBreedPlanGenerateById(id);
} }
@Override
public List<String> searchEarNumbers(String query) {
return scBreedPlanGenerateMapper.searchEarNumbers(query);
}
} }

View File

@@ -109,11 +109,11 @@ public class ScLambingRecordServiceImpl implements IScLambingRecordService {
// 设置默认值 // 设置默认值
if (lambDetail.getIsRetained() == null) { if (lambDetail.getIsRetained() == null) {
lambDetail.setIsRetained(0); // 默认为0 lambDetail.setIsRetained(false); // 默认为0
} }
// 验证是否留养值的有效性0-否1-是 // 验证是否留养值的有效性0-否1-是
if (lambDetail.getIsRetained() != 0 && lambDetail.getIsRetained() != 1) { if (lambDetail.getIsRetained() != false && lambDetail.getIsRetained() != true) {
throw new RuntimeException("是否留养值无效请使用0或1"); throw new RuntimeException("是否留养值无效请使用0或1");
} }

View File

@@ -77,6 +77,9 @@
left join da_sheepfold dsf on bs.sheepfold_id = dsf.id left join da_sheepfold dsf on bs.sheepfold_id = dsf.id
where bs.gender = 1 where bs.gender = 1
and bs.is_delete = 0 and bs.is_delete = 0
<if test="manageTags != null and manageTags != ''">
and bs.manage_tags like concat('%', #{manageTags}, '%')
</if>
and (bs.status_id = 1 or bs.status_id is null) and (bs.status_id = 1 or bs.status_id is null)
and ( and (
(bst.name in ('青年羊', '超龄羊') and ( (bst.name in ('青年羊', '超龄羊') and (
@@ -109,6 +112,9 @@
left join bas_breed_status bbs on bs.breed_status_id = bbs.id left join bas_breed_status bbs on bs.breed_status_id = bbs.id
where bs.gender = 2 where bs.gender = 2
and bs.is_delete = 0 and bs.is_delete = 0
<if test="manageTags != null and manageTags != ''">
and bs.manage_tags like concat('%', #{manageTags}, '%')
</if>
and bs.status_id = 1 and bs.status_id = 1
and ( and (
(bst.name in ('青年羊', '超龄羊') and ( (bst.name in ('青年羊', '超龄羊') and (
@@ -310,4 +316,13 @@
<delete id="deleteTempBreedPlanByPlanId" parameterType="Long"> <delete id="deleteTempBreedPlanByPlanId" parameterType="Long">
delete from sc_breed_plan_temp where plan_generate_id = #{planGenerateId} delete from sc_breed_plan_temp where plan_generate_id = #{planGenerateId}
</delete> </delete>
<!-- 模糊查询耳号列表 -->
<select id="searchEarNumbers" resultType="java.lang.String">
SELECT DISTINCT sf.bs_manage_tags
FROM sheep_file sf
WHERE sf.bs_manage_tags LIKE CONCAT(#{query}, '%')
AND sf.is_delete = 0
ORDER BY sf.bs_manage_tags
LIMIT 50
</select>
</mapper> </mapper>