Files
irc_web/src/views/trials/trials-panel/attachments/self-attachment/index.vue
T
wangxiaoshuang c1f10036b0
continuous-integration/drone/push Build is passing
项目文档增加附件
2025-06-04 17:15:45 +08:00

354 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<BaseContainer>
<!-- 搜索框 -->
<template slot="search-container">
<el-form :inline="true">
<!-- 文件类型 -->
<el-form-item :label="$t('trials:self-attachment:table:fileType')">
<el-select v-model="searchData.FileTypeId" clearable style="width:150px;">
<el-option v-for="item of typeOptions" :key="item.FileTypeId" :label="item.FileType"
:value="item.FileTypeId" />
</el-select>
</el-form-item>
<!-- 文件名称 -->
<el-form-item :label="$t('trials:self-attachment:table:fileName')">
<el-input v-model="searchData.Name" style="width:120px;" />
</el-form-item>
<!-- 是否签署 -->
<el-form-item :label="$t('trials:self-attachment:table:isSign')">
<el-select v-model="searchData.IsSign" clearable style="width:120px;">
<template v-for="item of $d.TrainingStatusEnum">
<el-option v-if="item.raw.ValueCN !== '无'" :label="item.label" :value="item.value" :key="item.id" />
</template>
</el-select>
</el-form-item>
<el-form-item>
<!-- 查询 -->
<el-button icon="el-icon-search" type="primary" @click="handleSearch">
{{ $t('common:button:search') }}
</el-button>
<!-- 重置 -->
<el-button icon="el-icon-refresh-left" type="primary" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
</el-form>
</template>
<template slot="main-container">
<!-- 系统文件列表 -->
<el-table ref="TrialAttachments" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="list" stripe
height="100" @sort-change="handleSortByColumn">
<el-table-column type="selection" width="50" />
<el-table-column type="index" width="40" />
<!-- 文件类型 -->
<el-table-column prop="FileType" :label="$t('trials:self-attachment:table:fileType')" show-overflow-tooltip
sortable="custom" />
<!-- 文件名称 -->
<el-table-column prop="Name" :label="$t('trials:self-attachment:table:fileName')" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('trials:self-attachment:table:AttachmentCount')" prop="AttachmentCount"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
<el-button type="text" @click.stop="openAttachment(scope.row, true)">{{ scope.row.AttachmentCount
}}</el-button>
</template>
</el-table-column>
<!-- 是否废除 -->
<el-table-column prop="IsDeleted" :label="$t('trials:self-attachment:table:isDeleted')" show-overflow-tooltip
sortable="custom">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsDeleted" type="danger">{{ $fd('TrainingStatus', scope.row.IsDeleted) }}</el-tag>
<el-tag v-else type="primary">{{ $fd('TrainingStatus', scope.row.IsDeleted) }}</el-tag>
</template>
</el-table-column>
<!-- 上传时间 -->
<el-table-column prop="CreateTime" :label="$t('trials:self-attachment:table:uploadTime')" show-overflow-tooltip
sortable="custom" />
<!-- 是否签署 -->
<el-table-column prop="ConfirmTime" :label="$t('trials:self-attachment:table:isSign')" show-overflow-tooltip
sortable="custom">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsConfirmed" type="primary">{{ $fd('TrainingStatusEnum', scope.row.IsConfirmed)
}}</el-tag>
<el-tag v-else type="danger">{{ $fd('TrainingStatusEnum', scope.row.IsConfirmed) }}</el-tag>
</template>
</el-table-column>
<!-- 签署时间 -->
<el-table-column prop="ConfirmTime" :label="$t('trials:self-attachment:table:signTime')" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('common:action:action')">
<template slot-scope="scope">
<!-- 预览 -->
<el-button icon="el-icon-view" circle :title="$t('trials:self-attachment:action:preview')"
@click="handlePreview(scope.row)" />
<!-- 签署 -->
<el-button icon="el-icon-edit-outline" circle :disabled="!!scope.row.ConfirmTime"
:title="$t('trials:self-attachment:action:sign')" @click="handleSign(scope.row)" />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</template>
<!-- 预览文件 -->
<el-dialog v-if="previewVisible" :visible.sync="previewVisible" :title="title" :fullscreen="true" append-to-body
custom-class="base-dialog-wrapper">
<span style="position: fixed; left: 16px; top: 45px;cursor: pointer;font-size: 18px;color:#409EFF"
@click.stop="openAttachment(currentRow)" v-if="currentRow.AttachmentCount">{{
$t('trials:self-attachment:table:AttachmentCount') }} ({{
currentRow.AttachmentCount }})</span>
<span v-if="!currentIsConfirm" style="position: fixed;right: 75px;top: 14px;">
<span style="color:red;margin-right:10px;">
<!-- 请仔细阅读文件并签名确认 -->
{{ $t('common:message:signTip') }}
<span v-show="duration < currentMinMinutes * 60">{{ `(${currentMinMinutes * 60 - duration}s)` }}</span>
</span>
<!-- 签署 -->
<el-button size="small" type="primary" :disabled="timer !== null || duration === 0" :loading="btnLoading"
@click="handleConfirm">
{{ $t('common:button:sign') }}
<!-- {{ duration >= currentMinMinutes * 60?'确认':`确认(${currentMinMinutes * 60 - duration}s)` }} -->
</el-button>
</span>
<div class="base-modal-body" style="border:2px solid #ccc;padding: 10px">
<PreviewFile v-if="previewVisible" :file-path="currentPath" :file-type="currentType" @getList="getList" />
</div>
</el-dialog>
<!-- 签名弹框 -->
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px"
append-to-body>
<div slot="title">
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${currentUser})` }}</span>
</div>
<SignForm :is-system-doc="currentRow.IsSystemDoc" :document-id="currentRow.Id" :file-name="fileName"
:trial-id="trialId" @closeDialog="closeSignDialog" />
</el-dialog>
<attachmentList2 v-if="config.visible && !currentRow.IsSystemDoc" :config="config" :rowData="currentRow"
:TrialDocumentId="TrialDocumentId" :isView="true" @getList="getList" />
<attachmentList v-if="config.visible && currentRow.IsSystemDoc" :config="config" :rowData="currentRow"
:SystemDocumentId="TrialDocumentId" :isView="true" @getList="getList" />
<attachmentPreview :SystemDocumentId="TrialDocumentId" :isTrial="!currentRow.IsSystemDoc"
:visible.sync="perview_visible" :isView="true" v-if="perview_visible" />
</BaseContainer>
</template>
<script>
import { getUserDocumentList, setFirstViewDocumentTime, getTrialDocAndSystemDocType, getNextUnSignDocument } from '@/api/trials'
import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination'
import PreviewFile from '@/components/PreviewFile/index'
import SignForm from './components/SignForm'
import store from '@/store'
import attachmentPreview from '@/views/dictionary/attachment/components/SignatureTemplate/attachmentPreview'
import attachmentList from '@/views/dictionary/attachment/components/SignatureTemplate/attachmentList'
import attachmentList2 from '@/views/trials/trials-panel/setting/attachment/components/attachmentList'
const searchDataDefault = () => {
return {
FileTypeId: '',
Name: '',
SortField: '',
IsSign: null,
Asc: false,
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'TrialAttachments',
components: { BaseContainer, Pagination, PreviewFile, SignForm, attachmentPreview, attachmentList, attachmentList2 },
data() {
return {
searchData: searchDataDefault(),
loading: false,
list: [],
total: 0,
currentRow: {},
currentPath: '',
currentType: '',
currentIsConfirm: false,
currentMinMinutes: 0,
title: '',
duration: 0,
timer: null,
previewVisible: false,
btnLoading: false,
signVisible: false,
fileName: '',
currentUser: zzSessionStorage.getItem('userName'),
typeOptions: [],
trialId: this.$route.query.trialId,
TrialDocumentId: null,
perview_visible: null,
config: {
visible: false,
title: this.$t('dictionary:signature:attachmentList:title'),
width: '800px',
},
}
},
mounted() {
this.trialId = this.$route.query.trialId
this.getTypeOptions()
if (this.$route.query.isSign) {
this.searchData.IsSign = JSON.parse(this.$route.query.isSign)
}
this.getList()
},
destroyed() {
if (this.timer) {
this.stopTimer()
}
},
methods: {
openAttachment(row, isList = false) {
if (!row.AttachmentCount) return false
this.TrialDocumentId = row.Id
this.currentRow = { ...row }
if (!isList) {
this.perview_visible = true
} else {
this.config.visible = true
}
},
// 获取系统文件数据
getList() {
this.loading = true
this.searchData.TrialId = this.trialId
getUserDocumentList(this.searchData).then(async res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
var total = res.OtherInfo.NeedSignCount
await store.dispatch('user/setTotalNeedSignTrialDocCount', total)
}).catch(() => {
this.loading = false
})
},
// 获取文件类型下拉数据
getTypeOptions() {
getTrialDocAndSystemDocType(this.trialId).then(res => {
this.typeOptions = res.Result
})
},
// 预览
handlePreview(row) {
this.currentRow = { ...row }
const { Name, FullFilePath, SignViewMinimumMinutes } = row
this.currentPath = FullFilePath
this.currentType = row.Name ? Name.substring(Name.lastIndexOf('.') + 1).toLocaleLowerCase() : ''
this.currentMinMinutes = SignViewMinimumMinutes
this.currentIsConfirm = true
this.title = Name
this.previewVisible = true
},
// 签署
handleSign(row) {
this.currentRow = { ...row }
const { Name, FullFilePath, SignViewMinimumMinutes } = row
this.currentPath = FullFilePath
this.currentType = row.Name ? Name.substring(Name.lastIndexOf('.') + 1).toLocaleLowerCase() : ''
this.currentMinMinutes = SignViewMinimumMinutes
this.currentIsConfirm = false
this.title = Name
this.fileName = Name.slice(0, Name.lastIndexOf('.'))
const trialId = this.trialId
this.loading = true
setFirstViewDocumentTime(trialId, row.Id, row.IsSystemDoc).then(res => {
this.loading = false
this.previewVisible = true
const _this = this
setTimeout(() => {
_this.initTimer()
}, 1000)
}).catch(() => {
this.loading = false
})
},
// 初始化计时器,清除上一次的数据
initTimer() {
if (this.currentMinMinutes > 0 && !this.currentIsConfirm) {
this.duration = 0
if (this.timer) {
this.stopTimer()
}
this.startTimer()
}
},
// 开启计时器
startTimer() {
this.timer = setInterval(() => {
this.duration++
if (this.duration >= this.currentMinMinutes * 60) {
this.stopTimer()
}
}, 1000)
},
// 清楚计时器
stopTimer() {
clearInterval(this.timer)
this.timer = null
},
// 签名
handleConfirm() {
this.signVisible = true
},
// 关闭签名弹窗
closeSignDialog(isSave) {
this.duration = 0
this.signVisible = false
if (isSave) {
this.currentIsConfirm = true
this.$confirm(this.$t('trials:self-attachment:message:nextDocument')).then(res => {
getNextUnSignDocument({
TrialId: this.trialId
}).then(res => {
if (!res.Result) {
// 文档签署已完成,是否关闭弹窗?
this.$confirm(this.$t('trials:self-attachment:message:closeDocument')).then(() => {
this.previewVisible = false
}).catch(() => { })
} else {
this.handleSign(res.Result)
}
this.getList()
})
}).catch(() => {
this.currentIsConfirm = true
this.getList()
})
}
},
// 重置
handleReset() {
this.searchData = searchDataDefault()
this.getList()
this.$nextTick(() => {
this.$refs.TrialAttachments.clearSort()
})
},
// 查询
handleSearch() {
this.getList()
},
// 排序
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.getList()
}
}
}
</script>