1303 lines
46 KiB
Vue
1303 lines
46 KiB
Vue
<template>
|
||
<div class="auditDocument">
|
||
<el-row>
|
||
<el-col :span="12">
|
||
<h3>{{ isManage ? $t('trials:tab:updateAuditDocument') : $t('trials:tab:viewAuditDocument') }}</h3>
|
||
</el-col>
|
||
<el-col :span="12" style="text-align:right;">
|
||
<h3>
|
||
<Pagination class="page" :total="total" :page.sync="searchData.pageIndex"
|
||
:limit.sync="searchData.pageSize" layout="total, sizes, prev, pager, next" :background="false"
|
||
style="display: inline-block;" @pagination="getList" />
|
||
<el-button icon="el-icon-refresh-left" size="small" circle :title="$t('common:button:reset')"
|
||
@click="handleReset" />
|
||
</h3>
|
||
</el-col>
|
||
</el-row>
|
||
<el-form :inline="true" class="base-search-form">
|
||
<el-form-item>
|
||
<el-input v-model="searchData.Name" clearable
|
||
:placeholder="$t('trials:trials-workbench:auditDocument:placeholder:search')"></el-input>
|
||
</el-form-item>
|
||
<el-form-item>
|
||
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
|
||
{{ $t('common:button:search') }}
|
||
</el-button>
|
||
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
|
||
{{ $t('common:button:reset') }}
|
||
</el-button>
|
||
</el-form-item>
|
||
<el-form-item v-if="isManage">
|
||
<el-button type="primary" @click.stop="addFolder">
|
||
{{ $t('trials:trials-workbench:auditDocument:button:addFolder') }}
|
||
</el-button>
|
||
<el-button type="primary" @click.stop="openFile(false)">
|
||
{{ $t('trials:trials-workbench:auditDocument:button:uploadFile') }}
|
||
</el-button>
|
||
<el-button type="primary" @click.stop="openFile(true)">
|
||
{{ $t('trials:trials-workbench:auditDocument:button:uploadFolder') }}
|
||
</el-button>
|
||
<el-button type="primary" :disabled="checkList.length <= 0" @click.stop="auth(true)">
|
||
{{ $t('trials:trials-workbench:auditDocument:button:auth') }}
|
||
</el-button>
|
||
<el-button type="primary" :disabled="checkList.length <= 0" @click.stop="downLoad(checkList)">
|
||
{{ $t('trials:trials-workbench:auditDocument:button:download') }}
|
||
</el-button>
|
||
<el-button type="primary" :disabled="checkList.length <= 0" @click.stop="delData(checkList)">
|
||
{{ $t('trials:trials-workbench:auditDocument:button:del') }}
|
||
</el-button>
|
||
</el-form-item>
|
||
</el-form>
|
||
<div class="catalogue">
|
||
<span>{{ $t('trials:trials-workbench:auditDocument:catalogue:title') }}</span>
|
||
<el-button icon="el-icon-top" class="last_catalogue" :disabled="!Id" @click.stop="toCatalogue(false)"
|
||
:title="$t('trials:trials-workbench:auditDocument:catalogue:lastCatalogue')"></el-button>
|
||
<el-breadcrumb separator-class="el-icon-arrow-right" class="catalogue_name_box">
|
||
<el-breadcrumb-item v-for="item of catalogueData" :key="item.Id">
|
||
<span class="catalogue_name" @click.stop="toCatalogue(item)">{{ item.Name }}</span>
|
||
</el-breadcrumb-item>
|
||
</el-breadcrumb>
|
||
</div>
|
||
<el-table id="auditDocumentTable" ref="auditDocumentTable" :data="tableData" style="width: 99%" row-key="Id"
|
||
:loading="loading" :row-style="setRowStyle" v-adaptive="{ bottomOffset: 75 }" height="100" :border="true"
|
||
:expand-row-keys="expandedRows" :tree-props="{ children: 'Children', hasChildren: 'hasChildren' }"
|
||
@expand-change="handleExpandChange" @row-click="handleRowClick" @cell-mouse-enter="handleCellMouseEnter"
|
||
@cell-mouse-leave="handleCellMouseLeave" @row-contextmenu="handleRowContextmenu"
|
||
@row-dblclick="handleRowDblclick">
|
||
<el-table-column prop="date" :label="$t('trials:trials-workbench:auditDocument:table:name')" sortable
|
||
min-width="300" class-name="catalogue_box">
|
||
<template slot-scope="scope">
|
||
<div class="name_layout_box">
|
||
<div class="name_layout" v-if="renameId !== scope.row.Id">
|
||
<span class="name_box">
|
||
<i class="icon icon_folder" v-if="!scope.row.AuditDocumentTypeEnum" />
|
||
<img v-else-if="['png', 'jpg', 'jpeg'].includes(scope.row.FileFormat.toLowerCase())"
|
||
:src="OSSclientConfig.basePath + scope.row.FilePath" alt="" class="icon_image">
|
||
<i v-else :class="`icon icon_file icon_${scope.row.FileFormat}`" />
|
||
<span class="name" :title="scope.row.Name">{{ scope.row.Name }}</span>
|
||
<i class="el-icon-edit icon_edit" v-if="(hoverId === scope.row.Id) && isManage"
|
||
@click="addRenameId(scope.row)"
|
||
:title="$t('trials:trials-workbench:auditDocument:icon:rename')" />
|
||
</span>
|
||
<i :class="{ 'el-icon-circle-check': true, 'icon_check': true, isCheck: checkList.includes(scope.row.Id) }"
|
||
@click.stop="addCheck(scope.row)"
|
||
v-if="(hoverId === scope.row.Id || checkList.includes(scope.row.Id)) && isManage" />
|
||
</div>
|
||
<el-input v-model="scope.row.Name" :ref="`renameInp_${scope.row.Id}`" :autofocus="true"
|
||
class="renameInp" @blur="rename(scope.row)" v-else />
|
||
</div>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="FileFormat" :label="$t('trials:trials-workbench:auditDocument:table:fileType')">
|
||
<template slot-scope="scope">
|
||
<span>{{ formatFileType(scope.row) }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="FileSize" :label="$t('trials:trials-workbench:auditDocument:table:fileSize')">
|
||
<template slot-scope="scope">
|
||
<span>{{ formatFileSize(scope.row) }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="IsAuthorization"
|
||
:label="$t('trials:trials-workbench:auditDocument:table:IsAuthorization')" show-overflow-tooltip
|
||
sortable="custom" v-if="isManage">
|
||
<template slot-scope="scope">
|
||
<el-switch v-model="scope.row.IsAuthorization" @change="(val) => auth(false, scope.row, val)"
|
||
:active-value="true" :inactive-value="false" :active-text="$fd('YesOrNo', true)"
|
||
:inactive-text="$fd('YesOrNo', false)">
|
||
</el-switch>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="UpdateTime" show-overflow-tooltip
|
||
:label="$t('trials:trials-workbench:auditDocument:table:updateTime')">
|
||
</el-table-column>
|
||
<el-table-column prop="CreateTime" show-overflow-tooltip
|
||
:label="$t('trials:trials-workbench:auditDocument:table:createTime')">
|
||
</el-table-column>
|
||
</el-table>
|
||
<contextmenu ref="contextmenu" :isCopy="isCopy" :checkList="checkList" @handleMenu="handleMenu" />
|
||
<upload-files :config="config" :faccept="faccept" :uploadPath="uploadPath" :limitLength="limitLength"
|
||
v-if="config.visible" @close="close" @uplaodFile="uplaodFile" />
|
||
<detail ref="versionDetail" v-if="visible" :visible.sync="visible" :rowData="rowData"
|
||
@openContextmenu="openContextmenu" @openFileNewVersion="openFileNewVersion" @delData="delData" />
|
||
<viewer ref="picture_perview" style="margin: 0 10px"
|
||
v-if="rowData.FileFormat && ['png', 'jpg', 'jpeg'].includes(rowData.FileFormat.toLowerCase())"
|
||
:images="[`${OSSclientConfig.basePath}${rowData.FilePath}`]">
|
||
|
||
<img v-show="false" crossorigin="anonymous" :src="`${OSSclientConfig.basePath}${rowData.FilePath}`"
|
||
alt="Image" />
|
||
</viewer>
|
||
</div>
|
||
</template>
|
||
<script>
|
||
import { getAuditDocumentData, addAuditDocument, getBreadcrumbData, updateAuditDocument, deleteAuditDocument, setCurrentVersion, movieFileOrFolder, copyFileOrFolder, setIsAuthorization } from '@/api/trials'
|
||
import Pagination from '@/components/Pagination'
|
||
import contextmenu from './contextmenu.vue'
|
||
import uploadFiles from '@/views/trials/trials-panel/trial-summary/trial-document/components/uploadFiles.vue'
|
||
import detail from './detail.vue'
|
||
import { downLoadFile } from '@/utils/stream.js'
|
||
const searchDataDefault = () => {
|
||
return {
|
||
Name: null,
|
||
pageIndex: 1,
|
||
pageSize: 20,
|
||
asc: false,
|
||
sortField: ''
|
||
}
|
||
}
|
||
export default {
|
||
name: "auditDocument",
|
||
components: { Pagination, contextmenu, uploadFiles, detail },
|
||
props: {
|
||
isManage: {
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
},
|
||
computed: {
|
||
isCopy() {
|
||
return (this.copyList && this.copyList.length > 0) || this.shearList && this.shearList.length > 0
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
searchData: searchDataDefault(),
|
||
total: 0,
|
||
Id: null,
|
||
loading: false,
|
||
expandedRows: [],
|
||
tableData: [],
|
||
catalogueData: [], // 目录层级
|
||
|
||
visible: false, // 属性详情弹框
|
||
rowData: {}, // 属性详情数据
|
||
|
||
config: {
|
||
visible: false,
|
||
showClose: true,
|
||
width: '800px',
|
||
title: '',
|
||
appendToBody: false,
|
||
isFolder: false,
|
||
isVersion: false
|
||
},
|
||
uploadPath: '/System/AuditDocument',
|
||
faccept: ['.pdf'],
|
||
limitLength: 0,
|
||
|
||
checkList: [], // 选中的数据
|
||
hoverId: null, // hover中的数据
|
||
renameId: null, // 选中重命名的数据
|
||
|
||
copyList: [], // 选中复制的数据
|
||
shearList: [], // 选中剪切的数据
|
||
type: null, // 操作类型(右键菜单、键盘操作)
|
||
|
||
ctrlKey: false, // 键盘ctrl键是否按下
|
||
}
|
||
},
|
||
watch: {
|
||
isManage() {
|
||
this.Id = null;
|
||
this.resetOpt()
|
||
this.getBreadcrumbData()
|
||
this.getList()
|
||
}
|
||
},
|
||
methods: {
|
||
async auth(isArray = true, row, IsAuthorization) {
|
||
if (!this.isManage) return false
|
||
try {
|
||
let data = {}
|
||
if (isArray) {
|
||
data = {
|
||
Ids: this.checkList,
|
||
IsAuthorization: true,
|
||
}
|
||
} else {
|
||
data = {
|
||
Ids: [row.Id],
|
||
IsAuthorization,
|
||
}
|
||
}
|
||
this.loading = true
|
||
let res = await setIsAuthorization(data)
|
||
this.loading = false
|
||
if (res.IsSuccess) {
|
||
this.$t('trials:trials-workbench:auditDocument:message:authSuccessfully')
|
||
if (isArray) {
|
||
this.getList()
|
||
}
|
||
}
|
||
} catch (err) {
|
||
this.loading = false
|
||
if (!isArray) {
|
||
row.IsAuthorizedView = !row.IsAuthorizedView
|
||
}
|
||
console.log(err)
|
||
}
|
||
},
|
||
// 新建文件夹
|
||
addFolder() {
|
||
if (!this.isManage) return false
|
||
let parentData = {}, data = {
|
||
ParentId: null,
|
||
repeat: 0,
|
||
Type: "addFolder",
|
||
Name: this.$t("trials:trials-workbench:auditDocument:opt:addFloder"),
|
||
IsAuthorization: false,
|
||
AuditDocumentTypeEnum: 0,
|
||
Id: `addFolder_${Date.now()}`,
|
||
Children: []
|
||
}
|
||
if (!this.rowData || !this.rowData.Id) {
|
||
data.ParentId = this.Id
|
||
this.tableData.forEach(item => {
|
||
if (item.Name === data.Name) {
|
||
data.repeat++;
|
||
data.Name = `${this.$t("trials:trials-workbench:auditDocument:opt:addFloder")}(${data.repeat})`
|
||
}
|
||
})
|
||
this.tableData.unshift(data)
|
||
this.addRenameId(data)
|
||
} else {
|
||
if (!this.rowData.AuditDocumentTypeEnum) {
|
||
parentData = this.getData(this.tableData, this.rowData.Id)
|
||
data.ParentId = parentData.Id
|
||
parentData.Children.forEach(item => {
|
||
if (item.Name === data.Name) {
|
||
data.repeat++;
|
||
data.Name = `${this.$t("trials:trials-workbench:auditDocument:opt:addFloder")}(${data.repeat})`
|
||
}
|
||
})
|
||
if (!this.expandedRows.includes(parentData.Id)) {
|
||
this.expandedRows.push(parentData.Id)
|
||
this.$refs.auditDocumentTable.toggleRowExpansion(parentData, true)
|
||
}
|
||
parentData.Children.unshift(data)
|
||
this.addRenameId(data)
|
||
} else {
|
||
let fileData = this.getData(this.tableData, this.rowData.Id)
|
||
if (fileData.ParentId === this.Id) {
|
||
data.ParentId = this.Id
|
||
this.tableData.forEach(item => {
|
||
if (item.Name === data.Name) {
|
||
data.repeat++;
|
||
data.Name = `${this.$t("trials:trials-workbench:auditDocument:opt:addFloder")}(${data.repeat})`
|
||
}
|
||
})
|
||
this.tableData.unshift(data)
|
||
this.addRenameId(data)
|
||
} else {
|
||
parentData = this.getData(this.tableData, this.fileData.ParentId)
|
||
data.ParentId = parentData.Id
|
||
parentData.Children.forEach(item => {
|
||
if (item.Name === data.Name) {
|
||
data.repeat++;
|
||
data.Name = `${this.$t("trials:trials-workbench:auditDocument:opt:addFloder")}(${data.repeat})`
|
||
}
|
||
})
|
||
parentData.Children.unshift(data)
|
||
this.addRenameId(data)
|
||
}
|
||
}
|
||
}
|
||
},
|
||
// 获取当前目录层级
|
||
async getBreadcrumbData() {
|
||
if (!this.Id) return this.catalogueData = []
|
||
try {
|
||
let data = {
|
||
Id: this.Id
|
||
}
|
||
let res = await getBreadcrumbData(data)
|
||
if (res.IsSuccess) {
|
||
this.catalogueData = res.Result
|
||
}
|
||
} catch (err) { console.log(err) }
|
||
},
|
||
async getList(id) {
|
||
try {
|
||
this.searchData.Id = this.Id
|
||
this.loading = true
|
||
if (!this.isManage) {
|
||
this.searchData.IsAuthorization = true
|
||
} else {
|
||
this.searchData.IsAuthorization = null
|
||
}
|
||
let res = await getAuditDocumentData(this.searchData)
|
||
this.loading = false
|
||
if (res.IsSuccess) {
|
||
this.tableData = res.Result.CurrentPageData
|
||
this.total = res.Result.TotalCount
|
||
if (this.$refs.versionDetail) {
|
||
this.checkList = [id]
|
||
this.rowData = this.getData(this.tableData, id)
|
||
}
|
||
}
|
||
} catch (err) {
|
||
this.loading = false
|
||
console.log(err)
|
||
}
|
||
},
|
||
// 下载
|
||
async downLoad(list) {
|
||
if (!this.isManage) return false
|
||
try {
|
||
let arr = this.filterExternalIds(this.tableData, list)
|
||
if (arr && arr.length === 1) {
|
||
let data = this.getData(this.tableData, arr[0])
|
||
if (data.AuditDocumentTypeEnum) {
|
||
return await downLoadFile(
|
||
this.OSSclientConfig.basePath + data.FilePath,
|
||
data.Name
|
||
)
|
||
} else {
|
||
let dataArray = this.getDataPath([data])
|
||
let files = this.formatDownloadFile(dataArray)
|
||
console.log(files, 'files')
|
||
let name = `${data.Name}_${new Date().getTime()}.zip`
|
||
return await downLoadFile(files, name, 'zip')
|
||
}
|
||
} else {
|
||
let name = null
|
||
let id = this.findDeepestCommonParent(this.tableData, arr)
|
||
if (id) {
|
||
let d = this.getData(this.tableData, id)
|
||
name = `${d.Name}_${new Date().getTime()}.zip`
|
||
} else {
|
||
name = `AuditDocument_${new Date().getTime()}.zip`
|
||
}
|
||
let data = arr.map(id => this.getData(this.tableData, id))
|
||
let dataArray = this.getDataPath(data)
|
||
let files = this.formatDownloadFile(dataArray)
|
||
return await downLoadFile(files, name, 'zip')
|
||
}
|
||
} catch (err) {
|
||
console.log(err)
|
||
}
|
||
},
|
||
formatDownloadFile(list) {
|
||
let files = []
|
||
for (const item of list) {
|
||
let obj = {
|
||
name: item.Name.split('.')[1] ? item.Path : `${item.Path}.${item.FileFormat}`,
|
||
url: this.OSSclientConfig.basePath + item.FilePath
|
||
}
|
||
files.push(obj)
|
||
}
|
||
return files
|
||
},
|
||
findDeepestCommonParent(rootNodes, ids) {
|
||
// 构建节点ID到节点的映射
|
||
const nodeMap = new Map();
|
||
function buildMap(nodes) {
|
||
for (const node of nodes) {
|
||
nodeMap.set(node.Id, node);
|
||
if (node.Children && node.Children.length > 0) {
|
||
buildMap(node.Children);
|
||
}
|
||
}
|
||
}
|
||
buildMap(rootNodes);
|
||
|
||
// 生成每个ID的路径数组(从根到当前节点)
|
||
const paths = [];
|
||
for (const id of ids) {
|
||
const path = [];
|
||
let currentNode = nodeMap.get(id);
|
||
if (!currentNode) continue; // 忽略无效ID
|
||
|
||
// 向上遍历直到根节点
|
||
while (currentNode) {
|
||
path.unshift(currentNode.Id); // 插入到前面以形成根到当前路径
|
||
const parentId = currentNode.ParentId;
|
||
if (parentId === null) break; // 根节点无父节点
|
||
currentNode = nodeMap.get(parentId);
|
||
}
|
||
paths.push(path);
|
||
}
|
||
|
||
if (paths.length === 0) return null; // 无有效ID
|
||
|
||
// 寻找最长公共前缀
|
||
const findLongestCommonPrefix = (paths) => {
|
||
if (paths.length === 0) return [];
|
||
let common = paths[0];
|
||
for (let i = 1; i < paths.length; i++) {
|
||
const currentPath = paths[i];
|
||
let j = 0;
|
||
while (j < common.length && j < currentPath.length && common[j] === currentPath[j]) {
|
||
j++;
|
||
}
|
||
common = common.slice(0, j);
|
||
if (common.length === 0) break;
|
||
}
|
||
return common;
|
||
};
|
||
|
||
const lcp = findLongestCommonPrefix(paths);
|
||
return lcp.length > 0 ? lcp[lcp.length - 1] : null;
|
||
},
|
||
getDataPath(list, str = '', ARRAY = []) {
|
||
for (const item of list) {
|
||
console.log(item.AuditDocumentTypeEnum, str)
|
||
if (!str) {
|
||
item.Path = item.Name
|
||
} else {
|
||
item.Path = str + '/' + item.Name
|
||
}
|
||
if (item.AuditDocumentTypeEnum) {
|
||
ARRAY.push(item)
|
||
continue
|
||
} else {
|
||
if (item.Children && item.Children.length > 0) {
|
||
this.getDataPath(item.Children, item.Path, ARRAY)
|
||
}
|
||
}
|
||
}
|
||
return ARRAY
|
||
},
|
||
getData(list, Id, data = {}) {
|
||
for (const item of list) {
|
||
if (item.Id === Id) {
|
||
data = item
|
||
break
|
||
} else {
|
||
if (item.Children && item.Children.length > 0) {
|
||
data = this.getData(item.Children, Id, data)
|
||
}
|
||
}
|
||
|
||
}
|
||
return data
|
||
},
|
||
filterExternalIds(tree, ids) {
|
||
if (!tree || tree.length === 0 || !ids || ids.length === 0) return [];
|
||
const parentMap = this.buildParentMap(tree);
|
||
const idSet = new Set(ids);
|
||
const externalIds = new Set();
|
||
|
||
for (const id of ids) {
|
||
let currentId = parentMap.get(id);
|
||
while (currentId !== null) {
|
||
if (idSet.has(currentId)) {
|
||
externalIds.add(currentId);
|
||
}
|
||
currentId = parentMap.get(currentId);
|
||
}
|
||
}
|
||
|
||
return ids.filter(id => !externalIds.has(id));
|
||
},
|
||
buildParentMap(tree) {
|
||
const parentMap = new Map();
|
||
const traverse = (node, parentId) => {
|
||
parentMap.set(node.Id, parentId);
|
||
for (const child of node.Children) {
|
||
traverse(child, node.Id);
|
||
}
|
||
};
|
||
for (const root of tree) {
|
||
traverse(root, null);
|
||
}
|
||
return parentMap;
|
||
},
|
||
handleSearch() {
|
||
this.getList()
|
||
},
|
||
handleReset() {
|
||
this.searchData = searchDataDefault()
|
||
this.getList()
|
||
},
|
||
addCheck(row) {
|
||
if (!this.isManage) return false
|
||
let index = this.checkList.indexOf(row.Id)
|
||
if (!!~index) {
|
||
this.checkList.splice(index, 1)
|
||
} else {
|
||
this.checkList.push(row.Id)
|
||
}
|
||
|
||
},
|
||
addRenameId(row) {
|
||
if (!this.isManage) return false
|
||
this.renameId = row.Id
|
||
this.$nextTick(() => {
|
||
if (this.$refs[`renameInp_${row.Id}`]) {
|
||
this.$refs[`renameInp_${row.Id}`].focus()
|
||
}
|
||
})
|
||
},
|
||
async rename(row) {
|
||
if (!this.isManage) return false
|
||
try {
|
||
this.renameId = null
|
||
if (row.Type === 'addFolder') {
|
||
delete row.Id
|
||
let data = [row]
|
||
let res = await addAuditDocument(JSON.stringify(data))
|
||
if (res.IsSuccess) {
|
||
this.getList()
|
||
}
|
||
} else {
|
||
this.updateData(row)
|
||
}
|
||
} catch (err) {
|
||
console.log(rtt)
|
||
}
|
||
|
||
},
|
||
handleExpandChange(row, expanded) {
|
||
if (expanded && !this.expandedRows.find(Id => Id === row.Id)) {
|
||
this.expandedRows.push(row.Id)
|
||
}
|
||
if (!expanded) {
|
||
let index = this.expandedRows.indexOf(row.Id)
|
||
if (!!~index) {
|
||
this.expandedRows.splice(index, 1)
|
||
}
|
||
}
|
||
},
|
||
// 重置所有操作
|
||
resetOpt() {
|
||
this.expandedRows = []
|
||
this.checkList = []
|
||
this.hoverId = null
|
||
this.renameId = null
|
||
this.copyList = []
|
||
this.shearList = []
|
||
this.rowData = {}
|
||
},
|
||
// 跳转至目录
|
||
toCatalogue(row) {
|
||
if (!row) {
|
||
let data = this.catalogueData[this.catalogueData.length - 2]
|
||
if (data) {
|
||
return this.toCatalogue(data)
|
||
} else {
|
||
row = {}
|
||
}
|
||
|
||
}
|
||
this.Id = row.Id
|
||
this.resetOpt()
|
||
this.getList()
|
||
this.getBreadcrumbData()
|
||
},
|
||
// 设置当前版本
|
||
async setCurrentVersion(Id) {
|
||
if (!this.isManage) return false
|
||
try {
|
||
let data = {
|
||
Id
|
||
}
|
||
let res = await setCurrentVersion(data)
|
||
if (res.IsSuccess) {
|
||
this.getList(Id)
|
||
}
|
||
} catch (err) {
|
||
console.log(err)
|
||
}
|
||
},
|
||
// 复制数据
|
||
async copyData(list) {
|
||
if (!this.isManage) return false
|
||
try {
|
||
let DATA = this.getData(this.tableData, this.checkList[0])
|
||
let Ids = this.filterExternalIds(this.tableData, list)
|
||
let data = {
|
||
Ids: Ids,
|
||
ParentId: DATA.AuditDocumentTypeEnum ? DATA.ParentId : DATA.Id
|
||
}
|
||
let res = await copyFileOrFolder(data)
|
||
if (res.IsSuccess) {
|
||
this.getList()
|
||
this.copyList = []
|
||
}
|
||
} catch (err) {
|
||
console.log(err)
|
||
}
|
||
},
|
||
// 移动数据
|
||
async moveData(list) {
|
||
if (!this.isManage) return false
|
||
try {
|
||
let DATA = this.getData(this.tableData, this.checkList[0])
|
||
let Ids = this.filterExternalIds(this.tableData, list)
|
||
let data = {
|
||
Ids: Ids,
|
||
ParentId: DATA.AuditDocumentTypeEnum ? DATA.ParentId : DATA.Id
|
||
}
|
||
let res = await movieFileOrFolder(data)
|
||
if (res.IsSuccess) {
|
||
this.getList()
|
||
this.shearList = []
|
||
}
|
||
} catch (err) {
|
||
console.log(err)
|
||
}
|
||
},
|
||
// 删除数据
|
||
async delData(Ids) {
|
||
if (!this.isManage) return false
|
||
try {
|
||
let data = { Ids }
|
||
let res = await deleteAuditDocument(data)
|
||
if (res.IsSuccess) {
|
||
this.checkList = []
|
||
this.rowData = {}
|
||
this.getList(this.rowData.Id)
|
||
if (this.$refs.versionDetail) {
|
||
// this.$refs.versionDetail.getHistoricalVersion()
|
||
this.checkList = [this.rowData.Id]
|
||
}
|
||
}
|
||
} catch (err) {
|
||
console.log(err)
|
||
}
|
||
},
|
||
// 修改数据
|
||
async updateData(row) {
|
||
if (!this.isManage) return false
|
||
try {
|
||
let data = {
|
||
AuditDocumentTypeEnum: row.AuditDocumentTypeEnum,
|
||
FileFormat: row.FileFormat,
|
||
FilePath: row.FilePath,
|
||
FileSize: row.FileSize,
|
||
Id: row.Id,
|
||
IsAuthorization: row.IsAuthorization,
|
||
Name: row.Name,
|
||
ParentId: row.ParentId
|
||
|
||
}
|
||
let res = await updateAuditDocument(data);
|
||
} catch (err) {
|
||
this.getList()
|
||
console.log(err)
|
||
}
|
||
},
|
||
// 新增列表数据
|
||
async uplaodFile(list) {
|
||
if (!this.isManage) return false
|
||
console.log(list, 'list')
|
||
let data = []
|
||
if (this.config.isVersion) {
|
||
data.push({
|
||
ParentId: this.rowData.ParentId,
|
||
Name: this.rowData.Name,
|
||
IsAuthorization: this.rowData.IsAuthorization,
|
||
FileSize: list[0].FileSize,
|
||
filePath: list[0].FilePath,
|
||
FileFormat: list[0].FileFormat,
|
||
AuditDocumentTypeEnum: 1
|
||
})
|
||
} else {
|
||
data = this.formatData(list)
|
||
let ParentId = this.Id
|
||
if (this.rowData && this.rowData.Id) {
|
||
if (this.rowData.AuditDocumentTypeEnum) {
|
||
ParentId = this.rowData.ParentId
|
||
} else {
|
||
ParentId = this.rowData.Id
|
||
}
|
||
}
|
||
data.forEach(item => {
|
||
item.ParentId = ParentId
|
||
})
|
||
}
|
||
try {
|
||
let res = await addAuditDocument(JSON.stringify(data))
|
||
if (res.IsSuccess) {
|
||
let id = res.Result ? res.Result[0] : null
|
||
this.getList(id)
|
||
// if (this.$refs.versionDetail) {
|
||
// this.$refs.versionDetail.getHistoricalVersion()
|
||
// }
|
||
}
|
||
} catch (err) {
|
||
console.log(err)
|
||
}
|
||
},
|
||
// 格式化上传数据
|
||
formatData(arr) {
|
||
let list = [], strObj = {}
|
||
arr.forEach(item => {
|
||
if (item.catalogue) {
|
||
let catalogueStr = item.catalogue.split("/")
|
||
catalogueStr.pop()
|
||
let obj = {}, strKey = []
|
||
catalogueStr.forEach((str, index) => {
|
||
strKey.forEach((key, i) => {
|
||
if (i === 0) {
|
||
obj = strObj[key]
|
||
} else {
|
||
obj = obj[key]
|
||
}
|
||
|
||
})
|
||
if (index === 0) {
|
||
if (!strObj[str]) {
|
||
strObj[str] = {
|
||
children: []
|
||
}
|
||
}
|
||
} else {
|
||
if (!obj[str]) {
|
||
obj[str] = {
|
||
children: []
|
||
}
|
||
}
|
||
}
|
||
obj = obj[str] || strObj[str]
|
||
strKey.push(str)
|
||
|
||
})
|
||
console.log(obj, 'obj')
|
||
obj.children.push({
|
||
ParentId: null,
|
||
Name: item.FileName,
|
||
IsAuthorization: false,
|
||
FileSize: item.FileSize,
|
||
filePath: item.FilePath,
|
||
FileFormat: item.FileFormat,
|
||
AuditDocumentTypeEnum: 1
|
||
})
|
||
} else {
|
||
list.push({
|
||
ParentId: null,
|
||
Name: item.FileName,
|
||
IsAuthorization: false,
|
||
FileSize: item.FileSize,
|
||
filePath: item.FilePath,
|
||
FileFormat: item.FileFormat,
|
||
AuditDocumentTypeEnum: 1
|
||
})
|
||
}
|
||
})
|
||
let ARRAY = this.objToArr(strObj)
|
||
list = list.concat(ARRAY)
|
||
return list
|
||
},
|
||
objToArr(obj, list = []) {
|
||
Object.keys(obj).forEach(key => {
|
||
if (key !== 'children') {
|
||
let item = list.find(d => d.Name === key)
|
||
if (!item) {
|
||
let data = {
|
||
ParentId: null,
|
||
Name: key,
|
||
IsAuthorization: false,
|
||
AuditDocumentTypeEnum: 0,
|
||
children: obj[key].children
|
||
}
|
||
list.push(data)
|
||
}
|
||
this.objToArr(obj[key], obj[key].children)
|
||
}
|
||
|
||
})
|
||
return list;
|
||
},
|
||
// 格式化文件类型
|
||
formatFileType(row) {
|
||
if (!row.AuditDocumentTypeEnum) {
|
||
return this.$t('trials:trials-workbench:auditDocument:fileType:folder')
|
||
} else {
|
||
return row.FileFormat
|
||
// return `${row.FileFormat}${this.$t('trials:trials-workbench:auditDocument:fileType:file')}`
|
||
}
|
||
},
|
||
// 格式化文件大小
|
||
formatFileSize(row) {
|
||
if (!row.FileSize) return ''
|
||
if (row.FileSize < 1000) {
|
||
return row.FileSize + "B"
|
||
}
|
||
if (row.FileSize < 1000 * 1024) {
|
||
return (row.FileSize / 1024).toFixed(2) + "KB"
|
||
}
|
||
if (row.FileSize < 1000 * 1000 * 1024) {
|
||
return (row.FileSize / 1000 / 1024).toFixed(2) + "MB"
|
||
}
|
||
if (row.FileSize < 1000 * 1000 * 1000 * 1024) {
|
||
return (row.FileSize / 1000 / 1000 / 1024).toFixed(2) + "GB"
|
||
}
|
||
},
|
||
openFileNewVersion(faccept) {
|
||
if (!this.isManage) return false
|
||
this.faccept = [faccept]
|
||
this.limitLength = 1
|
||
this.config.title = this.$t(
|
||
'trials:trials-workbench:auditDocument:form:title:uploadFile'
|
||
)
|
||
this.config.visible = true
|
||
this.config.isVersion = true
|
||
this.config.isFolder = false
|
||
},
|
||
openFile(isFolder = false) {
|
||
if (!this.isManage) return false
|
||
this.faccept = [
|
||
'.jpg',
|
||
'.jpeg',
|
||
'.png',
|
||
'.pdf',
|
||
'.ppt',
|
||
'.pptx',
|
||
'.zip',
|
||
'.doc',
|
||
'.docx',
|
||
'.xls',
|
||
'.xlsx',
|
||
]
|
||
this.limitLength = 0
|
||
this.config.title = this.$t(
|
||
'trials:trials-workbench:auditDocument:form:title:uploadFile'
|
||
)
|
||
this.config.visible = true
|
||
this.config.isVersion = false
|
||
this.config.isFolder = isFolder
|
||
},
|
||
close() {
|
||
this.config.visible = false
|
||
this.faccept = ['.pdf']
|
||
this.limitLength = 0
|
||
},
|
||
// 预览文件
|
||
perview(data) {
|
||
if (['.pdf',
|
||
'.ppt',
|
||
'.pptx',
|
||
'.doc',
|
||
'.docx',
|
||
'.xls',
|
||
'.xlsx'].includes(`.${data.FileFormat.toLowerCase()}`)) {
|
||
this.$onlyOffice({
|
||
path: data.FilePath,
|
||
type: data.FileFormat,
|
||
title: data.Name
|
||
})
|
||
}
|
||
if (['.jpg',
|
||
'.jpeg',
|
||
'.png'].includes(`.${data.FileFormat.toLowerCase()}`)) {
|
||
this.$refs['picture_perview'].$viewer.show()
|
||
}
|
||
|
||
},
|
||
// 版本记录(右键菜单)
|
||
openContextmenu(data) {
|
||
if (!this.isManage) return false
|
||
let { e, row, type, zIndex } = data
|
||
this.$refs.contextmenu.init(e, row, type, zIndex)
|
||
},
|
||
// 单行右键单击(右键菜单)
|
||
handleRowContextmenu(row, column, e) {
|
||
if (!this.isManage) return false
|
||
e.preventDefault();
|
||
if (!this.checkList.includes(row.Id)) this.handleRowClick(row, {}, e)
|
||
if (this.checkList.length > 1) return this.$refs.contextmenu.init(e, row, 'files')
|
||
if (!row.AuditDocumentTypeEnum) return this.$refs.contextmenu.init(e, row, 'folder')
|
||
this.$refs.contextmenu.init(e, row, 'file')
|
||
},
|
||
// 单行左键双击(进入文件夹或者预览文件)
|
||
handleRowDblclick(row) {
|
||
if (!row.AuditDocumentTypeEnum) {
|
||
this.Id = row.Id
|
||
this.resetOpt()
|
||
this.getList()
|
||
this.getBreadcrumbData()
|
||
} else {
|
||
this.perview(this.rowData)
|
||
}
|
||
},
|
||
// 单行左键单击
|
||
handleRowClick(row, column, e) {
|
||
e.stopPropagation();
|
||
this.rowData = row
|
||
// let index = this.checkList.indexOf(row.Id)
|
||
if (this.ctrlKey) {
|
||
this.checkList.push(row.Id)
|
||
} else {
|
||
this.checkList = [row.Id]
|
||
}
|
||
// if (this.ctrlKey) {
|
||
// if (!!~index) {
|
||
// this.checkList.splice(index, 1)
|
||
// } else {
|
||
// this.checkList.push(row.Id)
|
||
// }
|
||
// } else {
|
||
// if (this.checkList.length > 1 || this.checkList.length <= 0) {
|
||
// this.checkList = [row.Id]
|
||
// } else {
|
||
// if (!!~index) {
|
||
// this.checkList.splice(index, 1)
|
||
// } else {
|
||
// this.checkList = [row.Id]
|
||
// }
|
||
// }
|
||
|
||
// }
|
||
|
||
|
||
},
|
||
// 单行hover移入
|
||
handleCellMouseEnter(row) {
|
||
this.hoverId = row.Id
|
||
},
|
||
// 单行hover移出
|
||
handleCellMouseLeave() { this.hoverId = null },
|
||
// 右键菜单操作
|
||
handleMenu(data) {
|
||
if (!this.isManage) return false
|
||
let { key, row } = data
|
||
console.log(key, row)
|
||
this.type = key;
|
||
if (key === 'rename') {
|
||
// this.renameId = this.checkList[0]
|
||
this.addRenameId(row)
|
||
}
|
||
if (key === 'version') {
|
||
this.visible = true
|
||
}
|
||
if (key === 'open') {
|
||
if (!this.rowData.AuditDocumentTypeEnum) {
|
||
this.Id = this.rowData.Id
|
||
this.resetOpt()
|
||
this.getList()
|
||
this.getBreadcrumbData()
|
||
} else {
|
||
this.perview(this.rowData)
|
||
}
|
||
}
|
||
if (key === 'del') {
|
||
this.delData(this.checkList)
|
||
}
|
||
if (key === 'delVersion') {
|
||
this.delData([row.Id])
|
||
}
|
||
if (key === 'delAllVersion') {
|
||
if (this.$refs.versionDetail) {
|
||
this.$refs.versionDetail.delAll()
|
||
}
|
||
}
|
||
if (key === 'setVersion') {
|
||
this.setCurrentVersion(row.Id)
|
||
}
|
||
if (key === 'copy') {
|
||
this.copy()
|
||
}
|
||
if (key === 'shear') {
|
||
this.shear()
|
||
}
|
||
if (key === 'stickup') {
|
||
this.stickup()
|
||
}
|
||
if (key === 'downLoad') {
|
||
this.downLoad(this.checkList)
|
||
}
|
||
},
|
||
setRowStyle({ row, rowIndex }) {
|
||
if (this.checkList.includes(row.Id)) {
|
||
return {
|
||
backgroundColor: '#cce8ff', // 错误行红色背景
|
||
}
|
||
}
|
||
},
|
||
// 复制
|
||
copy() {
|
||
if (!this.checkList || this.checkList.length <= 0) return this.$message.warning(this.$t("trials:trials-workbench:auditDocument:message:nothingCopy"))
|
||
this.copyList = [...this.checkList]
|
||
this.shearList = []
|
||
this.$message.success(this.$t("trials:trials-workbench:auditDocument:message:copySuccess"))
|
||
},
|
||
// 剪切
|
||
shear() {
|
||
if (!this.checkList || this.checkList.length <= 0) return this.$message.warning(this.$t("trials:trials-workbench:auditDocument:message:nothingShear"))
|
||
this.shearList = [...this.checkList]
|
||
this.copyList = []
|
||
this.$message.success(this.$t("trials:trials-workbench:auditDocument:message:shearSuccess"))
|
||
},
|
||
// 粘贴
|
||
stickup() {
|
||
if (this.checkList.length > 1) return this.$message.warning(this.$t("trials:trials-workbench:auditDocument:message:stickupCheckDataMore"))
|
||
if (this.shearList && this.shearList.length > 0) return this.moveData(this.shearList)
|
||
if (this.copyList && this.copyList.length > 0) return this.copyData(this.copyList)
|
||
},
|
||
|
||
// 键盘事件(按下)
|
||
keydown(e) {
|
||
if (!this.isManage) return false
|
||
this.ctrlKey = e.ctrlKey
|
||
if (e.key === 'Control') {
|
||
e.preventDefault();
|
||
}
|
||
if (e.ctrlKey && e.key === 'c') {
|
||
e.preventDefault();
|
||
this.type = 'copy'
|
||
this.copy()
|
||
}
|
||
if (e.ctrlKey && e.key === 'v') {
|
||
e.preventDefault();
|
||
this.type = 'stickup'
|
||
this.stickup()
|
||
}
|
||
if (e.ctrlKey && e.key === 'x') {
|
||
e.preventDefault();
|
||
this.type = 'shear'
|
||
this.shear()
|
||
}
|
||
},
|
||
// 键盘事件(松开)
|
||
keyup(e) {
|
||
if (!this.isManage) return false
|
||
this.ctrlKey = e.ctrlKey
|
||
},
|
||
docClick() {
|
||
this.checkList = []
|
||
}
|
||
},
|
||
mounted() {
|
||
document.addEventListener('keydown', this.keydown);
|
||
document.addEventListener('keyup', this.keyup);
|
||
let table = document.getElementById("auditDocumentTable")
|
||
table.addEventListener('click', this.docClick);
|
||
this.getList()
|
||
this.getBreadcrumbData()
|
||
},
|
||
destroyed() {
|
||
document.removeEventListener('keydown', this.keydown);
|
||
document.removeEventListener('keyup', this.keyup);
|
||
}
|
||
}
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.base-search-form .el-form-item {
|
||
margin-bottom: 22px;
|
||
}
|
||
|
||
.auditDocument {
|
||
|
||
// position: relative;
|
||
::v-deep .catalogue_box.el-table__cell {
|
||
.cell {
|
||
display: flex;
|
||
align-items: center;
|
||
}
|
||
}
|
||
}
|
||
|
||
.renameInp {
|
||
::v-deep .el-input__inner {
|
||
line-height: 23px;
|
||
height: 23px;
|
||
}
|
||
}
|
||
|
||
.name_layout_box {
|
||
display: inline-block;
|
||
flex: 1 1 0%;
|
||
min-width: 0;
|
||
}
|
||
|
||
|
||
.catalogue {
|
||
width: 99%;
|
||
display: flex;
|
||
align-items: center;
|
||
margin: 0 0 22px;
|
||
|
||
|
||
|
||
span {
|
||
font-size: 16px;
|
||
}
|
||
|
||
.last_catalogue {
|
||
width: 24px;
|
||
height: 24px;
|
||
line-height: 24px;
|
||
text-align: center;
|
||
border: 1px solid #ddd;
|
||
// cursor: pointer;
|
||
padding: 0;
|
||
border-radius: 4px 0 0 4px;
|
||
|
||
// &:hover {
|
||
// background-color: #e4f8ff;
|
||
// border-color: #aedaff;
|
||
// }
|
||
}
|
||
|
||
.catalogue_name_box {
|
||
flex: 1 0 0%;
|
||
box-sizing: border-box;
|
||
border: 1px solid #ddd;
|
||
border-left: none;
|
||
padding: 0 10px;
|
||
border-radius: 0 4px 4px 0;
|
||
height: 24px;
|
||
line-height: 24px;
|
||
}
|
||
|
||
.catalogue_name {
|
||
cursor: pointer;
|
||
font-size: 14px;
|
||
|
||
&:hover {
|
||
color: #3b8cff;
|
||
}
|
||
}
|
||
}
|
||
|
||
.name_layout {
|
||
width: 100%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
|
||
.name_box {
|
||
display: flex;
|
||
align-items: center;
|
||
width: calc(100% - 20px);
|
||
|
||
.name {
|
||
max-width: calc(100% - 60px);
|
||
white-space: nowrap;
|
||
/* 文本不换行 */
|
||
overflow: hidden;
|
||
/* 超出部分隐藏 */
|
||
text-overflow: ellipsis;
|
||
}
|
||
}
|
||
}
|
||
|
||
.icon_edit {
|
||
cursor: pointer;
|
||
color: rgba(0, 0, 0, 0.3);
|
||
margin-left: 2px;
|
||
|
||
&:hover {
|
||
color: rgba(0, 0, 0, 0.5);
|
||
}
|
||
}
|
||
|
||
.icon_check {
|
||
font-size: 18px;
|
||
cursor: pointer;
|
||
color: rgba(0, 0, 0, 0.3);
|
||
|
||
&:hover {
|
||
color: rgba(0, 0, 0, 0.5);
|
||
}
|
||
}
|
||
|
||
.isCheck {
|
||
color: #3b8cff;
|
||
}
|
||
|
||
::v-deep .el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell {
|
||
background-color: #e5f3ff
|
||
}
|
||
|
||
.icon_image {
|
||
max-height: 20px;
|
||
max-width: 20px;
|
||
padding: 0px;
|
||
line-height: 20px;
|
||
margin-right: 6px;
|
||
// margin-top: 6px;
|
||
}
|
||
|
||
.icon {
|
||
height: 20px;
|
||
width: 20px;
|
||
padding: 0px;
|
||
line-height: 20px;
|
||
margin-right: 6px;
|
||
margin-top: 6px;
|
||
}
|
||
|
||
/*文件*/
|
||
.icon_file {
|
||
width: 16px !important;
|
||
height: 16px !important;
|
||
margin-right: 6px;
|
||
background-size: inherit;
|
||
background-image: url(@/assets/0.file-16.png);
|
||
background-position: 0 0;
|
||
margin-top: -2px;
|
||
background-repeat: no-repeat;
|
||
font-style: normal;
|
||
display: inline-block;
|
||
pointer-events: none;
|
||
font-size: 85%;
|
||
}
|
||
|
||
/*文件夹*/
|
||
.icon_folder {
|
||
background-image: url(@/assets/folder_win11_small.png);
|
||
margin-top: -6px;
|
||
margin-left: 2px;
|
||
margin-right: 6px;
|
||
background-repeat: no-repeat;
|
||
}
|
||
|
||
/*docx*/
|
||
.icon_docx {
|
||
background-position: -81px -560px !important;
|
||
margin-top: 0;
|
||
margin-left: 2px;
|
||
}
|
||
|
||
/*doc*/
|
||
.icon_doc {
|
||
background-position: -81px -592px !important;
|
||
margin-top: 0;
|
||
margin-left: 2px;
|
||
}
|
||
|
||
/*xlsx*/
|
||
.icon_xlsx {
|
||
background-position: -81px -48px !important;
|
||
margin-top: 0;
|
||
margin-left: 2px;
|
||
}
|
||
|
||
/*pdf*/
|
||
.icon_pdf {
|
||
background-position: -81px -352px !important;
|
||
margin-top: 0;
|
||
margin-left: 2px;
|
||
}
|
||
|
||
/*pptx*/
|
||
.icon_pptx {
|
||
background-position: -81px -288px !important;
|
||
margin-top: 0;
|
||
margin-left: 2px;
|
||
}
|
||
|
||
/*zip*/
|
||
.icon_zip {
|
||
background-position: 0 0 !important;
|
||
margin-top: -2px;
|
||
margin-left: 2px;
|
||
}
|
||
|
||
/*ppt*/
|
||
.icon_ppt {
|
||
background-position: -81px -304px !important;
|
||
margin-top: 0;
|
||
margin-left: 2px;
|
||
}
|
||
|
||
/*xls*/
|
||
.icon_xls {
|
||
background-position: -81px -96px !important;
|
||
margin-top: 0;
|
||
margin-left: 2px;
|
||
}
|
||
</style> |