| | |
| | | import type { VbenFormSchema } from "#/adapter/form"; |
| | | import type { VbenFormApi, VbenFormSchema } from "#/adapter/form"; |
| | | import type { VxeTableGridOptions } from "#/adapter/vxe-table"; |
| | | |
| | | import { h } from 'vue'; |
| | | |
| | | import { CommonStatusEnum, DICT_TYPE } from "#/packages/constants/src"; |
| | | import { getDictOptions } from "#/packages/effects/hooks/src"; |
| | | |
| | | import { z } from '#/adapter/form'; |
| | | import { generateAutoCode } from '#/api/mes/md/autocode/record'; |
| | | import { MesAutoCodeRuleCode } from '@vben/constants'; |
| | | import { getItemTypeSimpleList } from '#/api/mes/md/item/type'; |
| | | import { getUnitPage } from '#/api/mdm/unit'; |
| | | |
| | | import { Button } from 'ant-design-vue'; |
| | | |
| | | // 缓存单位列表 |
| | | let unitListCache: any[] | null = null; |
| | | let unitListPromise: Promise<any[]> | null = null; |
| | | |
| | | /** 将扁平分类列表转为 TreeSelect 所需的树形结构 */ |
| | | function buildCategoryTree(list: any[]): any[] { |
| | | const map = new Map<number, any>(); |
| | | const roots: any[] = []; |
| | | for (const item of list) { |
| | | map.set(item.id, { label: item.name, value: item.id, children: [] }); |
| | | } |
| | | for (const item of list) { |
| | | const node = map.get(item.id)!; |
| | | if (item.parentId && map.has(item.parentId)) { |
| | | map.get(item.parentId)!.children.push(node); |
| | | } else { |
| | | roots.push(node); |
| | | } |
| | | } |
| | | return roots; |
| | | } |
| | | |
| | | /** 获取单位列表(带缓存) */ |
| | | async function getUnitListCached() { |
| | |
| | | return unitListPromise; |
| | | } |
| | | |
| | | /** 清除单位列表缓存 */ |
| | | export function clearUnitListCache() { |
| | | unitListCache = null; |
| | | } |
| | | |
| | | /** 新增/修改的表单 */ |
| | | export function useFormSchema(): VbenFormSchema[] { |
| | | export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | component: "Input", |
| | |
| | | fieldName: "code", |
| | | label: "物料编码", |
| | | componentProps: { |
| | | maxLength: 64, |
| | | placeholder: "请输入物料编码", |
| | | }, |
| | | rules: "required", |
| | | rules: z.string().min(1, '物料编码不能为空').max(64), |
| | | suffix: () => |
| | | h( |
| | | Button, |
| | | { |
| | | type: 'default', |
| | | onClick: async () => { |
| | | const code = await generateAutoCode( |
| | | MesAutoCodeRuleCode.MD_ITEM_CODE, |
| | | ); |
| | | await formApi?.setFieldValue('code', code); |
| | | }, |
| | | }, |
| | | { default: () => '生成' }, |
| | | ), |
| | | }, |
| | | { |
| | | component: "Input", |
| | |
| | | rules: "required", |
| | | }, |
| | | { |
| | | component: "ApiSelect", |
| | | component: "ApiTreeSelect", |
| | | fieldName: "categoryId", |
| | | label: "物料分类", |
| | | rules: "selectRequired", |
| | | componentProps: { |
| | | placeholder: "请选择物料分类", |
| | | allowClear: true, |
| | | treeDefaultExpandAll: true, |
| | | api: async () => { |
| | | const res = await getItemTypeSimpleList(); |
| | | return res || []; |
| | | return buildCategoryTree(res || []); |
| | | }, |
| | | labelField: "name", |
| | | valueField: "id", |
| | | }, |
| | | }, |
| | | { |