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

main
caiyiling 2025-06-12 15:44:23 +08:00
commit a3e17bbefe
13 changed files with 1261 additions and 1290 deletions

View File

@ -1357,6 +1357,37 @@ export function deleteAttachment(data) {
data
})
}
// 项目文档-获取历史记录列表
export function getTrialHistoryRecordFileList(data) {
return request({
url: `/TrialHistoryRecordFile/getTrialHistoryRecordFileList`,
method: 'post',
data
})
}
// 项目文档-新增/修改历史记录
export function addOrUpdateTrialHistoryRecordFile(data) {
return request({
url: `/TrialHistoryRecordFile/addOrUpdateTrialHistoryRecordFile`,
method: 'post',
data
})
}
// 项目文档-批量新增历史记录
export function batchAddTrialHistoryRecordFile(data) {
return request({
url: `/TrialHistoryRecordFile/batchAddTrialHistoryRecordFile`,
method: 'post',
data
})
}
// 项目文档-删除历史记录
export function deleteTrialHistoryRecordFile(id) {
return request({
url: `/TrialHistoryRecordFile/deleteTrialHistoryRecordFile/${id}`,
method: 'delete',
})
}
// 邮件管理-批量修改邮件
export function batchUpdateEmail(data) {
return request({

View File

@ -4173,4 +4173,28 @@ export function setTrialShowInspection(data) {
method: 'post',
data
})
}
// 影像汇总-获取列表
export function getTrialVisitImageStatList(data) {
return request({
url: `/DownloadAndUpload/getTrialVisitImageStatList`,
method: 'post',
data
})
}
// 影像汇总-获取统计
export function getTrialVisitImageStatInfo(params) {
return request({
url: `/DownloadAndUpload/getTrialVisitImageStatInfo`,
method: 'get',
params
})
}
// 影像汇总-影像下载
export function getExportSubjectVisitImageList(data) {
return request({
url: `/DownloadAndUpload/getExportSubjectVisitImageList`,
method: 'post',
data
})
}

View File

@ -62,8 +62,9 @@
<!-- 用户类型 -->
<el-form-item :label="$t('trials:signRecords:table:userType')" v-if="!isDoc">
<el-select v-model="searchData.UserTypeId" clearable filterable style="width: 120px">
<el-option v-for="item of userTypeOptions" v-show="item.UserTypeEnum !== 26 && item.UserTypeEnum !== 27"
:key="item.Id" :label="item.UserTypeShortName" :value="item.Id">
<el-option v-for="item of userTypeOptions"
v-show="isSystem || (item.UserTypeEnum !== 26 && item.UserTypeEnum !== 27)" :key="item.Id"
:label="item.UserTypeShortName" :value="item.Id">
<span>{{ item.UserType }}</span>
</el-option>
</el-select>

View File

@ -352,7 +352,8 @@
</el-transfer> -->
<el-table ref="multipleTable" :data="$d.Modality" stripe height="450" row-key="id" class="criterion-table"
@selection-change="handleSelectionChange">
<el-table-column type="selection" align="left" width="45" :reserve-selection="true" />
<el-table-column type="selection" align="left" width="45" :reserve-selection="true"
:selectable="selectableModality" />
<el-table-column prop="value" :label="$t('trials:logincCfg:form:modality')" />
</el-table>
</div>
@ -404,7 +405,8 @@
</el-button>
<el-table ref="studyNameTable" v-loading="listLoading" :data="trialStudyNameList" stripe height="400"
row-key="Name" @selection-change="handleStudyNameSelectionChange">
<el-table-column type="selection" align="left" width="45" :reserve-selection="true" />
<el-table-column type="selection" align="left" width="45" :reserve-selection="true"
:selectable="selectableStudyName" />
<el-table-column prop="Name" :label="$t('trials:logincCfg:form:studyName')">
<template slot-scope="scope">
<div class="bodyPartName">
@ -412,6 +414,7 @@
isEN ? scope.row.EnName : scope.row.Name
}}</span>
<el-button circle icon="el-icon-delete" :title="$t('trials:logincCfg:form:StudyName:del')"
:disabled="form.StudyUseStudyNameList.includes(row.Name) || form.StudyUseStudyNameList.includes(row.EnName)"
@click.stop="handleDelStudyName(scope.row)" />
</div>
</template>
@ -503,6 +506,8 @@ export default {
IsTrialBasicLogicConfirmed: false,
TrialObjectNameList: [],
TrialObjectNameConfigStr: '',
StudyUseModalityList: [],
StudyUseStudyNameList: []
// ClinicalDataSetNames: [],
// ClinicalDataTrialSetIds: [],
// ClinicalDataSetNamesStr: ''
@ -709,6 +714,12 @@ export default {
},
},
methods: {
selectableStudyName(row) {
return !this.form.StudyUseStudyNameList.includes(row.Name) || !this.form.StudyUseStudyNameList.includes(row.EnName)
},
selectableModality(row) {
return !this.form.StudyUseModalityList.includes(row.value)
},
selectableBodyPart(row) {
return !row.IsStudyUse
},

View File

@ -50,8 +50,9 @@
</el-form-item>
<!-- 操作名 -->
<el-form-item :label="$t('trials:auditRecord:table:operationName')">
<el-select v-model="searchData.Description" style="width:120px" filterable clearable>
<el-option v-for="item of DescriptionOptions" :value="item" :label="item" :key="item" />
<el-select v-model="searchData.FrontAuditConfigId" style="width:120px" filterable clearable>
<el-option v-for="item of DescriptionOptions" :value="item.FrontAuditConfigId" :label="item.Description"
:key="item.FrontAuditConfigId" />
</el-select>
</el-form-item>
<!-- 是否签名 -->
@ -646,6 +647,7 @@ const searchDataDefault = () => {
StartTime: null,
EndTime: null,
Description: null,
FrontAuditConfigId: null,
OpByUserName: null,
BatchId: null,
TrialReadingCriterionId: null,
@ -761,7 +763,7 @@ export default {
}
},
getModuleTypeDescriptionList(v) {
this.searchData.Description = null
this.searchData.FrontAuditConfigId = null
if (!v) return false
let params = {
moduleTypeId: v,
@ -842,6 +844,9 @@ export default {
return
}
if (v.DataType === 'ImageList') {
if(obj[v.Code]){
obj[v.Code] = obj[v.Code].filter(s => s && s.trim())
}
if (obj[v.Code] && obj[v.Code].length > 0) {
// obj[v.Code].forEach((o,i) => {
// var uo = upObj && upObj.length > 0 ? upObj[v.Code][i] : 0

View File

@ -0,0 +1,357 @@
<template>
<BaseContainer class="image-summary-wrapper">
<template slot="search-container">
<el-form :inline="true">
<!-- 中心 -->
<el-form-item :label="$t('trials:imageSummary:table:siteNo')">
<el-select v-model="searchData.TrialSiteId" clearable filterable>
<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:imageSummary:table:subject')">
<el-input v-model="searchData.SubjectCode" />
</el-form-item>
<!-- 拍片时间 -->
<el-form-item :label="$t('trials:imageSummary:table:operateTime')">
<el-date-picker v-model="timeList" @change="changeTimeList" value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']" type="datetimerange">
</el-date-picker>
</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-button type="primary" @click="handleExport">
{{ $t('common:button:export') }}
</el-button>
<el-button type="primary" @click="handleExportImage(false)" :disabled="selectArr.length <= 0"
v-if="hasPermi(['trials:trials-panel:trial-summary:image-summary:export'])">
{{ $t('trials:imageSummary:button:export_dicom') }}
</el-button>
<el-button type="primary" @click="handleExportImage(true)" :disabled="selectArr.length <= 0"
v-if="hasPermi(['trials:trials-panel:trial-summary:image-summary:export'])">
{{ $t('trials:imageSummary:button:export_image') }}
</el-button>
<el-button type="primary" @click="statistics">
{{ $t('trials:imageSummary:button:statistics') }}
</el-button>
</el-form-item>
</el-form>
</template>
<template slot="main-container">
<el-table v-adaptive="{ bottomOffset: 60 }" v-loading="loading" :data="list" @sort-change="handleSortChange"
@selection-change="handleSelectionChange" stripe height="100"
:default-sort="{ prop: 'CreateTime', order: 'descending' }">
<el-table-column type="selection" width="55" />
<!-- 中心编号 -->
<el-table-column prop="TrialSiteCode" min-width="100" :label="$t('trials:imageSummary:table:siteNo')"
show-overflow-tooltip sortable="custom" />
<!-- 受试者 -->
<el-table-column prop="SubjectCode" min-width="100" :label="$t('trials:imageSummary:table:subject')"
show-overflow-tooltip sortable="custom" />
<!-- 访视 -->
<el-table-column prop="VisitName" min-width="120" :label="$t('trials:imageSummary:table:visit')"
show-overflow-tooltip sortable="custom" />
<!-- 检查数量 -->
<el-table-column prop="TotalStudyCount" min-width="120"
:label="$t('trials:imageSummary:table:TotalStudyCount')" show-overflow-tooltip sortable="custom" />
<!-- 影像类型 -->
<el-table-column prop="VisitName" min-width="120" :label="$t('trials:imageSummary:table:imageType')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsHaveDicom" type="primary">{{
$fd('IsDicom', true)
}}</el-tag>
<el-tag v-if="scope.row.IsHaveNoneDicom" type="primary">{{
$fd('IsDicom', false)
}}</el-tag>
</template>
</el-table-column>
<!-- 影像数量 -->
<el-table-column prop="TotalImageCount" min-width="120"
:label="$t('trials:imageSummary:table:TotalImageCount')" show-overflow-tooltip sortable="custom" />
<!-- 影像大小 -->
<el-table-column prop="TotalImageSizeStr" min-width="120"
:label="$t('trials:imageSummary:table:TotalImageSizeStr')" show-overflow-tooltip
sortable="custom" />
<!-- 最早拍片日期 -->
<el-table-column prop="EarliestScanDate" min-width="120"
:label="$t('trials:imageSummary:table:EarliestScanDate')" show-overflow-tooltip sortable="custom" />
<!-- 最晚拍片日期 -->
<el-table-column prop="LatestScanDate" min-width="120"
:label="$t('trials:imageSummary:table:LatestScanDate')" show-overflow-tooltip sortable="custom" />
<el-table-column prop="" fixed="right" :label="$t('common:action:action')" show-overflow-tooltip
v-if="hasPermi(['trials:trials-panel:trial-summary:image-summary:toUpload', 'trials:tab:uploadMonitor'])">
<template slot-scope="scope">
<!-- 详情 -->
<el-button icon="el-icon-position" circle @click="toUpload(scope.row)"
:title="$t('trials:imageSummary:action:toUpload')" />
</template>
</el-table-column>
</el-table>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
<div class="remark">
<span>{{ $t('trials:imageSummary:remark:TotalImageSizeStr') }}</span>
<span class="size">{{ image_size.TotalImageSizeStr }}</span>,
<span>{{ $t('trials:imageSummary:remark:SubjectImageAVGSizeStr') }}</span>
<span class="size">{{ image_size.SubjectImageAVGSizeStr }} </span>,
<span>{{ $t('trials:imageSummary:remark:SubjectVisitImageAVGSizeStr') }}</span>
<span class="size">{{ image_size.SubjectVisitImageAVGSizeStr }}</span>,
<span>{{ $t('trials:imageSummary:remark:CheckImageSize') }}</span>
<span class="size">{{ image_size.CheckImageSize }} </span>
</div>
</template>
</BaseContainer>
</template>
<script>
import Pagination from '@/components/Pagination'
import BaseContainer from '@/components/BaseContainer'
import { getTrialSiteSelect, getTrialVisitImageStatList, getTrialVisitImageStatInfo, getExportSubjectVisitImageList } from '@/api/trials'
import { downLoadFile } from '@/utils/stream.js'
const searchDataDefault = () => {
return {
SortField: '',
Asc: false,
PageIndex: 1,
PageSize: 20,
TrialSiteId: null,
SubjectCode: null,
BeginScanDate: null,
EndScanDate: null
}
}
export default {
name: "imageSummary",
components: { Pagination, BaseContainer },
data() {
return {
total: 0,
loading: false,
searchData: searchDataDefault(),
ResearchProgramNo: null,
list: [],
siteOptions: [],
timeList: [],
selectArr: [],
image_size: {
TotalImageSizeStr: null,
SubjectImageAVGSizeStr: null,
SubjectVisitImageAVGSizeStr: null,
CheckImageSize: null
}
}
},
created() {
this.getSite()
this.getList()
},
methods: {
async getList() {
try {
this.searchData.TrialId = this.$route.query.trialId
this.loading = true
let res = await getTrialVisitImageStatList(this.searchData)
this.loading = false
if (res.IsSuccess) {
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}
} catch (err) {
this.loading = false
console.log(err)
}
},
//
handleExport() { },
//
async handleExportImage(IsKeyImage = false) {
try {
let data = {
TrialId: this.$route.query.trialId,
IsKeyImage
}
data.SubjectVisitIdList = this.selectArr.map(item => item.SubjectVisitId)
if (!IsKeyImage) {
let confirm = await this.$confirm(this.$t('trials:imageSummary:confirm:space').replace('xxx', this.image_size.CheckImageSize))
if (!confirm) return false
}
let res = await getExportSubjectVisitImageList(data)
if (res.IsSuccess) {
this.downLoad(IsKeyImage, res.Result)
}
} catch (err) {
console.log(err)
}
},
//
async downLoad(IsKeyImage = false, row) {
try {
let { files, name } = this.formatDownloadFile(IsKeyImage, row)
let res = await downLoadFile(files, name, 'zip')
// }
} catch (err) {
console.log(err)
}
},
//
formatDownloadFile(IsKeyImage = false, row) {
let files = [],
name = `${this.$route.query.researchProgramNo}.zip`;
if (!IsKeyImage) {
//ID/ID/访/Study ID_Study Date_Modality/
row.VisitList.forEach(visit => {
if (visit.StudyList && visit.StudyList.length > 0) {
visit.StudyList.forEach(study => {
if (study.SeriesList && study.SeriesList.length > 0) {
study.SeriesList.forEach(serie => {
if (serie.InstancePathList && serie.InstancePathList.length > 0) {
serie.InstancePathList.forEach(instance => {
let instanceArr = instance.Path.split("/")
let fileName = instanceArr[instanceArr.length - 1]
let obj = {
name: `${visit.TrialSiteCode}/${visit.SubjectCode}/${visit.VisitName}/${study.StudyCode}_${study.StudyTime}_${serie.Modality}/${fileName}`,
url: this.OSSclientConfig.basePath + instance.Path,
}
files.push(obj)
})
}
})
}
})
}
if (visit.NoneDicomStudyList && visit.NoneDicomStudyList.length > 0) {
visit.NoneDicomStudyList.forEach(noneDicomStudy => {
if (noneDicomStudy.FileList && noneDicomStudy.FileList.length > 0) {
noneDicomStudy.FileList.forEach(file => {
let obj = {
name: `${visit.TrialSiteCode}/${visit.SubjectCode}/${visit.VisitName}/${noneDicomStudy.StudyCode}_${noneDicomStudy.ImageDate}_${noneDicomStudy.Modality}/${file.FileName}`,
url: this.OSSclientConfig.basePath + file.Path,
}
files.push(obj)
})
}
})
}
})
} else {
//()/ID/ID/访/-/
row.forEach(item => {
['QuestionMarkPictureList', 'TableQuestionRowPictureList'].forEach(key => {
if (item[key] && item[key].length > 0) {
item[key].forEach(data => {
['PicturePath', 'otherPicturePath'].forEach(imgKey => {
if (data[imgKey]) {
let arr = data[imgKey].split("/")
let fileName = arr[arr.length - 1]
let obj = {
name: `${item.CriterionName}/${item.TrialSiteCode}/${item.SubjectCode}/${item.VisitName}/${this.$fd('ArmEnum', item.ArmEnum)}_${this.$fd('YesOrNo', item.IsJudgeSelect)}/${fileName}`,
url: this.OSSclientConfig.basePath + data[imgKey],
}
files.push(obj)
}
})
})
}
})
})
}
return { files, name }
},
//
async statistics() {
try {
let params = {
TrialId: this.$route.query.trialId
}
this.loading = true
let res = await getTrialVisitImageStatInfo(params)
this.loading = false
if (res.IsSuccess) {
this.image_size.TotalImageSizeStr = res.Result.TotalImageSizeStr;
this.image_size.SubjectImageAVGSizeStr = res.Result.SubjectImageAVGSizeStr;
this.image_size.SubjectVisitImageAVGSizeStr = res.Result.SubjectVisitImageAVGSizeStr;
}
} catch (err) {
this.loading = false
console.log(err)
}
},
//
toUpload(row) {
let query = this.$route.query
query.siteId = row.TrialSiteId
query.subjectCode = row.SubjectCode
query.visitNum = row.VisitNum
this.$router.push({
path: '/trials/trials-panel/trial-summary/upload-monitor',
query
})
},
handleSelectionChange(selection) {
this.selectArr = selection
let num = this.selectArr.reduce((sum, item) => sum + item.TotalImageSize, 0)
if (num <= 0) return this.image_size.CheckImageSize = null
this.image_size.CheckImageSize = (num / 1024 / 1024).toFixed(3) + 'MB'
},
// site
getSite() {
getTrialSiteSelect(this.$route.query.trialId).then(res => {
this.siteOptions = res.Result
})
},
changeTimeList() {
if (this.timeList) {
this.searchData.BeginScanDate = this.timeList[0]
this.searchData.EndScanDate = this.timeList[1]
} else {
this.searchData.BeginScanDate = null
this.searchData.EndScanDate = null
}
},
handleReset() {
this.searchData = searchDataDefault()
this.timeList = []
this.getList()
},
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
handleSortChange(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()
},
}
}
</script>
<style lang="scss" scoped>
.image-summary-wrapper {
position: relative;
.remark {
position: absolute;
left: 5px;
bottom: 7px;
font-size: 12px;
.size {
display: inline-block;
min-width: 100px;
}
}
}
</style>

View File

@ -4,52 +4,25 @@
{{ TITLE }}
</div>
<el-form :inline="true" class="base-search-form topForm">
<el-form-item
:label="$t('trials:trialDocument:fileRecord:form:isConfirmRecord')"
v-if="isManage && hasEdit && !viewStatus"
>
<el-radio-group
v-model="DATA.IsConfirmRecord"
:disabled="rowBtnStatus === 'edit'"
>
<el-radio
:label="item.value"
v-for="item in $d.YesOrNo"
:key="item.id"
>{{ item.label }}
<el-form-item :label="$t('trials:trialDocument:fileRecord:form:isConfirmRecord')"
v-if="isManage && hasEdit && !viewStatus">
<el-radio-group v-model="DATA.IsConfirmRecord" :disabled="rowBtnStatus === 'edit'">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
:label="$t('trials:trialDocument:fileRecord:form:isEnable')"
v-if="isManage && hasEdit && !viewStatus"
>
<el-radio-group
v-model="DATA.IsEnable"
:disabled="rowBtnStatus === 'edit'"
>
<el-radio
:label="item.value"
v-for="item in $d.YesOrNo"
:key="item.id"
>{{ item.label }}
<el-form-item :label="$t('trials:trialDocument:fileRecord:form:isEnable')"
v-if="isManage && hasEdit && !viewStatus">
<el-radio-group v-model="DATA.IsEnable" :disabled="rowBtnStatus === 'edit'">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="isManage && hasEdit && !viewStatus">
<el-button
type="primary"
@click="rowBtnStatus = 'save'"
v-if="rowBtnStatus === 'edit'"
>
<el-button type="primary" @click="rowBtnStatus = 'save'" v-if="rowBtnStatus === 'edit'">
{{ $t('common:button:edit') }}
</el-button>
<el-button
type="primary"
:loading="rowBtnLoading"
@click="saveRowData"
v-if="rowBtnStatus === 'save'"
>
<el-button type="primary" :loading="rowBtnLoading" @click="saveRowData" v-if="rowBtnStatus === 'save'">
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
@ -58,32 +31,14 @@
<!-- 搜索框 -->
<div class="search" style="position: relative">
<el-form :inline="true" class="base-search-form">
<el-form-item
:label="$t('trials:trialDocument:fileRecord:search:name')"
>
<el-input
v-model="searchData.FileName"
style="width: 100px"
clearable
/>
<el-form-item :label="$t('trials:trialDocument:fileRecord:search:name')">
<el-input v-model="searchData.FileName" style="width: 100px" clearable />
</el-form-item>
<el-form-item
:label="$t('trials:trialDocument:fileRecord:search:isAuthorizedView')"
v-if="isManage && !viewStatus"
>
<el-select
v-if="!viewStatus"
v-model="searchData.IsAuthorizedView"
style="width: 100px"
placeholder=""
clearable
>
<el-option
v-for="item in $d.YesOrNo"
:key="item.id"
:label="item.label"
:value="item.value"
>
<el-form-item :label="$t('trials:trialDocument:fileRecord:search:isAuthorizedView')"
v-if="isManage && !viewStatus">
<el-select v-if="!viewStatus" v-model="searchData.IsAuthorizedView" style="width: 100px" placeholder=""
clearable>
<el-option v-for="item in $d.YesOrNo" :key="item.id" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
@ -91,134 +46,70 @@
<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-item v-if="isManage && !viewStatus">
<el-button
type="primary"
:disabled="selectTable.length <= 0"
v-if="hasAccredit && isManage && !viewStatus"
@click.stop="auth"
>
<el-button type="primary" :disabled="selectTable.length <= 0" v-if="hasAccredit && isManage && !viewStatus"
@click.stop="auth">
{{ $t('trials:trialDocument:fileRecord:button:accredit') }}
</el-button>
<el-button
type="primary"
v-if="hasEdit && isManage && !viewStatus"
@click.stop="openFile(false)"
>
<el-button type="primary" v-if="hasEdit && isManage && !viewStatus" @click.stop="openFile(false)">
{{ $t('trials:trialDocument:fileRecord:button:uploadFile') }}
</el-button>
<el-button
type="primary"
v-if="hasEdit && isManage && !viewStatus"
@click.stop="openFile(true)"
>
<el-button type="primary" v-if="hasEdit && isManage && !viewStatus" @click.stop="openFile(true)">
{{ $t('trials:trialDocument:fileRecord:button:uploadFolder') }}
</el-button>
<el-button
type="primary"
icon="el-icon-bottom"
:disabled="selectTable.length <= 0"
v-if="hasDownLoad && isManage && !viewStatus"
@click.stop="downLoad"
>
<el-button type="primary" icon="el-icon-bottom" :disabled="selectTable.length <= 0"
v-if="hasDownLoad && isManage && !viewStatus" @click.stop="downLoad">
{{ $t('trials:trialDocument:fileRecord:button:downLoadFile') }}
</el-button>
<el-button
type="primary"
v-if="hasDel && isManage && !viewStatus"
:disabled="selectTable.length <= 0"
@click.stop="delList"
>
<el-button type="primary" v-if="hasDel && isManage && !viewStatus" :disabled="selectTable.length <= 0"
@click.stop="delList">
{{ $t('trials:trialDocument:fileRecord:button:del') }}
</el-button>
</el-form-item>
</el-form>
</div>
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 75 }"
:data="list"
stripe
height="100"
style="width: 100%"
@sort-change="handleSortByColumn"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
v-if="isManage && !viewStatus"
/>
<el-table v-loading="loading" v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100" style="width: 100%"
@sort-change="handleSortByColumn" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" v-if="isManage && !viewStatus" />
<el-table-column type="index" v-else />
<!--名称-->
<el-table-column
prop="FileName"
:label="$t('trials:trialDocument:fileRecord:table:name')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="FileName" :label="$t('trials:trialDocument:fileRecord:table:name')" show-overflow-tooltip
sortable="custom">
<template slot-scope="scope">
<div
v-if="
scope.row.TrialFileRecord &&
scope.row.TrialFileRecord.TrialFileTypeId
"
style="display: flex; align-items: center"
>
<div v-if="
scope.row.TrialFileRecord &&
scope.row.TrialFileRecord.TrialFileTypeId
" style="display: flex; align-items: center">
<span class="fileName">{{
scope.row.TrialFileRecord.FileName
}}</span>
<div v-if="isManage && !viewStatus" class="fileBtnBox">
<i
class="el-icon-view"
@click.stop="preview(scope.row.TrialFileRecord)"
/>
<i
class="el-icon-download"
v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.TrialFileRecord, 'file')"
/>
<i
class="el-icon-delete"
v-if="hasDel"
@click.stop="delFile(scope.row, 'Trial')"
/>
<i class="el-icon-view" @click.stop="preview(scope.row.TrialFileRecord)" />
<i class="el-icon-download" v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.TrialFileRecord, 'file')" />
<i class="el-icon-delete" v-if="hasDel" @click.stop="delFile(scope.row, 'Trial')" />
</div>
</div>
<i
v-else-if="isManage && !viewStatus && hasEdit"
class="el-icon-upload2"
style="cursor: pointer; color: #409eff"
@click.stop="upload(scope.row, 'Trial', ['.pdf'])"
/>
<i v-else-if="isManage && !viewStatus && hasEdit" class="el-icon-upload2"
style="cursor: pointer; color: #409eff" @click.stop="upload(scope.row, 'Trial', ['.pdf'])" />
</template>
</el-table-column>
<el-table-column
prop="fileType"
:label="$t('trials:trialDocument:fileRecord:table:fileType')"
show-overflow-tooltip
>
<el-table-column prop="fileType" :label="$t('trials:trialDocument:fileRecord:table:fileType')"
show-overflow-tooltip>
<template slot-scope="scope">
<span v-if="scope.row.TrialFileRecord">{{
scope.row.TrialFileRecord.FileFormat
}}</span>
</template>
</el-table-column>
<el-table-column
prop="fileType"
:label="$t('trials:trialDocument:fileRecord:table:fileSize')"
show-overflow-tooltip
>
<el-table-column prop="fileType" :label="$t('trials:trialDocument:fileRecord:table:fileSize')"
show-overflow-tooltip>
<template slot-scope="scope">
<span v-if="scope.row.TrialFileRecord">{{
scope.row.TrialFileRecord.FileSize
@ -228,133 +119,52 @@
</template>
</el-table-column>
<!--历史记录-->
<el-table-column
prop="HistoryFileRecord"
:label="$t('trials:trialDocument:fileRecord:table:historyFileRecord')"
show-overflow-tooltip
v-if="isManage && !viewStatus"
>
<el-table-column prop="HistoryFileRecord" :label="$t('trials:trialDocument:fileRecord:table:historyFileRecord')"
show-overflow-tooltip v-if="isManage && !viewStatus">
<template slot-scope="scope">
<div
v-if="
scope.row.HistoryFileRecord &&
scope.row.HistoryFileRecord.TrialFileTypeId
"
style="display: flex; align-items: center"
>
<span class="fileName">{{
scope.row.HistoryFileRecord.FileName
}}</span>
<div v-if="isManage && !viewStatus" class="fileBtnBox">
<i
class="el-icon-download"
v-if="hasDownLoad"
@click.stop="
downLoad(false, scope.row.HistoryFileRecord, 'file')
"
/>
<i
class="el-icon-delete"
v-if="hasDel"
@click.stop="delFile(scope.row, 'History')"
/>
</div>
</div>
<i
v-else-if="isManage && !viewStatus"
class="el-icon-upload2"
style="cursor: pointer; color: #409eff"
@click.stop="upload(scope.row, 'History', ['.zip'])"
/>
<el-button type="text" @click.stop="openHistory(scope.row)">
{{ scope.row.HistoryCount }}
<i class="el-icon-upload2" />
</el-button>
</template>
</el-table-column>
<el-table-column
prop="IsAuthorizedView"
:label="$t('trials:trialDocument:fileRecord:table:isAuthorizedView')"
show-overflow-tooltip
sortable="custom"
v-if="isManage && !viewStatus"
>
<el-table-column prop="IsAuthorizedView" :label="$t('trials:trialDocument:fileRecord:table:isAuthorizedView')"
show-overflow-tooltip sortable="custom" v-if="isManage && !viewStatus">
<template slot-scope="scope">
<el-switch
:disabled="!scope.row.TrialFileRecord"
v-if="isManage && !viewStatus && hasEdit"
v-model="scope.row.IsAuthorizedView"
@change="(val) => auth(false, scope.row, val)"
:active-value="true"
:inactive-value="false"
:active-text="$fd('YesOrNo', true)"
:inactive-text="$fd('YesOrNo', false)"
>
<el-switch :disabled="!scope.row.TrialFileRecord" v-if="isManage && !viewStatus && hasEdit"
v-model="scope.row.IsAuthorizedView" @change="(val) => auth(false, scope.row, val)" :active-value="true"
:inactive-value="false" :active-text="$fd('YesOrNo', true)" :inactive-text="$fd('YesOrNo', false)">
</el-switch>
<span v-else>{{ $fd('YesOrNo', scope.row.IsAuthorizedView) }}</span>
</template>
</el-table-column>
<el-table-column
prop="UpdateTime"
:label="$t('trials:trialDocument:fileRecord:table:updateTime')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
:label="$t('trials:trialDocument:fileRecord:table:createTime')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="UpdateTime" :label="$t('trials:trialDocument:fileRecord:table:updateTime')"
show-overflow-tooltip sortable="custom" />
<el-table-column prop="CreateTime" :label="$t('trials:trialDocument:fileRecord:table:createTime')"
show-overflow-tooltip sortable="custom" />
<el-table-column :label="$t('common:action:action')" width="200">
<template slot-scope="scope">
<el-button
icon="el-icon-view"
:title="$t('common:button:view')"
circle
:disabled="
!scope.row.TrialFileRecord || !scope.row.TrialFileRecord.FilePath
"
@click.stop="preview(scope.row.TrialFileRecord)"
/>
<el-button
v-if="hasDownLoad && isManage && !viewStatus"
icon="el-icon-download"
:title="$t('trials:trialDocument:fileRecord:button:downLoadFile')"
circle
:disabled="
!scope.row.TrialFileRecord || !scope.row.TrialFileRecord.FilePath
"
@click.stop="downLoad(false, scope.row.TrialFileRecord, 'file')"
/>
<el-button
v-if="hasDel && isManage && !viewStatus"
icon="el-icon-delete"
:title="$t('trials:trialDocument:fileRecord:button:delete')"
circle
@click.stop="handleDel(scope.row)"
/>
<el-button icon="el-icon-view" :title="$t('common:button:view')" circle :disabled="!scope.row.TrialFileRecord || !scope.row.TrialFileRecord.FilePath
" @click.stop="preview(scope.row.TrialFileRecord)" />
<el-button v-if="hasDownLoad && isManage && !viewStatus" icon="el-icon-download"
:title="$t('trials:trialDocument:fileRecord:button:downLoadFile')" circle :disabled="!scope.row.TrialFileRecord || !scope.row.TrialFileRecord.FilePath
" @click.stop="downLoad(false, scope.row.TrialFileRecord, 'file')" />
<el-button v-if="hasDel && isManage && !viewStatus" icon="el-icon-delete"
:title="$t('trials:trialDocument:fileRecord:button:delete')" circle @click.stop="handleDel(scope.row)" />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<upload-files
:config="config"
:faccept="faccept"
:uploadPath="uploadPath"
:limitLength="limitLength"
v-if="config.visible"
@close="close"
@uplaodFile="uplaodFile"
/>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
<upload-files :config="config" :faccept="faccept" :uploadPath="uploadPath" :limitLength="limitLength"
v-if="config.visible" @close="close" @uplaodFile="uplaodFile" />
<history-file-list :config="file_config" :rowData="fileData" :uploadPath="uploadPath" @getList="getList" />
</box-content>
</template>
<script>
<script>
import {
addOrUpdateTrialFileType,
getTrialNormalRecordList,
@ -369,6 +179,7 @@ import { deepClone } from '@/utils/index.js'
import Pagination from '@/components/Pagination'
import BoxContent from '@/components/BoxContent'
import uploadFiles from '../uploadFiles.vue'
import historyFileList from '../historyFileList.vue'
const searchDataDefault = () => {
return {
IsAuthorizedView: null,
@ -381,7 +192,7 @@ const searchDataDefault = () => {
}
export default {
name: 'fileRecord',
components: { BoxContent, Pagination, uploadFiles },
components: { BoxContent, Pagination, uploadFiles, historyFileList },
props: {
viewStatus: {
type: Boolean,
@ -426,9 +237,25 @@ export default {
limitLength: 0,
DATA: {},
fileData: {},
file_config: {
visible: false,
title: this.$t('trials:trialDocument:historyFileList:title'),
width: '800px',
}
}
},
methods: {
openHistory(row) {
this.fileData = {
Name: row.TrialFileRecord ? row.TrialFileRecord.FileName : '',
Id: row.Id,
TrialFileTypeId: this.rowData.Id
}
this.file_config.visible = true
},
//
async uplaodFile(list) {
console.log(list, 'list')
@ -775,7 +602,7 @@ export default {
this.DATA = Object.assign({}, this.rowData)
},
immediate: true,
deep:true
deep: true
},
},
created() {
@ -823,34 +650,39 @@ export default {
])
},
TITLE() {
return `${this.$fd('ArchiveType', this.ArchiveTypeEnum)}${
this.isEN ? this.rowData.Name : this.rowData.NameCN
}`
return `${this.$fd('ArchiveType', this.ArchiveTypeEnum)}${this.isEN ? this.rowData.Name : this.rowData.NameCN
}`
},
},
}
</script>
<style lang="scss" scoped>
<style lang="scss" scoped>
.title {
line-height: 40px;
font-weight: bold;
margin-bottom: 10px;
}
.fileName {
display: inline-block;
max-width: calc(100% - 60px);
white-space: nowrap; /* 文本不换行 */
overflow: hidden; /* 超出部分隐藏 */
white-space: nowrap;
/* 文本不换行 */
overflow: hidden;
/* 超出部分隐藏 */
text-overflow: ellipsis;
margin-right: 3px;
}
.fileBtnBox {
display: inline-block;
width: 50px;
i {
cursor: pointer;
color: #409eff;
margin-right: 3px;
&:last-child {
margin: 0;
}

View File

@ -0,0 +1,351 @@
<template>
<div v-if="config.visible">
<base-model :config="config">
<template slot="dialog-body">
<el-form ref="form" :model="rowData" label-width="80px" style="width: 80%;display: inline-block;">
<el-form-item :label="`${$t('trials:trialDocument:table:Name')}: `">
<span class="name text-ellipsis" :title="rowData.Name">{{ rowData.Name }}</span>
</el-form-item>
</el-form>
<el-button size="mini" type="primary" style="float:right" @click.stop="openFile(true)">
{{ $t('trials:trialDocument:historyFileList:button:addFolder') }}</el-button>
<div style="float:right;padding: 0 5px;width: 10px;height: 10px;"></div>
<el-button size="mini" type="primary" style="float:right" @click.stop="openFile(false)">
{{ $t('trials:trialDocument:historyFileList:button:addFile') }}</el-button>
<el-table :data="list" style="width: 100%" max-height="300px" v-loading="loading"
@sort-change="handleSortByColumn" @cell-mouse-enter="handleCellMouseEnter">
<el-table-column type="index" width="60" />
<el-table-column prop="FileName" :label="$t('trials:trialDocument:historyFileList:FileName')"
sortable="custom" width="200px">
<template slot-scope="scope">
<div v-if="renameId !== scope.row.Id" class="name_box">
<span class="name" :title="scope.row.FileName">{{ scope.row.FileName }}</span>
<i class="el-icon-edit icon_edit" @click="addRenameId(scope.row)"
:title="$t('trials:trialDocument:historyFileList:icon:rename')" />
</div>
<el-input v-model="scope.row.FileName" :ref="`renameInp_${scope.row.Id}`" :autofocus="true"
class="renameInp" @blur="save(scope.row)" v-else />
</template>
</el-table-column>
<el-table-column prop="FileFormat" :label="$t('trials:trialDocument:historyFileList:FileType')"
sortable="custom" />
<el-table-column prop="FileSize" :label="$t('trials:trialDocument:historyFileList:FileSize')"
sortable="custom">
<template slot-scope="scope">
<span>{{
scope.row.FileSize && scope.row.FileSize > 0
? `${(scope.row.FileSize / 1024 / 1024).toFixed(3)}MB`
: ''
}}</span>
</template>
</el-table-column>
<el-table-column prop="CreateTime" :label="$t('trials:trialDocument:historyFileList:CreateTime')"
sortable="custom" />
<el-table-column :label="$t('common:action:action')" min-width="120px">
<template slot-scope="scope">
<el-button size="mini" type="text" @click.stop="preview(scope.row)">
{{ $t('common:button:preview') }}
</el-button>
<el-button size="mini" type="text" @click.stop="del(scope.row)">
{{ $t('common:button:delete') }}
</el-button>
</template>
</el-table-column>
</el-table>
</template>
</base-model>
<viewer ref="picture_perview4" style="margin: 0 10px"
v-if="rowDATA.FileFormat && ['png', 'jpg', 'jpeg'].includes(rowDATA.FileFormat.toLowerCase())"
:images="[`${OSSclientConfig.basePath}${rowDATA.FilePath}`]" :options="viewerOptions">
<img v-show="false" :src="`${OSSclientConfig.basePath}${rowDATA.FilePath}`" alt="Image" />
</viewer>
<upload-files :config="upload_config" :faccept="faccept" :uploadPath="uploadPath" v-if="upload_config.visible"
@close="close" @uplaodFile="uplaodFile" />
</div>
</template>
<script>
import BaseModel from '@/components/BaseModel'
import uploadFiles from './uploadFiles.vue'
import { addOrUpdateTrialHistoryRecordFile, batchAddTrialHistoryRecordFile, getTrialHistoryRecordFileList, deleteTrialHistoryRecordFile } from '@/api/dictionary'
const defaultSearchData = () => {
return {
PageIndex: 1,
PageSize: 1000,
Asc: false,
OffLine: null,
SortField: null
}
}
export default {
components: {
BaseModel,
uploadFiles
},
props: {
config: {
type: Object,
default: () => {
return {
visible: false,
title: this.$t('trials:trialDocument:historyFileList:title'),
width: '800px',
}
}
},
rowData: {
type: Object,
default: () => {
return {}
}
},
uploadPath: {
type: String,
default: ''
}
},
data() {
return {
searchData: defaultSearchData(),
visible: false,
title: null,
list: [],
rowDATA: {},
loading: false,
viewerOptions: {
toolbar: {
zoomIn: true,
zoomOut: true,
reset: true,
prev: false,
next: false,
rotateLeft: true,
rotateRight: true,
flipHorizontal: true,
flipVertical: true,
}
},
upload_config: {
visible: false,
showClose: true,
width: '800px',
title: '',
appendToBody: false,
isFolder: false,
},
faccept: ['.jpg',
'.jpeg',
'.png',
'.pdf',
'.ppt',
'.pptx',
'.doc',
'.docx',
'.xls',
'.xlsx',
".mp4",
".zip"],
renameId: null
}
},
watch: {
'rowData.Id': {
handler() {
if (this.rowData.Id) {
console.log(this.rowData)
this.getList()
}
},
deep: true,
immediate: true
}
},
methods: {
// hover
handleCellMouseEnter(row) {
this.hoverId = row.Id
},
addRenameId(row) {
this.renameId = row.Id
this.$nextTick(() => {
if (this.$refs[`renameInp_${row.Id}`]) {
this.$refs[`renameInp_${row.Id}`].focus()
}
})
},
close() {
this.upload_config.visible = false
},
getAllList() {
this.getList()
this.$emit("getList")
},
openAudit(row) {
this.form = Object.assign({}, row)
this.visible = true
},
async save(row) {
try {
if (!row.FileName) {
this.$message.warning(this.$t("trials:trialDocument:historyFileList:message:fileNameMust"))
return this.addRenameId(row)
}
this.renameId = null
let res = await addOrUpdateTrialHistoryRecordFile(row)
if (res.IsSuccess) {
this.getList()
}
} catch (err) {
console.log(err)
}
},
async del(row) {
try {
let confirm = await this.$confirm(this.$t("trials:trialDocument:historyFileList:message:del"))
if (!confirm) return false
this.loading = true
let res = await deleteTrialHistoryRecordFile(row.Id)
this.loading = false
if (res.IsSuccess) {
this.getAllList()
}
} catch (err) {
console.log(err)
this.loading = false
}
},
async uplaodFile(list) {
console.log(list, 'list')
try {
let arr = []
list.forEach(item => {
let obj = Object.assign({}, item)
obj.TrialFileTypeId = this.rowData.TrialFileTypeId
obj.TrialRecordId = this.rowData.Id
arr.push(obj)
});
this.loading = true
let res = await batchAddTrialHistoryRecordFile(arr)
this.loading = false
if (res.IsSuccess) {
this.getAllList()
}
} catch (err) {
this.loading = false
console.log(err)
}
},
openFile(isFolder = false) {
this.upload_config.title = this.$t(
'trials:trialDocument:fileRecord:form:title:uploadFile'
)
this.upload_config.visible = true
this.upload_config.isFolder = isFolder
},
async getList() {
try {
if (!this.rowData.Id) return false
this.searchData.TrialRecordId = this.rowData.Id
let res = await getTrialHistoryRecordFileList(this.searchData)
this.loading = false
if (res.IsSuccess) {
this.list = res.Result.CurrentPageData
}
} catch (err) {
this.loading = false
console.log(err)
}
},
preview(data) {
// return this.perview_visible = true
this.rowDATA = Object.assign({}, data)
if (['.ppt',
'.pptx',
'.doc',
'.docx',
'.xls',
'.xlsx'].includes(`.${data.FileFormat.toLowerCase()}`)) {
this.$onlyOffice({
path: data.FilePath,
type: data.FileFormat,
title: data.Name
})
}
if (['.jpg',
'.jpeg',
'.png'].includes(`.${data.FileFormat.toLowerCase()}`)) {
this.$nextTick(() => {
this.$refs['picture_perview4'].$viewer.show()
})
}
if (['.pdf'].includes(`.${data.FileFormat.toLowerCase()}`)) {
this.$preview({
path: data.Path || data.FilePath,
type: 'pdf',
title: data.Name,
})
}
if (['.mp4'].includes(`.${data.FileFormat.toLowerCase()}`)) {
this.$video({
path: data.Path || data.FilePath,
type: 'mp4',
title: data.Name,
})
}
},
//
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()
},
}
}
</script>
<style lang="scss" scoped>
.name {
display: block;
width: 90%;
}
.name_box {
display: flex;
align-items: center;
width: calc(100% - 20px);
.name {
max-width: calc(100% - 60px);
white-space: nowrap;
/* 文本不换行 */
overflow: hidden;
/* 超出部分隐藏 */
text-overflow: ellipsis;
}
}
.icon_edit {
cursor: pointer;
color: rgba(0, 0, 0, 0.3);
margin-left: 2px;
&:hover {
color: rgba(0, 0, 0, 0.5);
}
}
.renameInp {
::v-deep .el-input__inner {
line-height: 23px;
height: 23px;
}
}
</style>

View File

@ -1,131 +1,64 @@
<template>
<base-model :config="config">
<div slot="dialog-body">
<el-form
ref="reportDocForm"
:model="form"
label-width="140px"
size="small"
:rules="rules"
>
<el-form ref="reportDocForm" :model="form" label-width="140px" size="small" :rules="rules">
<div class="base-dialog-body">
<el-form-item
v-if="!config.upload"
:label="$t('trials:trialDocument:reportDoc:form:name')"
prop="Name"
>
<el-form-item v-if="!config.upload" :label="$t('trials:trialDocument:reportDoc:form:name')" prop="Name">
<el-input v-model="form.Name" />
</el-form-item>
<el-form-item
v-if="!config.upload"
:label="$t('trials:trialDocument:reportDoc:form:version')"
prop="Version"
>
<el-form-item v-if="!config.upload" :label="$t('trials:trialDocument:reportDoc:form:version')" prop="Version">
<el-input v-model="form.Version" />
</el-form-item>
<el-form-item
v-if="!config.upload"
:label="$t('trials:trialDocument:reportDoc:form:isAuthorizedView')"
prop="IsAuthorizedView"
>
<el-switch
v-model="form.IsAuthorizedView"
:active-value="true"
:inactive-value="false"
:active-text="$fd('YesOrNo', true)"
:inactive-text="$fd('YesOrNo', false)"
>
<el-form-item v-if="!config.upload" :label="$t('trials:trialDocument:reportDoc:form:isAuthorizedView')"
prop="IsAuthorizedView">
<el-switch v-model="form.IsAuthorizedView" :active-value="true" :inactive-value="false"
:active-text="$fd('YesOrNo', true)" :inactive-text="$fd('YesOrNo', false)">
</el-switch>
</el-form-item>
<el-form-item
v-if="!config.upload || config.upload === 'PDF'"
:label="$t('trials:trialDocument:reportDoc:form:pdfFileRecord')"
prop="PDFFileRecord"
>
<el-upload
class="upload-demo"
action
:before-upload="(param) => beforeUpload(param, 'PDF', '.pdf')"
:http-request="(param) => handleUploadFile(param, 'PDF')"
:on-remove="() => handleRemoveFile('PDF')"
:limit="1"
accept=".pdf"
:file-list="PDFFile"
>
<el-button
size="small"
type="primary"
:disabled="
!!form.PDFFileRecord && !!form.PDFFileRecord.FilePath
"
>{{ $t('common:button:upload') }}
<el-form-item v-if="!config.upload || config.upload === 'PDF'"
:label="$t('trials:trialDocument:reportDoc:form:pdfFileRecord')" prop="PDFFileRecord">
<el-upload class="upload-demo" action :before-upload="(param) => beforeUpload(param, 'PDF', '.pdf')"
:http-request="(param) => handleUploadFile(param, 'PDF')" :on-remove="() => handleRemoveFile('PDF')"
:limit="1" accept=".pdf" :file-list="PDFFile">
<el-button size="small" type="primary" :disabled="!!form.PDFFileRecord && !!form.PDFFileRecord.FilePath
">{{ $t('common:button:upload') }}
</el-button>
<span slot="tip" class="el-upload__tip">
{{ $t('trials:trialDocument:reportDoc:rule:mustPDF') }}
</span>
</el-upload>
</el-form-item>
<el-form-item
v-if="!config.upload || config.upload === 'Word'"
:label="$t('trials:trialDocument:reportDoc:form:wordFileRecord')"
>
<el-upload
class="upload-demo"
action
:before-upload="(param) => beforeUpload(param, 'Word', '.docx')"
:http-request="(param) => handleUploadFile(param, 'Word')"
:on-remove="() => handleRemoveFile('Word')"
:limit="1"
accept=".docx"
:file-list="WordFile"
>
<el-button
size="small"
type="primary"
:disabled="
!!form.WordFileRecord && !!form.WordFileRecord.FilePath
"
>{{ $t('common:button:upload') }}
<el-form-item v-if="!config.upload || config.upload === 'Word'"
:label="$t('trials:trialDocument:reportDoc:form:wordFileRecord')">
<el-upload class="upload-demo" action :before-upload="(param) => beforeUpload(param, 'Word', '.docx')"
:http-request="(param) => handleUploadFile(param, 'Word')" :on-remove="() => handleRemoveFile('Word')"
:limit="1" accept=".docx" :file-list="WordFile">
<el-button size="small" type="primary" :disabled="!!form.WordFileRecord && !!form.WordFileRecord.FilePath
">{{ $t('common:button:upload') }}
</el-button>
<span slot="tip" class="el-upload__tip">
{{ $t('trials:trialDocument:reportDoc:rule:mustDOCX') }}
</span>
</el-upload>
</el-form-item>
<el-form-item
v-if="!config.upload || config.upload === 'Sign'"
:label="$t('trials:trialDocument:reportDoc:form:signFileRecord')"
:prop="
rowData.IsConfirmRecord &&
(!config.upload || config.upload === 'Sign')
<el-form-item v-if="!config.upload || config.upload === 'Sign'"
:label="$t('trials:trialDocument:reportDoc:form:signFileRecord')" :prop="rowData.IsConfirmRecord &&
(!config.upload || config.upload === 'Sign')
? 'SignFileRecord'
: ''
"
>
<el-upload
class="upload-demo"
action
:before-upload="(param) => beforeUpload(param, 'Sign', '.pdf')"
:http-request="(param) => handleUploadFile(param, 'Sign')"
:on-remove="() => handleRemoveFile('Sign')"
:limit="1"
accept=".pdf"
:file-list="SignFile"
>
<el-button
size="small"
type="primary"
:disabled="
!!form.SignFileRecord && !!form.SignFileRecord.FilePath
"
>{{ $t('common:button:upload') }}
">
<el-upload class="upload-demo" action :before-upload="(param) => beforeUpload(param, 'Sign', '.pdf')"
:http-request="(param) => handleUploadFile(param, 'Sign')" :on-remove="() => handleRemoveFile('Sign')"
:limit="1" accept=".pdf" :file-list="SignFile">
<el-button size="small" type="primary" :disabled="!!form.SignFileRecord && !!form.SignFileRecord.FilePath
">{{ $t('common:button:upload') }}
</el-button>
<span slot="tip" class="el-upload__tip">
{{ $t('trials:trialDocument:reportDoc:rule:mustPDF') }}
</span>
</el-upload>
</el-form-item>
<el-form-item
<!-- <el-form-item
v-if="!config.upload || config.upload === 'History'"
:label="$t('trials:trialDocument:reportDoc:form:historyFileRecord')"
>
@ -151,7 +84,7 @@
{{ $t('trials:trialDocument:reportDoc:rule:mustZIP') }}
</span>
</el-upload>
</el-form-item>
</el-form-item> -->
</div>
</el-form>
</div>
@ -165,7 +98,7 @@
</div>
</base-model>
</template>
<script>
<script>
import baseModel from '@/components/BaseModel'
import { addOrUpdateTrialFinalRecord } from '@/api/dictionary'
export default {

View File

@ -4,65 +4,30 @@
{{ TITLE }}
</div>
<el-form :inline="true" class="base-search-form topForm">
<el-form-item
:label="$t('trials:trialDocument:reportDoc:form:firstFinalDate')"
>
<el-date-picker
:disabled="!isManage || rowBtnStatus === 'edit'"
v-model="DATA.FirstFinalDate"
type="date"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
placeholder=""
>
<el-form-item :label="$t('trials:trialDocument:reportDoc:form:firstFinalDate')">
<el-date-picker :disabled="!isManage || rowBtnStatus === 'edit'" v-model="DATA.FirstFinalDate" type="date"
value-format="yyyy-MM-dd" format="yyyy-MM-dd" placeholder="">
</el-date-picker>
</el-form-item>
<el-form-item
:label="$t('trials:trialDocument:reportDoc:form:isConfirmRecord')"
v-if="isManage && hasEdit && !viewStatus"
>
<el-radio-group
v-model="DATA.IsConfirmRecord"
:disabled="rowBtnStatus === 'edit'"
>
<el-radio
:label="item.value"
v-for="item in $d.YesOrNo"
:key="item.id"
>{{ item.label }}
<el-form-item :label="$t('trials:trialDocument:reportDoc:form:isConfirmRecord')"
v-if="isManage && hasEdit && !viewStatus">
<el-radio-group v-model="DATA.IsConfirmRecord" :disabled="rowBtnStatus === 'edit'">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
:label="$t('trials:trialDocument:reportDoc:form:isEnable')"
v-if="isManage && hasEdit && !viewStatus"
>
<el-radio-group
v-model="DATA.IsEnable"
:disabled="rowBtnStatus === 'edit'"
>
<el-radio
:label="item.value"
v-for="item in $d.YesOrNo"
:key="item.id"
>{{ item.label }}
<el-form-item :label="$t('trials:trialDocument:reportDoc:form:isEnable')"
v-if="isManage && hasEdit && !viewStatus">
<el-radio-group v-model="DATA.IsEnable" :disabled="rowBtnStatus === 'edit'">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="isManage && hasEdit && !viewStatus">
<el-button
type="primary"
@click="rowBtnStatus = 'save'"
v-if="rowBtnStatus === 'edit'"
>
<el-button type="primary" @click="rowBtnStatus = 'save'" v-if="rowBtnStatus === 'edit'">
{{ $t('common:button:edit') }}
</el-button>
<el-button
type="primary"
:loading="rowBtnLoading"
@click="saveRowData"
v-if="rowBtnStatus === 'save'"
>
<el-button type="primary" :loading="rowBtnLoading" @click="saveRowData" v-if="rowBtnStatus === 'save'">
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
@ -74,32 +39,14 @@
<el-form-item :label="$t('trials:trialDocument:reportDoc:search:name')">
<el-input v-model="searchData.Name" style="width: 100px" clearable />
</el-form-item>
<el-form-item
:label="$t('trials:trialDocument:reportDoc:search:version')"
>
<el-input
v-model="searchData.Version"
style="width: 100px"
clearable
/>
<el-form-item :label="$t('trials:trialDocument:reportDoc:search:version')">
<el-input v-model="searchData.Version" style="width: 100px" clearable />
</el-form-item>
<el-form-item
:label="$t('trials:trialDocument:reportDoc:search:isAuthorizedView')"
v-if="isManage && !viewStatus"
>
<el-select
v-if="!viewStatus"
v-model="searchData.IsAuthorizedView"
style="width: 100px"
placeholder=""
clearable
>
<el-option
v-for="item in $d.YesOrNo"
:key="item.id"
:label="item.label"
:value="item.value"
>
<el-form-item :label="$t('trials:trialDocument:reportDoc:search:isAuthorizedView')"
v-if="isManage && !viewStatus">
<el-select v-if="!viewStatus" v-model="searchData.IsAuthorizedView" style="width: 100px" placeholder=""
clearable>
<el-option v-for="item in $d.YesOrNo" :key="item.id" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
@ -107,321 +54,143 @@
<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-item v-if="isManage && !viewStatus">
<el-button
type="primary"
:disabled="selectTable.length <= 0"
v-if="hasAccredit && isManage && !viewStatus"
@click.stop="auth"
>
<el-button type="primary" :disabled="selectTable.length <= 0" v-if="hasAccredit && isManage && !viewStatus"
@click.stop="auth">
{{ $t('trials:trialDocument:reportDoc:button:accredit') }}
</el-button>
<el-button
type="primary"
v-if="hasAdd && isManage && !viewStatus"
@click.stop="handleAdd"
>
<el-button type="primary" v-if="hasAdd && isManage && !viewStatus" @click.stop="handleAdd">
{{ $t('trials:trialDocument:reportDoc:button:add') }}
</el-button>
<el-button
type="primary"
icon="el-icon-bottom"
:disabled="selectTable.length <= 0"
v-if="hasDownLoad && isManage && !viewStatus"
@click.stop="downLoad"
>
<el-button type="primary" icon="el-icon-bottom" :disabled="selectTable.length <= 0"
v-if="hasDownLoad && isManage && !viewStatus" @click.stop="downLoad">
{{ $t('trials:trialDocument:reportDoc:button:downLoadFile') }}
</el-button>
</el-form-item>
</el-form>
</div>
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 75 }"
:data="list"
stripe
height="100"
style="width: 100%"
@sort-change="handleSortByColumn"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
v-if="isManage && !viewStatus"
/>
<el-table v-loading="loading" v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100" style="width: 100%"
@sort-change="handleSortByColumn" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" v-if="isManage && !viewStatus" />
<el-table-column type="index" v-else />
<el-table-column
prop="Name"
:label="$t('trials:trialDocument:reportDoc:table:name')"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Version"
:label="$t('trials:trialDocument:reportDoc:table:version')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="Name" :label="$t('trials:trialDocument:reportDoc:table:name')" sortable="custom"
show-overflow-tooltip />
<el-table-column prop="Version" :label="$t('trials:trialDocument:reportDoc:table:version')" show-overflow-tooltip
sortable="custom" />
<!--定稿PDF-->
<el-table-column
prop="PDFFileRecord"
:label="$t('trials:trialDocument:reportDoc:table:pdfFileRecord')"
show-overflow-tooltip
>
<el-table-column prop="PDFFileRecord" :label="$t('trials:trialDocument:reportDoc:table:pdfFileRecord')"
show-overflow-tooltip>
<template slot-scope="scope">
<div
v-if="
scope.row.PDFFileRecord && scope.row.PDFFileRecord.TrialFileTypeId
"
style="display: flex; align-items: center"
>
<div v-if="
scope.row.PDFFileRecord && scope.row.PDFFileRecord.TrialFileTypeId
" style="display: flex; align-items: center">
<span class="fileName">{{ scope.row.PDFFileRecord.FileName }}</span>
<div v-if="isManage && !viewStatus" class="fileBtnBox">
<i
class="el-icon-view"
@click.stop="preview(scope.row.PDFFileRecord)"
/>
<i
class="el-icon-download"
v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.PDFFileRecord, 'file')"
/>
<i
class="el-icon-delete"
v-if="hasDel"
@click.stop="delFile(scope.row, 'PDF')"
/>
<i class="el-icon-view" @click.stop="preview(scope.row.PDFFileRecord)" />
<i class="el-icon-download" v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.PDFFileRecord, 'file')" />
<i class="el-icon-delete" v-if="hasDel" @click.stop="delFile(scope.row, 'PDF')" />
</div>
</div>
<i
v-else-if="isManage && !viewStatus && hasEdit"
class="el-icon-upload2"
style="cursor: pointer; color: #409eff"
@click.stop="upload(scope.row, 'PDF')"
/>
<i v-else-if="isManage && !viewStatus && hasEdit" class="el-icon-upload2"
style="cursor: pointer; color: #409eff" @click.stop="upload(scope.row, 'PDF')" />
</template>
</el-table-column>
<!--定稿WORD-->
<el-table-column
prop="WordFileRecord"
:label="$t('trials:trialDocument:reportDoc:table:wordFileRecord')"
show-overflow-tooltip
v-if="isManage && !viewStatus"
>
<el-table-column prop="WordFileRecord" :label="$t('trials:trialDocument:reportDoc:table:wordFileRecord')"
show-overflow-tooltip v-if="isManage && !viewStatus">
<template slot-scope="scope">
<div
v-if="
scope.row.WordFileRecord &&
scope.row.WordFileRecord.TrialFileTypeId
"
style="display: flex; align-items: center"
>
<div v-if="
scope.row.WordFileRecord &&
scope.row.WordFileRecord.TrialFileTypeId
" style="display: flex; align-items: center">
<span class="fileName">{{
scope.row.WordFileRecord.FileName
}}</span>
<div v-if="isManage && !viewStatus" class="fileBtnBox">
<i
class="el-icon-download"
v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.WordFileRecord, 'file')"
/>
<i
class="el-icon-delete"
v-if="hasDel"
@click.stop="delFile(scope.row, 'Word')"
/>
<i class="el-icon-download" v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.WordFileRecord, 'file')" />
<i class="el-icon-delete" v-if="hasDel" @click.stop="delFile(scope.row, 'Word')" />
</div>
</div>
<i
v-else-if="isManage && !viewStatus && hasEdit"
class="el-icon-upload2"
style="cursor: pointer; color: #409eff"
@click.stop="upload(scope.row, 'Word')"
/>
<i v-else-if="isManage && !viewStatus && hasEdit" class="el-icon-upload2"
style="cursor: pointer; color: #409eff" @click.stop="upload(scope.row, 'Word')" />
</template>
</el-table-column>
<!--签字页-->
<el-table-column
prop="SignFileRecord"
:label="$t('trials:trialDocument:reportDoc:table:signFileRecord')"
show-overflow-tooltip
v-if="isManage && !viewStatus"
>
<el-table-column prop="SignFileRecord" :label="$t('trials:trialDocument:reportDoc:table:signFileRecord')"
show-overflow-tooltip v-if="isManage && !viewStatus">
<template slot-scope="scope">
<div
v-if="
scope.row.SignFileRecord &&
scope.row.SignFileRecord.TrialFileTypeId
"
style="display: flex; align-items: center"
>
<div v-if="
scope.row.SignFileRecord &&
scope.row.SignFileRecord.TrialFileTypeId
" style="display: flex; align-items: center">
<span class="fileName">{{
scope.row.SignFileRecord.FileName
}}</span>
<div v-if="isManage && !viewStatus" class="fileBtnBox">
<i
class="el-icon-view"
@click.stop="preview(scope.row.SignFileRecord)"
/>
<i
class="el-icon-download"
v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.SignFileRecord, 'file')"
/>
<i
class="el-icon-delete"
v-if="hasDel"
@click.stop="delFile(scope.row, 'Sign')"
/>
<i class="el-icon-view" @click.stop="preview(scope.row.SignFileRecord)" />
<i class="el-icon-download" v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.SignFileRecord, 'file')" />
<i class="el-icon-delete" v-if="hasDel" @click.stop="delFile(scope.row, 'Sign')" />
</div>
</div>
<i
v-else-if="isManage && !viewStatus && hasEdit"
class="el-icon-upload2"
style="cursor: pointer; color: #409eff"
@click.stop="upload(scope.row, 'Sign')"
/>
<i v-else-if="isManage && !viewStatus && hasEdit" class="el-icon-upload2"
style="cursor: pointer; color: #409eff" @click.stop="upload(scope.row, 'Sign')" />
</template>
</el-table-column>
<!--历史记录-->
<el-table-column
prop="HistoryFileRecord"
:label="$t('trials:trialDocument:reportDoc:table:historyFileRecord')"
show-overflow-tooltip
v-if="isManage && !viewStatus"
>
<el-table-column prop="HistoryFileRecord" :label="$t('trials:trialDocument:reportDoc:table:historyFileRecord')"
show-overflow-tooltip v-if="isManage && !viewStatus">
<template slot-scope="scope">
<div
v-if="
scope.row.HistoryFileRecord &&
scope.row.HistoryFileRecord.TrialFileTypeId
"
style="display: flex; align-items: center"
>
<span class="fileName">{{
scope.row.HistoryFileRecord.FileName
}}</span>
<div v-if="isManage && !viewStatus" class="fileBtnBox">
<i
class="el-icon-download"
v-if="hasDownLoad"
@click.stop="
downLoad(false, scope.row.HistoryFileRecord, 'file')
"
/>
<i
class="el-icon-delete"
v-if="hasDel"
@click.stop="delFile(scope.row, 'History')"
/>
</div>
</div>
<i
v-else-if="isManage && !viewStatus && hasEdit"
class="el-icon-upload2"
style="cursor: pointer; color: #409eff"
@click.stop="upload(scope.row, 'History')"
/>
<el-button type="text" @click.stop="openHistory(scope.row)">
{{ scope.row.HistoryCount }}
<i class="el-icon-upload2" />
</el-button>
</template>
</el-table-column>
<el-table-column
prop="IsAuthorizedView"
:label="$t('trials:trialDocument:reportDoc:table:isAuthorizedView')"
show-overflow-tooltip
sortable="custom"
v-if="isManage && !viewStatus"
>
<el-table-column prop="IsAuthorizedView" :label="$t('trials:trialDocument:reportDoc:table:isAuthorizedView')"
show-overflow-tooltip sortable="custom" v-if="isManage && !viewStatus">
<template slot-scope="scope">
<el-switch
v-if="isManage && !viewStatus && hasEdit"
v-model="scope.row.IsAuthorizedView"
@change="(val) => auth(false, scope.row, val)"
:active-value="true"
:inactive-value="false"
:active-text="$fd('YesOrNo', true)"
:inactive-text="$fd('YesOrNo', false)"
>
<el-switch v-if="isManage && !viewStatus && hasEdit" v-model="scope.row.IsAuthorizedView"
@change="(val) => auth(false, scope.row, val)" :active-value="true" :inactive-value="false"
:active-text="$fd('YesOrNo', true)" :inactive-text="$fd('YesOrNo', false)">
</el-switch>
<span v-else>{{ $fd('YesOrNo', scope.row.IsAuthorizedView) }}</span>
</template>
</el-table-column>
<el-table-column
prop="UpdateTime"
:label="$t('trials:trialDocument:reportDoc:table:updateTime')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
:label="$t('trials:trialDocument:reportDoc:table:createTime')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="UpdateTime" :label="$t('trials:trialDocument:reportDoc:table:updateTime')"
show-overflow-tooltip sortable="custom" />
<el-table-column prop="CreateTime" :label="$t('trials:trialDocument:reportDoc:table:createTime')"
show-overflow-tooltip sortable="custom" />
<el-table-column :label="$t('common:action:action')" width="200">
<template slot-scope="scope">
<el-button
icon="el-icon-view"
:title="$t('common:button:view')"
circle
:disabled="
!scope.row.PDFFileRecord || !scope.row.PDFFileRecord.FilePath
"
@click.stop="preview(scope.row.PDFFileRecord)"
/>
<el-button
v-if="hasEdit && isManage && !viewStatus"
icon="el-icon-edit-outline"
:title="$t('common:button:edit')"
circle
@click.stop="handleEdit(scope.row)"
/>
<el-button
v-if="hasDownLoad && isManage && !viewStatus"
icon="el-icon-download"
:title="$t('trials:trialDocument:reportDoc:button:download')"
circle
@click.stop="downLoad(false, scope.row)"
/>
<el-button
v-if="hasDel && isManage && !viewStatus"
icon="el-icon-delete"
:title="$t('trials:trialDocument:reportDoc:button:delete')"
circle
@click.stop="handleDel(scope.row)"
/>
<el-button icon="el-icon-view" :title="$t('common:button:view')" circle :disabled="!scope.row.PDFFileRecord || !scope.row.PDFFileRecord.FilePath
" @click.stop="preview(scope.row.PDFFileRecord)" />
<el-button v-if="hasEdit && isManage && !viewStatus" icon="el-icon-edit-outline"
:title="$t('common:button:edit')" circle @click.stop="handleEdit(scope.row)" />
<el-button v-if="hasDownLoad && isManage && !viewStatus" icon="el-icon-download"
:title="$t('trials:trialDocument:reportDoc:button:download')" circle
@click.stop="downLoad(false, scope.row)" />
<el-button v-if="hasDel && isManage && !viewStatus" icon="el-icon-delete"
:title="$t('trials:trialDocument:reportDoc:button:delete')" circle @click.stop="handleDel(scope.row)" />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<reportDoc-form
:ArchiveTypeEnum="ArchiveTypeEnum"
:rowData="rowData"
:config="config"
:data="selectData"
v-if="config.visible"
@close="close"
@getList="getList"
/>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
<reportDoc-form :ArchiveTypeEnum="ArchiveTypeEnum" :rowData="rowData" :config="config" :data="selectData"
v-if="config.visible" @close="close" @getList="getList" />
<history-file-list :config="file_config" :rowData="fileData" :uploadPath="uploadPath" @getList="getList" />
</box-content>
</template>
<script>
@ -437,6 +206,7 @@ import { deepClone } from '@/utils/index.js'
import Pagination from '@/components/Pagination'
import BoxContent from '@/components/BoxContent'
import reportDocForm from './form.vue'
import historyFileList from '../historyFileList.vue'
const searchDataDefault = () => {
return {
IsAuthorizedView: null,
@ -450,7 +220,7 @@ const searchDataDefault = () => {
}
export default {
name: 'reportDoc',
components: { BoxContent, Pagination, reportDocForm },
components: { BoxContent, Pagination, reportDocForm, historyFileList },
props: {
viewStatus: {
type: Boolean,
@ -491,9 +261,30 @@ export default {
},
selectData: {},
DATA: {},
fileData: {},
file_config: {
visible: false,
title: this.$t('trials:trialDocument:historyFileList:title'),
width: '800px',
},
uploadPath: null
}
},
created() {
let typeArr = ['', 'Report', 'Doc', 'Record', 'Reviewer', 'Template']
let types = typeArr[this.ArchiveTypeEnum]
this.uploadPath = `/${this.$route.query.trialId}/Document/${types}`
},
methods: {
openHistory(row) {
this.fileData = {
Name: row.Name,
Id: row.Id,
TrialFileTypeId: this.rowData.Id
}
this.file_config.visible = true
},
//
upload(row, key) {
this.selectData = deepClone(row)
@ -771,7 +562,7 @@ export default {
this.DATA = Object.assign({}, this.rowData)
},
immediate: true,
deep:true
deep: true
},
},
computed: {
@ -814,9 +605,8 @@ export default {
])
},
TITLE() {
return `${this.$fd('ArchiveType', this.ArchiveTypeEnum)}${
this.isEN ? this.rowData.Name : this.rowData.NameCN
}`
return `${this.$fd('ArchiveType', this.ArchiveTypeEnum)}${this.isEN ? this.rowData.Name : this.rowData.NameCN
}`
},
},
}
@ -827,21 +617,27 @@ export default {
font-weight: bold;
margin-bottom: 10px;
}
.fileName {
display: inline-block;
max-width: calc(100% - 60px);
white-space: nowrap; /* 文本不换行 */
overflow: hidden; /* 超出部分隐藏 */
white-space: nowrap;
/* 文本不换行 */
overflow: hidden;
/* 超出部分隐藏 */
text-overflow: ellipsis;
margin-right: 3px;
}
.fileBtnBox {
display: inline-block;
width: 50px;
i {
cursor: pointer;
color: #409eff;
margin-right: 3px;
&:last-child {
margin: 0;
}

View File

@ -33,7 +33,7 @@
</span>
</el-upload>
</el-form-item>
<el-form-item v-if="!config.upload || config.upload === 'History'" :label="$t('trials:trialDocument:trainRecord:form:historyFileRecord')
<!-- <el-form-item v-if="!config.upload || config.upload === 'History'" :label="$t('trials:trialDocument:trainRecord:form:historyFileRecord')
">
<el-upload class="upload-demo" action :before-upload="(param) => beforeUpload(param, 'History', '.zip')"
:http-request="(param) => handleUploadFile(param, 'History')"
@ -45,7 +45,7 @@
{{ $t('trials:trialDocument:trainRecord:rule:mustZIP') }}
</span>
</el-upload>
</el-form-item>
</el-form-item> -->
</div>
</el-form>
</div>

View File

@ -4,52 +4,25 @@
{{ TITLE }}
</div>
<el-form :inline="true" class="base-search-form topForm">
<el-form-item
:label="$t('trials:trialDocument:trainRecord:form:isConfirmRecord')"
v-if="isManage && hasEdit && !viewStatus"
>
<el-radio-group
v-model="DATA.IsConfirmRecord"
:disabled="rowBtnStatus === 'edit'"
>
<el-radio
:label="item.value"
v-for="item in $d.YesOrNo"
:key="item.id"
>{{ item.label }}
<el-form-item :label="$t('trials:trialDocument:trainRecord:form:isConfirmRecord')"
v-if="isManage && hasEdit && !viewStatus">
<el-radio-group v-model="DATA.IsConfirmRecord" :disabled="rowBtnStatus === 'edit'">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
:label="$t('trials:trialDocument:trainRecord:form:isEnable')"
v-if="isManage && hasEdit && !viewStatus"
>
<el-radio-group
v-model="DATA.IsEnable"
:disabled="rowBtnStatus === 'edit'"
>
<el-radio
:label="item.value"
v-for="item in $d.YesOrNo"
:key="item.id"
>{{ item.label }}
<el-form-item :label="$t('trials:trialDocument:trainRecord:form:isEnable')"
v-if="isManage && hasEdit && !viewStatus">
<el-radio-group v-model="DATA.IsEnable" :disabled="rowBtnStatus === 'edit'">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="isManage && hasEdit && !viewStatus">
<el-button
type="primary"
@click="rowBtnStatus = 'save'"
v-if="rowBtnStatus === 'edit'"
>
<el-button type="primary" @click="rowBtnStatus = 'save'" v-if="rowBtnStatus === 'edit'">
{{ $t('common:button:edit') }}
</el-button>
<el-button
type="primary"
:loading="rowBtnLoading"
@click="saveRowData"
v-if="rowBtnStatus === 'save'"
>
<el-button type="primary" :loading="rowBtnLoading" @click="saveRowData" v-if="rowBtnStatus === 'save'">
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
@ -59,371 +32,155 @@
<div class="search" style="position: relative">
<el-form :inline="true" class="base-search-form">
<!--培训日期-->
<el-form-item
:label="$t('trials:trialDocument:trainRecord:search:TrianingDate')"
>
<el-date-picker
style="width: 240px"
v-model="TrianingDate"
type="daterange"
:range-separator="$t('baseForm:daterange:rangeSeparator')"
start-placeholder=""
end-placeholder=""
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
>
<el-form-item :label="$t('trials:trialDocument:trainRecord:search:TrianingDate')">
<el-date-picker style="width: 240px" v-model="TrianingDate" type="daterange"
:range-separator="$t('baseForm:daterange:rangeSeparator')" start-placeholder="" end-placeholder=""
format="yyyy-MM-dd" value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item
:label="$t('trials:trialDocument:trainRecord:search:name')"
>
<el-input
v-model="searchData.FileName"
style="width: 100px"
clearable
/>
<el-form-item :label="$t('trials:trialDocument:trainRecord:search:name')">
<el-input v-model="searchData.FileName" style="width: 100px" clearable />
</el-form-item>
<el-form-item
:label="
$t('trials:trialDocument:trainRecord:search:isAuthorizedView')
"
v-if="isManage && !viewStatus"
>
<el-select
v-if="!viewStatus"
v-model="searchData.IsAuthorizedView"
style="width: 100px"
placeholder=""
clearable
>
<el-option
v-for="item in $d.YesOrNo"
:key="item.id"
:label="item.label"
:value="item.value"
>
<el-form-item :label="$t('trials:trialDocument:trainRecord:search:isAuthorizedView')
" v-if="isManage && !viewStatus">
<el-select v-if="!viewStatus" v-model="searchData.IsAuthorizedView" style="width: 100px" placeholder=""
clearable>
<el-option v-for="item in $d.YesOrNo" :key="item.id" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<!--更新时间-->
<el-form-item
:label="$t('trials:trialDocument:trainRecord:search:UpdateTime')"
style="margin-bottom: 10px"
>
<el-date-picker
style="width: 240px"
v-model="UpdateTime"
type="daterange"
:range-separator="$t('baseForm:daterange:rangeSeparator')"
start-placeholder=""
end-placeholder=""
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
>
<el-form-item :label="$t('trials:trialDocument:trainRecord:search:UpdateTime')" style="margin-bottom: 10px">
<el-date-picker style="width: 240px" v-model="UpdateTime" type="daterange"
:range-separator="$t('baseForm:daterange:rangeSeparator')" start-placeholder="" end-placeholder=""
format="yyyy-MM-dd" value-format="yyyy-MM-dd">
</el-date-picker>
</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-item v-if="isManage && !viewStatus">
<el-button
type="primary"
:disabled="selectTable.length <= 0"
v-if="hasAccredit && isManage && !viewStatus"
@click.stop="auth"
>
<el-button type="primary" :disabled="selectTable.length <= 0" v-if="hasAccredit && isManage && !viewStatus"
@click.stop="auth">
{{ $t('trials:trialDocument:trainRecord:button:accredit') }}
</el-button>
<el-button
type="primary"
v-if="hasEdit && isManage && !viewStatus"
@click.stop="openFile(false)"
>
<el-button type="primary" v-if="hasEdit && isManage && !viewStatus" @click.stop="openFile(false)">
{{ $t('trials:trialDocument:trainRecord:button:uploadFile') }}
</el-button>
<el-button
type="primary"
v-if="hasEdit && isManage && !viewStatus"
@click.stop="openFile(true)"
>
<el-button type="primary" v-if="hasEdit && isManage && !viewStatus" @click.stop="openFile(true)">
{{ $t('trials:trialDocument:trainRecord:button:uploadFolder') }}
</el-button>
<el-button
type="primary"
v-if="hasAdd && isManage && !viewStatus"
@click.stop="handleAdd"
>
<el-button type="primary" v-if="hasAdd && isManage && !viewStatus" @click.stop="handleAdd">
{{ $t('trials:trialDocument:trainRecord:button:add') }}
</el-button>
<el-button
type="primary"
icon="el-icon-bottom"
:disabled="selectTable.length <= 0"
v-if="hasDownLoad && isManage && !viewStatus"
@click.stop="downLoad"
>
<el-button type="primary" icon="el-icon-bottom" :disabled="selectTable.length <= 0"
v-if="hasDownLoad && isManage && !viewStatus" @click.stop="downLoad">
{{ $t('trials:trialDocument:trainRecord:button:downLoadFile') }}
</el-button>
</el-form-item>
</el-form>
</div>
<el-table
v-loading="loading"
v-adaptive="{ bottomOffset: 75 }"
:data="list"
stripe
height="100"
style="width: 100%"
@sort-change="handleSortByColumn"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
v-if="isManage && !viewStatus"
/>
<el-table v-loading="loading" v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100" style="width: 100%"
@sort-change="handleSortByColumn" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" v-if="isManage && !viewStatus" />
<el-table-column type="index" v-else />
<el-table-column
prop="TrianingDate"
:label="$t('trials:trialDocument:trainRecord:table:TrianingDate')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="TrianingDate" :label="$t('trials:trialDocument:trainRecord:table:TrianingDate')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
<el-tooltip
v-if="!scope.row.TrianingDate"
class="item"
effect="dark"
:content="$t('trials:trialDocument:trainRecord:tip:noTrianingDate')"
placement="top"
>
<i
class="el-icon-warning"
style="cursor: pointer; color: #f56c6c"
></i>
<el-tooltip v-if="!scope.row.TrianingDate" class="item" effect="dark"
:content="$t('trials:trialDocument:trainRecord:tip:noTrianingDate')" placement="top">
<i class="el-icon-warning" style="cursor: pointer; color: #f56c6c"></i>
</el-tooltip>
<span v-else>{{ scope.row.TrianingDate }}</span>
</template>
</el-table-column>
<el-table-column
prop="TrianingCount"
:label="$t('trials:trialDocument:trainRecord:table:TrianingCount')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="TrianingState"
:label="$t('trials:trialDocument:trainRecord:table:TrianingState')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Note"
:label="$t('trials:trialDocument:trainRecord:table:Note')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="TrianingCount" :label="$t('trials:trialDocument:trainRecord:table:TrianingCount')"
show-overflow-tooltip sortable="custom" />
<el-table-column prop="TrianingState" :label="$t('trials:trialDocument:trainRecord:table:TrianingState')"
show-overflow-tooltip sortable="custom" />
<el-table-column prop="Note" :label="$t('trials:trialDocument:trainRecord:table:Note')" show-overflow-tooltip
sortable="custom" />
<!--文件名称-->
<el-table-column
prop="FileName"
:label="$t('trials:trialDocument:trainRecord:table:name')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="FileName" :label="$t('trials:trialDocument:trainRecord:table:name')" show-overflow-tooltip
sortable="custom">
<template slot-scope="scope">
<div
v-if="
scope.row.TrialFileRecord &&
scope.row.TrialFileRecord.TrialFileTypeId
"
style="display: flex; align-items: center"
>
<div v-if="
scope.row.TrialFileRecord &&
scope.row.TrialFileRecord.TrialFileTypeId
" style="display: flex; align-items: center">
<span class="fileName">{{
scope.row.TrialFileRecord.FileName
}}</span>
<div v-if="isManage && !viewStatus" class="fileBtnBox">
<i
class="el-icon-view"
@click.stop="preview(scope.row.TrialFileRecord)"
/>
<i
class="el-icon-download"
v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.TrialFileRecord, 'file')"
/>
<i
class="el-icon-delete"
v-if="hasDel"
@click.stop="delFile(scope.row, 'Trial')"
/>
<i class="el-icon-view" @click.stop="preview(scope.row.TrialFileRecord)" />
<i class="el-icon-download" v-if="hasDownLoad"
@click.stop="downLoad(false, scope.row.TrialFileRecord, 'file')" />
<i class="el-icon-delete" v-if="hasDel" @click.stop="delFile(scope.row, 'Trial')" />
</div>
</div>
<i
v-else-if="isManage && !viewStatus && hasEdit"
class="el-icon-upload2"
style="cursor: pointer; color: #409eff"
@click.stop="upload(scope.row, 'Trial')"
/>
<i v-else-if="isManage && !viewStatus && hasEdit" class="el-icon-upload2"
style="cursor: pointer; color: #409eff" @click.stop="upload(scope.row, 'Trial')" />
</template>
</el-table-column>
<!--历史记录-->
<el-table-column
prop="HistoryFileRecord"
:label="$t('trials:trialDocument:trainRecord:table:historyFileRecord')"
show-overflow-tooltip
v-if="isManage && !viewStatus"
>
<el-table-column prop="HistoryFileRecord" :label="$t('trials:trialDocument:trainRecord:table:historyFileRecord')"
show-overflow-tooltip v-if="isManage && !viewStatus">
<template slot-scope="scope">
<div
v-if="
scope.row.HistoryFileRecord &&
scope.row.HistoryFileRecord.TrialFileTypeId
"
style="display: flex; align-items: center"
>
<span class="fileName">{{
scope.row.HistoryFileRecord.FileName
}}</span>
<div v-if="isManage && !viewStatus" class="fileBtnBox">
<i
class="el-icon-download"
v-if="hasDownLoad"
@click.stop="
downLoad(false, scope.row.HistoryFileRecord, 'file')
"
/>
<i
class="el-icon-delete"
v-if="hasDel"
@click.stop="delFile(scope.row, 'History')"
/>
</div>
</div>
<i
v-else-if="isManage && !viewStatus"
class="el-icon-upload2"
style="cursor: pointer; color: #409eff"
@click.stop="upload(scope.row, 'History')"
/>
<el-button type="text" @click.stop="openHistory(scope.row)">
{{ scope.row.HistoryCount }}
<i class="el-icon-upload2" />
</el-button>
</template>
</el-table-column>
<el-table-column
prop="IsAuthorizedView"
:label="$t('trials:trialDocument:trainRecord:table:isAuthorizedView')"
show-overflow-tooltip
sortable="custom"
v-if="isManage && !viewStatus"
>
<el-table-column prop="IsAuthorizedView" :label="$t('trials:trialDocument:trainRecord:table:isAuthorizedView')"
show-overflow-tooltip sortable="custom" v-if="isManage && !viewStatus">
<template slot-scope="scope">
<el-switch
:disabled="!scope.row.TrianingDate"
v-if="isManage && !viewStatus && hasEdit"
v-model="scope.row.IsAuthorizedView"
@change="(val) => auth(false, scope.row, val)"
:active-value="true"
:inactive-value="false"
:active-text="$fd('YesOrNo', true)"
:inactive-text="$fd('YesOrNo', false)"
>
<el-switch :disabled="!scope.row.TrianingDate" v-if="isManage && !viewStatus && hasEdit"
v-model="scope.row.IsAuthorizedView" @change="(val) => auth(false, scope.row, val)" :active-value="true"
:inactive-value="false" :active-text="$fd('YesOrNo', true)" :inactive-text="$fd('YesOrNo', false)">
</el-switch>
<span v-else>{{ $fd('YesOrNo', scope.row.IsAuthorizedView) }}</span>
</template>
</el-table-column>
<el-table-column
prop="UpdateTime"
:label="$t('trials:trialDocument:trainRecord:table:updateTime')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
:label="$t('trials:trialDocument:trainRecord:table:createTime')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="UpdateTime" :label="$t('trials:trialDocument:trainRecord:table:updateTime')"
show-overflow-tooltip sortable="custom" />
<el-table-column prop="CreateTime" :label="$t('trials:trialDocument:trainRecord:table:createTime')"
show-overflow-tooltip sortable="custom" />
<el-table-column :label="$t('common:action:action')" width="200">
<template slot-scope="scope">
<el-button
icon="el-icon-view"
:title="$t('common:button:view')"
circle
:disabled="
!scope.row.TrialFileRecord || !scope.row.TrialFileRecord.FilePath
"
@click.stop="preview(scope.row.TrialFileRecord)"
/>
<el-button
v-if="hasEdit && isManage && !viewStatus"
icon="el-icon-edit-outline"
:title="$t('common:button:edit')"
circle
@click.stop="handleEdit(scope.row)"
/>
<el-button
v-if="hasDownLoad && isManage && !viewStatus"
icon="el-icon-download"
:title="
$t('trials:trialDocument:trainRecord:button:downLoadFile')
"
circle
:disabled="
!scope.row.TrialFileRecord || !scope.row.TrialFileRecord.FilePath
"
@click.stop="downLoad(false, scope.row.TrialFileRecord, 'file')"
/>
<el-button
v-if="hasDel && isManage && !viewStatus"
icon="el-icon-delete"
:title="$t('trials:trialDocument:trainRecord:button:delete')"
circle
@click.stop="handleDel(scope.row)"
/>
<el-button icon="el-icon-view" :title="$t('common:button:view')" circle :disabled="!scope.row.TrialFileRecord || !scope.row.TrialFileRecord.FilePath
" @click.stop="preview(scope.row.TrialFileRecord)" />
<el-button v-if="hasEdit && isManage && !viewStatus" icon="el-icon-edit-outline"
:title="$t('common:button:edit')" circle @click.stop="handleEdit(scope.row)" />
<el-button v-if="hasDownLoad && isManage && !viewStatus" icon="el-icon-download" :title="$t('trials:trialDocument:trainRecord:button:downLoadFile')
" circle :disabled="!scope.row.TrialFileRecord || !scope.row.TrialFileRecord.FilePath
" @click.stop="downLoad(false, scope.row.TrialFileRecord, 'file')" />
<el-button v-if="hasDel && isManage && !viewStatus" icon="el-icon-delete"
:title="$t('trials:trialDocument:trainRecord:button:delete')" circle @click.stop="handleDel(scope.row)" />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<upload-files
:config="config"
:faccept="faccept"
:uploadPath="uploadPath"
:limitLength="limitLength"
v-if="config.visible"
@close="close"
@uplaodFile="uplaodFile"
/>
<trainRecord-form
:ArchiveTypeEnum="ArchiveTypeEnum"
:rowData="rowData"
:config="update_config"
:data="selectData"
v-if="update_config.visible"
@close="updateClose"
@getList="getList"
/>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
<upload-files :config="config" :faccept="faccept" :uploadPath="uploadPath" :limitLength="limitLength"
v-if="config.visible" @close="close" @uplaodFile="uplaodFile" />
<trainRecord-form :ArchiveTypeEnum="ArchiveTypeEnum" :rowData="rowData" :config="update_config" :data="selectData"
v-if="update_config.visible" @close="updateClose" @getList="getList" />
<history-file-list :config="file_config" :rowData="fileData" :uploadPath="uploadPath" @getList="getList" />
</box-content>
</template>
<script>
<script>
import {
addOrUpdateTrialFileType,
getTrialTrianingRecordList,
@ -438,6 +195,7 @@ import Pagination from '@/components/Pagination'
import BoxContent from '@/components/BoxContent'
import uploadFiles from '../uploadFiles.vue'
import trainRecordForm from './form.vue'
import historyFileList from '../historyFileList.vue'
const searchDataDefault = () => {
return {
IsAuthorizedView: null,
@ -454,7 +212,7 @@ const searchDataDefault = () => {
}
export default {
name: 'trainRecord',
components: { BoxContent, Pagination, uploadFiles, trainRecordForm },
components: { BoxContent, Pagination, uploadFiles, trainRecordForm, historyFileList },
props: {
viewStatus: {
type: Boolean,
@ -509,9 +267,24 @@ export default {
upload: null,
},
DATA: {},
fileData: {},
file_config: {
visible: false,
title: this.$t('trials:trialDocument:historyFileList:title'),
width: '800px',
}
}
},
methods: {
openHistory(row) {
this.fileData = {
Name: row.TrialFileRecord ? row.TrialFileRecord.FileName : '',
Id: row.Id,
TrialFileTypeId: this.rowData.Id
}
this.file_config.visible = true
},
//
async uplaodFile(list) {
console.log(list, 'list')
@ -870,7 +643,7 @@ export default {
this.DATA = Object.assign({}, this.rowData)
},
immediate: true,
deep:true
deep: true
},
},
created() {
@ -918,9 +691,8 @@ export default {
])
},
TITLE() {
return `${this.$fd('ArchiveType', this.ArchiveTypeEnum)}${
this.isEN ? this.rowData.Name : this.rowData.NameCN
}`
return `${this.$fd('ArchiveType', this.ArchiveTypeEnum)}${this.isEN ? this.rowData.Name : this.rowData.NameCN
}`
},
},
}
@ -931,21 +703,27 @@ export default {
font-weight: bold;
margin-bottom: 10px;
}
.fileName {
display: inline-block;
max-width: calc(100% - 60px);
white-space: nowrap; /* 文本不换行 */
overflow: hidden; /* 超出部分隐藏 */
white-space: nowrap;
/* 文本不换行 */
overflow: hidden;
/* 超出部分隐藏 */
text-overflow: ellipsis;
margin-right: 3px;
}
.fileBtnBox {
display: inline-block;
width: 50px;
i {
cursor: pointer;
color: #409eff;
margin-right: 3px;
&:last-child {
margin: 0;
}

View File

@ -5,45 +5,20 @@
<el-form :inline="true">
<!-- 中心编号 -->
<el-form-item :label="$t('trials:uploadMonitor:table:siteId')">
<el-select
v-model="searchData.TrialSiteId"
clearable
filterable
style="width: 120px"
>
<el-option
v-for="(item, index) of siteOptions"
:key="index"
:label="item.TrialSiteCode"
:value="item.TrialSiteId"
/>
<el-select v-model="searchData.TrialSiteId" clearable filterable style="width: 120px">
<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:uploadMonitor:table:subjectId')">
<el-input
v-model="searchData.SubjectInfo"
style="width: 120px"
clearable
/>
<el-input v-model="searchData.SubjectInfo" style="width: 120px" clearable />
</el-form-item>
<!-- 访视名称 -->
<el-form-item
class="my_multiple"
:label="$t('trials:uploadMonitor:table:visitName')"
>
<el-select
v-model="searchData.VisitPlanArray"
style="width: 140px"
clearable
multiple
>
<el-option
v-for="(item, index) of visitPlanOptions"
:key="index"
:label="item.VisitName"
:value="item.VisitNum"
>
<el-form-item class="my_multiple" :label="$t('trials:uploadMonitor:table:visitName')">
<el-select v-model="searchData.VisitPlanArray" style="width: 140px" clearable multiple>
<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" />
@ -54,50 +29,25 @@
<el-input v-model="searchData.StudyCode" />
</el-form-item>
<el-form-item :label="$t('trials:uploadMonitor:table:imageType')">
<el-select
v-model="searchData.IsDicom"
style="width: 120px"
clearable
>
<el-option
v-for="item of $d.IsDicom"
:label="item.label"
:value="item.value"
:key="`RoleName${item.value}`"
/>
<el-select v-model="searchData.IsDicom" style="width: 120px" clearable>
<el-option v-for="item of $d.IsDicom" :label="item.label" :value="item.value"
:key="`RoleName${item.value}`" />
</el-select>
</el-form-item>
<el-form-item :label="$t('trials:uploadMonitor:table:uploader')">
<el-input
v-model="searchData.Uploader"
style="width: 120px"
clearable
/>
<el-input v-model="searchData.Uploader" style="width: 120px" clearable />
</el-form-item>
<el-form-item :label="$t('trials:uploadMonitor:table:uploadStatus')">
<el-select
v-model="searchData.IsSuccess"
style="width: 120px"
clearable
>
<el-option
v-for="item of $d.YesOrNo"
:label="item.label"
:value="item.value"
:key="`RoleName${item.value}`"
/>
<el-select v-model="searchData.IsSuccess" style="width: 120px" clearable>
<el-option v-for="item of $d.YesOrNo" :label="item.label" :value="item.value"
:key="`RoleName${item.value}`" />
</el-select>
</el-form-item>
<el-form-item :label="$t('trials:uploadMonitor:table:uploadTime')">
<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>
<!-- 查询 -->
@ -105,234 +55,119 @@
{{ $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-button
type="primary"
icon="el-icon-download"
@click="handleExport"
>
<el-button type="primary" icon="el-icon-download" @click="handleExport">
{{ $t('common:button:export') }}
</el-button>
</el-form-item>
</el-form>
</template>
<template slot="main-container">
<el-table
v-adaptive="{ bottomOffset: 60 }"
v-loading="loading"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'ArchiveFinishedTime', order: 'descending' }"
>
<el-table v-adaptive="{ bottomOffset: 60 }" v-loading="loading" :data="list" stripe height="100"
@sort-change="handleSortByColumn" :default-sort="{ prop: 'ArchiveFinishedTime', order: 'descending' }">
<el-table-column type="index" width="40" align="left" />
<!-- 中心编号 -->
<el-table-column
prop="TrialSiteCode"
min-width="100"
:label="$t('trials:uploadMonitor:table:siteId')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="TrialSiteCode" min-width="100" :label="$t('trials:uploadMonitor:table:siteId')"
show-overflow-tooltip sortable="custom" />
<!-- 受试者编号 -->
<el-table-column
prop="SubjectCode"
min-width="130"
:label="$t('trials:uploadMonitor:table:subjectId')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="SubjectCode" min-width="130" :label="$t('trials:uploadMonitor:table:subjectId')"
show-overflow-tooltip sortable="custom" />
<!-- 访视名 -->
<el-table-column
prop="VisitName"
min-width="130"
:label="$t('trials:uploadMonitor:table:visitName')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="VisitName" min-width="130" :label="$t('trials:uploadMonitor:table:visitName')"
show-overflow-tooltip sortable="custom" />
<!-- 检查编号 -->
<el-table-column
prop="StudyCode"
min-width="130"
:label="$t('trials:uploadMonitor:table:studyId')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="StudyCode" min-width="130" :label="$t('trials:uploadMonitor:table:studyId')"
show-overflow-tooltip sortable="custom" />
<!-- 影像类型 -->
<el-table-column
prop="IsDicom"
min-width="130"
:label="$t('trials:uploadMonitor:table:imageType')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="IsDicom" min-width="130" :label="$t('trials:uploadMonitor:table:imageType')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{ $fd('IsDicom', scope.row.IsDicom) }}
<el-tag type="primary">{{ $fd('IsDicom', scope.row.IsDicom) }}</el-tag>
</template>
</el-table-column>
<!-- 上传人 -->
<el-table-column
prop="Uploader"
min-width="130"
:label="$t('trials:uploadMonitor:table:uploader')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="Uploader" min-width="130" :label="$t('trials:uploadMonitor:table:uploader')"
show-overflow-tooltip sortable="custom" />
<!-- IP -->
<el-table-column
prop="IP"
min-width="100"
:label="$t('trials:uploadMonitor:table:ip')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="IP" min-width="100" :label="$t('trials:uploadMonitor:table:ip')" show-overflow-tooltip
sortable="custom" />
<!-- 文件数 -->
<el-table-column
prop="FileCount"
min-width="120"
:label="$t('trials:uploadMonitor:table:fileCount')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="FileCount" min-width="120" :label="$t('trials:uploadMonitor:table:fileCount')"
show-overflow-tooltip sortable="custom" />
<!-- 文件大小 -->
<el-table-column
prop="FileSize"
min-width="130"
:label="$t('trials:uploadMonitor:table:fileSize')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="FileSize" min-width="130" :label="$t('trials:uploadMonitor:table:fileSize')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{ fileSizeFormatter(scope.row.FileSize) }}
</template>
</el-table-column>
<!-- 是否有重复文件 -->
<el-table-column
prop="IsDicomReUpload"
min-width="150"
:label="$t('trials:uploadMonitor:table:isRepetition')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="IsDicomReUpload" min-width="150" :label="$t('trials:uploadMonitor:table:isRepetition')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{ $fd('YesOrNo', scope.row.IsDicomReUpload) }}
</template>
</el-table-column>
<!-- 是否上传成功 -->
<el-table-column
prop="IsSuccess"
min-width="150"
:label="$t('trials:uploadMonitor:table:uploadStatus')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="IsSuccess" min-width="150" :label="$t('trials:uploadMonitor:table:uploadStatus')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsSuccess" type="primary">
{{ $fd('YesOrNo', scope.row.IsSuccess) }}</el-tag
>
{{ $fd('YesOrNo', scope.row.IsSuccess) }}</el-tag>
<el-tag v-else type="danger">
{{ $fd('YesOrNo', scope.row.IsSuccess) }}</el-tag
>
{{ $fd('YesOrNo', scope.row.IsSuccess) }}</el-tag>
</template>
</el-table-column>
<!-- 开始时间 -->
<el-table-column
prop="UploadStartTime"
min-width="140"
:label="$t('trials:uploadMonitor:table:beginTime')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="UploadStartTime" min-width="140" :label="$t('trials:uploadMonitor:table:beginTime')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{ scope.row.UploadStartTimeStr }}
</template>
</el-table-column>
<!-- 结束时间 -->
<el-table-column
prop="ArchiveFinishedTime"
min-width="140"
:label="$t('trials:uploadMonitor:table:endTime')"
show-overflow-tooltip
sortable="custom"
>
<el-table-column prop="ArchiveFinishedTime" min-width="140" :label="$t('trials:uploadMonitor:table:endTime')"
show-overflow-tooltip sortable="custom">
<template slot-scope="scope">
{{ scope.row.ArchiveFinishedTime }}
</template>
</el-table-column>
<!-- 总共用时 -->
<el-table-column
prop="TotalMillisecondsInterval"
min-width="100"
:label="$t('trials:uploadMonitor:table:totalTime')"
show-overflow-tooltip
>
<el-table-column prop="TotalMillisecondsInterval" min-width="100"
:label="$t('trials:uploadMonitor:table:totalTime')" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.TimeInterval }}
</template>
</el-table-column>
<el-table-column
:label="$t('common:action:action')"
width="80"
fixed="right"
>
<el-table-column :label="$t('common:action:action')" width="80" fixed="right">
<template slot-scope="scope">
<!-- 查看 -->
<el-button
circle
:title="$t('trials:readTask:button:view')"
:disabled="!scope.row.RecordPath"
icon="el-icon-view"
@click="handleLook(scope.row)"
/>
<el-button circle :title="$t('trials:readTask:button:view')" :disabled="!scope.row.RecordPath"
icon="el-icon-view" @click="handleLook(scope.row)" />
</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" />
</template>
<el-dialog
v-if="lookVisible"
:title="$t('trials:uploadMonitor:dagTitle:look')"
:visible.sync="lookVisible"
width="800px"
append-to-body
:close-on-click-modal="false"
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="lookVisible" :title="$t('trials:uploadMonitor:dagTitle:look')" :visible.sync="lookVisible"
width="800px" append-to-body :close-on-click-modal="false" custom-class="base-dialog-wrapper">
<div style="max-height: 500px; overflow-y: auto; padding: 0 20px">
<div
style="
<div style="
display: flex;
justify-content: space-around;
margin-bottom: 20px;
"
>
<span
>{{ $t('trials:uploadDicomList:table:FailedNumber') }}:
{{ lookText.Failed.length }}</span
>
<span
>{{ $t('trials:uploadDicomList:table:ExistedNumber') }}:
{{ lookText.Existed.length }}</span
>
<span
>{{ $t('trials:uploadDicomList:table:UploadedNumber') }}:
{{ lookText.Uploaded.length }}</span
>
">
<span>{{ $t('trials:uploadDicomList:table:FailedNumber') }}:
{{ lookText.Failed.length }}</span>
<span>{{ $t('trials:uploadDicomList:table:ExistedNumber') }}:
{{ lookText.Existed.length }}</span>
<span>{{ $t('trials:uploadDicomList:table:UploadedNumber') }}:
{{ lookText.Uploaded.length }}</span>
</div>
<div style="margin-bottom: 10px; font-size: 12px">
<div style="font-size: 14px; margin-bottom: 5px">
@ -379,6 +214,7 @@ import { getStudyUploadMonitor_Export } from '@/api/export'
import Pagination from '@/components/Pagination'
import BaseContainer from '@/components/BaseContainer'
import BaseModel from '@/components/BaseModel'
import { changeURLStatic } from '@/utils/history.js'
import axios from 'axios'
const searchDataDefault = () => {
return {
@ -421,10 +257,26 @@ export default {
if (this.$route.query.studyCode) {
this.searchData.StudyCode = this.$route.query.studyCode
}
if (this.$route.query.siteId) {
this.searchData.TrialSiteId = this.$route.query.siteId
}
if (this.$route.query.subjectCode) {
this.searchData.SubjectInfo = this.$route.query.subjectCode
}
if (this.$route.query.visitNum || this.$route.query.visitNum === 0) {
this.searchData.VisitPlanArray = [Number(this.$route.query.visitNum)]
}
this.getList()
this.getVisitPlanOptions()
this.clearnUrl()
},
methods: {
clearnUrl() {
changeURLStatic('siteId', '')
changeURLStatic('subjectCode', '')
changeURLStatic('visitNum', '')
},
async handleLook(row) {
this.lookVisible = true
var htmlUrl = this.OSSclientConfig.basePath + row.RecordPath
@ -482,8 +334,8 @@ export default {
},
handleExport() {
getStudyUploadMonitor_Export(this.searchData)
.then((res) => {})
.catch(() => {})
.then((res) => { })
.catch(() => { })
},
handleDatetimeChange(val) {
if (val) {