diff --git a/src/components/PenForm.vue b/src/components/PenForm.vue index cf02a697..2a6bab5a 100644 --- a/src/components/PenForm.vue +++ b/src/components/PenForm.vue @@ -49,7 +49,7 @@ export default { }, penData: { type: Object, - default: () => ({}) // 改为非必需,并提供默认值 + required: true }, isEdit: { type: Boolean, @@ -90,6 +90,9 @@ export default { const handleClose = () => { emit('update:visible', false); emit('cancel'); + nextTick(() => { + formRef.value?.resetFields(); + }); }; const handleSubmit = async () => { @@ -98,14 +101,15 @@ export default { if (valid) { loading.value = true; try { + let response; if (props.isEdit) { const { id, ...updateData } = formData; - await updatePen(id, updateData); + response = await updatePen(id, updateData); } else { const { id, status, ...createData } = formData; - await createPen(createData); + response = await createPen(createData); } - emit('success'); + emit('success', response.data); handleClose(); } catch (error) { ElMessage.error((props.isEdit ? '更新' : '创建') + '猪栏失败: ' + (error.message || '未知错误')); @@ -118,23 +122,15 @@ export default { watch(() => props.visible, (newVal) => { if (newVal) { - // 重置表单以适应新数据 Object.assign(formData, initialFormData()); if (props.isEdit && props.penData) { - // 编辑模式:填充数据 Object.assign(formData, props.penData); } else if (props.penData) { - // 添加模式:只设置 house_id formData.house_id = props.penData.house_id; } nextTick(() => { formRef.value?.clearValidate(); }); - } else { - // 对话框关闭时重置表单 - nextTick(() => { - formRef.value?.resetFields(); - }); } }); diff --git a/src/components/PigHouseForm.vue b/src/components/PigHouseForm.vue index 08ad205a..d8e807a5 100644 --- a/src/components/PigHouseForm.vue +++ b/src/components/PigHouseForm.vue @@ -88,12 +88,13 @@ export default { loading.value = true; try { const submitData = { name: formData.name, description: formData.description }; + let response; if (props.isEdit) { - await updatePigHouse(formData.id, submitData); + response = await updatePigHouse(formData.id, submitData); } else { - await createPigHouse(submitData); + response = await createPigHouse(submitData); } - emit('success'); + emit('success', response.data); handleClose(); } catch (error) { ElMessage.error((props.isEdit ? '更新' : '创建') + '猪舍失败: ' + (error.message || '未知错误')); diff --git a/src/views/pms/PigFarmManagementView.vue b/src/views/pms/PigFarmManagementView.vue index a2ac7f9e..6bf5d9be 100644 --- a/src/views/pms/PigFarmManagementView.vue +++ b/src/views/pms/PigFarmManagementView.vue @@ -97,6 +97,8 @@ export default { penDialogVisible: false, isEditPen: false, currentPen: {}, + // 批次映射,用于本地组装猪栏的批次名称 + batchMap: new Map(), }; }, async mounted() { @@ -117,6 +119,9 @@ export default { const pens = Array.isArray(pensResponse.data) ? pensResponse.data : []; const batches = Array.isArray(batchesResponse.data) ? batchesResponse.data : []; + // 更新 batchMap + this.batchMap = new Map(batches.map(batch => [batch.id, batch.batch_number])); + this.pigHousesData = this.assembleData(houses, pens, batches); } catch (err) { this.error = err.message || '无法获取数据'; @@ -125,15 +130,20 @@ export default { this.loading = false; } }, - assembleData(houses, pens, batches) { - const batchMap = new Map(batches.map(batch => [batch.id, batch.batch_number])); - const houseMap = new Map(houses.map(house => [house.id, { ...house, pens: [], isExpanded: false }])); + assembleData(houses, pens) { + // 此时 houses 和 pens 已确保是数组,batches 已经更新到 this.batchMap + const houseMap = new Map(); + houses.forEach(house => { + // 确保保留 isExpanded 状态 + const existingHouse = this.pigHousesData.find(h => h.id === house.id); + houseMap.set(house.id, { ...house, pens: [], isExpanded: existingHouse ? existingHouse.isExpanded : false }); + }); for (const pen of pens) { if (houseMap.has(pen.house_id)) { const penWithBatch = { ...pen, - batch_number: batchMap.get(pen.pig_batch_id) || null + batch_number: this.batchMap.get(pen.pig_batch_id) || null }; houseMap.get(pen.house_id).pens.push(penWithBatch); } @@ -160,7 +170,8 @@ export default { }); await deletePigHouse(house.id); this.$message.success('删除成功'); - await this.loadData(); + // 本地更新数据,不重新加载全部 + this.pigHousesData = this.pigHousesData.filter(h => h.id !== house.id); } catch (err) { if (err !== 'cancel') { this.$message.error('删除失败: ' + (err.message || '未知错误')); @@ -168,9 +179,22 @@ export default { } } }, - async handleHouseSuccess() { + handleHouseSuccess(newHouseData) { this.houseDialogVisible = false; - await this.loadData(); + if (this.isEditHouse) { + // 更新现有猪舍 + const index = this.pigHousesData.findIndex(h => h.id === newHouseData.id); + if (index !== -1) { + // 保留 pens 和 isExpanded 状态 + const existingHouse = this.pigHousesData[index]; + this.pigHousesData[index] = { ...newHouseData, pens: existingHouse.pens, isExpanded: existingHouse.isExpanded }; + } + this.$message.success('猪舍更新成功'); + } else { + // 添加新猪舍 + this.pigHousesData.push({ ...newHouseData, pens: [], isExpanded: false }); + this.$message.success('猪舍添加成功'); + } }, // --- 猪栏操作 --- handleAddPen(house) { @@ -192,7 +216,11 @@ export default { }); await deletePen(pen.id); this.$message.success('删除成功'); - await this.loadData(); + // 本地更新数据,不重新加载全部 + const house = this.pigHousesData.find(h => h.id === pen.house_id); + if (house) { + house.pens = house.pens.filter(p => p.id !== pen.id); + } } catch (err) { if (err !== 'cancel') { this.$message.error('删除失败: ' + (err.message || '未知错误')); @@ -200,9 +228,29 @@ export default { } } }, - async handlePenSuccess() { + handlePenSuccess(newPenData) { this.penDialogVisible = false; - await this.loadData(); + // 为新猪栏数据添加 batch_number + const penWithBatch = { + ...newPenData, + batch_number: this.batchMap.get(newPenData.pig_batch_id) || null + }; + + const house = this.pigHousesData.find(h => h.id === penWithBatch.house_id); + if (house) { + if (this.isEditPen) { + // 更新现有猪栏 + const index = house.pens.findIndex(p => p.id === penWithBatch.id); + if (index !== -1) { + house.pens[index] = penWithBatch; + } + this.$message.success('猪栏更新成功'); + } else { + // 添加新猪栏 + house.pens.push(penWithBatch); + this.$message.success('猪栏添加成功'); + } + } } } }