205 lines
7.0 KiB
Vue
205 lines
7.0 KiB
Vue
<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>
|