liu
2 天以前 70b7935fc261cd5e8eaaf1cfbc8078b04db576d2
src/views/mes/md/item/type/components/tree.vue
@@ -12,11 +12,13 @@
defineOptions({ name: 'MdItemTypeTree' });
withDefaults(
const props = withDefaults(
  defineProps<{
    excludeCodes?: string[];
    filterPlaceholder?: string;
  }>(),
  {
    excludeCodes: () => [],
    filterPlaceholder: '搜索分类',
  },
);
@@ -32,13 +34,36 @@
const itemTypeList = ref<MesMdItemTypeApi.ItemType[]>([]); // 物料分类列表
const itemTypeTree = ref<any[]>([]); // 物料分类树
/** 按分类编码排除分类及其全部子分类 */
function filterExcludedTypes(data: MesMdItemTypeApi.ItemType[]) {
  const excludedIds = new Set<number>();
  let changed = true;
  while (changed) {
    changed = false;
    for (const item of data) {
      if (
        item.id !== undefined &&
        (props.excludeCodes.includes(item.code ?? '') ||
          (item.parentId !== undefined && excludedIds.has(item.parentId))) &&
        !excludedIds.has(item.id)
      ) {
        excludedIds.add(item.id);
        changed = true;
      }
    }
  }
  return data.filter(
    (item) => item.id === undefined || !excludedIds.has(item.id),
  );
}
/** 加载分类树 */
async function loadTree() {
  loading.value = true;
  try {
    const data = await getItemTypeSimpleList();
    itemTypeList.value = data;
    itemTypeTree.value = handleTree(data, 'id', 'parentId');
    itemTypeList.value = filterExcludedTypes(data);
    itemTypeTree.value = handleTree(itemTypeList.value, 'id', 'parentId');
  } finally {
    loading.value = false;
  }