From c77086ad2d7949ab36dd0c4e0b59907e672dd64f Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 18 九月 2026 15:04:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'refs/remotes/origin/dev_pro2.0' into dev_宁夏_九泓化工

---
 src/views/mes/md/item/components/product-bom-select.vue |  122 ++++++++++++++++++++++++++--------------
 1 files changed, 79 insertions(+), 43 deletions(-)

diff --git a/src/views/mes/md/item/components/product-bom-select.vue b/src/views/mes/md/item/components/product-bom-select.vue
index fb056f2..2637585 100644
--- a/src/views/mes/md/item/components/product-bom-select.vue
+++ b/src/views/mes/md/item/components/product-bom-select.vue
@@ -18,7 +18,8 @@
     allowClear?: boolean;
     disabled?: boolean;
     itemId?: number;
-    modelValue?: number;
+    modelValue?: number | number[];
+    multiple?: boolean;
     placeholder?: string;
   }>(),
   {
@@ -26,50 +27,68 @@
     disabled: false,
     itemId: undefined,
     modelValue: undefined,
+    multiple: false,
     placeholder: '璇烽�夋嫨 BOM 鐗╂枡',
   },
 );
 const emit = defineEmits<{
-  change: [bom: MesMdProductBomApi.ProductBom | undefined];
-  'update:modelValue': [value: number | undefined];
+  change: [
+    bom: MesMdProductBomApi.ProductBom[] | MesMdProductBomApi.ProductBom | undefined,
+  ];
+  'update:modelValue': [value: number[] | number | undefined];
 }>();
 const attrs = useAttrs(); // 閫忎紶灞炴��
 const dialogRef = ref<InstanceType<typeof MdProductBomSelectDialog>>(); // BOM 鐗╂枡閫夋嫨寮圭獥
 const hovering = ref(false); // 鏄惁鎮仠
-const selectedBom = ref<MesMdProductBomApi.ProductBom>(); // 褰撳墠閫変腑鐨� BOM 鐗╂枡
+const selectedBoms = ref<MesMdProductBomApi.ProductBom[]>([]); // 宸查�� BOM 鐗╂枡锛堝崟閫夋椂鏈�澶氫竴椤癸級
 
-const displayLabel = computed(() => selectedBom.value?.bomItemName ?? ''); // 閫夋嫨鍣ㄥ睍绀哄悕绉�
-const showClear = computed(
-  () =>
-    props.allowClear &&
-    !props.disabled &&
-    hovering.value &&
-    props.modelValue !== undefined &&
-    props.modelValue !== null,
-);
-
-/** 鏍规嵁 BOM 瀛愮墿鏂欑紪鍙峰洖鏄鹃�夋嫨鍣� */
-async function resolveBomById(bomItemId: number | undefined) {
-  if (
-    bomItemId === undefined ||
-    bomItemId === null ||
-    props.itemId === undefined ||
-    props.itemId === null
-  ) {
-    selectedBom.value = undefined;
-    return;
+const selectedBom = computed(() => selectedBoms.value[0]); // 鍗曢�夋椂鐨勫綋鍓嶉」
+const displayLabel = computed(() => {
+  // 澶氶�夊睍绀恒�屽悕绉般�佸悕绉般�嶏紝鍗曢�夊睍绀哄崟涓悕绉�
+  if (props.multiple) {
+    return selectedBoms.value
+      .map((bom) => bom.bomItemName)
+      .filter(Boolean)
+      .join('銆�');
   }
-  if (selectedBom.value?.bomItemId === bomItemId) {
+  return selectedBom.value?.bomItemName ?? '';
+}); // 閫夋嫨鍣ㄥ睍绀哄悕绉�
+const showClear = computed(() => {
+  if (!props.allowClear || props.disabled || !hovering.value) {
+    return false;
+  }
+  if (props.multiple) {
+    return Array.isArray(props.modelValue) && props.modelValue.length > 0;
+  }
+  return props.modelValue !== undefined && props.modelValue !== null;
+});
+
+/** 浠� modelValue 瑙f瀽鍑� BOM 鐗╂枡缂栧彿鍒楄〃 */
+function getModelIds() {
+  if (props.multiple) {
+    return Array.isArray(props.modelValue)
+      ? props.modelValue.filter((id): id is number => id != null)
+      : [];
+  }
+  return typeof props.modelValue === 'number' ? [props.modelValue] : [];
+}
+
+/** 鏍规嵁 BOM 鐗╂枡缂栧彿鍥炴樉閫夋嫨鍣� */
+async function resolveBomsById(ids: number[]) {
+  if (ids.length === 0 || props.itemId === undefined || props.itemId === null) {
+    selectedBoms.value = [];
     return;
   }
   const list = await getProductBomListByItemId(props.itemId as number);
-  selectedBom.value = list.find((item) => item.bomItemId === bomItemId);
+  selectedBoms.value = list.filter(
+    (item) => item.bomItemId != null && ids.includes(item.bomItemId),
+  );
 }
 
 watch(
   () => props.modelValue,
-  (value) => {
-    resolveBomById(value);
+  () => {
+    resolveBomsById(getModelIds());
   },
   { immediate: true },
 );
@@ -77,17 +96,17 @@
 watch(
   () => props.itemId,
   () => {
-    selectedBom.value = undefined;
-    emit('update:modelValue', undefined);
-    emit('change', undefined);
+    selectedBoms.value = [];
+    emit('update:modelValue', props.multiple ? [] : undefined);
+    emit('change', props.multiple ? [] : undefined);
   },
 );
 
 /** 娓呯┖宸查�� BOM 鐗╂枡 */
 function clearSelected() {
-  selectedBom.value = undefined;
-  emit('update:modelValue', undefined);
-  emit('change', undefined);
+  selectedBoms.value = [];
+  emit('update:modelValue', props.multiple ? [] : undefined);
+  emit('change', props.multiple ? [] : undefined);
 }
 
 /** 鎵撳紑 BOM 鐗╂枡閫夋嫨寮圭獥 */
@@ -101,14 +120,22 @@
     clearSelected();
     return;
   }
-  dialogRef.value?.open(props.itemId as number, props.modelValue);
+  const ids = getModelIds();
+  dialogRef.value?.open(props.itemId as number, props.multiple ? ids : ids[0]);
 }
 
 /** 鍥炲~閫変腑鐨� BOM 鐗╂枡 */
-function handleSelected(row: MesMdProductBomApi.ProductBom) {
-  selectedBom.value = row;
-  emit('update:modelValue', row.bomItemId);
-  emit('change', row);
+function handleSelected(rows: MesMdProductBomApi.ProductBom[]) {
+  selectedBoms.value = rows;
+  emit(
+    'update:modelValue',
+    props.multiple
+      ? rows
+          .map((row) => row.bomItemId)
+          .filter((id): id is number => id != null)
+      : rows[0]?.bomItemId,
+  );
+  emit('change', props.multiple ? rows : rows[0]);
 }
 </script>
 
@@ -121,9 +148,14 @@
     @mouseenter="hovering = true"
     @mouseleave="hovering = false"
   >
-    <Tooltip :mouse-enter-delay="0.5" :open="selectedBom ? undefined : false">
+    <Tooltip :mouse-enter-delay="0.5" :open="selectedBoms.length ? undefined : false">
       <template #title>
-        <div v-if="selectedBom" class="leading-6">
+        <div v-if="multiple" class="leading-6">
+          <div v-for="bom in selectedBoms" :key="bom.bomItemId">
+            {{ bom.bomItemName || '-' }}{{ bom.bomItemCode ? `锛�${bom.bomItemCode}锛塦 : '' }}
+          </div>
+        </div>
+        <div v-else-if="selectedBom" class="leading-6">
           <div>缂栫爜锛歿{ selectedBom.bomItemCode || '-' }}</div>
           <div>鍚嶇О锛歿{ selectedBom.bomItemName || '-' }}</div>
           <div>瑙勬牸锛歿{ selectedBom.bomItemSpecification || '-' }}</div>
@@ -146,5 +178,9 @@
       </Input>
     </Tooltip>
   </div>
-  <MdProductBomSelectDialog ref="dialogRef" @selected="handleSelected" />
-</template>
+  <MdProductBomSelectDialog
+    ref="dialogRef"
+    :multiple="multiple"
+    @selected="handleSelected"
+  />
+</template>
\ No newline at end of file

--
Gitblit v1.9.3