实现功能

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"
:initialData="currentPigType"
:breedId="currentBreedIdForPigType"
:isEditing="isEditingPigType"
:existingAgeStageIds="getExistingAgeStageIds(currentBreedIdForPigType)"
@save="handlePigTypeSave"
@cancel="handlePigTypeCancel"
></PigTypeEditor>
@@ -320,11 +322,17 @@ export default {
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) => {
isEditingPigType.value = false;
currentPigType.value = { // 初始化新年龄阶段的数据
age_stage_name: '',
age_stage_id: null, // age_stage_id 默认为 null由下拉框选择
description: '',
min_days: 0,
max_days: 0,
@@ -360,7 +368,7 @@ export default {
await FeedApi.deletePigType(pigType.id);
ElMessage.success('年龄阶段删除成功');
// 刷新当前展开行的 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) {
await handleExpandChange(expandedRow, [expandedRow]);
}
@@ -420,6 +428,7 @@ export default {
handleAddPigType,
handleEditPigType,
handleDeletePigType,
getExistingAgeStageIds, // 暴露给模板
handleNutrientRequirementsRefresh, // 暴露给模板
handlePigTypeSave,
handlePigTypeCancel,

View File

@@ -1,8 +1,16 @@
<template>
<div class="pig-type-editor">
<el-form :model="formData" ref="formRef" label-width="120px">
<el-form-item label="年龄阶段名称" prop="age_stage_name" :rules="[{ required: true, message: '请输入年龄阶段名称', trigger: 'blur' }]">
<el-input v-model="formData.age_stage_name"></el-input>
<el-form-item label="年龄阶段" prop="age_stage_id" :rules="[{ required: true, message: '请选择年龄阶段', trigger: 'change' }]">
<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 label="描述" prop="description">
<el-input type="textarea" v-model="formData.description"></el-input>
@@ -35,35 +43,61 @@
</template>
<script>
import { ref, watch } from 'vue';
import { ref, watch, onMounted } from 'vue';
import { ElMessage } from 'element-plus';
import { FeedApi } from '../../api/feed'; // Assuming FeedApi has createPigType and updatePigType
import { FeedApi } from '../../api/feed';
export default {
name: 'PigTypeEditor',
props: {
initialData: {
type: Object,
default: () => ({}),
default: () => ({
age_stage_id: null, // 确保默认值是 null
}),
},
breedId: {
type: Number,
required: true,
},
// 新增一个 prop 来接收当前品种已有的 age_stage_id 列表
// 用于在添加模式下禁用已选择的年龄阶段
existingAgeStageIds: {
type: Array,
default: () => [],
},
// 新增一个 prop 来指示是否是编辑模式
isEditing: {
type: Boolean,
default: false,
},
},
emits: ['save', 'cancel'],
setup(props, { emit }) {
const formRef = ref(null);
const formData = ref({});
const ageStages = ref([]); // 用于存储所有年龄阶段列表
watch(() => props.initialData, (newData) => {
// 复制一份数据避免直接修改props
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.max_weight) formData.value.max_weight /= 1000;
if (formData.value.daily_gain_weight) formData.value.daily_gain_weight /= 1000;
if (formData.value.daily_feed_intake) formData.value.daily_feed_intake /= 1000;
if (formData.value.min_weight !== undefined && formData.value.min_weight !== null) formData.value.min_weight /= 1000;
if (formData.value.max_weight !== undefined && formData.value.max_weight !== null) formData.value.max_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 !== 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 });
const handleSave = () => {
@@ -72,7 +106,7 @@ export default {
try {
const dataToSave = {
breed_id: props.breedId,
age_stage_name: formData.value.age_stage_name,
age_stage_id: formData.value.age_stage_id,
description: formData.value.description,
min_days: formData.value.min_days,
max_days: formData.value.max_days,
@@ -103,9 +137,26 @@ export default {
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 {
formRef,
formData,
ageStages,
handleSave,
handleCancel,
};