192 lines
5.8 KiB
Vue
192 lines
5.8 KiB
Vue
<template>
|
||
<el-dialog v-model='dialogVisible' :title='`批量添加${parameter.title}`' :destroy-on-close='true' width='580px'
|
||
draggable>
|
||
<el-form class='drawer-multiColumn-form' label-width='100px'>
|
||
<el-form-item label='模板下载 :'>
|
||
<el-button type='primary' :icon='Download' @click='downloadTemp'> 点击下载</el-button>
|
||
</el-form-item>
|
||
<el-form-item label='文件上传 :'>
|
||
<el-upload
|
||
action='#'
|
||
class='upload'
|
||
:drag='true'
|
||
:limit='excelLimit'
|
||
:multiple='true'
|
||
:show-file-list='true'
|
||
:http-request='uploadExcel'
|
||
:before-upload='beforeExcelUpload'
|
||
:on-exceed='handleExceed'
|
||
:accept="parameter.fileType!.join(',')"
|
||
>
|
||
<slot name='empty'>
|
||
<el-icon class='el-icon--upload'>
|
||
<upload-filled />
|
||
</el-icon>
|
||
<div class='el-upload__text'>将文件拖到此处,或<em>点击上传</em></div>
|
||
</slot>
|
||
<template #tip>
|
||
<slot name='tip'>
|
||
<div class='el-upload__tip'>请上传 .xls , .xlsx 标准格式文件,文件最大为 {{ parameter.fileSize }}M</div>
|
||
</slot>
|
||
</template>
|
||
</el-upload>
|
||
</el-form-item>
|
||
<el-form-item v-if='parameter.showCover' label='数据覆盖 :'>
|
||
<el-switch v-model='isCover' />
|
||
</el-form-item>
|
||
</el-form>
|
||
</el-dialog>
|
||
</template>
|
||
|
||
<script setup lang='ts' name='ImportExcel'>
|
||
import { ref } from 'vue'
|
||
import { useDownload } from '@/hooks/useDownload'
|
||
import { Download } from '@element-plus/icons-vue'
|
||
import { ElNotification, UploadRequestOptions, UploadRawFile, ElMessage } from 'element-plus'
|
||
|
||
export interface ExcelParameterProps {
|
||
title: string; // 标题
|
||
showCover?: boolean; // 是否显示”数据覆盖“选项
|
||
patternId?: string; // 模式ID
|
||
planId?: string | null ;//计划ID
|
||
fileSize?: number; // 上传文件的大小
|
||
fileType?: File.ExcelMimeType[]; // 上传文件的类型
|
||
tempApi?: (params: any) => Promise<any>; // 下载模板的Api
|
||
importApi?: (params: any) => Promise<any>; // 批量导入的Api
|
||
getTableList?: () => void; // 获取表格数据的Api
|
||
}
|
||
|
||
// 是否覆盖数据
|
||
const isCover = ref(false)
|
||
// 最大文件上传数
|
||
const excelLimit = ref(1)
|
||
// dialog状态
|
||
const dialogVisible = ref(false)
|
||
// 父组件传过来的参数
|
||
const parameter = ref<ExcelParameterProps>({
|
||
title: '',
|
||
fileSize: 5,
|
||
fileType: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
|
||
})
|
||
|
||
// 接收父组件参数
|
||
const acceptParams = (params: ExcelParameterProps) => {
|
||
parameter.value = { ...parameter.value, ...params }
|
||
dialogVisible.value = true
|
||
}
|
||
|
||
// Excel 导入模板下载
|
||
const downloadTemp = () => {
|
||
if (!parameter.value.tempApi) return
|
||
useDownload(parameter.value.tempApi, `${parameter.value.title}模板`, {'pattern':parameter.value.patternId}, false)
|
||
}
|
||
|
||
// 文件上传
|
||
const uploadExcel = async (param: UploadRequestOptions) => {
|
||
let excelFormData = new FormData()
|
||
excelFormData.append('file', param.file)
|
||
if (parameter.value.patternId) {
|
||
excelFormData.append('patternId', parameter.value.patternId)
|
||
}
|
||
|
||
excelFormData.append('planId', parameter.value.planId)
|
||
|
||
isCover.value && excelFormData.append('isCover', isCover.value as unknown as Blob)
|
||
//await parameter.value.importApi!(excelFormData);
|
||
await parameter.value.importApi!(excelFormData)
|
||
.then(res => handleImportResponse(res))
|
||
parameter.value.getTableList && parameter.value.getTableList()
|
||
dialogVisible.value = false
|
||
}
|
||
|
||
|
||
async function handleImportResponse(res: any) {
|
||
console.log(res)
|
||
|
||
if (res.type === 'application/json') {
|
||
const fileReader = new FileReader()
|
||
fileReader.onloadend = () => {
|
||
try {
|
||
const jsonData = JSON.parse(fileReader.result)
|
||
if (jsonData.code === 'A0000') {
|
||
ElMessage.success('导入成功')
|
||
} else {
|
||
ElMessage.error(jsonData.message)
|
||
}
|
||
} catch (err) {
|
||
console.log(err)
|
||
}
|
||
}
|
||
fileReader.readAsText(res)
|
||
} else {
|
||
ElMessage.error('导入失败,请查看下载附件!')
|
||
let blob = new Blob([res], { type: 'application/vnd.ms-excel' })
|
||
const url = window.URL.createObjectURL(blob)
|
||
const link = document.createElement('a')
|
||
link.href = url
|
||
link.download = '导入失败数据'
|
||
document.body.appendChild(link)
|
||
link.click()
|
||
link.remove()
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @description 文件上传之前判断
|
||
* @param file 上传的文件
|
||
* */
|
||
const beforeExcelUpload = (file: UploadRawFile) => {
|
||
const isExcel = parameter.value.fileType!.includes(file.type as File.ExcelMimeType)
|
||
const fileSize = file.size / 1024 / 1024 < parameter.value.fileSize!
|
||
if (!isExcel)
|
||
ElNotification({
|
||
title: '温馨提示',
|
||
message: '上传文件只能是 xls / xlsx 格式!',
|
||
type: 'warning',
|
||
})
|
||
if (!fileSize)
|
||
setTimeout(() => {
|
||
ElNotification({
|
||
title: '温馨提示',
|
||
message: `上传文件大小不能超过 ${parameter.value.fileSize}MB!`,
|
||
type: 'warning',
|
||
})
|
||
}, 0)
|
||
return isExcel && fileSize
|
||
}
|
||
|
||
// 文件数超出提示
|
||
const handleExceed = () => {
|
||
ElNotification({
|
||
title: '温馨提示',
|
||
message: '最多只能上传一个文件!',
|
||
type: 'warning',
|
||
})
|
||
}
|
||
|
||
// 上传错误提示
|
||
// const excelUploadError = () => {
|
||
// ElNotification({
|
||
// title: '温馨提示',
|
||
// message: `批量添加${parameter.value.title}失败,请您重新上传!`,
|
||
// type: 'error',
|
||
// })
|
||
// }
|
||
|
||
// 上传成功提示
|
||
// const excelUploadSuccess = () => {
|
||
// ElNotification({
|
||
// title: '温馨提示',
|
||
// message: `批量添加${parameter.value.title}成功!`,
|
||
// type: 'success',
|
||
// })
|
||
// }
|
||
|
||
defineExpose({
|
||
acceptParams,
|
||
})
|
||
</script>
|
||
<style lang='scss' scoped>
|
||
@import "./index.scss";
|
||
</style>
|