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.
599 lines
17 KiB
599 lines
17 KiB
<template>
|
|
<div
|
|
v-loading="loading1"
|
|
class="import-container"
|
|
element-loading-background="rgba(0, 0, 0, 0.8)"
|
|
>
|
|
<ul class="import-header">
|
|
<li><i class="step-img01" /><span>上传数据包</span></li>
|
|
<li :class="['dot-img', {'dot-img-active':isShow02 || isShow03}]" />
|
|
<li><i :class="['step-img02', {'step-img02-active':isShow02 || isShow03}]" /><span>读取数据</span></li>
|
|
<li :class="['dot-img', {'dot-img-active':isShow03}]" />
|
|
<li><i :class="['step-img03', {'step-img03-active':isShow03}]" /><span>导入数据</span></li>
|
|
</ul>
|
|
<div
|
|
v-if="isShow01"
|
|
class="step-content step-upload"
|
|
>
|
|
<div class="upload-container">
|
|
<input ref="fileInput" :key="key" type="file" accept=".xlsx, .xls" @change="handleFileChange">
|
|
<div class="upload-zip"><i class="el-icon-upload2" />选择文件</div>
|
|
</div>
|
|
<div class="el-upload__tip">上传限制文件类型:xlsx, xls</div>
|
|
<div v-for="item in fileList" :key="item.name" class="file-list">
|
|
{{ item.name }}
|
|
<i class="el-icon-close" @click="deleteFile(item)" />
|
|
</div>
|
|
</div>
|
|
<div v-if="isShow01" class="step-bottom-btn">
|
|
<el-button type="primary" @click="handleStep01">下一步</el-button>
|
|
</div>
|
|
<div v-if="isShow02" class="step-content">
|
|
<div class="import-data-number">共 <span style="color: #339cff;">{{ totalNum }}</span> 条 正常 <span style="color: #1AAE93;">{{ normalNum }}</span> 条 问题 <span style="color:rgb(246,81,99)">{{ errorNum }}</span> 条</div>
|
|
<ListPre
|
|
ref="importTableList"
|
|
:hp-id="hpId"
|
|
:initial-table-data="previewTableData"
|
|
:initial-total="previewTotal"
|
|
/>
|
|
</div>
|
|
<div v-if="isShow02" class="step-bottom-btn">
|
|
<el-button @click="handleReturn02">上一步</el-button>
|
|
<el-button type="primary" @click="submitImport">导入</el-button>
|
|
</div>
|
|
<div v-if="isShow03" class="step-content step-content03">
|
|
<!-- 导入中状态 -->
|
|
<div v-if="importStatus === 'loading'" class="import-status-indicator">
|
|
<i class="el-icon-loading" />
|
|
<p>数据导入中,请耐心等待...</p>
|
|
</div>
|
|
|
|
<!-- 导入成功状态 -->
|
|
<div v-else-if="importStatus === 'success'" class="import-status-indicator success">
|
|
<i class="el-icon-circle-check" />
|
|
<p>数据导入成功!</p>
|
|
<el-button type="primary" @click="handleReturn03">完成</el-button>
|
|
</div>
|
|
|
|
<!-- 导入失败状态 -->
|
|
<div v-else-if="importStatus === 'error'" class="import-status-indicator error">
|
|
<i class="el-icon-circle-close" />
|
|
<p>数据导入失败,请重试。</p>
|
|
<el-button type="primary" @click="retryImport">重试</el-button>
|
|
<el-button @click="handleReturn03">取消</el-button>
|
|
</div>
|
|
</div>
|
|
<!-- <div v-if="isShow03" class="step-content step-content03">
|
|
<el-form ref="form" :model="form" label-width="160px">
|
|
<el-row>
|
|
<el-form-item label="案卷及文件数据">
|
|
<el-checkbox v-model="form.importArchive">导入</el-checkbox>
|
|
</el-form-item>
|
|
<el-form-item label="遇到重复数据导入方式">
|
|
<el-radio-group v-model="form.archivesImportType">
|
|
<el-radio label="2">覆盖</el-radio>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
</el-row>
|
|
<el-row>
|
|
<el-form-item label="资料数据">
|
|
<el-checkbox v-model="form.importInformation">导入</el-checkbox>
|
|
</el-form-item>
|
|
<el-form-item label="遇到重复数据导入方式" pr>
|
|
<el-radio-group v-model="form.informationInputType">
|
|
<el-radio label="2">覆盖</el-radio>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
</el-row>
|
|
<el-form-item>
|
|
<el-button type="primary" class="submit-btn" @click="submitForm('form')">导入</el-button>
|
|
<el-button @click="handleReturn03">取消</el-button>
|
|
</el-form-item>
|
|
</el-form>
|
|
</div> -->
|
|
<el-dialog title="确认删除" :visible.sync="deleteVisible">
|
|
<span class="dialog-right-top" />
|
|
<span class="dialog-left-bottom" />
|
|
<div class="setting-dialog">
|
|
<p><span style="color:#fff;">此操作将清空所选数据</span></p>
|
|
<div slot="footer" class="dialog-footer">
|
|
<el-button type="primary" @click.native="handleDelConfirm">确定</el-button>
|
|
</div>
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import crudFileImport from '@/api/archivesManage/fileImport'
|
|
import { mapGetters } from 'vuex'
|
|
import ListPre from '../module/listPre.vue'
|
|
export default {
|
|
name: 'DataImport',
|
|
components: { ListPre },
|
|
data() {
|
|
return {
|
|
key: 0,
|
|
file: null,
|
|
fileList: [],
|
|
totalNum: 0,
|
|
errorNum: 0,
|
|
normalNum: 0,
|
|
deleteVisible: false,
|
|
fileName: null,
|
|
form: {
|
|
importArchive: true,
|
|
importInformation: true,
|
|
archivesImportType: '2',
|
|
informationInputType: '2'
|
|
},
|
|
isShow01: true,
|
|
isShow02: false,
|
|
isShow03: false,
|
|
timer: null,
|
|
loading1: false,
|
|
previewTableData: [], // 用于存储预览表格数据
|
|
previewTotal: 0, // 用于存储预览数据总数
|
|
hpId: null,
|
|
importStatus: 'loading'
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters([
|
|
'user',
|
|
'baseApi'
|
|
])
|
|
},
|
|
created() {
|
|
},
|
|
methods: {
|
|
// input-upload change
|
|
handleFileChange(event) {
|
|
const files = event.target.files
|
|
this.file = files[0]
|
|
this.key++
|
|
// const sizeLimit = this.file.size / 1024 / 1024 > 10
|
|
// if (sizeLimit) {
|
|
// this.$message.warning('上传文件大小不能超过 10MB!')
|
|
// }
|
|
for (let i = 0; i < files.length; i++) {
|
|
this.fileList = []
|
|
this.fileList.push(files[i])
|
|
}
|
|
},
|
|
// delt file
|
|
deleteFile(file) {
|
|
this.$confirm('此操作将清空所选数据, 是否继续?', '提示', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
const index = this.fileList.indexOf(file)
|
|
this.fileList.splice(index, 1)
|
|
this.file = null
|
|
this.$message({
|
|
type: 'success',
|
|
message: '删除成功!'
|
|
})
|
|
}).catch(() => {
|
|
this.$message({
|
|
type: 'info',
|
|
message: '已取消删除'
|
|
})
|
|
})
|
|
},
|
|
// 上传文件
|
|
handleStep01() {
|
|
this.loading1 = true
|
|
const notifyInstance = this.$notify.info({
|
|
title: '温馨提示',
|
|
message: '当前批量数据导入所需的时间较长,请用户耐心等待,谢谢!',
|
|
customClass: 'centered-notify',
|
|
showClose: false,
|
|
duration: 0
|
|
})
|
|
|
|
if (this.fileList.length === 0) {
|
|
this.$message.warning('请上传相关文件 !')
|
|
this.loading1 = false
|
|
notifyInstance.close()
|
|
return
|
|
}
|
|
|
|
this.fileName = this.file.name.split('.')[0]
|
|
|
|
crudFileImport.zipUpload(this.baseApi + '/api/unzip/importArchives', this.file, this.user.username)
|
|
.then(res => {
|
|
if (res.data.code === 200 && res.data.data) {
|
|
this.hpId = res.data.data
|
|
|
|
return crudFileImport.FetchHpArchivesDetailsByHpId({
|
|
page: 0,
|
|
size: 10,
|
|
hpId: this.hpId,
|
|
isError: true
|
|
})
|
|
} else {
|
|
throw new Error('文件上传或解析失败')
|
|
}
|
|
})
|
|
.then(res => {
|
|
console.log('预览数据 res2:', res.data.content)
|
|
this.totalNum = res.total
|
|
this.errorNum = res.error
|
|
this.normalNum = res.normal
|
|
this.previewTableData = res.data.content
|
|
this.previewTotal = res.data.totalElements
|
|
|
|
this.isShow01 = false
|
|
this.isShow02 = true
|
|
})
|
|
.catch(() => {
|
|
this.$message.error('数据加载失败,请重试。')
|
|
this.isShow01 = false
|
|
this.isShow02 = true
|
|
})
|
|
.finally(() => {
|
|
this.loading1 = false
|
|
notifyInstance.close()
|
|
})
|
|
},
|
|
// 第二步 上一步
|
|
handleReturn02() {
|
|
this.fileList = []
|
|
this.isShow01 = true
|
|
this.isShow02 = false
|
|
this.isShow03 = false
|
|
},
|
|
// 第二步 下一步
|
|
handleStep02() {
|
|
this.isShow01 = false
|
|
this.isShow02 = false
|
|
this.isShow03 = true
|
|
},
|
|
// 确认导入
|
|
submitImport() {
|
|
this.isShow01 = false
|
|
this.isShow02 = false
|
|
this.isShow03 = true
|
|
this.importStatus = 'loading'
|
|
|
|
const modifiedRows = this.$refs.importTableList.getModifiedRows()
|
|
const params = {
|
|
'hpId': this.hpId,
|
|
'hpTempList': modifiedRows
|
|
}
|
|
console.log('params:', params)
|
|
crudFileImport.FetchImportHp(params).then(res => {
|
|
// this.$message({
|
|
// type: 'success',
|
|
// message: '导入成功!'
|
|
// })
|
|
console.log('导入成功, 结果:', res)
|
|
// this.importStatus = 'success' // 导入成功,更新状态
|
|
}).catch(() => {
|
|
// console.error('导入失败')
|
|
// this.importStatus = 'error' // 导入失败,更新状态
|
|
this.timer = setTimeout(() => {
|
|
this.$emit('step-end', '1')
|
|
clearTimeout(this.timer)
|
|
}, 1000)
|
|
})
|
|
this.timer = setTimeout(() => {
|
|
this.$emit('step-end', '1')
|
|
clearTimeout(this.timer)
|
|
}, 1000)
|
|
},
|
|
retryImport() {
|
|
this.submitImport()
|
|
},
|
|
handleReturn03() {
|
|
this.isShow01 = true
|
|
this.isShow02 = false
|
|
this.isShow03 = false
|
|
this.fileList = []
|
|
this.file = null
|
|
this.importStatus = 'loading'
|
|
if (this.timer) {
|
|
clearTimeout(this.timer)
|
|
this.timer = null
|
|
}
|
|
},
|
|
submitForm(formName) {
|
|
// this.loading1 = true
|
|
// const notifyInstance = this.$notify.info({
|
|
// title: '温馨提示',
|
|
// message: '当前批量数据导入所需的时间较长,请用户耐心等待,谢谢!',
|
|
// customClass: 'centered-notify',
|
|
// showClose: false,
|
|
// duration: 0 // 设置为0表示不自动关闭
|
|
// })
|
|
this.$refs[formName].validate((valid) => {
|
|
if (valid) {
|
|
const params = {
|
|
'archivesImportType': this.form.archivesImportType,
|
|
'importArchive': this.form.importArchive,
|
|
'importInformation': this.form.importInformation,
|
|
'informationInputType': this.form.informationInputType,
|
|
'name': this.fileName
|
|
}
|
|
console.log('params:', params)
|
|
crudFileImport.FetchImportZip(params).then(res => {
|
|
console.log('resZip', res)
|
|
this.$message({
|
|
type: 'success',
|
|
message: '导入成功!'
|
|
})
|
|
}).catch(() => {
|
|
this.timer = setTimeout(() => {
|
|
this.$emit('step-end', '1')
|
|
clearTimeout(this.timer)
|
|
}, 1000)
|
|
})
|
|
this.timer = setTimeout(() => {
|
|
this.$emit('step-end', '1')
|
|
clearTimeout(this.timer)
|
|
}, 1000)
|
|
} else {
|
|
console.log('error submit!!')
|
|
return false
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<style>
|
|
.centered-notify{
|
|
top: calc(50% + 80px) !important;
|
|
left: calc(50% + 160px) !important;
|
|
right: 0 !important;
|
|
transform: translate(-50%,-50%) !important;
|
|
background-color: #031435!important;
|
|
border: 1px solid #339CFF!important;
|
|
& h2{
|
|
color: #fff!important;
|
|
}
|
|
& .el-notification__content{
|
|
color: #fff!important;
|
|
}
|
|
}
|
|
</style>
|
|
<style lang="scss" scoped>
|
|
::v-deep .el-loading-spinner{
|
|
top: 60%;
|
|
}
|
|
.import-container{
|
|
position: relative;
|
|
padding: 30px;
|
|
height: calc(100vh - 234px);
|
|
}
|
|
.import-header{
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
li{
|
|
display: flex;
|
|
flex-direction: column;
|
|
text-align: center;
|
|
align-items: center;
|
|
width: 140px;
|
|
font-size: 14px;
|
|
color: #fff;
|
|
i{
|
|
width: 45px;
|
|
height: 45px;
|
|
margin-bottom: 20px;
|
|
&.step-img01{
|
|
background: url('~@/assets/images/step01.png') no-repeat;
|
|
background-size: contain;
|
|
}
|
|
&.step-img02{
|
|
background: url('~@/assets/images/step02_2.png') no-repeat;
|
|
background-size: contain;
|
|
&.step-img02-active{
|
|
background: url('~@/assets/images/step02.png') no-repeat;
|
|
background-size: contain;
|
|
}
|
|
}
|
|
&.step-img03{
|
|
background: url('~@/assets/images/step03_3.png') no-repeat;
|
|
background-size: contain;
|
|
&.step-img03-active{
|
|
background: url('~@/assets/images/step03.png') no-repeat;
|
|
background-size: contain;
|
|
}
|
|
}
|
|
}
|
|
&.dot-img{
|
|
width: 55px;
|
|
height: 30px;
|
|
background: url('~@/assets/images/dot1.png') no-repeat;
|
|
background-size: contain;
|
|
&.dot-img-active{
|
|
background: url('~@/assets/images/dot2.png') no-repeat;
|
|
background-size: contain;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.step-content{
|
|
position: relative;
|
|
}
|
|
.step-content03 {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center; // 垂直居中
|
|
min-height: 200px; // 给一个最小高度,防止内容跳动
|
|
color: #fff;
|
|
|
|
.import-status-indicator {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
gap: 15px; // 元素之间的间距
|
|
|
|
i {
|
|
font-size: 48px;
|
|
}
|
|
|
|
p {
|
|
font-size: 16px;
|
|
}
|
|
|
|
.el-button {
|
|
margin-top: 10px;
|
|
}
|
|
|
|
&.success i {
|
|
color: #19be6b; // 成功颜色
|
|
}
|
|
|
|
&.error i {
|
|
color: #fa5555; // 失败颜色
|
|
}
|
|
}
|
|
}
|
|
.step-upload{
|
|
width: 40%;
|
|
padding: 30px 0;
|
|
margin: 40px auto;
|
|
background-color: #02255f;
|
|
border-radius: 3px;
|
|
div:first-child{
|
|
display: flex;
|
|
justify-content: center;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
}
|
|
}
|
|
.import-title{
|
|
font-size: 14px;
|
|
color: #fff;
|
|
padding-left: 50px;
|
|
margin-bottom: 6px;
|
|
height: 50px;
|
|
line-height: 50px;
|
|
&.step01{
|
|
background: url('~@/assets/images/step01.png') no-repeat;
|
|
background-size: 30px 30px;
|
|
}
|
|
&.step02{
|
|
background: url('~@/assets/images/step02.png') no-repeat;
|
|
background-size: 30px 30px;
|
|
}
|
|
&.step03{
|
|
background: url('~@/assets/images/step03.png') no-repeat;
|
|
background-size: 30px 30px;
|
|
}
|
|
}
|
|
.upload-container{
|
|
position: relative;
|
|
input{
|
|
position: absolute;
|
|
left: 50%;
|
|
top: 50%;
|
|
transform:translate(-50%,-50%);
|
|
opacity: 0;
|
|
border: 1px solid #000;
|
|
}
|
|
.upload-zip{
|
|
flex-direction: row !important;
|
|
width: 100px;
|
|
padding: 6px 10px;
|
|
font-size: 14px;
|
|
color: #fff;
|
|
border: 1px solid #339cff;
|
|
background-color: transparent;
|
|
border-radius: 3px;
|
|
& i{
|
|
margin-right: 4px;
|
|
}
|
|
}
|
|
}
|
|
.el-upload__tip{
|
|
text-align: center;
|
|
}
|
|
.file-list{
|
|
font-size: 16px;
|
|
color: #fff;
|
|
text-align: center;
|
|
margin-top: 20px;
|
|
i{
|
|
font-size: 12px;
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
|
|
::v-deep .el-upload{
|
|
display: block;
|
|
}
|
|
::v-deep .el-upload-list{
|
|
margin-top: 20px;
|
|
.el-upload-list__item{
|
|
font-size: 16px;
|
|
line-height: 30px;
|
|
&:hover{
|
|
background-color: transparent;
|
|
}
|
|
&:first-child{
|
|
margin-top: 0;
|
|
}
|
|
}
|
|
.el-upload-list__item-name [class^=el-icon]{
|
|
color: #fff;
|
|
}
|
|
.el-upload-list__item-name{
|
|
color: #fff;
|
|
}
|
|
.el-icon-close{
|
|
display: block;
|
|
color: #fff;
|
|
top: 8px;
|
|
}
|
|
}
|
|
|
|
.step-bottom-btn{
|
|
text-align: center;
|
|
.el-button.el-button--primary{
|
|
color: #fff;
|
|
background-color: #1890ff;
|
|
border-color: #1890ff;
|
|
}
|
|
}
|
|
|
|
.import-data-number{
|
|
position: absolute;
|
|
right: 10px;
|
|
top: 20px;
|
|
font-size: 12px;
|
|
color: #fff;
|
|
& span{
|
|
font-weight: bold;
|
|
color: rgb(246,81,99);
|
|
}
|
|
}
|
|
|
|
::v-deep .el-form{
|
|
.el-row{
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
}
|
|
.el-form-item{
|
|
margin-right: 50px;
|
|
.el-form-item__label,
|
|
.el-checkbox__label,
|
|
.el-radio__label{
|
|
color: #fff;
|
|
}
|
|
}
|
|
}
|
|
|
|
.submit-btn{
|
|
background-color: #3a99fd;
|
|
border-color: #3a99fd;
|
|
margin-top: 20px;
|
|
}
|
|
|
|
</style>
|