阅行客电子档案
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.
 
 
 
 
 
 

390 lines
12 KiB

<template>
<el-dialog class="detail-dialog" title="详情" :close-on-click-modal="false" :modal-append-to-body="false" append-to-body :visible.sync="archivesInfoVisible" :before-close="handleClose">
<!-- <span class="dialog-right-top" />
<span class="dialog-left-bottom" /> -->
<div class="setting-dialog">
<div class="detail-tab tab-content">
<!-- tab -->
<ul class="tab-nav">
<li :class="{'active-tab-nav': archivesTabIndex == 0}" @click="changeActiveTab(0)">基本信息</li>
<li :class="{'active-tab-nav': archivesTabIndex == 1}" @click="changeActiveTab(1)">电子原件</li>
<li :class="{'active-tab-nav': archivesTabIndex == 2}" @click="changeActiveTab(2)">元数据</li>
</ul>
<!-- 基本信息 -->
<div v-if="archivesTabIndex===0" class="base-info item-content">
<el-row>
<el-col v-for="(item,index) in archivesDetailsData" :key="index" :span="item.isLine ? 24 : 12" class="base-info-item">
<span>{{ item.fieldCnName }}:</span>
<p :style="{ width: ( item.editLength ? item.editLength+'px' : '' ), flex: ( !item.editLength ? 1 : '' )}">{{ item.context }}</p>
</el-col>
</el-row>
</div>
<!-- 电子原件 -->
<div v-if="archivesTabIndex===1" class="item-content">
<el-table
ref="table"
:data="tableData"
style="min-width: 100%"
height="calc(100vh - 382px)"
@row-click="clickRowHandler"
@selection-change="selectionChangeHandler"
>
<el-table-column prop="file_name" label="文件名称" show-overflow-tooltip min-width="140" align="center" />
<el-table-column prop="file_type" label="格式" min-width="60" align="center" />
<el-table-column prop="file_size" label="大小" min-width="85" align="right">
<template slot-scope="scope">
{{ getFileSize(scope.row.file_size) }}
</template>
</el-table-column>
<!-- <el-table-column prop="file_dpi" label="分辨率" min-width="85" align="center">
<template slot-scope="scope">
<div v-if="!scope.row.file_dpi || scope.row.file_dpi === 'null'"> - </div>
<div v-else> {{ scope.row.file_dpi }} </div>
</template>
</el-table-column> -->
<el-table-column prop="file_thumbnail" label="缩略图" min-width="60" align="center">
<template slot-scope="scope">
<div :class="getFileIconClass(scope.row.file_type)">
<i class="fileIcon" :class="getFileIconClass(scope.row.file_type)" />
</div>
</template>
</el-table-column>
<el-table-column label="操作" min-width="80" align="center">
<template slot-scope="scope">
<div class="handle-btn">
<el-button class="iconfont icon-sulan" @click="toPreview(scope.row)" />
<!-- <el-button class="iconfont icon-xiazai" @click="downloadFile(scope.row)" /> -->
<!-- <el-button class="iconfont icon-dayin" /> -->
</div>
</template>
</el-table-column>
</el-table>
</div>
<!-- 元数据 -->
<div v-if="archivesTabIndex==2" class="metadata-cont item-content">
<pre v-highlightjs="xml_show">
<code class="highlight_s">
{[xml_show]}
</code>
</pre>
</div>
<!-- 点击缩略图看大图 -->
<el-dialog class="preview-dialog" :append-to-body="true" :close-on-click-modal="false" :before-close="handleClose" :visible="showCoverVisible" title="查看大图">
<span class="dialog-right-top" />
<span class="dialog-left-bottom" />
<div class="setting-dialog" style="max-height:calc(100vh - 230px); overflow:auto;">
<img style="max-width:100%; object-fit: contain;" :src="previewSrc" :onerror="defaultImg">
</div>
</el-dialog>
</div>
</div>
</el-dialog>
</template>
<script>
import { form } from '@crud/crud'
import { FetchArchivesDetails, FetchFileListByDocumentId, FetchArchivesMetadata } from '@/api/prearchiveLibrary/prearchiveLibrary'
import { mapGetters } from 'vuex'
import { downloadFile } from '@/utils/index'
import { getToken } from '@/utils/auth'
export default {
name: 'PrearchiveLibraryDetail',
components: { },
mixins: [
form({})
],
props: {
selectedDocument: {
type: Object,
default: function() {
return {}
}
}
},
data() {
return {
defaultImg: 'this.src="' + require('@/assets/images/cover-bg.png') + '"',
archivesInfoVisible: false,
archivesTabIndex: 0,
archivesDetailsData: [],
archivesDetailsMetadata: [],
xml_show: null,
selections: [],
tableData: [],
showCoverVisible: false,
previewSrc: '', // 查看大图src
parentInfo: null
}
},
computed: {
...mapGetters([
'baseApi'
])
},
created() {
},
mounted() {
},
methods: {
getFileIconClass(fileType) {
if (!fileType) return 'icon-other'
const lowerFileType = fileType.toLowerCase()
switch (lowerFileType) {
case 'jpg':
case 'jpeg':
case 'png':
case 'bmp':
case 'gif':
return 'icon-image'
case 'xlsx':
case 'xls':
return 'icon-excel'
case 'docx':
case 'doc':
return 'icon-word'
case 'pdf':
return 'icon-pdf'
case 'ppt':
case 'pptx':
return 'icon-ppt'
case 'zip':
case 'rar':
return 'icon-zip'
case 'txt':
return 'icon-txt'
case 'ofd':
return 'icon-ofd'
// 其他未匹配的文件类型
default:
return 'icon-other'
}
},
downloadFile(row) {
// filePath 保存的文件路径
// bucketType 1预归档 2档案
const url = this.baseApi + '/api/minioUpload/getFile?filePath=' + row.file_path + '&bucketType=1'
const fetchOptions = {
method: 'GET',
headers: {
'Authorization': getToken()
}
}
fetch(url, fetchOptions).then(res => res.blob()).then(blob => {
downloadFile(blob, row.file_name.split('.')[0], row.file_type)
}).catch(() => {
this.$message({ message: '下载文件失败', type: 'error', offset: 8 })
})
},
toPreview(row) {
const routeData = this.$router.resolve({
path: '/preview',
query: {
'archiveNo': this.parentInfo.maintitle
}})
window.open(routeData.href, '_blank')
localStorage.setItem('documentId', JSON.stringify(this.selectedDocument.id))
localStorage.setItem('fileParentInfo', JSON.stringify(this.parentInfo))
localStorage.setItem('fileTables', JSON.stringify(this.tableData))
localStorage.setItem('fileCurrent', JSON.stringify(row))
},
getFileSize(fileSize) {
// 1. 先将接口返回的KB值转为数字,处理非数字/空值情况
const sizeInKB = Number(fileSize)
if (isNaN(sizeInKB) || sizeInKB < 0) {
return '0 KB' // 异常值默认显示0 KB
}
// 2. 定义单位换算关系(1 MB = 1024 KB,1 GB = 1024 MB)
const KB = 1
const MB = 1024 * KB
const GB = 1024 * MB
// 3. 根据大小自动选择单位并格式化
if (sizeInKB >= GB) {
// 大于等于1GB,显示GB(保留2位小数)
return (sizeInKB / GB).toFixed(2) + ' GB'
} else if (sizeInKB >= MB) {
// 大于等于1MB且小于1GB,显示MB(保留2位小数)
return (sizeInKB / MB).toFixed(2) + ' MB'
} else if (sizeInKB < 1) {
// 不足1KB,统一显示1 KB(保持你之前的需求)
return '1 KB'
} else {
// 1KB到1MB之间,显示KB(保留2位小数)
return sizeInKB + ' KB'
}
},
getDetial(rowId) {
const params = {
documentId: this.selectedDocument.id,
archivesId: rowId
}
FetchArchivesDetails(params).then(data => {
this.archivesDetailsData = data
})
FetchFileListByDocumentId(params).then(data => {
this.tableData = data.returnlist
})
FetchArchivesMetadata(params).then(data => {
this.archivesDetailsMetadata = data
})
},
changeActiveTab(index) {
this.archivesTabIndex = index
if (this.archivesTabIndex === 2) {
this.setXml()
}
},
// table
clickRowHandler(row) {
this.$refs.table.toggleRowSelection(row)
},
// table
selectionChangeHandler(val) {
this.selections = val
},
// dialog - close
handleClose(done) {
this.showCoverVisible = false
done()
},
// 查看大图
showCoverPreview(row) {
this.showCoverVisible = true
this.previewSrc = this.baseApi + '/downloadFile' + row.file_path
},
setXml() {
const xmlstr = this.archivesDetailsMetadata
this.xml_show = this.showXml(xmlstr)
},
// xml格式化
showXml(str) {
var that = this
var text = str
// 去掉多余的空格
text =
'\n' +
text
.replace(/(<\w+)(\s.*?>)/g, function($0, name, props) {
return name + ' ' + props.replace(/\s+(\w+=)/g, ' $1')
})
.replace(/>\s*?</g, '>\n<')
// 把注释编码
text = text
.replace(/\n/g, '\r')
.replace(/<!--(.+?)-->/g, function($0, text) {
var ret = '<!--' + escape(text) + '-->'
return ret
})
.replace(/\r/g, '\n')
// 调整格式
var rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/gm
var nodeStack = []
var output = text.replace(rgx, function(
$0,
all,
name,
isBegin,
isCloseFull1,
isCloseFull2,
isFull1,
isFull2
) {
var isClosed =
isCloseFull1 === '/' ||
isCloseFull2 === '/' ||
isFull1 === '/' ||
isFull2 === '/'
var prefix = ''
if (isBegin === '!') {
prefix = that.getPrefix(nodeStack.length)
} else {
if (isBegin !== '/') {
prefix = that.getPrefix(nodeStack.length)
if (!isClosed) {
nodeStack.push(name)
}
} else {
nodeStack.pop()
prefix = that.getPrefix(nodeStack.length)
}
}
var ret = '\n' + prefix + all
return ret
})
var outputText = output.substring(1)
// 把注释还原并解码,调格式
outputText = outputText
.replace(/\n/g, '\r')
.replace(/(\s*)<!--(.+?)-->/g, function($0, prefix, text) {
if (prefix.charAt(0) === '\r') prefix = prefix.substring(1)
text = unescape(text).replace(/\r/g, '\n')
var ret =
'\n' + prefix + '<!--' + text.replace(/^\s*/gm, prefix) + '-->'
return ret
})
outputText = outputText.replace(/\s+$/g, '').replace(/\r/g, '\r\n')
return outputText
},
getPrefix(prefixIndex) {
var span = ' '
var output = []
for (var i = 0; i < prefixIndex; ++i) {
output.push(span)
}
return output.join('')
}
}
}
</script>
<style lang="scss" scoped>
.base-info,
.metadata-cont{
background-color: #F6F8FC;
}
// 档案详情
.base-info{
padding: 20px 0;
overflow: hidden;
overflow-y: scroll;
.base-info-item{
display: flex;
flex-direction: row;
margin-bottom: 20px;
color: #545B65;
span{
display: block;
width: 160px;
font-weight: bold;
margin-right: 5px;
text-align: right;
color: #0C0E1E;
}
}
}
code.hljs {
font-size: 12px;
color: #0C0E1E !important;
height: 530px !important;
}
::v-deep .hljs-name{
color: #0C0E1E !important;
}
.base-info .base-info-item span.el-tag{
width: auto;
color: #fff;
}
.svg-style{
width: 60px;
height: 32px;
}
</style>