前端更新配种计划和配种记录

This commit is contained in:
zyk 2025-08-19 00:18:49 +08:00
parent 1fe616abf0
commit 089bff32ba
6 changed files with 829 additions and 134 deletions

View File

@ -57,4 +57,29 @@ export function getBreedPlanByEweTags(manageTags) {
url: '/Breeding_records/Breeding_records/getBreedPlan/' + manageTags,
method: 'get'
})
}
// 根据母羊耳号获取最新配种计划信息(优先从配种计划生成表获取)
export function getLatestBreedPlanByEweTags(manageTags) {
return request({
url: '/Breeding_records/Breeding_records/getLatestBreedPlan/' + manageTags,
method: 'get'
})
}
// 同步孕检结果到配种记录
export function syncPregnancyResult(data) {
return request({
url: '/Breeding_records/Breeding_records/syncPregnancyResult',
method: 'post',
data: data
})
}
// 根据羊只ID和时间范围查询配种记录
export function getBreedRecordsByTimeRange(sheepId, startDate, endDate) {
return request({
url: `/Breeding_records/Breeding_records/getByTimeRange/${sheepId}/${startDate}/${endDate}`,
method: 'get'
})
}

View File

@ -60,11 +60,20 @@ export function updateBreedPlanGenerate(data) {
})
}
// 审批配种计划
export function approveBreedPlan(id) {
// 获取审批配种计划详情
export function getApproveBreedPlan(id) {
return request({
url: '/mating_plan/generate/approve/' + id,
method: 'put'
method: 'get'
})
}
// 确认审批配种计划
export function confirmApproveBreedPlan(data) {
return request({
url: '/mating_plan/generate/approve/confirm',
method: 'put',
data: data
})
}
@ -76,6 +85,24 @@ export function viewBreedPlan(id) {
})
}
// 导出配种计划详情
export function exportBreedPlanDetails(id) {
return request({
url: '/mating_plan/generate/export/' + id,
method: 'get',
responseType: 'blob'
})
}
// 修改配种计划详情
export function updateBreedPlan(data) {
return request({
url: '/mating_plan/generate/update',
method: 'put',
data: data
})
}
// 删除配种计划生成
export function delBreedPlanGenerate(id) {
return request({

View File

@ -41,4 +41,4 @@ export function delMating_plan(id) {
url: '/mating_plan/mating_plan/' + id,
method: 'delete'
})
}
}

View File

@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="母羊耳号" prop="eweManageTags">
<el-input
v-model="queryParams.eweManageTags"
@ -33,6 +33,12 @@
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="配种方式" prop="breedType">
<el-select v-model="queryParams.breedType" placeholder="请选择配种方式" clearable>
<el-option label="同期发情" value="1"></el-option>
<el-option label="本交" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="技术员" prop="technician">
<el-input
v-model="queryParams.technician"
@ -41,6 +47,19 @@
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="孕检结果" prop="pregnancyResult">
<el-select v-model="queryParams.pregnancyResult" placeholder="请选择孕检结果" clearable>
<el-option label="怀孕" value="怀孕"></el-option>
<el-option label="空怀" value="空怀"></el-option>
<el-option label="疑似怀孕" value="疑似怀孕"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否孕检" prop="isPregnancyChecked">
<el-select v-model="queryParams.isPregnancyChecked" placeholder="请选择是否已孕检" clearable>
<el-option label="已孕检" value="1"></el-option>
<el-option label="未孕检" value="0"></el-option>
</el-select>
</el-form-item>
<el-form-item label="创建人" prop="createBy">
<el-input
v-model="queryParams.createBy"
@ -107,11 +126,11 @@
<el-table v-loading="loading" :data="Breeding_recordsList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="耳号" align="center" prop="eweManageTags" width="120" />
<el-table-column label="耳号" align="center" prop="eweManageTags" width="120" fixed="left" />
<el-table-column label="品种" align="center" prop="eweVariety" width="100" />
<el-table-column label="事件类型" align="center" width="100">
<template #default="scope">
<span>配种</span>
<el-tag type="success">配种</el-tag>
</template>
</el-table-column>
<el-table-column label="配种公羊" align="center" prop="ramManageTags" width="120" />
@ -138,6 +157,45 @@
</template>
</el-table-column>
<el-table-column label="耗精量" align="center" prop="breedDrugs" width="100" />
<!-- 孕检相关字段 -->
<el-table-column label="孕检状态" align="center" width="100">
<template #default="scope">
<el-tag :type="scope.row.isPregnancyChecked === 1 ? 'success' : 'warning'">
{{ scope.row.isPregnancyChecked === 1 ? '已孕检' : '未孕检' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="孕检日期" align="center" prop="pregnancyCheckDate" width="120">
<template #default="scope">
<span>{{ scope.row.pregnancyCheckDate ? parseTime(scope.row.pregnancyCheckDate, '{y}-{m}-{d}') : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="孕检结果" align="center" prop="pregnancyResult" width="100">
<template #default="scope">
<el-tag v-if="scope.row.pregnancyResult"
:type="getPregnancyResultType(scope.row.pregnancyResult)">
{{ scope.row.pregnancyResult }}
</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="胎数" align="center" prop="fetusCount" width="80">
<template #default="scope">
<span>{{ scope.row.fetusCount || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="孕检方式" align="center" prop="pregnancyWay" width="100">
<template #default="scope">
<span>{{ scope.row.pregnancyWay || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="配种到孕检间隔(天)" align="center" prop="daysToPregnancyCheck" width="140">
<template #default="scope">
<span>{{ scope.row.daysToPregnancyCheck || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="创建人" align="center" prop="createBy" width="100" />
<el-table-column label="创建日期" align="center" prop="createTime" width="180">
<template #default="scope">
@ -162,12 +220,12 @@
/>
<!-- 添加或修改配种记录对话框 -->
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form ref="Breeding_recordsRef" :model="form" :rules="rules" label-width="100px">
<el-dialog :title="title" v-model="open" width="800px" append-to-body>
<el-form ref="Breeding_recordsRef" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="母羊耳号" prop="eweManageTags">
<el-input v-model="form.eweManageTags" placeholder="请输入母羊耳号" @blur="getEweInfoByTags" />
<el-input v-model="form.eweManageTags" placeholder="请输入母羊耳号" @blur="getEweInfoAndPlan" />
</el-form-item>
</el-col>
<el-col :span="12">
@ -177,11 +235,21 @@
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="配种方式" prop="breedType">
<el-select v-model="form.breedType" placeholder="请选择配种方式">
<el-option label="同期发情" :value="1"></el-option>
<el-option label="本交" :value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="技术员" prop="technician">
<el-input v-model="form.technician" placeholder="请输入技术员" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="耗精量" prop="breedDrugs">
<el-input v-model="form.breedDrugs" placeholder="请输入耗精量" />
@ -195,6 +263,97 @@
</el-form-item>
</el-col>
</el-row>
<!-- 显示母羊信息区域 -->
<el-row v-if="eweInfo">
<el-col :span="24">
<el-divider content-position="left">母羊信息</el-divider>
</el-col>
<el-col :span="8">
<el-form-item label="品种">
<el-input v-model="eweInfo.variety" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="月龄">
<el-input v-model="eweInfo.month_age" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="胎次">
<el-input v-model="eweInfo.parity" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="繁育状态">
<el-input v-model="eweInfo.breed_status" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="当前羊舍">
<el-input v-model="eweInfo.sheepfold_name" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否性控">
<el-input :value="eweInfo.controlled === 1 ? '是' : '否'" readonly />
</el-form-item>
</el-col>
</el-row>
<!-- 显示配种计划信息区域 -->
<el-row v-if="breedPlan">
<el-col :span="24">
<el-divider content-position="left">配种计划信息</el-divider>
</el-col>
<el-col :span="12">
<el-form-item label="计划公羊">
<el-input v-model="breedPlan.ram_manage_tags" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计划配种方式">
<el-input v-model="breedPlan.breed_type_name" readonly />
</el-form-item>
</el-col>
</el-row>
<!-- 显示孕检信息区域如果已有孕检记录 -->
<el-row v-if="form.pregnancyResult">
<el-col :span="24">
<el-divider content-position="left">孕检信息</el-divider>
</el-col>
<el-col :span="8">
<el-form-item label="孕检日期">
<el-input :value="form.pregnancyCheckDate ? parseTime(form.pregnancyCheckDate, '{y}-{m}-{d}') : ''" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="孕检结果">
<el-input v-model="form.pregnancyResult" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="胎数">
<el-input v-model="form.fetusCount" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="孕检方式">
<el-input v-model="form.pregnancyWay" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="孕检技术员">
<el-input v-model="form.pregnancyTechnician" readonly />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="配种到孕检间隔">
<el-input :value="form.daysToPregnancyCheck + '天'" readonly />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
@ -207,7 +366,7 @@
</template>
<script setup name="Breeding_records">
import { listBreeding_records, getBreeding_records, delBreeding_records, addBreeding_records, updateBreeding_records, getSheepInfoByTags } from "@/api/Breeding_records/Breeding_records"
import { listBreeding_records, getBreeding_records, delBreeding_records, addBreeding_records, updateBreeding_records, getSheepInfoByTags, getLatestBreedPlanByEweTags } from "@/api/Breeding_records/Breeding_records"
const { proxy } = getCurrentInstance()
@ -221,6 +380,10 @@ const multiple = ref(true)
const total = ref(0)
const title = ref("")
//
const eweInfo = ref(null)
const breedPlan = ref(null)
const data = reactive({
form: {},
queryParams: {
@ -230,9 +393,12 @@ const data = reactive({
ramManageTags: null,
eweVariety: null,
ramVariety: null,
breedType: null,
technician: null,
createBy: null,
createTime: null
createTime: null,
pregnancyResult: null,
isPregnancyChecked: null
},
rules: {
eweManageTags: [
@ -243,6 +409,9 @@ const data = reactive({
],
technician: [
{ required: true, message: "技术员不能为空", trigger: "blur" }
],
breedType: [
{ required: true, message: "配种方式不能为空", trigger: "change" }
]
}
})
@ -276,10 +445,20 @@ function reset() {
ramManageTags: null,
technician: null,
breedDrugs: null,
breedType: null,
comment: null,
createBy: null,
createTime: null
createTime: null,
pregnancyCheckDate: null,
pregnancyResult: null,
pregnancyWay: null,
fetusCount: null,
pregnancyTechnician: null,
pregnancyRemark: null,
daysToPregnancyCheck: null
}
eweInfo.value = null
breedPlan.value = null
proxy.resetForm("Breeding_recordsRef")
}
@ -317,20 +496,51 @@ function handleUpdate(row) {
form.value = response.data
open.value = true
title.value = "修改配种记录"
//
if (form.value.eweManageTags) {
getEweInfoAndPlan()
}
})
}
/** 根据母羊耳号获取羊只信息 */
function getEweInfoByTags() {
/** 根据母羊耳号获取羊只信息和配种计划信息 */
function getEweInfoAndPlan() {
if (form.value.eweManageTags) {
//
getSheepInfoByTags(form.value.eweManageTags).then(response => {
if (response.data) {
eweInfo.value = response.data
form.value.eweId = response.data.id
} else {
proxy.$modal.msgError("未找到该母羊耳号对应的羊只信息")
eweInfo.value = null
}
}).catch(() => {
proxy.$modal.msgError("查询母羊信息失败")
eweInfo.value = null
})
// 使
getLatestBreedPlanByEweTags(form.value.eweManageTags).then(response => {
if (response.data) {
breedPlan.value = response.data
//
if (!form.value.ramManageTags) {
form.value.ramManageTags = response.data.ram_manage_tags
}
if (!form.value.breedType) {
form.value.breedType = response.data.breed_type
}
proxy.$modal.msgSuccess("已自动匹配配种计划信息,可手动调整")
} else {
breedPlan.value = null
proxy.$modal.msgWarning("未找到该母羊的配种计划,请手动输入配种信息")
}
}).catch(() => {
proxy.$modal.msgWarning("查询配种计划失败,请手动输入配种信息")
breedPlan.value = null
})
}
}
@ -389,6 +599,19 @@ function handleExport() {
}, `配种记录_${new Date().getTime()}.xlsx`)
}
/** 获取孕检结果类型 */
function getPregnancyResultType(result) {
if (result === '怀孕') {
return 'success'
} else if (result === '空怀') {
return 'danger'
} else if (result === '疑似怀孕') {
return 'warning'
} else {
return 'info'
}
}
getList()
</script>
@ -399,4 +622,10 @@ getList()
.el-table .cell {
white-space: nowrap;
}
.el-divider {
margin: 16px 0;
}
.el-divider--horizontal {
margin: 16px 0;
}
</style>

View File

@ -9,6 +9,24 @@
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="计划类型" prop="planType">
<el-select v-model="queryParams.planType" placeholder="请选择计划类型" clearable>
<el-option label="同期发情配种计划" value="1"></el-option>
<el-option label="本交配种计划" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="计划日期" prop="planDate">
<el-date-picker
v-model="dateRange"
style="width: 240px"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="handleDateRangeChange"
></el-date-picker>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option label="待审批" value="0"></el-option>
@ -48,6 +66,13 @@
<el-table v-loading="loading" :data="breedPlanGenerateList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="计划名称" align="center" prop="planName" />
<el-table-column label="计划类型" align="center" prop="planType">
<template #default="scope">
<el-tag v-if="scope.row.planType === 1" type="primary">同期发情配种计划</el-tag>
<el-tag v-else-if="scope.row.planType === 2" type="success">本交配种计划</el-tag>
<el-tag v-else type="info">未知类型</el-tag>
</template>
</el-table-column>
<el-table-column label="计划日期" align="center" prop="planDate" width="180">
<template #default="scope">
<span>{{ scope.row.planDate }}</span>
@ -82,6 +107,7 @@
v-hasPermi="['mating_plan:generate:approve']"
v-if="scope.row.status == 0"
>审批</el-button>
<el-button
link
type="primary"
@ -93,14 +119,6 @@
</el-table-column>
</el-table>
<!-- 添加调试信息显示 -->
<div v-if="breedPlanGenerateList.length === 0 && !loading" style="text-align: center; padding: 20px;">
<p>暂无数据</p>
<p>数据数组长度: {{ breedPlanGenerateList.length }}</p>
<p>总数: {{ total }}</p>
<p>加载状态: {{ loading }}</p>
</div>
<pagination
v-show="total>0"
:total="total"
@ -111,6 +129,22 @@
<!-- 生成配种计划对话框 -->
<el-dialog title="生成配种计划" v-model="generateOpen" width="1200px" append-to-body>
<el-form ref="generateFormRef" :model="generateForm" :rules="generateRules" label-width="120px">
<el-row>
<el-col :span="24">
<el-form-item label="计划类型" prop="planType">
<el-radio-group v-model="generateForm.planType">
<el-radio :label="1">同期发情配种计划</el-radio>
<el-radio :label="2">本交配种计划</el-radio>
</el-radio-group>
<div style="margin-top: 10px; color: #666; font-size: 12px;">
计划名称将自动生成为{{ getCurrentDate() }}{{ getPlanTypeName(generateForm.planType) }}
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-tabs v-model="activeTab" @tab-click="handleTabClick">
<el-tab-pane label="符合条件的母羊" name="ewe">
<el-row :gutter="10" class="mb8">
@ -130,6 +164,7 @@
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="管理耳号" align="center" prop="bs_manage_tags" />
<el-table-column label="品种" align="center" prop="variety" />
<el-table-column label="家系" align="center" prop="family" />
<el-table-column label="羊只类型" align="center" prop="sheep_type" />
<el-table-column label="月龄" align="center" prop="month_age" />
<el-table-column label="当前体重(kg)" align="center" prop="current_weight" />
@ -156,6 +191,7 @@
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="管理耳号" align="center" prop="bs_manage_tags" />
<el-table-column label="品种" align="center" prop="variety" />
<el-table-column label="家系" align="center" prop="family" />
<el-table-column label="羊只类型" align="center" prop="sheep_type" />
<el-table-column label="月龄" align="center" prop="month_age" />
<el-table-column label="当前体重(kg)" align="center" prop="current_weight" />
@ -174,10 +210,106 @@
</template>
</el-dialog>
<!-- 审批配种计划对话框 -->
<el-dialog title="审批配种计划" v-model="approveOpen" width="1400px" append-to-body>
<el-descriptions :column="3" border class="mb8">
<el-descriptions-item label="计划名称">{{ approveData.planInfo.planName }}</el-descriptions-item>
<el-descriptions-item label="计划类型">
<el-tag v-if="approveData.planInfo.planType === 1" type="primary">同期发情配种计划</el-tag>
<el-tag v-else-if="approveData.planInfo.planType === 2" type="success">本交配种计划</el-tag>
</el-descriptions-item>
<el-descriptions-item label="计划日期">{{ approveData.planInfo.planDate }}</el-descriptions-item>
<el-descriptions-item label="母羊数量">{{ approveData.planInfo.totalEweCount }}</el-descriptions-item>
<el-descriptions-item label="公羊数量">{{ approveData.planInfo.totalRamCount }}</el-descriptions-item>
<el-descriptions-item label="配种比例">{{ approveData.planInfo.breedRatio }}</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">配种计划详情可编辑</el-divider>
<el-table
:data="approveData.planDetails"
style="width: 100%"
max-height="500"
border
>
<el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="母羊耳号" align="center" prop="ewe_manage_tags" width="120" />
<el-table-column label="母羊品种" align="center" prop="ewe_variety" width="100" />
<el-table-column label="核心羊群" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.ewe_is_core" type="success"></el-tag>
<el-tag v-else type="info"></el-tag>
</template>
</el-table-column>
<el-table-column label="是否种用" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.ewe_is_breeding" type="success"></el-tag>
<el-tag v-else type="info"></el-tag>
</template>
</el-table-column>
<el-table-column label="详情" align="center" width="80">
<template #default="scope">
<el-button link type="primary" icon="View" @click="showEweDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
<el-table-column label="配种公羊" align="center" width="200">
<template #default="scope">
<el-select
v-model="scope.row.ram_id"
placeholder="选择公羊(可为空)"
@change="handleRamChange(scope.$index, scope.row)"
filterable
clearable
>
<el-option label="不参与配种" :value="null" />
<el-option
v-for="ram in availableRamList"
:key="ram.id"
:label="ram.bs_manage_tags"
:value="ram.id"
/>
</el-select>
<!-- 如果当前选中的公羊不在可选列表中显示当前公羊耳号 -->
<div v-if="scope.row.ram_id && !availableRamList.find(r => r.id == scope.row.ram_id)"
style="font-size: 12px; color: #666; margin-top: 4px;">
当前: {{ scope.row.ram_manage_tags || scope.row.ram_id }}
</div>
</template>
</el-table-column>
<el-table-column label="公羊品种" align="center" prop="ram_variety" width="100" />
<el-table-column label="详情" align="center" width="80">
<template #default="scope">
<el-button
link
type="primary"
icon="View"
@click="showRamDetail(scope.row)"
:disabled="!scope.row.ram_id"
>查看</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button type="success" @click="confirmApprove">确认审批</el-button>
<el-button type="danger" @click="rejectApprove">拒绝审批</el-button>
<el-button @click="approveOpen = false"> </el-button>
</div>
</template>
</el-dialog>
<!-- 查看配种计划详情对话框 -->
<el-dialog title="配种计划详情" v-model="viewOpen" width="1000px" append-to-body>
<el-dialog title="配种计划详情" v-model="viewOpen" width="1200px" append-to-body>
<el-descriptions :column="3" border>
<el-descriptions-item label="计划名称">{{ planInfo.planName }}</el-descriptions-item>
<el-descriptions-item label="计划类型">
<el-tag v-if="planInfo.planType === 1" type="primary">同期发情配种计划</el-tag>
<el-tag v-else-if="planInfo.planType === 2" type="success">本交配种计划</el-tag>
</el-descriptions-item>
<el-descriptions-item label="计划日期">{{ planInfo.planDate }}</el-descriptions-item>
<el-descriptions-item label="状态">
<el-tag v-if="planInfo.status === 0" type="warning">待审批</el-tag>
@ -193,29 +325,90 @@
<el-descriptions-item label="审批人">{{ planInfo.approver }}</el-descriptions-item>
</el-descriptions>
<!-- 只有已审批状态才显示导出按钮 -->
<el-row :gutter="10" class="mb8" style="margin-top: 16px;" v-if="planInfo.status === 1">
<el-col :span="1.5">
<el-button type="success" icon="Download" @click="exportBreedPlanDetails">导出配种计划详情</el-button>
</el-col>
</el-row>
<el-divider content-position="left">配种计划详情</el-divider>
<el-table :data="planDetails" max-height="400">
<el-table-column label="公羊耳号" align="center" prop="ram_manage_tags" />
<el-table-column label="公羊品种" align="center" prop="ram_variety" />
<el-table-column label="母羊耳号" align="center" prop="ewe_manage_tags" />
<el-table-column label="母羊品种" align="center" prop="ewe_variety" />
<el-table-column label="母羊体重" align="center" prop="ewe_weight" />
<el-table-column label="配种类型" align="center" prop="breed_type">
<el-table :data="planDetails" max-height="600" border stripe>
<el-table-column label="序号" type="index" width="60" align="center" />
<el-table-column label="母羊耳号" align="center" prop="ewe_manage_tags" width="120" />
<el-table-column label="母羊品种" align="center" prop="ewe_variety" width="100" />
<el-table-column label="核心羊群" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.breed_type === 1" type="primary">自然交配</el-tag>
<el-tag v-else-if="scope.row.breed_type === 2" type="success">人工授精</el-tag>
<el-tag v-else-if="scope.row.breed_type === 3" type="info">胚胎移植</el-tag>
<el-tag v-if="scope.row.ewe_is_core" type="success"></el-tag>
<el-tag v-else type="info"></el-tag>
</template>
</el-table-column>
<el-table-column label="是否种用" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.ewe_is_breeding" type="success"></el-tag>
<el-tag v-else type="info"></el-tag>
</template>
</el-table-column>
<el-table-column label="母羊详情" align="center" width="100">
<template #default="scope">
<el-button link type="primary" icon="View" @click="showEweDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
<el-table-column label="公羊耳号" align="center" prop="ram_manage_tags" width="120" />
<el-table-column label="公羊品种" align="center" prop="ram_variety" width="100" />
<el-table-column label="公羊详情" align="center" width="100">
<template #default="scope">
<el-button
link
type="primary"
icon="View"
@click="showRamDetail(scope.row)"
:disabled="!scope.row.ram_id"
>查看</el-button>
</template>
</el-table-column>
<el-table-column label="配种类型" align="center" prop="breed_type" width="120">
<template #default="scope">
<el-tag v-if="scope.row.breed_type === 1" type="primary">同期发情</el-tag>
<el-tag v-else-if="scope.row.breed_type === 2" type="success">本交</el-tag>
<el-tag v-else type="warning">未知类型</el-tag>
</template>
</el-table-column>
</el-table>
</el-dialog>
<!-- 羊只详情对话框 -->
<el-dialog :title="sheepDetailTitle" v-model="sheepDetailOpen" width="800px" append-to-body>
<el-descriptions :column="2" border>
<el-descriptions-item label="耳号">{{ sheepDetail.manage_tags }}</el-descriptions-item>
<el-descriptions-item label="品种">{{ sheepDetail.variety }}</el-descriptions-item>
<el-descriptions-item label="家系">{{ sheepDetail.family }}</el-descriptions-item>
<el-descriptions-item label="羊只类别">{{ sheepDetail.sheep_type }}</el-descriptions-item>
<el-descriptions-item label="繁育状态" v-if="sheepDetail.breed_status">{{ sheepDetail.breed_status }}</el-descriptions-item>
<el-descriptions-item label="生日" v-if="sheepDetail.birthday">{{ sheepDetail.birthday }}</el-descriptions-item>
<el-descriptions-item label="月龄">{{ sheepDetail.month_age }}</el-descriptions-item>
<el-descriptions-item label="当前体重">{{ sheepDetail.current_weight }}kg</el-descriptions-item>
<el-descriptions-item label="胎次" v-if="sheepDetail.parity">{{ sheepDetail.parity }}</el-descriptions-item>
<el-descriptions-item label="是否核心羊群" v-if="sheepDetail.is_core !== undefined">
<el-tag v-if="sheepDetail.is_core" type="success"></el-tag>
<el-tag v-else type="info"></el-tag>
</el-descriptions-item>
<el-descriptions-item label="是否种用" v-if="sheepDetail.is_breeding !== undefined">
<el-tag v-if="sheepDetail.is_breeding" type="success"></el-tag>
<el-tag v-else type="info"></el-tag>
</el-descriptions-item>
<el-descriptions-item label="羊舍" v-if="sheepDetail.sheepfold_name">{{ sheepDetail.sheepfold_name }}</el-descriptions-item>
<el-descriptions-item label="备注" v-if="sheepDetail.comment">{{ sheepDetail.comment }}</el-descriptions-item>
<el-descriptions-item label="繁殖情况" v-if="sheepDetail.reproduction_info">{{ sheepDetail.reproduction_info }}</el-descriptions-item>
</el-descriptions>
</el-dialog>
</div>
</template>
<script setup name="BreedPlanGenerate">
import {ref, reactive, toRefs, onMounted} from 'vue'
import {getCurrentInstance} from 'vue'
import {ref, reactive, toRefs, onMounted, getCurrentInstance} from 'vue'
import {
listBreedPlanGenerate,
getBreedPlanGenerate,
@ -223,28 +416,31 @@ import {
selectEligibleEwe as apiSelectEligibleEwe,
selectEligibleRam as apiSelectEligibleRam,
autoGenerateBreedPlan,
approveBreedPlan,
getApproveBreedPlan,
confirmApproveBreedPlan,
viewBreedPlan
} from "@/api/mating_plan/generate"
const {proxy} = getCurrentInstance()
// - 使 proxy.useDict
const dict = proxy.useDict ? proxy.useDict('breed_plan_status', 'breed_type') : {
type: {
breed_plan_status: [],
breed_type: []
}
}
const breedPlanGenerateList = ref([])
const eligibleEweList = ref([])
const eligibleRamList = ref([])
const availableRamList = ref([])
const selectedEwe = ref([])
const selectedRam = ref([])
const planInfo = ref({})
const planDetails = ref([])
const approveData = ref({
planInfo: {},
planDetails: []
})
const sheepDetail = ref({})
const sheepDetailTitle = ref('')
const generateOpen = ref(false)
const viewOpen = ref(false)
const approveOpen = ref(false)
const sheepDetailOpen = ref(false)
const loading = ref(true)
const eweLoading = ref(false)
const ramLoading = ref(false)
@ -253,36 +449,36 @@ const ids = ref([])
const multiple = ref(true)
const total = ref(0)
const activeTab = ref('ewe')
const dateRange = ref([])
const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
planName: null,
status: null
planType: null,
status: null,
params: {}
},
generateForm: {
planType: 1
},
generateRules: {
planType: [
{ required: true, message: '请选择计划类型', trigger: 'change' }
]
}
})
const {queryParams} = toRefs(data)
const {queryParams, generateForm, generateRules} = toRefs(data)
/** 查询配种计划生成列表 */
function getList() {
loading.value = true
console.log('开始获取配种计划列表...')
console.log('查询参数:', queryParams.value)
listBreedPlanGenerate(queryParams.value).then(response => {
console.log('API完整响应:', response)
// API
breedPlanGenerateList.value = response.rows || []
total.value = response.total || 0
loading.value = false
console.log('处理后的数据列表:', breedPlanGenerateList.value)
console.log('数据列表长度:', breedPlanGenerateList.value.length)
console.log('总数:', total.value)
}).catch(error => {
console.error('获取列表失败:', error)
loading.value = false
@ -299,10 +495,36 @@ function handleQuery() {
/** 重置按钮操作 */
function resetQuery() {
dateRange.value = []
queryParams.value.params = {}
proxy.resetForm("queryRef")
handleQuery()
}
/** 日期范围变化处理 */
function handleDateRangeChange(dates) {
if (dates && dates.length === 2) {
queryParams.value.params.beginTime = dates[0]
queryParams.value.params.endTime = dates[1]
} else {
queryParams.value.params = {}
}
}
/** 获取当前日期 */
function getCurrentDate() {
const today = new Date()
const year = today.getFullYear()
const month = String(today.getMonth() + 1).padStart(2, '0')
const day = String(today.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
}
/** 获取计划类型名称 */
function getPlanTypeName(planType) {
return planType === 1 ? '同期发情配种计划' : '本交配种计划'
}
//
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.id)
@ -327,6 +549,7 @@ function handleTabClick(tab) {
/** 生成配种计划按钮操作 */
function handleGenerate() {
generateOpen.value = true
generateForm.value.planType = 1
selectedEwe.value = []
selectedRam.value = []
eligibleEweList.value = []
@ -353,36 +576,43 @@ function selectEligibleRam() {
/** 生成配种计划 */
function generateBreedPlan() {
if (selectedEwe.value.length === 0) {
proxy.$modal.msgError("请选择母羊")
return
}
if (selectedRam.value.length === 0) {
proxy.$modal.msgError("请选择公羊")
return
}
proxy.$refs.generateFormRef.validate((valid) => {
if (!valid) return
const params = {
eweIds: selectedEwe.value,
ramIds: selectedRam.value
}
if (selectedEwe.value.length === 0) {
proxy.$modal.msgError("请选择母羊")
return
}
if (selectedRam.value.length === 0) {
proxy.$modal.msgError("请选择公羊")
return
}
autoGenerateBreedPlan(params).then(response => {
proxy.$modal.msgSuccess("配种计划生成成功")
generateOpen.value = false
//
getList()
//
selectedEwe.value = []
selectedRam.value = []
eligibleEweList.value = []
eligibleRamList.value = []
}).catch(error => {
console.error('生成配种计划失败:', error)
proxy.$modal.msgError("生成配种计划失败")
const params = {
planType: generateForm.value.planType,
eweIds: selectedEwe.value,
ramIds: selectedRam.value
}
autoGenerateBreedPlan(params).then(response => {
proxy.$modal.msgSuccess("配种计划生成成功")
generateOpen.value = false
getList()
//
generateForm.value = { planType: 1 }
selectedEwe.value = []
selectedRam.value = []
eligibleEweList.value = []
eligibleRamList.value = []
}).catch(error => {
console.error('生成配种计划失败:', error)
proxy.$modal.msgError("生成配种计划失败")
})
})
}
/** 查看配种计划详情 */
function handleView(row) {
viewBreedPlan(row.id).then(response => {
@ -394,14 +624,143 @@ function handleView(row) {
/** 审批配种计划 */
function handleApprove(row) {
proxy.$modal.confirm('是否确认审批通过配种计划"' + row.planName + '"').then(function () {
return approveBreedPlan(row.id)
getApproveBreedPlan(row.id).then(response => {
approveData.value = response.data
availableRamList.value = response.data.availableRams || []
// ID
if (approveData.value.planDetails) {
approveData.value.planDetails.forEach(detail => {
// ram_id
if (detail.ram_id && typeof detail.ram_id === 'string') {
detail.ram_id = parseInt(detail.ram_id, 10)
}
//
if (detail.ram_id && detail.ram_manage_tags &&
!availableRamList.value.find(ram => ram.id === detail.ram_id)) {
availableRamList.value.push({
id: detail.ram_id,
bs_manage_tags: detail.ram_manage_tags
})
}
})
}
approveOpen.value = true
})
}
/** 公羊选择变化处理 */
function handleRamChange(index, row) {
if (row.ram_id === null) {
//
row.ram_manage_tags = ''
row.ram_variety = ''
row.ram_family = ''
row.ram_sheep_type = ''
row.ram_birthday = ''
row.ram_month_age = ''
row.ram_current_weight = ''
row.breed_type = null
} else {
// ram_id
const ramId = typeof row.ram_id === 'string' ? parseInt(row.ram_id, 10) : row.ram_id
const selectedRam = availableRamList.value.find(ram => ram.id === ramId)
if (selectedRam) {
row.ram_manage_tags = selectedRam.bs_manage_tags
row.ram_variety = selectedRam.variety
row.ram_family = selectedRam.family
row.ram_sheep_type = selectedRam.sheep_type
row.ram_birthday = selectedRam.birthday
row.ram_month_age = selectedRam.month_age
row.ram_current_weight = selectedRam.current_weight
//
if (!row.breed_type) {
row.breed_type = 1 //
}
}
}
}
/** 显示母羊详情 */
function showEweDetail(row) {
sheepDetail.value = {
manage_tags: row.ewe_manage_tags,
variety: row.ewe_variety,
family: row.ewe_family,
sheep_type: row.ewe_sheep_type,
breed_status: row.ewe_breed_status,
parity: row.ewe_parity,
month_age: row.ewe_month_age,
current_weight: row.ewe_current_weight,
is_core: row.ewe_is_core,
is_breeding: row.ewe_is_breeding,
sheepfold_name: row.ewe_sheepfold_name,
comment: row.ewe_comment,
reproduction_info: row.ewe_reproduction_info
}
sheepDetailTitle.value = '母羊详情'
sheepDetailOpen.value = true
}
/** 显示公羊详情 */
function showRamDetail(row) {
if (!row.ram_id) {
proxy.$modal.msgWarning("该母羊未分配公羊")
return
}
sheepDetail.value = {
manage_tags: row.ram_manage_tags,
variety: row.ram_variety,
family: row.ram_family,
sheep_type: row.ram_sheep_type,
birthday: row.ram_birthday,
month_age: row.ram_month_age,
current_weight: row.ram_current_weight
}
sheepDetailTitle.value = '公羊详情'
sheepDetailOpen.value = true
}
/** 确认审批 */
function confirmApprove() {
proxy.$modal.confirm('确认审批通过此配种计划?').then(function () {
const params = {
planId: approveData.value.planInfo.id,
planDetails: approveData.value.planDetails,
status: 1,
approveRemark: '审批通过'
}
return confirmApproveBreedPlan(params)
}).then(() => {
proxy.$modal.msgSuccess("审批成功")
//
approveOpen.value = false
getList()
}).catch(() => {
})
}).catch(() => {})
}
/** 拒绝审批 */
function rejectApprove() {
proxy.$modal.prompt('请输入拒绝原因', '拒绝审批', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /.+/,
inputErrorMessage: '拒绝原因不能为空'
}).then(({ value }) => {
const params = {
planId: approveData.value.planInfo.id,
status: 2,
approveRemark: value
}
return confirmApproveBreedPlan(params)
}).then(() => {
proxy.$modal.msgSuccess("已拒绝审批")
approveOpen.value = false
getList()
}).catch(() => {})
}
/** 删除按钮操作 */
@ -411,18 +770,35 @@ function handleDelete(row) {
return delBreedPlanGenerate(_ids)
}).then(() => {
proxy.$modal.msgSuccess("删除成功")
//
getList()
}).catch(() => {
})
}).catch(() => {})
}
/** 导出配种计划详情 */
function exportBreedPlanDetails() {
if (!planInfo.value || !planDetails.value || planDetails.value.length === 0) {
proxy.$modal.msgError("暂无数据可导出")
return
}
//
if (planInfo.value.status !== 1) {
proxy.$modal.msgError("只有已审批的配种计划才能导出")
return
}
// 使proxy.download
proxy.download(`/mating_plan/generate/export/${planInfo.value.id}`, {}, `${planInfo.value.planName}_配种计划详情_${new Date().getTime()}.xlsx`)
}
//
onMounted(() => {
console.log('配种计划生成页面已挂载')
getList()
})
</script>
//
getList()
</script>
<style scoped>
.mb8 {
margin-bottom: 8px;
}
</style>

View File

@ -3,18 +3,18 @@
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="公羊id" prop="ramId">
<el-input
v-model="queryParams.ramId"
placeholder="请输入公羊id"
clearable
@keyup.enter="handleQuery"
v-model="queryParams.ramId"
placeholder="请输入公羊id"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="母羊id" prop="eweId">
<el-input
v-model="queryParams.eweId"
placeholder="请输入母羊id"
clearable
@keyup.enter="handleQuery"
v-model="queryParams.eweId"
placeholder="请输入母羊id"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
@ -26,40 +26,40 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['mating_plan:mating_plan:add']"
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['mating_plan:mating_plan:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['mating_plan:mating_plan:edit']"
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['mating_plan:mating_plan:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['mating_plan:mating_plan:remove']"
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['mating_plan:mating_plan:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['mating_plan:mating_plan:export']"
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['mating_plan:mating_plan:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
@ -67,10 +67,17 @@
<el-table v-loading="loading" :data="mating_planList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="${comment}" align="center" prop="id" />
<el-table-column label="配种计划ID" align="center" prop="id" />
<el-table-column label="公羊id" align="center" prop="ramId" />
<el-table-column label="母羊id" align="center" prop="eweId" />
<el-table-column label="配种类型" align="center" prop="breedType" />
<el-table-column label="配种类型" align="center" prop="breedType">
<template #default="scope">
<el-tag v-if="scope.row.breedType === 1" type="primary">自然交配</el-tag>
<el-tag v-else-if="scope.row.breedType === 2" type="success">人工授精</el-tag>
<el-tag v-else-if="scope.row.breedType === 3" type="info">胚胎移植</el-tag>
<el-tag v-else type="warning">未知类型</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['mating_plan:mating_plan:edit']">修改</el-button>
@ -80,11 +87,11 @@
</el-table>
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改配种计划对话框 -->
@ -96,6 +103,13 @@
<el-form-item label="母羊id" prop="eweId">
<el-input v-model="form.eweId" placeholder="请输入母羊id" />
</el-form-item>
<el-form-item label="配种类型" prop="breedType">
<el-select v-model="form.breedType" placeholder="请选择配种类型">
<el-option label="自然交配" :value="1"></el-option>
<el-option label="人工授精" :value="2"></el-option>
<el-option label="胚胎移植" :value="3"></el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
@ -108,6 +122,7 @@
</template>
<script setup name="Mating_plan">
import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue'
import { listMating_plan, getMating_plan, delMating_plan, addMating_plan, updateMating_plan } from "@/api/mating_plan/mating_plan"
const { proxy } = getCurrentInstance()
@ -132,6 +147,15 @@ const data = reactive({
breedType: null
},
rules: {
ramId: [
{ required: true, message: "公羊id不能为空", trigger: "blur" }
],
eweId: [
{ required: true, message: "母羊id不能为空", trigger: "blur" }
],
breedType: [
{ required: true, message: "配种类型不能为空", trigger: "change" }
]
}
})
@ -141,9 +165,14 @@ const { queryParams, form, rules } = toRefs(data)
function getList() {
loading.value = true
listMating_plan(queryParams.value).then(response => {
mating_planList.value = response.rows
total.value = response.total
mating_planList.value = response.rows || []
total.value = response.total || 0
loading.value = false
}).catch(error => {
console.error('获取列表失败:', error)
loading.value = false
mating_planList.value = []
total.value = 0
})
}
@ -240,5 +269,14 @@ function handleExport() {
}, `mating_plan_${new Date().getTime()}.xlsx`)
}
getList()
//
onMounted(() => {
getList()
})
</script>
<style scoped>
.mb8 {
margin-bottom: 8px;
}
</style>