From 39906ece6b0753b429ffa3b2c1416111eb6eeb35 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 14 四月 2026 17:40:32 +0800
Subject: [PATCH] 中兴实强 1.bom加一个引用功能, 2.工艺路线需要修改,bom不必填,选了bom就带入bom信息
---
src/views/productionManagement/processRoute/New.vue | 274 ++++++++++++++++++++++++++++++++----------------------
1 files changed, 163 insertions(+), 111 deletions(-)
diff --git a/src/views/productionManagement/processRoute/New.vue b/src/views/productionManagement/processRoute/New.vue
index 62c6873..69a8eed 100644
--- a/src/views/productionManagement/processRoute/New.vue
+++ b/src/views/productionManagement/processRoute/New.vue
@@ -1,53 +1,54 @@
<template>
<div>
<el-dialog
- v-model="isShow"
- title="鏂板宸ヨ壓璺嚎"
- width="400"
- @close="closeModal"
+ v-model="isShow"
+ title="鏂板宸ヨ壓璺嚎"
+ width="800"
+ @close="closeModal"
>
- <el-form label-width="140px" :model="formState" label-position="top" ref="formRef">
+ <el-form ref="formRef" label-width="140px" :model="formState" label-position="top">
<el-form-item
- label="浜у搧鍚嶇О"
- prop="productModelId"
- :rules="[
- {
- required: true,
- message: '璇烽�夋嫨浜у搧',
- trigger: 'change',
- }
- ]"
+ label="浜у搧鍚嶇О"
+ prop="selectedProducts"
+ :rules="[
+ {
+ required: true,
+ message: '璇烽�夋嫨浜у搧',
+ trigger: 'change',
+ },
+ ]"
>
- <el-button type="primary" @click="showProductSelectDialog = true">
- {{ formState.productName && formState.productModelName
- ? `${formState.productName} - ${formState.productModelName}`
- : '閫夋嫨浜у搧' }}
- </el-button>
+ <div class="product-picker">
+ <el-button type="primary" @click="showProductSelectDialog = true">
+ {{ formState.selectedProducts.length ? "閲嶆柊閫夋嫨浜у搧" : "閫夋嫨浜у搧" }}
+ </el-button>
+ <div v-if="formState.selectedProducts.length" class="product-tags">
+ <el-tag
+ v-for="product in formState.selectedProducts"
+ :key="product.id"
+ type="info"
+ effect="plain"
+ class="product-tag"
+ >
+ {{ product.productName }} / {{ product.model }}
+ </el-tag>
+ </div>
+ </div>
</el-form-item>
- <el-form-item
- label="BOM"
- prop="bomId"
- :rules="[
- {
- required: true,
- message: '璇烽�夋嫨BOM',
- trigger: 'change',
- }
- ]"
- >
+ <el-form-item label="BOM" prop="bomId">
<el-select
- v-model="formState.bomId"
- placeholder="璇烽�夋嫨BOM"
- clearable
- :disabled="!formState.productModelId || bomOptions.length === 0"
- style="width: 100%"
+ v-model="formState.bomId"
+ placeholder="璇烽�夋嫨BOM"
+ clearable
+ :disabled="formState.selectedProducts.length !== 1 || 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"
+ v-for="item in bomOptions"
+ :key="item.id"
+ :label="item.bomNo || `BOM-${item.id}`"
+ :value="item.id"
/>
</el-select>
</el-form-item>
@@ -56,12 +57,10 @@
<el-input v-model="formState.description" type="textarea" />
</el-form-item>
</el-form>
-
- <!-- 浜у搧閫夋嫨寮圭獥 -->
+
<ProductSelectDialog
- v-model="showProductSelectDialog"
- @confirm="handleProductSelect"
- single
+ v-model="showProductSelectDialog"
+ @confirm="handleProductSelect"
/>
<template #footer>
<div class="dialog-footer">
@@ -74,9 +73,9 @@
</template>
<script setup>
-import {ref, computed, getCurrentInstance} from "vue";
-import {add} from "@/api/productionManagement/processRoute.js";
-import {getByModel} from "@/api/productionManagement/productBom.js";
+import { computed, getCurrentInstance, ref } from "vue";
+import { add } from "@/api/productionManagement/processRoute.js";
+import { getByModel } from "@/api/productionManagement/productBom.js";
import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
const props = defineProps({
@@ -86,16 +85,20 @@
},
});
-const emit = defineEmits(['update:visible', 'completed']);
+const emit = defineEmits(["update:visible", "completed"]);
-// 鍝嶅簲寮忔暟鎹紙鏇夸唬閫夐」寮忕殑 data锛�
+const formRef = ref();
+const showProductSelectDialog = ref(false);
+const bomOptions = ref([]);
const formState = ref({
productId: undefined,
productModelId: undefined,
+ productModelIds: "",
productName: "",
productModelName: "",
+ selectedProducts: [],
bomId: undefined,
- description: '',
+ description: "",
});
const isShow = computed({
@@ -103,88 +106,117 @@
return props.visible;
},
set(val) {
- emit('update:visible', val);
+ emit("update:visible", val);
},
});
-const showProductSelectDialog = ref(false);
-const bomOptions = ref([]);
+const { proxy } = getCurrentInstance();
-let { proxy } = getCurrentInstance()
-
-const closeModal = () => {
- // 閲嶇疆琛ㄥ崟鏁版嵁
+const resetForm = () => {
formState.value = {
productId: undefined,
productModelId: undefined,
+ productModelIds: "",
productName: "",
productModelName: "",
+ selectedProducts: [],
bomId: undefined,
- description: '',
+ description: "",
};
bomOptions.value = [];
+};
+
+const closeModal = () => {
+ resetForm();
isShow.value = false;
};
-// 浜у搧閫夋嫨澶勭悊
-const handleProductSelect = async (products) => {
- if (products && products.length > 0) {
- const product = products[0];
- // 鍏堟煡璇OM鍒楄〃锛堝繀閫夛級
- try {
- const res = await getByModel(product.id);
- // 澶勭悊杩斿洖鐨凚OM鏁版嵁锛氬彲鑳芥槸鏁扮粍銆佸璞℃垨鍖呭惈data瀛楁
- let bomList = [];
- if (Array.isArray(res)) {
- bomList = res;
- } else if (res && res.data) {
- bomList = Array.isArray(res.data) ? res.data : [res.data];
- } else if (res && typeof res === 'object') {
- bomList = [res];
- }
-
- if (bomList.length > 0) {
- formState.value.productModelId = product.id;
- formState.value.productName = product.productName;
- formState.value.productModelName = product.model;
- formState.value.bomId = undefined; // 閲嶇疆BOM閫夋嫨
- bomOptions.value = bomList;
- showProductSelectDialog.value = false;
- // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
- proxy.$refs["formRef"]?.validateField('productModelId');
- } else {
- proxy.$modal.msgError("璇ヤ骇鍝佹病鏈塀OM锛岃鍏堝垱寤築OM");
- }
- } catch (error) {
- // 濡傛灉鎺ュ彛杩斿洖404鎴栧叾浠栭敊璇紝璇存槑娌℃湁BOM
- proxy.$modal.msgError("璇ヤ骇鍝佹病鏈塀OM锛岃鍏堝垱寤築OM");
+const loadBomList = async (productModelId) => {
+ if (!productModelId) {
+ bomOptions.value = [];
+ return;
+ }
+
+ try {
+ const res = await getByModel(productModelId);
+ if (Array.isArray(res)) {
+ bomOptions.value = res;
+ return;
}
+ if (res && res.data) {
+ bomOptions.value = Array.isArray(res.data) ? res.data : [res.data];
+ return;
+ }
+ bomOptions.value = res && typeof res === "object" ? [res] : [];
+ } catch (error) {
+ bomOptions.value = [];
}
};
-const handleSubmit = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- // 楠岃瘉鏄惁閫夋嫨浜嗕骇鍝佸拰BOM
- if (!formState.value.productModelId) {
- proxy.$modal.msgError("璇烽�夋嫨浜у搧");
- return;
- }
- if (!formState.value.bomId) {
- proxy.$modal.msgError("璇烽�夋嫨BOM");
- return;
- }
- add(formState.value).then(res => {
- // 鍏抽棴妯℃�佹
- isShow.value = false;
- // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
- emit('completed');
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- })
- }
- })
+const handleProductSelect = async (products) => {
+ if (!products?.length) {
+ return;
+ }
+
+ formState.value.selectedProducts = products;
+ formState.value.productModelIds = products.map((product) => product.id).join(",");
+ formState.value.bomId = undefined;
+
+ if (products.length === 1) {
+ const product = products[0];
+ formState.value.productId = product.productId;
+ formState.value.productModelId = product.id;
+ formState.value.productName = product.productName;
+ formState.value.productModelName = product.model;
+ await loadBomList(product.id);
+ } else {
+ formState.value.productId = undefined;
+ formState.value.productModelId = undefined;
+ formState.value.productName = "";
+ formState.value.productModelName = "";
+ bomOptions.value = [];
+ }
+
+ showProductSelectDialog.value = false;
+ formRef.value?.validateField("selectedProducts");
};
+const handleSubmit = () => {
+ formRef.value.validate((valid) => {
+ if (!valid) {
+ return;
+ }
+ if (!formState.value.selectedProducts.length) {
+ proxy.$modal.msgError("璇烽�夋嫨浜у搧");
+ return;
+ }
+
+ add({
+ productId: formState.value.selectedProducts.length === 1
+ ? formState.value.selectedProducts[0].productId
+ : undefined,
+ productModelId: formState.value.selectedProducts.length === 1
+ ? formState.value.selectedProducts[0].id
+ : undefined,
+ productModelIds: formState.value.productModelIds,
+ productName: formState.value.selectedProducts.length === 1
+ ? formState.value.selectedProducts[0].productName
+ : undefined,
+ productModelName: formState.value.selectedProducts.length === 1
+ ? formState.value.selectedProducts[0].model
+ : undefined,
+ bomId: formState.value.selectedProducts.length === 1 ? formState.value.bomId : undefined,
+ description: formState.value.description,
+ })
+ .then(() => {
+ isShow.value = false;
+ emit("completed");
+ proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+ resetForm();
+ })
+ .catch(() => {});
+ });
+};
defineExpose({
closeModal,
@@ -192,3 +224,23 @@
isShow,
});
</script>
+
+<style scoped>
+.product-picker {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ align-items: flex-start;
+}
+
+.product-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.product-tag {
+ max-width: 220px;
+}
+
+</style>
--
Gitblit v1.9.3