From 46624ce480a3c14da21f39cc4ad5f7eecea2bb1e Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 17 九月 2026 16:24:28 +0800
Subject: [PATCH] feat(mes): 优化生产批次和袋码管理功能

---
 src/views/basicData/mdm/data.ts |  185 ++++++++++++++++++++++------------------------
 1 files changed, 88 insertions(+), 97 deletions(-)

diff --git a/src/views/basicData/mdm/data.ts b/src/views/basicData/mdm/data.ts
index c77d66f..94837a7 100644
--- a/src/views/basicData/mdm/data.ts
+++ b/src/views/basicData/mdm/data.ts
@@ -9,8 +9,8 @@
 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';
 
 import { Button } from 'ant-design-vue';
 
@@ -18,23 +18,9 @@
 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;
-}
+// 缂撳瓨浠撳簱鍒楄〃
+let warehouseListCache: any[] | null = null;
+let warehouseListPromise: Promise<any[]> | null = null;
 
 /** 鑾峰彇鍗曚綅鍒楄〃锛堝甫缂撳瓨锛� */
 async function getUnitListCached() {
@@ -53,9 +39,27 @@
   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;
 }
 
 /** 鏂板/淇敼鐨勮〃鍗� */
@@ -72,12 +76,12 @@
     {
       component: "Input",
       fieldName: "code",
-      label: "鐗╂枡缂栫爜",
+      label: "鍝佺缂栫爜",
       componentProps: {
         maxLength: 64,
-        placeholder: "璇疯緭鍏ョ墿鏂欑紪鐮�",
+        placeholder: "璇疯緭鍏ュ搧绉嶇紪鐮�",
       },
-      rules: z.string().min(1, '鐗╂枡缂栫爜涓嶈兘涓虹┖').max(64),
+      rules: z.string().min(1, '鍝佺缂栫爜涓嶈兘涓虹┖').max(64),
       suffix: () =>
         h(
           Button,
@@ -96,26 +100,11 @@
     {
       component: "Input",
       fieldName: "name",
-      label: "鐗╂枡鍚嶇О",
+      label: "鍝佺鍚嶇О",
       componentProps: {
-        placeholder: "璇疯緭鍏ョ墿鏂欏悕绉�",
+        placeholder: "璇疯緭鍏ュ搧绉嶅悕绉�",
       },
       rules: "required",
-    },
-    {
-      component: "ApiTreeSelect",
-      fieldName: "categoryId",
-      label: "鐗╂枡鍒嗙被",
-      rules: "selectRequired",
-      componentProps: {
-        placeholder: "璇烽�夋嫨鐗╂枡鍒嗙被",
-        allowClear: true,
-        treeDefaultExpandAll: true,
-        api: async () => {
-          const res = await getItemTypeSimpleList();
-          return buildCategoryTree(res || []);
-        },
-      },
     },
     {
       component: "Input",
@@ -190,11 +179,29 @@
       },
     },
     {
-      component: 'Input',
+      component: 'ApiSelect',
       fieldName: 'warehouseId',
       label: '榛樿浠撳簱',
       componentProps: {
-        placeholder: '璇疯緭鍏ラ粯璁や粨搴揑D',
+        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,
       },
     },
     {
@@ -203,17 +210,6 @@
       label: "鏉$爜",
       componentProps: {
         placeholder: "璇疯緭鍏ユ潯鐮�",
-      },
-    },
-    {
-      component: "InputNumber",
-      fieldName: "purchasePrice",
-      label: "閲囪喘浠�",
-      componentProps: {
-        class: "!w-full",
-        min: 0,
-        precision: 2,
-        placeholder: "璇疯緭鍏ラ噰璐环",
       },
     },
     {
@@ -284,17 +280,6 @@
       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: "鏈夋晥鏈�(澶�)",
@@ -303,6 +288,17 @@
         min: 0,
         placeholder: "璇疯緭鍏ユ湁鏁堟湡",
       },
+    },
+    {
+      component: 'Switch',
+      fieldName: 'syncMes',
+      label: '鍚屾鍒癕ES',
+      defaultValue: true,
+      componentProps: {
+        checkedChildren: '鏄�',
+        unCheckedChildren: '鍚�',
+      },
+      rules: z.boolean().default(true),
     },
     {
       component: "RadioGroup",
@@ -453,19 +449,19 @@
   return [
     {
       fieldName: "code",
-      label: "鐗╂枡缂栫爜",
+      label: "鍝佺缂栫爜",
       component: "Input",
       componentProps: {
-        placeholder: "璇疯緭鍏ョ墿鏂欑紪鐮�",
+        placeholder: "璇疯緭鍏ュ搧绉嶇紪鐮�",
         allowClear: true,
       },
     },
     {
       fieldName: "name",
-      label: "鐗╂枡鍚嶇О",
+      label: "鍝佺鍚嶇О",
       component: "Input",
       componentProps: {
-        placeholder: "璇疯緭鍏ョ墿鏂欏悕绉�",
+        placeholder: "璇疯緭鍏ュ搧绉嶅悕绉�",
         allowClear: true,
       },
     },
@@ -488,24 +484,18 @@
     { 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",
@@ -538,14 +528,6 @@
       minWidth: 100,
     },
     {
-      field: "purchasePrice",
-      title: "閲囪喘浠�",
-      minWidth: 100,
-      formatter: ({ cellValue }) => {
-        return cellValue != null ? `楼${Number(cellValue).toFixed(2)}` : "";
-      },
-    },
-    {
       field: "salesPrice",
       title: "閿�鍞环",
       minWidth: 100,
@@ -554,27 +536,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