| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog |
| | | v-model="visible" |
| | | title="颿" |
| | | width="1000px" |
| | | top="3vh" |
| | | :close-on-click-modal="false" |
| | | destroy-on-close |
| | | class="material-requisition-dialog" |
| | | > |
| | | <div class="material-requisition-form"> |
| | | <!-- åææå表 --> |
| | | <el-table :data="materialList" border style="width: 100%" height="65vh"> |
| | | <el-table-column type="index" label="åºå·" width="60" align="center" /> |
| | | <el-table-column prop="productName" label="产ååç§°" min-width="150" /> |
| | | <el-table-column prop="model" label="åå·" min-width="150" /> |
| | | <!-- <el-table-column prop="batchNo" label="æ¹å·" min-width="150"> |
| | | <template #default="{ row }"> |
| | | <el-select |
| | | v-model="row.batchNo" |
| | | placeholder="è¯·éæ©æ¹å·" |
| | | clearable |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in row.batchOptions || []" |
| | | :key="item.batchNo" |
| | | :label="item.batchNo" |
| | | :value="item.batchNo" |
| | | /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> --> |
| | | <el-table-column prop="unit" label="åä½" width="80" align="center" /> |
| | | <el-table-column prop="qualitity" label="æ°é" width="100" align="center"> |
| | | <template #default="{ row }"> |
| | | {{ row.qualitity || 0 }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="requisitionQty" label="é¢ç¨æ°é" width="120" align="center"> |
| | | <template #default="{ row }"> |
| | | <el-input-number |
| | | v-model="row.requisitionQty" |
| | | :min="0" |
| | | :precision="2" |
| | | :controls="false" |
| | | :disabled="!row.qualitity || hasDrawMaterials" |
| | | style="width: 100%" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="remark" label="夿³¨" min-width="150"> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button type="primary" :loading="saving" @click="handleConfirm">确 认</el-button> |
| | | <el-button @click="handleCancel">å æ¶</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, computed, watch } from 'vue'; |
| | | import { ElMessage } from 'element-plus'; |
| | | import { getByBomId, drawMaterials } from '@/api/productionManagement/productionOrder.js'; |
| | | |
| | | const props = defineProps({ |
| | | modelValue: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | orderData: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | } |
| | | }); |
| | | |
| | | const emit = defineEmits(['update:modelValue', 'confirm']); |
| | | |
| | | const visible = computed({ |
| | | get: () => props.modelValue, |
| | | set: (val) => emit('update:modelValue', val) |
| | | }); |
| | | |
| | | const loading = ref(false); |
| | | const saving = ref(false); |
| | | const materialList = ref([]); |
| | | const hasDrawMaterials = ref(false); |
| | | |
| | | // çå¬å¼¹æ¡æå¼ï¼å è½½æ°æ® |
| | | watch(() => props.modelValue, (val) => { |
| | | if (val && props.orderData) { |
| | | loadMaterialList(); |
| | | } |
| | | }); |
| | | |
| | | const loadMaterialList = async () => { |
| | | const order = props.orderData; |
| | | const drawMaterialsData = order.drawMaterials; |
| | | |
| | | // 妿已æé¢ææ°æ®ï¼ç´æ¥ä½¿ç¨ |
| | | if (drawMaterialsData) { |
| | | hasDrawMaterials.value = true; |
| | | try { |
| | | const list = typeof drawMaterialsData === 'string' |
| | | ? JSON.parse(drawMaterialsData) |
| | | : drawMaterialsData; |
| | | materialList.value = list.map(item => ({ |
| | | ...item, |
| | | requisitionQty: item.requisitionQty || 0 |
| | | })); |
| | | return; |
| | | } catch (e) { |
| | | console.error('è§£æé¢ææ°æ®å¤±è´¥:', e); |
| | | } |
| | | } |
| | | |
| | | // 没æé¢ææ°æ®ï¼è°ç¨æ¥å£æ¥è¯¢ |
| | | hasDrawMaterials.value = false; |
| | | const bomId = order?.bomId; |
| | | if (!bomId) { |
| | | ElMessage.warning('å½å订å缺å°BOMä¿¡æ¯'); |
| | | return; |
| | | } |
| | | |
| | | loading.value = true; |
| | | try { |
| | | const res = await getByBomId({ bomId }); |
| | | const data = res.data || []; |
| | | // å¤çæ°æ®ï¼æ·»å é¢ç¨æ°éåæ®µåæ¹å·é项 |
| | | materialList.value = data.map(item => ({ |
| | | ...item, |
| | | requisitionQty: item.qualitity ? 0 : 0, |
| | | batchNo: item.batchNo || '', |
| | | remark: item.remark || '', |
| | | // æ¹å·é项ï¼ä»åºååææä¿¡æ¯ä¸è·å |
| | | batchOptions: item.inventoryList || [] |
| | | })); |
| | | } catch (error) { |
| | | console.error('æ¥è¯¢åææå表失败:', error); |
| | | ElMessage.error('æ¥è¯¢åææå表失败'); |
| | | materialList.value = []; |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | }; |
| | | |
| | | const handleCancel = () => { |
| | | visible.value = false; |
| | | materialList.value = []; |
| | | hasDrawMaterials.value = false; |
| | | }; |
| | | |
| | | const handleConfirm = async () => { |
| | | const orderId = props.orderData?.id; |
| | | if (!orderId) { |
| | | ElMessage.error('订åIDä¸åå¨'); |
| | | return; |
| | | } |
| | | |
| | | const drawMaterialsList = materialList.value.map(item => ({ |
| | | ...item, |
| | | requisitionQty: item.requisitionQty || 0 |
| | | })); |
| | | |
| | | const postData = { |
| | | id: orderId, |
| | | drawMaterials: JSON.stringify(drawMaterialsList) |
| | | }; |
| | | |
| | | saving.value = true; |
| | | try { |
| | | await drawMaterials(postData); |
| | | ElMessage.success('颿ä¿åæå'); |
| | | visible.value = false; |
| | | materialList.value = []; |
| | | hasDrawMaterials.value = false; |
| | | } catch (error) { |
| | | console.error('ä¿åé¢æå¤±è´¥:', error); |
| | | ElMessage.error('ä¿åé¢æå¤±è´¥'); |
| | | } finally { |
| | | saving.value = false; |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .material-requisition-form { |
| | | .el-table { |
| | | margin-top: 10px; |
| | | } |
| | | } |
| | | |
| | | .dialog-footer { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | gap: 10px; |
| | | } |
| | | |
| | | :deep(.el-dialog) { |
| | | height: 85vh; |
| | | margin-top: 3vh !important; |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | :deep(.el-dialog__body) { |
| | | flex: 1; |
| | | overflow-y: auto; |
| | | padding: 15px 20px; |
| | | } |
| | | |
| | | :deep(.el-dialog__header) { |
| | | padding: 15px 20px; |
| | | border-bottom: 1px solid #e4e7ed; |
| | | } |
| | | |
| | | :deep(.el-dialog__footer) { |
| | | padding: 15px 20px; |
| | | border-top: 1px solid #e4e7ed; |
| | | } |
| | | </style> |