Merge commit 'b9804432d46cc86b754e6638386437e58a01b1c8' into main
This commit is contained in:
Generated
+10
@@ -57,6 +57,7 @@
|
||||
"sortablejs": "^1.15.5",
|
||||
"streamsaver": "^2.0.6",
|
||||
"svgo": "^1.2.2",
|
||||
"unzipit": "^2.0.3",
|
||||
"v-viewer": "^1.7.4",
|
||||
"vcrontab": "^0.3.5",
|
||||
"vue": "2.7.16",
|
||||
@@ -21835,6 +21836,15 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/unzipit": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/unzipit/-/unzipit-2.0.3.tgz",
|
||||
"integrity": "sha512-e6+ftgSQRj9Hwf2mIWFwYIGqBoKV7AziG/d7pep2Uv3NCzHbhLO5d9dGRwpahVlnpQ7aQC+5kWk72dnWocdYyA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/unzipper": {
|
||||
"version": "0.10.14",
|
||||
"resolved": "https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz",
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
"sortablejs": "^1.15.5",
|
||||
"streamsaver": "^2.0.6",
|
||||
"svgo": "^1.2.2",
|
||||
"unzipit": "^2.0.3",
|
||||
"v-viewer": "^1.7.4",
|
||||
"vcrontab": "^0.3.5",
|
||||
"vue": "2.7.16",
|
||||
|
||||
@@ -316,3 +316,30 @@ export function GetReadingMedicineSystemQuestionList_Export(data) {
|
||||
data
|
||||
})
|
||||
}
|
||||
// 导出中心调研
|
||||
export function getTrialSiteSurveyList_Export(data) {
|
||||
return requestDownload({
|
||||
url: `/ExcelExport/getTrialSiteSurveyList_Export`,
|
||||
responseType: 'blob',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
// 导出中心设备
|
||||
export function getSiteSurveyEquipmentList_Export(data) {
|
||||
return requestDownload({
|
||||
url: `/ExcelExport/getSiteSurveyEquipmentList_Export`,
|
||||
responseType: 'blob',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
// 导出中心调研基本信息
|
||||
export function getSiteSurveyInfoList_Export(data) {
|
||||
return requestDownload({
|
||||
url: `/ExcelExport/getSiteSurveyInfoList_Export`,
|
||||
responseType: 'blob',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
+16
-1
@@ -213,6 +213,14 @@ export function getIVUSTemplate(param) {
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function getIVUSTemplatesZip(param) {
|
||||
return requestDownload({
|
||||
url: '/IVUSCalculate/getIVUSTemplatesZip',
|
||||
method: 'post',
|
||||
responseType: 'blob',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function uploadIVUSTemplate(param) {
|
||||
return request({
|
||||
url: `/IVUSCalculate/uploadIVUSTemplate`,
|
||||
@@ -229,7 +237,14 @@ export function getOCTFCTTemplate(param) {
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getOCTFCTTemplatesZip(param) {
|
||||
return requestDownload({
|
||||
url: '/OCTCalculate/getOCTFCTTemplatesZip',
|
||||
method: 'post',
|
||||
responseType: 'blob',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function uploadOCTFCTTemplate(param) {
|
||||
return request({
|
||||
url: `/OCTCalculate/uploadOCTFCTTemplate`,
|
||||
|
||||
@@ -129,3 +129,31 @@ export function getUserTypeList(userTypeEnum) {
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function getSiteSurveyLogList(param) {
|
||||
return request({
|
||||
url: `/TrialSiteSurvey/getSiteSurveyLogList`,
|
||||
method: 'post',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function getTrialIsSPMJoin(trialId) {
|
||||
return request({
|
||||
url: `/TrialSiteSurvey/getTrialIsSPMJoin?trialId=${trialId}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
export function getSiteSurveyEquipmentList(param) {
|
||||
return request({
|
||||
url: `/TrialSiteSurvey/getSiteSurveyEquipmentList`,
|
||||
method: 'post',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function getSiteSurveyInfoList(param) {
|
||||
return request({
|
||||
url: `/TrialSiteSurvey/getSiteSurveyInfoList`,
|
||||
method: 'post',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
@@ -488,3 +488,67 @@ export function setRandomTaskOrder(data) {
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function getJudgeForm(data) {
|
||||
return request({
|
||||
url: `/ReadingImageTask/getJudgeForm`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function setJudgeForm(data) {
|
||||
return request({
|
||||
url: `/ReadingImageTask/setJudgeForm`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function getSingleVisitJudgeAnswer(data) {
|
||||
return request({
|
||||
url: `/ReadingImageTask/getSingleVisitJudgeAnswer`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function submitJudgeForm(data) {
|
||||
return request({
|
||||
url: `/Inspection/ReadingImageTask/SubmitJudgeForm`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function getTrialQuestionVisitJudgeRule(data) {
|
||||
return request({
|
||||
url: `/ReadingQuestion/getTrialQuestionVisitJudgeRule`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function setTrialQuestionVisitJudgeRule(data) {
|
||||
return request({
|
||||
url: `/ReadingQuestion/setTrialQuestionVisitJudgeRule`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function copyTrialQuestionVisitJudgeRule(data) {
|
||||
return request({
|
||||
url: `/ReadingQuestion/copyTrialQuestionVisitJudgeRule`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function applyBaseLineTrialQuestionVisitJudgeRule(data) {
|
||||
return request({
|
||||
url: `/ReadingQuestion/applyBaseLineTrialQuestionVisitJudgeRule`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
@@ -94,6 +94,14 @@ export function getTrialJudgyInfo(params) {
|
||||
data: params
|
||||
})
|
||||
}
|
||||
|
||||
export function setTrialJudgeRuleInfo(params) {
|
||||
return request({
|
||||
url: `/ReadingQuestion/setTrialJudgeRuleInfo`,
|
||||
method: 'post',
|
||||
data: params
|
||||
})
|
||||
}
|
||||
// 获取检查部位列表
|
||||
export function getTrialBodyPartList(params) {
|
||||
return request({
|
||||
|
||||
@@ -336,6 +336,14 @@ export default {
|
||||
if (data.StudyList && data.StudyList.length > 0) {
|
||||
let StudyList = data.StudyList
|
||||
StudyList.forEach((study) => {
|
||||
let arr = []
|
||||
study.SeriesList.forEach(item => {
|
||||
if (!arr.includes(item.Modality)) {
|
||||
arr.push(item.Modality)
|
||||
}
|
||||
})
|
||||
let str = arr.join('_')
|
||||
let time = study.StudyTime.split(' ')[0]
|
||||
if (study.StudyDIRPath) {
|
||||
let obj = {
|
||||
name: `${data.SubjectCode}/${data.TaskBlindName
|
||||
@@ -347,7 +355,7 @@ export default {
|
||||
obj = {
|
||||
name: `${data.SubjectCode}/${data.VisitName
|
||||
}/${this.$fd('IsDicom', true)}/${study.StudyCode
|
||||
}/DICOMDIR`,
|
||||
}_${time}_${str}/DICOMDIR`,
|
||||
url: this.OSSclientConfig.basePath + study.StudyDIRPath,
|
||||
}
|
||||
} else if (this.IsReadingTaskViewInOrder === 0) {
|
||||
@@ -380,7 +388,7 @@ export default {
|
||||
obj = {
|
||||
name: `${data.SubjectCode}/${data.VisitName
|
||||
}/${this.$fd('IsDicom', true)}/${study.StudyCode
|
||||
}/IMAGE/${fileName}`,
|
||||
}_${time}_${str}/IMAGE/${fileName}`,
|
||||
url: this.OSSclientConfig.basePath + instance.Path,
|
||||
IsEncapsulated: instance.IsEncapsulated
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
:append-to-body="true" class="uploadDicomAndNonedicom">
|
||||
<span slot="title">{{ title }}</span>
|
||||
<el-tabs type="border-card" v-model="activeName">
|
||||
<el-tab-pane :label="$t('uploadDicomAndNonedicom:label:dicom')" name="dicom">
|
||||
<el-tab-pane :label="$t('uploadDicomAndNonedicom:label:dicom')" name="dicom" v-if="!IsImageSegment">
|
||||
<dicomFile v-if="activeName === 'dicom'" :SubjectId="SubjectId" :SubjectCode="SubjectCode"
|
||||
:Criterion="Criterion" :TaskId="VisitTaskId" :isUpload.sync="isUpload"
|
||||
:isReadingTaskViewInOrder="isReadingTaskViewInOrder" :IsImageSegment="IsImageSegment" :forbid="forbid"
|
||||
@@ -72,10 +72,16 @@ export default {
|
||||
isUpload: false,
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
IsImageSegment() {
|
||||
if (this.IsImageSegment) this.activeName = 'nonedicom'
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.title = `Upload Images:${this.SubjectCode}(${this.Criterion.TrialReadingCriterionName})`
|
||||
if (this.IsImageSegment) this.title = `Upload Images:${this.SubjectCode}`
|
||||
if (this.isReadingTaskViewInOrder === 0) this.title = ''
|
||||
if (this.IsImageSegment) this.activeName = 'nonedicom'
|
||||
store.dispatch('trials/setUnLock', true)
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -112,6 +112,8 @@
|
||||
<!--上传--->
|
||||
<el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')" v-if="!forbid"
|
||||
@click.native.prevent="handleUpload(scope.row)" :disabled="isReading && !isDownloaded" />
|
||||
<!-- <el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')"
|
||||
@click.native.prevent="handleUpload(scope.row)" /> -->
|
||||
<!--删除--->
|
||||
<el-button :disabled="scope.row.UploadedFileCount <= 0 ||
|
||||
scope.row.ReadingTaskState === 2
|
||||
@@ -224,6 +226,7 @@ import {
|
||||
import { preArchiveStudy, uploadNoneDicomFile } from '@/api/trials'
|
||||
import store from '@/store'
|
||||
import { getToken } from '@/utils/auth'
|
||||
import { unzipRaw } from 'unzipit';
|
||||
let defaultSearchData = () => {
|
||||
return {
|
||||
SubjectId: null,
|
||||
@@ -332,6 +335,34 @@ export default {
|
||||
store.dispatch('trials/setUnLock', false)
|
||||
},
|
||||
methods: {
|
||||
async readZipFileListRaw(zipFile) {
|
||||
try {
|
||||
// 1. 使用 unzipRaw 读取原始条目列表
|
||||
const { entries } = await unzipRaw(zipFile);
|
||||
|
||||
// 2. entries 是一个数组,需要手动处理
|
||||
const fileList = entries.map(entry => {
|
||||
// 3. 使用 TextDecoder 指定编码来解码文件名
|
||||
// 例如,对于简体中文 ZIP 包,可以使用 'gbk'
|
||||
const decoder = new TextDecoder('gbk'); // 或者 'big5'
|
||||
const name = decoder.decode(entry.nameBytes);
|
||||
|
||||
return {
|
||||
path: name,
|
||||
name: name.split('/').pop(),
|
||||
isDirectory: entry.isDirectory,
|
||||
size: entry.size,
|
||||
lastModified: entry.lastModDate
|
||||
};
|
||||
});
|
||||
|
||||
console.log('解码后的文件列表:', fileList);
|
||||
return fileList;
|
||||
} catch (error) {
|
||||
console.error('读取 ZIP 失败:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
async getList() {
|
||||
try {
|
||||
this.searchData.SubjectId = this.SubjectId
|
||||
@@ -368,13 +399,17 @@ export default {
|
||||
}
|
||||
},
|
||||
// 扫描待上传文件
|
||||
beginScanFiles(e) {
|
||||
async beginScanFiles(e) {
|
||||
var files = [...e.target.files]
|
||||
var sameFiles = []
|
||||
var sameFiles = [], zipFiles = [], f = false
|
||||
files.forEach((file) => {
|
||||
var extendName = file.name
|
||||
.substring(file.name.lastIndexOf('.'))
|
||||
.toLocaleLowerCase()
|
||||
if (extendName === '.zip' && this.IsImageSegment) {
|
||||
if (file.name.indexOf(this.$t("trials:uploadNonDicoms:checkValue:SelectionPeriod")) > -1 || file.name.indexOf("trials:uploadNonDicoms:checkValue:researchOver") > -1) f = true
|
||||
zipFiles.push(file)
|
||||
}
|
||||
if (
|
||||
this.faccept.indexOf(extendName) !== -1 &&
|
||||
this.fileList.findIndex((v) => v.name === file.name) > -1
|
||||
@@ -382,6 +417,18 @@ export default {
|
||||
sameFiles.push(file.name)
|
||||
}
|
||||
})
|
||||
if (zipFiles.length > 0) {
|
||||
for (let i = 0; i < zipFiles.length; i++) {
|
||||
let file = zipFiles[i]
|
||||
let list = await this.readZipFileListRaw(file)
|
||||
if (!f) f = list.some(i => i.path.indexOf(this.$t("trials:uploadNonDicoms:checkValue:SelectionPeriod")) > -1 || i.path.indexOf(this.$t("trials:uploadNonDicoms:checkValue:researchOver")) > -1)
|
||||
list = null
|
||||
if (f) break
|
||||
}
|
||||
}
|
||||
if (f) return this.$confirm(this.$t("trials:uploadNonDicoms:confirm:zipNameNonCompliant"), '', {
|
||||
type: "warning"
|
||||
})
|
||||
var scope = this
|
||||
if (sameFiles.length > 0) {
|
||||
const h = this.$createElement
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1787639576282" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5836" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M511.974687 0.000434A511.992298 511.992298 0 1 1 0.00047 511.992732 511.30523 511.30523 0 0 1 511.974687 0.000434z m93.350858 188.979888l-87.366133 153.053459-295.168071 0.090404c-28.567568 0-51.728995 19.147503-51.728995 42.760949s23.161427 42.760949 51.728995 42.760948h246.331994l-93.911361 164.643213h-152.420633c-28.567568 0-51.728995 19.147503-51.728995 42.760949s23.125266 42.79711 51.728995 42.79711h103.584556l-39.416012 69.19499a34.498051 34.498051 0 1 0 59.919571 34.172597l58.852806-103.385668h395.027995c28.567568 0 51.728995-19.147503 51.728995-42.760948s-23.161427-42.760949-51.728995-42.760949H454.58642l93.983684-164.661294h252.190153c28.567568 0 51.728995-19.147503 51.728995-42.760948s-23.161427-42.760949-51.728995-42.760949l-203.372157-0.090404 67.893176-118.862781a34.485394 34.485394 0 1 0-59.901489-34.190678z" fill="#1296db" p-id="5837"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -228,6 +228,12 @@ export const constantRoutes = [
|
||||
component: () => import('@/views/research/form'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/researchLog',
|
||||
name: 'researchLog',
|
||||
component: () => import('@/views/research/form'),
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: '/researchLogin_m',
|
||||
name: 'researchLogin_m',
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
const WHITELIST = ['/', "/curriculumVitae", 'researchDetail_m', '/researchForm', '/ReviewersResearch', '/login', '/link_expired', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms', '/ecrfList']
|
||||
const WHITELIST = ['/', "/curriculumVitae", 'researchDetail_m', '/researchForm', '/ReviewersResearch', '/login', '/link_expired', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms', '/ecrfList', '/researchLog']
|
||||
export default WHITELIST
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
<template>
|
||||
<div class="log-list">
|
||||
<el-table v-loading="loading" :data="tableData" v-adaptive="{ bottomOffset: 40 }" height="100" style="width: 100%">
|
||||
<el-table-column prop="CreateTime" :label="$t('trials:researchForm:logList:label:CreateTime')" min-width="120"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.CreateTime ? moment(scope.row.CreateTime).format('YYYY-MM-DD HH:mm:ss') : '' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="Name" :label="$t('trials:researchForm:logList:label:Name')" min-width="100"
|
||||
show-overflow-tooltip>
|
||||
</el-table-column>
|
||||
<el-table-column prop="UserType" :label="$t('trials:researchForm:logList:label:UserType')" min-width="100"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.UserType && $fd('UserType', scope.row.UserType) ? $fd('UserType', scope.row.UserType) : '--' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="OptType" :label="$t('trials:researchForm:logList:label:OptType')" min-width="100"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('SiteSurveyOptTyp', scope.row.OptType) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="Json" :label="$t('trials:researchForm:logList:label:Json')" min-width="100"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-button v-if="scope.row.Json" type="text" @click="openLog(scope.row)">{{
|
||||
$t('trials:researchForm:logList:label:SurveyForm') }}</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="Reason" :label="$t('trials:researchForm:logList:label:Reason')" min-width="140"
|
||||
show-overflow-tooltip>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { getSiteSurveyLogList } from '@/api/research'
|
||||
import moment from 'moment'
|
||||
import { getToken } from '@/utils/auth'
|
||||
export default {
|
||||
name: 'LogList',
|
||||
props: {
|
||||
trialSiteSurveyId: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
tableData: [],
|
||||
moment,
|
||||
openWindow: null
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
async getList() {
|
||||
try {
|
||||
this.loading = true
|
||||
let res = await getSiteSurveyLogList({ trialSiteSurveyId: this.trialSiteSurveyId })
|
||||
if (res.IsSuccess) {
|
||||
this.tableData = res.Result
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
openLog(row) {
|
||||
if (this.openWindow) {
|
||||
this.openWindow.close()
|
||||
}
|
||||
var token = getToken()
|
||||
var path = `/researchLog?trialId=${this.$route.query.trialId}&trialSiteSurveyId=${this.trialSiteSurveyId}&logId=${row.Id}&TokenKey=${token}`
|
||||
|
||||
this.openWindow = window.open(path, '_blank')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.log-list {
|
||||
height: 100%;
|
||||
min-height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
+129
-7
@@ -35,6 +35,10 @@
|
||||
<el-button v-if="userTypeEnumInt === 0" type="primary" size="small" @click="handleHistory">
|
||||
{{ $t('trials:researchForm:button:historicalRecord') }}
|
||||
</el-button>
|
||||
<!-- 操作日志 -->
|
||||
<el-button type="primary" size="small" v-if="!isLog" @click="viewLog">
|
||||
{{ $t('trials:researchForm:button:log') }}
|
||||
</el-button>
|
||||
<!-- 退出 -->
|
||||
<el-button v-if="userTypeEnumInt === 0" type="primary" size="small" @click="handleBack">
|
||||
{{ $t('trials:researchForm:button:loginOut') }}
|
||||
@@ -133,16 +137,37 @@
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
<div style="height:100%;margin:0;">
|
||||
<div class="history-dialog-content">
|
||||
<HistoricalRecord :trial-id="trialId" :site-id="siteId" :trial-site-survey-id="trialSiteSurveyId" />
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog v-if="logVisible" :visible.sync="logVisible"
|
||||
:custom-class="isFullscreen ? 'full-log-dialog-container' : 'log-dialog-container'" :close-on-click-modal="false"
|
||||
:fullscreen="isFullscreen" :show-close="false" width="60%" append-to-body>
|
||||
<span slot="title" class="dialog-footer">
|
||||
<div style="display: flex;flex-direction: row;justify-content: space-between;">
|
||||
<div>
|
||||
{{ $t('trials:researchForm:button:log') }}
|
||||
</div>
|
||||
<div>
|
||||
<svg-icon :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'"
|
||||
style="vertical-align: baseline;cursor: pointer;font-size: 20px;" @click="toggleLogFullscreen" />
|
||||
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;"
|
||||
@click="logVisible = false" />
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
<div class="log-dialog-content">
|
||||
<LogList :trial-site-survey-id="trialSiteSurveyId" />
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { getSiteSurveyInfo, trialSurveySubmit, submissionRejection } from '@/api/research'
|
||||
import { getQueryString } from '@/utils/history.js'
|
||||
import { getSiteSurveyInfo, trialSurveySubmit, submissionRejection, getSiteSurveyLogList } from '@/api/research'
|
||||
import { getQueryString, changeURLStatic } from '@/utils/history.js'
|
||||
import BaseInfo from './components/BaseInfo'
|
||||
import HistoricalParticipant from './components/HistoricalParticipant'
|
||||
import ParticipantList from './components/ParticipantList'
|
||||
@@ -150,9 +175,11 @@ import EquipmentList from './components/EquipmentList'
|
||||
import { mapMutations } from 'vuex'
|
||||
import TopLang from './topLang'
|
||||
import HistoricalRecord from './components/HistoricalRecord'
|
||||
import LogList from './components/LogList'
|
||||
import store from '@/store'
|
||||
export default {
|
||||
name: 'QuestionForm',
|
||||
components: { BaseInfo, HistoricalParticipant, ParticipantList, EquipmentList, TopLang, HistoricalRecord },
|
||||
components: { BaseInfo, HistoricalParticipant, ParticipantList, EquipmentList, TopLang, HistoricalRecord, LogList },
|
||||
props: {
|
||||
isPreview: {
|
||||
type: Boolean,
|
||||
@@ -175,7 +202,10 @@ export default {
|
||||
historyVisible: false,
|
||||
siteSurveyNoteInfo: {},
|
||||
IsSupportUploadFile: false,
|
||||
IsOnlyUploadFile: false
|
||||
IsOnlyUploadFile: false,
|
||||
logVisible: false,
|
||||
isLog: false,
|
||||
logId: null
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@@ -191,6 +221,12 @@ export default {
|
||||
this.setLanguage(lang)
|
||||
this.$updateDictionary()
|
||||
this.trialSiteSurveyId = getQueryString('trialSiteSurveyId')
|
||||
this.logId = getQueryString('logId')
|
||||
if (this.logId) this.isLog = true
|
||||
if (this.$router.currentRoute.query.TokenKey) {
|
||||
store.dispatch('user/setToken', this.$router.currentRoute.query.TokenKey)
|
||||
changeURLStatic('TokenKey', '')
|
||||
}
|
||||
this.initPage()
|
||||
if (zzSessionStorage.getItem('userTypeEnumInt')) {
|
||||
this.userTypeEnumInt = zzSessionStorage.getItem('userTypeEnumInt') * 1
|
||||
@@ -198,7 +234,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
isPM() {
|
||||
return this.hasPermi(['role:pm', 'role:spm', 'role:cpm', 'role:apm']) && this.state !== 3
|
||||
return this.hasPermi(['role:pm', 'role:spm', 'role:cpm', 'role:apm']) && this.state !== 3 && this.IsOnlyUploadFile
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -206,6 +242,43 @@ export default {
|
||||
// 初始化页面
|
||||
initPage() {
|
||||
this.loading = true
|
||||
if (this.isLog) {
|
||||
getSiteSurveyLogList({ trialSiteSurveyId: this.trialSiteSurveyId, Id: this.logId }).then(r => {
|
||||
if (r.Result && r.Result[0].Json) {
|
||||
let res = {
|
||||
Result: JSON.parse(r.Result[0].Json)
|
||||
}
|
||||
if (res.Result) {
|
||||
// this.trialSiteSurveyEquipmentType = res.Result.TrialInfo.TrialSiteSurveyEquipmentType
|
||||
// this.trialSiteSurveyUserRoles = res.Result.TrialInfo.TrialSiteSurveyUserRoles
|
||||
if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) {
|
||||
this.siteSurveyNoteInfo = res.Result.SiteSurveyFiledConfig.ModifyFiledList.find(i => i.NeedModifyFiled === 'SiteSurveyNote')
|
||||
}
|
||||
this.IsSupportUploadFile = res.Result.SiteSurveyFiledConfig.IsSupportUploadFile
|
||||
this.IsOnlyUploadFile = res.Result.SiteSurveyFiledConfig.IsOnlyUploadFile
|
||||
this.siteSurveyNoteInfo.IsCloseEquipmentSurvey = res.Result.SiteSurveyFiledConfig.IsCloseEquipmentSurvey
|
||||
this.state = 3
|
||||
this.siteId = res.Result.TrialSiteSurvey.TrialSiteId
|
||||
this.$refs['baseResearchInfo'].initForm(res.Result.TrialInfo, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig ? res.Result.SiteSurveyFiledConfig.NotShowFieldList : null)
|
||||
var historicalArr = []
|
||||
var newArr = []
|
||||
res.Result.TrialSiteUserSurveyList.map(i => {
|
||||
if (i.IsHistoryUser) {
|
||||
historicalArr.push(i)
|
||||
} else {
|
||||
newArr.push(i)
|
||||
}
|
||||
})
|
||||
|
||||
this.$refs['historicalParticipant'].initList(historicalArr, res.Result.TrialSiteSurvey)
|
||||
this.$refs['researchParticipants'].initList(newArr, res.Result.TrialSiteSurvey)
|
||||
this.$refs['researchEquipments'].initList(res.Result.TrialSiteEquipmentSurveyList, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig.EquipmentControlFieldList)
|
||||
this.isExistIncorrect = res.Result.TrialSiteUserSurveyList.every(item => item.IsCorrect === false)
|
||||
}
|
||||
this.loading = false
|
||||
}
|
||||
}).catch((err) => { console.log(err); this.loading = false })
|
||||
} else {
|
||||
getSiteSurveyInfo(this.trialId, this.trialSiteSurveyId).then(res => {
|
||||
if (res.Result) {
|
||||
// this.trialSiteSurveyEquipmentType = res.Result.TrialInfo.TrialSiteSurveyEquipmentType
|
||||
@@ -236,6 +309,8 @@ export default {
|
||||
}
|
||||
this.loading = false
|
||||
}).catch(() => { this.loading = false })
|
||||
}
|
||||
|
||||
},
|
||||
// 提交
|
||||
handleSubmit(type) {
|
||||
@@ -347,7 +422,14 @@ export default {
|
||||
handleHistory() {
|
||||
this.isFullscreen = false
|
||||
this.historyVisible = true
|
||||
}
|
||||
},
|
||||
toggleLogFullscreen() {
|
||||
this.isFullscreen = !this.isFullscreen
|
||||
},
|
||||
viewLog() {
|
||||
this.isFullscreen = false
|
||||
this.logVisible = true
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -399,5 +481,45 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
.history-dialog-content,
|
||||
.log-dialog-content {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.log-dialog-content {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
<style lang="scss">
|
||||
.full-log-dialog-container,
|
||||
.log-dialog-container {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.full-log-dialog-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.full-log-dialog-container .el-dialog__body {
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
padding: 10px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.log-dialog-container .el-dialog__body {
|
||||
height: calc(100% - 80px);
|
||||
padding: 10px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.full-log-dialog-container .log-dialog-content,
|
||||
.log-dialog-container .log-dialog-content {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,311 @@
|
||||
<template>
|
||||
<BaseContainer>
|
||||
<!-- 搜索框 -->
|
||||
<template slot="search-container">
|
||||
<el-form :inline="true">
|
||||
<!-- 中心编号 -->
|
||||
<el-form-item :label="$t('trials:researchStaff: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>
|
||||
</el-form-item>
|
||||
<!-- 中心名称 -->
|
||||
<el-form-item :label="$t('trials:researchStaff:table:siteName')">
|
||||
<el-input v-model="searchData.TrialSiteName" class="mr" clearable style="width:120px;" />
|
||||
</el-form-item>
|
||||
<!-- 状态 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:status')">
|
||||
<el-select v-model="searchData.State" clearable filterable style="width: 120px">
|
||||
<el-option v-for="(item, index) of $d.ResearchRecord" :key="index" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 是否废除 -->
|
||||
<!-- <el-form-item :label="$t('trials:researchRecord:table:isDeleted')">
|
||||
<el-select v-model="searchData.IsDeleted" clearable filterable style="width: 120px">
|
||||
<el-option v-for="item of $d.YesOrNo" v-show="item.raw.ValueCN !== '无'" :key="`IsDeleted${item.value}`"
|
||||
:label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item>
|
||||
<!-- 查询 -->
|
||||
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
|
||||
{{ $t('common:button:search') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<!-- 重置 -->
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
|
||||
{{ $t('common:button:reset') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<!-- 导出 -->
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-download" :disabled="list.length === 0" @click="handleExport">
|
||||
{{ $t('common:button:export') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<template slot="main-container">
|
||||
<el-table ref="equipmentsList" v-loading="loading" v-adaptive="{ bottomOffset: 55 }" :data="list" stripe
|
||||
height="100" @sort-change="handleSortByColumn">
|
||||
<el-table-column type="index" width="50" />
|
||||
<!-- 中心编号 -->
|
||||
<el-table-column prop="TrialSiteCode" :label="$t('trials:researchStaff:table:siteId')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100">
|
||||
</el-table-column>
|
||||
<!-- 中心名称 -->
|
||||
<el-table-column prop="TrialSiteName" :label="$t('trials:researchStaff:table:siteName')" show-overflow-tooltip
|
||||
sortable="custom" min-width="120">
|
||||
</el-table-column>
|
||||
<!-- 状态 -->
|
||||
<el-table-column prop="State" :label="$t('trials:researchRecord:table:status')" min-width="150"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.State === 0" type="primary">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 1" type="info">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 2" type="warning">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 3" type="danger">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 是否废除 -->
|
||||
<!-- <el-table-column prop="IsDeleted" :label="$t('trials:researchRecord:table:isDeleted')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.IsDeleted" type="danger">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
<el-tag v-else type="primary">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<!-- 联系人 -->
|
||||
<el-table-column prop="UserName" :label="$t('trials:researchForm:form:contactor')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<!-- 联系电话 -->
|
||||
<el-table-column prop="Phone" :label="$t('trials:researchForm:form:contactorPhone')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<!-- 联系邮箱 -->
|
||||
<el-table-column prop="Email" :label="$t('trials:researchForm:form:contactorEmail')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<template v-if="equipmentControlFieldList.includes('EquipmentTypeEnum')">
|
||||
<!-- 扫描设备 -->
|
||||
<el-table-column prop="EquipmentTypeEnum" :label="$t('trials:equiptResearch:form:equipment')" min-width="120"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.OtherEquipmentType ? scope.row.OtherEquipmentType :
|
||||
$fd('SiteSurvey_ScanEquipmentType', scope.row.EquipmentTypeEnum) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template v-if="equipmentControlFieldList.includes('Parameters')">
|
||||
<!-- 扫描参数 -->
|
||||
<el-table-column prop="Parameters" :label="$t('trials:equiptResearch:form:param')" min-width="100"
|
||||
show-overflow-tooltip />
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('ManufacturerType')">
|
||||
<!-- 扫描仪器制造商名称 -->
|
||||
<el-table-column min-width="120" prop="ManufacturerType"
|
||||
:label="$t('trials:equiptResearch:form:manufacturer')" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.ManufacturerName ? scope.row.ManufacturerName : $fd('ManufacturerType',
|
||||
scope.row.ManufacturerType) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('ScannerType')">
|
||||
<!-- 扫描仪型号 -->
|
||||
<el-table-column min-width="120" prop="ScannerType" :label="$t('trials:equiptResearch:form:model')"
|
||||
show-overflow-tooltip />
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('MagneticFieldStrengthType')">
|
||||
<!-- 磁场强度 -->
|
||||
<el-table-column min-width="120" prop="MagneticFieldStrengthType"
|
||||
:label="$t('trials:equiptResearch:form:MagneticFieldStrengthType')" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('MagneticFieldStrengthType', scope.row.MagneticFieldStrengthType) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('BodyCoilChannelCount')">
|
||||
<!-- 体部线圈通道数 -->
|
||||
<el-table-column min-width="120" prop="BodyCoilChannelCount"
|
||||
:label="$t('trials:equiptResearch:form:BodyCoilChannelCount')" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('BodyCoilChannelCount', scope.row.BodyCoilChannelCount) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('HasDedicatedPdfFatQuantificationSequence')">
|
||||
<!-- 是否具备专用的PDFF脂肪定量序列(CSE-MRI序列) -->
|
||||
<el-table-column min-width="120" prop="HasDedicatedPdfFatQuantificationSequence"
|
||||
:label="$t('trials:equiptResearch:form:HasDedicatedPdfFatQuantificationSequence')" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('YesOrNo', scope.row.HasDedicatedPdfFatQuantificationSequence) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('PdfFatQuantificationSequenceType')">
|
||||
<!-- 专用的PDFF脂肪定量序列类型 -->
|
||||
<el-table-column min-width="120" prop="PdfFatQuantificationSequenceType"
|
||||
:label="$t('trials:equiptResearch:form:PdfFatQuantificationSequenceType')" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.OtherSequenceSpecification ? scope.row.OtherSequenceSpecification :
|
||||
$fd('PdfFatQuantificationSequenceType', scope.row.PdfFatQuantificationSequenceType) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('HasT2R2Correction')">
|
||||
<!-- 是否包含 T2/R2 校正(用于铁沉积校正) -->
|
||||
<el-table-column min-width="120" prop="HasT2R2Correction"
|
||||
:label="$t('trials:equiptResearch:form:HasT2R2Correction')" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('YesOrNo', scope.row.HasT2R2Correction) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('CanFullyExportPdfParameterMapsAndRawDicom')">
|
||||
<!-- 是否可完整导出 PDFF 参数图及全部原始 DICOM 数据 -->
|
||||
<el-table-column prop="CanFullyExportPdfParameterMapsAndRawDicom"
|
||||
:label="$t('trials:equiptResearch:form:CanFullyExportPdfParameterMapsAndRawDicom')" min-width="120"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('YesOrNo', scope.row.CanFullyExportPdfParameterMapsAndRawDicom) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
|
||||
<template v-if="equipmentControlFieldList.includes('Note')">
|
||||
<!-- 备注 -->
|
||||
<el-table-column min-width="120" prop="Note" :label="$t('trials:equiptResearch:form:remark')"
|
||||
show-overflow-tooltip />
|
||||
</template>
|
||||
|
||||
</el-table>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
|
||||
@pagination="getList" />
|
||||
</template>
|
||||
</BaseContainer>
|
||||
</template>
|
||||
<script>
|
||||
import { getTrialSiteSelect } from '@/api/trials'
|
||||
import { getSiteSurveyEquipmentList } from '@/api/research'
|
||||
import BaseContainer from '@/components/BaseContainer'
|
||||
import Pagination from '@/components/Pagination'
|
||||
import { getSiteSurveyEquipmentList_Export } from '@/api/export'
|
||||
const searchDataDefault = () => {
|
||||
return {
|
||||
SortField: '',
|
||||
State: "",
|
||||
Asc: true,
|
||||
PageIndex: 1,
|
||||
PageSize: 20,
|
||||
TrialId: '',
|
||||
TrialSiteId: '',
|
||||
TrialSiteName: ''
|
||||
}
|
||||
}
|
||||
export default {
|
||||
name: 'Equipments',
|
||||
components: { BaseContainer, Pagination },
|
||||
data() {
|
||||
return {
|
||||
searchData: searchDataDefault(),
|
||||
loading: false,
|
||||
list: [],
|
||||
total: 0,
|
||||
trialId: '',
|
||||
otherInfo: {},
|
||||
siteOptions: [],
|
||||
equipmentControlFieldList: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.trialId = this.$route.query.trialId
|
||||
this.getList()
|
||||
this.getSite()
|
||||
},
|
||||
methods: {
|
||||
async handleExport() {
|
||||
await getSiteSurveyEquipmentList_Export(this.searchData)
|
||||
},
|
||||
async getList() {
|
||||
try {
|
||||
this.loading = true
|
||||
this.searchData.TrialId = this.trialId
|
||||
let res = await getSiteSurveyEquipmentList(this.searchData)
|
||||
if (res.IsSuccess) {
|
||||
this.list = res.Result.CurrentPageData
|
||||
this.total = res.Result.TotalCount
|
||||
this.otherInfo = res.OtherInfo
|
||||
const { EquipmentControlFieldList } = res.OtherInfo
|
||||
this.equipmentControlFieldList = []
|
||||
EquipmentControlFieldList.forEach(item => {
|
||||
this.equipmentControlFieldList.push(item.FiledName)
|
||||
})
|
||||
this.$nextTick(() => {
|
||||
this.$refs.equipmentsList.doLayout()
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
// 获取site下拉框数据
|
||||
async getSite() {
|
||||
try {
|
||||
let res = await getTrialSiteSelect(this.trialId)
|
||||
this.siteOptions = res.Result
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
// 重置
|
||||
handleReset() {
|
||||
this.searchData = searchDataDefault()
|
||||
this.getList()
|
||||
this.$nextTick(() => {
|
||||
this.$refs.list.clearSort()
|
||||
})
|
||||
},
|
||||
// 查询
|
||||
handleSearch() {
|
||||
this.getList()
|
||||
},
|
||||
// 排序
|
||||
handleSortByColumn(column) {
|
||||
if (column.order === 'ascending') {
|
||||
this.searchData.Asc = true
|
||||
} else {
|
||||
this.searchData.Asc = false
|
||||
}
|
||||
this.searchData.SortField = column.prop
|
||||
this.getList()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,356 @@
|
||||
<template>
|
||||
<BaseContainer>
|
||||
<!-- 搜索框 -->
|
||||
<template slot="search-container">
|
||||
<el-form :inline="true">
|
||||
<!-- 中心编号 -->
|
||||
<el-form-item :label="$t('trials:researchStaff: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>
|
||||
</el-form-item>
|
||||
<!-- 中心名称 -->
|
||||
<el-form-item :label="$t('trials:researchStaff:table:siteName')">
|
||||
<el-input v-model="searchData.TrialSiteName" class="mr" clearable style="width:120px;" />
|
||||
</el-form-item>
|
||||
<!-- 状态 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:status')">
|
||||
<el-select v-model="searchData.State" clearable filterable style="width: 120px">
|
||||
<el-option v-for="(item, index) of $d.ResearchRecord" :key="index" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 是否废除 -->
|
||||
<!-- <el-form-item :label="$t('trials:researchRecord:table:isDeleted')">
|
||||
<el-select v-model="searchData.IsDeleted" clearable filterable style="width: 120px">
|
||||
<el-option v-for="item of $d.YesOrNo" v-show="item.raw.ValueCN !== '无'" :key="`IsDeleted${item.value}`"
|
||||
:label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item>
|
||||
<!-- 查询 -->
|
||||
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
|
||||
{{ $t('common:button:search') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<!-- 重置 -->
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
|
||||
{{ $t('common:button:reset') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<!-- 导出 -->
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-download" :disabled="list.length === 0" @click="handleExport">
|
||||
{{ $t('common:button:export') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<template slot="main-container">
|
||||
<el-table ref="questionsList" v-loading="loading" v-adaptive="{ bottomOffset: 55 }" :data="list" stripe
|
||||
height="100" @sort-change="handleSortByColumn">
|
||||
<el-table-column type="index" width="50" />
|
||||
|
||||
<!-- 项目编号 -->
|
||||
<!-- <el-table-column
|
||||
prop="TrialCode"
|
||||
:label="$t('trials:researchForm:form:trialId')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
/> -->
|
||||
<!-- 试验方案号 -->
|
||||
<!-- <el-table-column
|
||||
prop="ResearchProgramNo"
|
||||
:label="$t('trials:researchForm:form:researchNo')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
/> -->
|
||||
<!-- 试验名称 -->
|
||||
<!-- <el-table-column
|
||||
prop="ExperimentName"
|
||||
:label="$t('trials:researchForm:form:researchName')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
/> -->
|
||||
<!-- 适应症类型 -->
|
||||
<!-- <el-table-column
|
||||
prop="IndicationType"
|
||||
:label="$t('trials:researchForm:form:decleareType')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
/> -->
|
||||
<!-- 适应症类型 -->
|
||||
<!-- <el-table-column
|
||||
prop="IndicationType"
|
||||
:label="$t('trials:researchForm:form:decleareType')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
/> -->
|
||||
|
||||
<!-- 中心编号 -->
|
||||
<el-table-column prop="TrialSiteCode" :label="$t('trials:researchStaff:table:siteId')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<!-- 中心名称 -->
|
||||
<el-table-column prop="SiteName" :label="$t('trials:researchStaff:table:siteName')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<!-- 状态 -->
|
||||
<el-table-column prop="State" :label="$t('trials:researchRecord:table:status')" min-width="150"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.State === 0" type="primary">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 1" type="info">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 2" type="warning">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 3" type="danger">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 是否废除 -->
|
||||
<!-- <el-table-column prop="IsDeleted" :label="$t('trials:researchRecord:table:isDeleted')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.IsDeleted" type="danger">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
<el-tag v-else type="primary">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<!-- 联系人 -->
|
||||
<el-table-column prop="UserName" :label="$t('trials:researchForm:form:contactor')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<!-- 联系电话 -->
|
||||
<el-table-column prop="Phone" :label="$t('trials:researchForm:form:contactorPhone')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<!-- 联系邮箱 -->
|
||||
<el-table-column prop="Email" :label="$t('trials:researchForm:form:contactorEmail')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<el-table-column v-show="otherInfo.IsSupportUploadFile" prop="SiteSurveyFile.FileName"
|
||||
:label="$t('trials:researchForm:form:SiteSurveyFile')" show-overflow-tooltip min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-button v-if="scope.row.SiteSurveyFile && scope.row.SiteSurveyFile.FileName" type="text"
|
||||
@click="viewFile(scope.row.SiteSurveyFile)">
|
||||
{{ scope.row.SiteSurveyFile.FileName }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template v-if="!notShowFieldList.includes('AverageEngravingCycle')">
|
||||
<!-- 平均刻盘周期(天) -->
|
||||
<el-table-column prop="AverageEngravingCycle" :label="$t('trials:researchForm:form:engravingCycle')"
|
||||
show-overflow-tooltip />
|
||||
</template>
|
||||
<template v-if="!notShowFieldList.includes('IsRoutineMRIPDEE')">
|
||||
<!-- MRI-PDFF 是否为本中心该适应症的常规诊疗检查项目? -->
|
||||
<el-table-column prop="IsRoutineMRIPDEE" :label="$t('trials:researchForm:form:IsRoutineMRIPDEE')"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('YesOrNo', scope.row.IsRoutineMRIPDEE) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template
|
||||
v-if="!notShowFieldList.includes('MRIPDFFScanTime') || !notShowFieldList.includes('MRIPDFFLeadTime') || !notShowFieldList.includes('MRIPDFFOther')">
|
||||
<!-- MRI-PDFF 检查的检测周期(含单次检查时长、预约等待时长等) -->
|
||||
<!-- <el-table-column :label="$t('trials:researchForm:form:IsRoutineMRIPDEE')"> -->
|
||||
<!-- 单次检查时长(分钟) -->
|
||||
<el-table-column v-show="!notShowFieldList.includes('MRIPDFFScanTime')" prop="MRIPDFFScanTime"
|
||||
:label="$t('trials:researchForm:form:MRIPDFFScanTime')" show-overflow-tooltip />
|
||||
<!-- 平均预约等待时长(天) -->
|
||||
<el-table-column v-show="!notShowFieldList.includes('MRIPDFFLeadTime')" prop="MRIPDFFLeadTime"
|
||||
:label="$t('trials:researchForm:form:MRIPDFFLeadTime')" show-overflow-tooltip />
|
||||
<!-- 特殊情况备注-->
|
||||
<el-table-column v-show="!notShowFieldList.includes('MRIPDFFOther')" prop="MRIPDFFOther"
|
||||
:label="$t('trials:researchForm:form:MRIPDFFOther')" show-overflow-tooltip />
|
||||
<!-- </el-table-column> -->
|
||||
</template>
|
||||
<template
|
||||
v-if="!notShowFieldList.includes('IsAuthorizeRadiologistsParticipate') || !notShowFieldList.includes('AssignFixedTechnologists')">
|
||||
<!-- 如已选择研究者评估,项目是否会授权影像科老师参与本试验?如不单独授权,是否可在试验中保持 1-2 名固定技师操作? -->
|
||||
<el-table-column prop="IsAuthorize" :label="$t('trials:researchForm:form:IsAuthorize')" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<span v-if="scope.row.IsAuthorizeRadiologistsParticipate">
|
||||
{{ $t('trials:researchForm:form:IsAuthorizeRadiologistsParticipate') }}
|
||||
</span>
|
||||
<span v-else-if="scope.row.AssignFixedTechnologists">
|
||||
{{ $t('trials:researchForm:form:AssignFixedTechnologists') }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template v-if="!notShowFieldList.includes('IsConfirmImagingTechnologist')">
|
||||
<!-- 请确认参与本项目影像采集的影像技师具备对应的资质(如:“技师证”,对应设备的“大型设备上岗证”) -->
|
||||
<el-table-column prop="IsConfirmImagingTechnologist" :label="$t('trials:researchForm:form:isQualified')"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('YesOrNo', scope.row.IsConfirmImagingTechnologist) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template v-if="!notShowFieldList.includes('NotConfirmReson')">
|
||||
<!-- 原因 -->
|
||||
<el-table-column prop="NotConfirmReson" :label="$t('trials:researchForm:form:notQualifiedReason')"
|
||||
show-overflow-tooltip />
|
||||
</template>
|
||||
<template v-if="!notShowFieldList.includes('EfficacyEvaluatorType')">
|
||||
<!-- 研究单位疗效评估人员类型 -->
|
||||
<el-table-column prop="EfficacyEvaluatorType" :label="$t('trials:researchForm:form:staffType')"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('EfficacyEvaluatorType', scope.row.EfficacyEvaluatorType) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template v-if="!notShowFieldList.includes('IsFollowStudyParameters')">
|
||||
<!-- 是否严格按照研究单位影像手册参数完成图像采集 -->
|
||||
<el-table-column prop="IsFollowStudyParameters" :label="$t('trials:researchForm:form:isFollowStudyParam')"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('YesOrNo', scope.row.IsFollowStudyParameters) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template v-if="!notShowFieldList.includes('NotFollowReson')">
|
||||
<!-- 不能严格按照研究单位影像手册参数采集图像原因 -->
|
||||
<el-table-column prop="NotFollowReson" :label="$t('trials:researchForm:form:notFollowStudyParam')"
|
||||
show-overflow-tooltip />
|
||||
</template>
|
||||
<template v-if="!notShowFieldList.includes('ISStrictManualBurnFlag')">
|
||||
<!-- 是否严格按照影像手册参数完成刻盘 -->
|
||||
<el-table-column prop="ISStrictManualBurnFlag" :label="$t('trials:researchForm:form:ISStrictManualBurnFlag')"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('YesOrNo', scope.row.ISStrictManualBurnFlag) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<template v-if="!notShowFieldList.includes('NotStrictManualBurnFlagReason')">
|
||||
<!-- 不能严格按照影像手册参数完成刻盘原因 -->
|
||||
<el-table-column prop="NotStrictManualBurnFlagReason"
|
||||
:label="$t('trials:researchForm:form:NotStrictManualBurnFlagReason')" show-overflow-tooltip />
|
||||
</template>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
|
||||
@pagination="getList" />
|
||||
</template>
|
||||
</BaseContainer>
|
||||
</template>
|
||||
<script>
|
||||
import { getTrialSiteSelect } from '@/api/trials'
|
||||
import { getSiteSurveyInfoList } from '@/api/research'
|
||||
import BaseContainer from '@/components/BaseContainer'
|
||||
import Pagination from '@/components/Pagination'
|
||||
import { getSiteSurveyInfoList_Export } from '@/api/export'
|
||||
const searchDataDefault = () => {
|
||||
return {
|
||||
SortField: '',
|
||||
Asc: true,
|
||||
State: "",
|
||||
PageIndex: 1,
|
||||
PageSize: 20,
|
||||
TrialId: '',
|
||||
TrialSiteId: '',
|
||||
TrialSiteName: ''
|
||||
}
|
||||
}
|
||||
export default {
|
||||
name: 'Equipments',
|
||||
components: { BaseContainer, Pagination },
|
||||
data() {
|
||||
return {
|
||||
searchData: searchDataDefault(),
|
||||
loading: false,
|
||||
list: [],
|
||||
total: 0,
|
||||
trialId: '',
|
||||
otherInfo: {},
|
||||
siteOptions: [],
|
||||
notShowFieldList: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.trialId = this.$route.query.trialId
|
||||
this.getList()
|
||||
this.getSite()
|
||||
},
|
||||
methods: {
|
||||
async handleExport() {
|
||||
await getSiteSurveyInfoList_Export(this.searchData)
|
||||
},
|
||||
async getList() {
|
||||
try {
|
||||
this.loading = true
|
||||
this.searchData.TrialId = this.trialId
|
||||
let res = await getSiteSurveyInfoList(this.searchData)
|
||||
if (res.IsSuccess) {
|
||||
this.list = res.Result.CurrentPageData
|
||||
this.total = res.Result.TotalCount
|
||||
this.otherInfo = res.OtherInfo
|
||||
this.notShowFieldList = res.OtherInfo.NotShowFieldList
|
||||
this.$nextTick(() => {
|
||||
this.$refs.questionsList.doLayout()
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
// 获取site下拉框数据
|
||||
async getSite() {
|
||||
try {
|
||||
let res = await getTrialSiteSelect(this.trialId)
|
||||
this.siteOptions = res.Result
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
viewFile(siteSurveyFile) {
|
||||
this.$preview({
|
||||
path: siteSurveyFile.Path,
|
||||
type: siteSurveyFile.FileType,
|
||||
title: siteSurveyFile.FileName,
|
||||
})
|
||||
},
|
||||
// 重置
|
||||
handleReset() {
|
||||
this.searchData = searchDataDefault()
|
||||
this.getList()
|
||||
this.$nextTick(() => {
|
||||
this.$refs.list.clearSort()
|
||||
})
|
||||
},
|
||||
// 查询
|
||||
handleSearch() {
|
||||
this.getList()
|
||||
},
|
||||
// 排序
|
||||
handleSortByColumn(column) {
|
||||
if (column.order === 'ascending') {
|
||||
this.searchData.Asc = true
|
||||
} else {
|
||||
this.searchData.Asc = false
|
||||
}
|
||||
this.searchData.SortField = column.prop
|
||||
this.getList()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,733 @@
|
||||
<template>
|
||||
<BaseContainer>
|
||||
<!-- 搜索框 -->
|
||||
<template slot="search-container">
|
||||
<el-form :inline="true">
|
||||
<!-- 中心 -->
|
||||
<el-form-item :label="$t('trials:researchRecord: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>
|
||||
</el-form-item>
|
||||
<!-- 联系人 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:contactor')">
|
||||
<el-input v-model="searchData.UserKeyInfo" class="mr" clearable :placeholder="`${$t(
|
||||
'trials:researchRecord:placeholder:contactorInfo'
|
||||
)}`" style="width: 140px" />
|
||||
</el-form-item>
|
||||
<!-- 初审人 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:preliminaryUser')">
|
||||
<el-input v-model="searchData.PreliminaryUserName" class="mr" clearable style="width: 140px" />
|
||||
</el-form-item>
|
||||
<!-- 审核人 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:ReviewerUser')">
|
||||
<el-input v-model="searchData.ReviewerUserName" class="mr" clearable style="width: 140px" />
|
||||
</el-form-item>
|
||||
<!-- 状态 -->
|
||||
<!-- <el-form-item :label="$t('trials:researchRecord:table:status')">
|
||||
<el-select v-model="searchData.State" clearable filterable style="width: 120px">
|
||||
<el-option v-for="(item, index) of $d.ResearchRecord" :key="index" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<!-- 是否废除 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:isDeleted')">
|
||||
<el-select v-model="searchData.IsDeleted" clearable filterable style="width: 120px">
|
||||
<el-option v-for="item of $d.YesOrNo" v-show="item.raw.ValueCN !== '无'" :key="`IsDeleted${item.value}`"
|
||||
:label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 更新时间 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:updateTime')">
|
||||
<el-date-picker v-model="searchData.DateRange" type="daterange" value-format="yyyy-MM-dd" format="yyyy-MM-dd"
|
||||
style="width: 250px" />
|
||||
</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 v-show="searchData.State === 3"
|
||||
v-hasPermi="['trials:trials-panel:attachments:site-research:summary-record']" type="primary"
|
||||
icon="el-icon-info" @click="showResearchUser">
|
||||
{{ $t('trials:researchRecord:button:researchData') }}
|
||||
</el-button>
|
||||
<!-- 调查表链接 -->
|
||||
<el-button v-show="searchData.State === 0"
|
||||
v-hasPermi="['trials:trials-panel:attachments:site-research:questionnaire-link']" type="primary"
|
||||
icon="el-icon-link" @click="showResearchLink">
|
||||
{{ $t('trials:researchRecord:button:questionLink') }}
|
||||
</el-button>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<template slot="main-container">
|
||||
<!-- 系统文件列表 -->
|
||||
<el-table ref="siteResearchList" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="list" stripe
|
||||
height="100" @sort-change="handleSortByColumn">
|
||||
<el-table-column type="index" width="50" />
|
||||
<!-- 中心编号 -->
|
||||
<el-table-column prop="TrialSiteCode" :label="$t('trials:researchRecord:table:siteId')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<!-- 中心名称 -->
|
||||
<el-table-column prop="SiteName" :label="$t('trials:researchRecord:table:siteName')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<!-- 联系人 -->
|
||||
<el-table-column prop="UserName" :label="$t('trials:researchRecord:table:contactor')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<!-- 联系电话 -->
|
||||
<el-table-column prop="Phone" :label="$t('trials:researchRecord:table:contactorPhone')" min-width="100"
|
||||
show-overflow-tooltip />
|
||||
<!-- 联系邮箱 -->
|
||||
<el-table-column prop="Email" :label="$t('trials:researchRecord:table:contactorEmail')" min-width="150"
|
||||
show-overflow-tooltip />
|
||||
<!-- 初审人 -->
|
||||
<el-table-column prop="preliminaryUser" :label="$t('trials:researchRecord:table:preliminaryUser')"
|
||||
min-width="150" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{
|
||||
scope.row.PreliminaryUser
|
||||
? scope.row.PreliminaryUser.RealName
|
||||
: ''
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 审核人 -->
|
||||
<el-table-column prop="ReviewerUser" :label="$t('trials:researchRecord:table:ReviewerUser')" min-width="150"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.ReviewerUser ? scope.row.ReviewerUser.RealName : '' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 状态 -->
|
||||
<el-table-column prop="State" :label="$t('trials:researchRecord:table:status')" min-width="150"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.State === 0" type="primary">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 1" type="info">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 2" type="warning">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 3" type="danger">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 是否废除 -->
|
||||
<el-table-column prop="IsDeleted" :label="$t('trials:researchRecord:table:isDeleted')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.IsDeleted" type="danger">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
<el-tag v-else type="primary">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 更新时间 -->
|
||||
<el-table-column prop="UpdateTime" :label="$t('trials:researchRecord:table:updateTime')" min-width="150"
|
||||
show-overflow-tooltip sortable="custom" />
|
||||
<el-table-column width="150">
|
||||
<template slot-scope="scope">
|
||||
<!-- 查看 -->
|
||||
<el-button v-show="searchData.State === 3" :disabled="scope.row.State !== 3" circle
|
||||
:title="$t('common:button:view')" icon="el-icon-view" @click="handleViewResearchList(scope.row)" />
|
||||
<!-- 审批 -->
|
||||
<el-button v-show="(searchData.State === 1 || searchData.State === 2) && isAudit"
|
||||
v-hasPermi="['trials:trials-panel:attachments:site-research:auidt']"
|
||||
:disabled="scope.row.State === 0 || scope.row.State === 3 || scope.row.IsDeleted" circle
|
||||
:title="$t('trials:researchRecord:action:view')" icon="el-icon-s-check"
|
||||
@click="handleViewResearchList(scope.row)" />
|
||||
<!-- 日志 -->
|
||||
<el-button circle :title="$t('trials:researchRecord:action:log')" icon="el-icon-tickets"
|
||||
@click="viewLog(scope.row)" />
|
||||
<!-- 废除 -->
|
||||
<el-button v-show="searchData.State === 0" v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:abolish',
|
||||
]" :disabled="scope.row.State !== 0 || scope.row.IsDeleted" circle
|
||||
:title="$t('trials:researchRecord:action:abolish')" icon="el-icon-delete"
|
||||
@click="handleRepealResearch(scope.row)" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
|
||||
@pagination="getList" />
|
||||
</template>
|
||||
|
||||
<!-- 中心数据 trials:researchRecord:button:researchData-->
|
||||
<!-- 中心人员 trials:researchRecord:dialogTitle:questionStaff-->
|
||||
<el-dialog v-if="researchUserVisible" :visible.sync="researchUserVisible"
|
||||
:title="$t('trials:researchRecord:button:researchData')" custom-class="base-dialog-wrapper" :fullscreen="true">
|
||||
<div class="base-modal-body" style="border: 1px solid #ccc; padding: 10px">
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane :label="$t('trials:researchRecord:dialogTitle:questionStaff')" name="first">
|
||||
<Users v-if="activeName === 'first'" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="中心设备" name="second">
|
||||
<Equipments v-if="activeName === 'second'" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="基本情况" name="third">
|
||||
<Questions v-if="activeName === 'third'" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 调查表 -->
|
||||
<el-dialog v-if="researchInfoVisible" :visible.sync="researchInfoVisible" :fullscreen="true"
|
||||
:close-on-click-modal="false">
|
||||
<research-form v-if="researchInfoVisible" @refreshPage="getList" />
|
||||
</el-dialog>
|
||||
<!-- 调查表编辑 -->
|
||||
<el-dialog v-if="ImageManualVisible" :visible.sync="ImageManualVisible" :fullscreen="true"
|
||||
:close-on-click-modal="false" :title="$t('trials:researchRecord:dialogTitle:ImageManualEdit')">
|
||||
<ImageManual v-if="ImageManualVisible" :trialSiteSurveyId="trialSiteSurveyId" @getList="getList" />
|
||||
</el-dialog>
|
||||
<!-- 调查表链接 -->
|
||||
<base-model :config="share_model">
|
||||
<template slot="dialog-body" v-loading="shareLoading">
|
||||
<el-button size="small" type="primary" style="margin-bottom: 10px;" @click.stop="openImageManual">{{
|
||||
$t('trials:researchRecord:label:edit')
|
||||
}}</el-button>
|
||||
<div style="width: 100%; display: flex">
|
||||
<div class="date">
|
||||
<el-form :model="shareForm" :rules="rules" ref="shareForm" label-width="100px">
|
||||
<el-form-item :label="$t('trials:researchRecord:label:ExpirationDays')" prop="ExpirationDays">
|
||||
<el-radio-group v-model="shareForm.ExpirationDays" @input="shareForm.OtherExpirationDays = null">
|
||||
<el-radio :label="1">{{ $t('trials:researchRecord:label:day1') }}</el-radio>
|
||||
<el-radio :label="7">{{ $t('trials:researchRecord:label:day7') }}</el-radio>
|
||||
<el-radio :label="15">{{ $t('trials:researchRecord:label:day15') }}</el-radio>
|
||||
<el-radio :label="`default`">{{ $t('trials:researchRecord:label:default') }}
|
||||
<el-input placeholder="" type="number" @input="handleInput" v-model="shareForm.OtherExpirationDays"
|
||||
clearable size="mini" style="width: 60px;" class="dayInput" />
|
||||
<span style="margin-left: 10px;">{{ $t('trials:researchRecord:label:day') }}</span>
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('trials:researchRecord:label:LinkVerificationCode')" prop="LinkVerificationCode">
|
||||
<el-radio-group v-model="shareForm.LinkVerificationCode"
|
||||
@input="shareForm.OtherLinkVerificationCode = null">
|
||||
<el-radio label="researchProgramNo">{{ $t('trials:researchRecord:label:researchProgramNo')
|
||||
}}</el-radio>
|
||||
<el-radio label="default">{{ $t('trials:researchRecord:label:default') }}
|
||||
<el-input placeholder="" type="number" v-model="shareForm.OtherLinkVerificationCode" clearable
|
||||
size="mini" style="width: 100px;" />
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-button type="primary" round @click="setLink" style="float: right;">
|
||||
{{ $t('trials:researchRecord:button:setLink') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="share">
|
||||
<div class="shareLink">
|
||||
<h3>{{ $t('trials:researchRecord:label:link') }}</h3>
|
||||
<el-input ref="shareLink" v-model="shareLink" readonly type="textarea" autosize :rows="3" />
|
||||
<div class="dateBox">
|
||||
<span>{{ $t('trials:researchRecord:label:linkVerificationCode') }}</span>
|
||||
<span>{{ LinkVerificationCode }}</span>
|
||||
</div>
|
||||
<div class="dateBox">
|
||||
<span>{{ $t('trials:researchRecord:label:ValidityPeriod') }}</span>
|
||||
<span>{{ validityPeriod }}</span>
|
||||
<span style="color: red;" v-if="isExpired">({{ $t('trials:researchRecord:label:Expired') }})</span>
|
||||
</div>
|
||||
<el-button type="primary" round @click="copyLink" class="shareLinkBtn"
|
||||
:disabled="!validityPeriod || isExpired">
|
||||
{{ $t('trials:researchRecord:button:copyLink') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="shareCode">
|
||||
<h3>{{ $t('trials:researchRecord:label:shareCode') }}</h3>
|
||||
<div style="display: flex;align-items: center;justify-content: space-between;">
|
||||
<div class="qrCodeBox">
|
||||
<div id="qrcode" ref="qrcode"></div>
|
||||
</div>
|
||||
<div class="codeBtnBox">
|
||||
<el-button @click="handleCopyImg" type="primary" round :disabled="!validityPeriod || isExpired">{{
|
||||
$t('trials:researchRecord:button:copyCode')
|
||||
}}</el-button>
|
||||
<el-button @click="savePic" round :disabled="!validityPeriod || isExpired">{{
|
||||
$t('trials:researchRecord:button:savePic')
|
||||
}}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
</base-model>
|
||||
<el-dialog v-if="logVisible" :visible.sync="logVisible"
|
||||
:custom-class="isFullscreen ? 'full-log-dialog-container' : 'log-dialog-container'" :close-on-click-modal="false"
|
||||
:fullscreen="isFullscreen" :show-close="false" width="60%" append-to-body>
|
||||
<span slot="title" class="dialog-footer">
|
||||
<div style="display: flex;flex-direction: row;justify-content: space-between;">
|
||||
<div>
|
||||
{{ $t('trials:researchForm:button:log') }}
|
||||
</div>
|
||||
<div>
|
||||
<svg-icon :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'"
|
||||
style="vertical-align: baseline;cursor: pointer;font-size: 20px;" @click="toggleLogFullscreen" />
|
||||
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;"
|
||||
@click="logVisible = false" />
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
<div class="log-dialog-content">
|
||||
<LogList :trial-site-survey-id="trialSiteSurveyId" />
|
||||
</div>
|
||||
</el-dialog>
|
||||
</BaseContainer>
|
||||
</template>
|
||||
<script>
|
||||
import {
|
||||
getTrialSiteSurveyList,
|
||||
getTrialSiteSelect,
|
||||
abandonSiteSurvey,
|
||||
setTrialLinkExpirationTime,
|
||||
getTrialLinkExpirationTime,
|
||||
getLinkLinkExpirationTime,
|
||||
} from '@/api/trials'
|
||||
import { changeURLStatic } from '@/utils/history.js'
|
||||
import BaseContainer from '@/components/BaseContainer'
|
||||
import Pagination from '@/components/Pagination'
|
||||
import Users from './users'
|
||||
import Equipments from './Equipments'
|
||||
import Questions from './Questions'
|
||||
import ResearchForm from '@/views/research/form'
|
||||
import BaseModel from '@/components/BaseModel'
|
||||
import ImageManual from './ImageManual'
|
||||
import QRCode from 'qrcodejs2'
|
||||
import LogList from '@/views/research/components/LogList'
|
||||
import { getTrialSiteSurveyList_Export } from '@/api/export'
|
||||
const searchDataDefault = () => {
|
||||
return {
|
||||
SortField: '',
|
||||
Asc: true,
|
||||
PageIndex: 1,
|
||||
PageSize: 20,
|
||||
TrialSiteId: '',
|
||||
UserKeyInfo: '',
|
||||
State: null,
|
||||
IsDeleted: '',
|
||||
DateRange: [],
|
||||
PreliminaryUserName: null,
|
||||
ReviewerUserName: null,
|
||||
}
|
||||
}
|
||||
export default {
|
||||
name: 'ResearchList',
|
||||
components: { BaseContainer, Pagination, Users, Equipments, Questions, ResearchForm, BaseModel, ImageManual, LogList },
|
||||
props: {
|
||||
isAudit: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
searchData: searchDataDefault(),
|
||||
loading: false,
|
||||
list: [],
|
||||
total: 0,
|
||||
trialId: this.$route.query.trialId,
|
||||
siteOptions: [],
|
||||
researchUserVisible: false,
|
||||
researchInfoVisible: false,
|
||||
share_model: {
|
||||
visible: false,
|
||||
title: this.$t('trials:researchRecord:title:shark'),
|
||||
width: '1000px',
|
||||
},
|
||||
shareLink: '',
|
||||
researchState: this.$d.ResearchRecord,
|
||||
qrcode: null,
|
||||
validityPeriod: null,
|
||||
LinkVerificationCode: null,
|
||||
isExpired: false,
|
||||
shareLoading: false,
|
||||
shareForm: {
|
||||
ExpirationDays: null,
|
||||
OtherExpirationDays: null,
|
||||
LinkVerificationCode: null,
|
||||
OtherLinkVerificationCode: null,
|
||||
},
|
||||
rules: {
|
||||
ExpirationDays: [
|
||||
{ required: true, message: this.$t("common:ruleMessage:select"), trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === 'default' && !this.shareForm.OtherExpirationDays) {
|
||||
callback(new Error(this.$t("common:ruleMessage:specify")));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
|
||||
}, trigger: 'blur'
|
||||
}
|
||||
],
|
||||
LinkVerificationCode: [
|
||||
{ required: true, message: this.$t("common:ruleMessage:select"), trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === 'default' && !this.shareForm.OtherLinkVerificationCode) {
|
||||
callback(new Error(this.$t("common:ruleMessage:specify")));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
|
||||
}, trigger: 'blur'
|
||||
}
|
||||
],
|
||||
},
|
||||
ImageManualVisible: false,
|
||||
trialSiteSurveyId: null,
|
||||
activeName: 'first',
|
||||
isFullscreen: false,
|
||||
logVisible: false
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// this.getList()
|
||||
this.getSite()
|
||||
},
|
||||
methods: {
|
||||
async handleExport() {
|
||||
await getTrialSiteSurveyList_Export(this.searchData)
|
||||
},
|
||||
toggleLogFullscreen() {
|
||||
this.isFullscreen = !this.isFullscreen
|
||||
},
|
||||
viewLog(row) {
|
||||
this.trialSiteSurveyId = row.Id
|
||||
this.isFullscreen = false
|
||||
this.logVisible = true
|
||||
},
|
||||
async getLinkTimeIsExpired() {
|
||||
try {
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await getLinkLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.isExpired = res.Result.IsIsExpired
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async getLinkTime() {
|
||||
try {
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await getTrialLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.validityPeriod = res.Result.LinkExpirationTime
|
||||
this.LinkVerificationCode = res.Result.LinkVerificationCode || res.Result.ResearchProgramNo
|
||||
if (!this.validityPeriod) {
|
||||
this.LinkVerificationCode = null
|
||||
}
|
||||
if (!this.validityPeriod) return false
|
||||
this.getLinkTimeIsExpired()
|
||||
this.shareLink = `${location.protocol}//${location.host}/researchLogin?trialId=${this.$route.query.trialId}`
|
||||
this.$nextTick(() => {
|
||||
this.creatQrCode()
|
||||
})
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async setLink() {
|
||||
try {
|
||||
let validate = await this.$refs.shareForm.validate()
|
||||
if (!validate) return false
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
ExpirationDays: this.shareForm.ExpirationDays,
|
||||
LinkVerificationCode: this.shareForm.LinkVerificationCode
|
||||
}
|
||||
if (this.shareForm.LinkVerificationCode === 'researchProgramNo') {
|
||||
data.LinkVerificationCode = null
|
||||
}
|
||||
if (this.shareForm.LinkVerificationCode === 'default') {
|
||||
data.LinkVerificationCode = this.shareForm.OtherLinkVerificationCode
|
||||
}
|
||||
if (this.shareForm.ExpirationDays === 'default') {
|
||||
data.ExpirationDays = this.shareForm.OtherExpirationDays
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await setTrialLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.getLinkTime()
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
handleInput(val) {
|
||||
// 过滤掉非数字字符,并取整为正整数
|
||||
this.shareForm.OtherExpirationDays = val.replace(/[^\d]/g, '').replace(/^0+/, '')
|
||||
},
|
||||
openImageManual() {
|
||||
// if (!this.trialSiteSurveyId) return false
|
||||
this.ImageManualVisible = true
|
||||
},
|
||||
// 获取系统文件数据
|
||||
getList() {
|
||||
this.loading = true
|
||||
this.searchData.TrialId = this.trialId
|
||||
if (this.searchData.DateRange && this.searchData.DateRange.length === 2) {
|
||||
this.searchData.UpdateTimeBegin = this.searchData.DateRange[0]
|
||||
this.searchData.updateTimeEnd = this.searchData.DateRange[1]
|
||||
} else {
|
||||
this.searchData.UpdateTimeBegin = ''
|
||||
this.searchData.updateTimeEnd = ''
|
||||
}
|
||||
getTrialSiteSurveyList(this.searchData)
|
||||
.then((res) => {
|
||||
this.loading = false
|
||||
this.list = res.Result.CurrentPageData
|
||||
this.total = res.Result.TotalCount
|
||||
})
|
||||
.catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
// 查看调查表记录详情
|
||||
handleViewResearchList(row) {
|
||||
changeURLStatic('trialSiteSurveyId', row.Id)
|
||||
this.researchInfoVisible = true
|
||||
},
|
||||
// 废除待提交的调查表
|
||||
handleRepealResearch(row) {
|
||||
// 是否确认废除?
|
||||
this.$confirm(this.$t('trials:researchRecord:message:abolish'), {
|
||||
type: 'warning',
|
||||
distinguishCancelAndClose: true,
|
||||
}).then(() => {
|
||||
abandonSiteSurvey(this.trialId, row.Id).then((res) => {
|
||||
if (res.IsSuccess) {
|
||||
this.getList()
|
||||
// 废除成功
|
||||
this.$message.success(
|
||||
this.$t('trials:researchRecord:message:abolishSuccessfully')
|
||||
)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
// 展示当前项目下所有调查表需生成账户的用户信息
|
||||
showResearchUser() {
|
||||
this.researchUserVisible = true
|
||||
this.activeName = 'first'
|
||||
},
|
||||
// 复制链接
|
||||
copyLink() {
|
||||
// 中心调研表链接
|
||||
this.$copyText(
|
||||
`${this.$t('trials:researchRecord:message:researchFormLink')}: ${this.shareLink
|
||||
}\n${this.$t('trials:researchRecord:label:linkVerificationCode')}${this.LinkVerificationCode}\n${this.$t('trials:researchRecord:label:ValidityPeriod')}${this.validityPeriod}`
|
||||
)
|
||||
.then((res) => {
|
||||
// 复制成功
|
||||
this.$message.success(
|
||||
this.$t('trials:researchRecord:message:copySuccessfully')
|
||||
)
|
||||
})
|
||||
.catch(() => {
|
||||
// 复制失败
|
||||
this.$alert(this.$t('trials:researchRecord:message:copyFailed'))
|
||||
})
|
||||
},
|
||||
// 创建二维码
|
||||
creatQrCode() {
|
||||
this.$refs.qrcode.innerHTML = '' //清除二维码方法一
|
||||
let text = this.shareLink
|
||||
this.qrcode = new QRCode(this.$refs.qrcode, {
|
||||
text: text, //页面地址 ,如果页面需要参数传递请注意哈希模式#
|
||||
width: 200,
|
||||
height: 200,
|
||||
colorDark: '#000000',
|
||||
colorLight: '#ffffff',
|
||||
correctLevel: QRCode.CorrectLevel.H,
|
||||
})
|
||||
// qrcode.clear(); // 清除二维码方法二
|
||||
},
|
||||
// 下载二维码
|
||||
savePic() {
|
||||
let qrCodeCanvas = document
|
||||
.getElementById('qrcode')
|
||||
.getElementsByTagName('canvas')
|
||||
let a = document.createElement('a')
|
||||
a.href = qrCodeCanvas[0].toDataURL('image/url')
|
||||
a.download = `${this.$route.query.researchProgramNo}${this.$t('trials:researchRecord:title:code')}.png`
|
||||
a.click()
|
||||
},
|
||||
// 复制二维码
|
||||
handleCopyImg() {
|
||||
let qrCodeCanvas = document
|
||||
.getElementById('qrcode')
|
||||
.getElementsByTagName('canvas')
|
||||
qrCodeCanvas[0].toBlob(async (blob) => {
|
||||
console.log(blob)
|
||||
const data = [
|
||||
new ClipboardItem({
|
||||
[blob.type]: blob,
|
||||
}),
|
||||
] // https://w3c.github.io/clipboard-apis/#dom-clipboard-write
|
||||
await navigator.clipboard.write(data).then(
|
||||
() => {
|
||||
this.$message.success(
|
||||
this.$t('trials:researchRecord:message:copySuccess')
|
||||
)
|
||||
},
|
||||
() => {
|
||||
this.$message.error(
|
||||
this.$t('trials:researchRecord:message:UnableWrite')
|
||||
)
|
||||
}
|
||||
)
|
||||
})
|
||||
},
|
||||
// 获取site下拉框数据
|
||||
getSite() {
|
||||
getTrialSiteSelect(this.trialId).then((res) => {
|
||||
this.siteOptions = res.Result
|
||||
})
|
||||
},
|
||||
// 展示调查表链接
|
||||
showResearchLink() {
|
||||
this.shareForm = {
|
||||
ExpirationDays: null,
|
||||
OtherExpirationDays: null,
|
||||
LinkVerificationCode: null,
|
||||
OtherLinkVerificationCode: null,
|
||||
}
|
||||
this.validityPeriod = null
|
||||
this.isExpired = false
|
||||
this.share_model.visible = true
|
||||
this.getLinkTime()
|
||||
// &lang=${this.$i18n.locale}
|
||||
// this.trialSiteSurveyId = this.list[0].Id
|
||||
},
|
||||
// 重置
|
||||
handleReset() {
|
||||
const state = this.searchData.State
|
||||
this.searchData = searchDataDefault()
|
||||
this.searchData.DateRange = []
|
||||
if (this.searchData.DateRange && this.searchData.DateRange.length === 2) {
|
||||
this.searchData.UpdateTimeBegin = this.searchData.DateRange[0]
|
||||
this.searchData.updateTimeEnd = this.searchData.DateRange[1]
|
||||
} else {
|
||||
this.searchData.UpdateTimeBegin = ''
|
||||
this.searchData.updateTimeEnd = ''
|
||||
}
|
||||
this.searchData.State = state
|
||||
this.getList()
|
||||
this.$nextTick(() => {
|
||||
this.$refs.siteResearchList.clearSort()
|
||||
})
|
||||
},
|
||||
// 查询
|
||||
handleSearch() {
|
||||
this.getList()
|
||||
},
|
||||
// 排序
|
||||
handleSortByColumn(column) {
|
||||
if (column.order === 'ascending') {
|
||||
this.searchData.Asc = true
|
||||
} else {
|
||||
this.searchData.Asc = false
|
||||
}
|
||||
this.searchData.SortField = column.prop
|
||||
this.getList()
|
||||
},
|
||||
},
|
||||
beforeDestroy() {
|
||||
if (this.qrcode) {
|
||||
this.qrcode = null
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.date,
|
||||
.share {
|
||||
width: 55%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.dayInput {
|
||||
::v-deep .el-input__inner {
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.date {
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.share {
|
||||
width: 45%;
|
||||
padding-left: 5%;
|
||||
border-left: 1px solid #f0f0f0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.shareLinkBtn {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.qrCodeBox {
|
||||
width: 220px;
|
||||
height: 220px;
|
||||
display: flex;
|
||||
border: 1px solid #c0c4cc;
|
||||
border-radius: 5px;
|
||||
box-shadow: 1px 1px 5px #c0c4cc;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.dateBox {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.codeBtnBox {
|
||||
|
||||
::v-deep .el-button {
|
||||
display: block;
|
||||
margin: 10px auto;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -6,31 +6,33 @@
|
||||
<!-- 中心编号 -->
|
||||
<el-form-item :label="$t('trials:researchStaff: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-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:researchRecord:table:status')">
|
||||
<el-select v-model="searchData.State" clearable filterable style="width: 120px">
|
||||
<el-option v-for="(item, index) of $d.ResearchRecord" :key="index" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 是否废除 -->
|
||||
<!-- <el-form-item :label="$t('trials:researchRecord:table:isDeleted')">
|
||||
<el-select v-model="searchData.IsDeleted" clearable filterable style="width: 120px">
|
||||
<el-option v-for="item of $d.YesOrNo" v-show="item.raw.ValueCN !== '无'" :key="`IsDeleted${item.value}`"
|
||||
:label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<!-- 姓名 -->
|
||||
<el-form-item :label="$t('trials:researchStaff:table:Name')">
|
||||
<el-input v-model="searchData.UserName" class="mr" clearable style="width:120px;" />
|
||||
</el-form-item>
|
||||
<!-- 角色 -->
|
||||
<el-form-item :label="$t('trials:researchStaff:table:role')">
|
||||
<el-select
|
||||
v-model="searchData.TrialRoleCode"
|
||||
style="width:120px;"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item of dict.type.SiteSurvey_UserRoles"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="parseInt(item.raw.Code)"
|
||||
/>
|
||||
<el-select v-model="searchData.TrialRoleCode" style="width:120px;" clearable>
|
||||
<el-option v-for="item of dict.type.SiteSurvey_UserRoles" :key="item.value" :label="item.label"
|
||||
:value="parseInt(item.raw.Code)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 单位 -->
|
||||
@@ -39,42 +41,19 @@
|
||||
</el-form-item>
|
||||
<!-- 是否生成账号 -->
|
||||
<el-form-item :label="$t('trials:researchStaff:table:isGenerateAccount')">
|
||||
<el-select
|
||||
v-model="searchData.IsGenerateAccount"
|
||||
style="width:120px;"
|
||||
clearable
|
||||
>
|
||||
<el-option v-for="item of $d.YesOrNo" :key="`IsGenerateAccount${item.value}`" :label="item.label" :value="item.value" />
|
||||
<el-select v-model="searchData.IsGenerateAccount" style="width:120px;" clearable>
|
||||
<el-option v-for="item of $d.YesOrNo" :key="`IsGenerateAccount${item.value}`" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 用户类型 -->
|
||||
<el-form-item :label="$t('trials:researchStaff:table:userType')">
|
||||
<el-select
|
||||
v-model="searchData.UserTypeId"
|
||||
style="width:120px;"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item of userTypeOptions"
|
||||
:key="item.Id"
|
||||
:label="item.UserTypeShortName"
|
||||
:value="item.Id"
|
||||
>
|
||||
<el-select v-model="searchData.UserTypeId" style="width:120px;" clearable>
|
||||
<el-option v-for="item of userTypeOptions" :key="item.Id" :label="item.UserTypeShortName" :value="item.Id">
|
||||
<span>{{ item.UserType }}</span>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 状态 -->
|
||||
<!-- <el-form-item :label="$t('trials:researchStaff:table:status')">
|
||||
<el-select v-model="searchData.State" clearable filterable style="width:120px;">
|
||||
<el-option
|
||||
v-for="(item,index) of researchUserState"
|
||||
:key="index"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item>
|
||||
<!-- 查询 -->
|
||||
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
|
||||
@@ -89,25 +68,15 @@
|
||||
</el-form-item>
|
||||
<!-- 发邮件 -->
|
||||
<el-form-item>
|
||||
<el-button
|
||||
v-hasPermi="['trials:trials-panel:attachments:site-research:summary-record:sendEmail']"
|
||||
type="primary"
|
||||
icon="el-icon-message"
|
||||
:loading="sendEmailLoading"
|
||||
:disabled="selectArr.length === 0"
|
||||
@click="handleSendEmail"
|
||||
>
|
||||
<el-button v-hasPermi="['trials:trials-panel:attachments:site-research:summary-record:sendEmail']"
|
||||
type="primary" icon="el-icon-message" :loading="sendEmailLoading" :disabled="selectArr.length === 0"
|
||||
@click="handleSendEmail">
|
||||
{{ $t('trials:researchRecord:dialogButton:sendEmail') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<!-- 导出 -->
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-download"
|
||||
:disabled="list.length === 0"
|
||||
@click="handleExport"
|
||||
>
|
||||
<el-button type="primary" icon="el-icon-download" :disabled="list.length === 0" @click="handleExport">
|
||||
{{ $t('common:button:export') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
@@ -116,96 +85,74 @@
|
||||
|
||||
<template slot="main-container">
|
||||
<!-- 系统文件列表 -->
|
||||
<el-table
|
||||
ref="researchUsers"
|
||||
v-loading="loading"
|
||||
v-adaptive="{bottomOffset:70}"
|
||||
:data="list"
|
||||
stripe
|
||||
height="100"
|
||||
@selection-change="handleSelectChange"
|
||||
@sort-change="handleSortByColumn"
|
||||
>
|
||||
<el-table-column
|
||||
type="selection"
|
||||
width="50"
|
||||
:selectable="handleSelectTable"
|
||||
/>
|
||||
<el-table ref="researchUsers" v-loading="loading" v-adaptive="{ bottomOffset: 55 }" :data="list" stripe
|
||||
height="100" @selection-change="handleSelectChange" @sort-change="handleSortByColumn">
|
||||
<el-table-column type="selection" width="50" :selectable="handleSelectTable" />
|
||||
<el-table-column type="index" width="50" />
|
||||
<!-- 中心编号 -->
|
||||
<el-table-column
|
||||
prop="TrialSiteSurvey.TrialSiteCode"
|
||||
:label="$t('trials:researchStaff:table:siteId')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
>
|
||||
<el-table-column prop="TrialSiteSurvey.TrialSiteCode" :label="$t('trials:researchStaff:table:siteId')"
|
||||
show-overflow-tooltip sortable="custom" min-width="100">
|
||||
<template slot-scope="scope">{{ `${scope.row.TrialSiteSurvey.TrialSiteCode}` }}</template>
|
||||
</el-table-column>
|
||||
<!-- 中心名称 -->
|
||||
<el-table-column
|
||||
prop="TrialSiteSurvey.SiteName"
|
||||
:label="$t('trials:researchStaff:table:siteName')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="120"
|
||||
>
|
||||
<el-table-column prop="TrialSiteSurvey.SiteName" :label="$t('trials:researchStaff:table:siteName')"
|
||||
show-overflow-tooltip sortable="custom" min-width="120">
|
||||
<template slot-scope="scope">{{ `${scope.row.TrialSiteSurvey.SiteName}` }}</template>
|
||||
</el-table-column>
|
||||
<!-- 状态 -->
|
||||
<el-table-column prop="State" :label="$t('trials:researchRecord:table:status')" min-width="150"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.State === 0" type="primary">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 1" type="info">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 2" type="warning">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 3" type="danger">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 是否废除 -->
|
||||
<!-- <el-table-column prop="IsDeleted" :label="$t('trials:researchRecord:table:isDeleted')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.IsDeleted" type="danger">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
<el-tag v-else type="primary">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column> -->
|
||||
<!-- 姓名 -->
|
||||
<el-table-column
|
||||
prop="LastName"
|
||||
:label="$t('trials:researchStaff:table:Name')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
>
|
||||
<el-table-column prop="LastName" :label="$t('trials:researchStaff:table:Name')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100">
|
||||
<template slot-scope="scope">{{ `${scope.row.LastName} / ${scope.row.FirstName}` }}</template>
|
||||
</el-table-column>
|
||||
<!-- 角色 -->
|
||||
<el-table-column
|
||||
prop="TrialRoleCode"
|
||||
:label="$t('trials:researchStaff:table:role')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
>
|
||||
<el-table-column prop="TrialRoleCode" :label="$t('trials:researchStaff:table:role')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('SiteSurvey_UserRoles', scope.row.TrialRoleCode) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 电话号码 -->
|
||||
<el-table-column
|
||||
prop="Phone"
|
||||
:label="$t('trials:researchStaff:table:phone')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="120"
|
||||
/>
|
||||
<el-table-column prop="Phone" :label="$t('trials:researchStaff:table:phone')" show-overflow-tooltip
|
||||
sortable="custom" min-width="120" />
|
||||
<!-- 邮箱 -->
|
||||
<el-table-column
|
||||
prop="Email"
|
||||
:label="$t('trials:researchStaff:table:email')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="150"
|
||||
/>
|
||||
<el-table-column prop="Email" :label="$t('trials:researchStaff:table:email')" show-overflow-tooltip
|
||||
sortable="custom" min-width="150" />
|
||||
<!-- 单位 -->
|
||||
<el-table-column
|
||||
prop="OrganizationName"
|
||||
:label="$t('trials:researchStaff:table:organization')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
/>
|
||||
<el-table-column prop="OrganizationName" :label="$t('trials:researchStaff:table:organization')"
|
||||
show-overflow-tooltip sortable="custom" min-width="100" />
|
||||
<!-- 是否生成账号 -->
|
||||
<el-table-column
|
||||
prop="IsGenerateAccount"
|
||||
:label="$t('trials:researchStaff:table:isGenerateAccount')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="130"
|
||||
>
|
||||
<el-table-column prop="IsGenerateAccount" :label="$t('trials:researchStaff:table:isGenerateAccount')"
|
||||
show-overflow-tooltip sortable="custom" min-width="130">
|
||||
<template slot-scope="scope">
|
||||
{{ $fd('YesOrNo', scope.row.IsGenerateAccount) }}
|
||||
</template>
|
||||
@@ -223,21 +170,11 @@
|
||||
<!-- </el-table-column>-->
|
||||
|
||||
<!-- 用户类型 -->
|
||||
<el-table-column
|
||||
prop="UserType"
|
||||
:label="$t('trials:researchStaff:table:userType')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
/>
|
||||
<el-table-column prop="UserType" :label="$t('trials:researchStaff:table:userType')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100" />
|
||||
<!-- 是否加入 -->
|
||||
<el-table-column
|
||||
prop="IsJoin"
|
||||
:label="$t('trials:researchStaff:table:isJoin')"
|
||||
show-overflow-tooltip
|
||||
sortable="custom"
|
||||
min-width="100"
|
||||
>
|
||||
<el-table-column prop="IsJoin" :label="$t('trials:researchStaff:table:isJoin')" show-overflow-tooltip
|
||||
sortable="custom" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.IsJoin" type="info">{{ $fd('IsJoin', scope.row.IsJoin) }}</el-tag>
|
||||
<el-tag v-else type="danger">{{ $fd('IsJoin', scope.row.IsJoin) }}</el-tag>
|
||||
@@ -246,7 +183,8 @@
|
||||
</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>
|
||||
</BaseContainer>
|
||||
</template>
|
||||
@@ -296,7 +234,6 @@ export default {
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
console.log(this.dict.type.SiteSurvey_UserRoles)
|
||||
this.getList()
|
||||
this.getSite()
|
||||
this.getUserType()
|
||||
|
||||
@@ -1,670 +1,208 @@
|
||||
<template>
|
||||
<BaseContainer>
|
||||
<!-- 搜索框 -->
|
||||
<template slot="search-container">
|
||||
<el-form :inline="true">
|
||||
<!-- 中心 -->
|
||||
<el-form-item :label="$t('trials:researchRecord: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>
|
||||
</el-form-item>
|
||||
<!-- 联系人 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:contactor')">
|
||||
<el-input v-model="searchData.UserKeyInfo" class="mr" clearable :placeholder="`${$t(
|
||||
'trials:researchRecord:placeholder:contactorInfo'
|
||||
)}`" style="width: 140px" />
|
||||
</el-form-item>
|
||||
<!-- 初审人 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:preliminaryUser')">
|
||||
<el-input v-model="searchData.PreliminaryUserName" class="mr" clearable style="width: 140px" />
|
||||
</el-form-item>
|
||||
<!-- 审核人 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:ReviewerUser')">
|
||||
<el-input v-model="searchData.ReviewerUserName" class="mr" clearable style="width: 140px" />
|
||||
</el-form-item>
|
||||
<!-- 状态 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:status')">
|
||||
<el-select v-model="searchData.State" clearable filterable style="width: 120px">
|
||||
<el-option v-for="(item, index) of $d.ResearchRecord" :key="index" :label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 是否废除 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:isDeleted')">
|
||||
<el-select v-model="searchData.IsDeleted" clearable filterable style="width: 120px">
|
||||
<el-option v-for="item of $d.YesOrNo" v-show="item.raw.ValueCN !== '无'" :key="`IsDeleted${item.value}`"
|
||||
:label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<!-- 更新时间 -->
|
||||
<el-form-item :label="$t('trials:researchRecord:table:updateTime')">
|
||||
<el-date-picker v-model="searchData.DateRange" type="daterange" value-format="yyyy-MM-dd" format="yyyy-MM-dd"
|
||||
style="width: 250px" />
|
||||
</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 v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:summary-record',
|
||||
]" type="primary" icon="el-icon-info" @click="showResearchUser">
|
||||
{{ $t('trials:researchRecord:button:questionStaffs') }}
|
||||
</el-button>
|
||||
<!-- 调查表链接 -->
|
||||
<el-button v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:questionnaire-link',
|
||||
]" type="primary" icon="el-icon-link" @click="showResearchLink">
|
||||
{{ $t('trials:researchRecord:button:questionLink') }}
|
||||
</el-button>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<template slot="main-container">
|
||||
<!-- 系统文件列表 -->
|
||||
<el-table ref="siteResearchList" v-loading="loading" v-adaptive="{ bottomOffset: 60 }" :data="list" stripe
|
||||
height="100" @sort-change="handleSortByColumn">
|
||||
<el-table-column type="index" width="50" />
|
||||
<!-- 中心编号 -->
|
||||
<el-table-column prop="TrialSiteCode" :label="$t('trials:researchRecord:table:siteId')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<!-- 中心名称 -->
|
||||
<el-table-column prop="SiteName" :label="$t('trials:researchRecord:table:siteName')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<!-- 联系人 -->
|
||||
<el-table-column prop="UserName" :label="$t('trials:researchRecord:table:contactor')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip />
|
||||
<!-- 联系电话 -->
|
||||
<el-table-column prop="Phone" :label="$t('trials:researchRecord:table:contactorPhone')" min-width="100"
|
||||
show-overflow-tooltip />
|
||||
<!-- 联系邮箱 -->
|
||||
<el-table-column prop="Email" :label="$t('trials:researchRecord:table:contactorEmail')" min-width="150"
|
||||
show-overflow-tooltip />
|
||||
<!-- 初审人 -->
|
||||
<el-table-column prop="preliminaryUser" :label="$t('trials:researchRecord:table:preliminaryUser')"
|
||||
min-width="150" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{
|
||||
scope.row.PreliminaryUser
|
||||
? scope.row.PreliminaryUser.RealName
|
||||
: ''
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 审核人 -->
|
||||
<el-table-column prop="ReviewerUser" :label="$t('trials:researchRecord:table:ReviewerUser')" min-width="150"
|
||||
show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.ReviewerUser ? scope.row.ReviewerUser.RealName : '' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 状态 -->
|
||||
<el-table-column prop="State" :label="$t('trials:researchRecord:table:status')" min-width="150"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.State === 0" type="primary">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 1" type="info">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 2" type="warning">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
<el-tag v-if="scope.row.State === 3" type="danger">{{
|
||||
$fd('ResearchRecord', scope.row.State)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 是否废除 -->
|
||||
<el-table-column prop="IsDeleted" :label="$t('trials:researchRecord:table:isDeleted')" min-width="100"
|
||||
sortable="custom" show-overflow-tooltip>
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.IsDeleted" type="danger">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
<el-tag v-else type="primary">{{
|
||||
$fd('YesOrNo', scope.row.IsDeleted)
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 更新时间 -->
|
||||
<el-table-column prop="UpdateTime" :label="$t('trials:researchRecord:table:updateTime')" min-width="150"
|
||||
show-overflow-tooltip sortable="custom" />
|
||||
<el-table-column width="150">
|
||||
<template slot-scope="scope">
|
||||
<!-- 查看 -->
|
||||
<el-button :disabled="scope.row.State !== 3" circle :title="$t('common:button:view')" icon="el-icon-view"
|
||||
@click="handleViewResearchList(scope.row)" />
|
||||
<!-- 审批 -->
|
||||
<el-button v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:auidt',
|
||||
]" :disabled="scope.row.State === 0 || scope.row.State === 3 || scope.row.IsDeleted" circle
|
||||
:title="$t('trials:researchRecord:action:view')" icon="el-icon-s-check"
|
||||
@click="handleViewResearchList(scope.row)" />
|
||||
<!-- 废除 -->
|
||||
<el-button v-hasPermi="[
|
||||
'trials:trials-panel:attachments:site-research:abolish',
|
||||
]" :disabled="scope.row.State !== 0 || scope.row.IsDeleted" circle
|
||||
:title="$t('trials:researchRecord:action:abolish')" icon="el-icon-delete"
|
||||
@click="handleRepealResearch(scope.row)" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
|
||||
@pagination="getList" />
|
||||
</template>
|
||||
|
||||
<!-- 中心人员 -->
|
||||
<el-dialog v-if="researchUserVisible" :visible.sync="researchUserVisible"
|
||||
:title="$t('trials:researchRecord:dialogTitle:questionStaff')" custom-class="base-dialog-wrapper"
|
||||
:fullscreen="true">
|
||||
<div class="base-modal-body" style="border: 1px solid #ccc; padding: 10px">
|
||||
<Users v-if="researchUserVisible" />
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 调查表 -->
|
||||
<el-dialog v-if="researchInfoVisible" :visible.sync="researchInfoVisible" :fullscreen="true"
|
||||
:close-on-click-modal="false">
|
||||
<research-form v-if="researchInfoVisible" @refreshPage="getList" />
|
||||
</el-dialog>
|
||||
<!-- 调查表编辑 -->
|
||||
<el-dialog v-if="ImageManualVisible" :visible.sync="ImageManualVisible" :fullscreen="true"
|
||||
:close-on-click-modal="false" :title="$t('trials:researchRecord:dialogTitle:ImageManualEdit')">
|
||||
<ImageManual v-if="ImageManualVisible" :trialSiteSurveyId="trialSiteSurveyId" @getList="getList" />
|
||||
</el-dialog>
|
||||
<!-- 调查表链接 -->
|
||||
<base-model :config="share_model">
|
||||
<template slot="dialog-body" v-loading="shareLoading">
|
||||
<el-button size="small" type="primary" style="margin-bottom: 10px;" @click.stop="openImageManual">{{
|
||||
$t('trials:researchRecord:label:edit')
|
||||
}}</el-button>
|
||||
<div style="width: 100%; display: flex">
|
||||
<div class="date">
|
||||
<el-form :model="shareForm" :rules="rules" ref="shareForm" label-width="100px">
|
||||
<el-form-item :label="$t('trials:researchRecord:label:ExpirationDays')" prop="ExpirationDays">
|
||||
<el-radio-group v-model="shareForm.ExpirationDays" @input="shareForm.OtherExpirationDays = null">
|
||||
<el-radio :label="1">{{ $t('trials:researchRecord:label:day1') }}</el-radio>
|
||||
<el-radio :label="7">{{ $t('trials:researchRecord:label:day7') }}</el-radio>
|
||||
<el-radio :label="15">{{ $t('trials:researchRecord:label:day15') }}</el-radio>
|
||||
<el-radio :label="`default`">{{ $t('trials:researchRecord:label:default') }}
|
||||
<el-input placeholder="" type="number" @input="handleInput" v-model="shareForm.OtherExpirationDays"
|
||||
clearable size="mini" style="width: 60px;" class="dayInput" />
|
||||
<span style="margin-left: 10px;">{{ $t('trials:researchRecord:label:day') }}</span>
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('trials:researchRecord:label:LinkVerificationCode')" prop="LinkVerificationCode">
|
||||
<el-radio-group v-model="shareForm.LinkVerificationCode"
|
||||
@input="shareForm.OtherLinkVerificationCode = null">
|
||||
<el-radio label="researchProgramNo">{{ $t('trials:researchRecord:label:researchProgramNo')
|
||||
}}</el-radio>
|
||||
<el-radio label="default">{{ $t('trials:researchRecord:label:default') }}
|
||||
<el-input placeholder="" type="number" v-model="shareForm.OtherLinkVerificationCode" clearable
|
||||
size="mini" style="width: 100px;" />
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-button type="primary" round @click="setLink" style="float: right;">
|
||||
{{ $t('trials:researchRecord:button:setLink') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="share">
|
||||
<div class="shareLink">
|
||||
<h3>{{ $t('trials:researchRecord:label:link') }}</h3>
|
||||
<el-input ref="shareLink" v-model="shareLink" readonly type="textarea" autosize :rows="3" />
|
||||
<div class="dateBox">
|
||||
<span>{{ $t('trials:researchRecord:label:linkVerificationCode') }}</span>
|
||||
<span>{{ LinkVerificationCode }}</span>
|
||||
</div>
|
||||
<div class="dateBox">
|
||||
<span>{{ $t('trials:researchRecord:label:ValidityPeriod') }}</span>
|
||||
<span>{{ validityPeriod }}</span>
|
||||
<span style="color: red;" v-if="isExpired">({{ $t('trials:researchRecord:label:Expired') }})</span>
|
||||
</div>
|
||||
<el-button type="primary" round @click="copyLink" class="shareLinkBtn"
|
||||
:disabled="!validityPeriod || isExpired">
|
||||
{{ $t('trials:researchRecord:button:copyLink') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="shareCode">
|
||||
<h3>{{ $t('trials:researchRecord:label:shareCode') }}</h3>
|
||||
<div style="display: flex;align-items: center;justify-content: space-between;">
|
||||
<div class="qrCodeBox">
|
||||
<div id="qrcode" ref="qrcode"></div>
|
||||
</div>
|
||||
<div class="codeBtnBox">
|
||||
<el-button @click="handleCopyImg" type="primary" round :disabled="!validityPeriod || isExpired">{{
|
||||
$t('trials:researchRecord:button:copyCode')
|
||||
}}</el-button>
|
||||
<el-button @click="savePic" round :disabled="!validityPeriod || isExpired">{{
|
||||
$t('trials:researchRecord:button:savePic')
|
||||
}}</el-button>
|
||||
<div class="step-wrapper">
|
||||
<el-steps :active="activeStatus" align-center :space="300">
|
||||
<!-- 中心填写 -->
|
||||
<el-step :title="$t('trials:siteResearch:timeline:step1')" class="click_cursor"
|
||||
@click.native="handleClick(0)" />
|
||||
<!-- SPM审核 -->
|
||||
<el-step v-if="isSPMJoin" :title="$t('trials:siteResearch:timeline:step2')" class="click_cursor"
|
||||
@click.native="handleClick(1)" />
|
||||
<!-- PM审核 -->
|
||||
<el-step :title="$t('trials:siteResearch:timeline:step3')" class="click_cursor"
|
||||
@click.native="handleClick(2)" />
|
||||
<!-- 审核完毕 -->
|
||||
<el-step :title="$t('trials:siteResearch:timeline:step14')" class="click_cursor"
|
||||
@click.native="handleClick(3)" />
|
||||
</el-steps>
|
||||
<div class="step-content">
|
||||
<ResearchList ref="researchList" :isAudit="isAudit" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
</base-model>
|
||||
</BaseContainer>
|
||||
</template>
|
||||
<script>
|
||||
import {
|
||||
getTrialSiteSurveyList,
|
||||
getTrialSiteSelect,
|
||||
abandonSiteSurvey,
|
||||
setTrialLinkExpirationTime,
|
||||
getTrialLinkExpirationTime,
|
||||
getLinkLinkExpirationTime,
|
||||
} from '@/api/trials'
|
||||
import { changeURLStatic } from '@/utils/history.js'
|
||||
import { getTrialIsSPMJoin } from '@/api/research'
|
||||
import BaseContainer from '@/components/BaseContainer'
|
||||
import Pagination from '@/components/Pagination'
|
||||
import Users from './components/users'
|
||||
import ResearchForm from '@/views/research/form'
|
||||
import BaseModel from '@/components/BaseModel'
|
||||
import ImageManual from './components/ImageManual'
|
||||
import QRCode from 'qrcodejs2'
|
||||
|
||||
const searchDataDefault = () => {
|
||||
return {
|
||||
SortField: '',
|
||||
Asc: true,
|
||||
PageIndex: 1,
|
||||
PageSize: 20,
|
||||
TrialSiteId: '',
|
||||
UserKeyInfo: '',
|
||||
State: null,
|
||||
IsDeleted: '',
|
||||
DateRange: [],
|
||||
PreliminaryUserName: null,
|
||||
ReviewerUserName: null,
|
||||
}
|
||||
}
|
||||
import ResearchList from './components/ResearchList'
|
||||
export default {
|
||||
name: 'SiteResearchList',
|
||||
components: { BaseContainer, Pagination, Users, ResearchForm, BaseModel, ImageManual },
|
||||
name: 'SiteResearch',
|
||||
components: {
|
||||
BaseContainer,
|
||||
ResearchList
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
searchData: searchDataDefault(),
|
||||
loading: false,
|
||||
list: [],
|
||||
total: 0,
|
||||
trialId: this.$route.query.trialId,
|
||||
siteOptions: [],
|
||||
researchUserVisible: false,
|
||||
researchInfoVisible: false,
|
||||
share_model: {
|
||||
visible: false,
|
||||
title: this.$t('trials:researchRecord:title:shark'),
|
||||
width: '1000px',
|
||||
isSPMJoin: true,
|
||||
activeStatus: 0
|
||||
}
|
||||
},
|
||||
shareLink: '',
|
||||
researchState: this.$d.ResearchRecord,
|
||||
qrcode: null,
|
||||
validityPeriod: null,
|
||||
LinkVerificationCode: null,
|
||||
isExpired: false,
|
||||
shareLoading: false,
|
||||
shareForm: {
|
||||
ExpirationDays: null,
|
||||
OtherExpirationDays: null,
|
||||
LinkVerificationCode: null,
|
||||
OtherLinkVerificationCode: null,
|
||||
},
|
||||
rules: {
|
||||
ExpirationDays: [
|
||||
{ required: true, message: this.$t("common:ruleMessage:select"), trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === 'default' && !this.shareForm.OtherExpirationDays) {
|
||||
callback(new Error(this.$t("common:ruleMessage:specify")));
|
||||
watch: {
|
||||
activeStatus: {
|
||||
deep: true,
|
||||
immediate: true,
|
||||
handler(v) {
|
||||
this.$nextTick(() => {
|
||||
if (!this.isSPMJoin && v > 0) {
|
||||
this.$refs['researchList'].searchData.State = v + 1
|
||||
} else {
|
||||
callback()
|
||||
this.$refs['researchList'].searchData.State = v
|
||||
}
|
||||
|
||||
}, trigger: 'blur'
|
||||
}
|
||||
],
|
||||
LinkVerificationCode: [
|
||||
{ required: true, message: this.$t("common:ruleMessage:select"), trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === 'default' && !this.shareForm.OtherLinkVerificationCode) {
|
||||
callback(new Error(this.$t("common:ruleMessage:specify")));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
this.$refs['researchList'].getList()
|
||||
})
|
||||
|
||||
}, trigger: 'blur'
|
||||
}
|
||||
],
|
||||
}
|
||||
},
|
||||
ImageManualVisible: false,
|
||||
trialSiteSurveyId: null,
|
||||
computed: {
|
||||
isAudit() {
|
||||
if (this.isSPMJoin) {
|
||||
return (this.hasPermi(['role:spm', 'role:cpm', 'role:apm']) && this.activeStatus === 1) || (this.hasPermi(['role:pm']) && this.activeStatus === 2)
|
||||
} else {
|
||||
return this.hasPermi(['role:pm']) && this.activeStatus === 1
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getList()
|
||||
this.getSite()
|
||||
this.getTrialIsSPMJoin()
|
||||
},
|
||||
methods: {
|
||||
async getLinkTimeIsExpired() {
|
||||
async getTrialIsSPMJoin() {
|
||||
try {
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await getLinkLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.isExpired = res.Result.IsIsExpired
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async getLinkTime() {
|
||||
try {
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await getTrialLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.validityPeriod = res.Result.LinkExpirationTime
|
||||
this.LinkVerificationCode = res.Result.LinkVerificationCode || res.Result.ResearchProgramNo
|
||||
if (!this.validityPeriod) {
|
||||
this.LinkVerificationCode = null
|
||||
}
|
||||
if (!this.validityPeriod) return false
|
||||
this.getLinkTimeIsExpired()
|
||||
this.shareLink = `${location.protocol}//${location.host}/researchLogin?trialId=${this.$route.query.trialId}`
|
||||
this.$nextTick(() => {
|
||||
this.creatQrCode()
|
||||
})
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async setLink() {
|
||||
try {
|
||||
let validate = await this.$refs.shareForm.validate()
|
||||
if (!validate) return false
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
ExpirationDays: this.shareForm.ExpirationDays,
|
||||
LinkVerificationCode: this.shareForm.LinkVerificationCode
|
||||
}
|
||||
if (this.shareForm.LinkVerificationCode === 'researchProgramNo') {
|
||||
data.LinkVerificationCode = null
|
||||
}
|
||||
if (this.shareForm.LinkVerificationCode === 'default') {
|
||||
data.LinkVerificationCode = this.shareForm.OtherLinkVerificationCode
|
||||
}
|
||||
if (this.shareForm.ExpirationDays === 'default') {
|
||||
data.ExpirationDays = this.shareForm.OtherExpirationDays
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await setTrialLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.getLinkTime()
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
handleInput(val) {
|
||||
// 过滤掉非数字字符,并取整为正整数
|
||||
this.shareForm.OtherExpirationDays = val.replace(/[^\d]/g, '').replace(/^0+/, '')
|
||||
},
|
||||
openImageManual() {
|
||||
// if (!this.trialSiteSurveyId) return false
|
||||
this.ImageManualVisible = true
|
||||
},
|
||||
// 获取系统文件数据
|
||||
getList() {
|
||||
this.loading = true
|
||||
this.searchData.TrialId = this.trialId
|
||||
if (this.searchData.DateRange && this.searchData.DateRange.length === 2) {
|
||||
this.searchData.UpdateTimeBegin = this.searchData.DateRange[0]
|
||||
this.searchData.updateTimeEnd = this.searchData.DateRange[1]
|
||||
let trialId = this.$route.query.trialId
|
||||
if (!trialId) return
|
||||
let res = await getTrialIsSPMJoin(trialId)
|
||||
this.isSPMJoin = res.Result
|
||||
if (this.isSPMJoin) {
|
||||
if (this.hasPermi(['role:pm'])) this.activeStatus = 2
|
||||
if (this.hasPermi(['role:spm', 'role:cpm', 'role:apm'])) this.activeStatus = 1
|
||||
} else {
|
||||
this.searchData.UpdateTimeBegin = ''
|
||||
this.searchData.updateTimeEnd = ''
|
||||
if (this.hasPermi(['role:pm'])) this.activeStatus = 1
|
||||
if (this.hasPermi(['role:spm', 'role:cpm', 'role:apm'])) this.activeStatus = 0
|
||||
}
|
||||
getTrialSiteSurveyList(this.searchData)
|
||||
.then((res) => {
|
||||
this.loading = false
|
||||
this.list = res.Result.CurrentPageData
|
||||
this.total = res.Result.TotalCount
|
||||
})
|
||||
.catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
// 查看调查表记录详情
|
||||
handleViewResearchList(row) {
|
||||
changeURLStatic('trialSiteSurveyId', row.Id)
|
||||
this.researchInfoVisible = true
|
||||
},
|
||||
// 废除待提交的调查表
|
||||
handleRepealResearch(row) {
|
||||
// 是否确认废除?
|
||||
this.$confirm(this.$t('trials:researchRecord:message:abolish'), {
|
||||
type: 'warning',
|
||||
distinguishCancelAndClose: true,
|
||||
}).then(() => {
|
||||
abandonSiteSurvey(this.trialId, row.Id).then((res) => {
|
||||
if (res.IsSuccess) {
|
||||
this.getList()
|
||||
// 废除成功
|
||||
this.$message.success(
|
||||
this.$t('trials:researchRecord:message:abolishSuccessfully')
|
||||
)
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
},
|
||||
// 展示当前项目下所有调查表需生成账户的用户信息
|
||||
showResearchUser() {
|
||||
this.researchUserVisible = true
|
||||
handleClick(step) {
|
||||
this.activeStatus = step
|
||||
if (!this.isSPMJoin && step > 0) this.activeStatus = step - 1
|
||||
},
|
||||
// 复制链接
|
||||
copyLink() {
|
||||
// 中心调研表链接
|
||||
this.$copyText(
|
||||
`${this.$t('trials:researchRecord:message:researchFormLink')}: ${this.shareLink
|
||||
}\n${this.$t('trials:researchRecord:label:linkVerificationCode')}${this.LinkVerificationCode}\n${this.$t('trials:researchRecord:label:ValidityPeriod')}${this.validityPeriod}`
|
||||
)
|
||||
.then((res) => {
|
||||
// 复制成功
|
||||
this.$message.success(
|
||||
this.$t('trials:researchRecord:message:copySuccessfully')
|
||||
)
|
||||
})
|
||||
.catch(() => {
|
||||
// 复制失败
|
||||
this.$alert(this.$t('trials:researchRecord:message:copyFailed'))
|
||||
})
|
||||
},
|
||||
// 创建二维码
|
||||
creatQrCode() {
|
||||
this.$refs.qrcode.innerHTML = '' //清除二维码方法一
|
||||
let text = this.shareLink
|
||||
this.qrcode = new QRCode(this.$refs.qrcode, {
|
||||
text: text, //页面地址 ,如果页面需要参数传递请注意哈希模式#
|
||||
width: 200,
|
||||
height: 200,
|
||||
colorDark: '#000000',
|
||||
colorLight: '#ffffff',
|
||||
correctLevel: QRCode.CorrectLevel.H,
|
||||
})
|
||||
// qrcode.clear(); // 清除二维码方法二
|
||||
},
|
||||
// 下载二维码
|
||||
savePic() {
|
||||
let qrCodeCanvas = document
|
||||
.getElementById('qrcode')
|
||||
.getElementsByTagName('canvas')
|
||||
let a = document.createElement('a')
|
||||
a.href = qrCodeCanvas[0].toDataURL('image/url')
|
||||
a.download = `${this.$route.query.researchProgramNo}${this.$t('trials:researchRecord:title:code')}.png`
|
||||
a.click()
|
||||
},
|
||||
// 复制二维码
|
||||
handleCopyImg() {
|
||||
let qrCodeCanvas = document
|
||||
.getElementById('qrcode')
|
||||
.getElementsByTagName('canvas')
|
||||
qrCodeCanvas[0].toBlob(async (blob) => {
|
||||
console.log(blob)
|
||||
const data = [
|
||||
new ClipboardItem({
|
||||
[blob.type]: blob,
|
||||
}),
|
||||
] // https://w3c.github.io/clipboard-apis/#dom-clipboard-write
|
||||
await navigator.clipboard.write(data).then(
|
||||
() => {
|
||||
this.$message.success(
|
||||
this.$t('trials:researchRecord:message:copySuccess')
|
||||
)
|
||||
},
|
||||
() => {
|
||||
this.$message.error(
|
||||
this.$t('trials:researchRecord:message:UnableWrite')
|
||||
)
|
||||
|
||||
}
|
||||
)
|
||||
})
|
||||
},
|
||||
// 获取site下拉框数据
|
||||
getSite() {
|
||||
getTrialSiteSelect(this.trialId).then((res) => {
|
||||
this.siteOptions = res.Result
|
||||
})
|
||||
},
|
||||
// 展示调查表链接
|
||||
showResearchLink() {
|
||||
this.shareForm = {
|
||||
ExpirationDays: null,
|
||||
OtherExpirationDays: null,
|
||||
LinkVerificationCode: null,
|
||||
OtherLinkVerificationCode: null,
|
||||
}
|
||||
this.validityPeriod = null
|
||||
this.isExpired = false
|
||||
this.share_model.visible = true
|
||||
this.getLinkTime()
|
||||
// &lang=${this.$i18n.locale}
|
||||
// this.trialSiteSurveyId = this.list[0].Id
|
||||
},
|
||||
// 重置
|
||||
handleReset() {
|
||||
this.searchData = searchDataDefault()
|
||||
this.searchData.DateRange = []
|
||||
if (this.searchData.DateRange && this.searchData.DateRange.length === 2) {
|
||||
this.searchData.UpdateTimeBegin = this.searchData.DateRange[0]
|
||||
this.searchData.updateTimeEnd = this.searchData.DateRange[1]
|
||||
} else {
|
||||
this.searchData.UpdateTimeBegin = ''
|
||||
this.searchData.updateTimeEnd = ''
|
||||
}
|
||||
this.getList()
|
||||
this.$nextTick(() => {
|
||||
this.$refs.siteResearchList.clearSort()
|
||||
})
|
||||
},
|
||||
// 查询
|
||||
handleSearch() {
|
||||
this.getList()
|
||||
},
|
||||
// 排序
|
||||
handleSortByColumn(column) {
|
||||
if (column.order === 'ascending') {
|
||||
this.searchData.Asc = true
|
||||
} else {
|
||||
this.searchData.Asc = false
|
||||
}
|
||||
this.searchData.SortField = column.prop
|
||||
this.getList()
|
||||
},
|
||||
},
|
||||
beforeDestroy() {
|
||||
if (this.qrcode) {
|
||||
this.qrcode = null
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.date,
|
||||
.share {
|
||||
width: 55%;
|
||||
.step-wrapper {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.dayInput {
|
||||
::v-deep .el-input__inner {
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.date {
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.share {
|
||||
width: 45%;
|
||||
padding-left: 5%;
|
||||
border-left: 1px solid #f0f0f0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.shareLinkBtn {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.qrCodeBox {
|
||||
width: 220px;
|
||||
height: 220px;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
border: 1px solid #c0c4cc;
|
||||
border-radius: 5px;
|
||||
box-shadow: 1px 1px 5px #c0c4cc;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.el-steps {
|
||||
height: 80px;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.dateBox {
|
||||
margin: 10px;
|
||||
.step-content {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.codeBtnBox {
|
||||
.title {
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
padding-left: 5px;
|
||||
background: #e4ebf1;
|
||||
border-left: 3px solid #0fc8e0;
|
||||
font-size: 13px;
|
||||
|
||||
::v-deep .el-button {
|
||||
display: block;
|
||||
margin: 10px auto;
|
||||
p {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.trial-wrapper {
|
||||
height: 60px;
|
||||
|
||||
.div-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin: 10px 20px !important;
|
||||
font-size: 13px;
|
||||
|
||||
.div-col {
|
||||
flex: 1;
|
||||
width: 100px;
|
||||
white-space: nowrap !important;
|
||||
text-overflow: ellipsis !important;
|
||||
word-break: break-word !important;
|
||||
overflow: hidden !important;
|
||||
|
||||
label {
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
.div-textarea {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-step__head.is-process {
|
||||
color: #428bca;
|
||||
border-color: #428bca;
|
||||
}
|
||||
|
||||
::v-deep .el-step__title.is-process {
|
||||
color: #428bca;
|
||||
border-color: #428bca;
|
||||
}
|
||||
|
||||
::v-deep .el-step__description.is-process {
|
||||
color: #428bca;
|
||||
border-color: #428bca;
|
||||
}
|
||||
|
||||
::v-deep .el-step__head.is-process .el-step__line {
|
||||
background-color: #428bca;
|
||||
}
|
||||
|
||||
::v-deep .el-step__head.is-finish {
|
||||
color: #303133;
|
||||
border-color: #303133;
|
||||
}
|
||||
|
||||
::v-deep .el-step__title.is-finish {
|
||||
color: #303133;
|
||||
border-color: #303133;
|
||||
}
|
||||
|
||||
::v-deep .el-step__description.is-finish {
|
||||
color: #303133;
|
||||
border-color: #303133;
|
||||
}
|
||||
|
||||
::v-deep .el-step__title.is-process {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
::v-deep .el-step__title.is-finish {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
::v-deep .el-step__head.is-finish .el-step__line {
|
||||
background-color: #303133;
|
||||
}
|
||||
|
||||
.click_cursor {
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -236,7 +236,7 @@
|
||||
</template>
|
||||
<script>
|
||||
import { saveTaskQuestion, submitTableQuestion, deleteReadingRowAnswer } from '@/api/trials'
|
||||
import { resetReadingTask, getIVUSTemplate } from '@/api/reading'
|
||||
import { resetReadingTask, getIVUSTemplatesZip } from '@/api/reading'
|
||||
import { getToken } from '@/utils/auth'
|
||||
import DicomEvent from './../DicomEvent'
|
||||
import store from '@/store'
|
||||
@@ -867,7 +867,7 @@ export default {
|
||||
const params = {
|
||||
visitTaskId: this.visitTaskId
|
||||
}
|
||||
await getIVUSTemplate(params)
|
||||
await getIVUSTemplatesZip(params)
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
@@ -30,12 +30,12 @@
|
||||
<div class="image-viewer__actions__inner">
|
||||
<i class="el-icon-zoom-out" @click="handleActions('zoomOut')" />
|
||||
<i class="el-icon-zoom-in" @click="handleActions('zoomIn')" />
|
||||
<i class="el-image-viewer__actions__divider" />
|
||||
<!-- <i class="el-image-viewer__actions__divider" /> -->
|
||||
<i class="el-icon-c-scale-to-original" @click="toggleMode" />
|
||||
<i class="el-image-viewer__actions__divider" />
|
||||
<!-- <i class="el-image-viewer__actions__divider" /> -->
|
||||
<i class="el-icon-refresh-left" @click="handleActions('anticlocelise')" />
|
||||
<i class="el-icon-refresh-right" @click="handleActions('clocelise')" />
|
||||
<i v-if="readingTaskState < 2" class="el-icon-bottom-right"
|
||||
<i v-if="readingTaskState < 2 && taskInfo.CriterionType !== 19 && taskInfo.CriterionType !== 20" class="el-icon-bottom-right"
|
||||
:style="{ cursor: isToolDisabled || readingTaskState >= 2 ? 'not-allowed' : 'pointer' }"
|
||||
@click="handleDrawArrow" />
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
:style="{cursor:isToolDisabled || readingTaskState >=2 ?'not-allowed':'pointer'}"
|
||||
@click="handleDrawRectangle"
|
||||
/> -->
|
||||
<svg-icon v-if="readingTaskState < 2" icon-class="rectangle" class="svg-icon"
|
||||
<svg-icon v-if="readingTaskState < 2 && taskInfo.CriterionType !== 19 && taskInfo.CriterionType !== 20" icon-class="rectangle" class="svg-icon"
|
||||
:style="{ cursor: isToolDisabled || readingTaskState >= 2 ? 'not-allowed' : 'pointer' }"
|
||||
@click="handleDrawRectangle" />
|
||||
</div>
|
||||
@@ -109,6 +109,7 @@ export default {
|
||||
}
|
||||
},
|
||||
data() {
|
||||
const taskInfo = JSON.parse(localStorage.getItem('taskInfo') || '{}')
|
||||
return {
|
||||
loading: false,
|
||||
index: this.initialIndex,
|
||||
@@ -137,11 +138,13 @@ export default {
|
||||
currentDrawData: {},
|
||||
canvasData: [],
|
||||
imgZoom: 1,
|
||||
isDragging: false,
|
||||
isToolDisabled: false,
|
||||
lesionName: '',
|
||||
visitTaskId: '',
|
||||
isInit: false,
|
||||
imgSize: { height: '', width: '' } // 图片原始尺寸
|
||||
imgSize: { height: '', width: '' }, // 图片原始尺寸
|
||||
taskInfo
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -209,6 +212,10 @@ export default {
|
||||
}
|
||||
this.deviceSupportInstall()
|
||||
},
|
||||
beforeDestroy() {
|
||||
window.removeEventListener('message', this.receiveMsg)
|
||||
this.stopDragging()
|
||||
},
|
||||
methods: {
|
||||
getCanvasData() {
|
||||
return new Promise(async resolve => {
|
||||
@@ -337,25 +344,55 @@ export default {
|
||||
// 初始化画布
|
||||
initCanvas(img) {
|
||||
this.loading = true
|
||||
this.canvasSize.height = img.height
|
||||
this.canvasSize.width = img.width
|
||||
|
||||
this.imgSize.height = img.height
|
||||
this.imgSize.width = img.width
|
||||
|
||||
const canvasDiv = document.getElementsByClassName('image-viewer__canvas')[0]
|
||||
const widthRatio = canvasDiv && canvasDiv.offsetWidth ? canvasDiv.offsetWidth / img.width : 1
|
||||
const heightRatio = canvasDiv && canvasDiv.offsetHeight ? canvasDiv.offsetHeight / img.height : 1
|
||||
this.imgZoom = Math.min(widthRatio, heightRatio, 1)
|
||||
this.canvasSize.height = Math.round(img.height * this.imgZoom)
|
||||
this.canvasSize.width = Math.round(img.width * this.imgZoom)
|
||||
this.canvasPosition = {
|
||||
x: canvasDiv.offsetWidth / 2 - img.width / 2,
|
||||
y: canvasDiv.offsetHeight / 2 - img.height / 2 - 25
|
||||
x: canvasDiv.offsetWidth / 2 - this.canvasSize.width / 2,
|
||||
y: canvasDiv.offsetHeight / 2 - this.canvasSize.height / 2 - 25
|
||||
} // 背景居中
|
||||
|
||||
this.$nextTick(async () => {
|
||||
ctx = document.getElementById('canvas').getContext('2d') // 获取上下文
|
||||
await ctx.drawImage(img, 0, 0, img.width, img.height) // 在canvas中绘制图片(图片、起始位置、绘图尺寸)
|
||||
await ctx.drawImage(img, 0, 0, this.canvasSize.width, this.canvasSize.height) // 在canvas中绘制图片(图片、起始位置、绘图尺寸)
|
||||
this.drawToArr()
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
scalePoint(point) {
|
||||
return {
|
||||
x: point.x * this.imgZoom,
|
||||
y: point.y * this.imgZoom
|
||||
}
|
||||
},
|
||||
startDragging(e) {
|
||||
const { offsetX, offsetY } = this.transform
|
||||
const startX = e.pageX
|
||||
const startY = e.pageY
|
||||
this.isDragging = true
|
||||
this._dragHandler = rafThrottle((ev) => {
|
||||
this.transform.offsetX = offsetX + ev.pageX - startX
|
||||
this.transform.offsetY = offsetY + ev.pageY - startY
|
||||
})
|
||||
this._dragEndHandler = () => {
|
||||
this.stopDragging()
|
||||
}
|
||||
on(document, 'mousemove', this._dragHandler)
|
||||
on(document, 'mouseup', this._dragEndHandler)
|
||||
},
|
||||
stopDragging() {
|
||||
off(document, 'mousemove', this._dragHandler)
|
||||
off(document, 'mouseup', this._dragEndHandler)
|
||||
this._dragHandler = null
|
||||
this._dragEndHandler = null
|
||||
this.isDragging = false
|
||||
},
|
||||
|
||||
// 清空画布
|
||||
clearCanvas() {
|
||||
@@ -381,6 +418,11 @@ export default {
|
||||
if (e.button !== 0) {
|
||||
return
|
||||
}
|
||||
if (!this.model) {
|
||||
this.startDragging(e)
|
||||
e.preventDefault()
|
||||
return
|
||||
}
|
||||
this.isMouseDown = true // 打开鼠标状态
|
||||
// 获取画布中鼠标开始点击位置
|
||||
this.canvasMouseStart = {
|
||||
@@ -391,6 +433,9 @@ export default {
|
||||
|
||||
// 鼠标移动事件
|
||||
async handleMouseMove(e) {
|
||||
if (!this.model || this.isDragging) {
|
||||
return
|
||||
}
|
||||
// 获取屏幕中鼠标位置(显示实时坐标)
|
||||
this.mousePosition = {
|
||||
x: e.pageX,
|
||||
@@ -437,10 +482,12 @@ export default {
|
||||
var headlen = 10// 自定义箭头线的长度
|
||||
var theta = 45// 自定义箭头线与直线的夹角
|
||||
var arrowX, arrowY// 箭头线终点坐标
|
||||
var fromX = e.data.handles.start.x
|
||||
var fromY = e.data.handles.start.y
|
||||
var toX = e.data.handles.end.x
|
||||
var toY = e.data.handles.end.y
|
||||
var start = this.scalePoint(e.data.handles.start)
|
||||
var end = this.scalePoint(e.data.handles.end)
|
||||
var fromX = start.x
|
||||
var fromY = start.y
|
||||
var toX = end.x
|
||||
var toY = end.y
|
||||
// 计算各角度和对应的箭头终点坐标
|
||||
var angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI
|
||||
var angle1 = (angle + theta) * Math.PI / 180
|
||||
@@ -453,8 +500,8 @@ export default {
|
||||
// 画直线
|
||||
ctx.lineWidth = this.lineWidth
|
||||
ctx.beginPath()
|
||||
ctx.moveTo(fromX * this.imgZoom, fromY * this.imgZoom)
|
||||
ctx.lineTo(toX * this.imgZoom, toY * this.imgZoom)
|
||||
ctx.moveTo(fromX, fromY)
|
||||
ctx.lineTo(toX, toY)
|
||||
|
||||
arrowX = toX + topX
|
||||
arrowY = toY + topY
|
||||
@@ -473,18 +520,16 @@ export default {
|
||||
ctx.lineWidth = this.lineWidth
|
||||
ctx.beginPath()
|
||||
ctx.strokeStyle = this.color
|
||||
const start = this.scalePoint(e.data.handles.start)
|
||||
const end = this.scalePoint(e.data.handles.end)
|
||||
// 绘制矩形边框
|
||||
ctx.strokeRect(
|
||||
// this.canvasMouseStart.x,
|
||||
// this.canvasMouseStart.y,
|
||||
// e.offsetX - this.canvasMouseStart.x,
|
||||
// e.offsetY - this.canvasMouseStart.y
|
||||
e.data.handles.start.x,
|
||||
e.data.handles.start.y,
|
||||
e.data.handles.end.x - e.data.handles.start.x,
|
||||
e.data.handles.end.y - e.data.handles.start.y
|
||||
start.x,
|
||||
start.y,
|
||||
end.x - start.x,
|
||||
end.y - start.y
|
||||
)
|
||||
this.drawText(ctx, { x: e.data.handles.start.x, y: e.data.handles.start.y }, { x: e.data.handles.end.x, y: e.data.handles.end.y }, e.data.remark, this.color)
|
||||
this.drawText(ctx, start, end, e.data.remark, this.color)
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -495,6 +540,10 @@ export default {
|
||||
if (e.button !== 0) {
|
||||
return // 非左键松开
|
||||
}
|
||||
if (this.isDragging) {
|
||||
this.stopDragging()
|
||||
return
|
||||
}
|
||||
|
||||
// 左键松开
|
||||
if (this.model === 'ArrowAnnotate' || this.model === 'RectangleRoi') {
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
</template>
|
||||
<script>
|
||||
import { saveTaskQuestion, submitTableQuestion, deleteReadingRowAnswer } from '@/api/trials'
|
||||
import { resetReadingTask, getOCTFCTTemplate, getOCTLipidAngleTemplate } from '@/api/reading'
|
||||
import { resetReadingTask, getOCTFCTTemplatesZip, getOCTLipidAngleTemplate } from '@/api/reading'
|
||||
import DicomEvent from './../DicomEvent'
|
||||
import store from '@/store'
|
||||
import { getToken } from '@/utils/auth'
|
||||
@@ -890,7 +890,7 @@ export default {
|
||||
visitTaskId: this.visitTaskId
|
||||
}
|
||||
if (lesionType === 104) {
|
||||
await getOCTFCTTemplate(params)
|
||||
await getOCTFCTTemplatesZip(params)
|
||||
} else {
|
||||
await getOCTLipidAngleTemplate(params)
|
||||
}
|
||||
|
||||
+1
-1
@@ -434,7 +434,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
+1
-1
@@ -234,7 +234,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
+1
-1
@@ -757,7 +757,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
+2
-2
@@ -453,7 +453,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
const o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
@@ -1268,7 +1268,7 @@ export default {
|
||||
parseFloat(val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
const o = list.find(v => {
|
||||
return v.val.includes(val)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<BaseContainer class="medical-feedback-ir">
|
||||
<el-tabs v-model="TrialReadingCriterionId" type="border-card">
|
||||
<el-tabs v-if="TrialReadingCriterionId" v-model="TrialReadingCriterionId" type="border-card">
|
||||
<el-tab-pane v-for="i of trialCriterionList" :key="i.TrialReadingCriterionId" :label="i.TrialReadingCriterionName" :name="i.TrialReadingCriterionId">
|
||||
<div v-if="TrialReadingCriterionId === i.TrialReadingCriterionId">
|
||||
<div slot="search-container">
|
||||
@@ -148,6 +148,7 @@
|
||||
</div>
|
||||
<div slot="main-container">
|
||||
<el-table
|
||||
:ref="TrialReadingCriterionId"
|
||||
v-adaptive="{bottomOffset:75}"
|
||||
v-loading="loading"
|
||||
:data="list"
|
||||
@@ -409,7 +410,7 @@ export default {
|
||||
chatForm: { visible: false, title: '' }, // 质询记录
|
||||
auditVisible: false,
|
||||
trialCriterionList: [],
|
||||
TrialReadingCriterionId: '0',
|
||||
TrialReadingCriterionId: '',
|
||||
otherInfo: null
|
||||
}
|
||||
},
|
||||
@@ -441,6 +442,9 @@ export default {
|
||||
this.total = res.Result.TotalCount
|
||||
this.otherInfo = res.OtherInfo
|
||||
this.loading = false
|
||||
this.$nextTick(() => {
|
||||
this.$refs[this.TrialReadingCriterionId][0].doLayout()
|
||||
})
|
||||
}).catch(() => { this.loading = false })
|
||||
},
|
||||
handleSearch() {
|
||||
|
||||
@@ -378,7 +378,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<BaseContainer v-loading="loading" class="read-task">
|
||||
<el-tabs v-model="TrialReadingCriterionId" type="border-card">
|
||||
<el-tabs v-if="TrialReadingCriterionId" v-model="TrialReadingCriterionId" type="border-card">
|
||||
<el-tab-pane v-for="item of trialCriterionList" :key="item.TrialReadingCriterionId"
|
||||
:label="item.TrialReadingCriterionName" :name="item.TrialReadingCriterionId">
|
||||
<div v-if="TrialReadingCriterionId === item.TrialReadingCriterionId">
|
||||
@@ -54,7 +54,7 @@
|
||||
</span>
|
||||
</div>
|
||||
<div slot="main-container">
|
||||
<el-table v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100"
|
||||
<el-table :ref="TrialReadingCriterionId" v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100"
|
||||
@sort-change="handleSortChange">
|
||||
<el-table-column type="index" width="40" align="left" />
|
||||
<!-- 是否加急 -->
|
||||
@@ -371,7 +371,7 @@ export default {
|
||||
RequestReReadingReason: [{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }]
|
||||
},
|
||||
trialCriterionList: [],
|
||||
TrialReadingCriterionId: '0',
|
||||
TrialReadingCriterionId: '',
|
||||
openWindow: null,
|
||||
otherInfo: null
|
||||
}
|
||||
@@ -423,6 +423,9 @@ export default {
|
||||
this.total = res.Result.TotalCount
|
||||
this.otherInfo = res.OtherInfo
|
||||
this.loading = false
|
||||
this.$nextTick(() => {
|
||||
this.$refs[this.TrialReadingCriterionId][0].doLayout()
|
||||
})
|
||||
}).catch(() => { this.loading = false })
|
||||
},
|
||||
handleSearch() {
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<template>
|
||||
<BaseContainer>
|
||||
<div>
|
||||
<el-tabs type="border-card" v-model="activeName">
|
||||
<template v-for="item in tabPaneList">
|
||||
<el-tab-pane :label="$t(`uploadDicomAndNonedicom:label:TargetSection_${item}`)" :name="item">
|
||||
<BaseContainer v-if="activeName == item">
|
||||
<div slot="search-container">
|
||||
<el-form :inline="true">
|
||||
<!-- 受试者编号 -->
|
||||
@@ -19,8 +23,8 @@
|
||||
</el-form>
|
||||
</div>
|
||||
<div slot="main-container">
|
||||
<el-table v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100" @sort-change="handleSortChange"
|
||||
v-loading="loading">
|
||||
<el-table v-adaptive="{ bottomOffset: 85 }" :data="list" stripe height="100"
|
||||
@sort-change="handleSortChange" v-loading="loading">
|
||||
<el-table-column type="index" width="40" align="left" />
|
||||
<el-table-column prop="IsUrgent" :label="$t('trials:consistencyCheck:table:isUrgent')"
|
||||
show-overflow-tooltip min-width="100">
|
||||
@@ -35,8 +39,9 @@
|
||||
:label="$t('trials:pendingReadingTasks:table:subjectCode')" show-overflow-tooltip
|
||||
sortable="custom" />
|
||||
<!-- 访视数量 -->
|
||||
<el-table-column prop="VisitCount" :label="$t('trials:pendingReadingTasks:table:VisitCount')"
|
||||
show-overflow-tooltip sortable="custom" />
|
||||
<el-table-column prop="VisitCount"
|
||||
:label="$t('trials:pendingReadingTasks:table:VisitCount')" show-overflow-tooltip
|
||||
sortable="custom" />
|
||||
<!-- dicom检查数量 -->
|
||||
<!-- <el-table-column prop="DicomStudyCount" :label="$t('trials:pendingReadingTasks:table:DicomStudyCount')"
|
||||
show-overflow-tooltip sortable="custom" /> -->
|
||||
@@ -45,10 +50,22 @@
|
||||
:label="$t('trials:pendingReadingTasks:table:NoneDicomStudyCount')" show-overflow-tooltip
|
||||
sortable="custom" /> -->
|
||||
<!-- 标记访视数量 -->
|
||||
<el-table-column prop="MarkVisitCount" :label="$t('trials:pendingReadingTasks:table:MarkVisitCount')"
|
||||
show-overflow-tooltip>
|
||||
<el-table-column prop="MarkVisitCount"
|
||||
:label="$t('trials:pendingReadingTasks:table:MarkVisitCount')" show-overflow-tooltip
|
||||
sortable="custom">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ `${scope.row.MarkIVUSVisitCount || 0}/${scope.row.MarkOCTVisitCount || 0}` }}</span>
|
||||
<span>{{ scope.row.MarkIVUSVisitCount || 0
|
||||
}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 标记访视数量 -->
|
||||
<el-table-column prop="MarkVisitCount"
|
||||
:label="$t('trials:pendingReadingTasks:table:MarkOCTVisitCount')"
|
||||
show-overflow-tooltip sortable="custom">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.MarkOCTVisitCount ||
|
||||
0
|
||||
}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 标记dicom检查数量 -->
|
||||
@@ -59,6 +76,14 @@
|
||||
<!-- <el-table-column prop="MarkNoneDicomStudyCount"
|
||||
:label="$t('trials:pendingReadingTasks:table:MarkNoneDicomStudyCount')" show-overflow-tooltip
|
||||
sortable="custom" /> -->
|
||||
<!-- 下载时间 -->
|
||||
<el-table-column prop="LatestDownloadTime" min-width="100"
|
||||
:label="$t('trials:pendingReadingTasks:table:latestDownloadTime')"
|
||||
show-overflow-tooltip sortable="custom" />
|
||||
<!-- 上传时间 -->
|
||||
<el-table-column prop="LatestUploadTime" min-width="100"
|
||||
:label="$t('trials:pendingReadingTasks:table:latestUploadTime')"
|
||||
show-overflow-tooltip sortable="custom" />
|
||||
<el-table-column :label="$t('common:action:action')" width="100" fixed="right">
|
||||
<template slot-scope="scope">
|
||||
<!-- 阅片 -->
|
||||
@@ -69,26 +94,34 @@
|
||||
: $t('trials:pendingReadingTasks:button:review')
|
||||
" icon="el-icon-edit-outline" @click="handleReadImage(scope.row)" /> -->
|
||||
<!-- 上传 -->
|
||||
<el-button v-hasPermi="['role:ir', 'role:pm', 'role:apm']" circle icon="el-icon-upload2"
|
||||
<el-button v-hasPermi="['role:ir', 'role:pm', 'role:apm']" circle
|
||||
icon="el-icon-upload2"
|
||||
:title="$t('trials:pendingReadingTasks:button:upload')"
|
||||
@click="openUploadImage(scope.row, 'upload')" />
|
||||
<!-- 下载 -->
|
||||
<el-button v-hasPermi="['role:ir', 'role:pm', 'role:apm']" circle icon="el-icon-download"
|
||||
<el-button v-hasPermi="['role:ir', 'role:pm', 'role:apm']" circle
|
||||
icon="el-icon-download"
|
||||
:title="$t('trials:pendingReadingTasks:button:download')"
|
||||
@click="openUploadImage(scope.row, 'download')" />
|
||||
</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" />
|
||||
</div>
|
||||
<upload-dicom-and-nonedicom v-if="uploadImageVisible" :SubjectId="uploadSubjectId"
|
||||
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion" :visible.sync="uploadImageVisible"
|
||||
:IsImageSegment="true" :forbid="forbid" />
|
||||
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion"
|
||||
:visible.sync="uploadImageVisible" :IsImageSegment="true" :forbid="forbid" />
|
||||
<download-dicom-and-nonedicom v-if="downloadImageVisible" :SubjectId="uploadSubjectId"
|
||||
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion" :visible.sync="downloadImageVisible"
|
||||
:IsImageSegment="true" :forbid="forbid" />
|
||||
:SubjectCode="uploadSubjectCode" :Criterion="uploadTrialCriterion"
|
||||
:visible.sync="downloadImageVisible" :IsImageSegment="true" :forbid="forbid" />
|
||||
</BaseContainer>
|
||||
</el-tab-pane>
|
||||
</template>
|
||||
|
||||
</el-tabs>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
<script>
|
||||
import BaseContainer from '@/components/BaseContainer'
|
||||
@@ -99,6 +132,7 @@ import { getTrialSubjectVisitMarkList } from "@/api/trials"
|
||||
const searchDataDefault = () => {
|
||||
return {
|
||||
SubjectCode: '',
|
||||
State: 0,
|
||||
PageIndex: 1,
|
||||
PageSize: 20,
|
||||
}
|
||||
@@ -129,6 +163,8 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
activeName: '0',
|
||||
tabPaneList: ['0', '1', '2'],
|
||||
searchData: searchDataDefault(),
|
||||
loading: false,
|
||||
list: [],
|
||||
@@ -153,6 +189,9 @@ export default {
|
||||
if (!v) {
|
||||
this.getList()
|
||||
}
|
||||
},
|
||||
activeName() {
|
||||
this.getList()
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@@ -171,6 +210,7 @@ export default {
|
||||
try {
|
||||
this.searchData.TrialId = this.$route.query.trialId
|
||||
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId
|
||||
this.searchData.State = this.activeName
|
||||
this.loading = true
|
||||
let res = await getTrialSubjectVisitMarkList(this.searchData)
|
||||
this.loading = false
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<BaseContainer class="reread-task">
|
||||
<el-tabs v-model="TrialReadingCriterionId" type="border-card">
|
||||
<el-tabs v-if="TrialReadingCriterionId" v-model="TrialReadingCriterionId" type="border-card">
|
||||
<el-tab-pane v-for="item of trialCriterionList" :key="item.TrialReadingCriterionId" :label="item.TrialReadingCriterionName" :name="item.TrialReadingCriterionId">
|
||||
<div v-if="TrialReadingCriterionId === item.TrialReadingCriterionId">
|
||||
<div slot="search-container">
|
||||
@@ -82,6 +82,7 @@
|
||||
</div>
|
||||
<div slot="main-container">
|
||||
<el-table
|
||||
:ref="TrialReadingCriterionId"
|
||||
v-adaptive="{bottomOffset:75}"
|
||||
v-loading="loading"
|
||||
:data="list"
|
||||
@@ -332,7 +333,7 @@ export default {
|
||||
},
|
||||
ConfirmReReadingVisible: false,
|
||||
trialCriterionList: [],
|
||||
TrialReadingCriterionId: '0',
|
||||
TrialReadingCriterionId: '',
|
||||
otherInfo: null
|
||||
}
|
||||
},
|
||||
@@ -379,6 +380,9 @@ export default {
|
||||
this.total = res.Result.TotalCount
|
||||
this.otherInfo = res.OtherInfo
|
||||
this.loading = false
|
||||
this.$nextTick(() => {
|
||||
this.$refs[this.TrialReadingCriterionId][0].doLayout()
|
||||
})
|
||||
}).catch(() => { this.loading = false })
|
||||
},
|
||||
handleSearch() {
|
||||
|
||||
@@ -311,7 +311,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
const o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
+200
-107
@@ -1,18 +1,60 @@
|
||||
<!-- eslint-disable -->
|
||||
<!-- eslint-disable vue/no-unused-vars -->
|
||||
<!-- eslint-disable vue/no-template-shadow -->
|
||||
/* eslint-disable */
|
||||
<template>
|
||||
<el-form v-loading="loading">
|
||||
<el-form v-loading="loading" :label-width="'100px'">
|
||||
<!-- 仲裁对象 -->
|
||||
<el-form-item :label="$t('trials:adRules:title:arbitrationRule')" :label-width="'180px'">
|
||||
<el-radio-group v-model="JudgyInfo.ArbitrationRule" :disabled="OtherInfo.IsSign">
|
||||
<el-form-item :label="$t('trials:adRules:title:arbitrationRule')">
|
||||
<el-radio-group v-model="JudgyInfo.ArbitrationRule" :disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])">
|
||||
<el-radio v-for="item of $d.ArbitrationRule" :key="item.id"
|
||||
:disabled="!JudgyInfo.IsReadingTaskViewInOrder || true" :label="item.value" @change="changeArbitrationRule">
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-collapse v-model="activeNames" style="border-top:none;">
|
||||
<!-- 仲裁模式JudgeModeEnum 整体结果择一判定;指标组合判定-->
|
||||
<el-form-item :label="$t('trials:adRules:title:judgeMode')">
|
||||
<el-radio-group v-model="JudgyInfo.JudgeModeEnum" :disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])">
|
||||
<el-radio
|
||||
v-for="item of $d.JudgeMode"
|
||||
:key="item.id"
|
||||
:disabled="JudgyInfo.ArbitrationRule !== 1"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 裁判规则JudgeRuleEnum 访视一致规则;访视差异规则-->
|
||||
<el-form-item :label="$t('trials:adRules:title:judgeRule')">
|
||||
<el-radio-group v-model="JudgyInfo.JudgeRuleEnum" :disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])">
|
||||
<el-radio
|
||||
v-for="item of $d.JudgeRule"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
type="primary"
|
||||
size="small"
|
||||
@click="saveJugeRule"
|
||||
v-show="!isSign">
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<ArbitrationRulesByVisit
|
||||
v-if="judgeRuleEnum === 1"
|
||||
ref="visitRules"
|
||||
:trial-reading-criterion-id="trialReadingCriterionId"
|
||||
:isSign="isSign"
|
||||
/>
|
||||
<el-collapse v-else-if="judgeRuleEnum === 0" v-model="activeNames" style="border-top:none;">
|
||||
<el-collapse-item v-for="(item, index) of QuestionList" :key="item.ReadingQuestionTrialId"
|
||||
style="position: relative;padding:0 10px;" :name="item.ReadingQuestionTrialId">
|
||||
<div slot="title">
|
||||
@@ -21,24 +63,28 @@
|
||||
<div style="position: relative">
|
||||
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
style="position: absolute; right: 0; top: 0; z-index: 10" size="mini" type="primary"
|
||||
:disabled="OtherInfo.IsSign" @click="apply(item.ReadingQuestionTrialId, index)">{{ $t('common:button:save')
|
||||
:disabled="isSign" @click="apply(item.ReadingQuestionTrialId, index)">{{ $t('common:button:save')
|
||||
}}</el-button>
|
||||
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
style="position: absolute; right: 60px; top: 0; z-index: 10" size="mini" type="primary"
|
||||
:disabled="OtherInfo.IsSign" @click="reset(item.ReadingQuestionTrialId, index)">{{ $t('common:button:reset')
|
||||
:disabled="isSign" @click="reset(item.ReadingQuestionTrialId, index)">{{ $t('common:button:reset')
|
||||
}}</el-button>
|
||||
<!-- 产生裁判阅片的条件 -->
|
||||
<el-form-item :label-width="'280px'" :label="$t('trials:adRules:title:judgeTypeEnum')" style="width: 95%">
|
||||
<el-radio-group v-model="QuestionList[index].JudgeType" @input="(val) => JudgeTypeChange(val, index)">
|
||||
<template v-for="item of $d.JudgeTypeEnum">
|
||||
<el-radio style="margin-bottom: 5px" :key="item.id" :disabled="OtherInfo.IsSign ||
|
||||
!hasPermi(['trials:trials-panel:setting:reading-unit:edit'])
|
||||
" :label="item.value" v-if="
|
||||
item.value < 4 ||
|
||||
(item.value > 3 &&
|
||||
(QuestionList[index].Type === 'number' ||
|
||||
QuestionList[index].Type === 'calculation'))
|
||||
">
|
||||
<el-radio
|
||||
style="margin-bottom: 5px"
|
||||
:key="item.id"
|
||||
:disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])"
|
||||
:label="item.value"
|
||||
v-if="
|
||||
(['number', 'calculation'].includes(QuestionList[index].Type)
|
||||
? [1, 4, 5]
|
||||
: [1, 2, 3]
|
||||
).includes(item.value)
|
||||
"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-radio>
|
||||
</template>
|
||||
@@ -48,7 +94,7 @@
|
||||
<div v-if="QuestionList[index].JudgeType === 3" style="text-align: right; margin: 10px 0">
|
||||
<!-- 添加规则 -->
|
||||
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']" size="mini" type="primary"
|
||||
:disabled="OtherInfo.IsSign" @click="addGroup(index, null)">{{ $t('trials:adRules:button:addRule')
|
||||
:disabled="isSign" @click="addGroup(index, null)">{{ $t('trials:adRules:button:addRule')
|
||||
}}</el-button>
|
||||
</div>
|
||||
<el-table v-if="QuestionList[index].JudgeType === 3" v-loading="loading"
|
||||
@@ -87,10 +133,10 @@
|
||||
<template slot-scope="scope">
|
||||
<!-- 编辑 -->
|
||||
<el-button icon="el-icon-edit" circle :title="$t('common:button:edit')" size="mini"
|
||||
:disabled="OtherInfo.IsSign" @click="addGroup(index, scope.$index)" />
|
||||
:disabled="isSign" @click="addGroup(index, scope.$index)" />
|
||||
<!-- 删除 -->
|
||||
<el-button icon="el-icon-delete" circle :title="$t('common:button:delete')" size="mini"
|
||||
:disabled="OtherInfo.IsSign" @click="tagClose(index, scope.$index)" />
|
||||
:disabled="isSign" @click="tagClose(index, scope.$index)" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -103,12 +149,12 @@
|
||||
">
|
||||
<el-checkbox-group v-if="QuestionList[index].QuestionGenre === 3" v-model="QuestionList[index].grouping">
|
||||
<template v-for="item of $d[QuestionList[index].DictionaryCode]">
|
||||
<el-checkbox v-if="item.value !== -1" :key="item.id" :disabled="OtherInfo.IsSign" :label="item.value">{{
|
||||
<el-checkbox v-if="item.value !== -1" :key="item.id" :disabled="isSign" :label="item.value">{{
|
||||
item.label }}</el-checkbox>
|
||||
</template>
|
||||
</el-checkbox-group>
|
||||
<el-checkbox-group v-else v-model="QuestionList[index].grouping">
|
||||
<el-checkbox v-for="item of item.TypeValue.split('|')" :key="item" :disabled="OtherInfo.IsSign"
|
||||
<el-checkbox v-for="item of item.TypeValue.split('|')" :key="item" :disabled="isSign"
|
||||
:label="item">{{
|
||||
item }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
@@ -135,7 +181,7 @@
|
||||
.toString()
|
||||
.replaceAll(',', '|')
|
||||
}}</el-tag>
|
||||
<el-button size="mini" type="primary" :disabled="OtherInfo.IsSign" @click="addGroup2(index)">
|
||||
<el-button size="mini" type="primary" :disabled="isSign" @click="addGroup2(index)">
|
||||
<!-- 添加分组 -->
|
||||
{{ $t('trials:adRules:title:addGroup') }}
|
||||
</el-button>
|
||||
@@ -181,7 +227,7 @@
|
||||
)
|
||||
" prop="JudgeDifferenceType">
|
||||
<el-select v-model="QuestionList[index].JudgeDifferenceType" placeholder="请选择"
|
||||
:disabled="OtherInfo.IsSign">
|
||||
:disabled="isSign">
|
||||
<el-option v-for="item of $d.JudgeDifferenceType" :key="item.id" :label="item.label"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
@@ -193,7 +239,7 @@
|
||||
" prop="JudgeDifferenceValue">
|
||||
<div style="display: flex">
|
||||
<el-input v-model="QuestionList[index].JudgeDifferenceValue" clearable
|
||||
:disabled="OtherInfo.IsSign"></el-input>
|
||||
:disabled="isSign"></el-input>
|
||||
<span style="margin-left: 10px" v-if="QuestionList[index].JudgeType !== 5 && QuestionList[index].Unit !== 0">
|
||||
{{ `${QuestionList[index].Unit === 4 ? QuestionList[index].CustomUnit : $fd('ValueUnit', QuestionList[index].Unit)}`}}
|
||||
</span>
|
||||
@@ -203,8 +249,6 @@
|
||||
</div>
|
||||
</el-collapse-item>
|
||||
</el-collapse>
|
||||
<!-- </el-tab-pane>-->
|
||||
<!-- </el-tabs>-->
|
||||
<!-- 选择答案 -->
|
||||
<el-dialog v-if="QuestionVisible" :title="$t('trials:adRules:title:selectAnswer')" :visible.sync="QuestionVisible"
|
||||
width="800px" :close-on-click-modal="false" custom-class="base-dialog-wrapper" append-to-body>
|
||||
@@ -212,40 +256,50 @@
|
||||
<!-- 阅片人A -->
|
||||
<el-form-item label-width="110px" :label="$t('trials:adRules:title:answerGroupA')">
|
||||
<el-checkbox-group v-model="QuestionList[selectIndex].groupingA">
|
||||
<template v-for="item of QuestionList[selectIndex].TypeValue.split('|')">
|
||||
<el-checkbox v-if="QuestionList[selectIndex].QuestionGenre !== 3" :key="item" :label="item" :disabled="QuestionList[selectIndex].groupingB.length
|
||||
? ~QuestionList[selectIndex].groupingB.indexOf(item)
|
||||
: false
|
||||
">{{ item }}</el-checkbox>
|
||||
<template v-for="item of QuestionList[selectIndex].TypeValue.split('|') || []">
|
||||
<el-checkbox
|
||||
v-if="QuestionList[selectIndex].QuestionGenre !== 3"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:disabled="QuestionList[selectIndex]?.groupingB?.includes(item) ?? false"
|
||||
>
|
||||
{{ item }}
|
||||
</el-checkbox>
|
||||
</template>
|
||||
<template v-for="item of $d[QuestionList[selectIndex].DictionaryCode]">
|
||||
<el-checkbox v-if="
|
||||
QuestionList[selectIndex].QuestionGenre === 3 &&
|
||||
item.value !== -1
|
||||
" :key="item.id" :label="item.value" :disabled="QuestionList[selectIndex].groupingB.length
|
||||
? ~QuestionList[selectIndex].groupingB.indexOf(item.value)
|
||||
: false
|
||||
">{{ item.label }}</el-checkbox>
|
||||
<el-checkbox
|
||||
v-if="QuestionList[selectIndex].QuestionGenre === 3 && item.value !== -1"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
:disabled="QuestionList[selectIndex]?.groupingB?.includes(item.value) ?? false"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-checkbox>
|
||||
</template>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<!-- 阅片人B -->
|
||||
<el-form-item label-width="110px" :label="$t('trials:adRules:title:answerGroupB')">
|
||||
<el-checkbox-group v-model="QuestionList[selectIndex].groupingB">
|
||||
<template v-for="item of QuestionList[selectIndex].TypeValue.split('|')">
|
||||
<el-checkbox v-if="QuestionList[selectIndex].QuestionGenre !== 3" :key="item" :label="item" :disabled="QuestionList[selectIndex].groupingA.length
|
||||
? ~QuestionList[selectIndex].groupingA.indexOf(item)
|
||||
: false
|
||||
">{{ item }}</el-checkbox>
|
||||
<template v-for="item of QuestionList[selectIndex].TypeValue.split('|') || []">
|
||||
<el-checkbox
|
||||
v-if="QuestionList[selectIndex].QuestionGenre !== 3"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:disabled="QuestionList[selectIndex]?.groupingA?.includes(item) ?? false"
|
||||
>
|
||||
{{ item }}
|
||||
</el-checkbox>
|
||||
</template>
|
||||
<template v-for="item of $d[QuestionList[selectIndex].DictionaryCode]">
|
||||
<el-checkbox v-if="
|
||||
QuestionList[selectIndex].QuestionGenre === 3 &&
|
||||
item.value !== -1
|
||||
" :key="item.id" :label="item.value" :disabled="QuestionList[selectIndex].groupingA.length
|
||||
? ~QuestionList[selectIndex].groupingA.indexOf(item.value)
|
||||
: false
|
||||
">{{ item.label }}</el-checkbox>
|
||||
<el-checkbox
|
||||
v-if="QuestionList[selectIndex].QuestionGenre === 3 && item.value !== -1"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
:disabled="QuestionList[selectIndex]?.groupingA?.includes(item.value) ?? false"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-checkbox>
|
||||
</template>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
@@ -269,13 +323,17 @@
|
||||
</el-form>
|
||||
</template>
|
||||
<script>
|
||||
/* eslint-disable */
|
||||
import {
|
||||
getTrialConfirmCriterionList,
|
||||
getTrialCriterionJudgeQuestionList,
|
||||
setTrialCriterionJudgeQuestionAnswerGroup,
|
||||
} from '@/api/trials/reading'
|
||||
import { setTrialJudgyInfo, getTrialJudgyInfo } from '@/api/trials/setting'
|
||||
import { setTrialJudgyInfo, getTrialJudgyInfo, setTrialJudgeRuleInfo } from '@/api/trials/setting'
|
||||
import ArbitrationRulesByVisit from './ArbitrationRulesByVisit'
|
||||
export default {
|
||||
components: {
|
||||
ArbitrationRulesByVisit,
|
||||
},
|
||||
props: {
|
||||
trialReadingCriterionId: {
|
||||
type: String,
|
||||
@@ -294,9 +352,7 @@ export default {
|
||||
activeNames: null,
|
||||
indexA: null,
|
||||
type: null,
|
||||
OtherInfo: {
|
||||
IsSign: true,
|
||||
},
|
||||
isSign: true,
|
||||
JudgyInfo: {},
|
||||
JudgeDifferenceValueQRules: {
|
||||
JudgeDifferenceType: [
|
||||
@@ -339,47 +395,38 @@ export default {
|
||||
},
|
||||
],
|
||||
},
|
||||
judgeRuleEnum: -1,
|
||||
savedJudgyInfo: {
|
||||
JudgeModeEnum: null,
|
||||
JudgeRuleEnum: null,
|
||||
},
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
TrialReadingCriterionId(v) {
|
||||
async trialReadingCriterionId(v) {
|
||||
if (v === null) return
|
||||
this.loading = true
|
||||
getTrialCriterionJudgeQuestionList({
|
||||
TrialId: this.$route.query.trialId,
|
||||
// ReadingQuestionCriterionTrialId: v,
|
||||
TrialReadingCriterionId: this.trialReadingCriterionId,
|
||||
})
|
||||
.then((res) => {
|
||||
this.loading = false
|
||||
this.QuestionList = res.Result
|
||||
this.OtherInfo = res.OtherInfo
|
||||
this.activeNames = this.QuestionList.map(
|
||||
(v) => v.ReadingQuestionTrialId
|
||||
)
|
||||
this.QuestionList.forEach((v) => {
|
||||
this.$set(v, 'grouping', [])
|
||||
this.$set(v, 'groupingA', [])
|
||||
this.$set(v, 'groupingB', [])
|
||||
this.$set(
|
||||
v,
|
||||
'AnswerGroupList',
|
||||
Object.assign([], v.AnswerCombination)
|
||||
)
|
||||
this.$set(v, 'AnswerGroup2List', Object.assign([], v.AnswerGroup))
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
this.btnLoading = false
|
||||
this.loading = false
|
||||
})
|
||||
await this.initData()
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.getList()
|
||||
this.getTrialJudgyInfo()
|
||||
async mounted() {
|
||||
await this.initData()
|
||||
},
|
||||
methods: {
|
||||
resetJudgeTypeRelatedFields(question = {}) {
|
||||
this.$set(question, 'AnswerGroup2List', [])
|
||||
this.$set(question, 'AnswerGroupList', [])
|
||||
this.$set(question, 'grouping', [])
|
||||
this.$set(question, 'groupingA', [])
|
||||
this.$set(question, 'groupingB', [])
|
||||
this.$set(question, 'JudgeDifferenceValue', 0)
|
||||
this.$set(question, 'JudgeDifferenceType', 0)
|
||||
},
|
||||
async initData() {
|
||||
await this.getTrialJudgyInfo()
|
||||
if (this.judgeRuleEnum !== 1) {
|
||||
await this.getList(false)
|
||||
}
|
||||
},
|
||||
// 修改仲裁规则
|
||||
changeArbitrationRule(value) {
|
||||
if (value !== 1) {
|
||||
@@ -387,12 +434,16 @@ export default {
|
||||
item.JudgeDifferenceValue = 0
|
||||
item.JudgeDifferenceType = 0
|
||||
})
|
||||
if (this.$refs.visitRules) {
|
||||
this.$refs.visitRules.changeArbitrationRule(value)
|
||||
}
|
||||
}
|
||||
},
|
||||
JudgeTypeChange(value, index) {
|
||||
this.resetJudgeTypeRelatedFields(this.QuestionList[index])
|
||||
this.$nextTick(() => {
|
||||
if (value === 4 || value === 5) {
|
||||
if (this.$refs['JudgeDifferenceValue' + value + index][0]) {
|
||||
if (this.$refs['JudgeDifferenceValue' + value + index] && this.$refs['JudgeDifferenceValue' + value + index][0]) {
|
||||
this.$refs['JudgeDifferenceValue' + value + index][0].resetFields()
|
||||
// this.QuestionList[index].JudgeDifferenceValue = 0;
|
||||
}
|
||||
@@ -400,25 +451,26 @@ export default {
|
||||
})
|
||||
},
|
||||
saveAllSync() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (this.judgeRuleEnum === 1 && this.$refs.visitRules) {
|
||||
return Promise.resolve(true)
|
||||
// return this.$refs.visitRules.saveAllSync()
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
var arr = []
|
||||
this.QuestionList.forEach((v, i) => {
|
||||
arr.push(this.applySync(v.ReadingQuestionTrialId, i))
|
||||
})
|
||||
Promise.all(arr)
|
||||
.then((res) => {
|
||||
console.log(res)
|
||||
.then(() => {
|
||||
resolve(true)
|
||||
})
|
||||
.catch((res) => {
|
||||
console.log('进入catch')
|
||||
.catch(() => {
|
||||
resolve(false)
|
||||
})
|
||||
})
|
||||
},
|
||||
applySync(ReadingQuestionTrialId, index) {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
console.log(this.QuestionList[index].JudgeType)
|
||||
if (this.QuestionList[index].JudgeType === 0) {
|
||||
reject(false)
|
||||
return
|
||||
@@ -442,7 +494,7 @@ export default {
|
||||
this.QuestionList[index].JudgeType === 5
|
||||
) {
|
||||
try {
|
||||
let validate = await this.$refs[
|
||||
const validate = await this.$refs[
|
||||
'JudgeDifferenceValue' +
|
||||
this.QuestionList[index].JudgeType +
|
||||
index
|
||||
@@ -493,19 +545,55 @@ export default {
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
getTrialJudgyInfo() {
|
||||
async getTrialJudgyInfo() {
|
||||
try {
|
||||
this.loading = true
|
||||
getTrialJudgyInfo({
|
||||
const res = await getTrialJudgyInfo({
|
||||
TrialId: this.$route.query.trialId,
|
||||
TrialReadingCriterionId: this.trialReadingCriterionId,
|
||||
})
|
||||
.then((res) => {
|
||||
this.JudgyInfo = res.Result
|
||||
this.judgeRuleEnum = this.JudgyInfo.JudgeRuleEnum
|
||||
this.isSign = res.Result.IsSigned
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.loading = false
|
||||
})
|
||||
.catch((v) => {
|
||||
}
|
||||
},
|
||||
async saveJugeRule(showMessage = true) {
|
||||
try {
|
||||
this.loading = true
|
||||
const prevJudgeRuleEnum = this.judgeRuleEnum
|
||||
const params = {
|
||||
trialReadingCriterionId: this.trialReadingCriterionId,
|
||||
judgeModeEnum: this.JudgyInfo.JudgeModeEnum,
|
||||
judgeRuleEnum: this.JudgyInfo.JudgeRuleEnum,
|
||||
}
|
||||
const res = await setTrialJudgeRuleInfo(params)
|
||||
if (res.IsSuccess) {
|
||||
if (showMessage) {
|
||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||
}
|
||||
this.judgeRuleEnum = this.JudgyInfo.JudgeRuleEnum
|
||||
if (prevJudgeRuleEnum !== this.judgeRuleEnum) {
|
||||
if (this.judgeRuleEnum === 1) {
|
||||
await this.$nextTick()
|
||||
if (this.$refs.visitRules) {
|
||||
await this.$refs.visitRules.initData()
|
||||
}
|
||||
} else {
|
||||
await this.getList(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
return false
|
||||
} finally {
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
},
|
||||
tagClose2(index, indexA) {
|
||||
// '删除该规则组?'
|
||||
@@ -593,7 +681,7 @@ export default {
|
||||
AnswerCombination: [],
|
||||
JudgeType: 0,
|
||||
JudgeDifferenceValue: 0,
|
||||
JudgeDifferenceType: 0,
|
||||
JudgeDifferenceType: 0
|
||||
})
|
||||
.then((res) => {
|
||||
this.$set(this.QuestionList[index], 'AnswerGroup2List', [])
|
||||
@@ -635,7 +723,7 @@ export default {
|
||||
this.QuestionList[index].JudgeType === 5
|
||||
) {
|
||||
try {
|
||||
let validate = await this.$refs[
|
||||
const validate = await this.$refs[
|
||||
'JudgeDifferenceValue' + this.QuestionList[index].JudgeType + index
|
||||
][0].validate()
|
||||
if (!validate) return
|
||||
@@ -655,7 +743,7 @@ export default {
|
||||
),
|
||||
JudgeDifferenceType: Number(
|
||||
this.QuestionList[index].JudgeDifferenceType
|
||||
),
|
||||
)
|
||||
})
|
||||
.then((res) => {
|
||||
this.$message.success(this.$t('trials:adRules:message:msg9')) // '应用成功'
|
||||
@@ -671,18 +759,23 @@ export default {
|
||||
this.ReadingQuestionCriterionTrialId =
|
||||
this.CriterionList[this.index].ReadingQuestionCriterionTrialId
|
||||
},
|
||||
getList() {
|
||||
async getList(needGetTrialJudgyInfo = true) {
|
||||
this.loading = true
|
||||
getTrialCriterionJudgeQuestionList({
|
||||
if (needGetTrialJudgyInfo) {
|
||||
await this.getTrialJudgyInfo()
|
||||
}
|
||||
if (this.judgeRuleEnum === 1 && this.$refs.visitRules) {
|
||||
return this.$refs.visitRules.getList()
|
||||
}
|
||||
return getTrialCriterionJudgeQuestionList({
|
||||
TrialId: this.$route.query.trialId,
|
||||
TrialReadingCriterionId: this.trialReadingCriterionId,
|
||||
})
|
||||
.then((res) => {
|
||||
this.loading = false
|
||||
this.QuestionList = res.Result
|
||||
this.OtherInfo = res.OtherInfo
|
||||
this.activeNames = this.QuestionList.map(
|
||||
(v) => v.ReadingQuestionTrialId
|
||||
(item) => item.ReadingQuestionTrialId
|
||||
)
|
||||
this.QuestionList.forEach((v) => {
|
||||
this.$set(v, 'grouping', [])
|
||||
|
||||
+955
@@ -0,0 +1,955 @@
|
||||
<template>
|
||||
<div v-loading="loading">
|
||||
<el-tabs v-model="activeVisitTab" class="visit-tabs" type="border-card">
|
||||
<el-tab-pane v-for="visit in visitPlanOptions" :key="visit.Id"
|
||||
:label="visit.VisitName" :name="visit.Id">
|
||||
<div v-show="!isSign" class="visit-tabs-actions">
|
||||
<!-- 批量保存 -->
|
||||
<el-button
|
||||
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
:disabled="btnLoading || questionListMap[visit.Id] && questionListMap[visit.Id].length === 0"
|
||||
:loading="btnLoading"
|
||||
size="small"
|
||||
type="primary"
|
||||
@click="handleBatchSave(visit.Id, visit.VisitNum)"
|
||||
>
|
||||
{{ $t('common:button:batchSave') }}
|
||||
</el-button>
|
||||
<!-- 复制 -->
|
||||
<el-button
|
||||
v-show="visitPlanOptions.length > 1"
|
||||
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
:disabled="btnLoading || questionListMap[visit.Id] && questionListMap[visit.Id].length === 0"
|
||||
:loading="btnLoading"
|
||||
size="small"
|
||||
type="primary"
|
||||
@click="handleCopy(visit.VisitNum)"
|
||||
>
|
||||
{{ $t('common:button:copy') }}
|
||||
</el-button>
|
||||
<!-- 应用到随访 -->
|
||||
<el-button
|
||||
v-show="visitPlanOptions.length > 1 && visit.VisitNum === 0"
|
||||
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
:disabled="btnLoading || questionListMap[visit.Id] && questionListMap[visit.Id].length === 0"
|
||||
:loading="btnLoading"
|
||||
size="small"
|
||||
type="primary"
|
||||
@click="applyToFollowup"
|
||||
>
|
||||
{{ $t('trials:adRules:button:applyToFollowup') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<el-collapse v-if="questionListMap[visit.Id]" v-model="visitActiveNamesMap[visit.Id]" style="border-top:none;">
|
||||
<el-collapse-item v-for="(item, index) of questionListMap[visit.Id]"
|
||||
:key="item.ReadingQuestionTrialId"
|
||||
style="position: relative;padding:0 10px;" :name="item.ReadingQuestionTrialId">
|
||||
<div slot="title">
|
||||
{{ item.PageName }}Q{{ index + 1 }}:{{ item.QuestionName }}
|
||||
</div>
|
||||
<div style="position: relative">
|
||||
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
style="position: absolute; right: 0; top: 0; z-index: 10" size="mini" type="primary"
|
||||
:disabled="isSign"
|
||||
@click="visitApply(item.ReadingQuestionTrialId, index, visit.Id, visit.VisitNum)">{{ $t('common:button:save')
|
||||
}}</el-button>
|
||||
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
style="position: absolute; right: 60px; top: 0; z-index: 10" size="mini" type="primary"
|
||||
:disabled="isSign"
|
||||
@click="visitReset(item.ReadingQuestionTrialId, index, visit.Id, visit.VisitNum)">{{ $t('common:button:reset')
|
||||
}}</el-button>
|
||||
<el-form-item :label-width="'280px'" :label="$t('trials:adRules:title:judgeTypeEnum')" style="width: 95%">
|
||||
<el-radio-group
|
||||
v-model="questionListMap[visit.Id][index].JudgeType"
|
||||
@input="(val) => visitJudgeTypeChange(val, index, visit.Id)"
|
||||
>
|
||||
<template v-for="judgeTypeItem of $d.JudgeTypeEnum">
|
||||
<el-radio
|
||||
style="margin-bottom: 5px"
|
||||
:key="judgeTypeItem.id"
|
||||
:disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])"
|
||||
:label="judgeTypeItem.value"
|
||||
v-if="
|
||||
(['number', 'calculation'].includes(questionListMap[visit.Id][index].Type)
|
||||
? [1, 4, 5, 6]
|
||||
: [1, 2, 3, 6]
|
||||
).includes(judgeTypeItem.value)
|
||||
"
|
||||
>
|
||||
{{ judgeTypeItem.label }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div v-if="questionListMap[visit.Id][index].JudgeType === 3" style="text-align: right; margin: 10px 0">
|
||||
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']" size="mini" type="primary"
|
||||
:disabled="isSign"
|
||||
@click="visitAddGroup(index, null, visit.Id)">{{ $t('trials:adRules:button:addRule')
|
||||
}}</el-button>
|
||||
</div>
|
||||
<el-table v-if="questionListMap[visit.Id][index].JudgeType === 3" v-loading="loading"
|
||||
:data="questionListMap[visit.Id][index].AnswerGroupList" border stripe>
|
||||
<el-table-column prop="AnswerGroupA" :label="$t('trials:adRules:title:order')" width="160">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.$index + 1 }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="AnswerGroupA" :label="$t('trials:adRules:title:answerGroupA')" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
{{
|
||||
questionListMap[visit.Id][index].QuestionGenre === 3
|
||||
? scope.row.AnswerGroupA.map((v) =>
|
||||
$fd(questionListMap[visit.Id][index].DictionaryCode, parseInt(v))
|
||||
).toString()
|
||||
: scope.row.AnswerGroupA.toString()
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="AnswerGroupB" :label="$t('trials:adRules:title:answerGroupB')" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
{{
|
||||
questionListMap[visit.Id][index].QuestionGenre === 3
|
||||
? scope.row.AnswerGroupB.map((v) =>
|
||||
$fd(questionListMap[visit.Id][index].DictionaryCode, parseInt(v))
|
||||
).toString()
|
||||
: scope.row.AnswerGroupB.toString()
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="AnswerGroupB" :label="$t('common:action:action')" min-width="80">
|
||||
<template slot-scope="scope">
|
||||
<el-button icon="el-icon-edit" circle :title="$t('common:button:edit')" size="mini"
|
||||
:disabled="isSign"
|
||||
@click="visitAddGroup(index, scope.$index, visit.Id)" />
|
||||
<el-button icon="el-icon-delete" circle :title="$t('common:button:delete')" size="mini"
|
||||
:disabled="isSign"
|
||||
@click="visitTagClose(index, scope.$index, visit.Id)" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div v-if="questionListMap[visit.Id][index].JudgeType === 2">
|
||||
<div style="
|
||||
background: #f6f6f6;
|
||||
border-radius: 20px;
|
||||
padding: 15px 20px;
|
||||
margin-top: 10px;
|
||||
">
|
||||
<el-checkbox-group v-if="questionListMap[visit.Id][index].QuestionGenre === 3"
|
||||
v-model="questionListMap[visit.Id][index].grouping"
|
||||
>
|
||||
<template v-for="dictItem of $d[questionListMap[visit.Id][index].DictionaryCode]">
|
||||
<el-checkbox v-if="dictItem.value !== -1" :key="dictItem.id" :disabled="isSign"
|
||||
:label="dictItem.value">{{ dictItem.label }}</el-checkbox>
|
||||
</template>
|
||||
</el-checkbox-group>
|
||||
<el-checkbox-group v-else v-model="questionListMap[visit.Id][index].grouping">
|
||||
<el-checkbox v-for="answerItem of item.TypeValue.split('|')" :key="answerItem"
|
||||
:disabled="isSign" :label="answerItem">{{ answerItem }}</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
<div style="margin-top: 20px">
|
||||
{{ $t('trials:adRules:title:selectAnswerGroup') }}
|
||||
<el-tag v-if="
|
||||
questionListMap[visit.Id][index].grouping.length > 0 &&
|
||||
questionListMap[visit.Id][index].QuestionGenre !== 3
|
||||
">{{
|
||||
questionListMap[visit.Id][index].grouping.toString().replaceAll(',', '|')
|
||||
}}</el-tag>
|
||||
<el-tag v-if="
|
||||
questionListMap[visit.Id][index].grouping.length > 0 &&
|
||||
questionListMap[visit.Id][index].QuestionGenre === 3
|
||||
">{{
|
||||
questionListMap[visit.Id][index].grouping
|
||||
.map(
|
||||
(v) =>
|
||||
$d[questionListMap[visit.Id][index].DictionaryCode].find(
|
||||
(v1) => v1.value === v
|
||||
).label
|
||||
)
|
||||
.toString()
|
||||
.replaceAll(',', '|')
|
||||
}}</el-tag>
|
||||
<el-button size="mini" type="primary" :disabled="isSign"
|
||||
@click="visitAddGroup2(index, visit.Id)">
|
||||
{{ $t('trials:adRules:title:addGroup') }}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="questionListMap[visit.Id][index].QuestionGenre !== 3" style="margin-top: 20px">
|
||||
{{ $t('trials:adRules:title:group') }}
|
||||
<el-tag v-for="(itemA, indexA) of questionListMap[visit.Id][index].AnswerGroup2List"
|
||||
:key="visit.Id+indexA" closable
|
||||
style="margin-right: 10px" @close="() => visitTagClose2(index, indexA, visit.Id)">{{ itemA }}</el-tag>
|
||||
</div>
|
||||
<div v-if="questionListMap[visit.Id][index].QuestionGenre === 3" style="margin-top: 20px">
|
||||
{{ $t('trials:adRules:title:group') }}
|
||||
<el-tag v-for="(itemA, indexA) of questionListMap[visit.Id][index].AnswerGroup2List"
|
||||
:key="visit.Id+indexA" closable
|
||||
style="margin-right: 10px" @close="() => visitTagClose2(index, indexA, visit.Id)">
|
||||
{{
|
||||
itemA
|
||||
.split('|')
|
||||
.map((v) =>
|
||||
$fd(questionListMap[visit.Id][index].DictionaryCode, parseInt(v))
|
||||
)
|
||||
.join('|')
|
||||
}}
|
||||
</el-tag>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="
|
||||
questionListMap[visit.Id][index].JudgeType === 4 ||
|
||||
questionListMap[visit.Id][index].JudgeType === 5
|
||||
">
|
||||
<el-form :inline="true" :model="questionListMap[visit.Id][index]" class="demo-form-inline"
|
||||
:ref="`JudgeDifferenceValue${questionListMap[visit.Id][index].JudgeType}_${visit.Id}_${index}`"
|
||||
:rules="JudgeDifferenceValueQRules">
|
||||
<el-form-item :label="$t(
|
||||
`trials:trials-panel:setting:reading-unit:JudgeDifferenceType`
|
||||
)
|
||||
" prop="JudgeDifferenceType">
|
||||
<el-select
|
||||
v-model="questionListMap[visit.Id][index].JudgeDifferenceType"
|
||||
:disabled="isSign">
|
||||
<el-option v-for="judgeDiffItem of $d.JudgeDifferenceType" :key="judgeDiffItem.id"
|
||||
:label="judgeDiffItem.label" :value="judgeDiffItem.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t(
|
||||
`trials:trials-panel:setting:reading-unit:JudgeDifferenceValue${questionListMap[visit.Id][index].JudgeType}`
|
||||
)
|
||||
" prop="JudgeDifferenceValue">
|
||||
<div style="display: flex">
|
||||
<el-input v-model="questionListMap[visit.Id][index].JudgeDifferenceValue" clearable
|
||||
:disabled="isSign"></el-input>
|
||||
<span style="margin-left: 10px"
|
||||
v-if="questionListMap[visit.Id][index].JudgeType !== 5 && questionListMap[visit.Id][index].Unit !== 0">
|
||||
{{ `${questionListMap[visit.Id][index].Unit === 4 ? questionListMap[visit.Id][index].CustomUnit : $fd('ValueUnit', questionListMap[visit.Id][index].Unit)}` }}
|
||||
</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-collapse-item>
|
||||
</el-collapse>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<el-dialog v-if="questionVisible" :title="$t('trials:adRules:title:selectAnswer')" :visible.sync="questionVisible"
|
||||
width="800px" :close-on-click-modal="false" custom-class="base-dialog-wrapper" append-to-body>
|
||||
<div class="base-dialog-body">
|
||||
<el-form-item label-width="110px" :label="$t('trials:adRules:title:answerGroupA')">
|
||||
<el-checkbox-group v-model="questionList[selectIndex].groupingA">
|
||||
<template v-for="item of questionList[selectIndex].TypeValue.split('|') || []">
|
||||
<el-checkbox
|
||||
v-if="questionList[selectIndex].QuestionGenre !== 3"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:disabled="questionList[selectIndex]?.groupingB?.includes(item) ?? false"
|
||||
>
|
||||
{{ item }}
|
||||
</el-checkbox>
|
||||
</template>
|
||||
<template v-for="item of $d[questionList[selectIndex].DictionaryCode]">
|
||||
<el-checkbox
|
||||
v-if="questionList[selectIndex].QuestionGenre === 3 && item.value !== -1"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
:disabled="questionList[selectIndex]?.groupingB?.includes(item.value) ?? false"
|
||||
>{{ item.label }}</el-checkbox>
|
||||
</template>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<el-form-item label-width="110px" :label="$t('trials:adRules:title:answerGroupB')">
|
||||
<el-checkbox-group v-model="questionList[selectIndex].groupingB">
|
||||
<template v-for="item of questionList[selectIndex].TypeValue.split('|') || []">
|
||||
<el-checkbox
|
||||
v-if="questionList[selectIndex].QuestionGenre !== 3"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:disabled="questionList[selectIndex]?.groupingA?.includes(item) ?? false"
|
||||
>
|
||||
{{ item }}
|
||||
</el-checkbox>
|
||||
</template>
|
||||
<template v-for="item of $d[questionList[selectIndex].DictionaryCode]">
|
||||
<el-checkbox
|
||||
v-if="questionList[selectIndex].QuestionGenre === 3 && item.value !== -1"
|
||||
:key="item.id"
|
||||
:label="item.value"
|
||||
:disabled="questionList[selectIndex]?.groupingA?.includes(item.value) ?? false"
|
||||
>
|
||||
{{ item.label }}
|
||||
</el-checkbox>
|
||||
</template>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
|
||||
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']" :disabled="btnLoading" size="small"
|
||||
type="primary" @click="
|
||||
questionVisible = false
|
||||
$set(questionList[selectIndex], 'groupingA', [])
|
||||
$set(questionList[selectIndex], 'groupingB', [])
|
||||
">
|
||||
{{ $t('common:button:cancel') }}
|
||||
</el-button>
|
||||
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']" :disabled="btnLoading" size="small"
|
||||
type="primary" @click="save">
|
||||
{{ $t('common:button:save') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<el-dialog
|
||||
v-if="copyVisible"
|
||||
:title="$t('common:button:copy')"
|
||||
:visible.sync="copyVisible"
|
||||
width="500px"
|
||||
:close-on-click-modal="false"
|
||||
custom-class="base-dialog-wrapper"
|
||||
append-to-body
|
||||
>
|
||||
<div class="base-dialog-body">
|
||||
<el-form label-width="100px">
|
||||
<el-form-item :label="$t('trials:trials-panel:setting:reading-unit:targetVisitNum')">
|
||||
<el-select v-model="copySourceVisitNum" style="width: 100%" filterable>
|
||||
<el-option
|
||||
v-for="visit in copySourceVisitOptions"
|
||||
:key="visit.Id"
|
||||
:label="visit.VisitName"
|
||||
:value="visit.VisitNum"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
|
||||
<el-button
|
||||
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
:disabled="btnLoading"
|
||||
size="small"
|
||||
@click="closeCopyDialog"
|
||||
>
|
||||
{{ $t('common:button:cancel') }}
|
||||
</el-button>
|
||||
<el-button
|
||||
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
|
||||
:disabled="btnLoading"
|
||||
:loading="btnLoading"
|
||||
size="small"
|
||||
type="primary"
|
||||
@click="confirmCopy"
|
||||
>
|
||||
{{ $t('common:button:confirm') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
/* eslint-disable */
|
||||
import {
|
||||
getTrialQuestionVisitJudgeRule,
|
||||
setTrialQuestionVisitJudgeRule,
|
||||
copyTrialQuestionVisitJudgeRule,
|
||||
applyBaseLineTrialQuestionVisitJudgeRule
|
||||
} from '@/api/trials/reading'
|
||||
import { getTrialVisitStageSelect } from '@/api/trials'
|
||||
|
||||
export default {
|
||||
props: {
|
||||
trialReadingCriterionId: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
isSign: {
|
||||
type: Boolean,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
btnLoading: false,
|
||||
loading: false,
|
||||
activeVisitTab: '',
|
||||
visitActiveNamesMap: {},
|
||||
questionListMap: {},
|
||||
visitPlanOptions: [],
|
||||
questionVisible: false,
|
||||
copyVisible: false,
|
||||
copyTargetVisitNum: null,
|
||||
copySourceVisitNum: null,
|
||||
selectIndex: 0,
|
||||
indexA: null,
|
||||
selectVisitKey: '',
|
||||
type: null,
|
||||
OtherInfo: {
|
||||
IsSign: true,
|
||||
},
|
||||
JudgeDifferenceValueQRules: {
|
||||
JudgeDifferenceType: [
|
||||
{
|
||||
required: true,
|
||||
message: this.$t(
|
||||
'trials:trials-list:setitng:JudgeDifferenceTypeRequired'
|
||||
),
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
JudgeDifferenceValue: [
|
||||
{
|
||||
required: true,
|
||||
message: this.$t(
|
||||
'trials:trials-list:setitng:JudgeDifferenceValueRequired'
|
||||
),
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
pattern: /^[0-9]+(.[0-9]{2})?$/,
|
||||
message: this.$t('trials:trials-list:setitng:JudgeDifferenceValue'),
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value <= 0) {
|
||||
callback(
|
||||
new Error(
|
||||
this.$t(
|
||||
'trials:trials-list:setitng:JudgeDifferenceValueMin'
|
||||
)
|
||||
)
|
||||
)
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
questionList() {
|
||||
return this.questionListMap[this.selectVisitKey]
|
||||
},
|
||||
copySourceVisitOptions() {
|
||||
return this.visitPlanOptions.filter((visit) => visit.VisitNum !== this.copyTargetVisitNum)
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
async activeVisitTab(v) {
|
||||
if (!v) return
|
||||
if (this.questionListMap[v]) {
|
||||
return
|
||||
}
|
||||
await this.getList(v)
|
||||
},
|
||||
},
|
||||
async mounted() {
|
||||
await this.initData()
|
||||
},
|
||||
methods: {
|
||||
async initData() {
|
||||
this.questionListMap = {}
|
||||
this.visitActiveNamesMap = {}
|
||||
this.activeVisitTab = ''
|
||||
await this.getVisitPlanOptions()
|
||||
},
|
||||
resetVisitJudgeTypeRelatedFields(question = {}) {
|
||||
this.$set(question, 'AnswerGroup2List', [])
|
||||
this.$set(question, 'AnswerGroupList', [])
|
||||
this.$set(question, 'grouping', [])
|
||||
this.$set(question, 'groupingA', [])
|
||||
this.$set(question, 'groupingB', [])
|
||||
this.$set(question, 'JudgeDifferenceValue', null)
|
||||
this.$set(question, 'JudgeDifferenceType', 0)
|
||||
},
|
||||
normalizeQuestionList(questionList = []) {
|
||||
return questionList.map((item) => ({
|
||||
...item,
|
||||
grouping: [],
|
||||
groupingA: [],
|
||||
groupingB: [],
|
||||
AnswerGroupList: Array.isArray(item.AnswerCombination)
|
||||
? item.AnswerCombination.map((group) => ({
|
||||
...group,
|
||||
AnswerGroupA: Array.isArray(group.AnswerGroupA)
|
||||
? [...group.AnswerGroupA]
|
||||
: group.AnswerGroupA,
|
||||
AnswerGroupB: Array.isArray(group.AnswerGroupB)
|
||||
? [...group.AnswerGroupB]
|
||||
: group.AnswerGroupB
|
||||
}))
|
||||
: [],
|
||||
AnswerGroup2List: Array.isArray(item.AnswerGroup)
|
||||
? [...item.AnswerGroup]
|
||||
: []
|
||||
}))
|
||||
},
|
||||
closeCopyDialog() {
|
||||
this.copyVisible = false
|
||||
this.copyTargetVisitNum = null
|
||||
this.copySourceVisitNum = null
|
||||
},
|
||||
async getVisitPlanOptions() {
|
||||
try {
|
||||
const trialId = this.$route.query.trialId
|
||||
const res = await getTrialVisitStageSelect(trialId)
|
||||
if (res.IsSuccess) {
|
||||
this.visitPlanOptions = res.Result || []
|
||||
if (!this.activeVisitTab && this.visitPlanOptions.length > 0) {
|
||||
this.activeVisitTab = this.visitPlanOptions[0].Id
|
||||
}
|
||||
const outOfPlan = {
|
||||
"Id": "00000000-0000-0000-0000-000000000000",
|
||||
"VisitNum": -1,
|
||||
"VisitName": "Out of Plan",
|
||||
"IsBaseLine": false
|
||||
}
|
||||
const isExists = this.visitPlanOptions.some(x => x.Id === outOfPlan.Id);
|
||||
if (!isExists) {
|
||||
this.visitPlanOptions.push(outOfPlan);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
getVisitById(visitKey) {
|
||||
return this.visitPlanOptions.find((visit) => visit.Id === visitKey)
|
||||
},
|
||||
async getList(visitKey = this.activeVisitTab) {
|
||||
const visit = this.getVisitById(visitKey)
|
||||
if (!visit) return
|
||||
try {
|
||||
this.loading = true
|
||||
let params = {
|
||||
trialId: this.$route.query.trialId,
|
||||
trialReadingCriterionId: this.trialReadingCriterionId,
|
||||
visitNum: visit.VisitNum
|
||||
}
|
||||
const res = await getTrialQuestionVisitJudgeRule(params)
|
||||
const questionList = this.normalizeQuestionList(res.Result)
|
||||
this.$set(this.questionListMap, visitKey, questionList)
|
||||
this.$set(
|
||||
this.visitActiveNamesMap,
|
||||
visitKey,
|
||||
questionList.map((item) => item.ReadingQuestionTrialId)
|
||||
)
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
changeArbitrationRule(value) {
|
||||
if (value !== 1) {
|
||||
Object.values(this.questionListMap).forEach((questionList) => {
|
||||
questionList.forEach((item) => {
|
||||
item.JudgeDifferenceValue = 0
|
||||
item.JudgeDifferenceType = 0
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
visitJudgeTypeChange(value, index, visitKey) {
|
||||
this.resetVisitJudgeTypeRelatedFields(this.questionListMap[visitKey][index])
|
||||
this.$nextTick(() => {
|
||||
if (value === 4 || value === 5) {
|
||||
const refName = `JudgeDifferenceValue${value}_${visitKey}_${index}`
|
||||
if (this.$refs[refName] && this.$refs[refName][0]) {
|
||||
this.$refs[refName][0].resetFields()
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// async saveAllSync(showMessage = false) {
|
||||
// try {
|
||||
// this.btnLoading = true
|
||||
// this.loading = true
|
||||
// for (let i = 0; i < this.visitPlanOptions.length; i++) {
|
||||
// const visit = this.visitPlanOptions[i]
|
||||
// if (!this.questionListMap[visit.Id]) {
|
||||
// await this.getList(visit.Id)
|
||||
// }
|
||||
// const questionList = this.questionListMap[visit.Id] || []
|
||||
// if (questionList.length === 0) {
|
||||
// continue
|
||||
// }
|
||||
// for (let index = 0; index < questionList.length; index++) {
|
||||
// if (questionList[index].JudgeType === 0) {
|
||||
// this.activeVisitTab = visit.Id
|
||||
// this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
// return false
|
||||
// }
|
||||
// if (
|
||||
// questionList[index].JudgeType === 2 &&
|
||||
// questionList[index].AnswerGroup2List.length === 0
|
||||
// ) {
|
||||
// this.activeVisitTab = visit.Id
|
||||
// this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
// return false
|
||||
// }
|
||||
// if (
|
||||
// questionList[index].JudgeType === 3 &&
|
||||
// questionList[index].AnswerGroupList.length === 0
|
||||
// ) {
|
||||
// this.activeVisitTab = visit.Id
|
||||
// this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
// return false
|
||||
// }
|
||||
// if (
|
||||
// questionList[index].JudgeType === 4 ||
|
||||
// questionList[index].JudgeType === 5
|
||||
// ) {
|
||||
// this.activeVisitTab = visit.Id
|
||||
// await this.$nextTick()
|
||||
// const refName = `JudgeDifferenceValue${questionList[index].JudgeType}_${visit.Id}_${index}`
|
||||
// try {
|
||||
// const validate = await this.$refs[refName][0].validate()
|
||||
// if (!validate) return false
|
||||
// } catch (err) {
|
||||
// return false
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// let params = {
|
||||
// TrialReadingCriterionId: this.trialReadingCriterionId,
|
||||
// VisitNum: visit.VisitNum,
|
||||
// QuestionList: questionList.map((item) => {
|
||||
// return {
|
||||
// ReadingQuestionTrialId: item.ReadingQuestionTrialId,
|
||||
// AnswerGroup: item.AnswerGroup2List,
|
||||
// AnswerCombination: item.AnswerGroupList,
|
||||
// JudgeType: item.JudgeType,
|
||||
// JudgeDifferenceValue: item.JudgeDifferenceValue,
|
||||
// JudgeDifferenceType: item.JudgeDifferenceType
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
// let res = await setTrialQuestionVisitJudgeRule(params)
|
||||
// if (!res.IsSuccess) {
|
||||
// return false
|
||||
// }
|
||||
// }
|
||||
// if (showMessage) {
|
||||
// this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||
// }
|
||||
// return true
|
||||
// } catch (e) {
|
||||
// console.log(e)
|
||||
// return false
|
||||
// } finally {
|
||||
// this.btnLoading = false
|
||||
// this.loading = false
|
||||
// }
|
||||
// },
|
||||
async handleBatchSave(visitKey, visitNum) {
|
||||
if (!visitKey) return
|
||||
const questionList = this.questionListMap[visitKey] || []
|
||||
if (questionList.length === 0) return
|
||||
try {
|
||||
this.btnLoading = true
|
||||
this.loading = true
|
||||
for (let index = 0; index < questionList.length; index++) {
|
||||
if (questionList[index].JudgeType === 0) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
return
|
||||
}
|
||||
if (
|
||||
questionList[index].JudgeType === 2 &&
|
||||
questionList[index].AnswerGroup2List.length === 0
|
||||
) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
return
|
||||
}
|
||||
if (
|
||||
questionList[index].JudgeType === 3 &&
|
||||
questionList[index].AnswerGroupList.length === 0
|
||||
) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
return
|
||||
}
|
||||
if (
|
||||
questionList[index].JudgeType === 4 ||
|
||||
questionList[index].JudgeType === 5
|
||||
) {
|
||||
await this.$nextTick()
|
||||
const refName = `JudgeDifferenceValue${questionList[index].JudgeType}_${visitKey}_${index}`
|
||||
try {
|
||||
const validate = await this.$refs[refName][0].validate()
|
||||
if (!validate) return
|
||||
} catch (err) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
let params = {
|
||||
TrialReadingCriterionId: this.trialReadingCriterionId,
|
||||
VisitNum: visitNum,
|
||||
QuestionList: questionList.map((item) => {
|
||||
return {
|
||||
ReadingQuestionTrialId: item.ReadingQuestionTrialId,
|
||||
AnswerGroup: item.AnswerGroup2List,
|
||||
AnswerCombination: item.AnswerGroupList,
|
||||
JudgeType: item.JudgeType,
|
||||
JudgeDifferenceValue: item.JudgeDifferenceValue,
|
||||
JudgeDifferenceType: item.JudgeDifferenceType
|
||||
}
|
||||
})
|
||||
}
|
||||
let res = await setTrialQuestionVisitJudgeRule(params)
|
||||
if (res.IsSuccess) {
|
||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.btnLoading = false
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
save() {
|
||||
const questionList = this.questionList
|
||||
let index = this.selectIndex
|
||||
let indexA = this.indexA
|
||||
if (questionList[index].groupingA.length === 0) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg2'))
|
||||
return
|
||||
}
|
||||
if (questionList[index].groupingB.length === 0) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg3'))
|
||||
return
|
||||
}
|
||||
if (this.type === 'add') {
|
||||
questionList[index].AnswerGroupList.push({
|
||||
AnswerGroupA: questionList[index].groupingA,
|
||||
AnswerGroupB: questionList[index].groupingB
|
||||
})
|
||||
} else {
|
||||
this.$set(
|
||||
questionList[index].AnswerGroupList[indexA],
|
||||
'AnswerGroupA',
|
||||
questionList[index].groupingA
|
||||
)
|
||||
this.$set(
|
||||
questionList[index].AnswerGroupList[indexA],
|
||||
'AnswerGroupB',
|
||||
questionList[index].groupingB
|
||||
)
|
||||
}
|
||||
this.$set(questionList[index], 'groupingA', [])
|
||||
this.$set(questionList[index], 'groupingB', [])
|
||||
this.$message.success(this.$t('trials:adRules:message:msg4'))
|
||||
this.questionVisible = false
|
||||
},
|
||||
handleCopy(visitNum) {
|
||||
this.copyTargetVisitNum = visitNum
|
||||
this.copyVisible = true
|
||||
},
|
||||
async confirmCopy() {
|
||||
if (!this.copySourceVisitNum) {
|
||||
this.$alert(this.$t('trials:setting:reading-unit:msg1'))
|
||||
return
|
||||
}
|
||||
try {
|
||||
this.btnLoading = true
|
||||
this.loading = true
|
||||
const params = {
|
||||
trialReadingCriterionId: this.trialReadingCriterionId,
|
||||
sourceVisitNum: this.copySourceVisitNum,
|
||||
targetVisitNum: this.copyTargetVisitNum
|
||||
}
|
||||
const res = await copyTrialQuestionVisitJudgeRule(params)
|
||||
if (res.IsSuccess) {
|
||||
await this.getList(this.activeVisitTab)
|
||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||
this.closeCopyDialog()
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.btnLoading = false
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
async applyToFollowup() {
|
||||
try {
|
||||
await this.$confirm(
|
||||
this.$t('trials:adRules:message:msg10'),
|
||||
{
|
||||
type: 'warning',
|
||||
distinguishCancelAndClose: true,
|
||||
}
|
||||
)
|
||||
this.btnLoading = true
|
||||
this.loading = true
|
||||
const res = await applyBaseLineTrialQuestionVisitJudgeRule({
|
||||
trialReadingCriterionId: this.trialReadingCriterionId
|
||||
})
|
||||
if (res.IsSuccess) {
|
||||
this.questionListMap = {}
|
||||
this.visitActiveNamesMap = {}
|
||||
if (this.activeVisitTab) {
|
||||
await this.getList(this.activeVisitTab)
|
||||
}
|
||||
this.$message.success(this.$t('trials:adRules:message:msg9'))
|
||||
}
|
||||
} catch (e) {
|
||||
if (e === 'cancel') return
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.btnLoading = false
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
visitTagClose2(index, indexA, visitKey) {
|
||||
this.$confirm(this.$t('trials:adRules:message:msg1')).then(() => {
|
||||
this.questionListMap[visitKey][index].AnswerGroup2List.splice(indexA, 1)
|
||||
})
|
||||
},
|
||||
visitTagClose(index, indexA, visitKey) {
|
||||
this.$confirm(this.$t('trials:adRules:message:msg1')).then(() => {
|
||||
this.questionListMap[visitKey][index].AnswerGroupList.splice(indexA, 1)
|
||||
})
|
||||
},
|
||||
visitAddGroup2(index, visitKey) {
|
||||
const questionList = this.questionListMap[visitKey]
|
||||
if (questionList[index].grouping.length === 0) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg5'))
|
||||
return
|
||||
}
|
||||
let grouping = questionList[index].grouping
|
||||
.toString()
|
||||
.replaceAll(',', '|')
|
||||
questionList[index].AnswerGroup2List.push(`|${grouping}|`)
|
||||
this.$set(questionList[index], 'grouping', [])
|
||||
},
|
||||
visitAddGroup(index, indexA, visitKey) {
|
||||
const questionList = this.questionListMap[visitKey]
|
||||
this.selectIndex = index
|
||||
this.selectVisitKey = visitKey
|
||||
this.type = 'add'
|
||||
if (indexA !== null) {
|
||||
this.indexA = indexA
|
||||
this.type = 'edit'
|
||||
this.$set(
|
||||
questionList[index],
|
||||
'groupingA',
|
||||
questionList[index].AnswerGroupList[indexA].AnswerGroupA
|
||||
)
|
||||
this.$set(
|
||||
questionList[index],
|
||||
'groupingB',
|
||||
questionList[index].AnswerGroupList[indexA].AnswerGroupB
|
||||
)
|
||||
}
|
||||
this.questionVisible = true
|
||||
},
|
||||
async visitReset(ReadingQuestionTrialId, index, visitKey, visitNum) {
|
||||
const questionList = this.questionListMap[visitKey]
|
||||
this.btnLoading = true
|
||||
this.loading = true
|
||||
try {
|
||||
await this.$confirm(this.$t('trials:adRules:message:msg6'))
|
||||
const params = {
|
||||
TrialReadingCriterionId: this.trialReadingCriterionId,
|
||||
VisitNum: visitNum,
|
||||
QuestionList: [
|
||||
{
|
||||
ReadingQuestionTrialId: ReadingQuestionTrialId,
|
||||
AnswerGroup: [],
|
||||
AnswerCombination: [],
|
||||
JudgeType: 0,
|
||||
JudgeDifferenceValue: 0,
|
||||
JudgeDifferenceType: 0
|
||||
}
|
||||
]
|
||||
}
|
||||
await setTrialQuestionVisitJudgeRule(params)
|
||||
this.$set(questionList[index], 'AnswerGroup2List', [])
|
||||
this.$set(questionList[index], 'AnswerGroupList', [])
|
||||
this.$set(questionList[index], 'JudgeType', 0)
|
||||
this.$set(questionList[index], 'JudgeDifferenceValue', 0)
|
||||
this.$set(questionList[index], 'JudgeDifferenceType', 0)
|
||||
|
||||
this.$message.success(this.$t('trials:adRules:message:msg7'))
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.btnLoading = false
|
||||
this.loading = false
|
||||
}
|
||||
},
|
||||
async visitApply(ReadingQuestionTrialId, index, visitKey, visitNum) {
|
||||
try {
|
||||
const questionList = this.questionListMap[visitKey]
|
||||
if (questionList[index].JudgeType === 0) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
return
|
||||
}
|
||||
if (
|
||||
questionList[index].JudgeType === 2 &&
|
||||
questionList[index].AnswerGroup2List.length === 0
|
||||
) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
return
|
||||
}
|
||||
if (
|
||||
questionList[index].JudgeType === 3 &&
|
||||
questionList[index].AnswerGroupList.length === 0
|
||||
) {
|
||||
this.$alert(this.$t('trials:adRules:message:msg8'))
|
||||
return
|
||||
}
|
||||
if (
|
||||
questionList[index].JudgeType === 4 ||
|
||||
questionList[index].JudgeType === 5
|
||||
) {
|
||||
const refName = `JudgeDifferenceValue${questionList[index].JudgeType}_${visitKey}_${index}`
|
||||
const validate = await this.$refs[refName][0].validate()
|
||||
if (!validate) return
|
||||
}
|
||||
this.btnLoading = true
|
||||
this.loading = true
|
||||
let params = {
|
||||
TrialReadingCriterionId: this.trialReadingCriterionId,
|
||||
VisitNum: visitNum,
|
||||
QuestionList: [
|
||||
{
|
||||
ReadingQuestionTrialId: ReadingQuestionTrialId,
|
||||
AnswerGroup: questionList[index].AnswerGroup2List,
|
||||
AnswerCombination: questionList[index].AnswerGroupList,
|
||||
JudgeType: questionList[index].JudgeType,
|
||||
JudgeDifferenceValue: questionList[index].JudgeDifferenceValue,
|
||||
JudgeDifferenceType: questionList[index].JudgeDifferenceType
|
||||
}
|
||||
]
|
||||
}
|
||||
let res = await setTrialQuestionVisitJudgeRule(params)
|
||||
if (res.IsSuccess) {
|
||||
this.$message.success(this.$t('trials:adRules:message:msg9'))
|
||||
}
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
this.btnLoading = false
|
||||
this.loading = false
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.visit-tabs-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
margin-bottom: 10px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.visit-tabs ::v-deep .el-tabs__content {
|
||||
min-height: 520px;
|
||||
padding-top: 20px !important;
|
||||
}
|
||||
</style>
|
||||
@@ -761,7 +761,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
@@ -197,7 +197,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
@@ -240,7 +240,6 @@ export default {
|
||||
if (ReadingTool === 3) {
|
||||
this.readingSegmentTools = getCustomizeStandardsSegmentDicomTools(readingSegmentTools)
|
||||
}
|
||||
console.log(this.readingSegmentTools, 'this.readingSegmentTools')
|
||||
},
|
||||
setIsClinicalReading(isClinicalReading) {
|
||||
this.isClinicalReading = isClinicalReading;
|
||||
@@ -300,11 +299,15 @@ export default {
|
||||
this.$refs["arbitrationRules" + this.TrialReadingCriterionId]
|
||||
.length
|
||||
) {
|
||||
var arbitrationRules = await this.$refs[
|
||||
const arbitrationRulesRef = this.$refs[
|
||||
"arbitrationRules" + this.TrialReadingCriterionId
|
||||
][0].saveAllSync();
|
||||
][0];
|
||||
var judgeRuleSaved = await arbitrationRulesRef.saveJugeRule(false);
|
||||
var arbitrationRules = judgeRuleSaved
|
||||
? await arbitrationRulesRef.saveAllSync()
|
||||
: false;
|
||||
isCheckList.push({
|
||||
isCheck: arbitrationRules,
|
||||
isCheck: judgeRuleSaved && arbitrationRules,
|
||||
msg: this.$t("trials:readingUnit:adRules"), // '仲裁规则'
|
||||
});
|
||||
}
|
||||
@@ -448,9 +451,6 @@ export default {
|
||||
this.$refs[
|
||||
"arbitrationRules" + this.TrialReadingCriterionId
|
||||
][0].getList();
|
||||
this.$refs[
|
||||
"arbitrationRules" + this.TrialReadingCriterionId
|
||||
][0].getTrialJudgyInfo();
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
+2
-1
@@ -135,7 +135,8 @@ module.exports = defineConfig({
|
||||
test: /\.wasm$/,
|
||||
type: 'asset/resource'
|
||||
}
|
||||
]
|
||||
],
|
||||
exprContextCritical: false,
|
||||
},
|
||||
optimization: {
|
||||
splitChunks: {
|
||||
|
||||
Reference in New Issue
Block a user