为基础资料维护页面增加导入导出

This commit is contained in:
2026-10-09 21:13:43 +08:00
parent a62803ccf0
commit a8af1f542b
20 changed files with 2134 additions and 15 deletions
@@ -0,0 +1,193 @@
<template>
<el-col v-if="allowImport && resource === 'strain'" :span="1.5">
<el-button type="info" plain icon="Upload" @click="openImport" v-hasPermi="['master:strain:import']">导入</el-button>
</el-col>
<el-col v-if="resource === 'strain'" :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['master:strain:export']">导出</el-button>
</el-col>
<el-col v-if="allowImport && resource === 'customer'" :span="1.5">
<el-button type="info" plain icon="Upload" @click="openImport" v-hasPermi="['master:customer:import']">导入</el-button>
</el-col>
<el-col v-if="resource === 'customer'" :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['master:customer:export']">导出</el-button>
</el-col>
<el-col v-if="allowImport && resource === 'site'" :span="1.5">
<el-button type="info" plain icon="Upload" @click="openImport" v-hasPermi="['master:site:import']">导入</el-button>
</el-col>
<el-col v-if="resource === 'site'" :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['master:site:export']">导出</el-button>
</el-col>
<el-col v-if="allowImport && resource === 'line'" :span="1.5">
<el-button type="info" plain icon="Upload" @click="openImport" v-hasPermi="['master:line:import']">导入</el-button>
</el-col>
<el-col v-if="resource === 'line'" :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['master:line:export']">导出</el-button>
</el-col>
<el-col v-if="allowImport && resource === 'warehouse'" :span="1.5">
<el-button type="info" plain icon="Upload" @click="openImport" v-hasPermi="['master:warehouse:import']">导入</el-button>
</el-col>
<el-col v-if="resource === 'warehouse'" :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['master:warehouse:export']">导出</el-button>
</el-col>
<el-col v-if="allowImport && resource === 'pallet'" :span="1.5">
<el-button type="info" plain icon="Upload" @click="openImport" v-hasPermi="['master:pallet:import']">导入</el-button>
</el-col>
<el-col v-if="resource === 'pallet'" :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['master:pallet:export']">导出</el-button>
</el-col>
<el-col v-if="allowImport && resource === 'tunnel'" :span="1.5">
<el-button type="info" plain icon="Upload" @click="openImport" v-hasPermi="['master:tunnel:import']">导入</el-button>
</el-col>
<el-col v-if="resource === 'tunnel'" :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['master:tunnel:export']">导出</el-button>
</el-col>
<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
<el-upload
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="uploadHeaders"
:action="uploadAction + '?updateSupport=' + upload.updateSupport"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:on-error="handleFileError"
:on-change="handleFileChange"
:on-remove="handleFileRemove"
:auto-upload="false"
drag
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="upload.updateSupport" />是否更新已经存在的{{ resourceLabel }}数据
</div>
<span>仅允许导入xls、xlsx格式文件。</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="downloadTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { computed, getCurrentInstance, reactive } from "vue";
import { getToken } from "@/utils/auth";
const props = defineProps({
resource: {
type: String,
required: true
},
allowImport: {
type: Boolean,
default: false
},
queryParams: {
type: Object,
default: () => ({})
}
});
const emit = defineEmits(["imported"]);
const { proxy } = getCurrentInstance();
const resourceLabels = {
strain: "菌种",
customer: "客户",
site: "客户现场",
line: "产线",
warehouse: "仓库",
pallet: "托盘",
tunnel: "隧道"
};
const resourceLabel = computed(() => resourceLabels[props.resource] || "基础资料");
const uploadHeaders = computed(() => ({ Authorization: "Bearer " + getToken() }));
const uploadAction = computed(() => `${import.meta.env.VITE_APP_BASE_API}/master/${props.resource}/importData`);
const upload = reactive({
open: false,
title: "",
isUploading: false,
updateSupport: false,
selectedFile: null
});
function openImport() {
upload.title = `${resourceLabel.value}导入`;
upload.open = true;
upload.selectedFile = null;
upload.isUploading = false;
}
function downloadTemplate() {
proxy.download(
`master/${props.resource}/importTemplate`,
{},
`${props.resource}_template_${new Date().getTime()}.xlsx`
);
}
function handleExport() {
proxy.download(
`master/${props.resource}/export`,
{ ...props.queryParams },
`${props.resource}_${new Date().getTime()}.xlsx`
);
}
function handleFileUploadProgress() {
upload.isUploading = true;
}
function handleFileChange(file) {
upload.selectedFile = file;
}
function handleFileRemove() {
upload.selectedFile = null;
}
function showImportResult(message) {
const safe = String(message ?? "")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/\n/g, "<br/>");
proxy.$alert(
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + safe + "</div>",
"导入结果",
{ dangerouslyUseHTMLString: true }
);
}
function handleFileSuccess(response, file) {
upload.open = false;
upload.isUploading = false;
proxy.$refs.uploadRef.handleRemove(file);
showImportResult(response.msg);
emit("imported");
}
function handleFileError() {
upload.isUploading = false;
proxy.$modal.msgError("导入失败,请稍后重试");
}
function submitFileForm() {
const file = upload.selectedFile;
const fileName = file && file.name ? file.name.toLowerCase() : "";
if (!file || (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx"))) {
proxy.$modal.msgError("请选择后缀为 “xls”或“xlsx”的文件。");
return;
}
proxy.$refs.uploadRef.submit();
}
</script>