diff --git a/src/api/eam/eam.js b/src/api/eam/eam.js index e7031fd..c8d8db0 100644 --- a/src/api/eam/eam.js +++ b/src/api/eam/eam.js @@ -92,6 +92,8 @@ export const saveModalDetails = data => createAPI(`/pms/eam/saveModalDetails`,'p export const deleteModalDetails = data => createAPI(`/pms/eam/deleteModalDetails`,'post',data) export const uploadEamPropertiesModelExcel = data => createAPI(`/pms/eam/uploadEamPropertiesModelExcel`,'post',data) export const downloadEamPropertiesModelTemplate = () => createAPI(`/pms/eam/downloadEamPropertiesModelTemplate`,'get',{},'download') +export const uploadEamMaintenanceModelExcel = data => createAPI(`/pms/eam/uploadEamMaintenanceModelExcel`,'post',data) +export const downloadEamMaintenanceModelTemplate = () => createAPI(`/pms/eam/downloadEamMaintenanceModelTemplate`,'get',{},'download') //---------------点检计划------------------- export const eamWorkPlanSearch = data => createAPI(`/pms/eam/eamWorkPlanSearch`,'post',data) diff --git a/src/views/modules/eam/eamMaintenanceModel.vue b/src/views/modules/eam/eamMaintenanceModel.vue index 3c0c8e2..921b5ed 100644 --- a/src/views/modules/eam/eamMaintenanceModel.vue +++ b/src/views/modules/eam/eamMaintenanceModel.vue @@ -41,6 +41,7 @@ 查询 新增 + 导入 {{'导出'}} {{'导出明细'}} @@ -369,6 +370,69 @@ + + + @@ -389,6 +453,8 @@ getRoleByUserName, goUpItemEam, goDownItemEam, + uploadEamMaintenanceModelExcel, // 导入维保模板Excel + downloadEamMaintenanceModelTemplate, // 下载维保模板导入模板 } from "@/api/eam/eam.js" import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js" import Chooselist from '@/views/modules/common/Chooselist_eam' @@ -1181,6 +1247,11 @@ authUpdate: false, authDelete: false, menuId: this.$route.meta.menuId, + // 上传相关 + uploadDialogVisible: false, + uploadFileName: '', + uploadFile: null, + uploadBu: '', // 上传时选择的BU } }, @@ -1789,6 +1860,140 @@ this.authUpdate = !updateFlag this.authDelete = !deleteFlag }, + + // Excel导入 + importExcel () { + this.uploadDialogVisible = true + this.uploadFileName = '' + this.uploadFile = null + this.uploadBu = '' // 清空BU选择 + // 清空el-upload组件的文件列表 + if (this.$refs.uploadFile) { + this.$refs.uploadFile.clearFiles() + } + }, + + // 文件选择变化 + handleFileChange (file) { + this.uploadFile = file.raw + this.uploadFileName = file.name + }, + + // 确认上传 + confirmUpload () { + // 验证BU是否选择 + if (!this.uploadBu || this.uploadBu === '') { + this.$message.warning('请先选择BU') + return + } + + if (!this.uploadFile) { + this.$message.warning('请先选择文件') + return + } + + const formData = new FormData() + formData.append('file', this.uploadFile) + formData.append('createBy', this.$store.state.user.name) + formData.append('site', this.uploadBu.split('_')[0]) // 从BU中提取site + formData.append('buNo', this.uploadBu.split('_')[1]) // 从BU中提取buNo + + // 调用后端导入接口 + uploadEamMaintenanceModelExcel(formData).then(({data}) => { + if (data.code === 0) { + this.$message.success(data.msg || '导入成功') + this.uploadDialogVisible = false + // 清空文件信息 + this.uploadFileName = '' + this.uploadFile = null + this.uploadBu = '' + if (this.$refs.uploadFile) { + this.$refs.uploadFile.clearFiles() + } + this.getDataList() + } else { + this.$message.error(data.msg || '导入失败') + } + }).catch((error) => { + console.error('导入失败:', error) + const errorMsg = (error.response && error.response.data && error.response.data.msg) || error.message || '未知错误' + this.$message.error('导入失败: ' + errorMsg) + }) + }, + + // 下载模板 + downloadTemplate () { + const loading = this.$loading({ + lock: true, + text: '正在下载模板...', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)' + }) + + // 使用原生XMLHttpRequest处理文件下载,避免axios拦截器干扰 + const xhr = new XMLHttpRequest() + xhr.open('GET', this.$http.adornUrl('/pms/eam/downloadEamMaintenanceModelTemplate'), true) + xhr.responseType = 'blob' + + // 添加token + const token = this.$cookie.get('token') + if (token) { + xhr.setRequestHeader('token', token) + } + + xhr.onload = () => { + loading.close() + + if (xhr.status === 200) { + const blob = xhr.response + + // 验证Blob大小 + if (blob.size === 0) { + this.$message.error('模板文件为空,请联系管理员') + return + } + + // 创建下载链接 + const url = window.URL.createObjectURL(blob) + const link = document.createElement('a') + link.href = url + link.download = '维保模板导入模板.xlsx' + link.style.display = 'none' + + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + + // 释放URL对象 + setTimeout(() => { + window.URL.revokeObjectURL(url) + }, 100) + + this.$message.success('模板下载成功') + } else { + console.error('模板下载失败,状态码:', xhr.status) + this.$message.error('模板下载失败:服务器错误') + } + } + + xhr.onerror = () => { + loading.close() + console.error('网络错误') + this.$message.error('模板下载失败:网络错误') + } + + xhr.send() + }, + + // 关闭上传对话框时清空文件 + handleUploadDialogClose () { + this.uploadFileName = '' + this.uploadFile = null + this.uploadBu = '' // 清空BU选择 + if (this.$refs.uploadFile) { + this.$refs.uploadFile.clearFiles() + } + }, } } @@ -1797,4 +2002,38 @@ height: auto; line-height: 1.5; } +.simple-dialog >>> .el-dialog { + margin-top: 12vh !important; + max-height: 70vh; + border-radius: 8px; +} + +.simple-dialog >>> .el-dialog__body { + padding: 10px 20px; + max-height: calc(70vh - 120px); + overflow-y: auto; +} + +/* 导入对话框内部元素靠左对齐 */ +.simple-dialog >>> .el-dialog__body > div { + text-align: left; +} + +.simple-dialog >>> .el-form-item__label { + text-align: left !important; +} + +/* 上传拖拽区域大小调整 */ +.upload-demo .el-upload-dragger { + width: 100%; + height: 150px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.upload-demo .el-upload-dragger .el-icon-upload { + margin-bottom: 10px; +} diff --git a/src/views/modules/eam/eamPropertiesModel.vue b/src/views/modules/eam/eamPropertiesModel.vue index 27147fc..a1ebe67 100644 --- a/src/views/modules/eam/eamPropertiesModel.vue +++ b/src/views/modules/eam/eamPropertiesModel.vue @@ -1870,47 +1870,59 @@ background: 'rgba(0, 0, 0, 0.7)' }) - // 使用axios直接请求,设置responseType为arraybuffer - this.$http({ - url: this.$http.adornUrl('/pms/eam/downloadEamPropertiesModelTemplate'), - method: 'get', - responseType: 'arraybuffer' // 使用arraybuffer避免乱码 - }).then(response => { + // 使用原生XMLHttpRequest处理文件下载,避免axios拦截器干扰 + const xhr = new XMLHttpRequest() + xhr.open('GET', this.$http.adornUrl('/pms/eam/downloadEamPropertiesModelTemplate'), true) + xhr.responseType = 'blob' + + // 添加token + const token = this.$cookie.get('token') + if (token) { + xhr.setRequestHeader('token', token) + } + + xhr.onload = () => { loading.close() - - // 创建Blob对象,指定正确的MIME类型 - const blob = new Blob([response.data], { - type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' - }) - - // 验证Blob大小 - if (blob.size === 0) { - this.$message.error('模板文件为空,请联系管理员') - return + + if (xhr.status === 200) { + const blob = xhr.response + + // 验证Blob大小 + if (blob.size === 0) { + this.$message.error('模板文件为空,请联系管理员') + return + } + + // 创建下载链接 + const url = window.URL.createObjectURL(blob) + const link = document.createElement('a') + link.href = url + link.download = '点检模板导入模板.xlsx' + link.style.display = 'none' + + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + + // 释放URL对象 + setTimeout(() => { + window.URL.revokeObjectURL(url) + }, 100) + + this.$message.success('模板下载成功') + } else { + console.error('模板下载失败,状态码:', xhr.status) + this.$message.error('模板下载失败:服务器错误') } - - // 创建下载链接 - const url = window.URL.createObjectURL(blob) - const link = document.createElement('a') - link.href = url - link.download = '点检模板导入模板.xlsx' - link.style.display = 'none' - - document.body.appendChild(link) - link.click() - document.body.removeChild(link) - - // 释放URL对象 - setTimeout(() => { - window.URL.revokeObjectURL(url) - }, 100) - - this.$message.success('模板下载成功') - }).catch(error => { + } + + xhr.onerror = () => { loading.close() - console.error('模板下载失败:', error) - this.$message.error('模板下载失败:' + (error.message || '未知错误')) - }) + console.error('网络错误') + this.$message.error('模板下载失败:网络错误') + } + + xhr.send() }, // 关闭上传对话框时清空文件