Files
pig-farm-controller-fe/src/components/TransferPigsAcrossBatchesModal.vue
2025-10-24 14:23:58 +08:00

205 lines
7.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-dialog
title="跨群调栏"
:model-value="visible"
@update:model-value="$emit('update:visible', $event)"
width="40%"
@close="resetForm"
>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="源猪群批次">
<span>{{ batch.batch_number }}</span>
</el-form-item>
<el-form-item label="源猪栏" prop="fromPenID">
<el-select v-model="form.fromPenID" placeholder="请选择源猪栏" style="width: 100%;">
<el-option
v-for="pen in sourcePens"
:key="pen.id"
:label="`${pen.pen_number} (存栏: ${pen.current_pig_count})`"
:value="pen.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="目标猪群批次" prop="destBatchID">
<el-select v-model="form.destBatchID" placeholder="请选择目标猪群" style="width: 100%;" @change="onDestBatchChange">
<el-option
v-for="b in availableBatches"
:key="b.id"
:label="b.batch_number"
:value="b.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="目标猪栏" prop="toPenID">
<el-select v-model="form.toPenID" placeholder="请选择目标猪栏" style="width: 100%;">
<el-option
v-for="pen in destinationPens"
:key="pen.id"
:label="`${pen.pen_number} (容量: ${pen.capacity})`"
:value="pen.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="调栏数量" prop="quantity">
<el-input-number v-model="form.quantity" :min="1" :max="maxTransferQuantity" />
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" type="textarea" :rows="2" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="$emit('update:visible', false)"> </el-button>
<el-button type="primary" @click="handleConfirm"> </el-button>
</span>
</template>
</el-dialog>
</template>
<script>
import { getPigBatches, transferPigsAcrossBatches } from '@/api/pigBatch';
import { getPens } from '@/api/pen';
export default {
name: 'TransferPigsAcrossBatchesModal',
props: {
visible: {
type: Boolean,
required: true
},
batch: {
type: Object,
required: true // 源猪群批次信息
}
},
emits: ['update:visible', 'success'],
data() {
return {
form: {
fromPenID: null,
destBatchID: null,
toPenID: null,
quantity: 1,
remarks: ''
},
rules: {
fromPenID: [{ required: true, message: '请选择源猪栏', trigger: 'change' }],
destBatchID: [{ required: true, message: '请选择目标猪群批次', trigger: 'change' }],
toPenID: [{ required: true, message: '请选择目标猪栏', trigger: 'change' }],
quantity: [
{ required: true, message: '请输入调栏数量', trigger: 'blur' },
{ type: 'integer', message: '请输入整数', trigger: 'blur' },
{ validator: this.validateQuantity, trigger: 'blur' }
]
},
sourcePens: [], // 源猪群的猪栏列表
availableBatches: [], // 可用的目标猪群列表
destinationPens: [], // 目标猪群的猪栏列表
maxTransferQuantity: 1 // 最大可调栏数量
};
},
watch: {
visible(newVal) {
if (newVal) {
this.initData();
}
},
'form.fromPenID': function(newVal) {
if (newVal) {
const selectedPen = this.sourcePens.find(pen => pen.id === newVal);
this.maxTransferQuantity = selectedPen ? selectedPen.current_pig_count : 1;
// 如果当前数量大于最大值,重置数量
if (this.form.quantity > this.maxTransferQuantity) {
this.form.quantity = this.maxTransferQuantity;
}
}
}
},
methods: {
async initData() {
this.resetForm();
this.sourcePens = this.batch.pens.filter(pen => pen.current_pig_count > 0); // 过滤掉没有猪的猪栏
await this.fetchAvailableBatchesAndPens();
},
async fetchAvailableBatchesAndPens() {
try {
const [batchesResponse, pensResponse] = await Promise.all([
getPigBatches({ is_active: true }), // 获取所有活跃猪群
getPens() // 获取所有猪栏
]);
const allBatches = batchesResponse.data || [];
const allPens = pensResponse.data || [];
// 过滤掉源猪群自身,以及非活跃的猪群
this.availableBatches = allBatches.filter(b => b.id !== this.batch.id && b.is_active);
// 将所有猪栏按批次ID分组方便后续查找
const pensByBatch = allPens.reduce((acc, pen) => {
if (pen.pig_batch_id) {
if (!acc[pen.pig_batch_id]) {
acc[pen.pig_batch_id] = [];
}
acc[pen.pig_batch_id].push(pen);
}
return acc;
}, {});
this.pensByBatch = pensByBatch; // 存储起来,以便 onDestBatchChange 使用
} catch (error) {
console.error("Error fetching batches or pens:", error);
this.$message.error("获取猪群或猪栏信息失败");
}
},
onDestBatchChange(batchId) {
this.form.toPenID = null; // 重置目标猪栏选择
// 允许选择目标批次下的所有猪栏,包括已满的
this.destinationPens = (this.pensByBatch[batchId] || []);
},
validateQuantity(rule, value, callback) {
if (value > this.maxTransferQuantity) {
callback(new Error(`调栏数量不能超过源猪栏存栏数量 (${this.maxTransferQuantity})`));
} else {
callback();
}
},
handleConfirm() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
await transferPigsAcrossBatches(this.batch.id, {
fromPenID: this.form.fromPenID,
destBatchID: this.form.destBatchID,
toPenID: this.form.toPenID,
quantity: this.form.quantity,
remarks: this.form.remarks
});
this.$message.success('跨群调栏成功');
this.$emit('success');
this.$emit('update:visible', false);
} catch (error) {
console.error('Error transferring pigs across batches:', error);
this.$message.error('跨群调栏失败: ' + (error.response?.data?.message || error.message || '未知错误'));
}
}
});
},
resetForm() {
this.$refs.form?.resetFields();
this.form.fromPenID = null;
this.form.destBatchID = null;
this.form.toPenID = null;
this.form.quantity = 1;
this.form.remarks = '';
this.sourcePens = [];
this.availableBatches = [];
this.destinationPens = [];
this.maxTransferQuantity = 1;
}
}
};
</script>
<style scoped>
</style>