| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog v-model="isShow" |
| | | title="ç¼è¾å·¥èºè·¯çº¿" |
| | | width="400" |
| | | @close="closeModal"> |
| | | <el-form label-width="140px" |
| | | :model="formState" |
| | | label-position="top" |
| | | ref="formRef"> |
| | | <el-form-item label="产åç±»å" |
| | | prop="dictCode" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©äº§åç±»å', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.dictCode" |
| | | placeholder="è¯·éæ©äº§åç±»å" |
| | | clearable |
| | | style="width: 100%" |
| | | @change="handleProductTypeChange"> |
| | | <el-option v-for="item in productTypeOptions" |
| | | :key="item.dictCode" |
| | | :label="item.dictLabel" |
| | | :value="item.dictCode" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="BOM" |
| | | prop="bomId" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©BOM', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.bomId" |
| | | placeholder="è¯·éæ©BOM" |
| | | clearable |
| | | :disabled="!formState.dictCode || bomOptions.length === 0" |
| | | style="width: 100%"> |
| | | <el-option v-for="item in bomOptions" |
| | | :key="item.id" |
| | | :label="item.bomNo || `BOM-${item.id}`" |
| | | :value="item.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" |
| | | prop="description"> |
| | | <el-input v-model="formState.description" |
| | | type="textarea" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" |
| | | @click="handleSubmit">确认</el-button> |
| | | <el-button @click="closeModal">åæ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { |
| | | ref, |
| | | computed, |
| | | getCurrentInstance, |
| | | onMounted, |
| | | nextTick, |
| | | watch, |
| | | } from "vue"; |
| | | import { update } from "@/api/productionManagement/processRoute.js"; |
| | | import { listPage } from "@/api/productionManagement/productBom.js"; |
| | | import { getDicts } from "@/api/system/dict/data.js"; |
| | | |
| | | const props = defineProps({ |
| | | visible: { |
| | | type: Boolean, |
| | | required: true, |
| | | }, |
| | | |
| | | record: { |
| | | type: Object, |
| | | required: true, |
| | | }, |
| | | }); |
| | | |
| | | const emit = defineEmits(["update:visible", "completed"]); |
| | | |
| | | // ååºå¼æ°æ®ï¼æ¿ä»£é项å¼ç dataï¼ |
| | | const formState = ref({ |
| | | dictCode: undefined, |
| | | dictLabel: "", |
| | | bomId: undefined, |
| | | description: "", |
| | | }); |
| | | |
| | | const isShow = computed({ |
| | | get() { |
| | | return props.visible; |
| | | }, |
| | | set(val) { |
| | | emit("update:visible", val); |
| | | }, |
| | | }); |
| | | |
| | | const productTypeOptions = ref([]); |
| | | const bomOptions = ref([]); |
| | | |
| | | let { proxy } = getCurrentInstance(); |
| | | |
| | | // è·å产åç±»ååå
¸ |
| | | const getProductTypeOptions = () => { |
| | | getDicts("product_type") |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | productTypeOptions.value = res.data; |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("è·å产åç±»ååå
¸å¤±è´¥ï¼", err); |
| | | }); |
| | | }; |
| | | |
| | | // æ ¹æ®äº§åç±»åè·åBOMå表 |
| | | const getBomListByProductType = async dictCode => { |
| | | if (!dictCode) { |
| | | bomOptions.value = []; |
| | | return; |
| | | } |
| | | try { |
| | | // 使ç¨listPageæ¥å£ï¼æ ¹æ®dictCodeæ¥è¯¢BOM |
| | | const res = await listPage({ dictCode }); |
| | | // å¤çè¿åçBOMæ°æ® |
| | | let bomList = []; |
| | | if (res.data && res.data.records) { |
| | | bomList = res.data.records; |
| | | } |
| | | bomOptions.value = bomList; |
| | | if (bomList.length === 0) { |
| | | proxy.$modal.msgError("该产åç±»åæ²¡æBOMï¼è¯·å
å建BOM"); |
| | | } |
| | | } catch (error) { |
| | | // 妿æ¥å£è¿å404æå
¶ä»é误ï¼è¯´ææ²¡æBOM |
| | | proxy.$modal.msgError("该产åç±»åæ²¡æBOMï¼è¯·å
å建BOM"); |
| | | bomOptions.value = []; |
| | | } |
| | | }; |
| | | |
| | | const closeModal = () => { |
| | | isShow.value = false; |
| | | }; |
| | | |
| | | // è®¾ç½®è¡¨åæ°æ® |
| | | const setFormData = () => { |
| | | if (props.record) { |
| | | formState.value = { |
| | | ...props.record, |
| | | dictCode: props.record.dictCode, |
| | | dictLabel: props.record.dictLabel || "", |
| | | bomId: props.record.bomId, |
| | | description: props.record.description || "", |
| | | }; |
| | | // 妿æäº§åç±»åï¼å è½½BOMå表 |
| | | if (props.record.dictCode) { |
| | | getBomListByProductType(props.record.dictCode); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // 产åç±»åéæ©å¤ç |
| | | const handleProductTypeChange = async dictCode => { |
| | | if (dictCode) { |
| | | const selectedType = productTypeOptions.value.find(item => item.dictCode === dictCode); |
| | | if (selectedType) { |
| | | formState.value.dictLabel = selectedType.dictLabel; |
| | | } |
| | | // 妿å½åéæ©çBOMä¸å¨æ°å表ä¸ï¼åéç½®BOMéæ© |
| | | formState.value.bomId = undefined; |
| | | await getBomListByProductType(dictCode); |
| | | // 触å表åéªè¯æ´æ° |
| | | proxy.$refs["formRef"]?.validateField("dictCode"); |
| | | } else { |
| | | formState.value.dictLabel = ""; |
| | | bomOptions.value = []; |
| | | } |
| | | }; |
| | | |
| | | const handleSubmit = () => { |
| | | proxy.$refs["formRef"].validate(valid => { |
| | | if (valid) { |
| | | // éªè¯æ¯å¦éæ©äºäº§åç±»ååBOM |
| | | if (!formState.value.dictCode) { |
| | | proxy.$modal.msgError("è¯·éæ©äº§åç±»å"); |
| | | return; |
| | | } |
| | | if (!formState.value.bomId) { |
| | | proxy.$modal.msgError("è¯·éæ©BOM"); |
| | | return; |
| | | } |
| | | update(formState.value).then(res => { |
| | | // å
³éæ¨¡ææ¡ |
| | | isShow.value = false; |
| | | // åç¥ç¶ç»ä»¶å·²å®æ |
| | | emit("completed"); |
| | | proxy.$modal.msgSuccess("æäº¤æå"); |
| | | }); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | defineExpose({ |
| | | closeModal, |
| | | handleSubmit, |
| | | isShow, |
| | | }); |
| | | |
| | | // çå¬å¼¹çªæå¼ï¼åå§åè¡¨åæ°æ® |
| | | watch( |
| | | () => props.visible, |
| | | visible => { |
| | | if (visible && props.record) { |
| | | nextTick(() => { |
| | | setFormData(); |
| | | }); |
| | | } |
| | | }, |
| | | { immediate: true } |
| | | ); |
| | | |
| | | onMounted(() => { |
| | | getProductTypeOptions(); |
| | | if (props.visible && props.record) { |
| | | setFormData(); |
| | | } |
| | | }); |
| | | </script> |