From f10cf167372f2d8c4c0e14f42f361d7ab96d8347 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 03 七月 2026 13:59:00 +0800
Subject: [PATCH] Merge branch 'dev_pro2.0' of http://114.132.189.42:9002/r/mom-pro2-before into dev_pro2.0
---
src/views/mes/process-design/process/components/select.vue | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 114 insertions(+), 0 deletions(-)
diff --git a/src/views/mes/process-design/process/components/select.vue b/src/views/mes/process-design/process/components/select.vue
new file mode 100644
index 0000000..ba87738
--- /dev/null
+++ b/src/views/mes/process-design/process/components/select.vue
@@ -0,0 +1,114 @@
+<script lang="ts" setup>
+import type { MesProProcessApi } from '#/api/mes/pro/process';
+
+import { computed, onMounted, ref, watch } from 'vue';
+
+import { Select, Tag, Tooltip } from 'ant-design-vue';
+
+import { getProcessSimpleList } from '#/api/mes/pro/process';
+
+defineOptions({ name: 'ProProcessSelect', inheritAttrs: false });
+
+const props = withDefaults(
+ defineProps<{
+ allowClear?: boolean;
+ disabled?: boolean;
+ modelValue?: number;
+ placeholder?: string;
+ }>(),
+ {
+ allowClear: true,
+ disabled: false,
+ modelValue: undefined,
+ placeholder: '璇烽�夋嫨宸ュ簭',
+ },
+);
+
+const emit = defineEmits<{
+ change: [item: MesProProcessApi.Process | undefined];
+ 'update:modelValue': [value: number | undefined];
+}>();
+
+const allList = ref<MesProProcessApi.Process[]>([]);
+const selectedItem = ref<MesProProcessApi.Process>();
+
+const selectValue = computed({
+ get: () => props.modelValue,
+ set: (value: number | undefined) => {
+ emit('update:modelValue', value);
+ },
+});
+
+/** 鍓嶇杩囨护锛氭寜宸ュ簭鍚嶇О鎴栫紪鐮佹ā绯婂尮閰� */
+function handleFilter(input: string, option: any) {
+ const keyword = input.toLowerCase();
+ const item = option?.item as MesProProcessApi.Process | undefined;
+ return Boolean(
+ item?.name?.toLowerCase().includes(keyword) ||
+ item?.code?.toLowerCase().includes(keyword),
+ );
+}
+
+/** 鏍规嵁褰撳墠鍊煎悓姝� tooltip 灞曠ず鐨勫伐搴忚鎯� */
+function syncSelectedItem(value: number | undefined) {
+ selectedItem.value =
+ value === undefined
+ ? undefined
+ : allList.value.find((item) => item.id === value);
+}
+
+/** 闄� v-model 澶栵紝棰濆鎶涘嚭瀹屾暣宸ュ簭瀵硅薄缁欎笟鍔¤〃鍗曚娇鐢� */
+function handleChange(value: any) {
+ const nextValue = value === undefined ? undefined : Number(value);
+ syncSelectedItem(nextValue);
+ emit('change', selectedItem.value);
+}
+
+watch(
+ () => props.modelValue,
+ (value) => {
+ syncSelectedItem(value);
+ },
+);
+
+onMounted(async () => {
+ allList.value = await getProcessSimpleList();
+ syncSelectedItem(props.modelValue);
+});
+</script>
+
+<template>
+ <Tooltip :mouse-enter-delay="0.5" :open="selectedItem ? undefined : false">
+ <template #title>
+ <div v-if="selectedItem" class="leading-6">
+ <div>缂栫爜锛歿{ selectedItem.code || '-' }}</div>
+ <div>鍚嶇О锛歿{ selectedItem.name || '-' }}</div>
+ <div>宸ヨ壓瑕佹眰锛歿{ selectedItem.attention || '-' }}</div>
+ <div>澶囨敞锛歿{ selectedItem.remark || '-' }}</div>
+ </div>
+ </template>
+ <Select
+ v-bind="$attrs"
+ v-model:value="selectValue"
+ :allow-clear="allowClear"
+ :disabled="disabled"
+ :filter-option="handleFilter"
+ :placeholder="placeholder"
+ class="w-full"
+ show-search
+ @change="handleChange"
+ >
+ <Select.Option
+ v-for="item in allList"
+ :key="item.id"
+ :item="item"
+ :value="item.id"
+ >
+ <div class="flex items-center gap-2">
+ <span>{{ item.name }}</span>
+ <Tag v-if="item.code" color="default">{{ item.code }}</Tag>
+ </div>
+ </Select.Option>
+ </Select>
+ </Tooltip>
+</template>
--
Gitblit v1.9.3