From 8bc26605e03ad4dc98a58b1fcbf3393f7e2e61de Mon Sep 17 00:00:00 2001 From: zyk Date: Tue, 19 Aug 2025 00:18:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E9=85=8D=E7=A7=8D?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E5=92=8C=E9=85=8D=E7=A7=8D=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ScBreedPlanGenerateController.java | 79 ++++- .../controller/ScBreedRecordController.java | 102 +++++- .../produce/breed/domain/ScBreedRecord.java | 45 ++- .../mapper/ScBreedPlanGenerateMapper.java | 24 ++ .../breed/mapper/ScBreedRecordMapper.java | 37 +- .../service/IScBreedPlanGenerateService.java | 28 +- .../breed/service/IScBreedRecordService.java | 28 ++ .../impl/ScBreedPlanGenerateServiceImpl.java | 326 +++++++++++++++++- .../impl/ScBreedRecordServiceImpl.java | 84 +++++ .../breed/ScBreedPlanGenerateMapper.xml | 203 ++++++++--- .../produce/breed/ScBreedRecordMapper.xml | 124 ++++++- 11 files changed, 985 insertions(+), 95 deletions(-) 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 c872868..80861f8 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 @@ -3,6 +3,7 @@ package com.zhyc.module.produce.breed.controller; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; import com.zhyc.module.produce.breed.domain.ScBreedPlanGenerate; import com.zhyc.module.produce.breed.service.IScBreedPlanGenerateService; @@ -21,6 +22,7 @@ import com.zhyc.common.core.controller.BaseController; import com.zhyc.common.core.domain.AjaxResult; import com.zhyc.common.enums.BusinessType; import com.zhyc.common.core.page.TableDataInfo; +import com.zhyc.common.utils.poi.ExcelUtil; /** * 配种计划生成Controller @@ -78,6 +80,12 @@ public class ScBreedPlanGenerateController extends BaseController public AjaxResult autoGenerateBreedPlan(@RequestBody Map params) { try { + // 获取计划类型 + Integer planType = params.get("planType") != null ? (Integer) params.get("planType") : 1; + + // 计划名称由系统自动生成,不再从前端传入 + String planName = null; + // 安全的类型转换 List eweIdsRaw = (List) params.get("eweIds"); List ramIdsRaw = (List) params.get("ramIds"); @@ -110,7 +118,7 @@ public class ScBreedPlanGenerateController extends BaseController }) .collect(Collectors.toList()); - ScBreedPlanGenerate planGenerate = scBreedPlanGenerateService.autoGenerateBreedPlan(eweIds, ramIds); + ScBreedPlanGenerate planGenerate = scBreedPlanGenerateService.autoGenerateBreedPlan(planType, planName, eweIds, ramIds); return success(planGenerate); } catch (Exception e) { logger.error("自动生成配种计划失败", e); @@ -151,14 +159,38 @@ public class ScBreedPlanGenerateController extends BaseController } /** - * 审批配种计划 + * 获取审批配种计划详情 */ @PreAuthorize("@ss.hasPermi('mating_plan:generate:approve')") - @Log(title = "审批配种计划", businessType = BusinessType.UPDATE) - @PutMapping("/approve/{id}") - public AjaxResult approve(@PathVariable Long id) + @GetMapping("/approve/{id}") + public AjaxResult getApproveInfo(@PathVariable Long id) { - return toAjax(scBreedPlanGenerateService.approveBreedPlan(id)); + Map approveDetails = scBreedPlanGenerateService.getApproveBreedPlanDetails(id); + return success(approveDetails); + } + + /** + * 确认审批配种计划 + */ + @PreAuthorize("@ss.hasPermi('mating_plan:generate:approve')") + @Log(title = "确认审批配种计划", businessType = BusinessType.UPDATE) + @PutMapping("/approve/confirm") + public AjaxResult confirmApprove(@RequestBody Map params) + { + try { + Long planId = Long.valueOf(params.get("planId").toString()); + Integer status = Integer.valueOf(params.get("status").toString()); + String approveRemark = params.get("approveRemark") != null ? params.get("approveRemark").toString() : ""; + + @SuppressWarnings("unchecked") + List> planDetails = (List>) params.get("planDetails"); + + int result = scBreedPlanGenerateService.confirmApproveBreedPlan(planId, planDetails, status, approveRemark); + return toAjax(result); + } catch (Exception e) { + logger.error("确认审批配种计划失败", e); + return error("确认审批配种计划失败:" + e.getMessage()); + } } /** @@ -172,6 +204,41 @@ public class ScBreedPlanGenerateController extends BaseController return success(planDetails); } + /** + * 导出配种计划列表 + */ + @PreAuthorize("@ss.hasPermi('mating_plan:generate:export')") + @Log(title = "导出配种计划列表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ScBreedPlanGenerate scBreedPlanGenerate) + { + List list = scBreedPlanGenerateService.selectScBreedPlanGenerateList(scBreedPlanGenerate); + ExcelUtil util = new ExcelUtil(ScBreedPlanGenerate.class); + util.exportExcel(response, list, "配种计划生成数据"); + } + + /** + * 导出配种计划详情 + */ + @PreAuthorize("@ss.hasPermi('mating_plan:generate:export')") + @Log(title = "导出配种计划详情", businessType = BusinessType.EXPORT) + @PostMapping("/export/{id}") + public void exportBreedPlanDetails(HttpServletResponse response, @PathVariable Long id) + { + try { + scBreedPlanGenerateService.exportBreedPlanDetails(response, id); + } catch (Exception e) { + logger.error("导出配种计划详情失败", e); + // 在出错时返回错误信息给前端 + try { + response.setContentType("application/json;charset=utf-8"); + response.getWriter().write("{\"code\":500,\"msg\":\"导出失败:" + e.getMessage() + "\"}"); + } catch (Exception ex) { + logger.error("返回错误信息失败", ex); + } + } + } + /** * 删除配种计划生成 */ diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/controller/ScBreedRecordController.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/controller/ScBreedRecordController.java index c80c7ae..50c37c2 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/controller/ScBreedRecordController.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/controller/ScBreedRecordController.java @@ -1,6 +1,7 @@ package com.zhyc.module.produce.breed.controller; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -76,7 +77,11 @@ public class ScBreedRecordController extends BaseController @GetMapping(value = "/getSheepByTags/{manageTags}") public AjaxResult getSheepInfoByTags(@PathVariable("manageTags") String manageTags) { - return success(scBreedRecordService.getSheepInfoByTags(manageTags)); + Map sheepInfo = scBreedRecordService.getSheepInfoByTags(manageTags); + if (sheepInfo == null || sheepInfo.isEmpty()) { + return error("未找到耳号为 " + manageTags + " 的羊只信息"); + } + return success(sheepInfo); } /** @@ -86,7 +91,25 @@ public class ScBreedRecordController extends BaseController @GetMapping(value = "/getBreedPlan/{manageTags}") public AjaxResult getBreedPlanByEweTags(@PathVariable("manageTags") String manageTags) { - return success(scBreedRecordService.getBreedPlanByEweTags(manageTags)); + Map breedPlan = scBreedRecordService.getBreedPlanByEweTags(manageTags); + if (breedPlan == null || breedPlan.isEmpty()) { + return error("未找到耳号为 " + manageTags + " 的母羊配种计划"); + } + return success(breedPlan); + } + + /** + * 根据母羊耳号获取最新配种计划信息(优先从配种计划生成表获取) + */ + @PreAuthorize("@ss.hasPermi('Breeding_records:Breeding_records:query')") + @GetMapping(value = "/getLatestBreedPlan/{manageTags}") + public AjaxResult getLatestBreedPlanByEweTags(@PathVariable("manageTags") String manageTags) + { + Map breedPlan = scBreedRecordService.getLatestBreedPlanByEweTags(manageTags); + if (breedPlan == null || breedPlan.isEmpty()) { + return error("未找到耳号为 " + manageTags + " 的母羊配种计划"); + } + return success(breedPlan); } /** @@ -97,24 +120,43 @@ public class ScBreedRecordController extends BaseController @PostMapping public AjaxResult add(@RequestBody ScBreedRecord scBreedRecord) { - // 如果传入的是耳号,需要转换为羊只ID + // 处理母羊耳号转换 if (scBreedRecord.getEweManageTags() != null && !scBreedRecord.getEweManageTags().isEmpty()) { Long eweId = scBreedRecordService.getSheepIdByTags(scBreedRecord.getEweManageTags()); if (eweId == null) { - return error("未找到母羊耳号对应的羊只信息"); + return error("未找到母羊耳号 " + scBreedRecord.getEweManageTags() + " 对应的羊只信息"); } scBreedRecord.setEweId(eweId.toString()); + scBreedRecord.setSheepId(eweId); // 设置羊只ID为母羊ID } + // 处理公羊耳号转换 if (scBreedRecord.getRamManageTags() != null && !scBreedRecord.getRamManageTags().isEmpty()) { Long ramId = scBreedRecordService.getRamIdByTags(scBreedRecord.getRamManageTags()); if (ramId == null) { - return error("未找到公羊耳号对应的羊只信息"); + return error("未找到公羊耳号 " + scBreedRecord.getRamManageTags() + " 对应的羊只信息"); } scBreedRecord.setRamId(ramId.toString()); } - return toAjax(scBreedRecordService.insertScBreedRecord(scBreedRecord)); + // 验证配种方式 + if (scBreedRecord.getBreedType() == null) { + return error("配种方式不能为空"); + } + if (scBreedRecord.getBreedType() != 1 && scBreedRecord.getBreedType() != 2) { + return error("配种方式只能是:1-同期发情 或 2-本交"); + } + + // 验证技术员 + if (scBreedRecord.getTechnician() == null || scBreedRecord.getTechnician().trim().isEmpty()) { + return error("技术员不能为空"); + } + + int result = scBreedRecordService.insertScBreedRecord(scBreedRecord); + if (result > 0) { + return success("配种记录新增成功"); + } + return error("配种记录新增失败"); } /** @@ -125,23 +167,32 @@ public class ScBreedRecordController extends BaseController @PutMapping public AjaxResult edit(@RequestBody ScBreedRecord scBreedRecord) { - // 如果传入的是耳号,需要转换为羊只ID + // 处理母羊耳号转换 if (scBreedRecord.getEweManageTags() != null && !scBreedRecord.getEweManageTags().isEmpty()) { Long eweId = scBreedRecordService.getSheepIdByTags(scBreedRecord.getEweManageTags()); if (eweId == null) { - return error("未找到母羊耳号对应的羊只信息"); + return error("未找到母羊耳号 " + scBreedRecord.getEweManageTags() + " 对应的羊只信息"); } scBreedRecord.setEweId(eweId.toString()); + scBreedRecord.setSheepId(eweId); // 设置羊只ID为母羊ID } + // 处理公羊耳号转换 if (scBreedRecord.getRamManageTags() != null && !scBreedRecord.getRamManageTags().isEmpty()) { Long ramId = scBreedRecordService.getRamIdByTags(scBreedRecord.getRamManageTags()); if (ramId == null) { - return error("未找到公羊耳号对应的羊只信息"); + return error("未找到公羊耳号 " + scBreedRecord.getRamManageTags() + " 对应的羊只信息"); } scBreedRecord.setRamId(ramId.toString()); } + // 验证配种方式 + if (scBreedRecord.getBreedType() != null) { + if (scBreedRecord.getBreedType() != 1 && scBreedRecord.getBreedType() != 2) { + return error("配种方式只能是:1-同期发情 或 2-本交"); + } + } + return toAjax(scBreedRecordService.updateScBreedRecord(scBreedRecord)); } @@ -155,4 +206,37 @@ public class ScBreedRecordController extends BaseController { return toAjax(scBreedRecordService.deleteScBreedRecordByIds(ids)); } + + /** + * 同步孕检结果到配种记录 + */ + @PreAuthorize("@ss.hasPermi('Breeding_records:Breeding_records:edit')") + @Log(title = "同步孕检结果", businessType = BusinessType.UPDATE) + @PostMapping("/syncPregnancyResult") + public AjaxResult syncPregnancyResult(@RequestBody Map params) + { + Long pregnancyRecordId = Long.valueOf(params.get("pregnancyRecordId").toString()); + Long sheepId = Long.valueOf(params.get("sheepId").toString()); + String pregnancyCheckDate = params.get("pregnancyCheckDate").toString(); + + int result = scBreedRecordService.syncPregnancyResult(pregnancyRecordId, sheepId, pregnancyCheckDate); + if (result > 0) { + return success("孕检结果同步成功"); + } else { + return error("孕检结果同步失败,可能未找到对应的配种记录"); + } + } + + /** + * 根据羊只ID和时间范围查询配种记录 + */ + @PreAuthorize("@ss.hasPermi('Breeding_records:Breeding_records:query')") + @GetMapping("/getByTimeRange/{sheepId}/{startDate}/{endDate}") + public AjaxResult getBreedRecordsByTimeRange(@PathVariable("sheepId") Long sheepId, + @PathVariable("startDate") String startDate, + @PathVariable("endDate") String endDate) + { + List records = scBreedRecordService.getBreedRecordsByTimeRange(sheepId, startDate, endDate); + return success(records); + } } \ No newline at end of file diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/domain/ScBreedRecord.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/domain/ScBreedRecord.java index 6746caf..72565f2 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/domain/ScBreedRecord.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/domain/ScBreedRecord.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import com.zhyc.common.annotation.Excel; import com.zhyc.common.core.domain.BaseEntity; +import java.util.Date; /** * 配种记录对象 sc_breed_record @@ -42,6 +43,10 @@ public class ScBreedRecord extends BaseEntity @Excel(name = "耗精量") private String breedDrugs; + /** 配种方式 1-同期发情 2-本交 */ + @Excel(name = "配种方式", readConverterExp = "1=同期发情,2=本交") + private Integer breedType; + // ============ 显示字段 ============ /** 母羊耳号 */ @@ -88,7 +93,7 @@ public class ScBreedRecord extends BaseEntity @Excel(name = "所在牧场") private String ranchName; - /** 配种方式 */ + /** 配种方式显示 */ @Excel(name = "配种方式") private String matingType; @@ -107,5 +112,43 @@ public class ScBreedRecord extends BaseEntity /** 牧场ID */ private Long ranchId; + /** 配种计划ID */ + private Long planId; + // ============ 新增孕检相关字段 ============ + + /** 孕检日期 */ + @Excel(name = "孕检日期") + private Date pregnancyCheckDate; + + /** 孕检结果 */ + @Excel(name = "孕检结果") + private String pregnancyResult; + + /** 孕检方式 */ + @Excel(name = "孕检方式") + private String pregnancyWay; + + /** 胎数 */ + @Excel(name = "胎数") + private Integer fetusCount; + + /** 孕检技术员 */ + @Excel(name = "孕检技术员") + private String pregnancyTechnician; + + /** 孕检备注 */ + @Excel(name = "孕检备注") + private String pregnancyRemark; + + /** 孕检记录ID */ + private Long pregnancyRecordId; + + /** 配种到孕检间隔天数 */ + @Excel(name = "配种到孕检间隔(天)") + private Integer daysToPregnancyCheck; + + /** 是否已孕检 */ + @Excel(name = "是否已孕检", readConverterExp = "0=否,1=是") + private Integer isPregnancyChecked; } \ No newline at end of file diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/mapper/ScBreedPlanGenerateMapper.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/mapper/ScBreedPlanGenerateMapper.java index 00eaf16..0f744e6 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/mapper/ScBreedPlanGenerateMapper.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/mapper/ScBreedPlanGenerateMapper.java @@ -89,6 +89,22 @@ public interface ScBreedPlanGenerateMapper */ public List> selectBreedPlanDetails(Long planGenerateId); + /** + * 获取审批配种计划详情 + * + * @param planGenerateId 配种计划生成ID + * @return 审批配种计划详情列表 + */ + public List> selectApproveBreedPlanDetails(Long planGenerateId); + + /** + * 更新临时配种计划 + * + * @param params 更新参数 + * @return 结果 + */ + public int updateTempBreedPlan(Map params); + /** * 删除配种计划生成 * @@ -104,4 +120,12 @@ public interface ScBreedPlanGenerateMapper * @return 结果 */ public int deleteScBreedPlanGenerateByIds(Long[] ids); + + /** + * 删除临时配种计划 + * + * @param planGenerateId 配种计划生成ID + * @return 结果 + */ + public int deleteTempBreedPlanByPlanId(Long planGenerateId); } \ No newline at end of file diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/mapper/ScBreedRecordMapper.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/mapper/ScBreedRecordMapper.java index ee67b34..8d8eb58 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/mapper/ScBreedRecordMapper.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/mapper/ScBreedRecordMapper.java @@ -3,6 +3,8 @@ package com.zhyc.module.produce.breed.mapper; import java.util.List; import java.util.Map; import com.zhyc.module.produce.breed.domain.ScBreedRecord; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 配种记录Mapper接口 @@ -10,6 +12,7 @@ import com.zhyc.module.produce.breed.domain.ScBreedRecord; * @author ruoyi * @date 2025-07-23 */ +@Mapper public interface ScBreedRecordMapper { /** @@ -61,7 +64,7 @@ public interface ScBreedRecordMapper public int deleteScBreedRecordByIds(Long[] ids); /** - * 根据耳号查询羊只ID + * 根据管理耳号查询羊只ID * * @param manageTags 管理耳号 * @return 羊只ID @@ -69,7 +72,7 @@ public interface ScBreedRecordMapper public Long getSheepIdByManageTags(String manageTags); /** - * 根据公羊耳号查询羊只ID + * 根据公羊管理耳号查询羊只ID * * @param manageTags 管理耳号 * @return 羊只ID @@ -91,4 +94,34 @@ public interface ScBreedRecordMapper * @return 配种计划信息 */ public Map getBreedPlanByEweTags(String manageTags); + + /** + * 根据母羊耳号获取最新的配种计划信息(从配种计划生成表) + * + * @param manageTags 母羊管理耳号 + * @return 配种计划信息 + */ + public Map getLatestBreedPlanByEweTags(String manageTags); + + /** + * 根据配种记录ID更新孕检信息 + * + * @param breedRecordId 配种记录ID + * @param pregnancyRecordId 孕检记录ID + * @return 结果 + */ + public int updatePregnancyInfo(@Param("breedRecordId") Long breedRecordId, + @Param("pregnancyRecordId") Long pregnancyRecordId); + + /** + * 根据羊只ID和配种时间查询配种记录 + * + * @param sheepId 羊只ID + * @param matingDateStart 配种开始时间 + * @param matingDateEnd 配种结束时间 + * @return 配种记录集合 + */ + public List selectBreedRecordByMatingTime(@Param("sheepId") Long sheepId, + @Param("matingDateStart") String matingDateStart, + @Param("matingDateEnd") String matingDateEnd); } \ No newline at end of file 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 4580492..499438d 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 @@ -2,6 +2,7 @@ package com.zhyc.module.produce.breed.service; import java.util.List; import java.util.Map; +import javax.servlet.http.HttpServletResponse; import com.zhyc.module.produce.breed.domain.ScBreedPlanGenerate; /** @@ -45,11 +46,13 @@ public interface IScBreedPlanGenerateService /** * 自动生成配种计划 * + * @param planType 计划类型 + * @param planName 计划名称 * @param eweIds 母羊ID列表 * @param ramIds 公羊ID列表 * @return 生成的配种计划 */ - public ScBreedPlanGenerate autoGenerateBreedPlan(List eweIds, List ramIds); + public ScBreedPlanGenerate autoGenerateBreedPlan(Integer planType, String planName, List eweIds, List ramIds); /** * 新增配种计划生成 @@ -68,12 +71,23 @@ public interface IScBreedPlanGenerateService public int updateScBreedPlanGenerate(ScBreedPlanGenerate scBreedPlanGenerate); /** - * 审批配种计划 + * 获取审批配种计划详情 * * @param id 配种计划ID + * @return 审批配种计划详情 + */ + public Map getApproveBreedPlanDetails(Long id); + + /** + * 确认审批配种计划 + * + * @param planId 配种计划ID + * @param planDetails 配种计划详情 + * @param status 审批状态 + * @param approveRemark 审批意见 * @return 结果 */ - public int approveBreedPlan(Long id); + public int confirmApproveBreedPlan(Long planId, List> planDetails, Integer status, String approveRemark); /** * 获取配种计划详情 @@ -91,6 +105,14 @@ public interface IScBreedPlanGenerateService */ public int deleteScBreedPlanGenerateByIds(Long[] ids); + /** + * 导出配种计划详情 + * + * @param response HTTP响应 + * @param id 配种计划ID + */ + public void exportBreedPlanDetails(HttpServletResponse response, Long id); + /** * 删除配种计划生成信息 * diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/IScBreedRecordService.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/IScBreedRecordService.java index 7f71704..293d63e 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/IScBreedRecordService.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/IScBreedRecordService.java @@ -91,4 +91,32 @@ public interface IScBreedRecordService * @return 配种计划信息 */ public Map getBreedPlanByEweTags(String manageTags); + + /** + * 根据母羊耳号获取最新的配种计划信息(优先从配种计划生成表获取) + * + * @param manageTags 母羊管理耳号 + * @return 配种计划信息 + */ + public Map getLatestBreedPlanByEweTags(String manageTags); + + /** + * 同步孕检结果到配种记录 + * + * @param pregnancyRecordId 孕检记录ID + * @param sheepId 羊只ID + * @param pregnancyCheckDate 孕检日期 + * @return 结果 + */ + public int syncPregnancyResult(Long pregnancyRecordId, Long sheepId, String pregnancyCheckDate); + + /** + * 根据羊只ID和时间范围查询配种记录 + * + * @param sheepId 羊只ID + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 配种记录集合 + */ + public List getBreedRecordsByTimeRange(Long sheepId, String startDate, String endDate); } \ 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 3e88f7c..f2073ce 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 @@ -5,6 +5,8 @@ import java.util.Map; import java.util.HashMap; import java.util.Date; import java.text.SimpleDateFormat; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; import com.zhyc.module.produce.breed.domain.ScBreedPlan; import com.zhyc.module.produce.breed.domain.ScBreedPlanGenerate; @@ -15,6 +17,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.zhyc.common.utils.SecurityUtils; +import org.springframework.util.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; /** * 配种计划生成Service业务层处理 @@ -80,20 +86,27 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi /** * 自动生成配种计划 * + * @param planType 计划类型 + * @param planName 计划名称 * @param eweIds 母羊ID列表 * @param ramIds 公羊ID列表 * @return 生成的配种计划 */ @Override @Transactional - public ScBreedPlanGenerate autoGenerateBreedPlan(List eweIds, List ramIds) + public ScBreedPlanGenerate autoGenerateBreedPlan(Integer planType, String planName, List eweIds, List ramIds) { // 创建配种计划生成记录 ScBreedPlanGenerate planGenerate = new ScBreedPlanGenerate(); + + // 自动生成计划名称:日期+计划类型 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = sdf.format(new Date()); - planGenerate.setPlanName(dateStr + "同期发情配种计划"); - planGenerate.setPlanType(1); + String planTypeName = (planType == 1) ? "同期发情配种计划" : "本交配种计划"; + planName = dateStr + planTypeName; + + planGenerate.setPlanName(planName); + planGenerate.setPlanType(planType); planGenerate.setPlanDate(new Date()); planGenerate.setTotalEweCount(eweIds.size()); planGenerate.setTotalRamCount(ramIds.size()); @@ -109,7 +122,7 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi scBreedPlanGenerateMapper.insertScBreedPlanGenerate(planGenerate); // 生成具体的配种计划 - generateBreedPlanDetails(planGenerate.getId(), eweIds, ramIds); + generateBreedPlanDetails(planGenerate.getId(), eweIds, ramIds, planType); return planGenerate; } @@ -117,16 +130,23 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi /** * 生成具体的配种计划详情 */ - private void generateBreedPlanDetails(Long planGenerateId, List eweIds, List ramIds) + private void generateBreedPlanDetails(Long planGenerateId, List eweIds, List ramIds, Integer planType) { int ramIndex = 0; int ewesPerRam = (int) Math.ceil((double) eweIds.size() / ramIds.size()); for (int i = 0; i < eweIds.size(); i++) { ScBreedPlan breedPlan = new ScBreedPlan(); + // 存储公羊ID而不是字符串 breedPlan.setRamId(ramIds.get(ramIndex).toString()); breedPlan.setEweId(eweIds.get(i).toString()); - breedPlan.setBreedType(1L); // 默认配种类型 + + // 根据计划类型设置配种类型:同期发情配种计划->同期发情,本交配种计划->本交 + if (planType == 1) { + breedPlan.setBreedType(1L); // 同期发情 + } else { + breedPlan.setBreedType(2L); // 本交 + } // 插入临时配种计划,关联到生成记录 scBreedPlanGenerateMapper.insertTempBreedPlan(planGenerateId, breedPlan); @@ -165,28 +185,75 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi } /** - * 审批配种计划 + * 获取审批配种计划详情 * * @param id 配种计划ID + * @return 审批配种计划详情 + */ + @Override + public Map getApproveBreedPlanDetails(Long id) + { + Map result = new HashMap<>(); + + // 获取配种计划基本信息 + ScBreedPlanGenerate planGenerate = scBreedPlanGenerateMapper.selectScBreedPlanGenerateById(id); + result.put("planInfo", planGenerate); + + // 获取详细的配种计划信息 + List> planDetails = scBreedPlanGenerateMapper.selectApproveBreedPlanDetails(id); + result.put("planDetails", planDetails); + + // 获取可选择的公羊列表 + List> availableRams = scBreedPlanGenerateMapper.selectEligibleRam(); + result.put("availableRams", availableRams); + + return result; + } + + /** + * 确认审批配种计划 + * + * @param planId 配种计划ID + * @param planDetails 配种计划详情 + * @param status 审批状态 + * @param approveRemark 审批意见 * @return 结果 */ @Override @Transactional - public int approveBreedPlan(Long id) + public int confirmApproveBreedPlan(Long planId, List> planDetails, Integer status, String approveRemark) { // 更新审批状态 ScBreedPlanGenerate planGenerate = new ScBreedPlanGenerate(); - planGenerate.setId(id); - planGenerate.setStatus(1); // 已审批 + planGenerate.setId(planId); + planGenerate.setStatus(status); planGenerate.setApprover(SecurityUtils.getUsername()); planGenerate.setApproveTime(new Date()); + planGenerate.setApproveRemark(approveRemark); planGenerate.setUpdateTime(new Date()); int result = scBreedPlanGenerateMapper.updateScBreedPlanGenerate(planGenerate); - // 将临时配种计划转为正式配种计划 - if (result > 0) { - scBreedPlanGenerateMapper.transferTempToFormal(id); + // 如果审批通过,更新临时配种计划并转为正式计划 + if (result > 0 && status == 1) { + // 更新临时配种计划中的公羊分配 + if (planDetails != null && !planDetails.isEmpty()) { + for (Map detail : planDetails) { + Long tempId = Long.valueOf(detail.get("id").toString()); + Long ramId = Long.valueOf(detail.get("ram_id").toString()); + Long breedType = Long.valueOf(detail.get("breed_type").toString()); + + // 更新临时配种计划 + Map updateParams = new HashMap<>(); + updateParams.put("id", tempId); + updateParams.put("ramId", ramId); + updateParams.put("breedType", breedType); + scBreedPlanGenerateMapper.updateTempBreedPlan(updateParams); + } + } + + // 将临时配种计划转为正式配种计划 + scBreedPlanGenerateMapper.transferTempToFormal(planId); } return result; @@ -214,6 +281,231 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi return result; } + /** + * 导出配种计划详情 + * + * @param response HTTP响应 + * @param id 配种计划ID + */ + @Override + public void exportBreedPlanDetails(HttpServletResponse response, Long id) + { + try { + // 获取配种计划基本信息 + ScBreedPlanGenerate planGenerate = scBreedPlanGenerateMapper.selectScBreedPlanGenerateById(id); + if (planGenerate == null) { + throw new RuntimeException("配种计划不存在"); + } + + // 检查是否已审批 + if (planGenerate.getStatus() != 1) { + throw new RuntimeException("只有已审批的配种计划才能导出"); + } + + // 获取配种计划详情 + List> planDetails = scBreedPlanGenerateMapper.selectBreedPlanDetails(id); + + // 创建工作簿 + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("配种计划详情"); + + // 创建样式 + CellStyle titleStyle = workbook.createCellStyle(); + Font titleFont = workbook.createFont(); + titleFont.setBold(true); + titleFont.setFontHeightInPoints((short) 16); + titleStyle.setFont(titleFont); + titleStyle.setAlignment(HorizontalAlignment.CENTER); + + CellStyle headerStyle = workbook.createCellStyle(); + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerStyle.setFont(headerFont); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + CellStyle dataStyle = workbook.createCellStyle(); + dataStyle.setAlignment(HorizontalAlignment.CENTER); + + CellStyle eweHeaderStyle = workbook.createCellStyle(); + Font eweHeaderFont = workbook.createFont(); + eweHeaderFont.setBold(true); + eweHeaderStyle.setFont(eweHeaderFont); + eweHeaderStyle.setAlignment(HorizontalAlignment.CENTER); + eweHeaderStyle.setFillForegroundColor(IndexedColors.ROSE.getIndex()); + eweHeaderStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + CellStyle ramHeaderStyle = workbook.createCellStyle(); + Font ramHeaderFont = workbook.createFont(); + ramHeaderFont.setBold(true); + ramHeaderStyle.setFont(ramHeaderFont); + ramHeaderStyle.setAlignment(HorizontalAlignment.CENTER); + ramHeaderStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); + ramHeaderStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + int rowNum = 0; + + // 标题 + Row titleRow = sheet.createRow(rowNum++); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellValue(planGenerate.getPlanName() + " - 配种计划详情"); + titleCell.setCellStyle(titleStyle); + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 19)); + + // 空行 + rowNum++; + + // 基本信息 + Row infoRow1 = sheet.createRow(rowNum++); + infoRow1.createCell(0).setCellValue("计划类型:"); + infoRow1.createCell(1).setCellValue(planGenerate.getPlanType() == 1 ? "同期发情配种计划" : "本交配种计划"); + infoRow1.createCell(3).setCellValue("计划日期:"); + infoRow1.createCell(4).setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(planGenerate.getPlanDate())); + + Row infoRow2 = sheet.createRow(rowNum++); + infoRow2.createCell(0).setCellValue("母羊数量:"); + infoRow2.createCell(1).setCellValue(planGenerate.getTotalEweCount()); + infoRow2.createCell(3).setCellValue("公羊数量:"); + infoRow2.createCell(4).setCellValue(planGenerate.getTotalRamCount()); + + Row infoRow3 = sheet.createRow(rowNum++); + infoRow3.createCell(0).setCellValue("配种比例:"); + infoRow3.createCell(1).setCellValue(planGenerate.getBreedRatio()); + infoRow3.createCell(3).setCellValue("创建人:"); + infoRow3.createCell(4).setCellValue(planGenerate.getCreateBy()); + + // 空行 + rowNum++; + + // 分组表头 + Row groupHeaderRow = sheet.createRow(rowNum++); + Cell groupHeaderCell1 = groupHeaderRow.createCell(1); + groupHeaderCell1.setCellValue("母羊信息"); + groupHeaderCell1.setCellStyle(eweHeaderStyle); + sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum-1, 1, 12)); + + Cell groupHeaderCell2 = groupHeaderRow.createCell(13); + groupHeaderCell2.setCellValue("公羊信息"); + groupHeaderCell2.setCellStyle(ramHeaderStyle); + sheet.addMergedRegion(new CellRangeAddress(rowNum-1, rowNum-1, 13, 19)); + + // 详细表头 + Row headerRow = sheet.createRow(rowNum++); + String[] headers = { + "序号", + // 母羊信息 + "母羊耳号", "母羊品种", "母羊家系", "母羊类别", "繁育状态", "胎次", "月龄", "体重", "核心羊群", "是否种用", "羊舍", "备注", + // 公羊信息 + "公羊耳号", "公羊品种", "公羊家系", "公羊类别", "生日", "月龄", "体重", + // 配种信息 + "配种类型" + }; + + for (int i = 0; i < headers.length; i++) { + Cell cell = headerRow.createCell(i); + cell.setCellValue(headers[i]); + if (i == 0 || i == headers.length - 1) { + cell.setCellStyle(headerStyle); + } else if (i <= 12) { + cell.setCellStyle(eweHeaderStyle); + } else { + cell.setCellStyle(ramHeaderStyle); + } + } + + // 数据行 + for (int i = 0; i < planDetails.size(); i++) { + Map detail = planDetails.get(i); + Row dataRow = sheet.createRow(rowNum++); + int colNum = 0; + + // 序号 + dataRow.createCell(colNum++).setCellValue(i + 1); + + // 母羊信息 + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_manage_tags")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_variety")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_family")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_sheep_type")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_breed_status")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_parity")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_month_age")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_current_weight")); + dataRow.createCell(colNum++).setCellValue(getBooleanValue(detail, "ewe_is_core") ? "是" : "否"); + dataRow.createCell(colNum++).setCellValue(getBooleanValue(detail, "ewe_is_breeding") ? "是" : "否"); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_sheepfold_name")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ewe_comment")); + + // 公羊信息 + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_manage_tags")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_variety")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_family")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_sheep_type")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_birthday")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_month_age")); + dataRow.createCell(colNum++).setCellValue(getStringValue(detail, "ram_current_weight")); + + // 配种类型 + Object breedType = detail.get("breed_type"); + String breedTypeName = "未知类型"; + if (breedType != null) { + int typeValue = Integer.parseInt(breedType.toString()); + breedTypeName = typeValue == 1 ? "同期发情" : (typeValue == 2 ? "本交" : "未知类型"); + } + dataRow.createCell(colNum++).setCellValue(breedTypeName); + + // 应用数据样式 + for (int j = 0; j < headers.length; j++) { + if (dataRow.getCell(j) != null) { + dataRow.getCell(j).setCellStyle(dataStyle); + } + } + } + + // 自动调整列宽 + for (int i = 0; i < headers.length; i++) { + sheet.autoSizeColumn(i); + // 设置最小宽度 + 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"); + + // 输出到响应流 + workbook.write(response.getOutputStream()); + workbook.close(); + + } catch (IOException e) { + throw new RuntimeException("导出Excel失败", e); + } + } + + /** + * 安全获取字符串值 + */ + private String getStringValue(Map map, String key) { + Object value = map.get(key); + return value != null ? value.toString() : ""; + } + + /** + * 安全获取布尔值 + */ + private boolean getBooleanValue(Map map, String key) { + Object value = map.get(key); + if (value == null) return false; + if (value instanceof Boolean) return (Boolean) value; + if (value instanceof Number) return ((Number) value).intValue() == 1; + return "1".equals(value.toString()) || "true".equalsIgnoreCase(value.toString()); + } + /** * 批量删除配种计划生成 * @@ -221,8 +513,13 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi * @return 结果 */ @Override + @Transactional public int deleteScBreedPlanGenerateByIds(Long[] ids) { + // 删除相关的临时配种计划 + for (Long id : ids) { + scBreedPlanGenerateMapper.deleteTempBreedPlanByPlanId(id); + } return scBreedPlanGenerateMapper.deleteScBreedPlanGenerateByIds(ids); } @@ -233,8 +530,11 @@ public class ScBreedPlanGenerateServiceImpl implements IScBreedPlanGenerateServi * @return 结果 */ @Override + @Transactional public int deleteScBreedPlanGenerateById(Long id) { + // 先删除相关的临时配种计划 + scBreedPlanGenerateMapper.deleteTempBreedPlanByPlanId(id); return scBreedPlanGenerateMapper.deleteScBreedPlanGenerateById(id); } } \ No newline at end of file diff --git a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/impl/ScBreedRecordServiceImpl.java b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/impl/ScBreedRecordServiceImpl.java index 61ab012..aaad5b1 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/impl/ScBreedRecordServiceImpl.java +++ b/zhyc-module/src/main/java/com/zhyc/module/produce/breed/service/impl/ScBreedRecordServiceImpl.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Map; import com.zhyc.common.utils.DateUtils; import com.zhyc.common.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.zhyc.module.produce.breed.mapper.ScBreedRecordMapper; @@ -19,6 +21,8 @@ import com.zhyc.module.produce.breed.service.IScBreedRecordService; @Service public class ScBreedRecordServiceImpl implements IScBreedRecordService { + private static final Logger log = LoggerFactory.getLogger(ScBreedRecordServiceImpl.class); + @Autowired private ScBreedRecordMapper scBreedRecordMapper; @@ -161,4 +165,84 @@ public class ScBreedRecordServiceImpl implements IScBreedRecordService { return scBreedRecordMapper.getBreedPlanByEweTags(manageTags); } + + /** + * 根据母羊耳号获取最新的配种计划信息(优先从配种计划生成表获取) + * + * @param manageTags 母羊管理耳号 + * @return 配种计划信息 + */ + @Override + public Map getLatestBreedPlanByEweTags(String manageTags) + { + try { + // 优先从配种计划生成表获取最新计划 + Map latestPlan = scBreedRecordMapper.getLatestBreedPlanByEweTags(manageTags); + + if (latestPlan != null && !latestPlan.isEmpty()) { + log.info("从配种计划生成表获取到配种计划: {}", latestPlan); + return latestPlan; + } + + // 如果生成表中没有,则从普通配种计划表获取 + Map normalPlan = scBreedRecordMapper.getBreedPlanByEweTags(manageTags); + if (normalPlan != null && !normalPlan.isEmpty()) { + log.info("从配种计划表获取到配种计划: {}", normalPlan); + return normalPlan; + } + + log.warn("未找到母羊耳号 {} 的配种计划信息", manageTags); + return null; + + } catch (Exception e) { + log.error("获取配种计划信息时发生异常,母羊耳号: {}", manageTags, e); + return null; + } + } + + /** + * 同步孕检结果到配种记录 + * + * @param pregnancyRecordId 孕检记录ID + * @param sheepId 羊只ID + * @param pregnancyCheckDate 孕检日期 + * @return 结果 + */ + @Override + public int syncPregnancyResult(Long pregnancyRecordId, Long sheepId, String pregnancyCheckDate) + { + try { + // 查找孕检日期前最近的配种记录 + List breedRecords = scBreedRecordMapper.selectBreedRecordByMatingTime( + sheepId, null, pregnancyCheckDate); + + if (breedRecords != null && !breedRecords.isEmpty()) { + // 取最近的一次配种记录 + ScBreedRecord latestBreedRecord = breedRecords.get(0); + + // 更新配种记录中的孕检信息 + return scBreedRecordMapper.updatePregnancyInfo(latestBreedRecord.getId(), pregnancyRecordId); + } else { + log.warn("未找到羊只ID {} 在孕检日期 {} 前的配种记录", sheepId, pregnancyCheckDate); + return 0; + } + } catch (Exception e) { + log.error("同步孕检结果到配种记录时发生异常", e); + return 0; + } + } + + /** + * 根据羊只ID和时间范围查询配种记录 + * + * @param sheepId 羊只ID + * @param startDate 开始时间 + * @param endDate 结束时间 + * @return 配种记录集合 + */ + @Override + public List getBreedRecordsByTimeRange(Long sheepId, String startDate, String endDate) + { + return scBreedRecordMapper.selectBreedRecordByMatingTime(sheepId, startDate, endDate); + } } \ No newline at end of file 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 7d08f16..44d083f 100644 --- a/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedPlanGenerateMapper.xml +++ b/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedPlanGenerateMapper.xml @@ -34,8 +34,14 @@ and plan_name like concat('%', #{planName}, '%') and plan_type = #{planType} - and plan_date = #{planDate} + and DATE(plan_date) = DATE(#{planDate}) and status = #{status} + + and DATE(plan_date) >= DATE(#{params.beginTime}) + + + and DATE(plan_date) <= DATE(#{params.endTime}) + order by create_time desc @@ -48,63 +54,72 @@ @@ -176,25 +191,110 @@ where plan_generate_id = #{planGenerateId} - + + + + + + + update sc_breed_plan_temp + + + ram_id = #{ramId}, + + + ram_id = null, + + + breed_type = #{breedType}, + + + breed_type = null, + + + where id = #{id} + + delete from sc_breed_plan_generate where id = #{id} @@ -205,4 +305,9 @@ #{id} + + + + delete from sc_breed_plan_temp where plan_generate_id = #{planGenerateId} + \ No newline at end of file diff --git a/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedRecordMapper.xml b/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedRecordMapper.xml index 4128a7a..c03c285 100644 --- a/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedRecordMapper.xml +++ b/zhyc-module/src/main/resources/mapper/produce/breed/ScBreedRecordMapper.xml @@ -11,9 +11,10 @@ + - + @@ -29,6 +30,16 @@ + + + + + + + + + + @@ -39,6 +50,7 @@ br.ewe_id, br.technician, br.breed_drugs, + br.breed_type, br.create_by, br.create_time, -- 母羊信息(从视图获取) @@ -56,13 +68,45 @@ -- 公羊信息(从视图获取) ram_view.bs_manage_tags as ram_manage_tags, ram_view.variety as ram_variety, - -- 配种方式(如果视图中没有,设为空或从其他地方获取) - '' as mating_type, + -- 配种方式显示 + CASE br.breed_type + WHEN 1 THEN '同期发情' + WHEN 2 THEN '本交' + ELSE '未知' + END as mating_type, -- 发情后配种时间(小时数) - TIMESTAMPDIFF(HOUR, br.create_time, NOW()) as time_since_planning + TIMESTAMPDIFF(HOUR, br.create_time, NOW()) as time_since_planning, + -- 孕检相关信息 + pr.datetime as pregnancy_check_date, + pr.result as pregnancy_result, + pr.way as pregnancy_way, + pr.fetus_count, + pr.technician as pregnancy_technician, + pr.remark as pregnancy_remark, + pr.id as pregnancy_record_id, + -- 配种到孕检间隔天数 + CASE + WHEN pr.datetime IS NOT NULL THEN DATEDIFF(pr.datetime, br.create_time) + ELSE NULL + END as days_to_pregnancy_check, + -- 是否已孕检 + CASE + WHEN pr.id IS NOT NULL THEN 1 + ELSE 0 + END as is_pregnancy_checked from sc_breed_record br left join sheep_file ewe_view on br.ewe_id = ewe_view.id left join sheep_file ram_view on br.ram_id = ram_view.id + left join sc_pregnancy_record pr on pr.sheep_id = br.ewe_id + and pr.is_delete = 0 + and pr.datetime >= br.create_time + and pr.datetime = ( + select min(pr2.datetime) + from sc_pregnancy_record pr2 + where pr2.sheep_id = br.ewe_id + and pr2.is_delete = 0 + and pr2.datetime >= br.create_time + ) @@ -170,19 +221,43 @@ ewe_view.bs_manage_tags as ewe_manage_tags, bp.ram_id, ram_view.bs_manage_tags as ram_manage_tags, - bp.plan_date, bp.breed_type, - bp.technician, - bp.status, - bp.create_time as plan_create_time, - TIMESTAMPDIFF(HOUR, bp.create_time, NOW()) as hours_since_plan + CASE bp.breed_type + WHEN 1 THEN '同期发情' + WHEN 2 THEN '本交' + ELSE '未知' + END as breed_type_name, + TIMESTAMPDIFF(HOUR, NOW(), NOW()) as hours_since_plan from sc_breed_plan bp left join sheep_file ewe_view on bp.ewe_id = ewe_view.id left join sheep_file ram_view on bp.ram_id = ram_view.id where ewe_view.bs_manage_tags = #{manageTags} - and bp.status = '待配种' - and bp.is_delete = 0 - order by bp.create_time desc + order by bp.id desc + limit 1 + + + + @@ -194,6 +269,7 @@ ewe_id, technician, breed_drugs, + breed_type, create_by, create_time, @@ -203,6 +279,7 @@ #{eweId}, #{technician}, #{breedDrugs}, + #{breedType}, #{createBy}, #{createTime}, @@ -216,6 +293,7 @@ ewe_id = #{eweId}, technician = #{technician}, breed_drugs = #{breedDrugs}, + breed_type = #{breedType}, create_by = #{createBy}, create_time = #{createTime}, @@ -232,4 +310,26 @@ #{id} + + + + + + + update sc_breed_record + set pregnancy_record_id = #{pregnancyRecordId} + where id = #{breedRecordId} + \ No newline at end of file