You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

595 lines
15 KiB

<template>
<el-dialog
:visible="show"
:title="'导入' + crmTypeName"
:append-to-body="true"
:close-on-click-modal="false"
width="600px"
@close="closeView"
>
<div class="dialog-body">
<div v-if="stepsActive == 1" class="step-section">
<div class="sections">
<div class="sections__title" v-loading="loading">
导入说明
<div class="sections__tips">
1提供的导入模板需要文本格式.txt文件格式
</div>
<div class="sections__tips">
2请勿删除模板中设置的字段
</div>
<div class="sections__tips">3导入文件大小请勿超过100MB</div>
</div>
</div>
<div class="sections">
<div class="sections__title">
导入条件设置工厂无则不用设置
</div>
<div class="sections__tips">
<span class="demonstration">选择年份</span>
<el-date-picker
v-model="yeareVale"
style="width: 188px"
type="year"
format="yyyy 年"
value-format="yyyy"
placeholder="选择年"
>
</el-date-picker>
<span class="demonstration">选择月份</span>
<el-date-picker
v-model="monthVale"
style="width: 188px"
type="month"
format=" MM 月"
value-format="MM"
placeholder="选择月"
>
</el-date-picker>
</div>
<div class="sections__tips">
<span class="demonstration">选择工厂</span>
<el-select
v-model="selectValue"
clearable
style="width: 188px"
placeholder="请选择"
>
<el-option
v-for="item in factoryList"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</div>
</div>
<div class="sections">
<div class="sections__title">请选择需要导入的文件</div>
<div class="content">
<flexbox class="file-select">
<el-upload
ref="upload"
class="avatar-uploader"
drag
action="#"
:http-request="httpRequestfiles"
:headers="httpHeader"
:file-list="fileuploadList"
:before-upload="beforeAvatarUpload"
:before-remove="beforeRemove"
:on-remove="handleRemove"
multiple
:limit="1"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
将文件拖到此处
<em>点击上传</em>
</div>
</el-upload>
</flexbox>
</div>
</div>
</div>
<div
v-loading="loading"
v-else-if="stepsActive == 2"
element-loading-text="数据导入中,请耐心等待..."
element-loading-spinner="el-icon-loading"
class="step-section"
/>
<div
v-loading="loading"
v-else-if="stepsActive == 3"
class="step-section"
>
<div class="result-info">
<el-card style="height: 300px; margin-top: -20px" shadow="always">
<i class="wk wk-success result-info__icon" />
<p class="result-info__detail">
导入成功数据
<span class="result-info__detail--all"
>{{ this.resultData.totalSize }} </span
>条有效数据
</p>
</el-card>
</div>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-popover
v-model="historyPopoverShow"
placement="top"
width="800"
popper-class="no-padding-popover"
trigger="click"
>
</el-popover>
<!-- <el-button @click="closeView">取消</el-button> -->
<el-button :class="{ 'is-hidden': !showCancel }" @click="closeView"
>取消</el-button
>
<el-button v-if="sureTitle" type="primary" @click="sureClick">{{
sureTitle
}}</el-button>
</span>
</el-dialog>
</template>
<script>
import { downloadFile } from "@/utils/crmindex.js";
import { getToken } from "@/utils/auth"; // get token from cookie
export default {
name: "CRMImport", // 文件导入
props: {
show: {
type: Boolean,
default: false,
},
// CRM类型
crmType: {
type: String,
default: "",
},
},
data() {
return {
loading: false,
fieldList: [],
factoryList: [], //工厂列表
selectValue: [], //工厂选择项
config: 1, // 1 覆盖,2跳过
//file: { name: "" },
page: 1,
listQuery: {
Filters: [
{
logic: 0,
column: "description",
action: 0,
value: "工厂",
}, //默认查询可用的
],
SkipCount: 0,
MaxResultCount: 1000,
},
stepsActive: 1,
stepList: [
{
icon: "wk wk-upload",
title: "上传文件",
status: "wait",
},
{
icon: "wk wk-data-import",
title: "导入数据",
status: "wait",
},
{
icon: "wk wk-success",
title: "导入完成",
status: "wait",
},
],
//resultData: null,
resultData: {
totalSize: 0,
errSize: 0,
errTemplate: "",
errMessage: "",
},
processData: {
count: 0,
status: "",
},
messageId: null,
intervalTimer: null,
fileuploadList: [],
isLt2M: "",
isFileType: "",
historyPopoverShow: false,
yeareVale: "",
monthVale: "",
};
},
computed: {
sureTitle() {
return {
1: "立即导入",
2: "最小化",
3: "确定",
}[this.stepsActive];
},
showCancel() {
return this.stepsActive != 2;
},
crmTypeName() {
return (
{
fis: "FIS发运数据",
materialRelation: "零件匹配关系",
material: "物料主数据",
inventorydetail: "库存明细",
codeSetting: "通用代码设置",
estimatedSum: "应付暂估汇总",
estimatedInventoryDetail: "应付暂估收货明细",
}[this.crmType] || ""
);
},
getWebApi() {
return (
{
fis: "/api/settleaccount/FIS/ExcelImport",
materialRelation: "/api/settleaccount/materialRelation/ExcelImport",
material: "/api/settleaccount/material/ExcelImport",
inventorydetail: "/api/settleaccount/InventoryDetail​/ExcelImport",
codeSetting: "/api/settleaccount/CodeSetting/ExcelImport",
estimatedSum: "/api/settleaccount/EstimatedSum/ExcelImport",
estimatedInventoryDetail:
"/api/settleaccount/EstimatedInventoryDetail/ExcelImport",
}[this.crmType] || ""
);
},
httpHeader() {
//文件上传时,带token认证信息,提高安全性
return {
Authorization: "Bearer " + getToken(),
};
},
},
watch: {
show: function (val) {
this.getAllFactory();
if (val) {
this.stepsActive = 1;
} else {
if (this.stepsActive == 3) {
//以下是重置数据
this.stepsActive = 1;
this.stepList = [
{
icon: "wk wk-upload",
title: "上传文件",
status: "wait",
},
{
icon: "wk wk-data-import",
title: "导入数据",
status: "wait",
},
{
icon: "wk wk-success",
title: "导入完成",
status: "wait",
},
];
this.resultData = null;
}
}
},
stepsActive() {
this.$emit(
"status",
{
1: "wait",
2: "process",
3: "finish",
}[this.stepsActive]
);
},
},
mounted() {},
methods: {
getAllFactory() {
//取工厂列表信息
this.factoryList = [];
this.listQuery.SkipCount = (this.page - 1) * 500;
this.$axios
.posts("/api/settleaccount/CodeSetting/list", this.listQuery)
.then((response) => {
response.items.forEach((element) => {
let options = {};
options.value = element.project;
options.label = element.value;
this.factoryList.push(options);
});
})
.catch(() => {
this.listLoading = false;
});
},
handleImportExcelClick() {
//父组件中,初始化此子组件时调用
this.fileuploadList = [];
//this.$refs.upload.clearFiles();
},
httpRequestfiles(data) {
let _this = this;
let rd = new FileReader(); // 创建文件读取对象
let file = data.file;
this.fileuploadList.push(file);
rd.readAsDataURL(file); // 文件读取装换为base64类型
},
beforeAvatarUpload(file) {
var FileExt = file.name.replace(/.+\./, "");
if (["txt"].indexOf(FileExt.toLowerCase()) === -1) {
this.$message({
type: "warning",
message: "只支持文本txt类型文件!",
});
this.isFileType = "0";
return false;
} else {
this.isFileType = "1";
}
this.isLt2M = file.size / 1024 / 1024 < 100 ? "1" : "0";
if (this.isLt2M === "0") {
this.$message.error("上传文件大小不能超过 100MB!");
}
return this.isLt2M === "1" ? true : false;
},
beforeRemove(file, fileList) {
if (this.isLt2M === "1" && this.isFileType === "1") {
return this.$confirm(`确定移除 ${file.name}`);
}
},
handleRemove(file, fileList) {
//附件列表删除操作
const index = this.fileuploadList.indexOf(file.originFileObj);
const newFileList = this.fileuploadList.slice();
newFileList.splice(index, 1);
this.fileuploadList = newFileList;
},
//执行按钮
sureClick() {
if (
this.fileuploadList === [] ||
JSON.stringify(this.fileuploadList) === "[]"
) {
this.$message.error("请选择导入文件");
return false;
}
if (this.stepsActive == 1) {
if (this.stepList[0].status == "wait") {
this.stepsActive = 2;
this.loading = true;
setTimeout(() => {
this.saveTemplateData();
}, 1000);
if (this.stepList[1].status == "finish") {
}
} else {
if (this.fileuploadList === "[]") {
this.$message.error("请选择导入文件");
}
}
} else {
this.closeView();
}
},
saveTemplateData() {
//保存项目、合同管理、客户等信息的共用方法
//--上传附件,批量或拖拽
if (JSON.stringify(this.fileuploadList) != "[]") {
let fd = new FormData();
const { fileuploadList } = this;
fileuploadList.forEach((file) => {
fd.append("files", file); // 添加文件
});
fd.append("yeareVale", this.yeareVale);
fd.append("monthVale", this.monthVale);
const webapi = this.getWebApi;
this.$axios
.posts(webapi, fd)
.then((res) => {
//此处,导出模板上设置的错误
this.loading = false;
this.resultData = res;
this.stepList[1].status = "finish";
this.resultData.totalSize = res.length; //返回导入成功的数据总数
if (
this.isLt2M === "1" &&
this.isFileType === "1" &&
res.totalSize > 0
) {
this.$notify({
title: "成功",
message: "数据导入成功!",
type: "success",
duration: 2000,
});
}
this.stepsActive = 3;
this.$emit("status", "finish");
})
.catch(() => {
this.loading = false;
});
} else {
this.loading = false;
this.$message({
message: "未上传任何附件,请查检!",
type: "warning",
});
}
},
// 关闭操作
closeView() {
this.$emit("update:show", false);
this.$emit("close", this.stepsActive == 3 ? "finish" : "");
},
},
};
</script>
<style scoped lang="scss">
@import "@/styles/xr-theme.scss";
.el-steps {
margin-bottom: 15px;
/deep/ .el-step__title {
font-size: 14px;
}
/deep/ .el-step.is-simple .el-step__arrow::before,
/deep/ .el-step.is-simple .el-step__arrow::after {
height: 10px;
width: 2px;
}
/deep/ .el-step.is-simple .el-step__arrow::after {
transform: rotate(45deg) translateY(3px);
}
/deep/ .el-step.is-simple .el-step__arrow::before {
transform: rotate(-45deg) translateY(-2px);
}
}
.step-section {
min-height: 300px;
/deep/ .el-loading-spinner {
top: 45%;
.el-icon-loading {
font-size: 40px;
color: #999;
}
.el-loading-text {
color: #333;
}
}
}
.sections {
font-size: 14px;
color: #333;
&__title {
font-weight: 600;
}
&__tips {
padding-left: 30px;
margin: 8px 0 15px;
color: #999;
font-size: 12px;
line-height: 1.4;
}
.download {
cursor: pointer;
color: #2362fb;
}
}
.sections__tips + .content {
padding-top: 0;
}
.content {
padding: 10px 10px 10px 30px;
.el-select {
width: 400px;
}
.user-cell {
width: 400px;
}
}
#importInputFile {
display: none;
}
.file-select {
.el-input {
width: 400px;
}
button {
margin-left: 20px;
}
}
.is-hidden {
visibility: hidden;
}
.history-btn {
float: left;
margin-left: 15px;
}
// 结果信息
.result-info {
text-align: center;
padding-top: 50px;
&__icon {
font-size: 40px;
color: $xr-color-primary;
}
&__des {
margin-top: -15px;
color: #333;
font-size: 30px;
}
&__detail {
margin-top: 35px;
font-size: 20px;
color: #666;
&--all {
color: #333;
font-weight: 600;
}
&--suc {
color: $xr-color-primary;
font-weight: 600;
}
&--err {
margin-top: 25px;
color: #f94e4e;
font-weight: 600;
}
}
&__btn--err {
margin-top: 10px;
font-size: 20px;
}
}
</style>