| src/api/mes/wm/productsales/index.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/wls/productsales/data.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/wls/productsales/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/wls/productsales/modules/import-form.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/mes/wm/productsales/index.ts
@@ -25,6 +25,12 @@ remark?: string; // 夿³¨ createTime?: Date; // å建æ¶é´ } /** éå®åºåºåå¯¼å ¥ç»æ */ export interface ProductSalesImportRespVO { createList?: string[]; // å建æåçåºåºåå· failureList?: Record<string, string>; // å¯¼å ¥å¤±è´¥ï¼key 为åºåºåå·æè¡å·ï¼value 为失败åå } } /** æ¥è¯¢éå®åºåºåå页 */ @@ -95,3 +101,16 @@ params, }); } /** ä¸è½½éå®åºåºåå¯¼å ¥æ¨¡æ¿ */ export function importProductSalesTemplate() { return requestClient.download('/mes/wm/product-sales/get-import-template'); } /** å¯¼å ¥éå®åºåºå */ export function importProductSales(file: File) { return requestClient.upload<MesWmProductSalesApi.ProductSalesImportRespVO>( '/mes/wm/product-sales/import', { file }, ); } src/views/wls/productsales/data.ts
@@ -268,6 +268,19 @@ ]; } /** å¯¼å ¥ç表å */ export function useImportFormSchema(): VbenFormSchema[] { return [ { fieldName: 'file', label: 'éå®åºåºåæ°æ®', component: 'Upload', rules: 'required', help: 'ä» å è®¸å¯¼å ¥ xlsãxlsx æ ¼å¼æä»¶ï¼ç¸ååºåºåå·çå¤è¡ä¼å并为åä¸å¼ åºåºå', }, ]; } /** å表çæç´¢è¡¨å */ export function useGridFormSchema(): VbenFormSchema[] { return [ src/views/wls/productsales/index.vue
@@ -19,9 +19,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, }); @@ -33,6 +39,11 @@ /** å建éå®åºåºå */ function handleCreate() { formModalApi.setData({ formType: 'create' }).open(); } /** å¯¼å ¥éå®åºåºå */ function handleImport() { importModalApi.open(); } /** æ¥çéå®åºåºå */ @@ -121,6 +132,7 @@ <template> <Page auto-content-height><FormModal @success="handleRefresh" /> <ImportModal @success="handleRefresh" /> <Grid table-title="éå®åºåºåå表"> <template #toolbar-tools> @@ -134,6 +146,13 @@ onClick: handleCreate, }, { label: 'å¯¼å ¥', type: 'primary', icon: ACTION_ICON.UPLOAD, auth: ['mes:wm-product-sales:import'], onClick: handleImport, }, { label: $t('ui.actionTitle.export'), type: 'primary', icon: ACTION_ICON.DOWNLOAD, src/views/wls/productsales/modules/import-form.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,107 @@ <script lang="ts" setup> import type { FileType } from 'ant-design-vue/es/upload/interface'; import type { MesWmProductSalesApi } from '#/api/mes/wm/productsales'; import { useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart } from '@vben/utils'; import { Button, message, Upload } from 'ant-design-vue'; import { useVbenForm } from '#/adapter/form'; import { importProductSales, importProductSalesTemplate, } from '#/api/mes/wm/productsales'; import { $t } from '#/locales'; import { useImportFormSchema } from '../data'; const emit = defineEmits(['success']); const [Form, formApi] = useVbenForm({ commonConfig: { componentProps: { class: 'w-full', }, 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 result = await importProductSales(data.file); const importData = result as MesWmProductSalesApi.ProductSalesImportRespVO; const createList = importData.createList || []; const failureList = importData.failureList || {}; const failureEntries = Object.entries(failureList); const failureText = failureEntries .map(([key, reason]) => `${key}ï¼${reason}`) .join('ï¼'); const text = `å¯¼å ¥æå ${createList.length} å¼ ${ createList.length > 0 ? `ï¼${createList.join('ã')}ï¼` : '' }ï¼å¯¼å ¥å¤±è´¥ ${failureEntries.length} å¼ ${ failureText ? `ï¼${failureText}ï¼` : '' }`; if (failureEntries.length > 0) { message.warning(text, 8); } else { message.success(text); } // å ¨é¨å¤±è´¥æ¶ä¿çå¼¹çªï¼æ¹ä¾¿ç¨æ·çå®åå åéè¯ if (createList.length > 0 || failureEntries.length === 0) { await modalApi.close(); emit('success'); } } finally { modalApi.unlock(); } }, }); /** ä¸ä¼ å */ function beforeUpload(file: FileType) { formApi.setFieldValue('file', file); return false; } /** ä¸è½½æ¨¡æ¿ */ async function handleDownload() { const data = await importProductSalesTemplate(); downloadFileFromBlobPart({ fileName: 'éå®åºåºåå¯¼å ¥æ¨¡æ¿.xls', source: data }); } </script> <template> <Modal :title="$t('ui.actionTitle.import', ['éå®åºåºå'])" class="w-1/3"> <Form class="mx-4"> <template #file> <div class="w-full"> <Upload :before-upload="beforeUpload" :max-count="1" accept=".xls,.xlsx" > <Button type="primary">éæ© Excel æä»¶</Button> </Upload> </div> </template> </Form> <template #prepend-footer> <div class="flex flex-auto items-center"> <Button @click="handleDownload">ä¸è½½å¯¼å ¥æ¨¡æ¿</Button> </div> </template> </Modal> </template>