实现功能

This commit is contained in:
2025-11-22 19:30:24 +08:00
parent 55a3dbd1d5
commit f7f95b4241
2 changed files with 72 additions and 12 deletions

View File

@@ -142,6 +142,8 @@
v-if="showPigTypeDialog" v-if="showPigTypeDialog"
:initialData="currentPigType" :initialData="currentPigType"
:breedId="currentBreedIdForPigType" :breedId="currentBreedIdForPigType"
:isEditing="isEditingPigType"
:existingAgeStageIds="getExistingAgeStageIds(currentBreedIdForPigType)"
@save="handlePigTypeSave" @save="handlePigTypeSave"
@cancel="handlePigTypeCancel" @cancel="handlePigTypeCancel"
></PigTypeEditor> ></PigTypeEditor>
@@ -320,11 +322,17 @@ export default {
showNutrientDialog.value = false; showNutrientDialog.value = false;
}; };
// 获取当前品种已有的年龄阶段ID列表
const getExistingAgeStageIds = (breedId) => {
const breed = tableData.value.find(item => item.id === breedId);
return breed && breed.pig_types ? breed.pig_types.map(pt => pt.age_stage_id) : [];
};
// 处理添加年龄阶段 // 处理添加年龄阶段
const handleAddPigType = (breedId) => { const handleAddPigType = (breedId) => {
isEditingPigType.value = false; isEditingPigType.value = false;
currentPigType.value = { // 初始化新年龄阶段的数据 currentPigType.value = { // 初始化新年龄阶段的数据
age_stage_name: '', age_stage_id: null, // age_stage_id 默认为 null由下拉框选择
description: '', description: '',
min_days: 0, min_days: 0,
max_days: 0, max_days: 0,
@@ -360,7 +368,7 @@ export default {
await FeedApi.deletePigType(pigType.id); await FeedApi.deletePigType(pigType.id);
ElMessage.success('年龄阶段删除成功'); ElMessage.success('年龄阶段删除成功');
// 刷新当前展开行的 pig_types 数据 // 刷新当前展开行的 pig_types 数据
const expandedRow = tableData.value.find(item => expandRowKeys.value.includes(item.breed_id)); const expandedRow = tableData.value.find(item => expandRowKeys.value.includes(pigType.breed_id));
if (expandedRow) { if (expandedRow) {
await handleExpandChange(expandedRow, [expandedRow]); await handleExpandChange(expandedRow, [expandedRow]);
} }
@@ -420,6 +428,7 @@ export default {
handleAddPigType, handleAddPigType,
handleEditPigType, handleEditPigType,
handleDeletePigType, handleDeletePigType,
getExistingAgeStageIds, // 暴露给模板
handleNutrientRequirementsRefresh, // 暴露给模板 handleNutrientRequirementsRefresh, // 暴露给模板
handlePigTypeSave, handlePigTypeSave,
handlePigTypeCancel, handlePigTypeCancel,

View File

@@ -1,8 +1,16 @@
<template> <template>
<div class="pig-type-editor"> <div class="pig-type-editor">
<el-form :model="formData" ref="formRef" label-width="120px"> <el-form :model="formData" ref="formRef" label-width="120px">
<el-form-item label="年龄阶段名称" prop="age_stage_name" :rules="[{ required: true, message: '请输入年龄阶段名称', trigger: 'blur' }]"> <el-form-item label="年龄阶段" prop="age_stage_id" :rules="[{ required: true, message: '请选择年龄阶段', trigger: 'change' }]">
<el-input v-model="formData.age_stage_name"></el-input> <el-select v-model="formData.age_stage_id" placeholder="请选择年龄阶段" filterable style="width: 100%;">
<el-option
v-for="item in ageStages"
:key="item.id"
:label="item.name"
:value="item.id"
:disabled="!isEditing && existingAgeStageIds.includes(item.id)"
></el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="描述" prop="description"> <el-form-item label="描述" prop="description">
<el-input type="textarea" v-model="formData.description"></el-input> <el-input type="textarea" v-model="formData.description"></el-input>
@@ -35,35 +43,61 @@
</template> </template>
<script> <script>
import { ref, watch } from 'vue'; import { ref, watch, onMounted } from 'vue';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { FeedApi } from '../../api/feed'; // Assuming FeedApi has createPigType and updatePigType import { FeedApi } from '../../api/feed';
export default { export default {
name: 'PigTypeEditor', name: 'PigTypeEditor',
props: { props: {
initialData: { initialData: {
type: Object, type: Object,
default: () => ({}), default: () => ({
age_stage_id: null, // 确保默认值是 null
}),
}, },
breedId: { breedId: {
type: Number, type: Number,
required: true, required: true,
}, },
// 新增一个 prop 来接收当前品种已有的 age_stage_id 列表
// 用于在添加模式下禁用已选择的年龄阶段
existingAgeStageIds: {
type: Array,
default: () => [],
},
// 新增一个 prop 来指示是否是编辑模式
isEditing: {
type: Boolean,
default: false,
},
}, },
emits: ['save', 'cancel'], emits: ['save', 'cancel'],
setup(props, { emit }) { setup(props, { emit }) {
const formRef = ref(null); const formRef = ref(null);
const formData = ref({}); const formData = ref({});
const ageStages = ref([]); // 用于存储所有年龄阶段列表
watch(() => props.initialData, (newData) => { watch(() => props.initialData, (newData) => {
// 复制一份数据避免直接修改props // 复制一份数据避免直接修改props
formData.value = { ...newData }; formData.value = { ...newData };
// 如果是添加模式age_stage_id 应该为 null
if (!props.isEditing) {
formData.value.age_stage_id = null;
}
// 将克转换为公斤显示 // 将克转换为公斤显示
if (formData.value.min_weight) formData.value.min_weight /= 1000; if (formData.value.min_weight !== undefined && formData.value.min_weight !== null) formData.value.min_weight /= 1000;
if (formData.value.max_weight) formData.value.max_weight /= 1000; if (formData.value.max_weight !== undefined && formData.value.max_weight !== null) formData.value.max_weight /= 1000;
if (formData.value.daily_gain_weight) formData.value.daily_gain_weight /= 1000; if (formData.value.daily_gain_weight !== undefined && formData.value.daily_gain_weight !== null) formData.value.daily_gain_weight /= 1000;
if (formData.value.daily_feed_intake) formData.value.daily_feed_intake /= 1000; if (formData.value.daily_feed_intake !== undefined && formData.value.daily_feed_intake !== null) formData.value.daily_feed_intake /= 1000;
// 确保所有重量字段都有默认值,避免 NaN
formData.value.min_weight = formData.value.min_weight || 0;
formData.value.max_weight = formData.value.max_weight || 0;
formData.value.daily_gain_weight = formData.value.daily_gain_weight || 0;
formData.value.daily_feed_intake = formData.value.daily_feed_intake || 0;
}, { immediate: true, deep: true }); }, { immediate: true, deep: true });
const handleSave = () => { const handleSave = () => {
@@ -72,7 +106,7 @@ export default {
try { try {
const dataToSave = { const dataToSave = {
breed_id: props.breedId, breed_id: props.breedId,
age_stage_name: formData.value.age_stage_name, age_stage_id: formData.value.age_stage_id,
description: formData.value.description, description: formData.value.description,
min_days: formData.value.min_days, min_days: formData.value.min_days,
max_days: formData.value.max_days, max_days: formData.value.max_days,
@@ -103,9 +137,26 @@ export default {
emit('cancel'); emit('cancel');
}; };
// 获取所有年龄阶段列表
const fetchAgeStages = async () => {
try {
const response = await FeedApi.getPigAgeStages({ page: 1, page_size: 999 }); // 明确传递 page: 1
if (response.data && response.data.list) {
ageStages.value = response.data.list;
}
} catch (error) {
ElMessage.error('获取年龄阶段列表失败');
}
};
onMounted(() => {
fetchAgeStages();
});
return { return {
formRef, formRef,
formData, formData,
ageStages,
handleSave, handleSave,
handleCancel, handleCancel,
}; };