diff --git a/src/api/eam/eam.js b/src/api/eam/eam.js index 7b3401a..1345f73 100644 --- a/src/api/eam/eam.js +++ b/src/api/eam/eam.js @@ -66,7 +66,7 @@ export const eamAdminLevelEdit = data => createAPI(`/pms/eam/eamAdminLevelEdit`, export const eamAdminLevelDelete = data => createAPI(`/pms/eam/eamAdminLevelDelete`,'post',data) -//----------------点检项目------------------------ +//---------------点检项目------------------------ export const eamPropertiesItemSearch = data => createAPI(`/pms/eam/eamPropertiesItemSearch`,'post',data) export const eamPropertiesItemSave = data => createAPI(`/pms/eam/eamPropertiesItemSave`,'post',data) export const eamPropertiesItemEdit = data => createAPI(`/pms/eam/eamPropertiesItemEdit`,'post',data) @@ -75,6 +75,12 @@ export const saveItemAvailable = data => createAPI(`/pms/eam/saveItemAvailable`, export const searchItemAvailable = data => createAPI(`/pms/eam/searchItemAvailable`,'post',data) export const deleteItemAvailable = data => createAPI(`/pms/eam/deleteItemAvailable`,'post',data) export const deleteModalDetail = data => createAPI(`/pms/eam/deleteModalDetail`,'post',data) +export const uploadEamPropertiesItemExcel = data => createAPI(`/pms/eam/uploadEamPropertiesItemExcel`,'post',data) +export const downloadEamPropertiesItemTemplate = () => createAPI(`/pms/eam/downloadEamPropertiesItemTemplate`,'get',{},'download') + +//---------------维保项目------------------------ +export const uploadEamMaintenanceItemExcel = data => createAPI(`/pms/eam/uploadEamMaintenanceItemExcel`,'post',data) +export const downloadEamMaintenanceItemTemplate = () => createAPI(`/pms/eam/downloadEamMaintenanceItemTemplate`,'get',{},'download') //---------------点检模板------------------- export const eamPropertiesModelSearch = data => createAPI(`/pms/eam/eamPropertiesModelSearch`,'post',data) diff --git a/src/views/modules/eam/eamMaintenanceItem.vue b/src/views/modules/eam/eamMaintenanceItem.vue index 4fb926d..c4ea21b 100644 --- a/src/views/modules/eam/eamMaintenanceItem.vue +++ b/src/views/modules/eam/eamMaintenanceItem.vue @@ -27,6 +27,7 @@ 查询 新增 + 导入 {{'导出'}} @@ -218,6 +219,68 @@ 关闭 + + + @@ -231,7 +294,9 @@ saveItemAvailable, deleteItemAvailable, getSiteAndBuByUserName, - getRoleByUserName + getRoleByUserName, + uploadEamMaintenanceItemExcel, // 导入维保项目Excel + downloadEamMaintenanceItemTemplate, // 下载维保项目导入模板 } from "@/api/eam/eam.js" import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js" import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js' @@ -642,6 +707,11 @@ authDelete: false, authChoose: false, menuId: this.$route.meta.menuId, + // 上传相关 + uploadDialogVisible: false, + uploadFileName: '', + uploadFile: null, + uploadBu: '', // 上传时选择的BU } }, @@ -1090,12 +1160,159 @@ this.authDelete = !deleteFlag this.authChoose = !chooseFlag }, + + // 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 + + // 调用后端导入接口 + uploadEamMaintenanceItemExcel(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)' + }) + + // 使用axios直接请求,设置responseType为arraybuffer + this.$http({ + url: this.$http.adornUrl('/pms/eam/downloadEamMaintenanceItemTemplate'), + method: 'get', + responseType: 'arraybuffer' // 使用arraybuffer避免乱码 + }).then(response => { + 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 + } + + // 创建下载链接 + 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 => { + loading.close() + console.error('模板下载失败:', error) + this.$message.error('模板下载失败:' + (error.message || '未知错误')) + }) + }, + + // 关闭上传对话框时清空文件 + handleUploadDialogClose () { + this.uploadFileName = '' + this.uploadFile = null + this.uploadBu = '' // 清空BU选择 + if (this.$refs.uploadFile) { + this.$refs.uploadFile.clearFiles() + } + }, } } - diff --git a/src/views/modules/eam/eamPropertiesItem.vue b/src/views/modules/eam/eamPropertiesItem.vue index 30639b9..e1f8596 100644 --- a/src/views/modules/eam/eamPropertiesItem.vue +++ b/src/views/modules/eam/eamPropertiesItem.vue @@ -1,4 +1,4 @@ -