From 91c82965b2d987452ca276e3a03b48c8dcda2ae9 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 19 八月 2026 11:47:26 +0800
Subject: [PATCH] config(env): 更新生产环境配置和公司名称
---
src/views/mes/pro/line/components/select.vue | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 113 insertions(+), 0 deletions(-)
diff --git a/src/views/mes/pro/line/components/select.vue b/src/views/mes/pro/line/components/select.vue
new file mode 100644
index 0000000..ef58674
--- /dev/null
+++ b/src/views/mes/pro/line/components/select.vue
@@ -0,0 +1,113 @@
+<script lang="ts" setup>
+import type { MesProLineApi } from '#/api/mes/pro/line';
+
+import { computed, onMounted, ref, watch } from 'vue';
+
+import { Select, Tag, Tooltip } from 'ant-design-vue';
+
+import { getLineSimpleList } from '#/api/mes/pro/line';
+
+defineOptions({ name: 'ProLineSelect', 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: MesProLineApi.Line | undefined];
+ 'update:modelValue': [value: number | undefined];
+}>();
+
+const allList = ref<MesProLineApi.Line[]>([]);
+const selectedItem = ref<MesProLineApi.Line>();
+
+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 MesProLineApi.Line | 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 getLineSimpleList();
+ 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.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