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.

843 lines
23 KiB

2 years ago
<template>
<el-dialog
:visible="show"
:title="'导入' + crmTypeName"
:append-to-body="true"
:close-on-click-modal="false"
width="600px"
@close="closeView"
>
<el-tabs
v-model="activeName"
:class="stepsActive == 1 ? '' : 'el-tabs__active-go'"
@tab-click="handleClick"
>
<el-tab-pane
label="①文件上传"
name="first"
:disabled="stepsActive == 2 ? true : false"
>
<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-select
v-model="versionValue"
clearable
:disabled="isEditFactory"
style="width: 188px"
placeholder="请选择"
>
<el-option
v-for="item in factoryList"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
<span class="demonstration">大众厂线</span>
<el-select
v-model="CarModekValue"
clearable
:disabled="isEditYearMont"
style="width: 188px"
placeholder="请选择"
>
<el-option
v-for="item in carModelList"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</div>
<div class="sections__tips">
<span class="demonstration">开始时间</span>
<el-date-picker
v-model="startTimeVale"
:disabled="isTimeUse"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择日期时间"
>
</el-date-picker>
</div>
<div class="sections__tips">
<span class="demonstration">结束时间</span>
<el-date-picker
v-model="endTimeVale"
:disabled="isTimeUse"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择日期时间"
>
</el-date-picker>
</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="10"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
将文件拖到此处
<em>点击上传</em>
</div>
</el-upload>
</flexbox>
</div>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane
label="②导入数据"
name="second"
:disabled="stepsActive == 2 ? false : true"
>
<div
v-loading="loading"
v-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="el-icon-error" />
<!-- <p class="result-info__detail">
导入成功数据
<span class="result-info__detail--all"
>{{ this.resultData.totalSize }} </span
>条有效数据
</p> -->
<p class="result-info__detail">
<span class="result-info__detail--all"
>{{ this.resultData.successMessage }}
</span>
<el-button
2 years ago
v-if="this.resultData && this.resultData.errSize > 0"
class="result-info__btn--err"
type="text"
@click="downloadErrData"
>下载错误数据</el-button
>
2 years ago
</p>
</el-card>
</div>
</div>
<div
v-loading="loading"
v-else-if="stepsActive == 4"
class="step-section"
>
<div class="result-info">
<el-card style="height: 300px" shadow="always">
<!-- <i class="wk wk-success result-info__icon" />
<p class="result-info__des">数据导入结果</p>
<p class="result-info__detail">
导入成功数据
<span class="result-info__detail--all"
>{{ this.resultData.totalSize }} </span
>条有效数据
</p> -->
<i class="el-icon-success" />
<p class="result-info__detail">
<span class="result-info__detail--all"
>{{ this.resultData.successMessage }}
</span>
</p>
</el-card>
</div>
</div>
</el-tab-pane>
</el-tabs>
<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
import { formatTimeToTimestamp } from "@/utils/index";
export default {
name: "CRMImport", // 文件导入
props: {
show: {
type: Boolean,
default: false,
},
// CRM类型
crmType: {
type: String,
default: "",
},
},
data() {
return {
loading: false,
fieldList: [],
factoryList: [], //工厂列表
CarModekValue: [], //车型选择项
carModelList: [], //车型列表
versionValue: "",
config: 1, // 1 覆盖,2跳过
/** 编辑控制 */
isEditFactory: false, // 是否是编辑中
isEditYearMont: false, // 是否是编辑中
isTimeUse: false, // 是否是编辑中
//file: { name: "" },
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: "",
successMessage: "",
},
processData: {
count: 0,
status: "",
},
messageId: null,
intervalTimer: null,
fileuploadList: [],
isLt2M: "",
isFileType: "",
historyPopoverShow: false,
startTimeVale: "",
endTimeVale: "",
page: 1,
listQuery: {
Filters: [
{
logic: 0,
column: "version",
action: 0,
value: "",
}, //默认查询可用的
],
SkipCount: 0,
MaxResultCount: 1000,
},
listQueryCustom: {
Filters: [
{
logic: 0,
column: "project",
action: 0,
value: "生产线",
}, //默认查询可用的
],
SkipCount: 0,
MaxResultCount: 1000,
},
activeName: "first",
};
},
computed: {
sureTitle() {
return {
1: "立即导入",
2: "取消导入",
3: "确定",
4: "确定",
}[this.stepsActive];
},
showCancel() {
return this.stepsActive == 1;
},
getMoudleDisable() {
if (this.crmType == "settleAccount") {
this.isEditYearMont = true;
//this.isEditFactory = true;
this.isTimeUse = true;
} else if (this.crmType == "material") {
//物料-工厂可用
this.isEditYearMont = true;
this.isEditFactory = false;
} else if (
this.crmType == "estimatedSum" ||
this.crmType == "estimatedInventoryDetail"
) {
this.isEditYearMont = false;
this.isEditFactory = true;
} else {
this.isEditYearMont = false;
this.isEditFactory = false;
}
},
crmTypeName() {
return (
{
fis: "FIS发运数据",
settleAccount: "R3数据",
}[this.crmType] || ""
);
},
getWebApi() {
return (
{
fis: "/api/settleaccount/fis/ExcelImport",
settleAccount: "/api/settleaccount/SettleAccount/ExcelImport",
2 years ago
}[this.crmType] || ""
);
},
getImportTemplate() {
//模板名称
return (
{
fis: "FIS发运数据导入模板.xlsx",
settleAccount: "R3数据模板.xlsx",
}[this.crmType] || ""
);
},
httpHeader() {
//文件上传时,带token认证信息,提高安全性
return {
Authorization: "Bearer " + getToken(),
};
},
},
watch: {
show: function (val) {
this.stepsActive = 1;
this.getAllFactory(); //加载版本
this.getAllCarModel(); //加载车型
this.getMoudleDisable(); //判断设置条件是否可用
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/CentralizedControl/openlist")
2 years ago
.then((response) => {
response.forEach((element) => {
let options = {};
options.value = element.version;
options.label = element.version;
this.factoryList.push(options);
});
})
.catch(() => {
this.listLoading = false;
});
},
getAllCarModel() {
//取车型列表信息
this.carModelList = [];
this.listQueryCustom.SkipCount = (this.page - 1) * 500;
console.log(JSON.stringify(this.listQueryCustom));
this.$axios
.posts("/api/settleaccount/CodeSetting/list", this.listQueryCustom)
.then((response) => {
response.items.forEach((element) => {
let options = {};
options.value = element.value;
options.label = element.description;
this.carModelList.push(options);
});
})
.catch(() => {
this.listLoading = false;
});
},
2 years ago
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.versionValue == "") {
this.$message.error("必须选择版本!");
return false;
}
2 years ago
if (this.startTimeVale && this.endTimeVale) {
if (
formatTimeToTimestamp(this.startTimeVale) >=
formatTimeToTimestamp(this.endTimeVale)
) {
this.$message.error("开始时间必须小于结束时间!");
return false;
}
}
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.saveTemplateData();
this.activeName = "second";
// setTimeout(() => {
// this.saveTemplateData();
// }, 1000);
if (this.stepList[1].status == "finish") {
}
} else {
if (this.fileuploadList === "[]") {
this.$message.error("请选择导入文件");
}
}
} else {
this.closeView();
}
},
saveTemplateData() {
this.loading = true;
//保存项目、合同管理、客户等信息的共用方法
//--上传附件,批量或拖拽
if (JSON.stringify(this.fileuploadList) != "[]") {
let fd = new FormData();
const { fileuploadList } = this;
fileuploadList.forEach((file) => {
fd.append("files", file); // 添加文件
});
fd.append("branchId", "3FA85F64-5717-4562-B3FC-2C963F66AFA6");
fd.append("year", "2021");
fd.append("period", "03");
fd.append("customerCode", "03");
fd.append("factory", "03");
fd.append("beginDate", this.startTimeVale);
fd.append("endDate", this.endTimeVale);
fd.append("model", this.CarModekValue);
fd.append("version", this.versionValue);
const webapi = this.getWebApi;
this.$axios
.posts(webapi, fd)
.then(async (res) => {
console.log("导入条件:" + JSON.stringify(res));
if (res === "Success") {
if (this.isLt2M === "1" && this.isFileType === "1") {
this.$notify({
title: "成功",
message: "数据导入成功!",
type: "success",
duration: 2000,
});
this.stepList[1].status = "finish";
this.resultData.successMessage = "数据导入成功!";
this.stepsActive = 4;
2 years ago
}
} else {
this.stepList[0].status = "wait";
this.resultData.errTemplate = res; //指定错误模板名称,作为参数,用于错误模板下载
this.resultData.errSize = 1; //保持大于0,用于控制错误数据下载按钮的可不可见
this.resultData.successMessage = "数据导入失败!";
this.stepsActive = 3;
2 years ago
}
this.$emit("status", "finish");
this.loading = false;
})
.catch(() => {
this.stepList[1].status = "finish";
this.resultData.errSize = 0;
this.resultData.successMessage = "导入模板有错误,请检查!";
this.stepsActive = 3;
this.loading = false;
});
} else {
this.loading = false;
this.$message({
message: "未上传任何附件,请查检!",
type: "warning",
});
}
},
/**
* 下载错误模板
*/
downloadErrData() {
let fileNameOfProject = this.resultData.errTemplate;
this.$axios
.BolbGets(
"/api/settleaccount/getblobfile/download/" + fileNameOfProject
)
.then((response) => {
if (fileNameOfProject.indexOf("_") != -1) {
let downName =
fileNameOfProject.slice(0, fileNameOfProject.lastIndexOf("_")) +
fileNameOfProject.slice(fileNameOfProject.lastIndexOf("."));
downloadFile(response, downName);
this.$notify({
title: "成功",
message: "错误数据-导出成功!",
type: "success",
duration: 2000,
});
} else {
downloadFile(response, fileNameOfProject);
this.$notify({
title: "成功",
message: "错误数据-导出成功!",
type: "success",
duration: 2000,
});
}
this.listLoading = false;
})
.catch((error) => {
this.listLoading = false;
});
},
// 关闭操作
closeView() {
this.$emit("update:show", false);
this.$emit("close", this.stepsActive == 3 ? "finish" : "");
this.activeName = "first";
},
handleClick(tab) {
// console.log(tab.index)
// console.log(tab.name)
if (tab.name == "first") {
// console.log(tab.name)
this.fileuploadList = [];
this.stepsActive = 1;
}
},
},
};
</script>
<style scoped lang="scss">
@import "@/styles/xr-theme.scss";
/deep/.el-dialog {
margin-top: 3vh !important;
}
/deep/.el-dialog__body {
padding: 20px 20px;
}
//Tabs标签Flex布局
/deep/.el-tabs__nav {
width: 100%;
display: flex;
align-items: center;
justify-content: space-around;
}
//去掉el-tab-pane底部灰色线条
/deep/.el-tabs__nav-wrap::after {
height: 0 !important;
}
//Tabs标签el-tab-pane蓝色下划线
/deep/.el-tabs__active-bar {
left: 90px;
width: 90px !important;
}
//Tabs标签el-tab-pane蓝色下划线点击录入后样式
/deep/ .el-tabs__active-go {
.el-tabs__active-bar {
transform: translateX(297px) !important;
}
}
.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;
.el-card {
border: none;
}
//显示结果box的padding
/deep/.el-card__body {
padding: 60px 20px 20px 20px;
}
i {
font-size: 60px;
}
// 错误结果icon
.el-icon-error {
color: red;
}
//正确结果icon
.el-icon-success {
color: chartreuse;
}
&__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>