| | |
| | | import { MesAutoCodeRuleCode } from '@vben/constants'; |
| | | import { getItemTypeSimpleList } from '#/api/mes/md/item/type'; |
| | | import { getUnitPage } from '#/api/mdm/unit'; |
| | | import { getWarehouseSimpleList } from '#/api/mes/wm/warehouse'; |
| | | |
| | | import { Button } from 'ant-design-vue'; |
| | | |
| | |
| | | let unitListCache: any[] | null = null; |
| | | let unitListPromise: Promise<any[]> | null = null; |
| | | |
| | | // 缓存仓库列表 |
| | | let warehouseListCache: any[] | null = null; |
| | | let warehouseListPromise: Promise<any[]> | null = null; |
| | | |
| | | /** 将扁平分类列表转为 TreeSelect 所需的树形结构 */ |
| | | function buildCategoryTree(list: any[]): any[] { |
| | | export function buildCategoryTree(list: any[]): any[] { |
| | | const map = new Map<number, any>(); |
| | | const roots: any[] = []; |
| | | for (const item of list) { |
| | |
| | | return unitListPromise; |
| | | } |
| | | |
| | | /** 获取仓库列表(带缓存) */ |
| | | async function getWarehouseListCached() { |
| | | if (warehouseListCache) { |
| | | return warehouseListCache; |
| | | } |
| | | if (warehouseListPromise) { |
| | | return warehouseListPromise; |
| | | } |
| | | warehouseListPromise = getWarehouseSimpleList().then((res) => { |
| | | warehouseListCache = res || []; |
| | | return warehouseListCache; |
| | | }).finally(() => { |
| | | warehouseListPromise = null; |
| | | }); |
| | | return warehouseListPromise; |
| | | } |
| | | |
| | | /** 清除单位列表缓存 */ |
| | | export function clearUnitListCache() { |
| | | unitListCache = null; |
| | | warehouseListCache = null; |
| | | } |
| | | |
| | | /** 新增/修改的表单 */ |
| | | export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { |
| | | export function useFormSchema(formApi?: VbenFormApi, categoryTreeData: any[] = []): VbenFormSchema[] { |
| | | return [ |
| | | { |
| | | component: "Input", |
| | |
| | | rules: "required", |
| | | }, |
| | | { |
| | | component: "ApiTreeSelect", |
| | | component: "TreeSelect", |
| | | fieldName: "categoryId", |
| | | label: "物料分类", |
| | | rules: "selectRequired", |
| | |
| | | placeholder: "请选择物料分类", |
| | | allowClear: true, |
| | | treeDefaultExpandAll: true, |
| | | api: async () => { |
| | | const res = await getItemTypeSimpleList(); |
| | | return buildCategoryTree(res || []); |
| | | }, |
| | | treeData: categoryTreeData, |
| | | fieldNames: { label: 'label', value: 'value', children: 'children' }, |
| | | }, |
| | | }, |
| | | { |
| | |
| | | }, |
| | | }, |
| | | { |
| | | component: 'Input', |
| | | component: 'ApiSelect', |
| | | fieldName: 'warehouseId', |
| | | label: '默认仓库', |
| | | componentProps: { |
| | | placeholder: '请输入默认仓库ID', |
| | | placeholder: '请选择默认仓库', |
| | | allowClear: true, |
| | | api: getWarehouseListCached, |
| | | labelField: 'name', |
| | | valueField: 'id', |
| | | onChange: async (value: number | undefined) => { |
| | | const code = value |
| | | ? ((await getWarehouseListCached()).find((w: any) => w.id === value)?.code || '') |
| | | : ''; |
| | | formApi?.setFieldValue('warehouseCode', code); |
| | | }, |
| | | }, |
| | | }, |
| | | { |
| | | component: 'Input', |
| | | fieldName: 'warehouseCode', |
| | | dependencies: { |
| | | triggerFields: [''], |
| | | show: () => false, |
| | | }, |
| | | }, |
| | | { |
| | |
| | | rules: z.boolean().default(false), |
| | | }, |
| | | { |
| | | component: "Switch", |
| | | fieldName: "syncMes", |
| | | label: "同步到 MES", |
| | | componentProps: { |
| | | class: "w-auto", |
| | | checkedChildren: "是", |
| | | unCheckedChildren: "否", |
| | | }, |
| | | rules: z.boolean().default(false), |
| | | }, |
| | | { |
| | | component: "InputNumber", |
| | | fieldName: "expiryDay", |
| | | label: "有效期(天)", |
| | |
| | | min: 0, |
| | | placeholder: "请输入有效期", |
| | | }, |
| | | }, |
| | | { |
| | | component: 'Switch', |
| | | fieldName: 'syncMes', |
| | | label: '同步到MES', |
| | | defaultValue: true, |
| | | componentProps: { |
| | | checkedChildren: '是', |
| | | unCheckedChildren: '否', |
| | | }, |
| | | rules: z.boolean().default(true), |
| | | }, |
| | | { |
| | | component: "RadioGroup", |
| | |
| | | }, |
| | | }, |
| | | { |
| | | field: "isBatchManaged", |
| | | title: "批次管理", |
| | | minWidth: 80, |
| | | slots: { default: "isBatchManaged" }, |
| | | }, |
| | | { |
| | | field: "status", |
| | | title: "状态", |
| | | minWidth: 80, |
| | | cellRender: { |
| | | name: "CellDict", |
| | | props: { type: DICT_TYPE.COMMON_STATUS }, |
| | | }, |
| | | }, |
| | | { |
| | | field: "createTime", |
| | | title: "创建时间", |
| | | minWidth: 180, |
| | | formatter: "formatDateTime", |
| | | }, |
| | | { |
| | | field: "isBatchManaged", |
| | | title: "批次管理", |
| | | width: 80, |
| | | fixed: "right", |
| | | slots: { default: "isBatchManaged" }, |
| | | }, |
| | | { |
| | | field: "syncedMes", |
| | | title: "同步状态", |
| | | width: 100, |
| | | fixed: "right", |
| | | slots: { default: "syncedMes" }, |
| | | }, |
| | | { |
| | | field: "status", |
| | | title: "状态", |
| | | width: 80, |
| | | fixed: "right", |
| | | cellRender: { |
| | | name: "CellDict", |
| | | props: { type: DICT_TYPE.COMMON_STATUS }, |
| | | }, |
| | | }, |
| | | { |
| | | title: "操作", |
| | | width: 180, |
| | | fixed: "right", |