204 lines
6.7 KiB
Vue
204 lines
6.7 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 { ElMessage, ElNotification, UploadRawFile, UploadRequestOptions } 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 emit = defineEmits<{
|
||
(e: 'result', data: boolean): void
|
||
}>()
|
||
// 接收父组件参数
|
||
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)
|
||
}
|
||
emit('result', jsonData.data)
|
||
} catch (err) {
|
||
console.log(err)
|
||
}
|
||
}
|
||
fileReader.readAsText(res)
|
||
} else {
|
||
emit('result', false)
|
||
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>
|
||
@use './index.scss';
|
||
</style>
|