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>
 |