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