From 2c38ccf9592a3d44e35ecc6b145adb763c63c287 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期五, 21 八月 2026 13:37:08 +0800
Subject: [PATCH] Merge branch 'dev_pro2.0' of http://114.132.189.42:9002/r/mom-pro2-before into dev_pro2.0

---
 src/views/mes/md/item/type/modules/import-form.vue   |  105 +++++++++++
 src/views/basicData/mdm/modules/import-form.vue      |  105 +++++++++++
 src/api/mdm/unit/index.ts                            |   13 +
 src/views/basicData/mdm/unit/modules/import-form.vue |  105 +++++++++++
 src/views/mes/md/item/type/data.ts                   |   24 ++
 src/views/mes/md/item/type/index.vue                 |   20 ++
 src/views/basicData/mdm/unit/data.ts                 |   24 ++
 src/views/basicData/mdm/data.ts                      |   24 ++
 src/views/basicData/mdm/index.vue                    |   19 ++
 src/api/mes/md/item/type/index.ts                    |   13 +
 src/views/basicData/mdm/unit/index.vue               |   19 ++
 src/api/mdm/item/index.ts                            |   13 +
 12 files changed, 483 insertions(+), 1 deletions(-)

diff --git a/src/api/mdm/item/index.ts b/src/api/mdm/item/index.ts
index d950b6e..9b0d538 100644
--- a/src/api/mdm/item/index.ts
+++ b/src/api/mdm/item/index.ts
@@ -116,3 +116,16 @@
 export function exportItem(params: Partial<MdmItemApi.Item>) {
   return requestClient.download('/mdm/item/export-excel', { params });
 }
+
+/** 涓嬭浇鐗╂枡瀵煎叆妯℃澘 */
+export function importItemTemplate() {
+  return requestClient.download('/mdm/item/get-import-template');
+}
+
+/** 瀵煎叆鐗╂枡 */
+export function importItem(file: File, updateSupport: boolean) {
+  return requestClient.upload('/mdm/item/import', {
+    file,
+    updateSupport,
+  });
+}
diff --git a/src/api/mdm/unit/index.ts b/src/api/mdm/unit/index.ts
index 6b437ba..5041a55 100644
--- a/src/api/mdm/unit/index.ts
+++ b/src/api/mdm/unit/index.ts
@@ -47,3 +47,16 @@
 export function deleteUnit(id: number) {
   return requestClient.delete(`/mdm/unit/delete?id=${id}`);
 }
+
+/** 涓嬭浇璁¢噺鍗曚綅瀵煎叆妯℃澘 */
+export function importUnitTemplate() {
+  return requestClient.download('/mdm/unit/get-import-template');
+}
+
+/** 瀵煎叆璁¢噺鍗曚綅 */
+export function importUnit(file: File, updateSupport: boolean) {
+  return requestClient.upload('/mdm/unit/import', {
+    file,
+    updateSupport,
+  });
+}
diff --git a/src/api/mes/md/item/type/index.ts b/src/api/mes/md/item/type/index.ts
index e9367ee..bd99b95 100644
--- a/src/api/mes/md/item/type/index.ts
+++ b/src/api/mes/md/item/type/index.ts
@@ -52,3 +52,16 @@
 export function deleteItemType(id: number) {
   return requestClient.delete(`/mes/md/item-type/delete?id=${id}`);
 }
+
+/** 涓嬭浇鐗╂枡浜у搧鍒嗙被瀵煎叆妯℃澘 */
+export function importItemTypeTemplate() {
+  return requestClient.download('/mes/md/item-type/get-import-template');
+}
+
+/** 瀵煎叆鐗╂枡浜у搧鍒嗙被 */
+export function importItemType(file: File, updateSupport: boolean) {
+  return requestClient.upload('/mes/md/item-type/import', {
+    file,
+    updateSupport,
+  });
+}
diff --git a/src/views/basicData/mdm/data.ts b/src/views/basicData/mdm/data.ts
index a2fb42c..ca625c3 100644
--- a/src/views/basicData/mdm/data.ts
+++ b/src/views/basicData/mdm/data.ts
@@ -630,3 +630,27 @@
     },
   ];
 }
+
+/** 鐗╂枡瀵煎叆鐨勮〃鍗� */
+export function useImportFormSchema(): VbenFormSchema[] {
+  return [
+    {
+      fieldName: 'file',
+      label: '鐗╂枡鏁版嵁',
+      component: 'Upload',
+      rules: 'required',
+      help: '浠呭厑璁稿鍏� xls銆亁lsx 鏍煎紡鏂囦欢',
+    },
+    {
+      fieldName: 'updateSupport',
+      label: '鏄惁瑕嗙洊',
+      component: 'Switch',
+      componentProps: {
+        checkedChildren: '鏄�',
+        unCheckedChildren: '鍚�',
+      },
+      rules: z.boolean().default(false),
+      help: '鏄惁鏇存柊宸茬粡瀛樺湪鐨勭墿鏂欐暟鎹�',
+    },
+  ];
+}
diff --git a/src/views/basicData/mdm/index.vue b/src/views/basicData/mdm/index.vue
index 8995f78..99cea03 100644
--- a/src/views/basicData/mdm/index.vue
+++ b/src/views/basicData/mdm/index.vue
@@ -24,11 +24,17 @@
 
 import { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
+import ImportForm from './modules/import-form.vue';
 
 defineOptions({ name: 'MdmItem' });
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
+  destroyOnClose: true,
+});
+
+const [ImportModal, importModalApi] = useVbenModal({
+  connectedComponent: ImportForm,
   destroyOnClose: true,
 });
 
@@ -84,6 +90,11 @@
 /** 鍒涘缓鐗╂枡 */
 function handleCreate() {
   formModalApi.setData(null).open();
+}
+
+/** 瀵煎叆鐗╂枡 */
+function handleImport() {
+  importModalApi.open();
 }
 
 /** 缂栬緫鐗╂枡 */
@@ -211,6 +222,7 @@
 <template>
   <Page auto-content-height>
     <FormModal @success="handleRefresh" />
+    <ImportModal @success="handleRefresh" />
     <Grid table-title="鐗╂枡鍒楄〃">
       <template #toolbar-tools>
         <TableAction
@@ -222,6 +234,13 @@
               auth: ['mdm:item:create'],
               onClick: handleCreate,
             },
+            {
+              label: $t('ui.actionTitle.import', ['鐗╂枡']),
+              type: 'primary',
+              icon: ACTION_ICON.UPLOAD,
+              auth: ['mdm:item:import'],
+              onClick: handleImport,
+            },
             // {
             //   label: $t('ui.actionTitle.export'),
             //   type: 'primary',
diff --git a/src/views/basicData/mdm/modules/import-form.vue b/src/views/basicData/mdm/modules/import-form.vue
new file mode 100644
index 0000000..5cc47a2
--- /dev/null
+++ b/src/views/basicData/mdm/modules/import-form.vue
@@ -0,0 +1,105 @@
+<script lang="ts" setup>
+import type { FileType } from 'ant-design-vue/es/upload/interface';
+
+import { h } from 'vue';
+
+import { useVbenModal } from '@vben/common-ui';
+import { downloadFileFromBlobPart } from '@vben/utils';
+
+import { Button, message, notification, Upload } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { importItem, importItemTemplate } from '#/api/mdm/item';
+import { $t } from '#/locales';
+
+import { useImportFormSchema } from '../data';
+
+const emit = defineEmits(['success']);
+
+const [Form, formApi] = useVbenForm({
+  commonConfig: {
+    formItemClass: 'col-span-2',
+    labelWidth: 120,
+  },
+  layout: 'horizontal',
+  schema: useImportFormSchema(),
+  showDefaultActions: false,
+});
+
+const [Modal, modalApi] = useVbenModal({
+  async onConfirm() {
+    const { valid } = await formApi.validate();
+    if (!valid) {
+      return;
+    }
+    modalApi.lock();
+    // 鎻愪氦琛ㄥ崟
+    const data = await formApi.getValues();
+    try {
+      const response = (await importItem(data.file, data.updateSupport)) as any;
+      // 鍏抽棴骞舵彁绀�
+      await modalApi.close();
+      emit('success');
+
+      const resultData = response?.data || response || {};
+      const failureList = resultData.failureList || {};
+
+      if (Object.keys(failureList).length > 0) {
+        const errorNodes = Object.entries(failureList).map(([name, reason]) => {
+          return h('div', `${name}: ${reason}`);
+        });
+
+        notification.warning({
+          message: '瀵煎叆瀹屾垚锛岄儴鍒嗙墿鏂欏鍏ュけ璐�',
+          description: () => h('div', errorNodes),
+          duration: null,
+        });
+      } else {
+        message.success($t('ui.actionMessage.operationSuccess'));
+      }
+    } finally {
+      modalApi.unlock();
+    }
+  },
+});
+
+/** 涓婁紶鍓� */
+function beforeUpload(file: FileType) {
+  formApi.setFieldValue('file', file);
+  return false;
+}
+
+/** 涓嬭浇妯$増 */
+async function handleDownload() {
+  const data = await importItemTemplate();
+  downloadFileFromBlobPart({ fileName: '鐗╂枡瀵煎叆妯℃澘.xls', source: data });
+}
+</script>
+
+<template>
+  <Modal title="瀵煎叆鐗╂枡" class="w-1/3">
+    <Form class="mx-4">
+      <template #file>
+        <div class="w-full">
+          <Upload
+            :max-count="1"
+            accept=".xls,.xlsx"
+            :before-upload="beforeUpload"
+          >
+            <Button type="primary"> 閫夋嫨 Excel 鏂囦欢 </Button>
+          </Upload>
+        </div>
+      </template>
+    </Form>
+    <div class="mx-4 mt-2 mb-4 text-gray-500 text-xs">
+      鎻愮ず锛氭ā鏉夸腑鈥滅墿鏂欏垎绫荤紪鐮佲�濄�佲�滆閲忓崟浣嶇紪鐮佲�濄�佲�滆緟鍗曚綅缂栫爜鈥濊濉啓瀵瑰簲涓绘暟鎹殑缂栫爜锛屽彲鐣欑┖銆�
+      <div>鈥滄槸鍚︽壒娆$鐞嗏�濄�佲�滄槸鍚﹀悓姝ュ埌MES鈥濆~ true/false銆�</div>
+      <div>鈥滅姸鎬佲�濆~ 0锛堝惎鐢級/1锛堢鐢級銆�</div>
+    </div>
+    <template #prepend-footer>
+      <div class="flex flex-auto items-center">
+        <Button @click="handleDownload"> 涓嬭浇瀵煎叆妯℃澘 </Button>
+      </div>
+    </template>
+  </Modal>
+</template>
diff --git a/src/views/basicData/mdm/unit/data.ts b/src/views/basicData/mdm/unit/data.ts
index b9d0be3..6e15fe9 100644
--- a/src/views/basicData/mdm/unit/data.ts
+++ b/src/views/basicData/mdm/unit/data.ts
@@ -128,4 +128,28 @@
       slots: { default: 'actions' },
     },
   ];
+}
+
+/** 璁¢噺鍗曚綅瀵煎叆鐨勮〃鍗� */
+export function useImportFormSchema(): VbenFormSchema[] {
+  return [
+    {
+      fieldName: 'file',
+      label: '鍗曚綅鏁版嵁',
+      component: 'Upload',
+      rules: 'required',
+      help: '浠呭厑璁稿鍏� xls銆亁lsx 鏍煎紡鏂囦欢',
+    },
+    {
+      fieldName: 'updateSupport',
+      label: '鏄惁瑕嗙洊',
+      component: 'Switch',
+      componentProps: {
+        checkedChildren: '鏄�',
+        unCheckedChildren: '鍚�',
+      },
+      rules: z.boolean().default(false),
+      help: '鏄惁鏇存柊宸茬粡瀛樺湪鐨勫崟浣嶆暟鎹�',
+    },
+  ];
 }
\ No newline at end of file
diff --git a/src/views/basicData/mdm/unit/index.vue b/src/views/basicData/mdm/unit/index.vue
index e2d3a44..07cd0db 100644
--- a/src/views/basicData/mdm/unit/index.vue
+++ b/src/views/basicData/mdm/unit/index.vue
@@ -15,11 +15,17 @@
 
 import { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
+import ImportForm from './modules/import-form.vue';
 
 defineOptions({ name: 'MdmUnit' });
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
+  destroyOnClose: true,
+});
+
+const [ImportModal, importModalApi] = useVbenModal({
+  connectedComponent: ImportForm,
   destroyOnClose: true,
 });
 
@@ -31,6 +37,11 @@
 /** 鍒涘缓璁¢噺鍗曚綅 */
 function handleCreate() {
   formModalApi.setData(null).open();
+}
+
+/** 瀵煎叆璁¢噺鍗曚綅 */
+function handleImport() {
+  importModalApi.open();
 }
 
 /** 缂栬緫璁¢噺鍗曚綅 */
@@ -87,6 +98,7 @@
 <template>
   <Page auto-content-height>
     <FormModal @success="handleRefresh" />
+    <ImportModal @success="handleRefresh" />
     <Grid table-title="璁¢噺鍗曚綅鍒楄〃">
       <template #toolbar-tools>
         <TableAction
@@ -98,6 +110,13 @@
               auth: ['mdm:unit:create'],
               onClick: handleCreate,
             },
+            {
+              label: $t('ui.actionTitle.import', ['璁¢噺鍗曚綅']),
+              type: 'primary',
+              icon: ACTION_ICON.UPLOAD,
+              auth: ['mdm:unit-measure:import'],
+              onClick: handleImport,
+            },
           ]"
         />
       </template>
diff --git a/src/views/basicData/mdm/unit/modules/import-form.vue b/src/views/basicData/mdm/unit/modules/import-form.vue
new file mode 100644
index 0000000..de36691
--- /dev/null
+++ b/src/views/basicData/mdm/unit/modules/import-form.vue
@@ -0,0 +1,105 @@
+<script lang="ts" setup>
+import type { FileType } from 'ant-design-vue/es/upload/interface';
+
+import { h } from 'vue';
+
+import { useVbenModal } from '@vben/common-ui';
+import { downloadFileFromBlobPart } from '@vben/utils';
+
+import { Button, message, notification, Upload } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { importUnit, importUnitTemplate } from '#/api/mdm/unit';
+import { $t } from '#/locales';
+
+import { useImportFormSchema } from '../data';
+
+const emit = defineEmits(['success']);
+
+const [Form, formApi] = useVbenForm({
+  commonConfig: {
+    formItemClass: 'col-span-2',
+    labelWidth: 120,
+  },
+  layout: 'horizontal',
+  schema: useImportFormSchema(),
+  showDefaultActions: false,
+});
+
+const [Modal, modalApi] = useVbenModal({
+  async onConfirm() {
+    const { valid } = await formApi.validate();
+    if (!valid) {
+      return;
+    }
+    modalApi.lock();
+    // 鎻愪氦琛ㄥ崟
+    const data = await formApi.getValues();
+    try {
+      const response = (await importUnit(data.file, data.updateSupport)) as any;
+      // 鍏抽棴骞舵彁绀�
+      await modalApi.close();
+      emit('success');
+
+      const resultData = response?.data || response || {};
+      const failureList = resultData.failureList || {};
+
+      if (Object.keys(failureList).length > 0) {
+        const errorNodes = Object.entries(failureList).map(([name, reason]) => {
+          return h('div', `${name}: ${reason}`);
+        });
+
+        notification.warning({
+          message: '瀵煎叆瀹屾垚锛岄儴鍒嗚閲忓崟浣嶅鍏ュけ璐�',
+          description: () => h('div', errorNodes),
+          duration: null,
+        });
+      } else {
+        message.success($t('ui.actionMessage.operationSuccess'));
+      }
+    } finally {
+      modalApi.unlock();
+    }
+  },
+});
+
+/** 涓婁紶鍓� */
+function beforeUpload(file: FileType) {
+  formApi.setFieldValue('file', file);
+  return false;
+}
+
+/** 涓嬭浇妯$増 */
+async function handleDownload() {
+  const data = await importUnitTemplate();
+  downloadFileFromBlobPart({ fileName: '璁¢噺鍗曚綅瀵煎叆妯℃澘.xls', source: data });
+}
+</script>
+
+<template>
+  <Modal title="瀵煎叆璁¢噺鍗曚綅" class="w-1/3">
+    <Form class="mx-4">
+      <template #file>
+        <div class="w-full">
+          <Upload
+            :max-count="1"
+            accept=".xls,.xlsx"
+            :before-upload="beforeUpload"
+          >
+            <Button type="primary"> 閫夋嫨 Excel 鏂囦欢 </Button>
+          </Upload>
+        </div>
+      </template>
+    </Form>
+    <div class="mx-4 mt-2 mb-4 text-gray-500 text-xs">
+      鎻愮ず锛氭ā鏉夸腑鐨勨�滀富鍗曚綅缂栫爜鈥濊濉啓涓诲崟浣嶇殑缂栫爜锛堝 PC锛夛紝涓诲崟浣嶆湰韬鍒楃暀绌哄嵆鍙��
+      <div>鈥滄槸鍚︿富鍗曚綅鈥濆~ true/false銆�</div>
+      <div>鈥滅姸鎬佲�濆~ 0锛堝惎鐢級/1锛堢鐢級銆�</div>
+    </div>
+    <template #prepend-footer>
+      <div class="flex flex-auto items-center">
+        <Button @click="handleDownload"> 涓嬭浇瀵煎叆妯℃澘 </Button>
+      </div>
+    </template>
+  </Modal>
+</template>
diff --git a/src/views/mes/md/item/type/data.ts b/src/views/mes/md/item/type/data.ts
index 3858003..f36b63a 100644
--- a/src/views/mes/md/item/type/data.ts
+++ b/src/views/mes/md/item/type/data.ts
@@ -223,3 +223,27 @@
     },
   ];
 }
+
+/** 鐗╂枡鍒嗙被瀵煎叆鐨勮〃鍗� */
+export function useImportFormSchema(): VbenFormSchema[] {
+  return [
+    {
+      fieldName: 'file',
+      label: '鍒嗙被鏁版嵁',
+      component: 'Upload',
+      rules: 'required',
+      help: '浠呭厑璁稿鍏� xls銆亁lsx 鏍煎紡鏂囦欢',
+    },
+    {
+      fieldName: 'updateSupport',
+      label: '鏄惁瑕嗙洊',
+      component: 'Switch',
+      componentProps: {
+        checkedChildren: '鏄�',
+        unCheckedChildren: '鍚�',
+      },
+      rules: z.boolean().default(false),
+      help: '鏄惁鏇存柊宸茬粡瀛樺湪鐨勫垎绫绘暟鎹�',
+    },
+  ];
+}
diff --git a/src/views/mes/md/item/type/index.vue b/src/views/mes/md/item/type/index.vue
index 062b7d9..d3765d9 100644
--- a/src/views/mes/md/item/type/index.vue
+++ b/src/views/mes/md/item/type/index.vue
@@ -14,9 +14,15 @@
 
 import { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
+import ImportForm from './modules/import-form.vue';
 
 const [FormModal, formModalApi] = useVbenModal({
   connectedComponent: Form,
+  destroyOnClose: true,
+});
+
+const [ImportModal, importModalApi] = useVbenModal({
+  connectedComponent: ImportForm,
   destroyOnClose: true,
 });
 
@@ -36,6 +42,11 @@
 /** 鍒涘缓鍒嗙被 */
 function handleCreate() {
   formModalApi.setData(null).open();
+}
+
+/** 瀵煎叆鍒嗙被 */
+function handleImport() {
+  importModalApi.open();
 }
 
 /** 娣诲姞涓嬬骇鍒嗙被 */
@@ -101,7 +112,7 @@
 </script>
 
 <template>
-  <Page auto-content-height><FormModal @success="handleRefresh" />
+  <Page auto-content-height><FormModal @success="handleRefresh" /><ImportModal @success="handleRefresh" />
     <Grid table-title="鐗╂枡鍒嗙被鍒楄〃">
       <template #toolbar-tools>
         <TableAction
@@ -114,6 +125,13 @@
               onClick: handleCreate,
             },
             {
+              label: $t('ui.actionTitle.import', ['鐗╂枡鍒嗙被']),
+              type: 'primary',
+              icon: ACTION_ICON.UPLOAD,
+              auth: ['mes:md-item-type:import'],
+              onClick: handleImport,
+            },
+            {
               label: isExpanded ? '鏀剁缉' : '灞曞紑',
               type: 'primary',
               onClick: handleExpand,
diff --git a/src/views/mes/md/item/type/modules/import-form.vue b/src/views/mes/md/item/type/modules/import-form.vue
new file mode 100644
index 0000000..db5c74e
--- /dev/null
+++ b/src/views/mes/md/item/type/modules/import-form.vue
@@ -0,0 +1,105 @@
+<script lang="ts" setup>
+import type { FileType } from 'ant-design-vue/es/upload/interface';
+
+import { h } from 'vue';
+
+import { useVbenModal } from '@vben/common-ui';
+import { downloadFileFromBlobPart } from '@vben/utils';
+
+import { Button, message, notification, Upload } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { importItemType, importItemTypeTemplate } from '#/api/mes/md/item/type';
+import { $t } from '#/locales';
+
+import { useImportFormSchema } from '../data';
+
+const emit = defineEmits(['success']);
+
+const [Form, formApi] = useVbenForm({
+  commonConfig: {
+    formItemClass: 'col-span-2',
+    labelWidth: 120,
+  },
+  layout: 'horizontal',
+  schema: useImportFormSchema(),
+  showDefaultActions: false,
+});
+
+const [Modal, modalApi] = useVbenModal({
+  async onConfirm() {
+    const { valid } = await formApi.validate();
+    if (!valid) {
+      return;
+    }
+    modalApi.lock();
+    // 鎻愪氦琛ㄥ崟
+    const data = await formApi.getValues();
+    try {
+      const response = (await importItemType(data.file, data.updateSupport)) as any;
+      // 鍏抽棴骞舵彁绀�
+      await modalApi.close();
+      emit('success');
+
+      const resultData = response?.data || response || {};
+      const failureList = resultData.failureList || {};
+
+      if (Object.keys(failureList).length > 0) {
+        const errorNodes = Object.entries(failureList).map(([name, reason]) => {
+          return h('div', `${name}: ${reason}`);
+        });
+
+        notification.warning({
+          message: '瀵煎叆瀹屾垚锛岄儴鍒嗙墿鏂欏垎绫诲鍏ュけ璐�',
+          description: () => h('div', errorNodes),
+          duration: null,
+        });
+      } else {
+        message.success($t('ui.actionMessage.operationSuccess'));
+      }
+    } finally {
+      modalApi.unlock();
+    }
+  },
+});
+
+/** 涓婁紶鍓� */
+function beforeUpload(file: FileType) {
+  formApi.setFieldValue('file', file);
+  return false;
+}
+
+/** 涓嬭浇妯$増 */
+async function handleDownload() {
+  const data = await importItemTypeTemplate();
+  downloadFileFromBlobPart({ fileName: '鐗╂枡鍒嗙被瀵煎叆妯℃澘.xls', source: data });
+}
+</script>
+
+<template>
+  <Modal title="瀵煎叆鐗╂枡鍒嗙被" class="w-1/3">
+    <Form class="mx-4">
+      <template #file>
+        <div class="w-full">
+          <Upload
+            :max-count="1"
+            accept=".xls,.xlsx"
+            :before-upload="beforeUpload"
+          >
+            <Button type="primary"> 閫夋嫨 Excel 鏂囦欢 </Button>
+          </Upload>
+        </div>
+      </template>
+    </Form>
+    <div class="mx-4 mt-2 mb-4 text-gray-500 text-xs">
+      鎻愮ず锛氭ā鏉夸腑鐨勨�滅埗鍒嗙被缂栫爜鈥濊濉啓鐖跺垎绫荤殑缂栫爜锛堝 RAW锛夛紝椤剁骇鍒嗙被璇ュ垪鐣欑┖鍗冲彲銆�
+      <div>鈥滅墿鏂�/浜у搧鏍囪瘑鈥濆~ ITEM锛堢墿鏂欙級鎴� PRODUCT锛堜骇鍝侊級銆�</div>
+      <div>鈥滅姸鎬佲�濆~ 0锛堝惎鐢級/1锛堢鐢級銆�</div>
+    </div>
+    <template #prepend-footer>
+      <div class="flex flex-auto items-center">
+        <Button @click="handleDownload"> 涓嬭浇瀵煎叆妯℃澘 </Button>
+      </div>
+    </template>
+  </Modal>
+</template>

--
Gitblit v1.9.3