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