2025-10-23 18:41:08 +08:00
|
|
|
|
<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; // 重置目标猪栏选择
|
2025-10-24 14:23:58 +08:00
|
|
|
|
// 允许选择目标批次下的所有猪栏,包括已满的
|
|
|
|
|
|
this.destinationPens = (this.pensByBatch[batchId] || []);
|
2025-10-23 18:41:08 +08:00
|
|
|
|
},
|
|
|
|
|
|
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>
|