新增阅片期页面

main
wangxiaoshuang 2025-09-05 14:05:09 +08:00
parent fe77889633
commit f9cbbd56ec
10 changed files with 1418 additions and 1225 deletions

View File

@ -1,127 +1,86 @@
<template> <template>
<el-form <el-form ref="clinicalDataForm" v-loading="loading" :model="form" size="small" :rules="rules" :inline="true">
ref="clinicalDataForm"
v-loading="loading"
:model="form"
size="small"
:rules="rules"
label-width="110px"
:inline="true"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<!-- 临床数据名称 --> <!-- 临床数据名称 -->
<el-form-item <el-form-item :label="$t('trials:readingPeriod:cd:table:clinicalDataName')" prop="ClinicalDataTrialSetId">
:label="$t('trials:readingPeriod:cd:table:clinicalDataName')"
prop="ClinicalDataTrialSetId"
>
<el-col :span="20"> <el-col :span="20">
<el-select <el-select v-model="form.ClinicalDataTrialSetId" @change="handleClinicalDataSetChange"
v-model="form.ClinicalDataTrialSetId" :disabled="type === 'consistencyAnalysis'">
@change="handleClinicalDataSetChange" <el-option v-for="item of clinicalDatas" :key="item.Id" :label="item.ClinicalDataSetName"
> :value="item.Id" />
<el-option
v-for="item of clinicalDatas"
:key="item.Id"
:label="item.ClinicalDataSetName"
:value="item.Id"
/>
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
<el-button <el-button v-if="currentTpl.isExist" type="text" @click="handleDownloadTpl">
v-if="currentTpl.isExist"
type="text"
@click="handleDownloadTpl"
>
{{ $t('trials:readingPeriod:cd:title:downloadTpl') }} {{ $t('trials:readingPeriod:cd:title:downloadTpl') }}
</el-button> </el-button>
</el-col> </el-col>
</el-form-item> </el-form-item>
<!-- 数据内容 --> <!-- 数据内容:label="$t('trials:readingPeriod:cd:form:data')" -->
<el-form-item :label="$t('trials:readingPeriod:cd:form:data')"> <!-- 多文件上传 -->
<!-- 多文件上传 --> <form id="inputForm" ref="uploadForm">
<form id="inputForm" ref="uploadForm"> <div class="form-group">
<div class="form-group"> <div id="directoryInputWrapper" class="btn btn-link" style="
<div position: relative;
id="directoryInputWrapper" overflow: hidden;
class="btn btn-link" display: inline-block;
style="position: relative;overflow: hidden;display: inline-block;" ">
> <el-button type="primary" size="small">
<el-button {{ $t('trials:uploadClinicalData:button:selectFile') }}
type="primary" </el-button>
style="width: 56px;" <input type="file" name="file" multiple style="
size="small" position: absolute;
> top: 0;
{{ $t('trials:uploadClinicalData:button:selectFile') }} left: 0;
</el-button> width: 56px;
<input height: 100%;
type="file" opacity: 0;
name="file" cursor: pointer;
multiple " :accept="faccept.join(',')" @change="beginScanFiles($event)" />
style="position: absolute;top: 0;left: 0;width: 56px;height: 100%;opacity: 0;cursor: pointer;" <span style="margin-left: 10px">{{
:accept="faccept.join(',')" $t('trials:attachment:message:pdf')
@change="beginScanFiles($event)" }}</span>
>
<span>{{ ($t('trials:attachment:message:pdf')) }}</span>
</div>
</div> </div>
</form> </div>
<!-- 文件列表 --> </form>
<el-table <!-- 文件列表 -->
ref="filesTable" <el-table ref="filesTable" :data="fileList" class="dicomFiles-table" height="300"
:data="fileList" style="width: 100%;margin-top:5px;" border>
class="dicomFiles-table" <el-table-column type="index" width="40" />
height="300" <el-table-column prop="FileName" :label="$t('trials:uploadClinicalData:table:fileName')" width="190"
style="width:100%" show-overflow-tooltip />
border <!-- 文件大小 -->
> <el-table-column prop="size" :label="$t('trials:uploadClinicalData:table:fileSize')">
<el-table-column type="index" width="40" /> <template slot-scope="scope">
<el-table-column <span>{{
prop="FileName" scope.row.size && scope.row.size > 0
:label="$t('trials:uploadClinicalData:table:fileName')" ? $FormatSize(scope.row.size)
width="190" : scope.row.Size && scope.row.Size > 0
show-overflow-tooltip ? $FormatSize(scope.row.Size)
/> : ''
<el-table-column }}</span>
:label="$t('common:action:action')" </template>
width="100" </el-table-column>
> <el-table-column :label="$t('common:action:action')">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button circle :title="$t('trials:readingPeriod:cd:action:deleteFile')" icon="el-icon-delete"
circle @click="handleDeleteFile(scope.$index, scope.row)" />
:title="$t('trials:readingPeriod:cd:action:deleteFile')" <!-- 下载 -->
icon="el-icon-delete" <el-button v-if="type === 'consistencyAnalysis'" circle :title="$t('trials:readingPeriod:cd:action:upload')"
@click="handleDeleteFile(scope.$index,scope.row)" icon="el-icon-download" @click="handleUploadFile(scope.row)" />
/> </template>
</template> </el-table-column>
</el-table-column> </el-table>
</el-table>
</el-form-item>
</div> </div>
<div <div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<el-form-item> <el-form-item>
<!-- 取消 --> <!-- 取消 -->
<el-button <el-button :disabled="btnLoading" size="small" type="primary" @click="close">
:disabled="btnLoading"
size="small"
type="primary"
@click="close"
>
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="small" type="primary" :loading="btnLoading" @click="save">
size="small"
type="primary"
:loading="btnLoading"
@click="save"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -129,19 +88,31 @@
</el-form> </el-form>
</template> </template>
<script> <script>
import { getTrialClinicalDataSelect, import {
addOrUpdateReadingClinicalData, DownloadTrialClinicalFile } from '@/api/trials' getTrialClinicalDataSelect,
addOrUpdateReadingClinicalData,
addOrUpdateConsistencyAnalysisReadingClinicalData,
} from '@/api/trials'
import { downLoadFile } from '@/utils/stream.js'
export default { export default {
name: 'AddOrUpdateClinicalData', name: 'AddOrUpdateClinicalData',
props: { props: {
trialReadingCriterionId: { trialReadingCriterionId: {
type: String, type: String,
default: '' default: '',
}, },
data: { data: {
type: Object, type: Object,
default() { return {} } default() {
} return {}
},
},
type: {
default: 'readingPeriod',
},
option: {
default: () => [],
},
}, },
data() { data() {
@ -157,25 +128,41 @@ export default {
IsVisist: true, IsVisist: true,
AddFileList: [], AddFileList: [],
DeleteFileIds: [], DeleteFileIds: [],
FileList: [] FileList: [],
}, },
rules: { rules: {
ClinicalDataTrialSetId: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur', 'change'] }] ClinicalDataTrialSetId: [
{
required: true,
message: this.$t('common:ruleMessage:select'),
trigger: ['blur', 'change'],
},
],
}, },
loading: false, loading: false,
btnLoading: false, btnLoading: false,
clinicalDatas: [], clinicalDatas: [],
pendingUploadList: [], pendingUploadList: [],
pendingDeleteList: [], pendingDeleteList: [],
currentTpl: { id: '', isExist: false } currentTpl: { id: '', isExist: false },
} }
}, },
mounted() { mounted() {
this.initForm() this.initForm()
}, },
methods: { methods: {
//
handleUploadFile(row) {
let href = this.OSSclientConfig.basePath + row.Path
let name = row.FileName
downLoadFile(href, name)
},
async initForm() { async initForm() {
await this.getClinicalDatas() if (this.type === 'readingPeriod') {
await this.getClinicalDatas()
} else {
this.clinicalDatas = this.option
}
if (Object.keys(this.data).length > 0) { if (Object.keys(this.data).length > 0) {
for (const k in this.form) { for (const k in this.form) {
if (this.data.hasOwnProperty(k)) { if (this.data.hasOwnProperty(k)) {
@ -187,7 +174,7 @@ export default {
} }
}, },
save() { save() {
this.$refs.clinicalDataForm.validate(valid => { this.$refs.clinicalDataForm.validate((valid) => {
if (!valid) return if (!valid) return
if (this.fileList.length === 0) { if (this.fileList.length === 0) {
// //
@ -208,65 +195,57 @@ export default {
}) })
}, },
uploadFilesAndSave() { uploadFilesAndSave() {
return new Promise(async(resolve, reject) => { return new Promise(async (resolve, reject) => {
this.form.AddFileList = [] this.form.AddFileList = []
for (var i = 0; i < this.pendingUploadList.length; ++i) { for (var i = 0; i < this.pendingUploadList.length; ++i) {
// const file = await this.convertBase64ToBlob(this.pendingUploadList[i]) // const file = await this.convertBase64ToBlob(this.pendingUploadList[i])
const file = await this.fileToBlob(this.pendingUploadList[i]) const file = await this.fileToBlob(this.pendingUploadList[i])
const res = await this.OSSclient.put(`/${this.data.TrialId}/ClinicalData/${this.pendingUploadList[i].name}`, file) const res = await this.OSSclient.put(
this.form.AddFileList.push({ fileName: this.pendingUploadList[i].name, path: this.$getObjectName(res.url) }) `/${this.data.TrialId}/ClinicalData/${this.pendingUploadList[i].name}`,
file
)
this.form.AddFileList.push({
fileName: this.pendingUploadList[i].name,
path: this.$getObjectName(res.url),
size: this.pendingUploadList[i].size,
type: this.pendingUploadList[i].type,
})
} }
this.saveClinicalData(this.form.AddFileList) this.saveClinicalData(this.form.AddFileList)
resolve() resolve()
// var fileData = new FormData()
// for (var i = 0; i < this.pendingUploadList.length; ++i) {
// fileData.append('file', this.pendingUploadList[i])
// }
// this.btnLoading = true
// uploadClinicalData(this.data.TrialId, this.data.SubjectId, this.data.ReadingId, fileData).then(response => {
// this.btnLoading = false
// this.form.AddFileList = response.Result
// this.saveClinicalData()
// resolve(response.Result)
// }).catch(() => {
// this.btnLoading = false
// reject()
// })
})
},
fileToBlob(file) {
console.log('fileToBlob')
// FileReader
const reader = new FileReader()
return new Promise(resolve => {
// FileReader load
reader.addEventListener('load', (e) => {
let blob
if (typeof e.target.result === 'object') {
blob = new Blob([e.target.result])
} else {
blob = e.target.result
}
resolve(blob)
})
// FileReader ArrayBuffer File
reader.readAsArrayBuffer(file)
}) })
}, },
saveClinicalData() { saveClinicalData() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.btnLoading = true this.btnLoading = true
this.form.DeleteFileIds = this.pendingDeleteList this.form.DeleteFileIds = this.pendingDeleteList
addOrUpdateReadingClinicalData(this.form).then(response => { if (this.type === 'consistencyAnalysis') {
this.btnLoading = false addOrUpdateConsistencyAnalysisReadingClinicalData(this.form)
this.$emit('getList') .then((response) => {
this.$emit('close') this.btnLoading = false
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$emit('getList')
resolve() this.$emit('close')
}).catch(() => { this.$message.success(this.$t('common:message:savedSuccessfully'))
this.btnLoading = false resolve()
reject() })
}) .catch(() => {
this.btnLoading = false
reject()
})
} else {
addOrUpdateReadingClinicalData(this.form)
.then((response) => {
this.btnLoading = false
this.$emit('getList')
this.$emit('close')
this.$message.success(this.$t('common:message:savedSuccessfully'))
resolve()
})
.catch(() => {
this.btnLoading = false
reject()
})
}
}) })
}, },
getClinicalDatas() { getClinicalDatas() {
@ -279,58 +258,75 @@ export default {
SubjectId: this.data.SubjectId, SubjectId: this.data.SubjectId,
ReadingClinicalDataId: this.data.Id ? this.data.Id : '', ReadingClinicalDataId: this.data.Id ? this.data.Id : '',
IsBaseLine: this.data.IsBaseLine, IsBaseLine: this.data.IsBaseLine,
TrialReadingCriterionId: this.trialReadingCriterionId TrialReadingCriterionId: this.trialReadingCriterionId,
} }
getTrialClinicalDataSelect(param).then(res => { getTrialClinicalDataSelect(param)
this.clinicalDatas = res.Result .then((res) => {
this.loading = false this.clinicalDatas = res.Result
resolve() this.loading = false
}).catch(() => { resolve()
this.loading = false })
reject() .catch(() => {
}) this.loading = false
reject()
})
}) })
}, },
handleDeleteFile(index, row) { handleDeleteFile(index, row) {
this.$confirm(this.$t('trials:readingPeriod:cd:message:delete'), { this.$confirm(this.$t('trials:readingPeriod:cd:message:delete'), {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true,
}) })
.then(() => { .then(() => {
if (row.Id) { if (row.Id) {
this.pendingDeleteList.push(row.Id) this.pendingDeleteList.push(row.Id)
} }
this.fileList.splice(index, 1) this.fileList.splice(index, 1)
}).catch(() => {}) })
.catch(() => { })
}, },
beginScanFiles(e) { beginScanFiles(e) {
var files = e.target.files var files = e.target.files
for (var i = 0; i < files.length; ++i) { for (var i = 0; i < files.length; ++i) {
const fileName = files[i].name const fileName = files[i].name
var extendName = fileName.substring(fileName.lastIndexOf('.')).toLocaleLowerCase() var extendName = fileName
.substring(fileName.lastIndexOf('.'))
.toLocaleLowerCase()
if (this.faccept.indexOf(extendName) !== -1) { if (this.faccept.indexOf(extendName) !== -1) {
this.fileList.push({ FileName: fileName, Path: '', Status: 0, Files: files[i] }) this.fileList.push({
FileName: fileName,
Path: '',
Status: 0,
Files: files[i],
size: files[i].size,
type: fileName.split('.')[1],
})
} }
} }
}, },
handleClinicalDataSetChange(v) { handleClinicalDataSetChange(v) {
var index = this.clinicalDatas.findIndex(item => item.Id === v) var index = this.clinicalDatas.findIndex((item) => item.Id === v)
if (index > -1) { if (index > -1) {
this.currentTpl.id = this.clinicalDatas[index].Id this.currentTpl.id = this.clinicalDatas[index].Id
this.currentTpl.path = this.clinicalDatas[index].Path
this.currentTpl.isExist = !!this.clinicalDatas[index].FileName this.currentTpl.isExist = !!this.clinicalDatas[index].FileName
} }
}, },
handleDownloadTpl() { handleDownloadTpl() {
this.loading = true this.loading = true
DownloadTrialClinicalFile(this.currentTpl.id).then(data => { window.open(
this.loading = false this.OSSclientConfig.basePath + this.currentTpl.path,
}).catch(() => { this.loading = false }) '_blank'
)
this.loading = false
// DownloadTrialClinicalFile(this.currentTpl.id).then(data => {
// this.loading = false
// }).catch(() => { this.loading = false })
}, },
close() { close() {
this.$emit('close') this.$emit('close')
} },
} },
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped></style>
</style>

View File

@ -1,17 +1,8 @@
<template> <template>
<div v-loading="loading" class="add_reading-period-wrapper" style="display:flex;width: 100%;height: 100%;"> <div v-loading="loading" class="add_reading-period-wrapper" style="display:flex;width: 100%;height: 100%;">
<div <div class="reading-period-form" style="width:450px;height:100%;margin-right: 10px;">
class="reading-period-form"
style="width:450px;height:100%;margin-right: 10px;"
>
<el-card shadow="never" style="height:571px;"> <el-card shadow="never" style="height:571px;">
<el-form <el-form ref="addOrUpdatePR" :model="form" size="small" :rules="rules" label-width="160px">
ref="addOrUpdatePR"
:model="form"
size="small"
:rules="rules"
label-width="160px"
>
<!-- 阅片期类型 --> <!-- 阅片期类型 -->
<el-form-item :label="$t('trials:rpManage:table:readingType')"> <el-form-item :label="$t('trials:rpManage:table:readingType')">
<el-input v-model="form.ReadingSetTypeName" disabled style="width:100%;" /> <el-input v-model="form.ReadingSetTypeName" disabled style="width:100%;" />
@ -23,23 +14,15 @@
<!-- 受试者范围 --> <!-- 受试者范围 -->
<el-form-item :label="$t('trials:rpManage:table:subjectRange')" prop="ReadingScope"> <el-form-item :label="$t('trials:rpManage:table:subjectRange')" prop="ReadingScope">
<el-select v-model="form.ReadingScope" style="width:100%;"> <el-select v-model="form.ReadingScope" style="width:100%;">
<el-option <el-option v-for="(item, index) of $d.ReadingScopeEnum" :key="index" :label="item.label"
v-for="(item,index) of $d.ReadingScopeEnum" :value="item.value" />
:key="index"
:label="item.label"
:value="item.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 中心 --> <!-- 中心 -->
<el-form-item v-if="form.ReadingScope === 1" :label="$t('trials:addRP:form:sites')" prop="SiteIds"> <el-form-item v-if="form.ReadingScope === 1" :label="$t('trials:addRP:form:sites')" prop="SiteIds">
<el-select v-model="form.SiteIds" filterable style="width:100%;" multiple> <el-select v-model="form.SiteIds" filterable style="width:100%;" multiple>
<el-option <el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteCode"
v-for="(item,index) of siteOptions" :value="item.TrialSiteId" />
:key="index"
:label="item.TrialSiteCode"
:value="item.SiteId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 条件 --> <!-- 条件 -->
@ -52,30 +35,17 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 截止日期 --> <!-- 截止日期 -->
<el-form-item v-if="form.DeadlineCondition === 0" :label="$t('trials:rpManage:table:expirationDate')" prop="ExpirationDate"> <el-form-item v-if="form.DeadlineCondition === 0" :label="$t('trials:rpManage:table:expirationDate')"
<el-date-picker prop="ExpirationDate">
v-model="form.ExpirationDate" <el-date-picker v-model="form.ExpirationDate" type="date" value-format="yyyy-MM-dd" format="yyyy-MM-dd"
type="date" style="width:100%;" />
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
style="width:100%;"
/>
</el-form-item> </el-form-item>
<!-- 截止访视 --> <!-- 截止访视 -->
<el-form-item v-if="form.DeadlineCondition === 1" :label="$t('trials:rpManage:table:expirationVisit')" prop="VisitStageId"> <el-form-item v-if="form.DeadlineCondition === 1" :label="$t('trials:rpManage:table:expirationVisit')"
<el-select prop="VisitStageId">
v-model="form.VisitStageId" <el-select v-model="form.VisitStageId" clearable style="width:100%;" @change="handleVisitChange">
clearable <el-option v-for="item of visitPlanOptions" :key="item.VisitStageId" :label="item.VisitName"
style="width:100%;" :value="item.VisitStageId">
@change="handleVisitChange"
>
<el-option
v-for="item of visitPlanOptions"
:key="item.VisitStageId"
:label="item.VisitName"
:value="item.VisitStageId"
>
<span style="float: left">{{ item.VisitName }}</span> <span style="float: left">{{ item.VisitName }}</span>
</el-option> </el-option>
</el-select> </el-select>
@ -96,63 +66,37 @@
<div class="result-table" style="flex:1;"> <div class="result-table" style="flex:1;">
<el-card shadow="never"> <el-card shadow="never">
<el-table <el-table ref="prList" v-loading="listLoading" :data="list" stripe height="455"
ref="prList" @selection-change="handleSelectChange">
v-loading="listLoading"
:data="list"
stripe
height="455"
@selection-change="handleSelectChange"
>
<el-table-column type="selection" align="left" width="45" /> <el-table-column type="selection" align="left" width="45" />
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<!-- 中心 --> <!-- 中心 -->
<el-table-column <el-table-column prop="TrialSiteCode" :label="$t('trials:linkedRP:table:siteCode')" />
prop="TrialSiteCode"
:label="$t('trials:linkedRP:table:siteCode')"
/>
<!-- 受试者 --> <!-- 受试者 -->
<el-table-column <el-table-column prop="SubjectCode" :label="$t('trials:linkedRP:table:subjectCode')" />
prop="SubjectCode"
:label="$t('trials:linkedRP:table:subjectCode')"
/>
<!-- 截止访视 --> <!-- 截止访视 -->
<el-table-column <el-table-column prop="SubjectVisitName" :label="$t('trials:linkedRP:table:expirationVisit')" />
prop="SubjectVisitName"
:label="$t('trials:linkedRP:table:expirationVisit')"
/>
<!-- 最晚拍片日期 --> <!-- 最晚拍片日期 -->
<el-table-column <el-table-column prop="LatestScanDate" :label="$t('trials:linkedRP:table:latestScanDate')">
prop="LatestScanDate"
:label="$t('trials:linkedRP:table:latestScanDate')"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.LatestScanDate?moment(scope.row.LatestScanDate).format('YYYY-MM-DD'):'' }} {{ scope.row.LatestScanDate ? moment(scope.row.LatestScanDate).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 截止日期 --> <!-- 截止日期 -->
<el-table-column <el-table-column prop="ExpirationDate" :label="$t('trials:linkedRP:table:expirationDate')">
prop="ExpirationDate"
:label="$t('trials:linkedRP:table:expirationDate')"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.ExpirationDate?moment(scope.row.ExpirationDate).format('YYYY-MM-DD'):'' }} {{ scope.row.ExpirationDate ? moment(scope.row.ExpirationDate).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 阅片期名称 --> <!-- 阅片期名称 -->
<el-table-column <el-table-column prop="ReadingPeriodName" :label="$t('trials:linkedRP:table:readingName')" />
prop="ReadingPeriodName"
:label="$t('trials:linkedRP:table:readingName')"
/>
<!-- 生效时间 --> <!-- 生效时间 -->
<el-table-column <el-table-column prop="EffectOfTime" :label="$t('trials:linkedRP:table:effectiveTime')" />
prop="EffectOfTime"
:label="$t('trials:linkedRP:table:effectiveTime')"
/>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<div style="text-align:right"> <div style="text-align:right">
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" :disabled="list.length === 0" @pagination="getReadingReriodList" /> <pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
:disabled="list.length === 0" @pagination="getReadingReriodList" />
</div> </div>
<div style="text-align:right;padding-top: 10px;"> <div style="text-align:right;padding-top: 10px;">

View File

@ -1,12 +1,5 @@
<template> <template>
<el-form <el-form ref="addSubjectPR" v-loading="loading" :model="form" size="small" :rules="rules" label-width="180px">
ref="addSubjectPR"
v-loading="loading"
:model="form"
size="small"
:rules="rules"
label-width="180px"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<!-- 中心编号 --> <!-- 中心编号 -->
<el-form-item :label="$t('trials:readingPeriod:table:siteCode')"> <el-form-item :label="$t('trials:readingPeriod:table:siteCode')">
@ -24,18 +17,9 @@
<el-input v-model="form.Name" /> <el-input v-model="form.Name" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('trials:addSubjectPR:table:deadlineVisit')" prop="VisitStageId"> <el-form-item :label="$t('trials:addSubjectPR:table:deadlineVisit')" prop="VisitStageId">
<el-select <el-select v-model="form.VisitStageId" clearable style="width:100%;" @change="handleVisitChange">
v-model="form.VisitStageId" <el-option v-for="(item, index) of visitPlanOptions" :key="index" :label="item.VisitName"
clearable :value="item.SubjectVisitId">
style="width:100%;"
@change="handleVisitChange"
>
<el-option
v-for="(item, index) of visitPlanOptions"
:key="index"
:label="item.VisitName"
:value="item.SubjectVisitId"
>
<span style="float: left">{{ item.VisitName }}</span> <span style="float: left">{{ item.VisitName }}</span>
</el-option> </el-option>
</el-select> </el-select>
@ -44,12 +28,7 @@
<div class="base-dialog-footer" style="text-align:right;padding: 5px 0;"> <div class="base-dialog-footer" style="text-align:right;padding: 5px 0;">
<el-form-item> <el-form-item>
<!-- 取消 --> <!-- 取消 -->
<el-button <el-button :disabled="btnLoading" size="small" type="primary" @click="close">
:disabled="btnLoading"
size="small"
type="primary"
@click="close"
>
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave"> <el-button size="small" type="primary" :loading="btnLoading" @click="handleSave">
@ -183,6 +162,7 @@ export default {
} else { } else {
getCanChangeReadVisitList({ getCanChangeReadVisitList({
SubjectId: this.data.SubjectId, SubjectId: this.data.SubjectId,
ReadingSetType: this.data.ReadingSetType,
Id: this.data.Id, Id: this.data.Id,
TrialReadingCriterionId: this.trialReadingCriterionId TrialReadingCriterionId: this.trialReadingCriterionId
}).then(res => { }).then(res => {

View File

@ -1,17 +1,12 @@
<template> <template>
<el-form <el-form ref="EditRPStatus" v-loading="loading" :model="form" size="small" label-width="100px">
ref="EditRPStatus"
v-loading="loading"
:model="form"
size="small"
label-width="100px"
>
<div class="base-dialog-body"> <div class="base-dialog-body">
<!-- 状态 --> <!-- 状态 -->
<el-form-item :label="$t('trials:rpManage:table:readingStatus')" prop="IsTakeEffect"> <el-form-item :label="$t('trials:rpManage:table:readingStatus')" prop="IsTakeEffect">
<el-radio-group v-model="form.IsTakeEffect" style="width:100%;"> <el-radio-group v-model="form.IsTakeEffect" style="width:100%;">
<el-radio v-for="item of $d.TakeEffect" :key="item.value" :label="item.value" :disabled="item.value===0">{{ item.label }}</el-radio> <el-radio v-for="item of $d.TakeEffect" :key="item.value" :label="item.value" :disabled="item.value === 0">{{
item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
@ -19,12 +14,7 @@
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
<el-form-item> <el-form-item>
<!-- 取消 --> <!-- 取消 -->
<el-button <el-button :disabled="btnLoading" size="small" type="primary" @click="close">
:disabled="btnLoading"
size="small"
type="primary"
@click="close"
>
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->

View File

@ -1,85 +1,44 @@
<template> <template>
<div class="preview-clinical-data"> <div class="preview-clinical-data">
<el-table <el-table v-if="data.ClinicalUploadType === 1" v-loading="loading" :data="data.FileList" stripe style="width: 100%"
v-if="data.ClinicalUploadType === 1" height="500">
v-loading="loading"
:data="data.FileList"
stripe
style="width: 100%"
height="500"
>
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<!-- 文件名称 --> <!-- 文件名称 -->
<el-table-column <el-table-column prop="FileName" :label="$t('trials:readingPeriod:cd:table:fileName')" />
prop="FileName"
:label="$t('trials:readingPeriod:cd:table:fileName')"
/>
<el-table-column <el-table-column :label="$t('common:action:action')">
:label="$t('common:action:action')"
>
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 预览 --> <!-- 预览 -->
<el-button <el-button circle :title="$t('trials:readingPeriod:cd:action:viewFile')" icon="el-icon-view"
circle @click="handlePreview(scope.row)" />
:title="$t('trials:readingPeriod:cd:action:viewFile')"
icon="el-icon-view"
@click="handlePreview(scope.row)"
/>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button v-if="(!data.IsSign && !data.IsCRCUpload)" circle
v-if="(!data.IsSign && !data.IsCRCUpload)" :title="$t('trials:readingPeriod:cd:action:deleteFile')" icon="el-icon-delete"
circle @click="handleDelete(scope.$index, scope.row)" />
:title="$t('trials:readingPeriod:cd:action:deleteFile')"
icon="el-icon-delete"
@click="handleDelete(scope.$index,scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div v-else> <div v-else>
<!-- 既往放疗史 --> <!-- 既往放疗史 -->
<h4>{{ $t('trials:uploadClinicalData:title:pastTreatment') }}</h4> <h4>{{ $t('trials:uploadClinicalData:title:pastTreatment') }}</h4>
<el-table <el-table :data="data.ClinicalTableData.PreviousHistoryList" style="width: 100%">
:data="data.ClinicalTableData.PreviousHistoryList" <el-table-column type="index" width="50" />
style="width: 100%"
>
<el-table-column
type="index"
width="50"
/>
<!-- 放疗部位 --> <!-- 放疗部位 -->
<el-table-column <el-table-column prop="Position" :label="$t('trials:uploadClinicalData:table:bodyPart')" width="180" />
prop="Position"
:label="$t('trials:uploadClinicalData:table:bodyPart')"
width="180"
/>
<!-- 开始日期 --> <!-- 开始日期 -->
<el-table-column <el-table-column prop="StartTime" :label="$t('trials:uploadClinicalData:table:beginDate')" width="180">
prop="StartTime"
:label="$t('trials:uploadClinicalData:table:beginDate')"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.StartTime?moment(scope.row.StartTime).format('YYYY-MM-DD'):'' }} {{ scope.row.StartTime ? moment(scope.row.StartTime).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 结束日期 --> <!-- 结束日期 -->
<el-table-column <el-table-column prop="EndTime" :label="$t('trials:uploadClinicalData:table:endDate')" width="180">
prop="EndTime"
:label="$t('trials:uploadClinicalData:table:endDate')"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.EndTime?moment(scope.row.EndTime).format('YYYY-MM-DD'):'' }} {{ scope.row.EndTime ? moment(scope.row.EndTime).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 病灶是否PD --> <!-- 病灶是否PD -->
<el-table-column <el-table-column prop="IsPD" :label="$t('trials:uploadClinicalData:table:isPD')" width="180">
prop="IsPD"
:label="$t('trials:uploadClinicalData:table:isPD')"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ $fd('IsPdEnum', scope.row.IsPD) }} {{ $fd('IsPdEnum', scope.row.IsPD) }}
</template> </template>
@ -87,65 +46,34 @@
</el-table> </el-table>
<!-- 既往手术史 --> <!-- 既往手术史 -->
<h4>{{ $t('trials:uploadClinicalData:title:pastSurgery') }}</h4> <h4>{{ $t('trials:uploadClinicalData:title:pastSurgery') }}</h4>
<el-table <el-table :data="data.ClinicalTableData.PreviousSurgeryList" style="width: 100%">
:data="data.ClinicalTableData.PreviousSurgeryList" <el-table-column type="index" width="50" />
style="width: 100%"
>
<el-table-column
type="index"
width="50"
/>
<!-- 手术名称 --> <!-- 手术名称 -->
<el-table-column <el-table-column prop="OperationName" :label="$t('trials:uploadClinicalData:table:surgeryName')" width="180" />
prop="OperationName"
:label="$t('trials:uploadClinicalData:table:surgeryName')"
width="180"
/>
<!-- 手术日期 --> <!-- 手术日期 -->
<el-table-column <el-table-column prop="OperationTime" :label="$t('trials:uploadClinicalData:table:surgeryDate')" width="180">
prop="OperationTime"
:label="$t('trials:uploadClinicalData:table:surgeryDate')"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.OperationTime?moment(scope.row.OperationTime).format('YYYY-MM-DD'):'' }} {{ scope.row.OperationTime ? moment(scope.row.OperationTime).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 既往其他治疗史 --> <!-- 既往其他治疗史 -->
<h4>{{ $t('trials:uploadClinicalData:title:others') }}</h4> <h4>{{ $t('trials:uploadClinicalData:title:others') }}</h4>
<el-table <el-table :data="data.ClinicalTableData.PreviousOtherList" style="width: 100%">
:data="data.ClinicalTableData.PreviousOtherList" <el-table-column type="index" width="50" />
style="width: 100%"
>
<el-table-column
type="index"
width="50"
/>
<!-- 治疗类型 --> <!-- 治疗类型 -->
<el-table-column <el-table-column prop="TreatmentType" :label="$t('trials:uploadClinicalData:table:treatmentType')"
prop="TreatmentType" width="180" />
:label="$t('trials:uploadClinicalData:table:treatmentType')"
width="180"
/>
<!-- 开始日期 --> <!-- 开始日期 -->
<el-table-column <el-table-column prop="StartTime" :label="$t('trials:uploadClinicalData:table:treatmentbeginDate')" width="180">
prop="StartTime"
:label="$t('trials:uploadClinicalData:table:treatmentbeginDate')"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.StartTime?moment(scope.row.StartTime).format('YYYY-MM-DD'):'' }} {{ scope.row.StartTime ? moment(scope.row.StartTime).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 结束日期 --> <!-- 结束日期 -->
<el-table-column <el-table-column prop="EndTime" :label="$t('trials:uploadClinicalData:table:treatmentendDate')" width="180">
prop="EndTime"
:label="$t('trials:uploadClinicalData:table:treatmentendDate')"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.EndTime?moment(scope.row.EndTime).format('YYYY-MM-DD'):'' }} {{ scope.row.EndTime ? moment(scope.row.EndTime).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -190,7 +118,7 @@ export default {
this.loading = false this.loading = false
this.$message.success(this.$t('common:message:deletedSuccessfully')) this.$message.success(this.$t('common:message:deletedSuccessfully'))
}).catch(() => { this.loading = false }) }).catch(() => { this.loading = false })
}).catch(() => {}) }).catch(() => { })
} }
} }
} }

View File

@ -4,11 +4,7 @@
<el-form :inline="true"> <el-form :inline="true">
<!-- 阅片期名称 --> <!-- 阅片期名称 -->
<el-form-item :label="$t('trials:rpManage:table:readingName')"> <el-form-item :label="$t('trials:rpManage:table:readingName')">
<el-input <el-input v-model="searchData.ReadingPeriodName" style="width:100px;" clearable />
v-model="searchData.ReadingPeriodName"
style="width:100px;"
clearable
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
@ -22,23 +18,11 @@
{{ $t('common:button:export') }} {{ $t('common:button:export') }}
</el-button> --> </el-button> -->
<!-- 添加影像学阅片 --> <!-- 添加影像学阅片 -->
<el-button <el-button v-if="isGlobalReading" type="primary" icon="el-icon-plus" size="small" @click="handleAdd(0)">
v-if="isGlobalReading"
type="primary"
icon="el-icon-plus"
size="small"
@click="handleAdd(0)"
>
{{ $t('trials:rpManage:button:addImageReading') }} {{ $t('trials:rpManage:button:addImageReading') }}
</el-button> </el-button>
<!-- 添加肿瘤学阅片 --> <!-- 添加肿瘤学阅片 -->
<el-button <el-button v-if="isClinicalReading" type="primary" icon="el-icon-plus" size="small" @click="handleAdd(1)">
v-if="isClinicalReading"
type="primary"
icon="el-icon-plus"
size="small"
@click="handleAdd(1)"
>
{{ $t('trials:rpManage:button:addOncologyReading') }} {{ $t('trials:rpManage:button:addOncologyReading') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -46,77 +30,44 @@
</div> </div>
<div class="main-wrapper"> <div class="main-wrapper">
<el-table <el-table v-loading="loading" :data="list" stripe style="width: 100%" height="500"
v-loading="loading" @sort-change="handleSortChange">
:data="list"
stripe
style="width: 100%"
height="500"
@sort-change="handleSortChange"
>
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<!-- 阅片期类型 --> <!-- 阅片期类型 -->
<el-table-column <el-table-column prop="ReadingSetType" :label="$t('trials:rpManage:table:readingType')" sortable="custom"
prop="ReadingSetType" show-overflow-tooltip>
:label="$t('trials:rpManage:table:readingType')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ $fd('ReadingSetType',scope.row.ReadingSetType) }} {{ $fd('ReadingSetType', scope.row.ReadingSetType) }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 阅片期名称 --> <!-- 阅片期名称 -->
<el-table-column <el-table-column prop="ReadingPeriodName" :label="$t('trials:rpManage:table:readingName')" sortable="custom"
prop="ReadingPeriodName" show-overflow-tooltip />
:label="$t('trials:rpManage:table:readingName')"
sortable="custom"
show-overflow-tooltip
/>
<!-- 受试者范围 --> <!-- 受试者范围 -->
<el-table-column <el-table-column prop="ReadingScope" :label="$t('trials:rpManage:table:subjectRange')" sortable="custom"
prop="ReadingScope" show-overflow-tooltip>
:label="$t('trials:rpManage:table:subjectRange')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ $fd('ReadingScopeEnum',scope.row.ReadingScope) }} {{ $fd('ReadingScopeEnum', scope.row.ReadingScope) }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 指定中心 --> <!-- 指定中心 -->
<el-table-column <el-table-column prop="SiteCodes" :label="$t('trials:rpManage:table:designatedSite')" show-overflow-tooltip>
prop="SiteCodes"
:label="$t('trials:rpManage:table:designatedSite')"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.SiteCodes.length>0? scope.row.SiteCodes.join(', '):'' }} {{ scope.row.SiteCodes.length > 0 ? scope.row.SiteCodes.join(', ') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 截止日期 --> <!-- 截止日期 -->
<el-table-column <el-table-column prop="ExpirationDate" :label="$t('trials:rpManage:table:expirationDate')" sortable="custom"
prop="ExpirationDate" show-overflow-tooltip>
:label="$t('trials:rpManage:table:expirationDate')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.ExpirationDate?moment(scope.row.ExpirationDate).format('YYYY-MM-DD'):'' }} {{ scope.row.ExpirationDate ? moment(scope.row.ExpirationDate).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 截止访视 --> <!-- 截止访视 -->
<el-table-column <el-table-column prop="SubjectVisitName" :label="$t('trials:rpManage:table:expirationVisit')" />
prop="SubjectVisitName"
:label="$t('trials:rpManage:table:expirationVisit')"
/>
<!-- 关联阅片期 --> <!-- 关联阅片期 -->
<el-table-column <el-table-column prop="PlanCount" :label="$t('trials:rpManage:table:linkedVisits')" sortable="custom"
prop="PlanCount" show-overflow-tooltip>
:label="$t('trials:rpManage:table:linkedVisits')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" :disabled="scope.row.PlanCount === 0" @click="handleRelationPR(scope.row)"> <el-button type="text" :disabled="scope.row.PlanCount === 0" @click="handleRelationPR(scope.row)">
{{ scope.row.PlanCount }} {{ scope.row.PlanCount }}
@ -124,12 +75,8 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- 状态 --> <!-- 状态 -->
<el-table-column <el-table-column prop="IsTakeEffect" :label="$t('trials:rpManage:table:readingStatus')" sortable="custom"
prop="IsTakeEffect" show-overflow-tooltip>
:label="$t('trials:rpManage:table:readingStatus')"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.IsTakeEffect === 0" type="info"> <el-tag v-if="scope.row.IsTakeEffect === 0" type="info">
{{ $fd('TakeEffect', scope.row.IsTakeEffect) }} {{ $fd('TakeEffect', scope.row.IsTakeEffect) }}
@ -143,87 +90,48 @@
</template> </template>
</el-table-column> </el-table-column>
<!-- 生效时间 --> <!-- 生效时间 -->
<el-table-column <el-table-column prop="EffectOfTime" :label="$t('trials:rpManage:table:effectiveTime')" sortable="custom"
prop="EffectOfTime" show-overflow-tooltip width="120" />
:label="$t('trials:rpManage:table:effectiveTime')" <el-table-column :label="$t('common:action:action')" width="200">
sortable="custom"
show-overflow-tooltip
width="120"
/>
<el-table-column
:label="$t('common:action:action')"
width="200"
>
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 编辑 --> <!-- 编辑 -->
<el-button <el-button circle :title="$t('trials:rpManage:action:edit')" icon="el-icon-edit-outline"
circle :disabled="scope.row.IsTakeEffect === 1 || scope.row.IsGlobal" @click="handleEdit(scope.row)" />
:title="$t('trials:rpManage:action:edit')"
icon="el-icon-edit-outline"
:disabled="scope.row.IsTakeEffect === 1 || scope.row.IsGlobal"
@click="handleEdit(scope.row)"
/>
<!-- 修改状态 --> <!-- 修改状态 -->
<el-button <el-button circle :title="$t('trials:rpManage:action:status')" icon="el-icon-edit"
circle :disabled="scope.row.IsGlobal" @click="handleEditStatus(scope.row)" />
:title="$t('trials:rpManage:action:status')"
icon="el-icon-edit"
:disabled="scope.row.IsGlobal"
@click="handleEditStatus(scope.row)"
/>
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button circle :title="$t('trials:rpManage:action:delete')" icon="el-icon-delete"
circle :disabled="scope.row.IsTakeEffect === 1 || scope.row.IsGlobal" @click="handleDelete(scope.row)" />
:title="$t('trials:rpManage:action:delete')"
icon="el-icon-delete"
:disabled="scope.row.IsTakeEffect === 1 || scope.row.IsGlobal"
@click="handleDelete(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </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" />
</div> </div>
<!-- 新增/编辑 --> <!-- 新增/编辑 -->
<el-dialog <el-dialog v-if="addOrEditPR.visible" :visible.sync="addOrEditPR.visible" :close-on-click-modal="false"
v-if="addOrEditPR.visible" :before-close="beforePRClose" :title="addOrEditPR.title" width="80%" append-to-body
:visible.sync="addOrEditPR.visible" custom-class="base-dialog-wrapper">
:close-on-click-modal="false" <AddOrEditPR ref="addOrEditPR" :trial-reading-criterion-id="trialReadingCriterionId" :data="currentRow"
:before-close="beforePRClose" @close="addOrEditPR.visible = false" @getList="getList" />
:title="addOrEditPR.title"
width="80%"
append-to-body
custom-class="base-dialog-wrapper"
>
<AddOrEditPR ref="addOrEditPR" :trial-reading-criterion-id="trialReadingCriterionId" :data="currentRow" @close="addOrEditPR.visible = false" @getList="getList" />
</el-dialog> </el-dialog>
<!-- 状态变更 --> <!-- 状态变更 -->
<el-dialog <el-dialog v-if="editStatus.visible" :visible.sync="editStatus.visible" :close-on-click-modal="false"
v-if="editStatus.visible" :title="editStatus.title" width="500px" append-to-body custom-class="base-dialog-wrapper">
:visible.sync="editStatus.visible" <EditPRStatus :trial-reading-criterion-id="trialReadingCriterionId" :data="currentRow"
:close-on-click-modal="false" @close="editStatus.visible = false" @getList="refresh" />
:title="editStatus.title"
width="500px"
append-to-body
custom-class="base-dialog-wrapper"
>
<EditPRStatus :trial-reading-criterion-id="trialReadingCriterionId" :data="currentRow" @close="editStatus.visible = false" @getList="refresh" />
</el-dialog> </el-dialog>
<!-- 关联阅片期 --> <!-- 关联阅片期 -->
<el-dialog <el-dialog v-if="relationPR.visible" :visible.sync="relationPR.visible" :close-on-click-modal="false"
v-if="relationPR.visible" :title="$t('trials:rpManage:dialogTitle:linkedRP')" width="1000px" append-to-body
:visible.sync="relationPR.visible" custom-class="base-dialog-wrapper">
:close-on-click-modal="false" <RelationPRList :trial-reading-criterion-id="trialReadingCriterionId" :data="currentRow"
:title="$t('trials:rpManage:dialogTitle:linkedRP')" @close="relationPR.visible = false" @getList="getList" />
width="1000px"
append-to-body
custom-class="base-dialog-wrapper"
>
<RelationPRList :trial-reading-criterion-id="trialReadingCriterionId" :data="currentRow" @close="relationPR.visible = false" @getList="getList" />
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -370,6 +278,4 @@ export default {
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped></style>
</style>

View File

@ -1,59 +1,34 @@
<template> <template>
<div> <div>
<el-table <el-table v-loading="loading" :data="list" stripe height="455">
v-loading="loading"
:data="list"
stripe
height="455"
>
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<!-- 中心编号 --> <!-- 中心编号 -->
<el-table-column <el-table-column prop="TrialSiteCode" :label="$t('trials:linkedRP:table:siteCode')" />
prop="TrialSiteCode"
:label="$t('trials:linkedRP:table:siteCode')"
/>
<!-- 受试者编号 --> <!-- 受试者编号 -->
<el-table-column <el-table-column prop="SubjectCode" :label="$t('trials:linkedRP:table:subjectCode')" />
prop="SubjectCode"
:label="$t('trials:linkedRP:table:subjectCode')"
/>
<!-- 截止访视 --> <!-- 截止访视 -->
<el-table-column <el-table-column prop="SubjectVisitName" :label="$t('trials:linkedRP:table:expirationVisit')" />
prop="SubjectVisitName"
:label="$t('trials:linkedRP:table:expirationVisit')"
/>
<!-- 最晚拍片日期 --> <!-- 最晚拍片日期 -->
<el-table-column <el-table-column prop="LatestScanDate" :label="$t('trials:linkedRP:table:latestScanDate')">
prop="LatestScanDate"
:label="$t('trials:linkedRP:table:latestScanDate')"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.LatestScanDate?moment(scope.row.LatestScanDate).format('YYYY-MM-DD'):'' }} {{ scope.row.LatestScanDate ? moment(scope.row.LatestScanDate).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 截止日期 --> <!-- 截止日期 -->
<el-table-column <el-table-column prop="ExpirationDate" :label="$t('trials:linkedRP:table:expirationDate')">
prop="ExpirationDate"
:label="$t('trials:linkedRP:table:expirationDate')"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.ExpirationDate?moment(scope.row.ExpirationDate).format('YYYY-MM-DD'):'' }} {{ scope.row.ExpirationDate ? moment(scope.row.ExpirationDate).format('YYYY-MM-DD') : '' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- 阅片期名称 --> <!-- 阅片期名称 -->
<el-table-column <el-table-column prop="ReadingPeriodName" :label="$t('trials:linkedRP:table:readingName')" />
prop="ReadingPeriodName"
:label="$t('trials:linkedRP:table:readingName')"
/>
<!-- 生效时间 --> <!-- 生效时间 -->
<el-table-column <el-table-column prop="EffectOfTime" :label="$t('trials:linkedRP:table:effectiveTime')" />
prop="EffectOfTime"
:label="$t('trials:linkedRP:table:effectiveTime')"
/>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<div style="text-align:right;"> <div style="text-align:right;">
<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" />
</div> </div>
</div> </div>

View File

@ -1,43 +1,19 @@
<template> <template>
<el-form <el-form ref="verificationForm" v-loading="loading" :model="form" size="small" :rules="rules" label-width="150px"
ref="verificationForm" :inline="true">
v-loading="loading"
:model="form"
size="small"
:rules="rules"
label-width="150px"
:inline="true"
>
<!-- 文件列表 --> <!-- 文件列表 -->
<el-divider content-position="left">{{ $t('trials:readingPeriod:verify:title:fileList') }}</el-divider> <el-divider content-position="left">{{ $t('trials:readingPeriod:verify:title:fileList') }}</el-divider>
<div style="text-align: right"> <div style="text-align: right">
<!-- 预览 --> <!-- 预览 -->
<el-button <el-button type="primary" style="margin-bottom: 10px" icon="el-icon-view" size="mini" @click="handlePreview">
type="primary"
style="margin-bottom: 10px"
icon="el-icon-view"
size="mini"
@click="handlePreview"
>
{{ $t('trials:readingPeriod:verify:title:preview') }} {{ $t('trials:readingPeriod:verify:title:preview') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table ref="filesTable" :data="fileList" class="dicomFiles-table" height="200" style="width:100%" border>
ref="filesTable"
:data="fileList"
class="dicomFiles-table"
height="200"
style="width:100%"
border
>
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<el-table-column <el-table-column prop="FileName" :label="$t('trials:uploadClinicalData:table:fileName')" min-width="190"
prop="FileName" show-overflow-tooltip />
:label="$t('trials:uploadClinicalData:table:fileName')"
min-width="190"
show-overflow-tooltip
/>
</el-table> </el-table>
<!-- 核查结果 --> <!-- 核查结果 -->
<el-divider content-position="left">{{ $t('trials:readingPeriod:verify:title:result') }}</el-divider> <el-divider content-position="left">{{ $t('trials:readingPeriod:verify:title:result') }}</el-divider>
@ -46,7 +22,7 @@
<el-form-item :label="$t('trials:readingPeriod:verify:title:isComplete')" prop="IsComplete"> <el-form-item :label="$t('trials:readingPeriod:verify:title:isComplete')" prop="IsComplete">
<el-radio-group v-model="form.IsComplete"> <el-radio-group v-model="form.IsComplete">
<el-radio :label="true">{{ $fd('YesOrNo', true) }}</el-radio> <el-radio :label="true">{{ $fd('YesOrNo', true) }}</el-radio>
<el-radio v-if="data.ClinicalDataLevel !== 3" :label="false">N/A</el-radio> <el-radio v-if="data.ClinicalUploadType === 1" :label="false">N/A</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</div> </div>
@ -55,31 +31,18 @@
<el-form-item :label="$t('trials:readingPeriod:verify:title:isBlind')" prop="IsBlind"> <el-form-item :label="$t('trials:readingPeriod:verify:title:isBlind')" prop="IsBlind">
<el-radio-group v-model="form.IsBlind"> <el-radio-group v-model="form.IsBlind">
<el-radio :label="true">{{ $fd('YesOrNo', true) }}</el-radio> <el-radio :label="true">{{ $fd('YesOrNo', true) }}</el-radio>
<el-radio v-if="data.ClinicalDataLevel !== 3" :label="false">N/A</el-radio> <el-radio v-if="data.ClinicalUploadType === 1" :label="false">N/A</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</div> </div>
<div <div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
class="base-dialog-footer"
style="text-align:right;margin-top:10px;"
>
<el-form-item> <el-form-item>
<!-- 取消 --> <!-- 取消 -->
<el-button <el-button :disabled="btnLoading" size="small" type="primary" @click="close">
:disabled="btnLoading"
size="small"
type="primary"
@click="close"
>
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="small" type="primary" :loading="btnLoading" @click="save">
size="small"
type="primary"
:loading="btnLoading"
@click="save"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -129,15 +92,17 @@ export default {
}, },
methods: { methods: {
PMClinicalDataConfirm() { PMClinicalDataConfirm() {
// this.loading = true this.loading = true
// this.btnLoading = true this.btnLoading = true
// PMClinicalDataConfirm(this.form).then(res => { // PMClinicalDataConfirm(this.form).then(res => {
// // this.$message.success('') // // this.$message.success('')
// this.loading = false // this.loading = false
// this.btnLoading = false // this.btnLoading = false
this.$emit('getList') this.$emit('getList')
this.$emit('sign', this.form) this.$emit('sign', this.form)
// this.$emit('close') this.loading = false
this.btnLoading = false
// this.$emit('close')
// }).catch(() => { // }).catch(() => {
// this.loading = false // this.loading = false
// this.btnLoading = false // this.btnLoading = false
@ -186,5 +151,4 @@ export default {
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped></style>
</style>

View File

@ -1,58 +1,39 @@
<template> <template>
<BaseContainer> <BaseContainer class="reading-period">
<el-tabs v-model="TrialReadingCriterionId" type="border-card"> <el-tabs v-model="TrialReadingCriterionId" type="border-card">
<el-tab-pane v-for="criterion of trialCriterionList" :key="criterion.TrialReadingCriterionId" :label="criterion.TrialReadingCriterionName" :name="criterion.TrialReadingCriterionId"> <el-tab-pane v-for="criterion of trialCriterionList" :key="criterion.TrialReadingCriterionId"
:label="criterion.TrialReadingCriterionName" :name="criterion.TrialReadingCriterionId">
<div v-if="TrialReadingCriterionId === criterion.TrialReadingCriterionId"> <div v-if="TrialReadingCriterionId === criterion.TrialReadingCriterionId">
<div slot="search-container"> <div slot="search-container">
<el-form :inline="true"> <el-form :inline="true">
<el-form-item :label="$t('trials:readingPeriod:table:siteCode')"> <!-- 中心编号 -->
<!-- 中心编号 --> <!-- <el-form-item :label="$t('trials:readingPeriod:table:siteCode')">
<el-select v-model="searchData.TrialSiteCode" clearable filterable style="width:120px;"> <el-select v-model="searchData.TrialSiteCode" clearable filterable style="width:120px;">
<el-option <el-option v-for="(site, index) of siteOptions" :key="index" :label="site.TrialSiteCode"
v-for="(site,index) of siteOptions" :value="site.TrialSiteCode" />
:key="index"
:label="site.TrialSiteCode"
:value="site.TrialSiteCode"
/>
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<!-- 受试者编号 --> <!-- 受试者编号 -->
<el-form-item :label="$t('trials:readingPeriod:table:subjectCode')"> <el-form-item :label="$t('trials:readingPeriod:table:subjectCode')">
<el-input <el-input v-model="searchData.SubjectCode" style="width: 100px" clearable />
v-model="searchData.SubjectCode"
style="width:100px;"
clearable
/>
</el-form-item> </el-form-item>
<!-- 阅片类型 --> <!-- 阅片类型 -->
<el-form-item :label="$t('trials:readingPeriod:table:readingType')"> <el-form-item :label="$t('trials:readingPeriod:table:readingType')">
<el-select v-model="searchData.ModuleType" clearable style="width:120px"> <el-select v-model="searchData.ModuleType" clearable style="width: 120px">
<el-option <el-option v-for="item of $d.ModuleTypeEnum" :key="item.value" :value="item.value"
v-for="item of $d.ModuleTypeEnum" :label="item.label" />
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 进度 --> <!-- 进度 -->
<el-form-item :label="$t('trials:readingPeriod:table:readingSchedule')"> <el-form-item :label="$t('trials:readingPeriod:table:readingSchedule')">
<el-select v-model="searchData.ReadingStatus" clearable style="width:120px"> <el-select v-model="searchData.ReadingStatus" clearable style="width: 120px">
<el-option <el-option v-for="item of $d.ReadModuleEnum" :key="item.value" :value="item.value"
v-for="item of $d.ReadModuleEnum" :label="item.label" />
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 阅片名称 --> <!-- 阅片名称 -->
<el-form-item :label="$t('trials:readingPeriod:table:readingName')"> <el-form-item :label="$t('trials:readingPeriod:table:readingName')">
<el-input <el-input v-model="searchData.Name" style="width: 100px" clearable />
v-model="searchData.Name"
style="width:100px;"
clearable
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
@ -66,139 +47,170 @@
{{ $t('trials:readingPeriod:buttton:exportSubjectTbl') }} {{ $t('trials:readingPeriod:buttton:exportSubjectTbl') }}
</el-button> </el-button>
<!--导出阅片期信息表--> <!--导出阅片期信息表-->
<!-- <el-button type="primary" icon="el-icon-download" @click="handleExportPeriod"> <el-button type="primary" icon="el-icon-download" @click="handleExportPeriod">
{{ $t('trials:readingPeriod:buttton:exportPeriodTbl') }} {{ $t('trials:readingPeriod:buttton:exportPeriodTbl') }}
</el-button> --> </el-button>
<!-- 阅片期管理 --> <!-- 阅片期管理 -->
<!-- <el-button <el-button v-if="
v-if="ReadingInfoSignTime && (otherInfo.IsClinicalReading || otherInfo.IsReadingPeriod)" ReadingInfoSignTime &&
v-hasPermi="['trials:trials-panel:subject:readingPeriod:edit']" (otherInfo.IsClinicalReading || otherInfo.IsReadingPeriod)
type="primary" " v-hasPermi="[
icon="el-icon-edit-outline" 'trials:trials-panel:subject:readingPeriod:edit',
@click="handleReadingPeriod" ]" type="primary" icon="el-icon-edit-outline" @click="handleReadingPeriod">
>
{{ $t('trials:readingPeriod:button:rpManage') }} {{ $t('trials:readingPeriod:button:rpManage') }}
</el-button> --> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div slot="main-container"> <div slot="main-container">
<el-table <el-table ref="myTable" v-adaptive="{ bottomOffset: 135 }" v-loading="loading" :data="list" stripe
ref="myTable" height="100" :header-row-class-name="headerRowStyle" :cell-style="cellStyle"
v-adaptive="{bottomOffset:75}" @sort-change="handleSortChange">
v-loading="loading"
:data="list"
stripe
height="100"
:header-row-class-name="headerRowStyle"
:cell-style="cellStyle"
@sort-change="handleSortChange"
>
<el-table-column type="index" width="40" fixed="left" /> <el-table-column type="index" width="40" fixed="left" />
<!-- 中心编号 --> <!-- 中心编号 -->
<el-table-column <!-- <el-table-column prop="TrialSiteCode" :label="$t('trials:readingPeriod:table:siteCode')" min-width="110"
prop="TrialSiteCode" fixed="left" sortable="custom" show-overflow-tooltip /> -->
:label="$t('trials:readingPeriod:table:siteCode')"
min-width="110"
fixed="left"
sortable="custom"
show-overflow-tooltip
/>
<!-- 受试者编号 --> <!-- 受试者编号 -->
<el-table-column <el-table-column prop="SubjectCode" :label="$t('trials:readingPeriod:table:subjectCode')" min-width="120"
prop="SubjectCode" fixed="left" sortable="custom" show-overflow-tooltip />
:label="$t('trials:readingPeriod:table:subjectCode')"
min-width="120"
fixed="left"
sortable="custom"
show-overflow-tooltip
/>
<!-- 阅片计划 --> <!-- 阅片计划 -->
<el-table-column <el-table-column :label="$t('trials:readingPeriod:table:readingPlan')" align="center" min-width="100">
:label="$t('trials:readingPeriod:table:readingPlan')" <el-table-column v-for="i in maxLength" :key="`${i}`" :prop="`Plan${i - 1}`" label="" width="240">
align="center"
min-width="100"
>
<el-table-column
v-for="i in maxLength"
:key="`${i}`"
:prop="`Plan${i-1}`"
label=""
width="240"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="i<=scope.row.Data.length"> <div v-if="i <= scope.row.Data.length">
<!-- <div style="">--> <!-- <div style="">-->
<div style="border-bottom: 1px solid #d9d9d9;margin-bottom: 8px;padding-bottom: 8px;display: flex;justify-content: space-between;"> <div style="
<div style="font-size: 16px;font-weight: 900"> border-bottom: 1px solid #d9d9d9;
{{ scope.row.Data[i-1].Name }} margin-bottom: 8px;
padding-bottom: 8px;
display: flex;
justify-content: space-between;
">
<div style="font-size: 16px; font-weight: 900">
{{ scope.row.Data[i - 1].Name }}
</div> </div>
<div> <div>
<span v-if="scope.row.Data[i-1].IsEnrollmentConfirm"> <span v-if="scope.row.Data[i - 1].IsEnrollmentConfirm">
| {{ $t('trials:readingPeriod:table:enroll') }} | {{ $t('trials:readingPeriod:table:enroll') }}
</span> </span>
<span v-if="scope.row.Data[i-1].PDState"> <span v-if="scope.row.Data[i - 1].PDState">
| {{ $t('trials:readingPeriod:table:pd') }} | {{ $t('trials:readingPeriod:table:pd') }}
</span> </span>
<span v-if="scope.row.Data[i-1].IsUrgent"> <span v-if="scope.row.Data[i - 1].IsUrgent">
| {{ $t('trials:readingPeriod:table:urgent') }} | {{ $t('trials:readingPeriod:table:urgent') }}
</span> </span>
<span v-if="scope.row.Data[i-1].IsFinalVisit"> <span v-if="scope.row.Data[i - 1].IsFinalVisit">
| {{ $t('trials:readingPeriod:table:finalVisit') }} | {{ $t('trials:readingPeriod:table:finalVisit') }}
</span> </span>
</div> </div>
</div> </div>
<div style="display: flex;justify-content: space-between;border-bottom: 1px solid #d9d9d9;margin-bottom: 8px;padding-bottom: 8px"> <div style="
<div>{{ $fd('ModuleTypeEnum',scope.row.Data[i-1].ModuleType) }}</div> display: flex;
justify-content: space-between;
border-bottom: 1px solid #d9d9d9;
margin-bottom: 8px;
padding-bottom: 8px;
">
<div> <div>
{{ $fd('ReadModuleEnum',scope.row.Data[i-1].ReadingStatus) }} {{
$fd(
'ModuleTypeEnum',
scope.row.Data[i - 1].ModuleType
)
}}
</div>
<div style="
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 110px;
text-align: right;
" :title="$fd(
'ReadModuleEnum',
scope.row.Data[i - 1].ReadingStatus
)
">
{{
$fd(
'ReadModuleEnum',
scope.row.Data[i - 1].ReadingStatus
)
}}
</div> </div>
</div> </div>
<div v-if="scope.row.Data[i-1].ModuleType === 1" style="display: flex;justify-content: space-between;border-bottom: 1px solid #d9d9d9;margin-bottom: 8px;padding-bottom: 8px"> <div v-if="scope.row.Data[i - 1].ModuleType === 1" style="
display: flex;
justify-content: space-between;
border-bottom: 1px solid #d9d9d9;
margin-bottom: 8px;
padding-bottom: 8px;
">
<!-- 上一访视 --> <!-- 上一访视 -->
<div>{{ $t('trials:readingPeriod:table:lastVisit') }}</div>
<div>{{ scope.row.Data[i-1].OutPlanPreviousVisitName }} </div>
</div>
<div v-if="scope.row.Data[i-1].ModuleType === 2 || scope.row.Data[i-1].ModuleType ===3 || scope.row.Data[i-1].ModuleType ===5" style="display: flex;justify-content: space-between;border-bottom: 1px solid #d9d9d9;margin-bottom: 8px;padding-bottom: 8px">
<!-- 截止访视 -->
<div>{{ $t('trials:readingPeriod:table:deadlineVisit') }}</div>
<div>{{ scope.row.Data[i-1].CutOffVisitName }}</div>
</div>
<div v-if="scope.row.Data[i-1].ModuleType ===4 " style="display: flex;justify-content: space-between;border-bottom: 1px solid #d9d9d9;margin-bottom: 8px;padding-bottom: 8px">
<!-- 对应阅片期 -->
<div>{{ $t('trials:readingPeriod:table:correspondVisit2') }}</div>
<div>{{ scope.row.Data[i-1].ReadModuleName }}</div>
</div>
<div v-if="otherInfo.ExistClinicalData" style="display: flex;justify-content: space-between;border-bottom: 1px solid #d9d9d9;margin-bottom: 8px;padding-bottom: 8px">
<div> <div>
<!-- 临床资料 --> {{ $t('trials:readingPeriod:table:lastVisit') }}
{{ $t('trials:readingPeriod:table:clinicalInfo2') }}
<el-link v-if="(scope.row.Data[i-1].IsVisit && otherInfo.IsExistsSubjectClinicalData && scope.row.Data[i-1].IsBaseLine) ||(scope.row.Data[i-1].IsVisit && otherInfo.IsExistsVisitClinicalData) || (!scope.row.Data[i-1].IsVisit && otherInfo.IsExistsReadingClinicalData)" type="danger" @click="handleView(scope.row,scope.row.Data[i-1])">
{{ $t('trials:readingPeriod:button:view') }}
</el-link>
<span v-else>{{ $t('trials:readingPeriod:table:noCD') }}</span>
</div> </div>
<!-- <div >--> <div>
{{ scope.row.Data[i - 1].OutPlanPreviousVisitName }}
<!-- </div>--> </div>
<!-- <div >--> </div>
<div v-if="
<!-- </div>--> scope.row.Data[i - 1].ModuleType === 2 ||
scope.row.Data[i - 1].ModuleType === 3 ||
scope.row.Data[i - 1].ModuleType === 5
" style="
display: flex;
justify-content: space-between;
border-bottom: 1px solid #d9d9d9;
margin-bottom: 8px;
padding-bottom: 8px;
">
<!-- 截止访视 -->
<div>
{{ $t('trials:readingPeriod:table:deadlineVisit') }}
</div>
<div>{{ scope.row.Data[i - 1].CutOffVisitName }}</div>
</div>
<div v-if="scope.row.Data[i - 1].ModuleType === 4" style="
display: flex;
justify-content: space-between;
border-bottom: 1px solid #d9d9d9;
margin-bottom: 8px;
padding-bottom: 8px;
">
<!-- 对应阅片期 -->
<div>
{{
$t('trials:readingPeriod:table:correspondVisit2')
}}
</div>
<div>{{ scope.row.Data[i - 1].ReadModuleName }}</div>
</div>
<div v-if="otherInfo.ExistClinicalData" style="
display: flex;
justify-content: space-between;
border-bottom: 1px solid #d9d9d9;
margin-bottom: 8px;
padding-bottom: 8px;
">
</div> </div>
<div> <div>
<el-link style="color:#428bca" @click="handleDetail(scope.row,scope.row.Data[i-1])"> <el-link style="color: #428bca; margin-right: 5px" @click="
handleDetail(scope.row, scope.row.Data[i - 1])
">
{{ $t('trials:readingPeriod:button:detail') }} {{ $t('trials:readingPeriod:button:detail') }}
</el-link> </el-link>
<el-link v-if="scope.row.Data[i - 1].IsCanChangeCutOffVisit" style="color:#428bca" @click="handleEdit(scope.row,scope.row.Data[i-1])"> <el-link style="color: #428bca; margin-right: 5px"
v-if="scope.row.Data[i - 1].IsCanChangeCutOffVisit"
@click="handleEdit(scope.row, scope.row.Data[i - 1])">
{{ $t('common:button:edit') }} {{ $t('common:button:edit') }}
</el-link> </el-link>
<el-link <el-link style="color: #428bca; margin-right: 5px" v-if="
v-if="(scope.row.Data[i-1].ModuleType === 3 || scope.row.Data[i-1].ModuleType === 5) && scope.row.Data[i-1].ReadingStatus < 4" (scope.row.Data[i - 1].ModuleType === 3 ||
v-hasPermi="['trials:trials-panel:subject:readingPeriod:edit']" scope.row.Data[i - 1].ModuleType === 5) &&
style="color:#428bca" scope.row.Data[i - 1].ReadingStatus < 4
@click="handleDelete(scope.row.Data[i-1])" " v-hasPermi="[
> 'trials:trials-panel:subject:readingPeriod:edit',
]" @click="handleDelete(scope.row.Data[i - 1])">
{{ $t('trials:readingPeriod:button:delete') }} {{ $t('trials:readingPeriod:button:delete') }}
</el-link> </el-link>
</div> </div>
@ -206,40 +218,40 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table-column> </el-table-column>
<!-- <el-table-column <el-table-column v-if="
v-if="(otherInfo.IsReadingPeriod || otherInfo.IsClinicalReading) && ReadingInfoSignTime && hasPermi(['trials:trials-panel:subject:readingPeriod:edit'])" hasPermi([
fixed="right" 'trials:trials-panel:subject:readingPeriod:edit',
:label="$t('common:action:action')" ]) && ReadingInfoSignTime
width="150" " :fixed="(otherInfo.IsReadingPeriod || otherInfo.IsClinicalReading) &&
> ReadingInfoSignTime &&
hasPermi(['trials:trials-panel:subject:readingPeriod:edit'])
? 'right'
: false
" :label="(otherInfo.IsReadingPeriod || otherInfo.IsClinicalReading) &&
ReadingInfoSignTime &&
hasPermi(['trials:trials-panel:subject:readingPeriod:edit'])
? $t('common:action:action')
: ''
" :width="(otherInfo.IsReadingPeriod || otherInfo.IsClinicalReading) &&
ReadingInfoSignTime &&
hasPermi(['trials:trials-panel:subject:readingPeriod:edit'])
? '150px'
: '80px'
">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button v-if="otherInfo.IsReadingPeriod" circle :title="$t('trials:readingPeriod:buttton:addSubjectImageRP')
v-if="otherInfo.IsReadingPeriod" " icon="el-icon-plus" @click="handleAdd(scope.row, 0)" />
circle <el-button v-if="isClinicalReading" circle :title="$t('trials:readingPeriod:buttton:addSubjectOncologyRP')
:title="$t('trials:readingPeriod:buttton:addSubjectImageRP')" " icon="el-icon-plus" @click="handleAdd(scope.row, 1)" />
icon="el-icon-plus"
@click="handleAdd(scope.row,0)"
/>
<el-button
v-if="isClinicalReading"
circle
:title="$t('trials:readingPeriod:buttton:addSubjectOncologyRP')"
icon="el-icon-plus"
@click="handleAdd(scope.row,1)"
/>
</template> </template>
</el-table-column> --> </el-table-column>
</el-table> </el-table>
<!-- 分页组件 --> <!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" /> <pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
<!-- 详情 --> <!-- 详情 -->
<el-dialog <el-dialog v-if="dialogVisible" :title="$t('trials:rpDetail:dialogTitle:detail')"
v-if="dialogVisible" :visible.sync="dialogVisible" width="600px" :close-on-click-modal="false">
:title="$t('trials:rpDetail:dialogTitle:detail')"
:visible.sync="dialogVisible"
width="600px"
:close-on-click-modal="false"
>
<el-descriptions :column="2" border> <el-descriptions :column="2" border>
<!-- 阅片期名称 --> <!-- 阅片期名称 -->
<el-descriptions-item :label="$t('trials:readingPeriod:table:readingName')"> <el-descriptions-item :label="$t('trials:readingPeriod:table:readingName')">
@ -247,41 +259,26 @@
</el-descriptions-item> </el-descriptions-item>
<!-- 阅片期类型 --> <!-- 阅片期类型 -->
<el-descriptions-item :label="$t('trials:readingPeriod:table:readingType')"> <el-descriptions-item :label="$t('trials:readingPeriod:table:readingType')">
{{ $fd('ModuleTypeEnum',currentData.ModuleType) }} {{ $fd('ModuleTypeEnum', currentData.ModuleType) }}
</el-descriptions-item> </el-descriptions-item>
<!-- 是否加急 --> <!-- 是否加急 -->
<!-- <el-descriptions-item label="是否加急"> <el-tag size="small">{{ $fd('YesOrNo',currentData.IsUrgent) }}</el-tag></el-descriptions-item> --> <!-- <el-descriptions-item label="是否加急"> <el-tag size="small">{{ $fd('YesOrNo',currentData.IsUrgent) }}</el-tag></el-descriptions-item> -->
<!-- 进度 --> <!-- 进度 -->
<el-descriptions-item :label="$t('trials:readingPeriod:table:readingSchedule')"> <el-descriptions-item :label="$t('trials:readingPeriod:table:readingSchedule')">
{{ $fd('ReadModuleEnum',currentData.ReadingStatus) }} {{ $fd('ReadModuleEnum', currentData.ReadingStatus) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item <el-descriptions-item v-if="currentData.CutOffVisitName"
v-if="currentData.CutOffVisitName" :label="$t('trials:readingPeriod:table:deadlineVisit')">
:label="$t('trials:readingPeriod:table:deadlineVisit')"
>
{{ currentData.CutOffVisitName }} {{ currentData.CutOffVisitName }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item <el-descriptions-item v-if="currentData.OutPlanPreviousVisitName"
v-if="currentData.OutPlanPreviousVisitName" :label="$t('trials:readingPeriod:table:lastVisit')">
:label="$t('trials:readingPeriod:table:lastVisit')"
>
{{ currentData.OutPlanPreviousVisitName }} {{ currentData.OutPlanPreviousVisitName }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item <el-descriptions-item v-if="currentData.ReadModuleName"
v-if="currentData.ReadModuleName" :label="$t('trials:readingPeriod:table:correspondVisit')">
:label="$t('trials:readingPeriod:table:correspondVisit')"
>
{{ currentData.ReadModuleName }} {{ currentData.ReadModuleName }}
</el-descriptions-item> </el-descriptions-item>
<!-- 临床资料 -->
<el-descriptions-item v-if="otherInfo.ExistClinicalData" :label="$t('trials:readingPeriod:table:clinicalInfo')">
<template v-if="(currentData.IsVisit && otherInfo.IsExistsSubjectClinicalData && currentData.IsBaseLine) ||(currentData.IsVisit && otherInfo.IsExistsVisitClinicalData) || (!currentData.IsVisit && otherInfo.IsExistsReadingClinicalData)">
<el-link @click="view">{{ $t('trials:readingPeriod:button:view') }}</el-link>
</template>
<template v-else>
<span>{{ $t('trials:readingPeriod:table:noCD') }}</span>
</template>
</el-descriptions-item>
<!-- 当前干系人 --> <!-- 当前干系人 -->
<el-descriptions-item :label="$t('trials:readingPeriod:table:stakeholder')" :span="2"> <el-descriptions-item :label="$t('trials:readingPeriod:table:stakeholder')" :span="2">
{{ currentData.Stakeholders }} {{ currentData.Stakeholders }}
@ -290,53 +287,33 @@
</el-dialog> </el-dialog>
<!-- 设置阅片期 --> <!-- 设置阅片期 -->
<el-dialog <el-dialog v-if="readPeriodVisible" :title="$t('trials:rpManage:dialogTitle:setRP')"
v-if="readPeriodVisible" :visible.sync="readPeriodVisible" width="1400px" :close-on-click-modal="false">
:title="$t('trials:rpManage:dialogTitle:setRP')" <ReadingPeriod :trial-id="trialId" :trial-reading-criterion-id="TrialReadingCriterionId"
:visible.sync="readPeriodVisible" :is-clinical-reading="isClinicalReading" :is-global-reading="otherInfo.IsReadingPeriod"
width="1400px" @getList="getList" />
:close-on-click-modal="false"
>
<ReadingPeriod
:trial-id="trialId"
:trial-reading-criterion-id="TrialReadingCriterionId"
:is-clinical-reading="isClinicalReading"
:is-global-reading="otherInfo.IsReadingPeriod"
@getList="getList"
/>
</el-dialog> </el-dialog>
<!-- 临床资料 --> <!-- 临床资料 -->
<el-dialog <el-dialog v-if="clinicalDataVisible" :title="`${$t(
v-if="clinicalDataVisible" 'trials:readingPeriod:dialogTitle:clinicalData'
:title="`${$t('trials:readingPeriod:dialogTitle:clinicalData')}${currentData.SubjectCode}|${currentData.Name}|${currentData.CriterionName}`" )}${currentData.SubjectCode}|${currentData.Name}|${currentData.CriterionName
:visible.sync="clinicalDataVisible" }`" :visible.sync="clinicalDataVisible" :close-on-click-modal="false" append-to-body width="70%">
:close-on-click-modal="false" <ClinicalData :trial-reading-criterion-id="TrialReadingCriterionId" :trial-id="trialId"
append-to-body :data="currentData" @getList="getList" />
>
<ClinicalData :trial-reading-criterion-id="TrialReadingCriterionId" :trial-id="trialId" :data="currentData" />
</el-dialog> </el-dialog>
<!-- 添加受试者阅片期 --> <!-- 添加受试者阅片期 -->
<el-dialog <el-dialog v-if="subjectPeriod.visible" :title="subjectPeriod.title" :visible.sync="subjectPeriod.visible"
v-if="subjectPeriod.visible" width="500px" custom-class="base-dialog-wrapper" :close-on-click-modal="false">
:title="subjectPeriod.title" <SubjectPR :trial-reading-criterion-id="TrialReadingCriterionId" :trial-id="trialId" :data="param"
:visible.sync="subjectPeriod.visible" @close="subjectPeriod.visible = false" @getList="getList" />
width="500px"
custom-class="base-dialog-wrapper"
:close-on-click-modal="false"
>
<SubjectPR :trial-reading-criterion-id="TrialReadingCriterionId" :trial-id="trialId" :data="param" @close="subjectPeriod.visible = false" @getList="getList" />
</el-dialog> </el-dialog>
<!-- 编辑受试者阅片期 --> <!-- 编辑受试者阅片期 -->
<el-dialog <el-dialog v-if="subjectPeriodEdit.visible" :title="subjectPeriodEdit.title"
v-if="subjectPeriodEdit.visible" :visible.sync="subjectPeriodEdit.visible" width="500px" custom-class="base-dialog-wrapper"
:title="subjectPeriodEdit.title" :close-on-click-modal="false">
:visible.sync="subjectPeriodEdit.visible" <SubjectPR :type="'edit'" :trial-reading-criterion-id="TrialReadingCriterionId" :trial-id="trialId"
width="500px" :data="param" @close="subjectPeriodEdit.visible = false" @getList="getList" />
custom-class="base-dialog-wrapper"
:close-on-click-modal="false"
>
<SubjectPR :type="'edit'" :trial-reading-criterion-id="TrialReadingCriterionId" :trial-id="trialId" :data="param" @close="subjectPeriodEdit.visible = false" @getList="getList" />
</el-dialog> </el-dialog>
</div> </div>
</div> </div>
@ -345,8 +322,17 @@
</BaseContainer> </BaseContainer>
</template> </template>
<script> <script>
import { getReadModuleList, deleteReadModule, getReadModule, getTrialSiteSelect, getTrialCriterionList } from '@/api/trials' import {
import { getReadingPeriodList_Export, getSubjectProgress_Export } from '@/api/export' getReadModuleList,
deleteReadModule,
getReadModule,
getTrialSiteSelect,
getTrialCriterionList,
} from '@/api/trials'
import {
getReadingPeriodList_Export,
getSubjectProgress_Export,
} from '@/api/export'
import BaseContainer from '@/components/BaseContainer' import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination' import Pagination from '@/components/Pagination'
import ReadingPeriod from './components/RPList' import ReadingPeriod from './components/RPList'
@ -359,14 +345,21 @@ const searchDataDefault = () => {
ModuleType: null, ModuleType: null,
ReadingStatus: null, ReadingStatus: null,
Name: '', Name: '',
CompleteClinicalData: '',
PageIndex: 1, PageIndex: 1,
PageSize: 20 PageSize: 20,
} }
} }
const MinPlanCount = 10 const MinPlanCount = 10
export default { export default {
name: 'TrialsNotice', name: 'TrialsNotice',
components: { BaseContainer, Pagination, ReadingPeriod, ClinicalData, SubjectPR }, components: {
BaseContainer,
Pagination,
ReadingPeriod,
ClinicalData,
SubjectPR,
},
data() { data() {
return { return {
searchData: searchDataDefault(), searchData: searchDataDefault(),
@ -377,8 +370,14 @@ export default {
dialogVisible: false, dialogVisible: false,
readPeriodVisible: false, readPeriodVisible: false,
clinicalDataVisible: false, clinicalDataVisible: false,
subjectPeriod: { visible: false, title: this.$t('trials:readingPeriod:dialogTitle:addSubjectPR') }, subjectPeriod: {
subjectPeriodEdit: { visible: false, title: this.$t('trials:readingPeriod:dialogTitle:EditSubjectPR') }, visible: false,
title: this.$t('trials:readingPeriod:dialogTitle:addSubjectPR'),
},
subjectPeriodEdit: {
visible: false,
title: this.$t('trials:readingPeriod:dialogTitle:EditSubjectPR'),
},
trialId: this.$route.query.trialId, trialId: this.$route.query.trialId,
currentData: {}, currentData: {},
param: {}, param: {},
@ -387,21 +386,21 @@ export default {
otherInfo: {}, otherInfo: {},
trialCriterionList: [], trialCriterionList: [],
TrialReadingCriterionId: '0', TrialReadingCriterionId: '0',
ReadingInfoSignTime: null ReadingInfoSignTime: null,
} }
}, },
watch: { watch: {
TrialReadingCriterionId(v) { TrialReadingCriterionId(v) {
if (v) { if (v) {
this.getList() this.getList()
this.ReadingInfoSignTime = this.trialCriterionList.find(v => { this.ReadingInfoSignTime = this.trialCriterionList.find((v) => {
return v.TrialReadingCriterionId === this.TrialReadingCriterionId return v.TrialReadingCriterionId === this.TrialReadingCriterionId
}).ReadingInfoSignTime }).ReadingInfoSignTime
} }
} },
}, },
mounted() { mounted() {
this.getSite() // this.getSite()
this.getTrialCriterionList() this.getTrialCriterionList()
}, },
methods: { methods: {
@ -409,31 +408,42 @@ export default {
this.searchData.TrialId = this.$route.query.trialId this.searchData.TrialId = this.$route.query.trialId
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId
this.loading = true this.loading = true
getReadModuleList(this.searchData).then(res => { getReadModuleList(this.searchData)
this.loading = false .then((res) => {
this.list = res.Result.CurrentPageData this.loading = false
this.total = res.Result.TotalCount this.list = res.Result.CurrentPageData
this.maxLength = res.OtherInfo.MaxLength > MinPlanCount ? res.OtherInfo.MaxLength : MinPlanCount this.total = res.Result.TotalCount
this.isClinicalReading = res.OtherInfo.IsClinicalReading this.maxLength =
this.otherInfo = res.OtherInfo res.OtherInfo.MaxLength > MinPlanCount
this.$nextTick(() => { ? res.OtherInfo.MaxLength
// myTableref : MinPlanCount
if (this.$refs.myTable && this.$refs.myTable.doLayout) { this.isClinicalReading = res.OtherInfo.IsClinicalReading
this.$refs.myTable.doLayout() this.otherInfo = res.OtherInfo
} this.$nextTick(() => {
// myTableref
if (this.$refs.myTable && this.$refs.myTable.doLayout) {
this.$refs.myTable.doLayout()
}
})
})
.catch(() => {
this.loading = false
}) })
}).catch(() => { this.loading = false })
}, },
handleAdd(row, type) { handleAdd(row, type) {
this.param = {} this.param = {}
this.param.SubjectId = row.SubjectId this.param.SubjectId = row.SubjectId
this.param.SiteId = row.SiteId this.param.TrialSiteId = row.TrialSiteId
this.param.SubjectCode = row.SubjectCode this.param.SubjectCode = row.SubjectCode
this.param.TrialSiteCode = row.TrialSiteCode this.param.TrialSiteCode = row.TrialSiteCode
this.param.TrialId = this.trialId this.param.TrialId = this.trialId
this.param.IsClinicalReading = this.isClinicalReading this.param.IsClinicalReading = this.isClinicalReading
this.param.ReadingSetType = type this.param.ReadingSetType = type
this.subjectPeriod.visible = true this.subjectPeriod.visible = true
this.subjectPeriod.title =
type === 0
? this.$t('trials:readingPeriod:dialogTitle:addSubjectPR')
: this.$t('trials:readingPeriod:dialogTitle:addSubjectTumorPR')
}, },
handleEdit(row, type) { handleEdit(row, type) {
this.param = { ...type } this.param = { ...type }
@ -443,19 +453,23 @@ export default {
handleDelete(row) { handleDelete(row) {
this.$confirm(this.$t('trials:readingPeriod:message:sureToDelete'), { this.$confirm(this.$t('trials:readingPeriod:message:sureToDelete'), {
type: 'warning', type: 'warning',
distinguishCancelAndClose: true distinguishCancelAndClose: true,
}).then(() => {
this.loading = true
deleteReadModule(row.Id)
.then((res) => {
this.loading = false
if (res.IsSuccess) {
this.getList()
this.$message.success(
this.$t('common:message:deletedSuccessfully')
)
}
})
.catch(() => {
this.loading = false
})
}) })
.then(() => {
this.loading = true
deleteReadModule(row.Id)
.then(res => {
this.loading = false
if (res.IsSuccess) {
this.getList()
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})
}, },
handleReadingPeriod() { handleReadingPeriod() {
this.readPeriodVisible = true this.readPeriodVisible = true
@ -474,37 +488,46 @@ export default {
id: ReadingPlan.Id, id: ReadingPlan.Id,
TrialReadingCriterionId: this.TrialReadingCriterionId, TrialReadingCriterionId: this.TrialReadingCriterionId,
// subjectId: row.SubjectId // subjectId: row.SubjectId
subjectId: ReadingPlan.SubjectId subjectId: ReadingPlan.SubjectId,
} }
getReadModule(param).then(res => { getReadModule(param)
this.currentData = Object.assign({}, ReadingPlan) .then((res) => {
// this.currentData.SubjectId = row.SubjectId this.currentData = Object.assign({}, ReadingPlan)
// this.currentData.SiteId = row.SiteId // this.currentData.SubjectId = row.SubjectId
// this.currentData.TrialId = this.trialId // this.currentData.SiteId = row.SiteId
this.currentData.Stakeholders = res.Result.StakeholderNames.join(', ') // this.currentData.TrialId = this.trialId
this.dialogVisible = true this.currentData.Stakeholders = res.Result.StakeholderNames.join(', ')
this.loading = false this.dialogVisible = true
}).catch(() => { this.loading = false }) this.loading = false
})
.catch(() => {
this.loading = false
})
}, },
// site // site
getSite() { getSite() {
getTrialSiteSelect(this.trialId).then(res => { getTrialSiteSelect(this.trialId).then((res) => {
this.siteOptions = res.Result this.siteOptions = res.Result
}) })
}, },
handleExportSubject() { handleExportSubject() {
getSubjectProgress_Export(this.searchData).then(res => { getSubjectProgress_Export(this.searchData)
}).catch(() => {}) .then((res) => { })
.catch(() => { })
}, },
handleExportPeriod() { handleExportPeriod() {
getReadingPeriodList_Export(this.searchData).then(res => { getReadingPeriodList_Export(this.searchData)
}).catch(() => {}) .then((res) => { })
.catch(() => { })
}, },
getTrialCriterionList() { getTrialCriterionList() {
getTrialCriterionList(this.trialId, false).then(res => { getTrialCriterionList(this.trialId, false)
this.trialCriterionList = res.Result .then((res) => {
this.TrialReadingCriterionId = this.trialCriterionList[0].TrialReadingCriterionId this.trialCriterionList = res.Result
}).catch(() => {}) this.TrialReadingCriterionId =
this.trialCriterionList[0].TrialReadingCriterionId
})
.catch(() => { })
}, },
handleSearch() { handleSearch() {
this.searchData.PageIndex = 1 this.searchData.PageIndex = 1
@ -533,7 +556,11 @@ export default {
} }
}, },
cellStyle({ row, column, rowIndex, columnIndex }) { cellStyle({ row, column, rowIndex, columnIndex }) {
if (columnIndex > 2 && (row.Data.length >= columnIndex - 2) && column.property) { if (
columnIndex > 2 &&
row.Data.length >= columnIndex - 2 &&
column.property
) {
const index = column.property.substring(4) * 1 const index = column.property.substring(4) * 1
// 0 访; 1 访; 2 ; 3 ; 4 ; 5 // 0 访; 1 访; 2 ; 3 ; 4 ; 5
const type = row.Data[index].ModuleType const type = row.Data[index].ModuleType
@ -544,39 +571,62 @@ export default {
return { 'vertical-align': 'top' } return { 'vertical-align': 'top' }
} else if ((type === 0 || type === 1) && status === 1) { } else if ((type === 0 || type === 1) && status === 1) {
// 访 // 访
return { 'background-color': 'rgb(189,215,238)', 'vertical-align': 'top' } return {
'background-color': 'rgb(189,215,238)',
'vertical-align': 'top',
}
} else if ((type === 0 || type === 1) && status === 2) { } else if ((type === 0 || type === 1) && status === 2) {
// 访 // 访
return { 'background-color': 'rgb(255,217,102)', 'vertical-align': 'top' } return {
'background-color': 'rgb(255,217,102)',
'vertical-align': 'top',
}
} else if ((type === 0 || type === 1) && status === 3) { } else if ((type === 0 || type === 1) && status === 3) {
// 访 绿 // 访 绿
return { 'background-color': 'rgb(169,208,142)', 'vertical-align': 'top' } return {
'background-color': 'rgb(169,208,142)',
'vertical-align': 'top',
}
} else if ((type === 0 || type === 1) && status === 4) { } else if ((type === 0 || type === 1) && status === 4) {
// 访 绿 // 访 绿
return { 'background-color': 'rgb(169,208,142)', 'vertical-align': 'top' } return {
'background-color': 'rgb(169,208,142)',
'vertical-align': 'top',
}
} else if ((type === 0 || type === 1) && status === 5) { } else if ((type === 0 || type === 1) && status === 5) {
// 访 // 访
return { 'background-color': 'rgb(244,176,132)', 'vertical-align': 'top' } return {
'background-color': 'rgb(244,176,132)',
'vertical-align': 'top',
}
} }
} }
} },
} },
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
>>>.hidden-row{ .reading-period {
display: none; ::v-deep.search {
} padding: 0px !important;
>>>.el-dialog__body {
padding: 0px 20px;
}
>>>.el-dialog__header {
padding: 10px 20px;
} }
}
>>>.el-tag--danger.el-tag--dark { ::v-deep .hidden-row {
// background-color: #f56c6c!important; display: none;
border-color: none!important; }
// color: #fff!important;
} ::v-deep .el-dialog__body {
padding: 0px 20px;
}
::v-deep .el-dialog__header {
padding: 10px 20px;
}
::v-deep .el-tag--danger.el-tag--dark {
// background-color: #f56c6c!important;
border-color: none !important;
// color: #fff!important;
}
</style> </style>