From b7eb1da8220f5b72f6891c3c6471ca386604cce4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 19 八月 2026 10:38:21 +0800
Subject: [PATCH] feat(dashboard): 添加一袋一码首页并重构相关枚举常量
---
src/views/basicData/mdm/data.ts | 407 ++++++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 299 insertions(+), 108 deletions(-)
diff --git a/src/views/basicData/mdm/data.ts b/src/views/basicData/mdm/data.ts
index 35507c1..0ec3d1d 100644
--- a/src/views/basicData/mdm/data.ts
+++ b/src/views/basicData/mdm/data.ts
@@ -1,39 +1,88 @@
-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 { getUnitPage } from "#/api/mdm/unit";
-import { getWarehouseSimpleList } from "#/api/erp/stock/warehouse";
+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 { getWarehouseSimpleList } from '#/api/mes/wm/warehouse';
-/** 鐗╂枡绫诲瀷閫夐」 */
-export const ITEM_TYPE_OPTIONS = [
- { label: "鍘熸枡", value: 1 },
- { label: "鍗婃垚鍝�", value: 2 },
- { label: "鎴愬搧", value: 3 },
- { label: "杈呮枡", value: 4 },
-];
+import { Button } from 'ant-design-vue';
-/** 鐗╂枡绫诲瀷鏄犲皠 */
-export const ITEM_TYPE_MAP: Record<number, string> = {
- 1: "鍘熸枡",
- 2: "鍗婃垚鍝�",
- 3: "鎴愬搧",
- 4: "杈呮枡",
-};
+// 缂撳瓨鍗曚綅鍒楄〃
+let unitListCache: any[] | null = null;
+let unitListPromise: Promise<any[]> | null = null;
-/** 鐗╂枡绫诲瀷棰滆壊鏄犲皠 */
-export const ITEM_TYPE_COLOR_MAP: Record<number, string> = {
- 1: "green",
- 2: "orange",
- 3: "blue",
- 4: "purple",
-};
+// 缂撳瓨浠撳簱鍒楄〃
+let warehouseListCache: any[] | null = null;
+let warehouseListPromise: Promise<any[]> | null = null;
+
+/** 灏嗘墎骞冲垎绫诲垪琛ㄨ浆涓� TreeSelect 鎵�闇�鐨勬爲褰㈢粨鏋� */
+export 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() {
+ if (unitListCache) {
+ return unitListCache;
+ }
+ if (unitListPromise) {
+ return unitListPromise;
+ }
+ unitListPromise = getUnitPage({ pageNo: 1, pageSize: 100, status: 0 }).then((res) => {
+ unitListCache = res.list || [];
+ return unitListCache;
+ }).finally(() => {
+ unitListPromise = null;
+ });
+ 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(): VbenFormSchema[] {
+export function useFormSchema(formApi?: VbenFormApi, categoryTreeData: any[] = []): VbenFormSchema[] {
return [
{
component: "Input",
@@ -46,31 +95,48 @@
{
component: "Input",
fieldName: "code",
- label: "鐗╂枡缂栫爜",
+ label: "鍝佺缂栫爜",
componentProps: {
- placeholder: "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ 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",
fieldName: "name",
- label: "鐗╂枡鍚嶇О",
+ label: "鍝佺鍚嶇О",
componentProps: {
- placeholder: "璇疯緭鍏ョ墿鏂欏悕绉�",
+ placeholder: "璇疯緭鍏ュ搧绉嶅悕绉�",
},
rules: "required",
},
{
- component: "RadioGroup",
- fieldName: "itemType",
- label: "鐗╂枡绫诲瀷",
+ component: "TreeSelect",
+ fieldName: "categoryId",
+ label: "鍝佺鍒嗙被",
+ rules: "selectRequired",
componentProps: {
- options: ITEM_TYPE_OPTIONS,
- buttonStyle: "solid",
- optionType: "button",
+ placeholder: "璇烽�夋嫨鍝佺鍒嗙被",
+ allowClear: true,
+ treeDefaultExpandAll: true,
+ treeData: categoryTreeData,
+ fieldNames: { label: 'label', value: 'value', children: 'children' },
},
- rules: "required",
},
{
component: "Input",
@@ -89,10 +155,7 @@
componentProps: {
placeholder: "璇烽�夋嫨璁¢噺鍗曚綅",
allowClear: true,
- api: async () => {
- const res = await getUnitPage({ pageNo: 1, pageSize: 100, status: 0 });
- return res.list || [];
- },
+ api: getUnitListCached,
labelField: "name",
valueField: "id",
},
@@ -105,10 +168,7 @@
componentProps: {
placeholder: "璇烽�夋嫨杈呭崟浣�1",
allowClear: true,
- api: async () => {
- const res = await getUnitPage({ pageNo: 1, pageSize: 100, status: 0 });
- return res.list || [];
- },
+ api: getUnitListCached,
labelField: "name",
valueField: "id",
},
@@ -133,10 +193,7 @@
componentProps: {
placeholder: "璇烽�夋嫨杈呭崟浣�2",
allowClear: true,
- api: async () => {
- const res = await getUnitPage({ pageNo: 1, pageSize: 100, status: 0 });
- return res.list || [];
- },
+ api: getUnitListCached,
labelField: "name",
valueField: "id",
},
@@ -154,15 +211,29 @@
},
},
{
- component: "ApiSelect",
- fieldName: "warehouseId",
- label: "榛樿浠撳簱",
+ component: 'ApiSelect',
+ fieldName: 'warehouseId',
+ label: '榛樿浠撳簱',
componentProps: {
- placeholder: "璇烽�夋嫨榛樿浠撳簱",
+ placeholder: '璇烽�夋嫨榛樿浠撳簱',
allowClear: true,
- api: getWarehouseSimpleList,
- labelField: "name",
- valueField: "id",
+ 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,
},
},
{
@@ -240,20 +311,10 @@
},
},
{
- component: "Switch",
- fieldName: "isBatchManaged",
- label: "鎵规绠$悊",
- componentProps: {
- class: "w-auto",
- checkedChildren: "鏄�",
- unCheckedChildren: "鍚�",
- },
- rules: z.boolean().default(true),
- },
- {
- component: "Switch",
- fieldName: "syncMes",
- label: "鍚屾鍒� MES",
+ component: 'Switch',
+ fieldName: 'isBatchManaged',
+ label: '鎵规绠$悊',
+ defaultValue: false,
componentProps: {
class: "w-auto",
checkedChildren: "鏄�",
@@ -270,6 +331,17 @@
min: 0,
placeholder: "璇疯緭鍏ユ湁鏁堟湡",
},
+ },
+ {
+ component: 'Switch',
+ fieldName: 'syncMes',
+ label: '鍚屾鍒癕ES',
+ defaultValue: true,
+ componentProps: {
+ checkedChildren: '鏄�',
+ unCheckedChildren: '鍚�',
+ },
+ rules: z.boolean().default(true),
},
{
component: "RadioGroup",
@@ -292,6 +364,126 @@
rows: 3,
},
},
+ // ===== 鎵规灞炴�ч厤缃紙isBatchManaged = true 鏃舵樉绀猴級 =====
+ {
+ component: "Divider",
+ fieldName: "batchConfigDivider",
+ label: "鎵规灞炴�ч厤缃�",
+ formItemClass: "col-span-2",
+ componentProps: {
+ orientation: "left",
+ plain: true,
+ },
+ dependencies: {
+ triggerFields: ["isBatchManaged"],
+ show: (values) => values.isBatchManaged === true,
+ },
+ },
+ {
+ component: "Switch",
+ fieldName: "produceDateFlag",
+ label: "鐢熶骇鏃ユ湡蹇呭~",
+ defaultValue: false,
+ componentProps: {
+ class: "w-auto",
+ checkedChildren: "鏄�",
+ unCheckedChildren: "鍚�",
+ },
+ dependencies: {
+ triggerFields: ["isBatchManaged"],
+ show: (values) => values.isBatchManaged === true,
+ },
+ },
+ {
+ component: "Switch",
+ fieldName: "expireDateFlag",
+ label: "鏈夋晥鏈熷繀濉�",
+ defaultValue: false,
+ componentProps: {
+ class: "w-auto",
+ checkedChildren: "鏄�",
+ unCheckedChildren: "鍚�",
+ },
+ dependencies: {
+ triggerFields: ["isBatchManaged"],
+ show: (values) => values.isBatchManaged === true,
+ },
+ },
+ {
+ component: "Switch",
+ fieldName: "receiptDateFlag",
+ label: "鍏ュ簱鏃ユ湡蹇呭~",
+ defaultValue: false,
+ componentProps: {
+ class: "w-auto",
+ checkedChildren: "鏄�",
+ unCheckedChildren: "鍚�",
+ },
+ dependencies: {
+ triggerFields: ["isBatchManaged"],
+ show: (values) => values.isBatchManaged === true,
+ },
+ },
+ {
+ component: "Switch",
+ fieldName: "vendorFlag",
+ label: "渚涘簲鍟嗗繀濉�",
+ defaultValue: false,
+ componentProps: {
+ class: "w-auto",
+ checkedChildren: "鏄�",
+ unCheckedChildren: "鍚�",
+ },
+ dependencies: {
+ triggerFields: ["isBatchManaged"],
+ show: (values) => values.isBatchManaged === true,
+ },
+ },
+ {
+ component: "Switch",
+ fieldName: "purchaseOrderCodeFlag",
+ label: "閲囪喘璁㈠崟鍙峰繀濉�",
+ defaultValue: false,
+ componentProps: {
+ class: "w-auto",
+ checkedChildren: "鏄�",
+ unCheckedChildren: "鍚�",
+ },
+ dependencies: {
+ triggerFields: ["isBatchManaged"],
+ show: (values) => values.isBatchManaged === true,
+ },
+ },
+ {
+ component: "Switch",
+ fieldName: "lotNumberFlag",
+ label: "鐢熶骇鎵瑰彿蹇呭~",
+ defaultValue: false,
+ componentProps: {
+ class: "w-auto",
+ checkedChildren: "鏄�",
+ unCheckedChildren: "鍚�",
+ },
+ dependencies: {
+ triggerFields: ["isBatchManaged"],
+ show: (values) => values.isBatchManaged === true,
+ },
+ },
+ {
+ component: "Switch",
+ fieldName: "qualityStatusFlag",
+ label: "璐ㄩ噺鐘舵�佸繀濉�",
+ defaultValue: false,
+ componentProps: {
+ class: "w-auto",
+ checkedChildren: "鏄�",
+ unCheckedChildren: "鍚�",
+ },
+ dependencies: {
+ triggerFields: ["isBatchManaged"],
+ show: (values) => values.isBatchManaged === true,
+ },
+ },
];
}
@@ -300,30 +492,20 @@
return [
{
fieldName: "code",
- label: "鐗╂枡缂栫爜",
+ label: "鍝佺缂栫爜",
component: "Input",
componentProps: {
- placeholder: "璇疯緭鍏ョ墿鏂欑紪鐮�",
+ placeholder: "璇疯緭鍏ュ搧绉嶇紪鐮�",
allowClear: true,
},
},
{
fieldName: "name",
- label: "鐗╂枡鍚嶇О",
+ label: "鍝佺鍚嶇О",
component: "Input",
componentProps: {
- placeholder: "璇疯緭鍏ョ墿鏂欏悕绉�",
+ placeholder: "璇疯緭鍏ュ搧绉嶅悕绉�",
allowClear: true,
- },
- },
- {
- fieldName: "itemType",
- label: "鐗╂枡绫诲瀷",
- component: "Select",
- componentProps: {
- placeholder: "璇烽�夋嫨鐗╂枡绫诲瀷",
- allowClear: true,
- options: ITEM_TYPE_OPTIONS,
},
},
{
@@ -345,18 +527,24 @@
{ type: "checkbox", width: 40 },
{
field: "code",
- title: "鐗╂枡缂栫爜",
+ title: "鍝佺缂栫爜",
minWidth: 120,
},
{
field: "name",
- title: "鐗╂枡鍚嶇О",
+ title: "鍝佺鍚嶇О",
minWidth: 180,
},
{
field: "specification",
title: "瑙勬牸鍨嬪彿",
minWidth: 150,
+ },
+ {
+ field: "categoryName",
+ title: "鍝佺鍒嗙被",
+ minWidth: 120,
+ slots: { default: "categoryName" },
},
{
field: "unitMeasureName",
@@ -389,12 +577,6 @@
minWidth: 100,
},
{
- field: "itemType",
- title: "鐗╂枡绫诲瀷",
- minWidth: 100,
- slots: { default: "itemType" },
- },
- {
field: "purchasePrice",
title: "閲囪喘浠�",
minWidth: 100,
@@ -411,27 +593,36 @@
},
},
{
- 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",
--
Gitblit v1.9.3