gaoluyang
2026-06-24 712aa51536236d43e87273e4ce45ac5691dffad8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<script lang="ts" setup>
import type { SelectValue } from 'ant-design-vue/es/select';
 
import type { MesDvSubjectApi } from '#/api/mes/dv/subject';
 
import { computed, onMounted, ref } from 'vue';
 
import { CommonStatusEnum } from '..\..\..\..\..\packages\constants\src';
 
import { Select } from 'ant-design-vue';
 
import { getSubjectSimpleList } from '#/api/mes/dv/subject';
 
defineOptions({ name: 'DvSubjectSelect' });
 
const props = withDefaults(
  defineProps<{
    allowClear?: boolean;
    disabled?: boolean;
    modelValue?: number;
    placeholder?: string;
    type?: number;
  }>(),
  {
    allowClear: true,
    disabled: false,
    modelValue: undefined,
    placeholder: '请选择项目',
    type: undefined,
  },
);
const emit = defineEmits<{
  change: [row?: MesDvSubjectApi.Subject];
  'update:modelValue': [value?: number];
}>();
const list = ref<MesDvSubjectApi.Subject[]>([]); // 项目列表
const filteredList = computed(() => {
  // 仅展示启用且类型匹配的项目,避免新建时带出禁用项目
  const result: Array<MesDvSubjectApi.Subject & { disabled?: boolean }> =
    list.value.filter(
      (item) =>
        item.status === CommonStatusEnum.ENABLE &&
        (!props.type || item.type === props.type),
    );
  // 历史数据可能绑定已禁用或其它类型的项目,补充当前选中项用于回显,并禁止重新选择
  if (
    props.modelValue !== null &&
    !result.some((item) => item.id === props.modelValue)
  ) {
    const current = list.value.find((item) => item.id === props.modelValue);
    if (current) {
      result.push({ ...current, disabled: true });
    }
  }
  return result;
});
 
/** 加载项目列表 */
async function getList() {
  list.value = await getSubjectSimpleList();
}
 
/** 处理选择变化 */
function handleChange(value: SelectValue) {
  const subjectId = typeof value === 'number' ? value : undefined;
  emit('update:modelValue', subjectId);
  emit(
    'change',
    list.value.find((item) => item.id === subjectId),
  );
}
 
onMounted(getList);
</script>
 
<template>
  <Select
    :allow-clear="allowClear"
    :disabled="disabled"
    :field-names="{ label: 'name', value: 'id' }"
    :options="filteredList"
    :placeholder="placeholder"
    :value="modelValue"
    class="w-full"
    option-filter-prop="name"
    show-search
    @change="handleChange"
  />
</template>