From b176162c23294d8d1bfb9f09cf6bb759efb0124a Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 15 七月 2026 14:10:26 +0800
Subject: [PATCH] 银川 1.库存现有量添加自定义出库入库功能 2.整理重复文件

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

diff --git a/src/views/basicData/mdm/data.ts b/src/views/basicData/mdm/data.ts
index a809585..bbde65a 100644
--- a/src/views/basicData/mdm/data.ts
+++ b/src/views/basicData/mdm/data.ts
@@ -1,213 +1,405 @@
-import type { VbenFormSchema } from '#/adapter/form';
-import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { VbenFormSchema } from "#/adapter/form";
+import type { VxeTableGridOptions } from "#/adapter/vxe-table";
 
-import { CommonStatusEnum, DICT_TYPE } from '#/packages/constants/src';
-import { getDictOptions } from '#/packages/effects/hooks/src';
+import { CommonStatusEnum, DICT_TYPE } from "#/packages/constants/src";
+import { getDictOptions } from "#/packages/effects/hooks/src";
 
 import { z } from '#/adapter/form';
+import { getItemTypeSimpleList } from '#/api/mes/md/item/type';
+import { getUnitPage } from '#/api/mdm/unit';
 
-/** 鐗╂枡绫诲瀷閫夐」 */
-export const ITEM_TYPE_OPTIONS = [
-  { label: '鍘熸枡', value: 1 },
-  { label: '鍗婃垚鍝�', value: 2 },
-  { label: '鎴愬搧', value: 3 },
-  { label: '杈呮枡', value: 4 },
-];
+// 缂撳瓨鍗曚綅鍒楄〃
+let unitListCache: any[] | null = null;
+let unitListPromise: Promise<any[]> | null = null;
+
+/** 鑾峰彇鍗曚綅鍒楄〃锛堝甫缂撳瓨锛� */
+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;
+}
 
 /** 鏂板/淇敼鐨勮〃鍗� */
 export function useFormSchema(): VbenFormSchema[] {
   return [
     {
-      component: 'Input',
-      fieldName: 'id',
+      component: "Input",
+      fieldName: "id",
       dependencies: {
-        triggerFields: [''],
+        triggerFields: [""],
         show: () => false,
       },
     },
     {
-      component: 'Input',
-      fieldName: 'code',
-      label: '鐗╂枡缂栫爜',
+      component: "Input",
+      fieldName: "code",
+      label: "鐗╂枡缂栫爜",
       componentProps: {
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�',
+        placeholder: "璇疯緭鍏ョ墿鏂欑紪鐮�",
       },
-      rules: 'required',
+      rules: "required",
     },
     {
-      component: 'Input',
-      fieldName: 'name',
-      label: '鐗╂枡鍚嶇О',
+      component: "Input",
+      fieldName: "name",
+      label: "鐗╂枡鍚嶇О",
       componentProps: {
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�',
+        placeholder: "璇疯緭鍏ョ墿鏂欏悕绉�",
       },
-      rules: 'required',
+      rules: "required",
     },
     {
-      component: 'Input',
-      fieldName: 'barCode',
-      label: '鏉$爜',
+      component: "ApiSelect",
+      fieldName: "categoryId",
+      label: "鐗╂枡鍒嗙被",
+      rules: "selectRequired",
       componentProps: {
-        placeholder: '璇疯緭鍏ユ潯鐮�',
-      },
-    },
-    {
-      component: 'Input',
-      fieldName: 'specification',
-      label: '瑙勬牸鍨嬪彿',
-      componentProps: {
-        placeholder: '璇疯緭鍏ヨ鏍煎瀷鍙�',
-      },
-    },
-    {
-      component: 'TreeSelect',
-      fieldName: 'categoryId',
-      label: '鐗╂枡鍒嗙被',
-      componentProps: {
-        placeholder: '璇烽�夋嫨鐗╂枡鍒嗙被',
+        placeholder: "璇烽�夋嫨鐗╂枡鍒嗙被",
         allowClear: true,
-        treeData: [],
-        fieldNames: { label: 'name', value: 'id', children: 'children' },
+        api: async () => {
+          const res = await getItemTypeSimpleList();
+          return res || [];
+        },
+        labelField: "name",
+        valueField: "id",
       },
     },
     {
-      component: 'Select',
-      fieldName: 'unitMeasureId',
-      label: '璁¢噺鍗曚綅',
+      component: "Input",
+      fieldName: "specification",
+      label: "瑙勬牸鍨嬪彿",
       componentProps: {
-        placeholder: '璇烽�夋嫨璁¢噺鍗曚綅',
+        placeholder: "璇疯緭鍏ヨ鏍煎瀷鍙�",
+      },
+    },
+    {
+      component: "ApiSelect",
+      fieldName: "unitMeasureId",
+      label: "璁¢噺鍗曚綅",
+      rules: "required",
+      formItemClass: "col-span-1",
+      componentProps: {
+        placeholder: "璇烽�夋嫨璁¢噺鍗曚綅",
         allowClear: true,
-        options: [],
-        fieldNames: { label: 'name', value: 'id' },
+        api: getUnitListCached,
+        labelField: "name",
+        valueField: "id",
       },
     },
     {
-      component: 'Select',
-      fieldName: 'brandId',
-      label: '鍝佺墝',
+      component: "ApiSelect",
+      fieldName: "unitMeasureId2",
+      label: "杈呭崟浣�1",
+      formItemClass: "col-span-1",
       componentProps: {
-        placeholder: '璇烽�夋嫨鍝佺墝',
+        placeholder: "璇烽�夋嫨杈呭崟浣�1",
         allowClear: true,
-        options: [],
-        fieldNames: { label: 'name', value: 'id' },
+        api: getUnitListCached,
+        labelField: "name",
+        valueField: "id",
       },
     },
     {
-      component: 'Select',
-      fieldName: 'itemType',
-      label: '鐗╂枡绫诲瀷',
+      component: "InputNumber",
+      fieldName: "unitMeasureRate1",
+      label: "杈呭崟浣�1鎹㈢畻姣旂巼",
+      formItemClass: "col-span-1",
       componentProps: {
-        placeholder: '璇烽�夋嫨鐗╂枡绫诲瀷',
-        options: ITEM_TYPE_OPTIONS,
+        class: "!w-full",
+        min: 0,
+        precision: 6,
+        placeholder: "璇疯緭鍏ユ崲绠楁瘮鐜�",
       },
-      rules: 'required',
     },
     {
-      component: 'InputNumber',
-      fieldName: 'purchasePrice',
-      label: '閲囪喘浠�',
+      component: "ApiSelect",
+      fieldName: "unitMeasureId3",
+      label: "杈呭崟浣�2",
+      formItemClass: "col-span-1",
       componentProps: {
-        class: '!w-full',
+        placeholder: "璇烽�夋嫨杈呭崟浣�2",
+        allowClear: true,
+        api: getUnitListCached,
+        labelField: "name",
+        valueField: "id",
+      },
+    },
+    {
+      component: "InputNumber",
+      fieldName: "unitMeasureRate2",
+      label: "杈呭崟浣�2鎹㈢畻姣旂巼",
+      formItemClass: "col-span-1",
+      componentProps: {
+        class: "!w-full",
+        min: 0,
+        precision: 6,
+        placeholder: "璇疯緭鍏ユ崲绠楁瘮鐜�",
+      },
+    },
+    {
+      component: 'Input',
+      fieldName: 'warehouseId',
+      label: '榛樿浠撳簱',
+      componentProps: {
+        placeholder: '璇疯緭鍏ラ粯璁や粨搴揑D',
+      },
+    },
+    {
+      component: "Input",
+      fieldName: "barCode",
+      label: "鏉$爜",
+      componentProps: {
+        placeholder: "璇疯緭鍏ユ潯鐮�",
+      },
+    },
+    {
+      component: "InputNumber",
+      fieldName: "purchasePrice",
+      label: "閲囪喘浠�",
+      componentProps: {
+        class: "!w-full",
         min: 0,
         precision: 2,
-        placeholder: '璇疯緭鍏ラ噰璐环',
+        placeholder: "璇疯緭鍏ラ噰璐环",
       },
     },
     {
-      component: 'InputNumber',
-      fieldName: 'salesPrice',
-      label: '閿�鍞环',
+      component: "InputNumber",
+      fieldName: "salesPrice",
+      label: "閿�鍞环",
       componentProps: {
-        class: '!w-full',
+        class: "!w-full",
         min: 0,
         precision: 2,
-        placeholder: '璇疯緭鍏ラ攢鍞环',
+        placeholder: "璇疯緭鍏ラ攢鍞环",
       },
     },
     {
-      component: 'InputNumber',
-      fieldName: 'costPrice',
-      label: '鎴愭湰浠�',
+      component: "InputNumber",
+      fieldName: "costPrice",
+      label: "鎴愭湰浠�",
       componentProps: {
-        class: '!w-full',
+        class: "!w-full",
         min: 0,
         precision: 2,
-        placeholder: '璇疯緭鍏ユ垚鏈环',
+        placeholder: "璇疯緭鍏ユ垚鏈环",
       },
     },
     {
-      component: 'InputNumber',
-      fieldName: 'safetyStock',
-      label: '瀹夊叏搴撳瓨',
+      component: "InputNumber",
+      fieldName: "safetyStock",
+      label: "瀹夊叏搴撳瓨",
       componentProps: {
-        class: '!w-full',
+        class: "!w-full",
         min: 0,
         precision: 2,
-        placeholder: '璇疯緭鍏ュ畨鍏ㄥ簱瀛�',
+        placeholder: "璇疯緭鍏ュ畨鍏ㄥ簱瀛�",
       },
     },
     {
-      component: 'InputNumber',
-      fieldName: 'minStock',
-      label: '鏈�浣庡簱瀛�',
+      component: "InputNumber",
+      fieldName: "minStock",
+      label: "鏈�浣庡簱瀛�",
       componentProps: {
-        class: '!w-full',
+        class: "!w-full",
         min: 0,
         precision: 2,
-        placeholder: '璇疯緭鍏ユ渶浣庡簱瀛�',
+        placeholder: "璇疯緭鍏ユ渶浣庡簱瀛�",
       },
     },
     {
-      component: 'InputNumber',
-      fieldName: 'maxStock',
-      label: '鏈�楂樺簱瀛�',
+      component: "InputNumber",
+      fieldName: "maxStock",
+      label: "鏈�楂樺簱瀛�",
       componentProps: {
-        class: '!w-full',
+        class: "!w-full",
         min: 0,
         precision: 2,
-        placeholder: '璇疯緭鍏ユ渶楂樺簱瀛�',
+        placeholder: "璇疯緭鍏ユ渶楂樺簱瀛�",
       },
     },
     {
       component: 'Switch',
       fieldName: 'isBatchManaged',
       label: '鎵规绠$悊',
+      defaultValue: false,
       componentProps: {
-        class: 'w-auto',
-        checkedChildren: '鏄�',
-        unCheckedChildren: '鍚�',
+        class: "w-auto",
+        checkedChildren: "鏄�",
+        unCheckedChildren: "鍚�",
       },
       rules: z.boolean().default(false),
     },
     {
-      component: 'InputNumber',
-      fieldName: 'expiryDay',
-      label: '鏈夋晥鏈�(澶�)',
+      component: "Switch",
+      fieldName: "syncMes",
+      label: "鍚屾鍒� MES",
       componentProps: {
-        class: '!w-full',
+        class: "w-auto",
+        checkedChildren: "鏄�",
+        unCheckedChildren: "鍚�",
+      },
+      rules: z.boolean().default(false),
+    },
+    {
+      component: "InputNumber",
+      fieldName: "expiryDay",
+      label: "鏈夋晥鏈�(澶�)",
+      componentProps: {
+        class: "!w-full",
         min: 0,
-        placeholder: '璇疯緭鍏ユ湁鏁堟湡',
+        placeholder: "璇疯緭鍏ユ湁鏁堟湡",
       },
     },
     {
-      component: 'RadioGroup',
-      fieldName: 'status',
-      label: '鐘舵��',
+      component: "RadioGroup",
+      fieldName: "status",
+      label: "鐘舵��",
       componentProps: {
-        options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
-        buttonStyle: 'solid',
-        optionType: 'button',
+        options: getDictOptions(DICT_TYPE.COMMON_STATUS, "number"),
+        buttonStyle: "solid",
+        optionType: "button",
       },
       rules: z.number().default(CommonStatusEnum.ENABLE),
     },
     {
-      component: 'Textarea',
-      fieldName: 'remark',
-      label: '澶囨敞',
-      formItemClass: 'col-span-2',
+      component: "Textarea",
+      fieldName: "remark",
+      label: "澶囨敞",
+      formItemClass: "col-span-2",
       componentProps: {
-        placeholder: '璇疯緭鍏ュ娉�',
+        placeholder: "璇疯緭鍏ュ娉�",
         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,
       },
     },
   ];
@@ -217,137 +409,133 @@
 export function useGridFormSchema(): VbenFormSchema[] {
   return [
     {
-      fieldName: 'code',
-      label: '鐗╂枡缂栫爜',
-      component: 'Input',
+      fieldName: "code",
+      label: "鐗╂枡缂栫爜",
+      component: "Input",
       componentProps: {
-        placeholder: '璇疯緭鍏ョ墿鏂欑紪鐮�',
+        placeholder: "璇疯緭鍏ョ墿鏂欑紪鐮�",
         allowClear: true,
       },
     },
     {
-      fieldName: 'name',
-      label: '鐗╂枡鍚嶇О',
-      component: 'Input',
+      fieldName: "name",
+      label: "鐗╂枡鍚嶇О",
+      component: "Input",
       componentProps: {
-        placeholder: '璇疯緭鍏ョ墿鏂欏悕绉�',
+        placeholder: "璇疯緭鍏ョ墿鏂欏悕绉�",
         allowClear: true,
       },
     },
     {
-      fieldName: 'categoryId',
-      label: '鐗╂枡鍒嗙被',
-      component: 'TreeSelect',
+      fieldName: "status",
+      label: "鐘舵��",
+      component: "Select",
       componentProps: {
-        placeholder: '璇烽�夋嫨鐗╂枡鍒嗙被',
+        placeholder: "璇烽�夋嫨鐘舵��",
         allowClear: true,
-        treeData: [],
-        fieldNames: { label: 'name', value: 'id', children: 'children' },
-      },
-    },
-    {
-      fieldName: 'itemType',
-      label: '鐗╂枡绫诲瀷',
-      component: 'Select',
-      componentProps: {
-        placeholder: '璇烽�夋嫨鐗╂枡绫诲瀷',
-        allowClear: true,
-        options: ITEM_TYPE_OPTIONS,
-      },
-    },
-    {
-      fieldName: 'status',
-      label: '鐘舵��',
-      component: 'Select',
-      componentProps: {
-        placeholder: '璇烽�夋嫨鐘舵��',
-        allowClear: true,
-        options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
+        options: getDictOptions(DICT_TYPE.COMMON_STATUS, "number"),
       },
     },
   ];
 }
 
 /** 鍒楄〃鐨勫瓧娈� */
-export function useGridColumns(): VxeTableGridOptions['columns'] {
+export function useGridColumns(): VxeTableGridOptions["columns"] {
   return [
-    { type: 'checkbox', width: 40 },
+    { type: "checkbox", width: 40 },
     {
-      field: 'code',
-      title: '鐗╂枡缂栫爜',
+      field: "code",
+      title: "鐗╂枡缂栫爜",
       minWidth: 120,
     },
     {
-      field: 'name',
-      title: '鐗╂枡鍚嶇О',
+      field: "name",
+      title: "鐗╂枡鍚嶇О",
       minWidth: 180,
     },
     {
-      field: 'specification',
-      title: '瑙勬牸鍨嬪彿',
+      field: "specification",
+      title: "瑙勬牸鍨嬪彿",
       minWidth: 150,
     },
     {
-      field: 'categoryName',
-      title: '鍒嗙被',
-      minWidth: 100,
+      field: "categoryName",
+      title: "鐗╂枡鍒嗙被",
+      minWidth: 120,
+      slots: { default: "categoryName" },
     },
     {
-      field: 'unitMeasureName',
-      title: '鍗曚綅',
+      field: "unitMeasureName",
+      title: "鍗曚綅",
       minWidth: 80,
     },
     {
-      field: 'itemType',
-      title: '鐗╂枡绫诲瀷',
-      minWidth: 100,
-      cellRender: {
-        name: 'CellDict',
-        props: { type: DICT_TYPE.MDM_ITEM_TYPE },
-      },
+      field: "unitMeasureName2",
+      title: "杈呭崟浣�1",
+      minWidth: 80,
     },
     {
-      field: 'purchasePrice',
-      title: '閲囪喘浠�',
+      field: "unitMeasureRate1",
+      title: "杈呭崟浣�1鎹㈢畻姣旂巼",
+      minWidth: 130,
+    },
+    {
+      field: "unitMeasureName3",
+      title: "杈呭崟浣�2",
+      minWidth: 80,
+    },
+    {
+      field: "unitMeasureRate2",
+      title: "杈呭崟浣�2鎹㈢畻姣旂巼",
+      minWidth: 130,
+    },
+    {
+      field: "warehouseName",
+      title: "榛樿浠撳簱",
+      minWidth: 100,
+    },
+    {
+      field: "purchasePrice",
+      title: "閲囪喘浠�",
       minWidth: 100,
       formatter: ({ cellValue }) => {
-        return cellValue != null ? `楼${Number(cellValue).toFixed(2)}` : '';
+        return cellValue != null ? `楼${Number(cellValue).toFixed(2)}` : "";
       },
     },
     {
-      field: 'salesPrice',
-      title: '閿�鍞环',
+      field: "salesPrice",
+      title: "閿�鍞环",
       minWidth: 100,
       formatter: ({ cellValue }) => {
-        return cellValue != null ? `楼${Number(cellValue).toFixed(2)}` : '';
+        return cellValue != null ? `楼${Number(cellValue).toFixed(2)}` : "";
       },
     },
     {
-      field: 'isBatchManaged',
-      title: '鎵规绠$悊',
+      field: "isBatchManaged",
+      title: "鎵规绠$悊",
       minWidth: 80,
-      slots: { default: 'isBatchManaged' },
+      slots: { default: "isBatchManaged" },
     },
     {
-      field: 'status',
-      title: '鐘舵��',
+      field: "status",
+      title: "鐘舵��",
       minWidth: 80,
       cellRender: {
-        name: 'CellDict',
+        name: "CellDict",
         props: { type: DICT_TYPE.COMMON_STATUS },
       },
     },
     {
-      field: 'createTime',
-      title: '鍒涘缓鏃堕棿',
+      field: "createTime",
+      title: "鍒涘缓鏃堕棿",
       minWidth: 180,
-      formatter: 'formatDateTime',
+      formatter: "formatDateTime",
     },
     {
-      title: '鎿嶄綔',
+      title: "鎿嶄綔",
       width: 180,
-      fixed: 'right',
-      slots: { default: 'actions' },
+      fixed: "right",
+      slots: { default: "actions" },
     },
   ];
 }

--
Gitblit v1.9.3