NEZ-2282 feat:批量导入结果页面样式调整

This commit is contained in:
zyh
2022-10-25 16:57:54 +08:00
parent 1f2e8db0d5
commit 063fca2e49
10 changed files with 292 additions and 70 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -5,6 +5,34 @@
"css_prefix_text": "nz-icon-", "css_prefix_text": "nz-icon-",
"description": "", "description": "",
"glyphs": [ "glyphs": [
{
"icon_id": "32442422",
"name": "New",
"font_class": "New",
"unicode": "e7a5",
"unicode_decimal": 59301
},
{
"icon_id": "32442423",
"name": "Update",
"font_class": "Update",
"unicode": "e7a6",
"unicode_decimal": 59302
},
{
"icon_id": "32438331",
"name": "单个模式",
"font_class": "dangemoshi",
"unicode": "e7a1",
"unicode_decimal": 59297
},
{
"icon_id": "32438332",
"name": "多个模式",
"font_class": "duogemoshi",
"unicode": "e7a2",
"unicode_decimal": 59298
},
{ {
"icon_id": "32391765", "icon_id": "32391765",
"name": "二维码", "name": "二维码",

File diff suppressed because one or more lines are too long

View File

@@ -1162,6 +1162,10 @@ li {
color: $--color-success; color: $--color-success;
font-size: 14px; font-size: 14px;
} }
.nz-icon-New,.nz-icon-Update{
color: $--color-success;
font-size: 14px;
}
.nz-icon-import-failed { .nz-icon-import-failed {
margin-right: 5px; margin-right: 5px;
color: $--color-danger; color: $--color-danger;
@@ -1199,6 +1203,9 @@ li {
text-overflow: ellipsis; text-overflow: ellipsis;
} }
} }
.import-result-block:last-of-type .import-result-item{
margin-bottom: 0;
}
} }
.result-success-box { .result-success-box {
height: 256px; height: 256px;
@@ -1265,6 +1272,108 @@ li {
} }
} }
} }
.import-result-dialog{
.el-dialog__header{
padding: 14px;
border-bottom: 1px solid $--border-color-light;
}
.el-dialog__body{
padding: 0;
.result-body{
padding: 15px 30px;
.result-title-top{
.result-number{
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
margin-bottom: 4px;
font-family: Roboto-Regular;
font-size: 14px;
color: $--color-text-primary;
font-weight: 400;
.nz-icon{
font-size: 14px;
margin-right: 4px;
}
&>span:last-of-type{
font-weight: 700;
}
}
.result-number.fail{
margin-bottom: 0;
}
}
.result-detail{
height: 182px;
margin: 10px 0;
padding: 16px 0;
box-sizing: border-box;
position: relative;
&>div{
padding: 0 12px;
}
.nz-icon-override{
cursor: pointer;
position: absolute;
top: 5px;
right: 15px;
}
.import-result-item {
margin-bottom: 2px;
.import-result-item-left {
font-size: 16px;
color: $--color-text-primary;
letter-spacing: 0;
line-height: 16px;
font-weight: 600;
margin-right: 2px;
}
.import-result-item-right{
.line-num{
min-width: 50px;
display: inline-block;
margin-right: 6px;
}
.line-content{
overflow: auto;
text-overflow: clip;
white-space: normal;
}
}
}
}
.result-success-box{
height: 220px;
.success-number{
width: 300px;
display: flex;
align-items: center;
justify-content: space-between;
font-family: Roboto-Regular;
font-size: 14px;
color: $--color-text-primary;
font-weight: 400;
.nz-icon{
font-size: 14px;
margin-right: 4px;
}
&>span:last-of-type{
font-weight: 700;
}
}
}
}
.footer{
border-top: 1px solid $--border-color-light;
padding: 12px 20px;
.el-message-box__btns{
padding: 0;
}
}
}
}
/**dialog 在视图中居中显示start*/ /**dialog 在视图中居中显示start*/

View File

@@ -23,10 +23,19 @@
<slot name="after"></slot> <slot name="after"></slot>
</el-dropdown-menu> </el-dropdown-menu>
<el-dialog :close-on-click-modal="importBox.type!=3" destroy-on-close :show-close="true" :title="importBox.title" :visible.sync="importBox.show" width="580px" :modal-append-to-body="false" class="nz-dialog" @close="closeDialog"> <el-dialog
:close-on-click-modal="importBox.type!=3"
destroy-on-close
:show-close="true"
:title="importBox.title"
:visible.sync="importBox.show"
width="580px"
:modal-append-to-body="false"
@close="closeDialog"
:class="{'import-result-dialog':importBox.type==3}"
class="nz-dialog">
<!-- 新版导入 --> <!-- 新版导入 -->
<div v-if="importBox.type == 1&&importNew"> <div v-if="importBox.type == 1">
<div class="upload-body"> <div class="upload-body">
<el-upload :id="id+'-xlsx-input-file'" ref="uploadExcel" :auto-upload="false" :file-list="importFileList" :on-change="importChange" accept=".xlsx,.xls,.csv,.json" action="" class="import-upload" drag> <el-upload :id="id+'-xlsx-input-file'" ref="uploadExcel" :auto-upload="false" :file-list="importFileList" :on-change="importChange" accept=".xlsx,.xls,.csv,.json" action="" class="import-upload" drag>
<i class="el-icon-upload"></i> <i class="el-icon-upload"></i>
@@ -84,30 +93,6 @@
</div> </div>
</div> </div>
<!-- 导入 -->
<div v-else-if="importBox.type == 1">
<div class="upload-body">
<el-upload :id="id+'-xlsx-input-file'" ref="uploadExcel" :auto-upload="false" :file-list="importFileList" :on-change="importChange" accept=".xlsx,.xls" action="" class="upload-demo" drag>
<div slot="tip" class="el-upload__tip" >{{$t('overall.importTip')}}</div>
<i class="nz-icon nz-icon-upload"></i>
<div class="el-upload__text">{{$t('overall.dragFileTip')}}{{$t('overall.or')}}&nbsp;<em>{{$t('overall.clickUpload')}}</em></div>
</el-upload>
</div>
<div class="footer">
<div class="el-message-box__btns" style="text-align: right;">
<button :id="id+'-xlsx-import-template'" class="nz-btn el-button el-button--default el-button--small" @click="downloadTemplate()">
<span>{{$t('upload.template')}}</span>
</button>
<button :id="id+'-xlsx-import-add'" :class="{'nz-btn-disabled':prevent_opt.import}" :disabled="prevent_opt.import" class="nz-btn el-button el-button--default el-button--small" @click="importExcel">
<span>{{$t('overall.importExcel')}}</span>
</button>
<button :id="id+'-xlsx-import-esc'" class="nz-btn el-button el-button--default el-button--small" @click="closeDialog">
<span>{{$t('overall.cancel')}}</span>
</button>
</div>
</div>
</div>
<!-- 导出 --> <!-- 导出 -->
<div v-else-if="importBox.type == 2"> <div v-else-if="importBox.type == 2">
<div class="upload-body" style="height: 200px"> <div class="upload-body" style="height: 200px">
@@ -142,15 +127,38 @@
<!-- 导入结果 --> <!-- 导入结果 -->
<div v-if="importBox.type==3"> <div v-if="importBox.type==3">
<div class="upload-body result-body"> <div class="upload-body result-body">
<!-- 失败提示 -->
<div v-if="importResult&&importResult.failNum"> <div v-if="importResult&&importResult.failNum">
<!-- success number-->
<div class="result-title-top"> <div class="result-title-top">
<div class=""> <div class="result-number">
<span>
<i class="nz-icon nz-icon-import-success"/> <i class="nz-icon nz-icon-import-success"/>
<span>{{$t('overall.result.successNum',{successNum:importResult.successNum})}}</span><br/> {{$t('overall.result.successful')}}
</span>
<span>{{importResult.successNum}}</span>
</div> </div>
<div class=""> <div class="result-number" style="padding-left:20px;">
<span>
<i class="nz-icon nz-icon-New"/>
{{$t('overall.result.newQuantity')}}
</span>
<span>{{importResult.addNum}}</span>
</div>
<div class="result-number" style="padding-left:20px;">
<span>
<i class="nz-icon nz-icon-Update"/>
{{$t('overall.result.updates')}}
</span>
<span>{{importResult.updateNum}}</span>
</div>
<!-- fail number-->
<div class="result-number fail">
<span>
<i class="nz-icon nz-icon-import-failed"/> <i class="nz-icon nz-icon-import-failed"/>
<span>{{$t('overall.result.failedNum',{failedNum:importResult.failNum,total:importResult.totalNum})}}</span> {{$t('overall.result.fail')}}
</span>
<span>{{importResult.failNum}}</span>
</div> </div>
</div> </div>
<div> <div>
@@ -159,32 +167,56 @@
<template v-for="(item, index) in importResult.failDetail"> <template v-for="(item, index) in importResult.failDetail">
<div :key="index" class="import-result-block"> <div :key="index" class="import-result-block">
<div class="import-result-item"> <div class="import-result-item">
<div class="line-num">{{$t('overall.result.line',[item.lineNo])}}</div> <div class="import-result-item-left"></div>
<div class="line-content" :title="item.errorMsg">{{item.errorMsg}}</div> <div class="import-result-item-right">
<span class="line-num">{{$t('overall.result.line',[item.lineNo])}}</span>
<span class="line-content" :title="item.errorMsg">{{item.errorMsg}}</span>
</div>
</div> </div>
</div> </div>
</template> </template>
</div> </div>
<i class="nz-icon nz-icon-override" @click="copyFailDetail(importResult.failDetail)"></i>
</div> </div>
</div> </div>
</div> </div>
<div v-else class="result-success-box"> <!-- 成功提示 -->
<div> <div v-else-if="importResult&&!importResult.failNum" class="result-success-box">
<i class="nz-icon nz-icon-import-success"/> <div style="height:80px;line-height:80px;">
<i class="nz-icon nz-icon-import-success" style="margin-right:0" />
</div>
<div style="margin-top:30px">
<div class="success-number">
<span>
{{$t('overall.result.importedRecords')}}
</span>
<span>{{importResult.successNum}}</span>
</div>
<div class="success-number" style="margin-top:8px">
<span>
<i class="nz-icon nz-icon-New"/>
{{$t('overall.result.newRecords')}}
</span>
<span>{{importResult.addNum}}</span>
</div>
<div class="success-number" style="margin-top:4px">
<span>
<i class="nz-icon nz-icon-Update"/>
{{$t('overall.result.updatedRecords')}}
</span>
<span>{{importResult.updateNum}}</span>
</div> </div>
<div class="result-success-txt">{{$t('overall.result.successfully')}}</div>
<div class="result-success-txt">
{{$t('overall.result.imported')}}
<span v-if="importResult">{{importResult.successNum}}</span>
{{$t('overall.result.records')}}
</div> </div>
</div> </div>
</div> </div>
<div class="footer"> <div class="footer">
<div class="el-message-box__btns"> <div class="el-message-box__btns">
<button :id="id+'-xlsx-import-rollback'" class="nz-btn el-button el-button--small nz-btn-style-error" @click="rollbackImport"> <button v-if="importResult&&importResult.failNum" :id="id+'-xlsx-import-downloadFail'" class="nz-btn el-button el-button--small nz-btn-style-error" @click="downloadFail">
<span>{{$t('overall.rollbackImport')}}</span> <span>{{$t('overall.result.downloadFail')}}</span>
</button> </button>
<!-- <button :id="id+'-xlsx-import-rollback'" class="nz-btn el-button el-button--small nz-btn-style-error" @click="rollbackImport">
<span>{{$t('overall.rollbackImport')}}</span>
</button> -->
<button :id="id+'-xlsx-import-close'" class="nz-btn el-button el-button--small el-button--default" @click="closeDialog"> <button :id="id+'-xlsx-import-close'" class="nz-btn el-button el-button--small el-button--default" @click="closeDialog">
<span>{{$t('overall.close')}}</span> <span>{{$t('overall.close')}}</span>
</button> </button>
@@ -238,10 +270,6 @@ export default {
exportBoxShow: { exportBoxShow: {
type: Boolean, default: false type: Boolean, default: false
}, },
// 显示新版导入
importNew: {
type: Boolean, default: true
},
// 已存在的内容处理方式 // 已存在的内容处理方式
showEexisted: { showEexisted: {
type: Boolean, default: true type: Boolean, default: true
@@ -312,6 +340,16 @@ export default {
// this.getParamsType() // this.getParamsType()
}, },
methods: { methods: {
// 复制失败记录
copyFailDetail (data) {
let txt = ''
data.forEach((item, index) => {
txt += '• ' + this.$t('overall.result.line', [item.lineNo]) + ' ' + item.errorMsg + (index + 1 < data.length ? '\n' : '')
})
this.$copyText(txt).then(() => {
this.$message.success({ message: this.$t('overall.copySuccess') })
})
},
importChange (file, fileList) { importChange (file, fileList) {
if (fileList.length > 0) { if (fileList.length > 0) {
this.importFileList = [fileList[fileList.length - 1]] this.importFileList = [fileList[fileList.length - 1]]
@@ -362,11 +400,7 @@ export default {
if (this.importFile && this.importFile.raw) { if (this.importFile && this.importFile.raw) {
this.prevent_opt.import = true this.prevent_opt.import = true
const form = new FormData() const form = new FormData()
if (this.importNew) {
form.append('file', this.importFile.raw) form.append('file', this.importFile.raw)
} else {
form.append('excelFile', this.importFile.raw)
}
if (this.showEexisted) { if (this.showEexisted) {
form.append('existed', this.importBox.existed) form.append('existed', this.importBox.existed)
} }
@@ -391,11 +425,11 @@ export default {
// form.append('language', localStorage.getItem('nz-language') ? localStorage.getItem('nz-language') : 'en') // form.append('language', localStorage.getItem('nz-language') ? localStorage.getItem('nz-language') : 'en')
this.$post(this.importUrl, form, { 'Content-Type': 'multipart/form-data' }).then(response => { this.$post(this.importUrl, form, { 'Content-Type': 'multipart/form-data' }).then(response => {
if (response.code == 200 && response.msg == 'success') { if (response.code == 200 && response.msg == 'success') {
this.importBox.type = 3
this.importBox.title = this.$t('overall.importResult')
this.importResult = response.data this.importResult = response.data
const linkId = this.link ? this.link.id : '' const linkId = this.link ? this.link.id : ''
this.$emit('afterImport', linkId) this.$emit('afterImport', linkId)
this.importBox.type = 3
this.importBox.title = this.$t('overall.importResult')
} else { } else {
this.$message.error(response.msg) this.$message.error(response.msg)
} }
@@ -645,6 +679,25 @@ export default {
reader.readAsText(error.response.data) reader.readAsText(error.response.data)
}) })
}, },
// 导出失败记录
downloadFail () {
const result = this.importResult.failContent
const raw = window.atob(result)
const uInt8Array = new Uint8Array(raw.length)
for (let i = 0; i < raw.length; i++) {
uInt8Array[i] = raw.charCodeAt(i)
}
const link = document.createElement('a')
const blob = new Blob([uInt8Array], {
type: 'application/vnd.ms-excel'
})
link.style.display = 'none'
link.href = URL.createObjectURL(blob)
link.setAttribute('download', 'failed_records' + '-' + this.getTimeString() + '.xlsx')
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
},
showImportBox (type) { showImportBox (type) {
this.importBox.show = true this.importBox.show = true
this.importBox.type = type this.importBox.type = type

View File

@@ -189,7 +189,7 @@
@refresh="getTableData"> @refresh="getTableData">
</batchEditEndpoint> </batchEditEndpoint>
</transition> </transition>
<el-dialog :close-on-click-modal="false" :show-close="true" destroy-on-close :title='$t("overall.batchAddEndpoint")' :visible.sync="importBoxShow" :width="'600px'" append-to-body class="nz-dialog" @close="closeDialog"> <el-dialog :close-on-click-modal="false" :show-close="true" destroy-on-close :title='$t("overall.batchAddEndpoint")' :visible.sync="importBoxShow" :width="'580px'" append-to-body class="nz-dialog" @close="closeDialog">
<div class="upload-body result-body"> <div class="upload-body result-body">
<div v-if="importResult&&importResult.failNum"> <div v-if="importResult&&importResult.failNum">
<div class="result-title-top"> <div class="result-title-top">
@@ -217,7 +217,7 @@
</div> </div>
</div> </div>
</div> </div>
<div v-else class="result-success-box"> <div v-else-if="importResult&&!importResult.failNum" class="result-success-box">
<div> <div>
<i class="nz-icon nz-icon-import-success"/> <i class="nz-icon nz-icon-import-success"/>
</div> </div>
@@ -229,12 +229,12 @@
</div> </div>
</div> </div>
</div> </div>
<div slot="footer" class="footer"> <div class="footer">
<div class="el-message-box__btns"> <div class="el-message-box__btns">
<button :id="'xlsx-import-rollback'" class="nz-btn nz-btn-size-normal nz-btn-style-error" @click="rollbackImport"> <button :id="'xlsx-import-rollback'" class="nz-btn el-button el-button--small nz-btn-style-error" @click="rollbackImport">
<span>{{$t('overall.rollbackImport')}}</span> <span>{{$t('overall.rollbackImport')}}</span>
</button> </button>
<button :id="'xlsx-import-close'" class="nz-btn el-button el-button--default el-button--small" @click="closeDialog"> <button :id="'xlsx-import-close'" class="nz-btn el-button el-button--small el-button--default" @click="closeDialog">
<span>{{$t('overall.close')}}</span> <span>{{$t('overall.close')}}</span>
</button> </button>
</div> </div>