Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details

uat
caiyiling 2025-04-10 15:26:31 +08:00
commit 1c19301f28
40 changed files with 3745 additions and 4418 deletions

View File

@ -1035,7 +1035,27 @@ export function getQCVisitList(param) {
data: param
})
}
export function getImageBackList(param) {
return request({
url: `/QCList/getImageBackList`,
method: 'post',
data: param
})
}
export function getImageBackApplyUserList(params) {
return request({
url: `/QCList/getImageBackApplyUserList`,
method: 'get',
params
})
}
export function auditImageBack(params) {
return request({
url: `/QCOperation/auditImageBack`,
method: 'put',
params
})
}
export function getQCChallengeList(param) {
return request({
url: `/QCList/getQCChallengeList`,
@ -3308,6 +3328,13 @@ export function getReReadingApplyToBeDoneList(param) {
data: param
})
}
export function getPMImageBackToBeDoneList(param) {
return request({
url: `/PersonalWorkstation/getPMImageBackToBeDoneList`,
method: 'post',
data: param
})
}
export function deleteClinicalForm(param) {
return request({
@ -3995,3 +4022,91 @@ export function deleteTrialFileType(id) {
})
}
// 工作台-获取稽查文档
export function getAuditDocumentData(data) {
return request({
url: `/AuditDocument/getAuditDocumentData`,
method: 'post',
data
})
}
// 工作台-新增稽查文档
export function addAuditDocument(data) {
return request({
url: `/AuditDocument/addAuditDocument`,
method: 'post',
data
})
}
// 工作台-获取当前目录层级
export function getBreadcrumbData(data) {
return request({
url: `/AuditDocument/getBreadcrumbData`,
method: 'post',
data
})
}
// 工作台-修改稽查文档
export function updateAuditDocument(data) {
return request({
url: `/AuditDocument/updateAuditDocument`,
method: 'post',
data
})
}
// 工作台-删除稽查文档
export function deleteAuditDocument(data) {
return request({
url: `/AuditDocument/deleteAuditDocument`,
method: 'post',
data
})
}
// 工作台-稽查文档获取历史版本
export function getHistoricalVersion(data) {
return request({
url: `/AuditDocument/getHistoricalVersion`,
method: 'post',
data
})
}
// 工作台-稽查文档设置当前版本
export function setCurrentVersion(data) {
return request({
url: `/AuditDocument/setCurrentVersion`,
method: 'post',
data
})
}
// 工作台-稽查文档移动
export function movieFileOrFolder(data) {
return request({
url: `/AuditDocument/movieFileOrFolder`,
method: 'post',
data
})
}
// 工作台-稽查文档复制
export function copyFileOrFolder(data) {
return request({
url: `/AuditDocument/copyFileOrFolder`,
method: 'post',
data
})
}
// 工作台-稽查文档授权
export function setIsAuthorization(data) {
return request({
url: `/AuditDocument/setIsAuthorization`,
method: 'post',
data
})
}
// 工作台-稽查文档新增文件夹
export function addFolder(data) {
return request({
url: `/AuditDocument/addFolder`,
method: 'post',
data
})
}

View File

@ -287,4 +287,12 @@ export function forwardSVDicomImage(param) {
data: param
})
}
// crc、iqc申请影像退回
export function requestImageBack(params) {
return request({
url: `/QCOperation/requestImageBack`,
method: 'put',
params
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
src/assets/stickup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,23 @@
import Vue from "vue";
import OnlyOffice from "./index.vue";
const PreviewConstructor = Vue.extend(OnlyOffice);
const onlyOffice = options => {
const { path, type, title } = options;
if (!path) throw `path is requred.but ${path}`
const id = `OnlyOffice_${new Date().getTime()}`;
const instance = new PreviewConstructor();
instance.id = id;
instance.vm = instance.$mount();
if (instance.vm.visible) return;
document.body.appendChild(instance.vm.$el);
instance.vm.open(path, type, title);
instance.vm.$on("closed", () => {
instance.vm.docEditor = null
document.body.removeChild(instance.vm.$el);
instance.vm.$destroy();
});
return instance.vm;
}
export default onlyOffice;

View File

@ -0,0 +1,7 @@
import OnlyOffice from "./index.vue";
import onlyOffice from "./fun";
export default Vue => {
Vue.component(OnlyOffice.name, OnlyOffice);
Vue.prototype.$onlyOffice = onlyOffice;
};

View File

@ -0,0 +1,45 @@
<template>
<el-dialog v-if="visible" :visible.sync="visible" :title="title" :fullscreen="true" append-to-body
custom-class="base-dialog-wrapper" @close="handleClose">
<div class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
<iframe v-if="visible"
:src="`/static/onlyOffice/viewer.html?url=${OSSclientConfig.basePath}${path}?type=${type}&title=${title}&documentType=${documentType}&userName=${currentUser}`"
width="100%" height="99%" frameborder="0" crossorigin="anonymous" />
</div>
</el-dialog>
</template>
<script>
import DOCUMENTTYPE from "@/utils/onlyOffice_type.js"
export default {
name: "OnlyOffice",
data() {
return {
visible: false,
path: null,
type: null,
title: null,
documentType: null,
currentUser: zzSessionStorage.getItem('userName'),
};
},
methods: {
open(path, type, title) {
this.path = path;
this.type = type.toLowerCase();
this.documentType = DOCUMENTTYPE[`.${this.type}`]
this.title = title;
this.visible = true;
},
handleClose() {
this.$emit("closed");
},
},
};
</script>
<style lang="scss" scoped>
#placeholder {
width: 100%;
height: 100%;
}
</style>

View File

@ -8,61 +8,25 @@
</div>
</div>
<!--检查列表-->
<el-table
:data="list"
style="width: 100%"
v-adaptive="{ bottomOffset: 60 }"
:loading="loading"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'TaskBlindName', order: 'descending' }"
>
<el-table :data="list" style="width: 100%" v-adaptive="{ bottomOffset: 60 }" :loading="loading"
@sort-change="handleSortByColumn" :default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
<!--受试者-->
<el-table-column
prop="SubjectCode"
:label="$t('upload:nonedicom:table:subject')"
/>
<el-table-column prop="SubjectCode" :label="$t('upload:nonedicom:table:subject')" />
<!--任务名称-->
<el-table-column
prop="TaskBlindName"
:label="$t('upload:nonedicom:table:taskName')"
sortable="custom"
/>
<el-table-column prop="TaskBlindName" :label="$t('upload:nonedicom:table:taskName')" sortable="custom" />
<!--检查类型-->
<el-table-column
prop="Modality"
:label="$t('upload:nonedicom:table:molityType')"
sortable="custom"
>
<el-table-column prop="Modality" :label="$t('upload:nonedicom:table:molityType')" sortable="custom">
</el-table-column>
<!--检查部位-->
<el-table-column
prop="BodyPart"
:label="$t('upload:nonedicom:table:bodyPart')"
sortable="custom"
/>
<el-table-column prop="BodyPart" :label="$t('upload:nonedicom:table:bodyPart')" sortable="custom" />
<!--原文件数-->
<el-table-column
prop="FileCount"
:label="$t('upload:nonedicom:table:fileCount')"
>
<el-table-column prop="FileCount" :label="$t('upload:nonedicom:table:fileCount')">
<template slot-scope="scope">
<el-popover
v-if="scope.row.FileCount"
trigger="click"
placement="bottom"
>
<el-popover v-if="scope.row.FileCount" trigger="click" placement="bottom">
<el-table :data="scope.row.FileList" height="300" size="small">
<!-- 文件名称 -->
<el-table-column
prop="FileName"
:label="$t('trials:audit:table:nonDicomsFileName')"
width="200"
/>
<el-table-column
prop="FileSize"
:label="$t('trials:audit:table:nonDicomsFileSize')"
width="100"
>
<el-table-column prop="FileName" :label="$t('trials:audit:table:nonDicomsFileName')" width="200" />
<el-table-column prop="FileSize" :label="$t('trials:audit:table:nonDicomsFileSize')" width="100">
<template slot-scope="scope">
<span>{{
scope.row.FileSize && scope.row.FileSize > 0
@ -74,27 +38,13 @@
<el-table-column :label="$t('common:action:action')" width="120">
<template slot-scope="files">
<!-- 预览 -->
<viewer
:ref="files.row.Path"
style="margin: 0 10px"
:images="[`${OSSclientConfig.basePath}${files.row.Path}`]"
>
<el-button
circle
icon="el-icon-view"
:title="$t('upload:nonedicom:button:preview')"
:disabled="
files.row.FileType &&
<viewer :ref="files.row.Path" style="margin: 0 10px"
:images="[`${OSSclientConfig.basePath}${files.row.Path}`]">
<el-button circle icon="el-icon-view" :title="$t('upload:nonedicom:button:preview')" :disabled="files.row.FileType &&
files.row.FileType.indexOf('zip') >= 0
"
@click.native.prevent="previewFile(files.row)"
/>
<img
v-show="false"
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${files.row.Path}`"
alt="Image"
/>
" @click.native.prevent="previewFile(files.row)" />
<img v-show="false" crossorigin="anonymous" :src="`${OSSclientConfig.basePath}${files.row.Path}`"
alt="Image" />
</viewer>
</template>
</el-table-column>
@ -109,32 +59,13 @@
</template>
</el-table-column>
<!--后处理文件数-->
<el-table-column
prop="UploadedFileCount"
:label="$t('upload:nonedicom:table:uploadFileCount')"
>
<el-table-column prop="UploadedFileCount" :label="$t('upload:nonedicom:table:uploadFileCount')">
<template slot-scope="scope">
<el-popover
v-if="scope.row.UploadedFileCount"
trigger="click"
placement="bottom"
>
<el-table
:data="scope.row.UploadedFileList"
height="300"
size="small"
>
<el-popover v-if="scope.row.UploadedFileCount" trigger="click" placement="bottom">
<el-table :data="scope.row.UploadedFileList" height="300" size="small">
<!-- 文件名称 -->
<el-table-column
prop="FileName"
:label="$t('trials:audit:table:nonDicomsFileName')"
width="200"
/>
<el-table-column
prop="FileSize"
:label="$t('trials:audit:table:nonDicomsFileSize')"
width="100"
>
<el-table-column prop="FileName" :label="$t('trials:audit:table:nonDicomsFileName')" width="200" />
<el-table-column prop="FileSize" :label="$t('trials:audit:table:nonDicomsFileSize')" width="100">
<template slot-scope="scope">
<span>{{
scope.row.FileSize && scope.row.FileSize > 0
@ -146,27 +77,13 @@
<el-table-column :label="$t('common:action:action')" width="120">
<template slot-scope="files">
<!-- 预览 -->
<viewer
:ref="files.row.Path"
style="margin: 0 10px"
:images="[`${OSSclientConfig.basePath}${files.row.Path}`]"
>
<el-button
circle
icon="el-icon-view"
:title="$t('upload:nonedicom:button:preview')"
:disabled="
files.row.FileType &&
<viewer :ref="files.row.Path" style="margin: 0 10px"
:images="[`${OSSclientConfig.basePath}${files.row.Path}`]">
<el-button circle icon="el-icon-view" :title="$t('upload:nonedicom:button:preview')" :disabled="files.row.FileType &&
files.row.FileType.indexOf('zip') >= 0
"
@click.native.prevent="previewFile(files.row)"
/>
<img
v-show="false"
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${files.row.Path}`"
alt="Image"
/>
" @click.native.prevent="previewFile(files.row)" />
<img v-show="false" crossorigin="anonymous" :src="`${OSSclientConfig.basePath}${files.row.Path}`"
alt="Image" />
</viewer>
</template>
</el-table-column>
@ -180,75 +97,34 @@
<span v-else>{{ scope.row.UploadedFileCount }}</span>
</template>
</el-table-column>
<el-table-column
:label="$t('common:action:action')"
fixed="right"
width="180"
>
<el-table-column :label="$t('common:action:action')" fixed="right" width="180">
<template slot-scope="scope">
<!--预览--->
<el-button
circle
:disabled="scope.row.UploadedFileCount <= 0"
icon="el-icon-view"
:title="$t('upload:nonedicom:button:preview')"
@click.stop="handlePreviewNoneDicomFiles(scope.row)"
/>
<el-button circle :disabled="scope.row.UploadedFileCount <= 0" icon="el-icon-view"
:title="$t('upload:nonedicom:button:preview')" @click.stop="handlePreviewNoneDicomFiles(scope.row)" />
<!--上传--->
<el-button
circle
icon="el-icon-upload2"
:title="$t('upload:nonedicom:button:upload')"
@click.native.prevent="handleUpload(scope.row)"
/>
<el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')"
@click.native.prevent="handleUpload(scope.row)" />
<!--删除--->
<el-button
:disabled="
scope.row.UploadedFileCount <= 0 ||
<el-button :disabled="scope.row.UploadedFileCount <= 0 ||
scope.row.ReadingTaskState === 2
"
circle
icon="el-icon-delete"
:title="$t('upload:nonedicom:button:delete')"
@click.stop="remove(scope.row)"
/>
" circle icon="el-icon-delete" :title="$t('upload:nonedicom:button:delete')"
@click.stop="remove(scope.row)" />
</template>
</el-table-column>
</el-table>
<!-- 预览单个图像 -->
<el-dialog
v-if="imgObj.visible"
:visible.sync="imgObj.visible"
:title="$t('upload:nonedicom:dialogTitle:preview')"
append-to-body
width="565px"
>
<div
v-loading="imgObj.loading"
class="base-modal-body"
style="border: 2px solid #ccc; padding: 10px"
>
<el-image
:src="`${OSSclientConfig.basePath}${imgObj.url}`"
crossorigin="anonymous"
fit="fit"
style="height: 500px; width: 500px"
@error="imgObj.loading = false"
@load="imgObj.loading = false"
/>
<el-dialog v-if="imgObj.visible" :visible.sync="imgObj.visible" :title="$t('upload:nonedicom:dialogTitle:preview')"
append-to-body width="565px">
<div v-loading="imgObj.loading" class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
<el-image :src="`${OSSclientConfig.basePath}${imgObj.url}`" crossorigin="anonymous" fit="fit"
style="height: 500px; width: 500px" @error="imgObj.loading = false" @load="imgObj.loading = false" />
</div>
</el-dialog>
<!-- 上传非dicom文件 -->
<el-dialog
v-if="uploadVisible"
:visible.sync="uploadVisible"
:close-on-click-modal="false"
:title="$t('trials:uploadNonDicoms:dialogTitle:upload')"
width="800px"
append-to-body
custom-class="base-dialog-wrapper"
@close="resetFileDiaolg"
>
<el-dialog v-if="uploadVisible" :visible.sync="uploadVisible" :close-on-click-modal="false"
:title="$t('trials:uploadNonDicoms:dialogTitle:upload')" width="800px" append-to-body
custom-class="base-dialog-wrapper" @close="resetFileDiaolg">
<!-- 多文件上传 -->
<form id="inputForm" ref="uploadForm">
<el-divider content-position="left">{{
@ -256,33 +132,15 @@
}}</el-divider>
<div class="form-group">
<div class="upload" style="margin-right: 10px">
<input
multiple="multiple"
webkitdirectory=""
directory
accept="*/*"
type="file"
name="uploadFolder"
class="select-file"
title=""
@change="beginScanFiles($event)"
v-if="!btnLoading"
/>
<input multiple="multiple" webkitdirectory="" directory accept="*/*" type="file" name="uploadFolder"
class="select-file" title="" @change="beginScanFiles($event)" v-if="!btnLoading" />
<div class="btn-select">
{{ $t('trials:uploadNonDicoms:button:selectFolder') }}
</div>
</div>
<div class="upload">
<input
class="select-file"
multiple=""
:accept="faccept.join(',')"
type="file"
name="uploadFile"
title=""
@change="beginScanFiles($event)"
v-if="!btnLoading"
/>
<input class="select-file" multiple="" :accept="faccept.join(',')" type="file" name="uploadFile" title=""
@change="beginScanFiles($event)" v-if="!btnLoading" />
<div class="btn-select">
{{ $t('trials:uploadNonDicoms:button:select') }}
</div>
@ -293,82 +151,46 @@
</div>
</form>
<!-- 文件列表 -->
<el-table
ref="filesTable"
:data="fileList"
class="dicomFiles-table"
height="300"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
:selectable="(row, index) => row.status !== 2 && !btnLoading"
/>
<el-table ref="filesTable" :data="fileList" class="dicomFiles-table" height="300"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" :selectable="(row, index) => row.status !== 2 && !btnLoading" />
<el-table-column type="index" width="50" />
<!-- 文件名称 -->
<el-table-column
prop="name"
:label="$t('trials:uploadNonDicoms:table:fileName')"
min-width="100"
/>
<el-table-column prop="name" :label="$t('trials:uploadNonDicoms:table:fileName')" min-width="100" />
<!-- 文件大小 -->
<el-table-column
prop="size"
:label="$t('trials:uploadNonDicoms:table:fileSize')"
>
<el-table-column prop="size" :label="$t('trials:uploadNonDicoms:table:fileSize')">
<template slot-scope="scope">
<span>{{
scope.row.size && scope.row.size > 0
? `${(scope.row.size / 1024 / 1024).toFixed(3)}MB`
: ''
: '0MB'
}}</span>
</template>
</el-table-column>
<!-- 文件类型 -->
<el-table-column
prop="type"
:label="$t('trials:uploadNonDicoms:table:fileType')"
/>
<el-table-column prop="type" :label="$t('trials:uploadNonDicoms:table:fileType')" />
<!-- 上传状态 -->
<el-table-column
prop="status"
:label="$t('trials:uploadNonDicoms:table:uploadStatus')"
min-width="100"
>
<el-table-column prop="status" :label="$t('trials:uploadNonDicoms:table:uploadStatus')" min-width="100">
<template slot-scope="scope">
<el-tag
:type="['warning', 'info', 'success', 'danger'][scope.row.status]"
v-if="scope.row.status || scope.row.status === 0"
>{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
<el-tag :type="['warning', 'info', 'success', 'danger'][scope.row.status]"
v-if="scope.row.status || scope.row.status === 0">{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:uploadNonDicoms:table:failedFileCount')"
min-width="150"
show-overflow-tooltip
>
<el-table-column :label="$t('trials:uploadNonDicoms:table:failedFileCount')" min-width="150"
show-overflow-tooltip>
<template slot-scope="scope">
<el-progress
color="#409eff"
:percentage="
((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
<el-progress color="#409eff" :percentage="scope.row.size && scope.row.size > 0 ? ((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
1
"
/>
: ((scope.row.uploadFileSize * 100) / 1).toFixed(2) *
1
" />
</template>
</el-table-column>
<el-table-column :label="$t('common:action:action')">
<template slot-scope="scope">
<el-button
size="mini"
icon="el-icon-delete"
circle
:disabled="btnLoading"
:title="$t('trials:crcUpload:action:delete')"
@click="handleRemoveFile(scope.row)"
/>
<el-button size="mini" icon="el-icon-delete" circle :disabled="btnLoading"
:title="$t('trials:crcUpload:action:delete')" @click="handleRemoveFile(scope.row)" />
</template>
</el-table-column>
</el-table>
@ -376,13 +198,8 @@
<span style="margin-right: 10px">{{
$store.state.trials.uploadTip
}}</span>
<el-button
size="small"
type="primary"
:disabled="selectArr.length == 0"
:loading="btnLoading"
@click="beginUpload"
>
<el-button size="small" type="primary" :disabled="selectArr.length == 0" :loading="btnLoading"
@click="beginUpload">
{{ $t('trials:uploadNonDicoms:action:upload') }}
</el-button>
</div>
@ -714,8 +531,7 @@ export default {
if (!this.uploadVisible) return
let file = this.fileList.filter((item) => item.id === arr[index].id)[0]
file.status = 1
let path = `/${this.$route.query.trialId}/TaskImage/${
this.currentRow.SubjectId
let path = `/${this.$route.query.trialId}/TaskImage/${this.currentRow.SubjectId
}/${this.currentRow.VisitTaskId}/${this.$guid()}${file.name
.substring(file.name.lastIndexOf('.'))
.toLocaleLowerCase()}`
@ -772,7 +588,7 @@ export default {
(percentage, checkpoint, lastPer) => {
item.uploadFileSize += checkpoint.size * (percentage - lastPer)
if (item.uploadFileSize > file.fileSize) {
item.uploadFileSize = file.fileSize
item.uploadFileSize = file.fileSize > 0 ? file.fileSize : 1
}
}
)
@ -869,6 +685,7 @@ export default {
.top {
margin: 10px 0;
}
.upload {
display: inline-block;
height: 30px;
@ -883,6 +700,7 @@ export default {
background: #428bca;
border-color: #428bca;
color: #fff;
.select-file {
height: 30px;
width: 90px;
@ -893,6 +711,7 @@ export default {
opacity: 0;
font-size: 0;
}
.btn-select {
//
width: 90px;
@ -908,10 +727,12 @@ export default {
pointer-events: none; //pointer-events:none穿
}
}
.tip {
display: flex;
align-items: flex-start;
margin-top: 5px;
i {
margin: 3px 5px 0 0;
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -54,6 +54,8 @@ import upload from '@/components/element-ui/upload'
Vue.use(upload)
import Preview from '@/components/Preview/index'
Vue.use(Preview)
import Onlyoffice from '@/components/Preview_onlyoffice/index'
Vue.use(Onlyoffice)
import MFA from '@/components/MFA/index'
Vue.use(MFA)
import FB from '@/components/feedBack/index'

View File

@ -99,5 +99,27 @@ function metaDataProvider(type, imageId) {
columnPixelSpacing,
};
}
if (type === 'imagePixelModule') {
return {
samplesPerPixel: dataSet.uint16('x00280002'),
photometricInterpretation: dataSet.string('x00280004'),
rows: dataSet.uint16('x00280010'),
columns: dataSet.uint16('x00280011'),
bitsAllocated: dataSet.uint16('x00280100'),
bitsStored: dataSet.uint16('x00280101'),
highBit: dataSet.uint16('x00280102'),
pixelRepresentation: dataSet.uint16('x00280103'),
planarConfiguration: dataSet.uint16('x00280006'),
pixelAspectRatio: dataSet.uint16('x00280034'),
smallestPixelValue: null,
largestPixelValue: null,
redPaletteColorLookupTableDescriptor: dataSet.string('x00281101'),
greenPaletteColorLookupTableDescriptor: dataSet.string('x00281102'),
bluePaletteColorLookupTableDescriptor: dataSet.string('x00281103'),
redPaletteColorLookupTableData: dataSet.string('x00281201'),
greenPaletteColorLookupTableData: dataSet.string('x00281202'),
bluePaletteColorLookupTableData: dataSet.string('x00281203')
}
}
}
export default metaDataProvider;

View File

@ -0,0 +1,66 @@
let TYPES = ['word', 'cell', 'slide', 'pdf']
let DOCUMENTTYPE = {
'.doc': TYPES[0],
'.docm': TYPES[0],
'.docx': TYPES[0],
'.dot': TYPES[0],
'.dotm': TYPES[0],
'.dotx': TYPES[0],
'.epub': TYPES[0],
'.fb2': TYPES[0],
'.fodt': TYPES[0],
'.htm': TYPES[0],
'.html': TYPES[0],
'.mht': TYPES[0],
'.mhtml': TYPES[0],
'.odt': TYPES[0],
'.ott': TYPES[0],
'.pages': TYPES[0],
'.rtf': TYPES[0],
'.stw': TYPES[0],
'.sxw': TYPES[0],
'.txt': TYPES[0],
'.wps': TYPES[0],
'.wpt': TYPES[0],
'.xml': TYPES[0],
'.csv': TYPES[1],
'.et': TYPES[1],
'.ett': TYPES[1],
'.fods': TYPES[1],
'.numbers': TYPES[1],
'.ods': TYPES[1],
'.ots': TYPES[1],
'.sxc': TYPES[1],
'.xls': TYPES[1],
'.xlsb': TYPES[1],
'.xlsm': TYPES[1],
'.xlsx': TYPES[1],
'.xlt': TYPES[1],
'.xltm': TYPES[1],
'.xltx': TYPES[1],
'.xml': TYPES[1],
'.dps': TYPES[2],
'.dpt': TYPES[2],
'.fodp': TYPES[2],
'.key': TYPES[2],
'.odp': TYPES[2],
'.otp': TYPES[2],
'.pot': TYPES[2],
'.potm': TYPES[2],
'.potx': TYPES[2],
'.pps': TYPES[2],
'.ppsm': TYPES[2],
'.ppsx': TYPES[2],
'.ppt': TYPES[2],
'.pptm': TYPES[2],
'.pptx': TYPES[2],
'.sxi': TYPES[2],
'.djvu': TYPES[3],
'.docxf': TYPES[3],
'.oform': TYPES[3],
'.oxps': TYPES[3],
'.pdf': TYPES[3],
'.xps': TYPES[3]
}
export default DOCUMENTTYPE

View File

@ -4,141 +4,57 @@
<el-form :inline="true" class="base-search-form">
<!-- 是否需要回执 -->
<el-form-item :label="$t('trials:emailManageCfg:title:isReturnRequired')" v-if="!systemLevel">
<el-select
v-model="searchData.IsReturnRequired"
clearable
style="width: 100px"
>
<el-option
v-for="item of $d.YesOrNo"
:value="item.value"
:label="item.label"
:key="item.id"
/>
<el-select v-model="searchData.IsReturnRequired" clearable style="width: 100px">
<el-option v-for="item of $d.YesOrNo" :value="item.value" :label="item.label" :key="item.id" />
</el-select>
</el-form-item>
<!-- 是否加急 -->
<el-form-item :label="$t('dictionary:email:label:IsUrgent')" v-if="!systemLevel">
<el-select
v-model="searchData.IsUrgent"
clearable
style="width: 100px"
>
<el-option
v-for="item of $d.YesOrNo"
:value="item.value"
:label="item.label"
:key="item.id"
/>
<el-select v-model="searchData.IsUrgent" clearable style="width: 100px">
<el-option v-for="item of $d.YesOrNo" :value="item.value" :label="item.label" :key="item.id" />
</el-select>
</el-form-item>
<!-- 是否启用 -->
<el-form-item :label="$t('trials:emailManageCfg:table:IsEnable')" v-if="!systemLevel">
<el-select
v-model="searchData.IsEnable"
clearable
style="width: 100px"
>
<el-option
v-for="item of $d.YesOrNo"
:value="item.value"
:label="item.label"
:key="item.id"
/>
<el-select v-model="searchData.IsEnable" clearable style="width: 100px">
<el-option v-for="item of $d.YesOrNo" :value="item.value" :label="item.label" :key="item.id" />
</el-select>
</el-form-item>
<el-form-item
:label="$t('trials:auditRecord:table:criterion')"
v-if="isDistinguishCriteria && !systemLevel"
>
<el-select
v-model="searchData.CriterionTypeEnum"
clearable
style="width: 100px"
>
<el-option
v-for="item of $d.CriterionType"
:value="item.value"
:label="item.label"
:key="item.id"
/>
<el-form-item :label="$t('trials:auditRecord:table:criterion')" v-if="isDistinguishCriteria && !systemLevel">
<el-select v-model="searchData.CriterionTypeEnum" clearable style="width: 100px">
<el-option v-for="item of $d.CriterionType" :value="item.value" :label="item.label" :key="item.id" />
</el-select>
</el-form-item>
<el-form-item :label="$t('trials:emailManageCfg:form:BusinessModule')">
<el-select
v-model="searchData.BusinessModuleEnum"
clearable
style="width: 100px"
>
<el-option
v-for="item of $d.BusinessModule"
:value="item.value"
:label="item.label"
:key="item.id"
/>
<el-select v-model="searchData.BusinessModuleEnum" clearable style="width: 100px">
<el-option v-for="item of $d.BusinessModule" :value="item.value" :label="item.label" :key="item.id" />
</el-select>
</el-form-item>
<el-form-item
:label="$t('trials:emailManageCfg:form:BusinessScenario')"
>
<el-select
v-model="searchData.BusinessScenarioEnum"
clearable
style="width: 100px"
>
<el-option
v-for="item of $d.Email_BusinessScenario"
:value="item.value"
:label="item.label"
:key="item.id"
/>
<el-form-item :label="$t('trials:emailManageCfg:form:BusinessScenario')">
<el-select v-model="searchData.BusinessScenarioEnum" clearable style="width: 100px">
<el-option v-for="item of $d.Email_BusinessScenario" :value="item.value" :label="item.label"
:key="item.id" />
</el-select>
</el-form-item>
<el-form-item :label="$t('trials:emailManageCfg:form:ToUserType')">
<el-select
v-model="searchData.ToUserType"
clearable
style="width: 100px"
>
<el-option
v-for="item of UserTypeList"
:value="item.value"
:label="item.label"
:key="item.id"
/>
<el-select v-model="searchData.ToUserType" clearable style="width: 100px">
<el-option v-for="item of UserTypeList" :value="item.value" :label="item.label" :key="item.id" />
</el-select>
</el-form-item>
<el-form-item
:label="$t('trials:emailManageCfg:form:EmailUrgent')"
v-if="systemLevel === 1"
>
<el-select
v-model="searchData.EmailUrgentEnum"
clearable
style="width: 100px"
>
<el-option
v-for="item of $d.EmailUrgent"
:value="item.value"
:label="item.label"
:key="item.id"
/>
<el-form-item :label="$t('trials:emailManageCfg:form:EmailUrgent')" v-if="systemLevel === 1">
<el-select v-model="searchData.EmailUrgentEnum" clearable style="width: 100px">
<el-option v-for="item of $d.EmailUrgent" :value="item.value" :label="item.label" :key="item.id" />
</el-select>
</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"
>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
</el-form>
<span style="margin-left: auto">
<el-form-item>
<el-button type="primary" @click="handleExport">
{{ $t('common:button:export') }}
</el-button>
@ -151,98 +67,52 @@
<el-button type="primary" @click="handleAdd">
{{ $t('common:button:new') }}
</el-button>
</span>
</el-form-item>
</el-form>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 45 }"
:data="list"
stripe
height="100"
style="width: 100%"
@sort-change="handleSortByColumn"
>
<el-table v-loading="loading" v-adaptive="{ bottomOffset: 45 }" :data="list" stripe height="100" style="width: 100%"
@sort-change="handleSortByColumn">
<el-table-column type="index" width="40" />
<!-- Code -->
<el-table-column
prop="Code"
:label="$t('trials:emailManageCfg:title:code')"
sortable="custom"
show-overflow-tooltip
min-width="100"
/>
<el-table-column
v-if="isDistinguishCriteria"
prop="TrialReadingCriterionId"
:label="$t('trials:reviewTrack:table:criterionName')"
show-overflow-tooltip
sortable="custom"
min-width="120"
>
<el-table-column prop="Code" :label="$t('trials:emailManageCfg:title:code')" sortable="custom"
show-overflow-tooltip min-width="100" />
<el-table-column v-if="isDistinguishCriteria" prop="TrialReadingCriterionId"
:label="$t('trials:reviewTrack:table:criterionName')" show-overflow-tooltip sortable="custom" min-width="120">
<template slot-scope="scope">
{{ $fd('CriterionType', scope.row.CriterionTypeEnum) }}
</template>
</el-table-column>
<!-- 邮件主题中文 -->
<el-table-column
prop="EmailTopicCN"
:label="$t('trials:emailManageCfg:table:EmailTopicCN')"
sortable="custom"
show-overflow-tooltip
min-width="160"
/>
<el-table-column prop="EmailTopicCN" :label="$t('trials:emailManageCfg:table:EmailTopicCN')" sortable="custom"
show-overflow-tooltip min-width="160" />
<!-- 邮件主题英文 -->
<el-table-column
prop="EmailTopic"
:label="$t('trials:emailManageCfg:table:EmailTopic')"
sortable="custom"
show-overflow-tooltip
min-width="160"
/>
<el-table-column prop="EmailTopic" :label="$t('trials:emailManageCfg:table:EmailTopic')" sortable="custom"
show-overflow-tooltip min-width="160" />
<!-- 业务层级 -->
<el-table-column
prop="BusinessLevelEnum"
:label="$t('dictionary:email:label:businessLevel')"
sortable="custom"
show-overflow-tooltip
min-width="150"
>
<el-table-column prop="BusinessLevelEnum" :label="$t('dictionary:email:label:businessLevel')" sortable="custom"
show-overflow-tooltip min-width="150">
<template slot-scope="scope">
{{ $fd('BusinessLevel', scope.row.BusinessLevelEnum) }}
</template>
</el-table-column>
<!-- 业务模块 -->
<el-table-column
prop="BusinessModuleEnum"
:label="$t('dictionary:email:label:businessModule')"
sortable="custom"
show-overflow-tooltip
min-width="160"
>
<el-table-column prop="BusinessModuleEnum" :label="$t('dictionary:email:label:businessModule')" sortable="custom"
show-overflow-tooltip min-width="160">
<template slot-scope="scope">
{{ $fd('BusinessModule', scope.row.BusinessModuleEnum) }}
</template>
</el-table-column>
<!-- 业务场景 -->
<el-table-column
prop="BusinessScenarioEnum"
:label="$t('trials:emailManageCfg:table:BusinessScenarioEnum')"
sortable="custom"
show-overflow-tooltip
min-width="130"
>
<el-table-column prop="BusinessScenarioEnum" :label="$t('trials:emailManageCfg:table:BusinessScenarioEnum')"
sortable="custom" show-overflow-tooltip min-width="130">
<template slot-scope="scope">
{{ $fd('Email_BusinessScenario', scope.row.BusinessScenarioEnum) }}
</template>
</el-table-column>
<!-- 收件人v-if="systemLevel !== 1" -->
<el-table-column
prop="ToUserTypeList"
:label="$t('trials:emailManageCfg:title:toUserTypeList')"
show-overflow-tooltip
min-width="100"
>
<el-table-column prop="ToUserTypeList" :label="$t('trials:emailManageCfg:title:toUserTypeList')"
show-overflow-tooltip min-width="100">
<template slot-scope="scope">
{{
scope.row.ToUserTypeList.length > 0
@ -254,12 +124,8 @@
</template>
</el-table-column>
<!-- 抄送人v-if="!systemLevel" -->
<el-table-column
prop="CopyUserTypeList"
:label="$t('trials:emailManageCfg:title:copyUserTypeList')"
show-overflow-tooltip
min-width="100"
>
<el-table-column prop="CopyUserTypeList" :label="$t('trials:emailManageCfg:title:copyUserTypeList')"
show-overflow-tooltip min-width="100">
<template slot-scope="scope">
{{
scope.row.CopyUserTypeList.length > 0
@ -271,52 +137,27 @@
</template>
</el-table-column>
<!-- 加急状态 -->
<el-table-column
prop="EmailUrgentEnum"
:label="$t('dictionary:email:label:IsUrgent')"
sortable="custom"
show-overflow-tooltip
min-width="110"
>
<el-table-column prop="EmailUrgentEnum" :label="$t('dictionary:email:label:IsUrgent')" sortable="custom"
show-overflow-tooltip min-width="110">
<template slot-scope="scope">
{{ $fd('EmailUrgent', scope.row.EmailUrgentEnum) }}
</template>
</el-table-column>
<!-- 发送周期和时间 -->
<el-table-column
prop="EmailCron"
:label="$t('trials:emailManageCfg:table:EmailCron')"
sortable="custom"
show-overflow-tooltip
min-width="180"
/>
<el-table-column prop="EmailCron" :label="$t('trials:emailManageCfg:table:EmailCron')" sortable="custom"
show-overflow-tooltip min-width="180" />
<!-- 附件 -->
<el-table-column
prop="FileName"
:label="$t('trials:emailManageCfg:title:fileName')"
show-overflow-tooltip
min-width="100"
v-if="!systemLevel"
>
<el-table-column prop="FileName" :label="$t('trials:emailManageCfg:title:fileName')" show-overflow-tooltip
min-width="100" v-if="!systemLevel">
<template slot-scope="scope">
<el-button
v-if="scope.row.FilePath"
type="text"
@click="handlePreview(scope.row.FilePath)"
>
<el-button v-if="scope.row.FilePath" type="text" @click="handlePreview(scope.row.FilePath)">
{{ scope.row.FileName }}
</el-button>
</template>
</el-table-column>
<!-- 是否需要回执 -->
<el-table-column
prop="IsReturnRequired"
:label="$t('trials:emailManageCfg:title:isReturnRequired')"
show-overflow-tooltip
sortable="custom"
min-width="160"
v-if="!systemLevel"
>
<el-table-column prop="IsReturnRequired" :label="$t('trials:emailManageCfg:title:isReturnRequired')"
show-overflow-tooltip sortable="custom" min-width="160" v-if="!systemLevel">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsReturnRequired" type="danger">
{{ $fd('YesOrNo', scope.row.IsReturnRequired) }}
@ -327,14 +168,8 @@
</template>
</el-table-column>
<!-- 是否自动发送 -->
<el-table-column
prop="IsAutoSend"
:label="$t('trials:emailManageCfg:title:isAutoSend')"
show-overflow-tooltip
sortable="custom"
min-width="160"
v-if="!systemLevel"
>
<el-table-column prop="IsAutoSend" :label="$t('trials:emailManageCfg:title:isAutoSend')" show-overflow-tooltip
sortable="custom" min-width="160" v-if="!systemLevel">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsAutoSend" type="danger">
{{ $fd('YesOrNo', scope.row.IsAutoSend) }}
@ -344,14 +179,8 @@
}}</el-tag>
</template>
</el-table-column>
<el-table-column
prop="IsEnable"
:label="$t('trials:emailManageCfg:table:IsEnable')"
show-overflow-tooltip
sortable="custom"
min-width="160"
v-if="!systemLevel"
>
<el-table-column prop="IsEnable" :label="$t('trials:emailManageCfg:table:IsEnable')" show-overflow-tooltip
sortable="custom" min-width="160" v-if="!systemLevel">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsEnable" type="danger">
{{ $fd('YesOrNo', scope.row.IsEnable) }}
@ -362,22 +191,12 @@
</template>
</el-table-column>
<!-- 更新时间 -->
<el-table-column
prop="UpdateTime"
:label="$t('trials:emailManageCfg:title:updateTime')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column prop="UpdateTime" :label="$t('trials:emailManageCfg:title:updateTime')" show-overflow-tooltip
sortable="custom" min-width="160" />
<!-- 创建时间 -->
<el-table-column
prop="CreateTime"
:label="$t('trials:emailManageCfg:title:createTime')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column label="Action" min-width="180" fixed="right">
<el-table-column prop="CreateTime" :label="$t('trials:emailManageCfg:title:createTime')" show-overflow-tooltip
sortable="custom" min-width="160" />
<el-table-column :label="$t('common:action:action')" min-width="180" fixed="right">
<template slot-scope="scope">
<el-button type="text" @click="handleEdit(scope.row)">
{{ $t('common:button:edit') }}
@ -386,77 +205,38 @@
<el-button type="text" @click="handleDelete(scope.row)">
{{ $t('common:button:delete') }}
</el-button>
<el-button
type="text"
@click="
<el-button type="text" @click="
preview(scope.row.EmailHtmlContentCN, scope.row.EmailHtmlContent)
"
>{{ $t('common:button:preview') }}</el-button>
">{{ $t('common:button:preview') }}</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
<!-- 搜索框 -->
<!-- 修改受试者状态 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
fullscreen
custom-class="base-dialog-wrapper"
>
<EmailForm
:data="rowData"
:system-level="systemLevel"
:isDistinguishCriteria="isDistinguishCriteria"
@closeDialog="closeDialog"
@getList="getList"
@PreviewHTML="preview"
/>
<el-dialog v-if="editVisible" :visible.sync="editVisible" :close-on-click-modal="false" :title="title" width="700px"
fullscreen custom-class="base-dialog-wrapper">
<EmailForm :data="rowData" :system-level="systemLevel" :isDistinguishCriteria="isDistinguishCriteria"
@closeDialog="closeDialog" @getList="getList" @PreviewHTML="preview" />
</el-dialog>
<!-- 修改受试者状态 -->
<el-dialog
v-if="attachmentVisible"
:visible.sync="attachmentVisible"
:close-on-click-modal="false"
:title="$t('trials:emailManageCfg:title:fileName')"
width="80%"
custom-class="base-dialog-wrapper"
append-to-body
>
<AttachmentList
:business-scenario-enum="rowData.BusinessScenarioEnum"
:is-distinguish-criteria="rowData.IsDistinguishCriteria"
@getList="getList"
/>
<el-dialog v-if="attachmentVisible" :visible.sync="attachmentVisible" :close-on-click-modal="false"
:title="$t('trials:emailManageCfg:title:fileName')" width="80%" custom-class="base-dialog-wrapper" append-to-body>
<AttachmentList :business-scenario-enum="rowData.BusinessScenarioEnum"
:is-distinguish-criteria="rowData.IsDistinguishCriteria" @getList="getList" />
</el-dialog>
<!-- 预览模板 -->
<el-dialog
v-if="previewVisible"
:visible.sync="previewVisible"
:close-on-click-modal="false"
:title="$t('common:button:preview')"
fullscreen
custom-class="base-dialog-wrapper"
>
<div
style="
<el-dialog v-if="previewVisible" :visible.sync="previewVisible" :close-on-click-modal="false"
:title="$t('common:button:preview')" fullscreen custom-class="base-dialog-wrapper">
<div style="
display: flex;
align-items: flex-start;
justify-content: space-around;
flex-wrap: wrap;
"
>
">
<div style="min-width: 50%">
<!-- 邮件内容模版CN -->
<h3>{{ $t('dictionary:email:title:title1') }}</h3>
@ -630,3 +410,8 @@ export default {
},
}
</script>
<style lang="scss" scoped>
.box-body .search .base-search-form .el-form-item {
margin-bottom: 10px;
}
</style>

View File

@ -9,71 +9,36 @@
<!-- Reset Password -->
<div class="box-wrapper" v-if="active === 0">
<el-form
ref="resetForm"
v-loading="formLoading"
:model="form"
label-width="130px"
:rules="rules"
class="demo-ruleForm"
size="small"
>
<el-form ref="resetForm" v-loading="formLoading" :model="form" label-width="130px" :rules="rules"
class="demo-ruleForm" size="small">
<!-- 邮箱 -->
<el-form-item
:label="$t('passwordReset:form:email')"
prop="EmailOrPhone"
>
<el-form-item :label="$t('passwordReset:form:email')" prop="EmailOrPhone">
<el-col :span="18">
<el-input
v-model="form.EmailOrPhone"
autocomplete="off"
@change="handleEmailChange"
/>
<el-input v-model="form.EmailOrPhone" autocomplete="off" @change="handleEmailChange" />
</el-col>
</el-form-item>
<!-- 验证码 -->
<el-form-item
:label="$t('trials:researchForm:form:verifyCode')"
required
>
<el-form-item :label="$t('trials:researchForm:form:verifyCode')" required>
<el-col :span="18">
<el-form-item prop="VerificationCode">
<el-input v-model="form.VerificationCode" autocomplete="off" />
</el-form-item>
</el-col>
<el-col :span="6" style="text-align: right">
<el-button
size="small"
type="primary"
style="width: 80%"
:disabled="sendDisabled"
@click="handleSendCode"
>{{ sendTitle }}</el-button
>
<el-button size="small" type="primary" style="width: 80%" :disabled="sendDisabled"
@click="handleSendCode">{{ sendTitle }}</el-button>
</el-col>
</el-form-item>
</el-form>
<!-- 校验 -->
<el-button
size="small"
type="primary"
style="width: 50%; margin: auto; display: block"
:disabled="form.VerificationCode === '' || form.EmailOrPhone === ''"
@click="verifyCode"
>
<el-button size="small" type="primary" style="width: 50%; margin: auto; display: block"
:disabled="form.VerificationCode === '' || form.EmailOrPhone === ''" @click="verifyCode">
{{ $t('passwordReset:button:verify') }}
</el-button>
</div>
<div class="box-wrapper" v-show="active === 1">
<el-form
ref="resetForm2"
v-loading="formLoading"
:model="form"
:label-width="$i18n.locale === 'en' ? '180px' : '100px'"
:rules="rules2"
class="demo-ruleForm"
size="small"
>
<el-form ref="resetForm2" v-loading="formLoading" :model="form"
:label-width="$i18n.locale === 'en' ? '180px' : '100px'" :rules="rules2" class="demo-ruleForm" size="small">
<!-- 用户名 -->
<el-form-item :label="$t('passwordReset:form:userName')" prop="UserId">
<el-input v-model="form.UserName" disabled />
@ -105,27 +70,17 @@
<el-input v-model="form.UserType" disabled />
</el-form-item> -->
<!-- 新密码 -->
<el-form-item
class="my_new_pwd"
:label="$t('passwordReset:form:password')"
prop="NewPwd"
style="position: relative"
>
<el-form-item class="my_new_pwd" :label="$t('passwordReset:form:password')" prop="NewPwd"
style="position: relative">
<el-input v-model="form.NewPwd" show-password autocomplete="off" />
<span style="position: absolute; right: -30px">
<el-tooltip
:content="$t('passwordReset:form:passwordCentent')"
placement="top"
>
<el-tooltip :content="$t('passwordReset:form:passwordCentent')" placement="top">
<i class="el-icon-question" />
</el-tooltip>
</span>
</el-form-item>
<!-- 确认密码 -->
<el-form-item
:label="$t('passwordReset:form:confirmPassword')"
prop="CheckPass"
>
<el-form-item :label="$t('passwordReset:form:confirmPassword')" prop="CheckPass">
<el-input v-model="form.CheckPass" show-password autocomplete="off" />
</el-form-item>
</el-form>
@ -135,12 +90,7 @@
{{ $t('passwordReset:button:cancel') }}
</el-button>
<!-- 提交 -->
<el-button
size="small"
type="primary"
@click="onSubmit"
style="width: 46%"
>
<el-button size="small" type="primary" @click="onSubmit" style="width: 46%">
{{ $t('passwordReset:button:submit') }}
</el-button>
</div>
@ -388,10 +338,14 @@ export default {
}
},
onCancel() {
this.$refs['resetForm'].resetFields()
// this.$refs['resetForm'].resetFields()
Object.keys(this.form).forEach((key) => {
this.form[key] = ''
})
this.sendDisabled = false
this.sendTitle = this.$t('passwordReset:button:send')
countdown = 60
clearTimeout(timer)
this.active = 0
},
goBack() {
@ -404,12 +358,14 @@ export default {
.reset-wrapper {
padding: 20px;
}
.reset-wrapper .el-page-header {
line-height: 50px;
border: 1px solid #ebeef5;
border-radius: 4px;
background-color: #fff;
}
.reset-wrapper .box-wrapper {
width: 700px;
margin: 20px auto;
@ -425,6 +381,7 @@ export default {
.is-error.my_new_pwd {
margin-bottom: 45px;
}
.flexBox {
display: flex;
justify-content: center;

View File

@ -2,152 +2,66 @@
<div class="log">
<div ref="leftContainer" class="left">
<el-form :inline="true">
<el-form-item
:label="$t('system:loginLog:label:OptType')"
prop="OptType"
>
<el-select
v-model="searchData.OptType"
clearable
style="width: 120px"
>
<el-option
v-for="item of $d.UserOptType"
:key="'UserOptType' + item.label"
:value="item.value"
:label="item.label"
/>
<el-form-item :label="$t('system:loginLog:label:OptType')" prop="OptType">
<el-select v-model="searchData.OptTypeList" clearable style="width: 200px" multiple :collapse-tags="true">
<el-option v-for="item of $d.UserOptType" :key="'UserOptType' + item.label" :value="item.value"
:label="item.label" />
</el-select>
</el-form-item>
<el-form-item label="IP" prop="IP">
<el-input
v-model="searchData.IP"
size="small"
clearable
style="width: 120px"
/>
<el-input v-model="searchData.IP" size="small" clearable style="width: 120px" />
</el-form-item>
<el-form-item
:label="$t('system:loginLog:label:LoginFaildName')"
prop="LoginFaildName"
>
<el-input
v-model="searchData.LoginFaildName"
size="small"
clearable
style="width: 120px"
/>
<el-form-item :label="$t('system:loginLog:label:LoginFaildName')" prop="LoginFaildName">
<el-input v-model="searchData.LoginFaildName" size="small" clearable style="width: 120px" />
</el-form-item>
<el-form-item
:label="$t('system:loginLog:table:LoginUserName')"
prop="LoginFaildName"
>
<el-input
v-model="searchData.LoginUserName"
size="small"
clearable
style="width: 120px"
/>
<el-form-item :label="$t('system:loginLog:table:LoginUserName')" prop="LoginFaildName">
<el-input v-model="searchData.LoginUserName" size="small" clearable style="width: 120px" />
</el-form-item>
<el-form-item
:label="$t('system:loginLog:table:LoginUserType')"
prop="LoginUserTypeEnum"
>
<el-select
v-model="searchData.LoginUserTypeEnum"
clearable
style="width: 120px"
>
<el-option
v-for="item of $d.UserType"
:key="'UserType' + item.label"
:value="item.value"
:label="item.label"
/>
<el-form-item :label="$t('system:loginLog:table:LoginUserType')" prop="LoginUserTypeEnum">
<el-select v-model="searchData.LoginUserTypeEnum" clearable style="width: 120px">
<el-option v-for="item of $d.UserType" :key="'UserType' + item.label" :value="item.value"
:label="item.label" />
</el-select>
</el-form-item>
<el-form-item :label="$t('system:loginLog:label:CreateTime')">
<el-date-picker
v-model="datetimerange"
type="datetimerange"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
@change="handleDatetimeChange"
style="width: 380px"
/>
<el-date-picker v-model="datetimerange" type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']" @change="handleDatetimeChange" style="width: 380px" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="getList">
{{ $t('common:button:search') }}
</el-button>
<el-button
type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 45 }"
height="100"
:data="list"
class="table"
@sort-change="handleSortByColumn"
>
<el-table v-loading="loading" v-adaptive="{ bottomOffset: 45 }" height="100" :data="list" class="table"
@sort-change="handleSortByColumn">
<el-table-column type="index" width="50">
<template slot-scope="scope">
<span
style="
<span style="
display: flex;
align-items: center;
justify-content: flex-end;
"
>
<el-tooltip
class="item"
effect="dark"
:content="$t('system:loginLog:label:IsLoginUncommonly')"
placement="top"
style="margin-right: 3px"
v-if="scope.row.IsLoginUncommonly"
>
<i
v-if="scope.row.IsLoginUncommonly"
class="el-icon-warning icon-i"
></i>
">
<el-tooltip class="item" effect="dark" :content="$t('system:loginLog:label:IsLoginUncommonly')"
placement="top" style="margin-right: 3px" v-if="scope.row.IsLoginUncommonly">
<i v-if="scope.row.IsLoginUncommonly" class="el-icon-warning icon-i"></i>
</el-tooltip>
<span>{{ scope.$index + 1 }}</span>
</span>
</template>
</el-table-column>
<el-table-column
:label="$t('system:loginLog:table:OptType')"
prop="OptType"
min-width="150"
show-overflow-tooltip
sortable="custom"
>
<el-table-column :label="$t('system:loginLog:table:OptType')" prop="OptType" min-width="150"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{ $fd('UserOptType', scope.row.OptType) }}
</template>
</el-table-column>
<el-table-column
label="IP"
prop="IP"
min-width="150"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
:label="$t('trials:loginLog:table:IPRegion')"
prop="IPRegion"
min-width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="IP" prop="IP" min-width="150" sortable="custom" show-overflow-tooltip />
<el-table-column :label="$t('trials:loginLog:table:IPRegion')" prop="IPRegion" min-width="120"
show-overflow-tooltip sortable="custom" />
<!-- <el-table-column
:label="$t('system:loginLog:table:LoginFaildName')"
prop="LoginFaildName"
@ -155,20 +69,10 @@
show-overflow-tooltip
sortable="custom"
/> -->
<el-table-column
:label="$t('system:loginLog:table:LoginUserName')"
prop="ActionUserName"
min-width="140"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
:label="$t('system:loginLog:table:Aetionlserlype')"
prop="ActionUserType"
min-width="100"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column :label="$t('system:loginLog:table:LoginUserName')" prop="ActionUserName" min-width="140"
show-overflow-tooltip sortable="custom" />
<el-table-column :label="$t('system:loginLog:table:Aetionlserlype')" prop="ActionUserType" min-width="100"
show-overflow-tooltip sortable="custom" />
<!-- <el-table-column
:label="$t('system:loginLog:table:LoginUserType')"
prop="LoginUserTypeEnum"
@ -180,13 +84,8 @@
{{ $fd("UserType", scope.row.LoginUserTypeEnum) }}
</template>
</el-table-column> -->
<el-table-column
:label="$t('system:loginLog:table:OptUserName')"
prop="TargetIdentityUserName"
min-width="200"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column :label="$t('system:loginLog:table:OptUserName')" prop="TargetIdentityUserName" min-width="200"
sortable="custom" show-overflow-tooltip />
<!-- <el-table-column
:label="$t('system:loginLog:table:OptUserType')"
prop="OptUserTypeEnum"
@ -198,36 +97,19 @@
{{ $fd("UserType", scope.row.OptUserTypeEnum) }}
</template>
</el-table-column> -->
<el-table-column
:label="$t('system:loginLog:table:detail')"
min-width="120"
show-overflow-tooltip
>
<el-table-column :label="$t('system:loginLog:table:detail')" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<el-button
v-if="scope.row.JsonObj"
type="text"
@click="handleOpenDialog(scope.row)"
>
<el-button v-if="scope.row.JsonObj" type="text" @click="handleOpenDialog(scope.row)">
<span>{{ $t('system:loginLog:message:detail') }}</span>
</el-button>
</template>
</el-table-column>
<el-table-column
:label="$t('system:loginLog:table:CreateTime')"
prop="CreateTime"
min-width="180"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column :label="$t('system:loginLog:table:CreateTime')" prop="CreateTime" min-width="180"
sortable="custom" show-overflow-tooltip />
</el-table>
<div class="pagination" style="text-align: right; margin-top: 5px">
<pagination
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<pagination :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</div>
</div>
<detail :config="config" :JsonObj="JsonObj" />
@ -241,6 +123,7 @@ import moment from 'moment'
const searchDataDefault = () => {
return {
OptType: null,
OptTypeList: [],
Ip: '',
LoginFaildName: '',
LoginUserName: '',
@ -334,25 +217,30 @@ export default {
display: flex;
padding: 10px;
border-radius: 5px;
.left {
display: flex;
flex-direction: column;
width: 0;
flex-grow: 4;
// border-right: 1px solid #ccc;
.filter-container {
display: flex;
align-items: center;
margin: 5px;
}
.data-table {
flex: 1;
padding: 5px 0px;
}
.pagination-container {
text-align: right;
}
}
.icon-i {
color: #f56c6c;
cursor: pointer;

View File

@ -9,64 +9,28 @@
</el-form-item>
<!-- 研究方案号 -->
<el-form-item :label="$t('trials:trials-list:table:researchNumber')">
<el-input
v-model="searchData.ResearchProgramNo"
style="width: 100px"
clearable
/>
<el-input v-model="searchData.ResearchProgramNo" style="width: 100px" clearable />
</el-form-item>
<!-- 试验名称 -->
<el-form-item :label="$t('trials:trials-list:table:experimentName')">
<el-input
v-model="searchData.ExperimentName"
style="width: 100px"
clearable
/>
<el-input v-model="searchData.ExperimentName" style="width: 100px" clearable />
</el-form-item>
<!-- Sponsor -->
<el-form-item :label="$t('trials:trials-list:table:sponsor')">
<el-select
v-model="searchData.SponsorId"
style="width: 150px"
clearable
>
<el-option
v-for="item in sponsorList"
:key="item.Id"
:label="item.SponsorName"
:value="item.Id"
/>
<el-select v-model="searchData.SponsorId" style="width: 150px" clearable>
<el-option v-for="item in sponsorList" :key="item.Id" :label="item.SponsorName" :value="item.Id" />
</el-select>
</el-form-item>
<!-- 阅片标准 -->
<el-form-item
v-if="hasPermi(['role:ir'])"
:label="$t('trials:trials-list:table:IR_ReadingCriterionList')"
>
<el-select
v-model="searchData.CriterionType"
style="width: 150px"
clearable
>
<el-option
v-for="item in $d.CriterionType"
:key="item.id"
:label="item.label"
:value="item.value"
/>
<el-form-item v-if="hasPermi(['role:ir'])" :label="$t('trials:trials-list:table:IR_ReadingCriterionList')">
<el-select v-model="searchData.CriterionType" style="width: 150px" clearable>
<el-option v-for="item in $d.CriterionType" :key="item.id" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<!-- 联系人 -->
<el-form-item
v-if="hasPermi(['role:ir'])"
:label="$t('trials:trials-list:table:IR_PMEmailList')"
>
<el-input
v-model="searchData.PM_EMail"
style="width: 100px"
clearable
/>
<el-form-item v-if="hasPermi(['role:ir'])" :label="$t('trials:trials-list:table:IR_PMEmailList')">
<el-input v-model="searchData.PM_EMail" style="width: 100px" clearable />
</el-form-item>
<el-form-item>
<!-- <el-button type="text" @click="isShow = !isShow">More</el-button> -->
@ -75,33 +39,19 @@
{{ $t('common:button:search') }}
</el-button>
<!-- Reset -->
<el-button
type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
<!-- Export -->
<el-button
v-hasPermi="['trials:trials-list:export']"
type="primary"
icon="el-icon-download"
:loading="exportLoading"
@click="handleExportTrial"
>
<el-button v-hasPermi="['trials:trials-list:export']" type="primary" icon="el-icon-download"
:loading="exportLoading" @click="handleExportTrial">
{{ $t('common:button:export') }}
</el-button>
</el-form-item>
</el-form>
<span style="margin-left: auto">
<!-- New -->
<el-button
v-hasPermi="['trials:trials-list:new']"
icon="el-icon-plus"
type="primary"
@click="handleNew"
>
<el-button v-hasPermi="['trials:trials-list:new']" icon="el-icon-plus" type="primary" @click="handleNew">
{{ $t('common:button:new') }}
</el-button>
</span>
@ -112,190 +62,88 @@
<div style="padding: 10px">
<el-form label-width="140px">
<el-form-item label="Trial ID">
<el-input
v-model="searchData.Code"
placeholder="Trial ID"
style="width: 100%"
clearable
/>
<el-input v-model="searchData.Code" placeholder="Trial ID" style="width: 100%" clearable />
</el-form-item>
<el-form-item label="Indication">
<el-input
v-model="searchData.Indication"
placeholder="Indication"
style="width: 100%"
clearable
/>
<el-input v-model="searchData.Indication" placeholder="Indication" style="width: 100%" clearable />
</el-form-item>
<el-form-item label="Assessment Criteria">
<el-select
v-model="searchData.CriterionIds"
placeholder="Assessment Criteria"
style="width: 100%"
clearable
multiple
>
<el-select v-model="searchData.CriterionIds" placeholder="Assessment Criteria" style="width: 100%" clearable
multiple>
<!-- <el-option
v-for="(key,value) of dictionaryList.ReadingStandard"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dict.type.ReadingStandard"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-option v-for="item of dict.type.ReadingStandard" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="Sponsor">
<el-select
v-model="searchData.SponsorId"
placeholder="Sponsor"
style="width: 100%"
clearable
>
<el-option
v-for="item in sponsorList"
:key="item.Id"
:label="item.SponsorName"
:value="item.Id"
/>
<el-select v-model="searchData.SponsorId" placeholder="Sponsor" style="width: 100%" clearable>
<el-option v-for="item in sponsorList" :key="item.Id" :label="item.SponsorName" :value="item.Id" />
</el-select>
</el-form-item>
<el-form-item label="CRO">
<el-select
v-model="searchData.CROId"
placeholder="CRO"
style="width: 100%"
clearable
>
<el-option
v-for="item of croList"
:key="item.Id"
:label="item.CROName"
:value="item.Id"
/>
<el-select v-model="searchData.CROId" placeholder="CRO" style="width: 100%" clearable>
<el-option v-for="item of croList" :key="item.Id" :label="item.CROName" :value="item.Id" />
</el-select>
</el-form-item>
<el-form-item label="Phase">
<el-select
v-model="searchData.Phase"
placeholder="Phase"
style="width: 100%"
clearable
>
<el-option
v-for="item in phaseOptions"
:key="item.value"
:label="item.value"
:value="item.value"
/>
<el-select v-model="searchData.Phase" placeholder="Phase" style="width: 100%" clearable>
<el-option v-for="item in phaseOptions" :key="item.value" :label="item.value" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="ReviewType">
<el-select
v-model="searchData.ReviewTypeIds"
placeholder="ReviewType"
style="width: 100%"
clearable
multiple
>
<el-select v-model="searchData.ReviewTypeIds" placeholder="ReviewType" style="width: 100%" clearable
multiple>
<!-- <el-option
v-for="(key,value) of dictionaryList.ReviewType"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dict.type.ReviewType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-option v-for="item of dict.type.ReviewType" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="Modality">
<el-select
v-model="searchData.ModalityIds"
multiple
placeholder="Modality"
style="width: 100%"
clearable
>
<el-select v-model="searchData.ModalityIds" multiple placeholder="Modality" style="width: 100%" clearable>
<!-- <el-option
v-for="(key,value) of dictionaryList.ReadingType"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dict.type.ReadingType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-option v-for="item of dict.type.ReadingType" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="Expedited: ">
<el-select
v-model="searchData.Expedited"
value-key="value"
clearable
style="width: 100%"
>
<el-option
v-for="item in expeditedOption"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="searchData.Expedited" value-key="value" clearable style="width: 100%">
<el-option v-for="item in expeditedOption" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="BeginDate: ">
<el-date-picker
v-model="searchData.BeginDate"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
type="date"
:picker-options="beginPickerOption"
:clearable="false"
style="width: 100%"
/>
<el-date-picker v-model="searchData.BeginDate" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="date"
:picker-options="beginPickerOption" :clearable="false" style="width: 100%" />
</el-form-item>
<el-form-item label="EndDate: ">
<el-date-picker
v-model="searchData.EndDate"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
type="date"
:picker-options="endpickerOption"
:clearable="false"
style="width: 100%"
/>
<el-date-picker v-model="searchData.EndDate" value-format="yyyy-MM-dd" format="yyyy-MM-dd" type="date"
:picker-options="endpickerOption" :clearable="false" style="width: 100%" />
</el-form-item>
<el-form-item label="Attended Reviewer Type:">
<el-select
v-model="searchData.AttendedReviewerType"
placeholder="Attended Reviewer Type"
style="width: 100%"
clearable
>
<el-option
v-for="item of $d.AttendedReviewerType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="searchData.AttendedReviewerType" placeholder="Attended Reviewer Type"
style="width: 100%" clearable>
<el-option v-for="item of $d.AttendedReviewerType" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSelectSearch"
>Search</el-button
>
<el-button type="primary" @click="handleSelectSearch">Search</el-button>
<el-button type="primary" @click="handleReset">Reset</el-button>
<el-button type="primary" @click="isShow = false">Back</el-button>
</el-form-item>
@ -305,219 +153,89 @@
<!-- 项目列表 -->
<template slot="main-container">
<el-table
v-adaptive="{ bottomOffset: 60 }"
v-loading="listLoading"
:data="list"
stripe
height="100"
@selection-change="handleSelectChange"
@sort-change="handleSortChange"
@row-click="rowClick"
>
<el-table v-adaptive="{ bottomOffset: 60 }" v-loading="listLoading" :data="list" stripe height="100"
@selection-change="handleSelectChange" @sort-change="handleSortChange" @row-click="rowClick">
<el-table-column type="selection" align="left" width="45" />
<el-table-column type="index" width="40" align="left" />
<el-table-column
prop="TrialCode"
:label="$t('trials:trials-list:table:trialId')"
show-overflow-tooltip
sortable="custom"
width="120"
/>
<el-table-column
prop="ResearchProgramNo"
:label="$t('trials:trials-list:table:researchNumber')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column prop="TrialCode" :label="$t('trials:trials-list:table:trialId')" show-overflow-tooltip
sortable="custom" width="120" />
<el-table-column prop="ResearchProgramNo" :label="$t('trials:trials-list:table:researchNumber')"
show-overflow-tooltip sortable="custom" min-width="160" />
<el-table-column
prop="ExperimentName"
:label="$t('trials:trials-list:table:experimentName')"
show-overflow-tooltip
sortable="custom"
min-width="240"
/>
<el-table-column
prop="Sponsor"
:label="$t('trials:trials-list:table:sponsor')"
show-overflow-tooltip
sortable="custom"
min-width="120"
/>
<el-table-column
prop="TrialStatusStr"
:label="$t('trials:trials-list:table:status')"
show-overflow-tooltip
sortable="custom"
min-width="120"
>
<el-table-column prop="ExperimentName" :label="$t('trials:trials-list:table:experimentName')"
show-overflow-tooltip sortable="custom" min-width="240" />
<el-table-column prop="Sponsor" :label="$t('trials:trials-list:table:sponsor')" show-overflow-tooltip
sortable="custom" min-width="120" />
<el-table-column prop="TrialStatusStr" :label="$t('trials:trials-list:table:status')" show-overflow-tooltip
sortable="custom" min-width="120">
<template slot-scope="scope">
<el-tag
v-if="scope.row.TrialStatusStr === 'Initializing'"
type="info"
>{{ $fd('TrialStatusEnum', scope.row.TrialStatusStr) }}</el-tag
>
<el-tag
v-if="scope.row.TrialStatusStr === 'Ongoing'"
type="primary"
>{{ $fd('TrialStatusEnum', scope.row.TrialStatusStr) }}</el-tag
>
<el-tag
v-if="scope.row.TrialStatusStr === 'Completed'"
type="warning"
>{{ $fd('TrialStatusEnum', scope.row.TrialStatusStr) }}</el-tag
>
<el-tag
v-if="scope.row.TrialStatusStr === 'Stopped'"
type="danger"
>{{ $fd('TrialStatusEnum', scope.row.TrialStatusStr) }}</el-tag
>
<el-tag v-if="scope.row.TrialStatusStr === 'Initializing'" type="info">{{ $fd('TrialStatusEnum',
scope.row.TrialStatusStr) }}</el-tag>
<el-tag v-if="scope.row.TrialStatusStr === 'Ongoing'" type="primary">{{ $fd('TrialStatusEnum',
scope.row.TrialStatusStr) }}</el-tag>
<el-tag v-if="scope.row.TrialStatusStr === 'Completed'" type="warning">{{ $fd('TrialStatusEnum',
scope.row.TrialStatusStr) }}</el-tag>
<el-tag v-if="scope.row.TrialStatusStr === 'Stopped'" type="danger">{{ $fd('TrialStatusEnum',
scope.row.TrialStatusStr) }}</el-tag>
</template>
</el-table-column>
<el-table-column
v-if="hasPermi(['role:pm', 'role:apm'])"
prop="ExpetiedTaskCount"
:label="$t('trials:trials-list:table:ExpetiedTaskCount')"
show-overflow-tooltip
sortable="custom"
min-width="120"
/>
<el-table-column
v-if="hasPermi(['role:pm', 'role:apm'])"
prop="ReReadingApprovalCount"
:label="$t('trials:trials-list:table:ReReadingApprovalCount')"
show-overflow-tooltip
sortable="custom"
min-width="180"
/>
<el-table-column
v-if="hasPermi(['role:pm', 'role:apm'])"
prop="PendingReconciliationCount"
:label="$t('trials:trials-list:table:PendingReconciliationCount')"
show-overflow-tooltip
sortable="custom"
min-width="140"
/>
<el-table-column
v-if="hasPermi(['role:pm', 'role:apm'])"
prop="PendingResponseCount"
:label="$t('trials:trials-list:table:PendingResponseCount')"
show-overflow-tooltip
sortable="custom"
min-width="140"
/>
<el-table-column
v-if="hasPermi(['role:crc', 'role:cra'])"
prop="CRC_UrgentCount"
:label="$t('trials:trials-list:table:CRC_UrgentCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:crc', 'role:cra'])"
prop="CRC_QCQuestionCount"
:label="$t('trials:trials-list:table:CRC_QCQuestionCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:crc', 'role:cra'])"
prop="CRC_CheckQuestionCount"
:label="$t('trials:trials-list:table:CRC_CheckQuestionCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:ir'])"
prop="IR_ReadingCriterionList"
:label="$t('trials:trials-list:table:IR_ReadingCriterionList')"
show-overflow-tooltip
min-width="160"
>
<el-table-column v-if="hasPermi(['role:pm', 'role:apm'])" prop="ExpetiedTaskCount"
:label="$t('trials:trials-list:table:ExpetiedTaskCount')" show-overflow-tooltip sortable="custom"
min-width="120" />
<el-table-column v-if="hasPermi(['role:pm', 'role:apm'])" prop="ReReadingApprovalCount"
:label="$t('trials:trials-list:table:ReReadingApprovalCount')" show-overflow-tooltip sortable="custom"
min-width="180" />
<el-table-column v-if="hasPermi(['role:pm', 'role:apm'])" prop="PendingReconciliationCount"
:label="$t('trials:trials-list:table:PendingReconciliationCount')" show-overflow-tooltip sortable="custom"
min-width="140" />
<el-table-column v-if="hasPermi(['role:pm', 'role:apm'])" prop="PendingResponseCount"
:label="$t('trials:trials-list:table:PendingResponseCount')" show-overflow-tooltip sortable="custom"
min-width="140" />
<el-table-column v-if="hasPermi(['role:crc', 'role:cra'])" prop="CRC_UrgentCount"
:label="$t('trials:trials-list:table:CRC_UrgentCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:crc', 'role:cra'])" prop="CRC_QCQuestionCount"
:label="$t('trials:trials-list:table:CRC_QCQuestionCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:crc', 'role:cra'])" prop="CRC_CheckQuestionCount"
:label="$t('trials:trials-list:table:CRC_CheckQuestionCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:ir'])" prop="IR_ReadingCriterionList"
:label="$t('trials:trials-list:table:IR_ReadingCriterionList')" show-overflow-tooltip min-width="160">
<template slot-scope="scope">
{{ scope.row.IR_ReadingCriterionList.join(', ') }}
</template>
</el-table-column>
<el-table-column
v-if="hasPermi(['role:ir'])"
prop="IR_UrgentCount"
:label="$t('trials:trials-list:table:IR_UrgentCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:ir'])"
prop="IR_UnReadCount"
:label="$t('trials:trials-list:table:IR_UnReadCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:ir'])"
prop="IR_TotalReadCount"
:label="$t('trials:trials-list:table:IR_TotalReadCount')"
show-overflow-tooltip
sortable="custom"
min-width="170"
/>
<el-table-column
v-if="hasPermi(['role:ir'])"
prop="IR_PMEmailList"
:label="$t('trials:trials-list:table:IR_PMEmailList')"
show-overflow-tooltip
min-width="170"
>
<el-table-column v-if="hasPermi(['role:ir'])" prop="IR_UrgentCount"
:label="$t('trials:trials-list:table:IR_UrgentCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:ir'])" prop="IR_UnReadCount"
:label="$t('trials:trials-list:table:IR_UnReadCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:ir'])" prop="IR_TotalReadCount"
:label="$t('trials:trials-list:table:IR_TotalReadCount')" show-overflow-tooltip sortable="custom"
min-width="170" />
<el-table-column v-if="hasPermi(['role:ir'])" prop="IR_PMEmailList"
:label="$t('trials:trials-list:table:IR_PMEmailList')" show-overflow-tooltip min-width="170">
<template slot-scope="scope">
{{ scope.row.IR_PMEmailList.join(', ') }}
</template>
</el-table-column>
<el-table-column
v-if="hasPermi(['role:iqc'])"
prop="IQC_UrgentCount"
:label="$t('trials:trials-list:table:IQC_UrgentCount')"
show-overflow-tooltip
sortable="custom"
min-width="140"
/>
<el-table-column
v-if="hasPermi(['role:iqc'])"
prop="IQC_ToBeClaimedCount"
:label="$t('trials:trials-list:table:IQC_ToBeClaimedCount')"
show-overflow-tooltip
sortable="custom"
min-width="140"
/>
<el-table-column
v-if="hasPermi(['role:iqc'])"
prop="IQC_AuditToBeDealedCount"
:label="$t('trials:trials-list:table:IQC_AuditToBeDealedCount')"
show-overflow-tooltip
sortable="custom"
min-width="140"
/>
<el-table-column
v-if="hasPermi(['role:iqc'])"
prop="IQC_QuestionToBeDealedCount"
:label="$t('trials:trials-list:table:IQC_QuestionToBeDealedCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:mim'])"
prop="MIM_UrgentCount"
:label="$t('trials:trials-list:table:MIM_UrgentCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column v-if="hasPermi(['role:iqc'])" prop="IQC_UrgentCount"
:label="$t('trials:trials-list:table:IQC_UrgentCount')" show-overflow-tooltip sortable="custom"
min-width="140" />
<el-table-column v-if="hasPermi(['role:iqc'])" prop="IQC_ToBeClaimedCount"
:label="$t('trials:trials-list:table:IQC_ToBeClaimedCount')" show-overflow-tooltip sortable="custom"
min-width="140" />
<el-table-column v-if="hasPermi(['role:iqc'])" prop="IQC_AuditToBeDealedCount"
:label="$t('trials:trials-list:table:IQC_AuditToBeDealedCount')" show-overflow-tooltip sortable="custom"
min-width="140" />
<el-table-column v-if="hasPermi(['role:iqc'])" prop="IQC_QuestionToBeDealedCount"
:label="$t('trials:trials-list:table:IQC_QuestionToBeDealedCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:mim'])" prop="MIM_UrgentCount"
:label="$t('trials:trials-list:table:MIM_UrgentCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<!-- <el-table-column
v-if="hasPermi(['role:mim'])"
prop="MIM_UrgentCount"
@ -526,61 +244,23 @@
sortable="custom"
min-width="160"
/> -->
<el-table-column
v-if="hasPermi(['role:mim'])"
prop="MIM_PendingReviewCount"
:label="$t('trials:trials-list:table:MIM_PendingReviewCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:mim'])"
prop="MIM_PendingResponseCount"
:label="$t('trials:trials-list:table:MIM_PendingResponseCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:spm', 'role:cpm'])"
prop="SPM_ReReadingApprovalCount"
:label="$t('trials:trials-list:table:SPM_ReReadingApprovalCount')"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
v-if="hasPermi(['role:spm', 'role:cpm'])"
prop="SPM_ReviewerSelectApprovalCount"
:label="
$t('trials:trials-list:table:SPM_ReviewerSelectApprovalCount')
"
show-overflow-tooltip
sortable="custom"
min-width="160"
/>
<el-table-column
prop="CreateTime"
:label="$t('trials:trials-list:table:createDate')"
show-overflow-tooltip
sortable="custom"
width="180"
/>
<el-table-column
:label="$t('common:action:action')"
width="260"
align="left"
fixed="right"
>
<el-table-column v-if="hasPermi(['role:mim'])" prop="MIM_PendingReviewCount"
:label="$t('trials:trials-list:table:MIM_PendingReviewCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:mim'])" prop="MIM_PendingResponseCount"
:label="$t('trials:trials-list:table:MIM_PendingResponseCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:spm', 'role:cpm'])" prop="SPM_ReReadingApprovalCount"
:label="$t('trials:trials-list:table:SPM_ReReadingApprovalCount')" show-overflow-tooltip sortable="custom"
min-width="160" />
<el-table-column v-if="hasPermi(['role:spm', 'role:cpm'])" prop="SPM_ReviewerSelectApprovalCount" :label="$t('trials:trials-list:table:SPM_ReviewerSelectApprovalCount')
" show-overflow-tooltip sortable="custom" min-width="160" />
<el-table-column prop="CreateTime" :label="$t('trials:trials-list:table:createDate')" show-overflow-tooltip
sortable="custom" width="180" />
<el-table-column :label="$t('common:action:action')" width="260" align="left" fixed="right">
<template slot-scope="scope">
<!-- 详情 -->
<el-button
v-hasPermi="['trials:trials-list:panel']"
circle
icon="el-icon-info"
:disabled="
(scope.row.TrialStatusStr === 'Initializing' &&
<el-button v-hasPermi="['trials:trials-list:panel']" circle icon="el-icon-info" :disabled="(scope.row.TrialStatusStr === 'Initializing' &&
!hasPermi(['role:pm'])) ||
scope.row.IsDeleted ||
((scope.row.TrialStatusStr === 'Completed' ||
@ -588,40 +268,25 @@
!(
hasPermi(['role:qa']) ||
hasPermi(['role:ea']) ||
hasPermi(['role:pm'])
hasPermi(['role:pm']) ||
hasPermi(['role:op']) ||
hasPermi(['role:dev']) ||
hasPermi(['role:admin'])
))
"
:title="$t('trials:trials-list:action:panel')"
@click.stop="handleDetail(scope.row)"
/>
" :title="$t('trials:trials-list:action:panel')" @click.stop="handleDetail(scope.row)" />
<!-- 编辑项目基本信息 -->
<el-button
v-hasPermi="['trials:trials-list:edit']"
circle
icon="el-icon-edit-outline"
:disabled="scope.row.IsDeleted"
:title="$t('trials:trials-list:action:edit')"
@click.stop="handleEdit(scope.row)"
/>
<el-button v-hasPermi="['trials:trials-list:edit']" circle icon="el-icon-edit-outline"
:disabled="scope.row.IsDeleted" :title="$t('trials:trials-list:action:edit')"
@click.stop="handleEdit(scope.row)" />
<!-- 修改项目状态 -->
<el-button
v-hasPermi="['trials:trials-list:status']"
circle
icon="el-icon-edit"
:disabled="scope.row.IsDeleted"
:title="$t('trials:trials-list:action:status')"
@click.stop="handleStatus(scope.row)"
/>
<el-button v-hasPermi="['trials:trials-list:status']" circle icon="el-icon-edit"
:disabled="scope.row.IsDeleted" :title="$t('trials:trials-list:action:status')"
@click.stop="handleStatus(scope.row)" />
<!--项目文档-->
<el-button
v-hasPermi="[
<el-button v-hasPermi="[
'trials:trials-panel:trial-summary:trial-document:inspect',
'trials:trials-panel:trial-summary:trial-document:manage',
]"
circle
icon="el-icon-folder-opened"
:disabled="
(scope.row.TrialStatusStr === 'Initializing' &&
]" circle icon="el-icon-folder-opened" :disabled="(scope.row.TrialStatusStr === 'Initializing' &&
!hasPermi(['role:pm'])) ||
scope.row.IsDeleted ||
((scope.row.TrialStatusStr === 'Completed' ||
@ -631,22 +296,11 @@
hasPermi(['role:ea']) ||
hasPermi(['role:pm'])
))
"
:title="$t('trials:trials-list:action:trialDocument')"
@click.stop="toTrialDocument(scope.row)"
/>
" :title="$t('trials:trials-list:action:trialDocument')" @click.stop="toTrialDocument(scope.row)" />
<!-- 废除项目 -->
<el-button
v-hasPermi="['trials:trials-list:abolish']"
circle
icon="el-icon-delete"
:disabled="
scope.row.IsDeleted ||
<el-button v-hasPermi="['trials:trials-list:abolish']" circle icon="el-icon-delete" :disabled="scope.row.IsDeleted ||
scope.row.TrialStatusStr !== 'Initializing'
"
:title="$t('trials:trials-list:action:abolition')"
@click.stop="handleAbandon(scope.row)"
/>
" :title="$t('trials:trials-list:action:abolition')" @click.stop="handleAbandon(scope.row)" />
<!-- 代办详情-->
<!-- <el-button-->
<!-- v-hasPermi="['trials:trials-list:abolish']"-->
@ -661,61 +315,26 @@
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</template>
<!-- 新增/编辑项目 -->
<el-dialog
v-if="dialogVisible"
:visible.sync="dialogVisible"
:title="title"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
>
<TrialForm
:trial-id="currentId"
@getList="getList"
@closeDialog="closeDialog"
/>
<el-dialog v-if="dialogVisible" :visible.sync="dialogVisible" :title="title" :fullscreen="true" append-to-body
custom-class="base-dialog-wrapper">
<TrialForm :trial-id="currentId" @getList="getList" @closeDialog="closeDialog" />
</el-dialog>
<!-- 修改项目状态 -->
<el-dialog
v-if="statusVisible"
:visible.sync="statusVisible"
:close-on-click-modal="false"
:title="$t('trials:trials-list:dialogTitle:changeStatus')"
width="700px"
custom-class="base-dialog-wrapper"
append-to-body
>
<TrialStatusForm
:data="currentRow"
@closeDialog="closeStatusDialog"
@getList="getList"
/>
<el-dialog v-if="statusVisible" :visible.sync="statusVisible" :close-on-click-modal="false"
:title="$t('trials:trials-list:dialogTitle:changeStatus')" width="700px" custom-class="base-dialog-wrapper"
append-to-body>
<TrialStatusForm :data="currentRow" @closeDialog="closeStatusDialog" @getList="getList" />
</el-dialog>
<el-dialog
v-if="doneDialogVisible"
:visible.sync="doneDialogVisible"
:title="doneTitle"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
>
<DoneList
:trial-id="currentId"
@getList="getList"
@closeDialog="doneDialogVisible = false"
/>
<el-dialog v-if="doneDialogVisible" :visible.sync="doneDialogVisible" :title="doneTitle" :fullscreen="true"
append-to-body custom-class="base-dialog-wrapper">
<DoneList :trial-id="currentId" @getList="getList" @closeDialog="doneDialogVisible = false" />
</el-dialog>
</BaseContainer>
</template>
@ -954,7 +573,10 @@ export default {
!(
this.hasPermi(['role:qa']) ||
this.hasPermi(['role:ea']) ||
this.hasPermi(['role:pm'])
this.hasPermi(['role:pm']) ||
hasPermi(['role:op']) ||
hasPermi(['role:dev']) ||
hasPermi(['role:admin'])
)
) {
return

View File

@ -2,31 +2,14 @@
<BaseContainer>
<template slot="search-container">
<el-form :inline="true">
<el-form-item
:label="$t('trials:loginLog:table:optType')"
prop="OptType"
>
<el-select
v-model="searchData.OptType"
clearable
style="width: 120px"
>
<el-option
v-for="item of $d.UserOptType"
v-show="item.value !== 3 && item.value !== 10 && item.value !== 9"
:key="'UserOptType' + item.label"
:value="item.value"
:label="item.label"
/>
<el-form-item :label="$t('trials:loginLog:table:optType')" prop="OptType">
<el-select v-model="searchData.OptTypeList" clearable multiple :collapse-tags="true" style="width: 200px">
<el-option v-for="item of $d.UserOptType" v-show="item.value !== 3 && item.value !== 10 && item.value !== 9"
:key="'UserOptType' + item.label" :value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item label="IP" prop="IP">
<el-input
v-model="searchData.IP"
size="small"
clearable
style="width: 120px"
/>
<el-input v-model="searchData.IP" size="small" clearable style="width: 120px" />
</el-form-item>
<!-- <el-form-item
:label="$t('trials:loginLog:table:incorrectUserName')"
@ -40,108 +23,52 @@
style="width: 120px"
/>
</el-form-item> -->
<el-form-item
:label="$t('trials:loginLog:table:userName')"
prop="LoginUserName"
v-if="!isMine"
>
<el-form-item :label="$t('trials:loginLog:table:userName')" prop="LoginUserName" v-if="!isMine">
<el-select v-model="searchData.IdentityUserId" clearable style="width: 120px">
<el-option
v-for="item of trialUserList"
:key="item.IdentityUserId"
:value="item.IdentityUserId"
:label="item.UserName"
/>
<el-option v-for="item of trialUserList" :key="item.IdentityUserId" :value="item.IdentityUserId"
:label="item.UserName" />
</el-select>
</el-form-item>
<el-form-item
:label="$t('trials:loginLog:table:optUserName')"
prop="TargetIdentityUserId"
v-if="!isMine"
>
<el-form-item :label="$t('trials:loginLog:table:optUserName')" prop="TargetIdentityUserId" v-if="!isMine">
<el-select v-model="searchData.TargetIdentityUserId" clearable style="width: 120px">
<el-option
v-for="item of trialUserList"
:key="item.IdentityUserId"
:value="item.IdentityUserId"
:label="item.UserName"
/>
<el-option v-for="item of trialUserList" :key="item.IdentityUserId" :value="item.IdentityUserId"
:label="item.UserName" />
</el-select>
</el-form-item>
<el-form-item
:label="$t('trials:loginLog:table:userType')"
prop="OptType"
v-if="!isMine"
>
<el-select
v-model="searchData.LoginUserType"
clearable
style="width: 120px"
>
<el-option
v-for="item of $d.UserType"
v-show="item.value !== 7 && item.value !== 8"
:key="'UserType' + item.label"
:value="item.label"
:label="item.label"
/>
<el-form-item :label="$t('trials:loginLog:table:userType')" prop="OptType" v-if="!isMine">
<el-select v-model="searchData.LoginUserType" clearable style="width: 120px">
<el-option v-for="item of $d.UserType" v-show="item.value !== 7 && item.value !== 8"
:key="'UserType' + item.label" :value="item.label" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item :label="$t('trials:loginLog:table:createTime')">
<el-date-picker
v-model="datetimerange"
type="datetimerange"
:default-time="['00:00:00', '23:59:59']"
<el-date-picker v-model="datetimerange" type="datetimerange" :default-time="['00:00:00', '23:59:59']"
:start-placeholder="$t('trials:loginLog:table:beginTime')"
:end-placeholder="$t('trials:loginLog:table:endTime')"
value-format="yyyy-MM-dd HH:mm:ss"
@change="handleDatetimeChange"
/>
:end-placeholder="$t('trials:loginLog:table:endTime')" value-format="yyyy-MM-dd HH:mm:ss"
@change="handleDatetimeChange" />
</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"
>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
</el-form-item>
</el-form>
</template>
<template slot="main-container">
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: isMine ? 80 : 60 }"
height="100"
:data="list"
class="table"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'CreateTime', order: 'descending' }"
>
<el-table v-loading="loading" v-adaptive="{ bottomOffset: isMine ? 80 : 60 }" height="100" :data="list"
class="table" @sort-change="handleSortByColumn" :default-sort="{ prop: 'CreateTime', order: 'descending' }">
<el-table-column type="index" width="50" />
<el-table-column
:label="$t('trials:loginLog:table:optType')"
prop="OptType"
min-width="90"
show-overflow-tooltip
sortable="custom"
>
<el-table-column :label="$t('trials:loginLog:table:optType')" prop="OptType" min-width="90"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{ $fd('UserOptType', scope.row.OptType) }}
</template>
</el-table-column>
<el-table-column
label="IP"
prop="IP"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="IP" prop="IP" min-width="90" show-overflow-tooltip sortable="custom" />
<!-- <el-table-column
:label="$t('trials:loginLog:table:IPRegion')"
prop="IPRegion"
@ -157,20 +84,10 @@
show-overflow-tooltip
sortable="custom"
/> -->
<el-table-column
:label="$t('trials:loginLog:table:userName')"
prop="ActionUserName"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
:label="$t('trials:loginLog:table:Aetionlserlype')"
prop="ActionUserType"
min-width="100"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column :label="$t('trials:loginLog:table:userName')" prop="ActionUserName" min-width="90"
show-overflow-tooltip sortable="custom" />
<el-table-column :label="$t('trials:loginLog:table:Aetionlserlype')" prop="ActionUserType" min-width="100"
show-overflow-tooltip sortable="custom" />
<!-- <el-table-column
:label="$t('trials:loginLog:table:userType')"
prop="LoginUserTypeEnum"
@ -182,14 +99,8 @@
{{ $fd('UserType', scope.row.LoginUserTypeEnum) }}
</template>
</el-table-column> -->
<el-table-column
v-if="!isMine"
:label="$t('trials:loginLog:table:optUserName')"
prop="TargetIdentityUserName"
min-width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column v-if="!isMine" :label="$t('trials:loginLog:table:optUserName')" prop="TargetIdentityUserName"
min-width="120" show-overflow-tooltip sortable="custom" />
<!-- <el-table-column
v-if="!isMine"
:label="$t('trials:loginLog:table:optUserType')"
@ -202,37 +113,19 @@
{{ $fd('UserType', scope.row.OptUserTypeEnum) }}
</template>
</el-table-column> -->
<el-table-column
:label="$t('trials:loginLog:table:detail')"
min-width="80"
show-overflow-tooltip
>
<el-table-column :label="$t('trials:loginLog:table:detail')" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
<el-button
v-if="scope.row.JsonObj"
type="text"
@click="handleOpenDialog(scope.row)"
>
<el-button v-if="scope.row.JsonObj" type="text" @click="handleOpenDialog(scope.row)">
<span>{{ $t('trials:loginLog:message:detail') }}</span>
</el-button>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:loginLog:table:createTime')"
prop="CreateTime"
min-width="90"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column :label="$t('trials:loginLog:table:createTime')" prop="CreateTime" min-width="90"
show-overflow-tooltip sortable="custom" />
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</template>
<detail :config="config" :JsonObj="JsonObj" />
</BaseContainer>
@ -247,6 +140,7 @@ const searchDataDefault = () => {
return {
TrialId: '',
OptType: null,
OptTypeList: [],
Ip: '',
LoginFaildName: '',
LoginUserName: '',

View File

@ -10,43 +10,20 @@
)
}}</el-divider>
<div class="form-group">
<div
class="upload"
style="margin-right: 10px"
:disabled="limitLength"
v-if="!limitLength"
>
<input
multiple="multiple"
webkitdirectory=""
directory
accept="*/*"
type="file"
name="uploadFolder"
class="select-file"
title=""
@change="beginScanFiles($event)"
v-if="
<div class="upload" style="margin-right: 10px" :disabled="limitLength" v-if="!limitLength">
<input multiple="multiple" webkitdirectory="" directory accept="*/*" type="file" name="uploadFolder"
class="select-file" title="" @change="beginScanFiles($event)" v-if="
!loading &&
(!limitLength ||
(fileList.length < limitLength && limitLength > 1))
"
/>
" />
<div class="btn-select">
{{ $t('trials:trialDocument:button:selectFolder') }}
</div>
</div>
<div class="upload">
<input
class="select-file"
multiple=""
:accept="faccept.join(',')"
type="file"
name="uploadFile"
title=""
@change="beginScanFiles($event)"
v-if="!loading && (!limitLength || fileList.length < limitLength)"
/>
<input class="select-file" multiple="" :accept="faccept.join(',')" type="file" name="uploadFile" title=""
@change="beginScanFiles($event)" v-if="!loading && (!limitLength || fileList.length < limitLength)" />
<div class="btn-select">
{{ $t('trials:trialDocument:button:select') }}
</div>
@ -54,82 +31,45 @@
</div>
</form>
<!-- 文件列表 -->
<el-table
ref="filesTable"
:data="fileList"
class="dicomFiles-table"
height="300"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
:selectable="(row, index) => row.status !== 2 && !loading"
/>
<el-table ref="filesTable" :data="fileList" class="dicomFiles-table" height="300"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" :selectable="(row, index) => row.status !== 2 && !loading" />
<el-table-column type="index" width="50" />
<!-- 文件名称 -->
<el-table-column
prop="name"
:label="$t('trials:trialDocument:table:fileName')"
min-width="100"
/>
<el-table-column prop="name" :label="$t('trials:trialDocument:table:fileName')" min-width="100" />
<!-- 文件大小 -->
<el-table-column
prop="size"
:label="$t('trials:trialDocument:table:fileSize')"
>
<el-table-column prop="size" :label="$t('trials:trialDocument:table:fileSize')">
<template slot-scope="scope">
<span>{{
scope.row.size && scope.row.size > 0
? `${(scope.row.size / 1024 / 1024).toFixed(3)}MB`
: ''
: '0MB'
}}</span>
</template>
</el-table-column>
<!-- 文件类型 -->
<el-table-column
prop="type"
:label="$t('trials:trialDocument:table:fileType')"
/>
<el-table-column prop="type" :label="$t('trials:trialDocument:table:fileType')" />
<!-- 上传状态 -->
<el-table-column
prop="status"
:label="$t('trials:trialDocument:table:uploadStatus')"
min-width="100"
>
<el-table-column prop="status" :label="$t('trials:trialDocument:table:uploadStatus')" min-width="100">
<template slot-scope="scope">
<el-tag
:type="['warning', 'info', 'success', 'danger'][scope.row.status]"
v-if="scope.row.status || scope.row.status === 0"
>{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
<el-tag :type="['warning', 'info', 'success', 'danger'][scope.row.status]"
v-if="scope.row.status || scope.row.status === 0">{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:trialDocument:table:failedFileCount')"
min-width="150"
show-overflow-tooltip
>
<el-table-column :label="$t('trials:trialDocument:table:failedFileCount')" min-width="150"
show-overflow-tooltip>
<template slot-scope="scope">
<el-progress
color="#409eff"
:percentage="
((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
<el-progress color="#409eff" :percentage="scope.row.size && scope.row.size > 0 ? ((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
1
"
/>
: ((scope.row.uploadFileSize * 100) / 1).toFixed(2) *
1" />
</template>
</el-table-column>
<el-table-column :label="$t('common:action:action')">
<template slot-scope="scope">
<el-button
size="mini"
icon="el-icon-delete"
circle
:disabled="loading"
:title="$t('trials:trialDocument:action:delete')"
@click="handleRemoveFile(scope.row)"
/>
<el-button size="mini" icon="el-icon-delete" circle :disabled="loading"
:title="$t('trials:trialDocument:action:delete')" @click="handleRemoveFile(scope.row)" />
</template>
</el-table-column>
</el-table>
@ -139,13 +79,8 @@
<span style="margin-right: 10px">{{
$store.state.trials.uploadTip
}}</span>
<el-button
size="small"
type="primary"
:disabled="selectArr.length == 0"
:loading="loading"
@click="beginUpload"
>
<el-button size="small" type="primary" :disabled="selectArr.length == 0" :loading="loading"
@click="beginUpload">
{{ $t('trials:trialDocument:action:upload') }}
</el-button>
</div>
@ -265,11 +200,11 @@ export default {
type: extendName.split('.')[1],
status: 0,
file: files[i],
id: `${files[i].lastModified}${
files[i].name
id: `${files[i].lastModified}${files[i].name
}${new Date().getTime()}${i + 1}`,
fileType: files[i].type,
uploadFileSize: 0,
webkitRelativePath: files[i].webkitRelativePath
}
this.fileList.push(obj)
this.$refs.filesTable.toggleRowSelection(obj, true)
@ -348,7 +283,8 @@ export default {
FileName: file.name,
FilePath: this.$getObjectName(res.url),
FileSize: file.size,
FileFormat: fileType,
FileFormat: fileType.split('.')[1],
catalogue: file.webkitRelativePath
})
let flag = arr.every((item) => item.status === 2)
if (flag) {
@ -390,7 +326,7 @@ export default {
(percentage, checkpoint, lastPer) => {
item.uploadFileSize += checkpoint.size * (percentage - lastPer)
if (item.uploadFileSize > file.fileSize) {
item.uploadFileSize = file.fileSize
item.uploadFileSize = file.fileSize > 0 ? file.fileSize : 1
}
}
)
@ -431,7 +367,6 @@ export default {
} else {
this.fileInput.accept = this.faccept.join(',')
}
console.log(this.fileInput)
this.fileInput.click()
},
},
@ -481,6 +416,7 @@ export default {
background: #428bca;
border-color: #428bca;
color: #fff;
.select-file {
height: 30px;
width: 90px;
@ -491,6 +427,7 @@ export default {
opacity: 0;
font-size: 0;
}
.btn-select {
//
width: 90px;

View File

@ -15,7 +15,7 @@
v-for="(item, index) of siteOptions"
:key="index"
:label="item.TrialSiteCode"
:value="item.SiteId"
:value="item.TrialSiteId"
/>
</el-select>
</el-form-item>

View File

@ -2,93 +2,40 @@
<div v-loading="loading" class="non-dicom-wrapper">
<!-- <h4 class="box-title">既往放疗史</h4> -->
<div style="text-align: right">
<el-button
v-if="allowAddOrEdit"
v-hasPermi="['trials:trials-panel:visit:crc-upload:edit']"
icon="el-icon-plus"
type="primary"
size="small"
@click.native.prevent="handleAdd"
>
<el-button v-if="allowAddOrEdit" v-hasPermi="['trials:trials-panel:visit:crc-upload:edit']" icon="el-icon-plus"
type="primary" size="small" @click.native.prevent="handleAdd">
{{ $t('common:button:new') }}
</el-button>
<el-button
icon="el-icon-view"
type="primary"
size="small"
:disabled="nonDicomStudyList.length === 0"
@click="handlePreviewAllVisitFiles"
>
<el-button icon="el-icon-view" type="primary" size="small" :disabled="nonDicomStudyList.length === 0"
@click="handlePreviewAllVisitFiles">
{{ $t('trials:uploadNonDicoms:button:preview') }}
</el-button>
</div>
<el-table
:data="nonDicomStudyList"
style="width: 100%"
:default-sort="{ prop: 'CreateTime', order: 'ascending' }"
:row-class-name="tableRowClassName"
>
<el-table :data="nonDicomStudyList" style="width: 100%" :default-sort="{ prop: 'CreateTime', order: 'ascending' }"
:row-class-name="tableRowClassName">
<!-- 检查编号 -->
<el-table-column
prop="CodeView"
:label="$t('trials:uploadNonDicoms:table:studyId')"
sortable
/>
<el-table-column prop="CodeView" :label="$t('trials:uploadNonDicoms:table:studyId')" sortable />
<!-- 检查名称 -->
<el-table-column
v-if="relationInfo.IsShowStudyName"
prop="StudyName"
:label="$t('trials:uploadNonDicoms:table:StudyName')"
sortable
/>
<el-table-column v-if="relationInfo.IsShowStudyName" prop="StudyName"
:label="$t('trials:uploadNonDicoms:table:StudyName')" sortable />
<!-- 检查类型 -->
<el-table-column
prop="Modality"
:label="$t('trials:uploadNonDicoms:table:modality')"
sortable
/>
<el-table-column prop="Modality" :label="$t('trials:uploadNonDicoms:table:modality')" sortable />
<!-- 检查部位 -->
<el-table-column
prop="BodyPart"
:label="$t('trials:uploadNonDicoms:table:bodyPart')"
sortable
>
<el-table-column prop="BodyPart" :label="$t('trials:uploadNonDicoms:table:bodyPart')" sortable>
<template slot-scope="scope">
{{ getBodyPart(scope.row.BodyPart) }}
</template>
</el-table-column>
<!-- 文件 -->
<el-table-column
prop="FileCount"
:label="$t('trials:uploadNonDicoms:table:files')"
sortable
>
<el-table-column prop="FileCount" :label="$t('trials:uploadNonDicoms:table:files')" sortable>
<template slot-scope="scope">
<el-popover
v-if="scope.row.FileCount"
trigger="click"
placement="bottom"
popper-class="imgTable"
>
<el-table
v-loading="filesLoading"
:data="nonDicomfilesList"
height="300"
size="small"
:row-class-name="tableRowClassName"
>
<el-popover v-if="scope.row.FileCount" trigger="click" placement="bottom" popper-class="imgTable">
<el-table v-loading="filesLoading" :data="nonDicomfilesList" height="300" size="small"
:row-class-name="tableRowClassName">
<!-- 文件名称 -->
<el-table-column
prop="FileName"
:label="$t('trials:uploadNonDicoms:table:fileName')"
width="200"
/>
<el-table-column
prop="FileSize"
:label="$t('trials:audit:table:nonDicomsFileSize')"
width="100"
>
<el-table-column prop="FileName" :label="$t('trials:uploadNonDicoms:table:fileName')" width="200" />
<el-table-column prop="FileSize" :label="$t('trials:audit:table:nonDicomsFileSize')" width="100">
<template slot-scope="scope">
<span>{{
scope.row.FileSize && scope.row.FileSize > 0
@ -101,71 +48,38 @@
<template slot-scope="files">
<div style="display: flex">
<!-- 预览 -->
<viewer
v-if="files.row.type !== 'MP4'"
:ref="files.row.FullFilePath"
style="margin: 0 10px"
<viewer v-if="files.row.type !== 'MP4'" :ref="files.row.FullFilePath" style="margin: 0 10px"
:images="[
`${OSSclientConfig.basePath}${files.row.FullFilePath}`,
]"
>
<el-button
icon="el-icon-view"
circle
:title="$t('trials:uploadNonDicoms:action:preview')"
size="small"
:disabled="
files.row.FileType &&
]">
<el-button icon="el-icon-view" circle :title="$t('trials:uploadNonDicoms:action:preview')"
size="small" :disabled="files.row.FileType &&
files.row.FileType.indexOf('zip') >= 0
"
@click.native.prevent="handlePreviewImg(files.row)"
>
" @click.native.prevent="handlePreviewImg(files.row)">
</el-button>
<img
v-show="false"
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${files.row.FullFilePath}`"
alt="Image"
/>
<img v-show="false" crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${files.row.FullFilePath}`" alt="Image" />
</viewer>
<el-button
v-if="files.row.type === 'MP4'"
icon="el-icon-view"
circle
:title="$t('trials:uploadNonDicoms:action:preview')"
size="small"
:disabled="
files.row.FileType &&
<el-button v-if="files.row.type === 'MP4'" icon="el-icon-view" circle
:title="$t('trials:uploadNonDicoms:action:preview')" size="small" :disabled="files.row.FileType &&
files.row.FileType.indexOf('zip') >= 0
"
@click.native.prevent="handleLookVideo(scope.row)"
/>
" @click.native.prevent="handleLookVideo(scope.row)" />
<!-- 删除 -->
<el-button
v-if="allowAddOrEdit"
v-hasPermi="[
<el-button v-if="allowAddOrEdit" v-hasPermi="[
'trials:trials-panel:visit:crc-upload:delete',
]"
icon="el-icon-delete"
circle
:title="$t('trials:uploadNonDicoms:action:delete')"
size="small"
]" icon="el-icon-delete" circle :title="$t('trials:uploadNonDicoms:action:delete')" size="small"
@click.native.prevent="
files.row.type === 'MP4'
? hadnleDeleteVideo(scope.row)
: handleDeleteFile(files.row.Id)
"
/>
" />
</div>
</template>
</el-table-column>
</el-table>
<div slot="reference" class="name-wrapper">
<el-button
type="text"
@click.native.prevent="handleGetFilesList(scope.row)"
>
<el-button type="text" @click.native.prevent="handleGetFilesList(scope.row)">
{{ scope.row.FileCount }}
</el-button>
</div>
@ -174,46 +88,23 @@
</template>
</el-table-column>
<!-- 检查日期 -->
<el-table-column
prop="ImageDate"
:label="$t('trials:uploadNonDicoms:table:studyDate')"
sortable
>
<el-table-column prop="ImageDate" :label="$t('trials:uploadNonDicoms:table:studyDate')" sortable>
<template slot-scope="scope">
{{ moment(scope.row.ImageDate).format('YYYY-MM-DD') }}
</template>
</el-table-column>
<!-- 更新时间 -->
<el-table-column
prop="UpdateTime"
:label="$t('trials:uploadNonDicoms:table:updateTime')"
sortable
/>
<el-table-column prop="UpdateTime" :label="$t('trials:uploadNonDicoms:table:updateTime')" sortable />
<!-- 创建时间 -->
<el-table-column
prop="CreateTime"
:label="$t('trials:uploadNonDicoms:table:CreateTime')"
sortable
/>
<el-table-column prop="CreateTime" :label="$t('trials:uploadNonDicoms:table:CreateTime')" sortable />
<el-table-column :label="$t('common:action:action')" min-width="200">
<template slot-scope="scope">
<!-- 预览 -->
<el-button
icon="el-icon-view"
circle
:title="$t('trials:uploadNonDicoms:action:preview')"
:disabled="scope.row.FileCount === 0"
@click.native.prevent="handlePreviewAllFiles(scope.row)"
/>
<el-button icon="el-icon-view" circle :title="$t('trials:uploadNonDicoms:action:preview')"
:disabled="scope.row.FileCount === 0" @click.native.prevent="handlePreviewAllFiles(scope.row)" />
<!-- 上传 -->
<el-button
v-if="allowAddOrEdit"
icon="el-icon-upload2"
circle
:disabled="scope.row.IsDeleted"
:title="$t('trials:uploadNonDicoms:action:upload')"
@click.native.prevent="handleUpload(scope.row)"
/>
<el-button v-if="allowAddOrEdit" icon="el-icon-upload2" circle :disabled="scope.row.IsDeleted"
:title="$t('trials:uploadNonDicoms:action:upload')" @click.native.prevent="handleUpload(scope.row)" />
<!-- 上传视频 -->
<!-- <el-button
v-if="( allowAddOrEdit)"
@ -223,156 +114,86 @@
@click.native.prevent="handleUploadVideo(scope.row)"
/> -->
<!-- 编辑 -->
<el-button
v-if="allowAddOrEdit"
v-hasPermi="['trials:trials-panel:visit:crc-upload:edit']"
icon="el-icon-edit-outline"
circle
:title="$t('trials:uploadNonDicoms:action:edit')"
@click.native.prevent="handleEdit(scope.row)"
/>
<el-button v-if="allowAddOrEdit" v-hasPermi="['trials:trials-panel:visit:crc-upload:edit']"
icon="el-icon-edit-outline" circle :title="$t('trials:uploadNonDicoms:action:edit')"
@click.native.prevent="handleEdit(scope.row)" />
<!-- 删除 -->
<el-button
v-if="allowAddOrEdit"
v-hasPermi="['trials:trials-panel:visit:crc-upload:delete']"
icon="el-icon-delete"
circle
:title="$t('trials:uploadNonDicoms:action:delete')"
@click.native.prevent="handleDelete(scope.row)"
/>
<el-button v-if="allowAddOrEdit" v-hasPermi="['trials:trials-panel:visit:crc-upload:delete']"
icon="el-icon-delete" circle :title="$t('trials:uploadNonDicoms:action:delete')"
@click.native.prevent="handleDelete(scope.row)" />
</template>
</el-table-column>
</el-table>
<!-- 编辑 -->
<el-dialog
v-if="dialogVisible"
:visible.sync="dialogVisible"
:close-on-click-modal="false"
:title="title"
width="600px"
append-to-body
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="dialogVisible" :visible.sync="dialogVisible" :close-on-click-modal="false" :title="title"
width="600px" append-to-body custom-class="base-dialog-wrapper">
<el-form ref="editForm" :model="form" label-width="100px">
<div class="base-dialog-body">
<!-- 检查编号 -->
<el-form-item
v-if="!!form.CodeView"
:label="$t('trials:uploadNonDicoms:table:studyId')"
>
<el-form-item v-if="!!form.CodeView" :label="$t('trials:uploadNonDicoms:table:studyId')">
<el-input v-model="form.CodeView" disabled />
</el-form-item>
<!-- 检查名称 -->
<el-form-item
v-if="relationInfo.IsShowStudyName"
:label="$t('trials:uploadNonDicoms:table:StudyName')"
prop="StudyName"
:rules="[
<el-form-item v-if="relationInfo.IsShowStudyName" :label="$t('trials:uploadNonDicoms:table:StudyName')"
prop="StudyName" :rules="[
{
required: true,
message: $t('common:ruleMessage:specify'),
trigger: 'blur',
},
]"
>
]">
<el-radio-group v-model="form.StudyName">
<template v-for="m in relationInfo.StudyNameList">
<el-radio
v-if="m.IsChoose"
:key="m.Name"
:label="isEN ? m.EnName : m.Name"
style="line-height: 40px"
/>
<el-radio v-if="m.IsChoose" :key="m.Name" :label="isEN ? m.EnName : m.Name" style="line-height: 40px" />
</template>
</el-radio-group>
</el-form-item>
<!-- 检查类型 -->
<el-form-item
:label="$t('trials:uploadNonDicoms:table:modality')"
prop="Modality"
:rules="[
<el-form-item :label="$t('trials:uploadNonDicoms:table:modality')" prop="Modality" :rules="[
{
required: true,
message: $t('common:ruleMessage:specify'),
trigger: 'blur',
},
]"
>
]">
<el-radio-group v-model="form.Modality">
<template v-for="m in trialModalitys">
<el-radio
v-if="m !== ''"
:key="m"
:label="m"
style="line-height: 40px"
/>
<el-radio v-if="m !== ''" :key="m" :label="m" style="line-height: 40px" />
</template>
</el-radio-group>
</el-form-item>
<!-- 检查部位 -->
<el-form-item
:label="$t('trials:uploadNonDicoms:table:bodyPart')"
prop="BodyParts"
:rules="[
<el-form-item :label="$t('trials:uploadNonDicoms:table:bodyPart')" prop="BodyParts" :rules="[
{
required: true,
message: $t('common:ruleMessage:specify'),
trigger: 'blur',
},
]"
>
]">
<el-checkbox-group v-model="form.BodyParts">
<el-checkbox
v-for="bodyPart in trialBodyPartTypes"
:key="bodyPart"
:label="bodyPart"
>{{
<el-checkbox v-for="bodyPart in trialBodyPartTypes" :key="bodyPart" :label="bodyPart">{{
$fd('Bodypart', bodyPart, 'Code', BodyPart, 'Name')
}}</el-checkbox
>
}}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<!-- 检查日期 -->
<el-form-item
:label="$t('trials:uploadNonDicoms:table:studyDate')"
prop="ImageDate"
:rules="[
<el-form-item :label="$t('trials:uploadNonDicoms:table:studyDate')" prop="ImageDate" :rules="[
{
required: true,
message: $t('common:ruleMessage:specify'),
trigger: 'blur',
},
]"
>
<el-date-picker
v-model="form.ImageDate"
type="date"
:picker-options="pickerOption"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
style="width: 100%"
/>
]">
<el-date-picker v-model="form.ImageDate" type="date" :picker-options="pickerOption"
value-format="yyyy-MM-dd" format="yyyy-MM-dd" style="width: 100%" />
</el-form-item>
</div>
<div
class="base-dialog-footer"
style="text-align: right; margin-top: 10px"
>
<div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
<el-form-item>
<el-button
size="small"
type="primary"
:disabled="btnLoading"
@click="dialogVisible = false"
>
<el-button size="small" type="primary" :disabled="btnLoading" @click="dialogVisible = false">
{{ $t('common:button:cancel') }}
</el-button>
<el-button
size="small"
type="primary"
:loading="btnLoading"
@click="handleSave"
>
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
@ -381,16 +202,9 @@
</el-dialog>
<!-- 上传非dicom文件 -->
<el-dialog
v-if="uploadVisible"
:visible.sync="uploadVisible"
:close-on-click-modal="false"
:title="$t('trials:uploadNonDicoms:dialogTitle:upload')"
width="800px"
append-to-body
custom-class="base-dialog-wrapper"
@close="resetFileDiaolg"
>
<el-dialog v-if="uploadVisible" :visible.sync="uploadVisible" :close-on-click-modal="false"
:title="$t('trials:uploadNonDicoms:dialogTitle:upload')" width="800px" append-to-body
custom-class="base-dialog-wrapper" @close="resetFileDiaolg">
<!-- 多文件上传 -->
<form id="inputForm" ref="uploadForm">
<el-divider content-position="left">{{
@ -401,33 +215,15 @@
}}</el-divider>
<div class="form-group">
<div class="upload" style="margin-right: 10px">
<input
multiple="multiple"
webkitdirectory=""
directory
accept="*/*"
type="file"
name="uploadFolder"
class="select-file"
title=""
@change="beginScanFiles($event)"
v-if="!btnLoading"
/>
<input multiple="multiple" webkitdirectory="" directory accept="*/*" type="file" name="uploadFolder"
class="select-file" title="" @change="beginScanFiles($event)" v-if="!btnLoading" />
<div class="btn-select">
{{ $t('trials:uploadNonDicoms:button:selectFolder') }}
</div>
</div>
<div class="upload">
<input
class="select-file"
multiple=""
:accept="faccept.join(',')"
type="file"
name="uploadFile"
title=""
@change="beginScanFiles($event)"
v-if="!btnLoading"
/>
<input class="select-file" multiple="" :accept="faccept.join(',')" type="file" name="uploadFile" title=""
@change="beginScanFiles($event)" v-if="!btnLoading" />
<div class="btn-select">
{{ $t('trials:uploadNonDicoms:button:select') }}
</div>
@ -435,82 +231,46 @@
</div>
</form>
<!-- 文件列表 -->
<el-table
ref="filesTable"
:data="fileList"
class="dicomFiles-table"
height="300"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
:selectable="(row, index) => row.status !== 2 && !btnLoading"
/>
<el-table ref="filesTable" :data="fileList" class="dicomFiles-table" height="300"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" :selectable="(row, index) => row.status !== 2 && !btnLoading" />
<el-table-column type="index" width="50" />
<!-- 文件名称 -->
<el-table-column
prop="name"
:label="$t('trials:uploadNonDicoms:table:fileName')"
min-width="100"
/>
<el-table-column prop="name" :label="$t('trials:uploadNonDicoms:table:fileName')" min-width="100" />
<!-- 文件大小 -->
<el-table-column
prop="size"
:label="$t('trials:uploadNonDicoms:table:fileSize')"
>
<el-table-column prop="size" :label="$t('trials:uploadNonDicoms:table:fileSize')">
<template slot-scope="scope">
<span>{{
scope.row.size && scope.row.size > 0
? `${(scope.row.size / 1024 / 1024).toFixed(3)}MB`
: ''
: '0MB'
}}</span>
</template>
</el-table-column>
<!-- 文件类型 -->
<el-table-column
prop="type"
:label="$t('trials:uploadNonDicoms:table:fileType')"
/>
<el-table-column prop="type" :label="$t('trials:uploadNonDicoms:table:fileType')" />
<!-- 上传状态 -->
<el-table-column
prop="status"
:label="$t('trials:uploadNonDicoms:table:uploadStatus')"
min-width="100"
>
<el-table-column prop="status" :label="$t('trials:uploadNonDicoms:table:uploadStatus')" min-width="100">
<template slot-scope="scope">
<el-tag
:type="['warning', 'info', 'success', 'danger'][scope.row.status]"
v-if="scope.row.status || scope.row.status === 0"
>{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
<el-tag :type="['warning', 'info', 'success', 'danger'][scope.row.status]"
v-if="scope.row.status || scope.row.status === 0">{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:uploadNonDicoms:table:failedFileCount')"
min-width="150"
show-overflow-tooltip
>
<el-table-column :label="$t('trials:uploadNonDicoms:table:failedFileCount')" min-width="150"
show-overflow-tooltip>
<template slot-scope="scope">
<el-progress
color="#409eff"
:percentage="
((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
<el-progress color="#409eff" :percentage="scope.row.size && scope.row.size > 0 ? ((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
1
"
/>
: ((scope.row.uploadFileSize * 100) / 1).toFixed(2) *
1
" />
</template>
</el-table-column>
<el-table-column :label="$t('common:action:action')">
<template slot-scope="scope">
<el-button
size="mini"
icon="el-icon-delete"
circle
:disabled="btnLoading"
:title="$t('trials:crcUpload:action:delete')"
@click="handleRemoveFile(scope.row)"
/>
<el-button size="mini" icon="el-icon-delete" circle :disabled="btnLoading"
:title="$t('trials:crcUpload:action:delete')" @click="handleRemoveFile(scope.row)" />
</template>
</el-table-column>
</el-table>
@ -518,13 +278,8 @@
<span style="margin-right: 10px">{{
$store.state.trials.uploadTip
}}</span>
<el-button
size="small"
type="primary"
:disabled="selectArr.length == 0"
:loading="btnLoading"
@click="beginUpload"
>
<el-button size="small" type="primary" :disabled="selectArr.length == 0" :loading="btnLoading"
@click="beginUpload">
{{ $t('trials:uploadNonDicoms:action:upload') }}
</el-button>
</div>
@ -544,25 +299,11 @@
<upload-videos @uploadOver="uploadOver" />
</el-dialog> -->
<!-- 预览非DICOM视频文件 -->
<el-dialog
v-if="lookVideoVisible"
:visible.sync="lookVideoVisible"
upload-video-visible
:close-on-click-modal="false"
:title="$t('trials:uploadNonDicoms:title:xflookvideo')"
width="480px"
append-to-body
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="lookVideoVisible" :visible.sync="lookVideoVisible" upload-video-visible
:close-on-click-modal="false" :title="$t('trials:uploadNonDicoms:title:xflookvideo')" width="480px" append-to-body
custom-class="base-dialog-wrapper">
<div style="display: flex; justify-content: center">
<video
v-if="lookVideoVisible"
id="video"
controls
crossorigin="anonymous"
width="400"
height="270"
>
<video v-if="lookVideoVisible" id="video" controls crossorigin="anonymous" width="400" height="270">
<source :src="currentRow.VideoUrl" type="video/mp4" />
</video>
</div>
@ -572,27 +313,12 @@
</el-button>
</div>
</el-dialog>
<el-dialog
v-if="previewImgVisible"
:visible.sync="previewImgVisible"
:title="$t('trials:uploadNonDicoms:dialogTitle:preview')"
append-to-body
width="565px"
>
<div
v-loading="imageLoading"
class="base-modal-body"
style="border: 2px solid #ccc; padding: 10px"
>
<el-image
:src="`${OSSclientConfig.basePath}${imgUrl}`"
crossorigin="anonymous"
fit="fit"
style="height: 500px; width: 500px"
@error="imageLoading = false"
@load="imageLoading = false"
:preview-src-list="[`${OSSclientConfig.basePath}${imgUrl}`]"
/>
<el-dialog v-if="previewImgVisible" :visible.sync="previewImgVisible"
:title="$t('trials:uploadNonDicoms:dialogTitle:preview')" append-to-body width="565px">
<div v-loading="imageLoading" class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
<el-image :src="`${OSSclientConfig.basePath}${imgUrl}`" crossorigin="anonymous" fit="fit"
style="height: 500px; width: 500px" @error="imageLoading = false" @load="imageLoading = false"
:preview-src-list="[`${OSSclientConfig.basePath}${imgUrl}`]" />
</div>
</el-dialog>
</div>
@ -962,8 +688,7 @@ export default {
type: extendName.split('.')[1],
status: 0,
file: files[i],
id: `${files[i].lastModified}${
files[i].name
id: `${files[i].lastModified}${files[i].name
}${new Date().getTime()}${i + 1}`,
fileType: files[i].type,
uploadFileSize: 0,
@ -1070,8 +795,7 @@ export default {
if (!this.uploadVisible) return
let file = this.fileList.filter((item) => item.id === arr[index].id)[0]
file.status = 1
let path = `/${this.trialId}/Image/${this.data.SubjectId}/${
this.data.Id
let path = `/${this.trialId}/Image/${this.data.SubjectId}/${this.data.Id
}/${this.$guid()}${file.name
.substring(file.name.lastIndexOf('.'))
.toLocaleLowerCase()}`
@ -1128,7 +852,7 @@ export default {
(percentage, checkpoint, lastPer) => {
item.uploadFileSize += checkpoint.size * (percentage - lastPer)
if (item.uploadFileSize > file.fileSize) {
item.uploadFileSize = file.fileSize
item.uploadFileSize = file.fileSize > 0 ? file.fileSize : 1
}
}
)
@ -1338,6 +1062,7 @@ export default {
background: #428bca;
border-color: #428bca;
color: #fff;
.select-file {
height: 30px;
width: 90px;
@ -1348,6 +1073,7 @@ export default {
opacity: 0;
font-size: 0;
}
.btn-select {
//
width: 90px;
@ -1363,6 +1089,7 @@ export default {
pointer-events: none; //pointer-events:none穿
}
}
.non-dicom-wrapper {
::v-deep .delete-row {
text-decoration-line: line-through;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,440 @@
<template>
<BaseContainer class="reuploa-audit-wrapper">
<!-- 搜索框 -->
<template slot="search-container">
<el-form :inline="true">
<!-- 中心编号 -->
<el-form-item :label="$t('trials:reuploadAudit:table:siteId')">
<el-select v-model="searchData.TrialSiteId" clearable filterable style="width: 120px"
placeholder="">
<el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteCode"
:value="item.TrialSiteId" />
</el-select>
</el-form-item>
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:reuploadAudit:table:subjectId')">
<el-input v-model="searchData.SubjectCode" style="width: 100px" clearable />
</el-form-item>
<!-- 访视名称 -->
<el-form-item :label="$t('trials:reuploadAudit:table:visitName')">
<el-select v-model="searchData.VisitPlanArray" style="width: 200px" clearable multiple
:collapse-tags="true" placeholder="">
<el-option v-for="(item, index) of visitPlanOptions" :key="index" :label="item.VisitName"
:value="item.VisitNum">
<span style="float: left">{{ item.VisitName }}</span>
</el-option>
<el-option key="Other" label="Out of Plan" value="1.11" />
</el-select>
</el-form-item>
<!-- 申请人 -->
<el-form-item class="my_multiple" :label="$t('trials:reuploadAudit:table:CreateUserId')">
<el-select v-model="searchData.CreateUserId" style="width: 140px" clearable placeholder="">
<el-option v-for="(item) of userOptions" :key="item.CreateUserId" :label="item.FullName"
:value="item.CreateUserId">
</el-option>
</el-select>
</el-form-item>
<!-- 申请人角色 -->
<el-form-item class="my_multiple" :label="$t('trials:reuploadAudit:table:ApplyUserRole')">
<el-select v-model="searchData.ApplyUserRole" style="width: 140px" clearable placeholder="">
<el-option v-for="(item) of $d.ImageBackApplyEnum" :key="item.id" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<!-- 申请时间 -->
<el-form-item :label="$t('trials:reuploadAudit:table:createTime')">
<el-date-picker v-model="timeListC" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss"
type="datetimerange" :default-time="['00:00:00', '23:59:59']" @change="changeTimeListC"
style="width: 360px" />
</el-form-item>
<!-- 审核状态 -->
<el-form-item :label="$t('trials:reuploadAudit:table:auditState')" class="my_multiple">
<el-select v-model="searchData.ImageBackState" clearable style="width: 140px" placeholder="">
<el-option v-for="item of $d.ImageBackstateEnum" :key="item.id" :value="item.value"
:label="item.label" />
</el-select>
</el-form-item>
<!-- 审核通过时间 -->
<el-form-item :label="$t('trials:reuploadAudit:table:auditTime')">
<el-date-picker v-model="timeList" value-format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss"
type="datetimerange" :default-time="['00:00:00', '23:59:59']" @change="changeTimeList"
style="width: 360px" />
</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>
</template>
<!-- 重传审批列表 -->
<template slot="main-container">
<el-table ref="reuploadAuditList" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="list" stripe
height="100" @sort-change="handleSortByColumn">
<!-- 是否加急 -->
<el-table-column prop="IsUrgent" :label="$t('trials:reuploadAudit:table:isUrgent')"
show-overflow-tooltip width="120" sortable="custom">
<template slot-scope="scope">
<el-button v-if="
scope.row.IsUrgent &&
hasPermi(['trials:trials-panel:visit:reuploa-audit:set-urgent'])
" type="danger" size="mini" :disabled="!(userTypeEnumInt === 1 || userTypeEnumInt === 3)"
@click="handleUrgentStatus(scope.row)">
{{ $fd('YesOrNo', scope.row.IsUrgent) }}
</el-button>
<el-button v-else-if="
!scope.row.IsUrgent &&
hasPermi(['trials:trials-panel:visit:reuploa-audit:set-urgent'])
" size="mini" type="primary" :disabled="!(userTypeEnumInt === 1 || userTypeEnumInt === 3)"
@click="handleUrgentStatus(scope.row)">
{{ $fd('YesOrNo', scope.row.IsUrgent) }}
</el-button>
<span v-else>
<el-tag v-if="scope.row.IsUrgent" type="danger">
{{ $fd('YesOrNo', scope.row.IsUrgent) }}
</el-tag>
<el-tag v-else type="primary">
{{ $fd('YesOrNo', scope.row.IsUrgent) }}
</el-tag>
</span>
</template>
</el-table-column>
<!-- 中心编号 -->
<el-table-column prop="TrialSiteCode" :label="$t('trials:reuploadAudit:table:siteId')"
show-overflow-tooltip sortable="custom" />
<!-- 受试者编号 -->
<el-table-column prop="SubjectCode" :label="$t('trials:reuploadAudit:table:subjectId')"
show-overflow-tooltip sortable="custom" width="120px" />
<!-- 访视名称 -->
<el-table-column prop="VisitName" :label="$t('trials:reuploadAudit:table:visitName')"
show-overflow-tooltip sortable="custom">
</el-table-column>
<!-- 最晚拍片日期 -->
<el-table-column prop="LatestScanDate" :label="$t('trials:reuploadAudit:table:lScanDate')"
show-overflow-tooltip width="170" sortable="custom">
<template slot-scope="scope">
<el-tooltip class="item" effect="dark" :content="`${scope.row.EarliestScanDate
? moment(scope.row.EarliestScanDate).format('YYYY-MM-DD')
: ''
} ~ ${scope.row.LatestScanDate
? moment(scope.row.LatestScanDate).format('YYYY-MM-DD')
: ''
}`" placement="top">
<span>
{{
scope.row.LatestScanDate
? moment(scope.row.LatestScanDate).format('YYYY-MM-DD')
: ''
}}
</span>
</el-tooltip>
</template>
</el-table-column>
<!-- 提交时间 -->
<el-table-column prop="SubmitTime" :label="$t('trials:reuploadAudit:table:SubmitTime')"
show-overflow-tooltip sortable="custom" width="150px" />
<!-- 申请人 -->
<el-table-column prop="CreateUserFullName" :label="$t('trials:reuploadAudit:table:createUserFullName')"
show-overflow-tooltip sortable="custom" />
<!-- 申请人角色 -->
<el-table-column prop="ApplyUserRole" :label="$t('trials:reuploadAudit:table:applyUserRole')"
show-overflow-tooltip sortable="custom" width="120px">
<template slot-scope="scope">
<span>{{ $fd('ImageBackApplyEnum',
scope.row.ApplyUserRole) }}</span>
</template>
</el-table-column>
<!-- 申请时间 -->
<el-table-column prop="CreateTime" :label="$t('trials:reuploadAudit:table:createTime')"
show-overflow-tooltip sortable="custom" width="150px" />
<!-- 审核状态 -->
<el-table-column prop="ImageBackState" :label="$t('trials:reuploadAudit:table:imageBackState')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
<el-tag :type="['warning', '', 'danger'][scope.row.ImageBackState]">{{ $fd('ImageBackstateEnum',
scope.row.ImageBackState) }}</el-tag>
</template>
</el-table-column>
<!-- 审核时间 -->
<el-table-column prop="AuditTime" :label="$t('trials:reuploadAudit:table:auditTime')"
show-overflow-tooltip sortable="custom" width="150px" />
<el-table-column :label="$t('common:action:action')" fixed="right">
<template slot-scope="scope">
<el-button :title="$t('trials:reuploadAudit:button:auditYes')" circle
:disabled="scope.row.ImageBackState > 0" icon="el-icon-check" size="mini"
@click="audit(scope.row, 1)" />
<el-button :title="$t('trials:reuploadAudit:button:auditNo')"
:disabled="scope.row.ImageBackState > 0" circle icon="el-icon-close" size="mini"
@click="audit(scope.row, 2)" />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</template>
</BaseContainer>
</template>
<script>
import {
getImageBackList,
getTrialSiteSelect,
auditImageBack,
getImageBackApplyUserList,
getTrialVisitStageSelect
} from '@/api/trials'
import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination'
import moment from 'moment'
const searchDataDefault = () => {
return {
TrialId: null,
TrialSiteId: null,
SubjectCode: null,
CreateUserId: null,
ApplyUserRole: null,
ApplyBeginTime: null,
ApplyEndTime: null,
ImageBackState: null,
AuditBeginTime: null,
AuditEndTime: null,
VisitName: null,
VisitPlanArray: [],
PageIndex: 1,
PageSize: 20,
Asc: true,
SortField: null
}
}
export default {
name: 'QcCheck',
components: {
BaseContainer,
Pagination
},
data() {
return {
searchData: searchDataDefault(),
total: 0,
list: [],
loading: false,
siteOptions: [],
userOptions: [],
visitPlanOptions: [],
timeListC: [],
timeList: [],
trialId: null,
moment
}
},
watch: {
list(val) {
this.doLayout()
},
},
mounted() {
this.trialId = this.$route.query.trialId
this.getList()
this.getSite()
this.getUser()
this.getVisitPlanOptions()
},
methods: {
async audit(row, state) {
try {
let message = this.$t("trials:reuploadAudit:confirmMessage:imageBack").replace("xxx", this.$fd("ImageBackstateEnum", state))
let confirm = await this.$confirm(message)
if (!confirm) return false
let params = {
IamgeBackRecordId: row.Id,
IsAgree: state === 1 ? true : false
}
this.loading = true
let res = await auditImageBack(params)
this.loading = false
if (res.IsSuccess) {
this.getList()
}
} catch (err) {
console.log(err)
this.loading = false
}
},
getList() {
this.loading = true
this.searchData.TrialId = this.trialId
getImageBackList(this.searchData)
.then((res) => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
this.OtherInfo = res.OtherInfo
})
.catch(() => {
this.loading = false
})
},
// site
getSite() {
getTrialSiteSelect(this.trialId).then((res) => {
this.siteOptions = res.Result
})
},
// 访
getVisitPlanOptions() {
getTrialVisitStageSelect(this.trialId).then((res) => {
this.visitPlanOptions = res.Result
})
},
//
getUser() {
getImageBackApplyUserList({
TrialId: this.trialId
}).then((res) => {
this.userOptions = res.Result
})
},
doLayout() {
const scope = this
this.$nextTick(() => {
scope.$refs.reuploadAuditList.doLayout()
})
},
//
handleReset() {
this.searchData = searchDataDefault()
this.timeList = []
this.getList()
this.timeListC = []
this.$nextTick(() => {
this.$refs.reuploadAuditList.clearSort()
})
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
changeTimeList() {
if (this.timeList) {
this.searchData.AuditBeginTime = this.timeList[0]
this.searchData.AuditEndTime = this.timeList[1]
} else {
this.searchData.AuditBeginTime = null
this.searchData.AuditEndTime = null
}
},
changeTimeListC() {
if (this.timeListC) {
this.searchData.ApplyBeginTime = this.timeListC[0]
this.searchData.ApplyEndTime = this.timeListC[1]
} else {
this.searchData.ApplyBeginTime = null
this.searchData.ApplyEndTime = null
}
},
},
}
</script>
<style lang="scss">
.reuploa-audit-wrapper {
position: relative;
.remark {
position: absolute;
left: 5px;
bottom: 7px;
font-size: 12px;
}
height: 100%;
.qc-dialog {
.el-dialog__headerbtn {
top: 10px;
font-size: 30px;
}
.el-dialog__body {
height: calc(100% - 70px);
padding: 0 10px;
.qc-dialog-body {
padding: 10px 20px;
height: 100%;
overflow-y: auto;
}
}
.link-breadcrumb {
cursor: pointer;
color: #428bca;
}
}
.box-title {
padding: 12px;
margin-bottom: 10px;
background-color: #dcdfe6;
}
.status-primary-circle {
display: inline-block;
width: 20px;
height: 20px;
text-align: center;
line-height: 18px;
border-radius: 50%;
border: 1px solid #f56c6c;
color: #f56c6c;
font-size: 10px;
}
.manuals-dialog-container {
margin-top: 50px !important;
width: 75%;
height: 80%;
.el-dialog__body {
padding: 10px;
height: calc(100% - 50px) !important;
}
.el-dialog__header {
position: relative;
}
}
.manuals-full-dialog-container {
.el-dialog__body {
padding: 10px;
height: calc(100% - 50px) !important;
}
.el-dialog__header {
position: relative;
}
}
}
</style>

View File

@ -0,0 +1,120 @@
<template>
<div class="reuploadAudit-wrapper">
<el-row>
<el-col :span="12">
<!-- 重阅审批 -->
<h3>{{ $t('trials:trials-panel:attachments:reuploadAudit') }}</h3>
</el-col>
<el-col :span="12" style="text-align:right;">
<h3>
<Pagination class="page" :total="total" :page.sync="listQuery.pageIndex"
:limit.sync="listQuery.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-table ref="needSignDocList" v-loading="listLoading" :data="list" :show-header="true"
v-adaptive="{ bottomOffset: 45 }" height="100" @sort-change="handleSortByColumn">
<el-table-column type="index" width="40" />
<!-- 项目编号 -->
<el-table-column :label="$t('trials:workbench:table:trialId')" prop="TrialCode" show-overflow-tooltip
sortable="custom" />
<!-- 试验名称 -->
<el-table-column :label="$t('trials:workbench:table:experimentName')" prop="ExperimentName"
show-overflow-tooltip sortable="custom" />
<!-- 研究方案号 -->
<el-table-column :label="$t('trials:workbench:table:researchNo')" prop="ResearchProgramNo"
show-overflow-tooltip sortable="custom" />
<!-- 加急量 -->
<el-table-column :label="$t('trials:sysDocBeSigned:table:UrgentCount')" prop="UrgentCount"
show-overflow-tooltip sortable="custom" />
<!-- 待审批量 -->
<el-table-column :label="$t('trials:sysDocBeSigned:table:ToBeApprovalCount')" prop="ToBeApprovalCount"
show-overflow-tooltip sortable="custom" />
<el-table-column :label="$t('common:action:action')" width="100">
<template slot-scope="scope">
<el-button icon="el-icon-edit-outline" circle
:disabled="!!~trialIdList.indexOf(scope.row.TrialId) || isSignSystemDoc"
:title="$t('trials:researchRecord:action:view')" @click="handleAudit(scope.row)" />
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { getPMImageBackToBeDoneList } from '@/api/trials'
import Pagination from '@/components/Pagination'
const searchDataDefault = () => {
return {
pageIndex: 1,
pageSize: 20,
asc: true,
sortField: ''
}
}
export default {
name: 'ReuploadAudit',
components: { Pagination },
props: {
trialIdList: {
type: Array,
default() { return [] }
},
isSignSystemDoc: {
type: Boolean,
default() { return false }
}
},
data() {
return {
listLoading: false,
list: [],
listQuery: searchDataDefault(),
total: 0
}
},
mounted() {
this.getList()
},
methods: {
getList() {
this.listLoading = true
getPMImageBackToBeDoneList(this.listQuery).then(res => {
this.listLoading = false
this.total = res.Result.TotalCount
this.list = res.Result.CurrentPageData
}).catch(() => { this.listLoading = false })
},
handleAudit(row) {
this.$router.push({ path: `/trials/trials-panel/visit/reupload-audit?trialId=${row.TrialId}&trialCode=${row.TrialCode}&researchProgramNo=${row.ResearchProgramNo}` })
},
handleReset() {
this.listQuery = searchDataDefault()
this.getList()
this.$nextTick(() => {
this.$refs.needSignDocList.clearSort()
})
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.listQuery.asc = true
} else {
this.listQuery.asc = false
}
this.listQuery.sortField = column.prop
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.reuploadAudit-wrapper {
height: 100%;
}
</style>

View File

@ -1,14 +1,17 @@
<template>
<div id="contextmenu" class="contextmenu" v-show="visible">
<div id="contextmenu" class="contextmenu" v-show="visible" :style="{
'z-index': zIndex
}">
<div class="contextmenu__item" @click="handleMenu('open')" v-show="checkList.length <= 1">
<i class="icon el-icon-right icon_open" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:open') }}</span>
</div>
<div class="contextmenu__item" @click="handleMenu('download')">
<div class="contextmenu__item" @click="handleMenu('downLoad')">
<i class="icon icon_download" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:download') }}</span>
</div>
<template v-if="['file', 'files', 'folder'].includes(type)">
<div class="line"></div>
<div class="contextmenu__item" @click="handleMenu('copy')">
<i class="icon icon_copy" />
@ -18,6 +21,10 @@
<i class="icon icon_shear" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:shear') }}</span>
</div>
<div class="contextmenu__item" @click="handleMenu('stickup')" v-if="checkList.length <= 1 && isCopy">
<i class="icon icon_stickup" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:stickup') }}</span>
</div>
<div class="contextmenu__item" @click="handleMenu('rename')" v-show="checkList.length <= 1">
<i class="icon icon_rename" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:rename') }}</span>
@ -26,11 +33,29 @@
<i class="icon icon_del" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:del') }}</span>
</div>
<div class="line" v-show="checkList.length <= 1"></div>
<div class="contextmenu__item" @click="handleMenu('Stats')" v-show="checkList.length <= 1">
</template>
<template v-if="checkList.length <= 1 && type === 'file'">
<div class="line"></div>
<div class="contextmenu__item" @click="handleMenu('version')">
<i class="icon el-icon-warning-outline icon_Stats" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:Stats') }}</span>
<span>{{ $t('trials:trials-workbench:auditDocument:menu:version') }}</span>
</div>
</template>
<template v-if="type === 'version' || type === 'c_version'">
<div class="line"></div>
<div class="contextmenu__item" @click="handleMenu('setVersion')" v-if="type === 'version'">
<i class="icon el-icon-document-checked icon_Stats" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:setVersion') }}</span>
</div>
<div class="contextmenu__item" @click="handleMenu('delVersion')" v-if="type === 'version'">
<i class="icon el-icon-delete icon_Stats" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:delVersion') }}</span>
</div>
<div class="contextmenu__item" @click="handleMenu('delAllVersion')">
<i class="icon el-icon-delete-solid icon_Stats" />
<span>{{ $t('trials:trials-workbench:auditDocument:menu:delAllVersion') }}</span>
</div>
</template>
</div>
</template>
@ -43,15 +68,25 @@ export default {
default: () => {
return []
}
},
isCopy: {
type: Boolean,
default: false
}
},
data() {
return {
visible: false
visible: false,
type: 'file',
zIndex: 9,
rowData: {}
};
},
methods: {
init(row, column, event) {
init(event, row, type, zIndex = 9) {
this.rowData = row
this.type = type
this.zIndex = zIndex
//
//
this.visible = true
@ -77,7 +112,7 @@ export default {
this.$emit("foo");
},
handleMenu(item) {
this.$emit("handleMenu", item);
this.$emit("handleMenu", { key: item, row: this.rowData });
},
},
};
@ -121,7 +156,6 @@ export default {
background-position: top 0 right 0;
background-repeat: no-repeat;
box-shadow: 0 0 0 .5px #88888830, 0 10px 40px 0 #88888840;
z-index: 9;
}
.contextmenu__item:hover {
@ -219,4 +253,16 @@ export default {
.icon_Stats {
color: #1890ff;
}
/*粘贴*/
.icon_stickup {
color: #1890ff;
display: inline-block;
background-image: url(@/assets/stickup.png);
background-position: 0 0;
background-size: 16px 16px;
background-repeat: no-repeat;
height: 16px;
margin-right: 8px;
}
</style>

View File

@ -0,0 +1,444 @@
<template>
<el-dialog title="" :visible.sync="visible" :close-on-click-modal="false" :close-on-press-escape="false"
:before-close="handleClose" width="450px" center>
<div class="auditDocumentDetail">
<div class="header">
<div class="file_icon">
<i class="name_folder" v-if="!rowData.AuditDocumentTypeEnum"></i>
<img v-else-if="['png', 'jpg', 'jpeg'].includes(rowData.FileFormat.toLowerCase())"
:src="OSSclientConfig.basePath + rowData.FilePath" alt="" class="name_image">
<i :class="`name_${rowData.FileFormat}`" v-else></i>
</div>
<div class="file_name">
<div class="name">
<span class="name-text">{{ rowData.Name }}</span>
</div>
<div class="desc">
<span class="size">{{ formatFileSize(rowData) }}</span>
<span v-if="rowData.AuditDocumentTypeEnum">, </span>
<span class="time">{{ rowData.UpdateTime }}</span>
</div>
</div>
</div>
<div class="main">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane :label="$t('trials:trials-workbench:auditDocument:detail:tabs:versions')"
name="versions" v-if="rowData.AuditDocumentTypeEnum === 1">
<div class="versions_top">
<div class="title">{{
$t('trials:trials-workbench:auditDocument:detail:title:historicalVersion') }}
</div>
<div class="btnBox">
<el-button icon="el-icon-refresh" circle size="small"
@click.stop="getHistoricalVersion" />
<el-button icon="el-icon-upload2" plain size="small" @click.stop="openFile">{{
$t('trials:trials-workbench:auditDocument:detail:title:uploadNewVersion')
}}</el-button>
</div>
</div>
<div class="versions_content" v-loading="loading">
<div class="item" v-for="item of versionList" :key="item.Id">
<div class="item_line">
<div class="version current_version" v-if="item.IsCurrentVersion">
<span>{{
$t('trials:trials-workbench:auditDocument:detail:title:currentVersion')
}}</span>
</div>
<div class="version" v-else>
<span>v{{ item.Version }}</span>
</div>
<div class="mtime">{{ item.CreateTime }}</div>
<div class="size">{{ formatFileSize(item) }}</div>
<div class="add_desc" @click.stop="openMenu($event, item, 'c_version')"
v-if="item.IsCurrentVersion">
<i class="el-icon-more" />
</div>
<div class="add_desc" @click.stop="openMenu($event, item, 'version')" v-else>
<i class="el-icon-more" />
</div>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane :label="$t('trials:trials-workbench:auditDocument:detail:tabs:Stats')" name="Stats"
v-if="false">
<div class="p">
<div class="title">{{ $t('trials:trials-workbench:auditDocument:detail:title:path') }}</div>
<div class="content">{shareItem:8}/周会/20250324-工作总结及后续工作.pptx</div>
</div>
<div class="p" v-if="!rowData.AuditDocumentTypeEnum">
<div class="title">{{ $t('trials:trials-workbench:auditDocument:detail:title:contain') }}
</div>
<div class="content">4 (2文件, 2文件夹)</div>
</div>
<div class="p" v-else>
<div class="title">{{ $t('trials:trials-workbench:auditDocument:detail:title:size') }}</div>
<div class="content">{{ formatFileSize(rowData) }}</div>
</div>
<div class="p">
<div class="title">{{ $t('trials:trials-workbench:auditDocument:detail:title:updateTime') }}
</div>
<div class="content">{{ rowData.UpdateTime }}</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</el-dialog>
</template>
<script>
import { getHistoricalVersion } from '@/api/trials'
export default {
name: "auditDocumentDetail",
props: {
visible: {
type: Boolean,
default: false
},
rowData: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
activeName: 'versions',
versionList: [],
loading: false
}
},
// mounted() {
// this.getHistoricalVersion()
// },
watch: {
rowData: {
handler() {
this.getHistoricalVersion()
},
deep: true,
immediate: true
}
},
methods: {
handleClick() { },
openMenu(e, row, type) {
this.$emit('openContextmenu', { e, row, type, zIndex: 3000 })
},
handleClose() {
this.$emit("update:visible", false)
},
delAll() {
let ids = []
this.versionList.forEach(item => {
if (!item.IsCurrentVersion) {
ids.push(item.Id)
}
})
this.$emit('delData', ids)
},
//
async getHistoricalVersion() {
if (!this.rowData || !this.rowData.Id) return false
try {
let data = {
Id: this.rowData.Id
}
this.loading = true
let res = await getHistoricalVersion(data)
this.loading = false
if (res.IsSuccess) {
this.versionList = res.Result
}
} catch (err) {
this.loading = false
console.log(err)
}
},
openFile() {
let faccept = `.${this.rowData.FileFormat}`
this.$emit('openFileNewVersion', faccept)
},
//
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"
}
},
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__header {
padding: 0;
}
::v-deep .el-dialog__body {
padding: 20px 0;
}
::v-deep .el-tabs__nav-wrap::after {
height: 1px;
}
.auditDocumentDetail {
.header {
padding: 0 10px 10px;
display: flex;
align-items: center;
border-bottom: 1px solid #f6f8ff;
.file_icon {
width: 50px;
height: 50px;
display: flex;
align-items: center;
i {
display: inline-block;
width: 100%;
height: 100%;
font-size: 42px;
line-height: 60px;
background-repeat: no-repeat;
background-position: center;
background-size: cover;
border-radius: 5px;
font-style: normal;
pointer-events: none;
}
.name_image {
max-width: 90%;
max-height: 100%;
}
.name_pdf {
background-image: url(@/assets/file_icon/pdf.png);
}
.name_docx {
background-image: url(@/assets/file_icon/docx.png);
}
.name_doc {
background-image: url(@/assets/file_icon/doc.png);
}
.name_zip {
background-image: url(@/assets/file_icon/zip.png);
}
.name_pptx {
background-image: url(@/assets/file_icon/pptx.png);
}
.name_ppt {
background-image: url(@/assets/file_icon/ppt.png);
}
.name_xlsx {
background-image: url(@/assets/file_icon/xlsx.png);
}
.name_xls {
background-image: url(@/assets/file_icon/xls.png);
}
.name_folder {
background-image: url(@/assets/file_icon/folder.png);
}
}
.file_name {
font-size: 14px;
color: #666;
word-break: break-word;
display: table-cell;
vertical-align: middle;
max-height: 60px;
line-height: 18px;
margin-top: 7px;
width: calc(100% - 170px);
display: flex;
align-items: center;
flex-wrap: wrap;
.name {
max-height: 35px;
width: 100%;
line-height: 18px;
overflow: hidden;
text-overflow: ellipsis;
.name-text {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
.desc {
font-size: 13px;
color: #aaa;
padding-top: 1px;
white-space: nowrap;
}
}
}
.main {
padding: 10px;
font-size: 14px;
max-height: 500px;
.p {
width: 100%;
display: flex;
.title {
color: #999;
text-align: left;
padding: 0;
margin: 0;
line-height: 25px;
width: 27%;
margin-right: 1%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.content {
word-break: break-word;
color: #444;
width: 72%;
margin: 0;
padding: 5px 0 0 0;
position: relative;
}
}
.versions_top {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
height: 40px;
border-bottom: 1px solid #f3f3f3;
margin-bottom: 10px;
.title {
width: 30%;
}
.btnBox {
flex: 1 0 0%;
text-align: right;
}
}
.versions_content {
max-height: calc(100% - 50px);
.item {
padding: 0;
border: 1px solid #eee;
margin-bottom: 4px;
border-radius: 4px;
position: relative;
overflow: hidden;
transition: all .2s;
cursor: pointer;
&:hover {
border-color: #91d5ff;
}
.item_line {
background: #fafafa;
padding: 5px 10px;
font-size: 12px;
overflow: hidden;
white-space: nowrap;
transition: all .2s;
&:hover {
background: #e6f7ff;
border-color: #e6f7ff;
}
.version {
display: inline-block;
margin-right: 5px;
width: auto;
span {
background: #22b66c;
border-color: #1c9458;
color: #fff;
padding: 3px 4px;
min-width: 25px;
}
}
.current_version {
span {
background: #1890ff;
border-color: #007cee;
color: #fff;
}
}
.mtime {
color: #999;
margin-right: 0;
line-height: 22px;
display: inline-block;
}
.size {
border-radius: 20px;
padding: 1px 1px 1px 5px;
font-size: 12px;
display: inline-block;
margin-right: 5px;
}
.add_desc {
position: absolute;
right: 5px;
top: 3px;
width: 25px;
height: 25px;
line-height: 25px;
color: #666;
background: #77777715;
border-radius: 2px;
text-align: center;
cursor: pointer;
&:hover {
background: #c3e2ff;
color: #1890ff;
}
}
}
}
}
}
}
</style>

View File

@ -1,509 +0,0 @@
<template>
<base-model :config="config">
<div slot="dialog-body">
<!-- 多文件上传 -->
<form id="inputForm" ref="uploadForm">
<el-divider content-position="left">{{
$t('trials:trialDocument:label:fileType').replace(
'xxx',
faccept.join('/')
)
}}</el-divider>
<div class="form-group">
<div
class="upload"
style="margin-right: 10px"
:disabled="limitLength"
v-if="!limitLength"
>
<input
multiple="multiple"
webkitdirectory=""
directory
accept="*/*"
type="file"
name="uploadFolder"
class="select-file"
title=""
@change="beginScanFiles($event)"
v-if="
!loading &&
(!limitLength ||
(fileList.length < limitLength && limitLength > 1))
"
/>
<div class="btn-select">
{{ $t('trials:trialDocument:button:selectFolder') }}
</div>
</div>
<div class="upload">
<input
class="select-file"
multiple=""
:accept="faccept.join(',')"
type="file"
name="uploadFile"
title=""
@change="beginScanFiles($event)"
v-if="!loading && (!limitLength || fileList.length < limitLength)"
/>
<div class="btn-select">
{{ $t('trials:trialDocument:button:select') }}
</div>
</div>
</div>
</form>
<!-- 文件列表 -->
<el-table
ref="filesTable"
:data="fileList"
class="dicomFiles-table"
height="300"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
:selectable="(row, index) => row.status !== 2 && !loading"
/>
<el-table-column type="index" width="50" />
<!-- 文件名称 -->
<el-table-column
prop="name"
:label="$t('trials:trialDocument:table:fileName')"
min-width="100"
/>
<!-- 文件大小 -->
<el-table-column
prop="size"
:label="$t('trials:trialDocument:table:fileSize')"
>
<template slot-scope="scope">
<span>{{
scope.row.size && scope.row.size > 0
? `${(scope.row.size / 1024 / 1024).toFixed(3)}MB`
: ''
}}</span>
</template>
</el-table-column>
<!-- 文件类型 -->
<el-table-column
prop="type"
:label="$t('trials:trialDocument:table:fileType')"
/>
<!-- 上传状态 -->
<el-table-column
prop="status"
:label="$t('trials:trialDocument:table:uploadStatus')"
min-width="100"
>
<template slot-scope="scope">
<el-tag
:type="['warning', 'info', 'success', 'danger'][scope.row.status]"
v-if="scope.row.status || scope.row.status === 0"
>{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
:label="$t('trials:trialDocument:table:failedFileCount')"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-progress
color="#409eff"
:percentage="
((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
1
"
/>
</template>
</el-table-column>
<el-table-column :label="$t('common:action:action')">
<template slot-scope="scope">
<el-button
size="mini"
icon="el-icon-delete"
circle
:disabled="loading"
:title="$t('trials:trialDocument:action:delete')"
@click="handleRemoveFile(scope.row)"
/>
</template>
</el-table-column>
</el-table>
</div>
<div slot="dialog-footer">
<div style="text-align: right; padding: 10px 0px">
<span style="margin-right: 10px">{{
$store.state.trials.uploadTip
}}</span>
<el-button
size="small"
type="primary"
:disabled="selectArr.length == 0"
:loading="loading"
@click="beginUpload"
>
{{ $t('trials:trialDocument:action:upload') }}
</el-button>
</div>
</div>
</base-model>
</template>
<script>
import baseModel from '@/components/BaseModel'
import { deepClone } from '@/utils/index.js'
import store from '@/store'
export default {
name: 'uploadFiles',
props: {
config: {
required: true,
default: () => {
return {
visible: false,
}
},
},
faccept: {
type: Array,
default: () => {
return []
},
},
uploadPath: {
type: String,
default: '',
},
limitLength: {
type: Number,
default: 0,
},
},
components: {
'base-model': baseModel,
},
data() {
return {
loading: false,
fileList: [],
selectArr: [],
isFail: false,
successFileList: [],
fileInput: null,
}
},
methods: {
//
handleSelectionChange(selection) {
this.selectArr = selection
},
//
beginScanFiles(e) {
if (this.fileInput) {
this.fileInput = null
}
var files = [...e.target.files]
if (this.limitLength && this.fileList.length >= this.limitLength)
return this.$message.warning(
this.$t('trials:trialDocument:message:limitLength')
)
var sameFiles = []
files.forEach((file) => {
var extendName = file.name
.substring(file.name.lastIndexOf('.'))
.toLocaleLowerCase()
if (
this.faccept.indexOf(extendName) !== -1 &&
this.fileList.findIndex((v) => v.name === file.name) > -1
) {
sameFiles.push(file.name)
}
})
var scope = this
if (sameFiles.length > 0) {
const h = this.$createElement
var msg = this.$t('trials:trialDocument:message:exsitSameFile').replace(
'xxx',
sameFiles.join(', ')
)
this.$msgbox({
message: h('div', { style: 'maxHeight:300px;overflow: auto;' }, [
h('p', null, msg),
h(
'p',
null,
this.$t('trials:trialDocument:message:isContinueUpload')
),
]),
type: 'warning',
showCancelButton: true,
})
.then(() => {
scope.pendingUploadQuene(files)
})
.catch(() => {
scope.resetUploadForm()
})
} else {
scope.pendingUploadQuene(files)
}
},
pendingUploadQuene(files) {
for (var i = 0; i < files.length; ++i) {
const fileName = files[i].name
var extendName = fileName
.substring(fileName.lastIndexOf('.'))
.toLocaleLowerCase()
if (this.faccept.indexOf(extendName) !== -1) {
files[i].id = `${files[i].lastModified}${files[i].name}`
let obj = {
name: files[i].name,
size: files[i].size,
type: extendName.split('.')[1],
status: 0,
file: files[i],
id: `${files[i].lastModified}${
files[i].name
}${new Date().getTime()}${i + 1}`,
fileType: files[i].type,
uploadFileSize: 0,
}
this.fileList.push(obj)
this.$refs.filesTable.toggleRowSelection(obj, true)
}
}
this.resetUploadForm()
},
resetUploadForm() {
this.$nextTick(() => {
this.$refs.uploadForm.reset()
})
},
handleRemoveFile(row) {
this.$confirm(this.$t('trials:trialDocument:message:delete'), {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
this.fileList.splice(
this.fileList.findIndex((item) => item.id === row.id),
1
)
let flag = this.successFileList.some((item) => item.id === row.id)
if (flag) {
this.successFileList.splice(
this.successFileList.findIndex((item) => item.id === row.id),
1
)
}
})
.catch(() => {})
},
//
async beginUpload() {
this.loading = true
this.isFail = false
const fileMaxSize = 1024 * 1024 * 1024 * 2 // 1G
var currentFilesSize = 0
this.selectArr.forEach((item) => {
currentFilesSize += item.size
})
if (currentFilesSize / fileMaxSize > 1) {
// 'Upload file size cannot exceed 1G'
this.$alert(this.$t('trials:trialDocument:message:uploadSize'))
this.loading = false
} else {
this.selectArr.forEach((item) => (item.status = 0))
let num = this.selectArr.length > 6 ? 6 : this.selectArr.length
let funArr = []
for (let i = 0; i < num; i++) {
funArr.push(this.handleUploadTask(this.selectArr, i))
}
if (funArr.length > 0) {
let res = await Promise.all(funArr)
}
}
},
//
async handleUploadTask(arr, index) {
if (!this.config.visible) return
let file = this.fileList.filter((item) => item.id === arr[index].id)[0]
file.status = 1
let fileType = file.name
.substring(file.name.lastIndexOf('.'))
.toLocaleLowerCase()
// let fileName = file.name
// .substring(0, file.name.lastIndexOf('.'))
// .toLocaleLowerCase()
let path = `${this.uploadPath}/${this.$guid()}${fileType}`
file.curPath = path
const fileData = await this.fileToBlob(file.file)
let res = await this.fileToOss(path, fileData, file)
if (res) {
file.status = 2
this.successFileList.push({
FileName: file.name,
FilePath: this.$getObjectName(res.url),
FileSize: file.size,
FileFormat: fileType,
})
let flag = arr.every((item) => item.status === 2)
if (flag) {
return this.submitFile(this.successFileList)
}
} else {
file.status = 3
}
let flag = arr.every((item) => item.status > 1)
if (flag) {
let failFileList = arr.filter((item) => item.status === 3)
if (failFileList && failFileList.length > 0) {
this.$refs.filesTable.clearSelection()
failFileList.forEach((row) => {
row.uploadFileSize = 0
this.$refs.filesTable.toggleRowSelection(row)
})
this.isFail = true
this.submitFile(this.successFileList, true)
return false
}
}
let ind = arr.findIndex((item) => item.status === 0)
if (ind >= 0) {
return this.handleUploadTask(arr, ind)
} else {
return false
}
},
// fileoss
async fileToOss(path, file, item) {
try {
let res = await this.OSSclient.multipartUpload(
{
path,
file,
speed: true,
},
(percentage, checkpoint, lastPer) => {
item.uploadFileSize += checkpoint.size * (percentage - lastPer)
if (item.uploadFileSize > file.fileSize) {
item.uploadFileSize = file.fileSize
}
}
)
if (res) {
return res
} else {
return false
}
} catch (err) {
console.log(err)
return false
}
},
submitFile(list, isReLoad = false) {
if (!this.config.visible) return
if (!isReLoad) {
this.reset()
}
let arr = deepClone(list)
this.$emit('uplaodFile', arr)
},
reset() {
this.loading = false
this.selectArr = []
this.successFileList = []
this.OSSclient.close()
this.$emit('close')
},
openFile(isFolder = false) {
this.fileInput = document.createElement('input')
this.fileInput.type = 'file'
this.fileInput.addEventListener('change', this.beginScanFiles)
if (isFolder) {
this.fileInput.accept = '*/*'
//webkitdirectory directory
this.fileInput.webkitdirectory = 'webkitdirectory'
this.fileInput.directory = 'directory'
} else {
this.fileInput.accept = this.faccept.join(',')
}
console.log(this.fileInput)
this.fileInput.click()
},
},
watch: {
isFail() {
if (this.isFail) {
this.$confirm(this.$t('trials:trialDocument:failUpload'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: this.$t('common:button:confirm'),
cancelButtonText: this.$t('common:button:cancel'),
})
.then(() => {
this.beginUpload()
})
.catch((err) => {
this.loading = false
console.log(err)
})
}
},
loading() {
store.dispatch('trials/setUnLock', this.loading)
},
},
mounted() {
this.openFile(this.config.isFolder)
},
beforeDestroy() {
store.dispatch('trials/setUnLock', false)
this.OSSclient.close()
},
}
</script>
<style lang="scss" scoped>
.upload {
display: inline-block;
height: 30px;
width: 90px;
padding: 2px 10px;
line-height: 23px;
position: relative;
text-decoration: none;
border-radius: 3px;
overflow: hidden;
text-align: center;
background: #428bca;
border-color: #428bca;
color: #fff;
.select-file {
height: 30px;
width: 90px;
position: absolute;
overflow: hidden;
left: 0;
top: 0;
opacity: 0;
font-size: 0;
}
.btn-select {
//
width: 90px;
height: 30px;
line-height: 30px;
text-align: center;
cursor: pointer;
border-radius: 24px;
overflow: hidden;
position: absolute;
top: 0;
left: 0;
pointer-events: none; //pointer-events:none穿
}
}
</style>

View File

@ -238,7 +238,7 @@
:reading-id="selected.ReadingId"
:clinical-form-id="selected.ClinicalFormId"
:open-type="'look'"
@close=""
@close="false"
/>
</div>
</div>

View File

@ -138,6 +138,15 @@
}}</span><span style="margin:0 0.25rem">·</span><span>{{ tabList.PM_ReReadingApprovalCount }}</span>
</div>
</div>
<!-- 重传审批 -->
<div class="my_select_box" :class="{ selected: selected === 'ReuploadAudit' }" tab-data="ReuploadAudit"
@click="selected = 'ReuploadAudit'" v-if="hasPermi(['trials:trials-workbench:ReuploadAudit'])">
<div class="my_select_box_content">
<span class="el-icon-document-checked" style="padding: 4px;margin: 4px;color: #6698ff"></span>
<span class="my_select_box_content_text">{{ $t('trials:trials-panel:attachments:ReuploadAudit')
}}</span><span style="margin:0 0.25rem">·</span><span>{{ tabList.PM_ImageBackApprovalCount }}</span>
</div>
</div>
<!-- 阅片人筛选 -->
<div class="my_select_box" :class="{ selected: selected === 'ReviewerScreen' }" tab-data="ReviewerScreen"
@click="selected = 'ReviewerScreen'" v-if="hasPermi(['trials:trials-workbench:reviewerScreen'])">
@ -331,7 +340,7 @@
</div>
<!-- 稽查文档 -->
<div class="my_select_box" :class="{ selected: selected === 'viewAuditDocument' }"
tab-data="viewAuditDocument" @click="selected = 'viewAuditDocument'"
tab-data="viewAuditDocument" @click="handleClick('viewAuditDocument')"
v-if="hasPermi(['trials:trials-workbench:viewAuditDocument'])">
<div class="my_select_box_content">
<span class="el-icon-folder-checked" style="padding: 4px;margin: 4px;color: #6698ff"></span>
@ -349,7 +358,7 @@
</div>
<!-- 稽查文档管理 -->
<div class="my_select_box" :class="{ selected: selected === 'updateAuditDocument' }"
tab-data="updateAuditDocument" @click="selected = 'updateAuditDocument'"
tab-data="updateAuditDocument" @click="handleClick('updateAuditDocument')"
v-if="hasPermi(['trials:trials-workbench:updateAuditDocument'])">
<div class="my_select_box_content">
<span class="el-icon-folder-checked" style="padding: 4px;margin: 4px;color: #6698ff"></span>
@ -375,6 +384,9 @@
<!-- 重阅审批 -->
<RereadApproval v-if="selected === 'RereadApproval'" :trial-id-list="trialIdList"
:is-sign-system-doc="tabList.SysWaitSignDocCount > 0 && !isTestUser" />
<!-- 重c传审批 -->
<ReuploadAudit v-if="selected === 'ReuploadAudit'" :trial-id-list="trialIdList"
:is-sign-system-doc="tabList.SysWaitSignDocCount > 0 && !isTestUser" />
<!-- 阅片人筛选 -->
<ReviewerScreen v-if="selected === 'ReviewerScreen'" :trial-id-list="trialIdList"
:is-sign-system-doc="tabList.SysWaitSignDocCount > 0 && !isTestUser" />
@ -559,6 +571,7 @@ import MedicalAudit from './components/medicalAudit'
import NeedSignedTrialDoc from './components/NeedSignedTrialDoc'
import auditDocument from "./components/auditDocument"
import generalTraining from "./components/generalTraining"
import ReuploadAudit from "./components/ReuploadAudit"
import store from '@/store'
import './index.css'
@ -593,7 +606,8 @@ export default {
MedicalFeedback,
MedicalAudit,
NeedSignedTrialDoc,
NeedSignedSysDoc
NeedSignedSysDoc,
ReuploadAudit
},
data() {
return {
@ -634,6 +648,12 @@ export default {
});
},
methods: {
handleClick(key) {
this.selected = null;
this.$nextTick(() => {
this.selected = key
})
},
getUserInfo() {
getUser().then(async res => {
this.user = res.Result

View File

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
html,
body {
width: 99%;
height: 99%;
}
</style>
<title></title>
<!-- 引入外部JavaScript文件 -->
<script type="text/javascript"
src="https://onlyoffice.test.extimaging.com/web-apps/apps/api/documents/api.js"></script>
</head>
<body>
<div id="placeholder"></div>
<script language="javascript" type="text/javascript">
var obj = {}
var str = window.location.search.substr(1)
str = str.split('?')[1]
var url = window.location.search.substr(1).split('?')[0].split('=')[1]
var arrList = str.split('&')
arrList.forEach(function (item) {
var arr = item.split('=')
obj[arr[0]] = window.decodeURIComponent(arr[1])
})
var docEditor = new window.DocsAPI.DocEditor("placeholder", {
type: "embedded",
"document": {
"fileType": obj.type,
"key": "Khirz6zTPdfd7" + Date.now(),
"title": obj.title,
"url": url,
},
// editorConfig: {
// lang:'zh'
// },
"documentType": obj.documentType,
"height": "100%",
});
</script>
</body>
</html>

View File

@ -24,10 +24,10 @@ module.exports = defineConfig({
productionSourceMap: false,
devServer: {
port: '8080',
headers: {
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp'
},
// headers: {
// 'Cross-Origin-Opener-Policy': 'same-origin',
// 'Cross-Origin-Embedder-Policy': 'require-corp'
// },
// open: true,
client: {
overlay: {