Merge branch 'uat'
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
# Conflicts: # src/components/clinicalDataQuestions/components/QuestionFormItem.vue # src/components/clinicalDataQuestions/components/QuestionsForm.vue # src/components/clinicalDataQuestions/index.vue # src/views/trials/trials-panel/visit/qc-check/components/qualityAssurance.vue # src/views/trials/trials-panel/visit/qc-check/components/questions.vuemain
commit
34cc69abb0
|
@ -75,10 +75,11 @@ export function getRelationVisitList(visitNum, tpCode) {
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export function getAllRelationStudyList(studyId) {
|
export function getAllRelationStudyList(studyId, params) {
|
||||||
return request({
|
return request({
|
||||||
url: `/study/getAllRelationStudyList/${studyId}`,
|
url: `/study/getAllRelationStudyList/${studyId}`,
|
||||||
method: 'get'
|
method: 'get',
|
||||||
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export function getTrialListByReviewer(param) {
|
export function getTrialListByReviewer(param) {
|
||||||
|
@ -134,7 +135,7 @@ export function AddAdjudicationReport(param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getVisitStudyList(trialId, subjectVisitId, isReading, visitTaskId) {
|
export function getVisitStudyList(trialId, subjectVisitId, isReading, visitTaskId) {
|
||||||
let url = `/SubjectVisit/getVisitStudyList/${trialId}/${subjectVisitId}/${isReading}`
|
let url = `/SubjectVisit/getVisitStudyList/${trialId}/${subjectVisitId}/${isReading}`
|
||||||
url = visitTaskId ? `${url}?visitTaskId=${visitTaskId}` : url
|
url = visitTaskId ? `${url}?visitTaskId=${visitTaskId}` : url
|
||||||
return request({
|
return request({
|
||||||
url: url,
|
url: url,
|
||||||
|
|
|
@ -969,13 +969,20 @@ export function takeOrReleaseQCTask(trialId, subjectVisitId, obtainOrCancel) {
|
||||||
method: 'put'
|
method: 'put'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export function replaceQCTaskActionUser(trialId, subjectVisitId) {
|
export function replaceQCTaskActionUser(trialId, subjectVisitId, params = {}) {
|
||||||
return request({
|
return request({
|
||||||
url: `/QCOperation/replaceQCTaskActionUser/${trialId}/${subjectVisitId}`,
|
url: `/QCOperation/replaceQCTaskActionUser/${trialId}/${subjectVisitId}`,
|
||||||
method: 'put'
|
method: 'put',
|
||||||
|
params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export function getTrialUserRoleList(params) {
|
||||||
|
return request({
|
||||||
|
url: `/TrialMaintenance/getTrialUserRoleList`,
|
||||||
|
method: 'get',
|
||||||
|
params
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function verifyReuploadIsCanJump(trialId, qcChallengeId) {
|
export function verifyReuploadIsCanJump(trialId, qcChallengeId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/QCOperation/verifyReuploadIsCanJump/${trialId}/${qcChallengeId}`,
|
url: `/QCOperation/verifyReuploadIsCanJump/${trialId}/${qcChallengeId}`,
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 6.1 KiB |
|
@ -122,7 +122,7 @@ export default {
|
||||||
components: { DicomTags },
|
components: { DicomTags },
|
||||||
computed: {
|
computed: {
|
||||||
NSTip() {
|
NSTip() {
|
||||||
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
|
return `${this.$store.state.trials.uploadSize}, NS: ${this.$store.state.trials.uploadTip}`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
{{ question.QuestionName }}
|
{{ question.QuestionName }}
|
||||||
</span>
|
</span>
|
||||||
<!-- 添加 -->
|
<!-- 添加 -->
|
||||||
<el-button type="primary" size="mini" @click="openAddTableCol(question)">
|
<el-button type="primary" size="mini" @click="openAddTableCol(question)" v-if="SecondReviewState <= 0">
|
||||||
{{ $t('trials:readingUnit:qsList:title:add') }}
|
{{ $t('trials:readingUnit:qsList:title:add') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,7 +29,8 @@
|
||||||
: scope.row[item.Id] }}
|
: scope.row[item.Id] }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :label="$t('common:action:action')" min-width="100" show-overflow-tooltip>
|
<el-table-column :label="$t('common:action:action')" min-width="100" show-overflow-tooltip
|
||||||
|
v-if="SecondReviewState <= 0">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button type="text" size="mini" @click="openAddTableCol(question, scope.$index)">
|
<el-button type="text" size="mini" @click="openAddTableCol(question, scope.$index)">
|
||||||
{{ $t('common:button:edit') }}
|
{{ $t('common:button:edit') }}
|
||||||
|
@ -164,7 +165,6 @@
|
||||||
import { getTrialClinicalQuestionCalculateRelation } from '@/api/dictionary'
|
import { getTrialClinicalQuestionCalculateRelation } from '@/api/dictionary'
|
||||||
import QuestionTableFormItem from './QuestionTableFormItem'
|
import QuestionTableFormItem from './QuestionTableFormItem'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import DicomEvent from "../../../views/trials/trials-panel/reading/dicoms/components/DicomEvent";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'QuestionFormItem',
|
name: 'QuestionFormItem',
|
||||||
|
@ -176,6 +176,10 @@ export default {
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
SecondReviewState: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
questionForm: {
|
questionForm: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default() {
|
default() {
|
||||||
|
|
|
@ -4,11 +4,12 @@
|
||||||
:disabled="openType === 'look'">
|
:disabled="openType === 'look'">
|
||||||
<template>
|
<template>
|
||||||
<QuestionFormItem class="father" v-for="question of questions" :key="question.Id" :question="question"
|
<QuestionFormItem class="father" v-for="question of questions" :key="question.Id" :question="question"
|
||||||
:question-form="questionForm" :trial-clinical-id="trialClinicalId" @resetFormItemData="resetFormItemData"
|
:question-form="questionForm" :trial-clinical-id="trialClinicalId" :SecondReviewState="SecondReviewState"
|
||||||
@setFormItemData="setFormItemData" />
|
@resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData" />
|
||||||
</template>
|
</template>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div class="base-dialog-footer" v-if="!isViewer && openType !== 'look' && [2, 3].includes(clinicalDataLevel)"
|
<div class="base-dialog-footer"
|
||||||
|
v-if="!isViewer && openType !== 'look' && [2, 3].includes(clinicalDataLevel) && SecondReviewState <= 0"
|
||||||
style="text-align:right;margin-top:10px;">
|
style="text-align:right;margin-top:10px;">
|
||||||
<!-- 取消 -->
|
<!-- 取消 -->
|
||||||
<el-button size="small" type="primary" @click="close"
|
<el-button size="small" type="primary" @click="close"
|
||||||
|
@ -55,6 +56,10 @@ export default {
|
||||||
return 2
|
return 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
SecondReviewState: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
openType: {
|
openType: {
|
||||||
type: String,
|
type: String,
|
||||||
},
|
},
|
||||||
|
|
|
@ -3,11 +3,13 @@
|
||||||
<QuestionsForm v-if="clinicalUploadType === 2" :data="data" :trial-clinical-id="trialClinicalId"
|
<QuestionsForm v-if="clinicalUploadType === 2" :data="data" :trial-clinical-id="trialClinicalId"
|
||||||
:is-viewer="isViewer" :visit-id="visitId" :subject-id="subjectId" :open-type="openType"
|
:is-viewer="isViewer" :visit-id="visitId" :subject-id="subjectId" :open-type="openType"
|
||||||
:system-clinical-id="systemClinicalId" :trial-id="trialId" :reading-id="readingId"
|
:system-clinical-id="systemClinicalId" :trial-id="trialId" :reading-id="readingId"
|
||||||
:clinical-form-id="clinicalFormId" :clinical-data-level="clinicalDataLevel" @close="close"></QuestionsForm>
|
:clinical-form-id="clinicalFormId" :SecondReviewState="SecondReviewState" :clinical-data-level="clinicalDataLevel"
|
||||||
<uploadClinicalData v-else :subject-visit-id="subjectVisitId" :data="data" :enum-type="0" :allow-add-or-edit="true"
|
@close="close"></QuestionsForm>
|
||||||
@getList="() => { }">
|
<uploadClinicalData v-else :subject-visit-id="subjectVisitId" :SecondReviewState="SecondReviewState" :data="data"
|
||||||
|
:enum-type="0" :allow-add-or-edit="true" @getList="() => { }">
|
||||||
</uploadClinicalData>
|
</uploadClinicalData>
|
||||||
<div class="base-dialog-footer" v-if="!isViewer && openType !== 'look' && [0, 1].includes(clinicalDataLevel)"
|
<div class="base-dialog-footer"
|
||||||
|
v-if="!isViewer && openType !== 'look' && [0, 1].includes(clinicalDataLevel) && SecondReviewState <= 0"
|
||||||
style="text-align:right;margin-top:10px;">
|
style="text-align:right;margin-top:10px;">
|
||||||
<!-- 保存 -->
|
<!-- 保存 -->
|
||||||
<el-button size="small" type="primary" @click="submitClinicalForm">
|
<el-button size="small" type="primary" @click="submitClinicalForm">
|
||||||
|
@ -92,6 +94,10 @@ export default {
|
||||||
type: String,
|
type: String,
|
||||||
default: () => ''
|
default: () => ''
|
||||||
},
|
},
|
||||||
|
SecondReviewState: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
clinicalUploadType: {
|
clinicalUploadType: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: () => {
|
default: () => {
|
||||||
|
|
|
@ -245,13 +245,13 @@ export default {
|
||||||
if (this.IsDicom) {
|
if (this.IsDicom) {
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
routeData = this.$router.resolve({
|
routeData = this.$router.resolve({
|
||||||
path: `/showdicom?studyId=${row.Id}&TokenKey=${token}&type=Study&visitTaskId=${this.visitTaskId}`,
|
path: `/showdicom?studyId=${row.Id}&TokenKey=${token}&type=Study&visitTaskId=${this.visitTaskId}&isReading=true`,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
let trialId = this.$route.query.trialId
|
let trialId = this.$route.query.trialId
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
routeData = this.$router.resolve({
|
routeData = this.$router.resolve({
|
||||||
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${row.SourceSubjectVisitId}&studyId=${row.Id}&TokenKey=${token}`,
|
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${row.SourceSubjectVisitId}&studyId=${row.Id}&TokenKey=${token}&isReading=true`,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
window.open(routeData.href, '_blank')
|
window.open(routeData.href, '_blank')
|
||||||
|
|
|
@ -29,6 +29,10 @@ export default {
|
||||||
MedicalAudit: 215, // 医学审核
|
MedicalAudit: 215, // 医学审核
|
||||||
HeavyReadingApproval: 216, // 重阅审批
|
HeavyReadingApproval: 216, // 重阅审批
|
||||||
ResetAndAsyncCriterion: 218, //同步签名
|
ResetAndAsyncCriterion: 218, //同步签名
|
||||||
|
ResetImageQualityControlQuestion: 112, // 重置影像质控问题
|
||||||
|
CreateReviewTask: 113, // 生成复核任务
|
||||||
|
ReviewImageQualityControlQuestion: 219, // 复核质控问题
|
||||||
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { getCustomTag } from '@/api/reading'
|
||||||
|
|
||||||
import requestPoolManager from '@/utils/request-pool'
|
import requestPoolManager from '@/utils/request-pool'
|
||||||
import { getReadingVisitStudyList } from '@/api/trials'
|
import { getReadingVisitStudyList } from '@/api/trials'
|
||||||
import { getNetWorkSpeed, setNetWorkSpeedSize, workSpeedclose } from "@/utils"
|
import { getNetWorkSpeed, setNetWorkSpeedSizeAll, workSpeedclose } from "@/utils"
|
||||||
const hangingAgreement = [
|
const hangingAgreement = [
|
||||||
{ name: 'A', row: 1, col: 1 },
|
{ name: 'A', row: 1, col: 1 },
|
||||||
{ name: 'A|A', row: 1, col: 2 },
|
{ name: 'A|A', row: 1, col: 2 },
|
||||||
|
@ -1076,7 +1076,7 @@ const actions = {
|
||||||
let file = series.instanceInfoList.find(item => item.ImageId === obj.imageId)
|
let file = series.instanceInfoList.find(item => item.ImageId === obj.imageId)
|
||||||
if (file) {
|
if (file) {
|
||||||
getNetWorkSpeed()
|
getNetWorkSpeed()
|
||||||
setNetWorkSpeedSize(obj.percentComplete, file.FileSize, obj.imageId)
|
setNetWorkSpeedSizeAll(obj.percentComplete, obj.FileTotal, obj.imageId)
|
||||||
}
|
}
|
||||||
if (prefetchInstanceCount >= instanceCount * 100) {
|
if (prefetchInstanceCount >= instanceCount * 100) {
|
||||||
series.prefetchInstanceCount = instanceCount * 100
|
series.prefetchInstanceCount = instanceCount * 100
|
||||||
|
|
|
@ -105,12 +105,14 @@ export function formatSize(size, fixed = 2) {
|
||||||
|
|
||||||
let timer = null, // 网速定时器
|
let timer = null, // 网速定时器
|
||||||
lastPercentage = 0,
|
lastPercentage = 0,
|
||||||
|
percentageById = {},
|
||||||
imageId = null,
|
imageId = null,
|
||||||
bytesReceivedPerSecond = {}; // 时间节点上传文件总量
|
bytesReceivedPerSecond = {}; // 时间节点上传文件总量
|
||||||
// 获取网速
|
// 获取网速
|
||||||
export function getNetWorkSpeed() {
|
export function getNetWorkSpeed() {
|
||||||
if (timer) return false;
|
if (timer) return false;
|
||||||
if (lastPercentage < 100) return false;
|
// if (lastPercentage < 100) return false;
|
||||||
|
if (imageId && imageId !== Id) return false
|
||||||
imageId = null
|
imageId = null
|
||||||
timer = setInterval(() => {
|
timer = setInterval(() => {
|
||||||
let timeList = Object.keys(bytesReceivedPerSecond).sort((a, b) => a - b);
|
let timeList = Object.keys(bytesReceivedPerSecond).sort((a, b) => a - b);
|
||||||
|
@ -135,8 +137,9 @@ export function setNetWorkSpeedSize(totalPercentage, total, Id) {
|
||||||
if (imageId && imageId !== Id) return false
|
if (imageId && imageId !== Id) return false
|
||||||
imageId = Id
|
imageId = Id
|
||||||
let percentage = totalPercentage - lastPercentage
|
let percentage = totalPercentage - lastPercentage
|
||||||
|
percentage = percentage / 100
|
||||||
lastPercentage = totalPercentage
|
lastPercentage = totalPercentage
|
||||||
console.log(percentage, totalPercentage, total)
|
// console.log(percentage, totalPercentage, total)
|
||||||
let time = new Date().getTime();
|
let time = new Date().getTime();
|
||||||
let timeList = Object.keys(bytesReceivedPerSecond).sort((a, b) => a - b);
|
let timeList = Object.keys(bytesReceivedPerSecond).sort((a, b) => a - b);
|
||||||
let bytesTime = timeList.find(item => time - item < 1000);
|
let bytesTime = timeList.find(item => time - item < 1000);
|
||||||
|
@ -152,10 +155,37 @@ export function setNetWorkSpeedSize(totalPercentage, total, Id) {
|
||||||
}
|
}
|
||||||
store.state.trials.uploadSize = `${formatSize(totalPercentage / 100 * total)}/${formatSize(total)}`
|
store.state.trials.uploadSize = `${formatSize(totalPercentage / 100 * total)}/${formatSize(total)}`
|
||||||
}
|
}
|
||||||
|
export function setNetWorkSpeedSizeAll(totalPercentage, total, Id) {
|
||||||
|
if (!percentageById[Id]) {
|
||||||
|
percentageById[Id] = 0
|
||||||
|
}
|
||||||
|
let percentage = totalPercentage - percentageById[Id]
|
||||||
|
percentage = percentage / 100
|
||||||
|
percentageById[Id] = totalPercentage
|
||||||
|
// console.log(percentage, totalPercentage, total)
|
||||||
|
let time = new Date().getTime();
|
||||||
|
let timeList = Object.keys(bytesReceivedPerSecond).sort((a, b) => a - b);
|
||||||
|
let bytesTime = timeList.find(item => time - item < 1000);
|
||||||
|
if (bytesTime) {
|
||||||
|
bytesReceivedPerSecond[bytesTime] += total * percentage;
|
||||||
|
} else {
|
||||||
|
// console.log("未查询到时间")
|
||||||
|
if (timeList.length > 0) {
|
||||||
|
bytesReceivedPerSecond[timeList[timeList.length - 1]] += total * percentage;
|
||||||
|
} else {
|
||||||
|
bytesReceivedPerSecond[time] = total * percentage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let isComplete = Object.keys(percentageById).every(key => percentageById[key >= 100])
|
||||||
|
if (isComplete) {
|
||||||
|
workSpeedclose(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
export function workSpeedclose(isForce = false) {
|
export function workSpeedclose(isForce = false) {
|
||||||
if (!isForce && lastPercentage < 100) {
|
if (!isForce && lastPercentage < 100) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
console.log('workSpeedclose')
|
||||||
if (timer) {
|
if (timer) {
|
||||||
clearInterval(timer);
|
clearInterval(timer);
|
||||||
timer = null;
|
timer = null;
|
||||||
|
@ -164,5 +194,6 @@ export function workSpeedclose(isForce = false) {
|
||||||
}
|
}
|
||||||
bytesReceivedPerSecond = {};
|
bytesReceivedPerSecond = {};
|
||||||
lastPercentage = 0;
|
lastPercentage = 0;
|
||||||
imageId = null
|
imageId = null;
|
||||||
|
percentageById = {};
|
||||||
}
|
}
|
|
@ -192,7 +192,9 @@ export default {
|
||||||
imageList: [],
|
imageList: [],
|
||||||
showSeriesList: [],
|
showSeriesList: [],
|
||||||
currentLoadIns: [],
|
currentLoadIns: [],
|
||||||
isFromCRCUpload: false
|
isFromCRCUpload: false,
|
||||||
|
isReading: null,
|
||||||
|
activeSeriesId: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created: function () {
|
created: function () {
|
||||||
|
@ -206,6 +208,9 @@ export default {
|
||||||
store.dispatch('user/setToken', this.$router.currentRoute.query.TokenKey)
|
store.dispatch('user/setToken', this.$router.currentRoute.query.TokenKey)
|
||||||
changeURLStatic('TokenKey', '')
|
changeURLStatic('TokenKey', '')
|
||||||
}
|
}
|
||||||
|
if (this.$router.currentRoute.query.isReading) {
|
||||||
|
this.isReading = this.$router.currentRoute.query.isReading
|
||||||
|
}
|
||||||
this.studyId = this.$router.currentRoute.query.studyId
|
this.studyId = this.$router.currentRoute.query.studyId
|
||||||
this.isFromCRCUpload = !!this.$router.currentRoute.query.isFromCRCUpload
|
this.isFromCRCUpload = !!this.$router.currentRoute.query.isFromCRCUpload
|
||||||
if (this.type === 'Series') {
|
if (this.type === 'Series') {
|
||||||
|
@ -244,7 +249,8 @@ export default {
|
||||||
this.seriesCount = data.Result.SeriesCount
|
this.seriesCount = data.Result.SeriesCount
|
||||||
this.description = data.Result.Description
|
this.description = data.Result.Description
|
||||||
}
|
}
|
||||||
const url = `/series/list/${this.studyId}`
|
let isReading = !!this.isReading ? `?IsReading=true` : ''
|
||||||
|
const url = `/series/list/${this.studyId}${isReading}`
|
||||||
this.getSeriesList(url)
|
this.getSeriesList(url)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -439,6 +445,8 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showSeriesImage(e, seriesIndex, series) {
|
showSeriesImage(e, seriesIndex, series) {
|
||||||
|
this.activeSeriesId = series.seriesId
|
||||||
|
workSpeedclose(true)
|
||||||
// if (seriesIndex === this.currentSeriesIndex) return
|
// if (seriesIndex === this.currentSeriesIndex) return
|
||||||
const element = e.currentTarget
|
const element = e.currentTarget
|
||||||
const elements = document.querySelectorAll('[series-type]')
|
const elements = document.querySelectorAll('[series-type]')
|
||||||
|
@ -828,6 +836,9 @@ export default {
|
||||||
const seriesIndex = params.seriesIndex
|
const seriesIndex = params.seriesIndex
|
||||||
var prefetchInstanceCount = this.seriesList[seriesIndex].prefetchInstanceCount
|
var prefetchInstanceCount = this.seriesList[seriesIndex].prefetchInstanceCount
|
||||||
var instanceCount = this.seriesList[seriesIndex].instanceCount
|
var instanceCount = this.seriesList[seriesIndex].instanceCount
|
||||||
|
if (!this.activeSeriesId) {
|
||||||
|
this.activeSeriesId = this.seriesList[seriesIndex].seriesId
|
||||||
|
}
|
||||||
if (this.seriesList[seriesIndex].imageloadedArr.indexOf(imageId) < 0 && this.seriesList[seriesIndex].imageloadedArr.length < this.seriesList[seriesIndex].instanceCount) {
|
if (this.seriesList[seriesIndex].imageloadedArr.indexOf(imageId) < 0 && this.seriesList[seriesIndex].imageloadedArr.length < this.seriesList[seriesIndex].instanceCount) {
|
||||||
const i = this.currentLoadIns.findIndex(i => i.imageId === imageId)
|
const i = this.currentLoadIns.findIndex(i => i.imageId === imageId)
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
|
@ -848,9 +859,9 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let file = this.seriesList[seriesIndex].instanceInfoList.find(item => item.ImageId === imageId)
|
let file = this.seriesList[seriesIndex].instanceInfoList.find(item => item.ImageId === imageId)
|
||||||
if (file) {
|
if (file && this.activeSeriesId === this.seriesList[seriesIndex].seriesId) {
|
||||||
getNetWorkSpeed()
|
getNetWorkSpeed()
|
||||||
setNetWorkSpeedSize(percentComplete, file.FileSize, imageId)
|
setNetWorkSpeedSize(percentComplete, e.detail.total, imageId)
|
||||||
}
|
}
|
||||||
if (prefetchInstanceCount >= instanceCount * 100) {
|
if (prefetchInstanceCount >= instanceCount * 100) {
|
||||||
this.seriesList[seriesIndex].prefetchInstanceCount = instanceCount * 100
|
this.seriesList[seriesIndex].prefetchInstanceCount = instanceCount * 100
|
||||||
|
|
|
@ -149,92 +149,109 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane v-if="!visitTaskId" :label="$t('trials:dicom-show:relatedVisit')" name="relation-study"
|
<el-tab-pane v-show="!visitTaskId" :label="$t('trials:dicom-show:relatedVisit')" name="relation-study"
|
||||||
class="pane-relation-wrapper">
|
class="pane-relation-wrapper">
|
||||||
<div class="viewerSidethumbinner">
|
<div class="viewerSidethumbinner">
|
||||||
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
|
|
||||||
<el-collapse-item v-for="(study, studyIndex) in relationStudyList" :key="`${study.StudyId}`"
|
|
||||||
:name="`${study.StudyId}`">
|
|
||||||
<template slot="title">
|
|
||||||
|
|
||||||
<div class="text-desc">
|
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
|
||||||
{{ study.StudyCode }}
|
<template v-for="item in relationStudyListByVisitName">
|
||||||
|
<div :key="`${item.VisitName}`">
|
||||||
|
<div v-show="item.VisitName" class="text-desc" style="background-color: #1f1f1f;">
|
||||||
|
{{ item.VisitName }}
|
||||||
</div>
|
</div>
|
||||||
<!-- <div v-show="study.Description" class="text-desc">
|
<template v-for="(study, studyIndex) in relationStudyList">
|
||||||
|
<el-collapse-item :key="`${study.StudyId}`" :name="`${study.StudyId}`"
|
||||||
|
v-if="study.VisitName === item.VisitName">
|
||||||
|
<template slot="title">
|
||||||
|
|
||||||
|
<div class="text-desc">
|
||||||
|
{{ study.StudyCode }}
|
||||||
|
</div>
|
||||||
|
<!-- <div v-show="study.Description" class="text-desc">
|
||||||
{{ study.Description }}
|
{{ study.Description }}
|
||||||
</div> -->
|
</div> -->
|
||||||
|
|
||||||
<div v-show="study.SeriesCount" class="text-desc">
|
<div v-show="study.SeriesCount" class="text-desc">
|
||||||
{{ study.Modalities }} : {{ study.SeriesCount }} Series
|
{{ study.Modalities }} : {{ study.SeriesCount }} Series
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div v-show="study.Description" class="text-desc" style="background-color: #1f1f1f;">
|
<div v-show="study.Description" class="text-desc" style="background-color: #1f1f1f;">
|
||||||
{{ study.Description }}
|
{{ study.Description }}
|
||||||
</div>
|
</div>
|
||||||
<div v-if="study.seriesList" class="viewerSidethumbs ps" style="position: relative;">
|
<div class="viewerSidethumbs ps" style="position: relative;">
|
||||||
<div class="viewerSidethumbinner">
|
<div class="viewerSidethumbinner">
|
||||||
<div v-for="(seriesItem, index) in study.seriesList" :key="index"
|
<div v-for="(seriesItem, index) in study.seriesList" :key="seriesItem.seriesId">
|
||||||
class="viewernavigatorwrapper" style="position: relative;border:1px solid #434343;"
|
<div class="viewernavigatorwrapper"
|
||||||
series-type="relation"
|
style="position: relative;border:1px solid #434343;" series-type="relation"
|
||||||
@click="showRelationSeriesImage($event, seriesItem, studyIndex, index)">
|
@click="showRelationSeriesImage($event, seriesItem, studyIndex, index)">
|
||||||
<!-- <el-image
|
<img class="image-preview" :src="seriesItem.previewImageUrl" crossorigin="anonymous"
|
||||||
|
alt="" style="width: 85px;height:85px;" fit="fill">
|
||||||
|
|
||||||
|
<div class="viewernavitextwrapper">
|
||||||
|
<div
|
||||||
|
style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
|
||||||
|
<div v-if="seriesItem.keySeries" style="color:red">
|
||||||
|
Key Images
|
||||||
|
</div>
|
||||||
|
<div v-else>#{{ seriesItem.seriesNumber }}</div>
|
||||||
|
<div v-if="seriesItem.isExistMutiFrames && seriesItem.instanceCount > 1">
|
||||||
|
<el-popover placement="right-start" trigger="click"
|
||||||
|
popper-class="instance_frame_wrapper">
|
||||||
|
<div class="frame_list">
|
||||||
|
<div v-for="(instance, idx) in seriesItem.instanceInfoList"
|
||||||
|
:key="instance.Id" class="frame_content"
|
||||||
|
:style="{ 'margin-bottom': idx < seriesItem.instanceInfoList.length - 1 ? '5px' : '0px' }"
|
||||||
|
@click="showMultiFrames(studyIndex, seriesItem, index, instance)">
|
||||||
|
<div>
|
||||||
|
<div>{{ instance.InstanceNumber }}</div>
|
||||||
|
<div>{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1}
|
||||||
|
frame`
|
||||||
|
}}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<i slot="reference" class="el-icon-connection"
|
||||||
|
style="font-size: 15px;cursor: pointer;" />
|
||||||
|
</el-popover>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div v-show="seriesItem.instanceCount" style="padding: 1px;">
|
||||||
|
{{ seriesItem.modality }}: {{ seriesItem.instanceCount }} image
|
||||||
|
</div>
|
||||||
|
<div v-show="seriesItem.sliceThickness" style="padding: 1px;">
|
||||||
|
T: {{ seriesItem.sliceThickness }}
|
||||||
|
</div>
|
||||||
|
<el-tooltip v-show="seriesItem.description" class="item" effect="dark"
|
||||||
|
:content="seriesItem.description" placement="bottom">
|
||||||
|
<div v-show="seriesItem.description"
|
||||||
|
style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
|
||||||
|
{{ seriesItem.description }}
|
||||||
|
</div>
|
||||||
|
</el-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- <el-image
|
||||||
class="image-preview"
|
class="image-preview"
|
||||||
style="height:72px;width:72px;"
|
style="height:72px;width:72px;"
|
||||||
:src="seriesItem.previewImageUrl"
|
:src="seriesItem.previewImageUrl"
|
||||||
fit="fill"
|
fit="fill"
|
||||||
/> -->
|
/> -->
|
||||||
<img class="image-preview" :src="seriesItem.previewImageUrl" crossorigin="anonymous" alt=""
|
<div
|
||||||
style="width: 85px;height:85px;" fit="fill">
|
v-if="seriesItem.prefetchInstanceCount > 0 && seriesItem.prefetchInstanceCount < seriesItem.instanceCount * 100">
|
||||||
|
<el-progress
|
||||||
<div class="viewernavitextwrapper">
|
:percentage="parseInt((seriesItem.prefetchInstanceCount / seriesItem.instanceCount).toFixed(2))" />
|
||||||
<div style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
|
</div>
|
||||||
<div v-if="seriesItem.keySeries" style="color:red">
|
|
||||||
Key Images
|
|
||||||
</div>
|
</div>
|
||||||
<div v-else>#{{ seriesItem.seriesNumber }}</div>
|
|
||||||
<div v-if="seriesItem.isExistMutiFrames && seriesItem.instanceCount > 1">
|
|
||||||
<el-popover placement="right-start" trigger="click"
|
|
||||||
popper-class="instance_frame_wrapper">
|
|
||||||
<div class="frame_list">
|
|
||||||
<div v-for="(instance, idx) in seriesItem.instanceInfoList" :key="instance.Id"
|
|
||||||
class="frame_content"
|
|
||||||
:style="{ 'margin-bottom': idx < seriesItem.instanceInfoList.length - 1 ? '5px' : '0px' }"
|
|
||||||
@click="showMultiFrames(studyIndex, seriesItem, index, instance)">
|
|
||||||
<div>
|
|
||||||
<div>{{ instance.InstanceNumber }}</div>
|
|
||||||
<div>{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1} frame`
|
|
||||||
}}</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<i slot="reference" class="el-icon-connection"
|
|
||||||
style="font-size: 15px;cursor: pointer;" />
|
|
||||||
</el-popover>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div v-show="seriesItem.instanceCount" style="padding: 1px;">
|
|
||||||
{{ seriesItem.modality }}: {{ seriesItem.instanceCount }} image
|
|
||||||
</div>
|
|
||||||
<div v-show="seriesItem.sliceThickness" style="padding: 1px;">
|
|
||||||
T: {{ seriesItem.sliceThickness }}
|
|
||||||
</div>
|
|
||||||
<el-tooltip v-show="seriesItem.description" class="item" effect="dark"
|
|
||||||
:content="seriesItem.description" placement="bottom">
|
|
||||||
<div v-show="seriesItem.description"
|
|
||||||
style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
|
|
||||||
{{ seriesItem.description }}
|
|
||||||
</div>
|
|
||||||
</el-tooltip>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- <div style="position: absolute;bottom: -10px;left: 0;width: 100%;">
|
</el-collapse-item>
|
||||||
<el-progress v-if="seriesItem.prefetchInstanceCount>0 && seriesItem.prefetchInstanceCount<seriesItem.instanceCount" :percentage="Number(seriesItem.prefetchInstanceCount/seriesItem.instanceCount)*100" />
|
</template>
|
||||||
</div> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</el-collapse-item>
|
</template>
|
||||||
|
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -290,6 +307,7 @@ export default {
|
||||||
visitInfo: '',
|
visitInfo: '',
|
||||||
activeName: 'current-study',
|
activeName: 'current-study',
|
||||||
relationStudyList: [],
|
relationStudyList: [],
|
||||||
|
relationStudyListByVisitName: [],
|
||||||
cachedImages: [],
|
cachedImages: [],
|
||||||
isReading: null,
|
isReading: null,
|
||||||
isStartLoad: false,
|
isStartLoad: false,
|
||||||
|
@ -303,7 +321,8 @@ export default {
|
||||||
currentLoadIns: [],
|
currentLoadIns: [],
|
||||||
isFromCRCUpload: false,
|
isFromCRCUpload: false,
|
||||||
visitTaskId: null,
|
visitTaskId: null,
|
||||||
page: ''
|
page: '',
|
||||||
|
activeSeriesId: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -435,6 +454,8 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showSeriesImage(e, studyIndex, seriesIndex, series) {
|
showSeriesImage(e, studyIndex, seriesIndex, series) {
|
||||||
|
this.activeSeriesId = series.seriesId
|
||||||
|
workSpeedclose(true)
|
||||||
const element = e.currentTarget
|
const element = e.currentTarget
|
||||||
const elements = document.querySelectorAll('[series-type]')
|
const elements = document.querySelectorAll('[series-type]')
|
||||||
Array.from(elements).forEach((e) => {
|
Array.from(elements).forEach((e) => {
|
||||||
|
@ -683,10 +704,26 @@ export default {
|
||||||
spinner: 'el-icon-loading'
|
spinner: 'el-icon-loading'
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
const res = await getAllRelationStudyList(this.subjectVisitId)
|
let params = {
|
||||||
|
IsReading: !!this.isReading
|
||||||
|
}
|
||||||
|
const res = await getAllRelationStudyList(this.subjectVisitId, params)
|
||||||
loading.close()
|
loading.close()
|
||||||
this.relationStudyList = res.Result
|
this.relationStudyList = res.Result
|
||||||
|
this.relationStudyListByVisitName = []
|
||||||
|
res.Result.forEach(item => {
|
||||||
|
let index = this.relationStudyListByVisitName.findIndex(d => d.VisitName === item.VisitName)
|
||||||
|
if (index < 0) {
|
||||||
|
this.relationStudyListByVisitName.push({
|
||||||
|
VisitName: item.VisitName,
|
||||||
|
series: [item]
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.relationStudyListByVisitName[index].series.push(item)
|
||||||
|
}
|
||||||
|
})
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
loading.close()
|
loading.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -715,7 +752,8 @@ export default {
|
||||||
spinner: 'el-icon-loading'
|
spinner: 'el-icon-loading'
|
||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
const data = await getSeriesList(`/series/list/${studyId}`)
|
let isReading = !!this.isReading ? `?IsReading=true` : ''
|
||||||
|
const data = await getSeriesList(`/series/list/${studyId}${isReading}`)
|
||||||
loading.close()
|
loading.close()
|
||||||
if (data.Result != null && data.Result.length > 0) {
|
if (data.Result != null && data.Result.length > 0) {
|
||||||
var seriesList = []
|
var seriesList = []
|
||||||
|
@ -725,9 +763,15 @@ export default {
|
||||||
item.InstanceInfoList.forEach(i => {
|
item.InstanceInfoList.forEach(i => {
|
||||||
if (i.NumberOfFrames && i.NumberOfFrames > 1) {
|
if (i.NumberOfFrames && i.NumberOfFrames > 1) {
|
||||||
for (let j = 0; j < i.NumberOfFrames; j++) {
|
for (let j = 0; j < i.NumberOfFrames; j++) {
|
||||||
|
if (!i.ImageId) {
|
||||||
|
i.ImageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? scope.OSSclientConfig.basePath : scope.OSSclientConfig.basePath}${i.Path}?frame=${j}&instanceId=${i.Id}&idx=${index}|${seriesIndex}&isRelation=1`
|
||||||
|
}
|
||||||
imageIds.push(`wadouri:${localStorage.getItem('location') !== 'USA' ? scope.OSSclientConfig.basePath : scope.OSSclientConfig.basePath}${i.Path}?frame=${j}&instanceId=${i.Id}&idx=${index}|${seriesIndex}&isRelation=1`)
|
imageIds.push(`wadouri:${localStorage.getItem('location') !== 'USA' ? scope.OSSclientConfig.basePath : scope.OSSclientConfig.basePath}${i.Path}?frame=${j}&instanceId=${i.Id}&idx=${index}|${seriesIndex}&isRelation=1`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if (!i.ImageId) {
|
||||||
|
i.ImageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? scope.OSSclientConfig.basePath : scope.OSSclientConfig.basePath}${i.Path}?instanceId=${i.Id}&idx=${index}|${seriesIndex}&isRelation=1`
|
||||||
|
}
|
||||||
imageIds.push(`wadouri:${localStorage.getItem('location') !== 'USA' ? scope.OSSclientConfig.basePath : scope.OSSclientConfig.basePath}${i.Path}?instanceId=${i.Id}&idx=${index}|${seriesIndex}&isRelation=1`)
|
imageIds.push(`wadouri:${localStorage.getItem('location') !== 'USA' ? scope.OSSclientConfig.basePath : scope.OSSclientConfig.basePath}${i.Path}?instanceId=${i.Id}&idx=${index}|${seriesIndex}&isRelation=1`)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -751,9 +795,12 @@ export default {
|
||||||
isShowPopper: false
|
isShowPopper: false
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
scope.relationStudyList[index].seriesCount = seriesList.length
|
// scope.relationStudyList[index].seriesCount = seriesList.length
|
||||||
scope.relationStudyList[index].seriesList = seriesList
|
// scope.relationStudyList[index].seriesList = seriesList
|
||||||
scope.relationStudyList[index].showSeries = true
|
// scope.relationStudyList[index].showSeries = true
|
||||||
|
scope.$set(scope.relationStudyList[index], 'seriesCount', seriesList.length)
|
||||||
|
scope.$set(scope.relationStudyList[index], 'seriesList', seriesList)
|
||||||
|
scope.$set(scope.relationStudyList[index], 'showSeries', true)
|
||||||
scope.$forceUpdate()
|
scope.$forceUpdate()
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -762,6 +809,8 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
showRelationSeriesImage(e, series, studyIndex, index) {
|
showRelationSeriesImage(e, series, studyIndex, index) {
|
||||||
|
this.activeSeriesId = series.seriesId
|
||||||
|
workSpeedclose(true)
|
||||||
this.currentRelationIndex = index
|
this.currentRelationIndex = index
|
||||||
const element = e.currentTarget
|
const element = e.currentTarget
|
||||||
const elements = document.querySelectorAll('[series-type]')
|
const elements = document.querySelectorAll('[series-type]')
|
||||||
|
@ -781,6 +830,9 @@ export default {
|
||||||
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, priority })
|
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, priority })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
if (this.imageList.length > 0) {
|
||||||
|
this.loopLoad()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
loadAllImages() {
|
loadAllImages() {
|
||||||
|
@ -840,8 +892,11 @@ export default {
|
||||||
}
|
}
|
||||||
const studyIndex = params.idx.split('|')[0]
|
const studyIndex = params.idx.split('|')[0]
|
||||||
const seriesIndex = params.idx.split('|')[1]
|
const seriesIndex = params.idx.split('|')[1]
|
||||||
var series = !params.isRelation ? this.studyList[studyIndex].SeriesList[seriesIndex] : null
|
var series = !params.isRelation ? this.studyList[studyIndex].SeriesList[seriesIndex] : this.relationStudyList[studyIndex].seriesList[seriesIndex]
|
||||||
if (!series) return
|
if (!series) return
|
||||||
|
if (!this.activeSeriesId) {
|
||||||
|
this.activeSeriesId = series.seriesId
|
||||||
|
}
|
||||||
var prefetchInstanceCount = series.prefetchInstanceCount
|
var prefetchInstanceCount = series.prefetchInstanceCount
|
||||||
var instanceCount = series.instanceCount
|
var instanceCount = series.instanceCount
|
||||||
if (series.imageloadedArr.indexOf(imageId) < 0) {
|
if (series.imageloadedArr.indexOf(imageId) < 0) {
|
||||||
|
@ -863,10 +918,10 @@ export default {
|
||||||
series.imageloadedArr.push(imageId)
|
series.imageloadedArr.push(imageId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let file = this.studyList[studyIndex].SeriesList[seriesIndex].instanceInfoList.find(item => item.ImageId === imageId)
|
let file = series.instanceInfoList.find(item => item.ImageId === imageId)
|
||||||
if (file) {
|
if (file && this.activeSeriesId === series.seriesId) {
|
||||||
getNetWorkSpeed()
|
getNetWorkSpeed()
|
||||||
setNetWorkSpeedSize(percentComplete, file.FileSize, imageId)
|
setNetWorkSpeedSize(percentComplete, e.detail.total, imageId)
|
||||||
}
|
}
|
||||||
if (prefetchInstanceCount >= instanceCount * 100) {
|
if (prefetchInstanceCount >= instanceCount * 100) {
|
||||||
series.prefetchInstanceCount = instanceCount * 100
|
series.prefetchInstanceCount = instanceCount * 100
|
||||||
|
|
|
@ -70,6 +70,7 @@ import ppt from '@/assets/file_icon/ppt.png'
|
||||||
import pptx from '@/assets/file_icon/pptx.png'
|
import pptx from '@/assets/file_icon/pptx.png'
|
||||||
import xls from '@/assets/file_icon/xls.png'
|
import xls from '@/assets/file_icon/xls.png'
|
||||||
import xlsx from '@/assets/file_icon/xlsx.png'
|
import xlsx from '@/assets/file_icon/xlsx.png'
|
||||||
|
import mp4 from '@/assets/file_icon/xlsx.png'
|
||||||
import PreviewFile from '@/components/PreviewFile'
|
import PreviewFile from '@/components/PreviewFile'
|
||||||
import imageViewer from './image-viewer'
|
import imageViewer from './image-viewer'
|
||||||
import { getSystemDocumentAttachmentList } from '@/api/dictionary'
|
import { getSystemDocumentAttachmentList } from '@/api/dictionary'
|
||||||
|
@ -117,6 +118,7 @@ export default {
|
||||||
pptx,
|
pptx,
|
||||||
xls,
|
xls,
|
||||||
xlsx,
|
xlsx,
|
||||||
|
mp4,
|
||||||
rowData: {},
|
rowData: {},
|
||||||
list: [],
|
list: [],
|
||||||
searchData: defaultSearchData(),
|
searchData: defaultSearchData(),
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<el-form-item :label="$t('dictionary:sign:label:sceneType')" prop="Name">
|
<el-form-item :label="$t('dictionary:sign:label:sceneType')" prop="Name">
|
||||||
<el-input v-model="form.Name" />
|
<el-input v-model="form.Name" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="$t('dictionary:sign:label:value')" prop="Value">
|
<el-form-item :label="$t('dictionary:sign:label:value')" prop="Value">
|
||||||
<el-input v-model="form.Value" type="textarea" rows="5" />
|
<el-input v-model="form.Value" type="textarea" rows="5" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('dictionary:sign:label:valueCN')" prop="ValueCN">
|
<el-form-item :label="$t('dictionary:sign:label:valueCN')" prop="ValueCN">
|
||||||
|
|
|
@ -299,7 +299,7 @@ export default {
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['visitTaskList', 'currentReadingTaskState']),
|
...mapGetters(['visitTaskList', 'currentReadingTaskState']),
|
||||||
NSTip() {
|
NSTip() {
|
||||||
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
|
return `NS: ${this.$store.state.trials.uploadTip}`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
|
|
@ -8,7 +8,8 @@
|
||||||
|
|
||||||
<div v-if="(visitTaskList.length > 0)" style="display: flex;flex-direction: row;">
|
<div v-if="(visitTaskList.length > 0)" style="display: flex;flex-direction: row;">
|
||||||
<div v-for="s in visitTaskList" :key="s.VisitTaskId" class="visit-item"
|
<div v-for="s in visitTaskList" :key="s.VisitTaskId" class="visit-item"
|
||||||
:class="{ 'visit-item-active': activeTaskVisitId == s.VisitTaskId }" @click.prevent="handleClick(s)">{{
|
:class="{ 'visit-item-active': activeTaskVisitId == s.VisitTaskId }" @click.prevent="handleClick(s)">
|
||||||
|
{{
|
||||||
s.TaskBlindName }}</div>
|
s.TaskBlindName }}</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -510,13 +511,13 @@ export default {
|
||||||
},
|
},
|
||||||
cornerstoneimageloadprogress(e) {
|
cornerstoneimageloadprogress(e) {
|
||||||
const imageId = e.detail.imageId
|
const imageId = e.detail.imageId
|
||||||
console.log(imageId,'imageId')
|
|
||||||
const params = {}
|
const params = {}
|
||||||
const searchParams = new URLSearchParams(imageId.split('?')[1])
|
const searchParams = new URLSearchParams(imageId.split('?')[1])
|
||||||
for (const [key, value] of searchParams.entries()) {
|
for (const [key, value] of searchParams.entries()) {
|
||||||
params[key] = value
|
params[key] = value
|
||||||
}
|
}
|
||||||
params.percentComplete = e.detail.percentComplete
|
params.percentComplete = e.detail.percentComplete
|
||||||
|
params.FileTotal = e.detail.total
|
||||||
params.imageId = imageId
|
params.imageId = imageId
|
||||||
store.dispatch('reading/setImageLoadedProgress', params)
|
store.dispatch('reading/setImageLoadedProgress', params)
|
||||||
}
|
}
|
||||||
|
|
|
@ -297,7 +297,7 @@ export default {
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['visitTaskList', 'currentReadingTaskState']),
|
...mapGetters(['visitTaskList', 'currentReadingTaskState']),
|
||||||
NSTip() {
|
NSTip() {
|
||||||
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
|
return `NS: ${this.$store.state.trials.uploadTip}`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
|
|
@ -663,6 +663,7 @@ export default {
|
||||||
params[key] = value
|
params[key] = value
|
||||||
}
|
}
|
||||||
params.percentComplete = e.detail.percentComplete
|
params.percentComplete = e.detail.percentComplete
|
||||||
|
params.FileTotal = e.detail.total
|
||||||
params.imageId = imageId
|
params.imageId = imageId
|
||||||
store.dispatch('reading/setImageLoadedProgress', params)
|
store.dispatch('reading/setImageLoadedProgress', params)
|
||||||
}
|
}
|
||||||
|
|
|
@ -789,7 +789,7 @@ export default {
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
NSTip() {
|
NSTip() {
|
||||||
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
|
return `NS: ${this.$store.state.trials.uploadTip}`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -632,7 +632,7 @@ import colorMap from './colorMap.vue'
|
||||||
import RectangleROITool from './tools/RectangleROITool'
|
import RectangleROITool from './tools/RectangleROITool'
|
||||||
import uploadDicomAndNonedicom from '@/components/uploadDicomAndNonedicom'
|
import uploadDicomAndNonedicom from '@/components/uploadDicomAndNonedicom'
|
||||||
import downloadDicomAndNonedicom from '@/components/downloadDicomAndNonedicom'
|
import downloadDicomAndNonedicom from '@/components/downloadDicomAndNonedicom'
|
||||||
import { getNetWorkSpeed, setNetWorkSpeedSize, workSpeedclose } from "@/utils"
|
import { getNetWorkSpeed, setNetWorkSpeedSizeAll, workSpeedclose } from "@/utils"
|
||||||
const { visibility } = annotation
|
const { visibility } = annotation
|
||||||
const { ViewportType, Events } = Enums
|
const { ViewportType, Events } = Enums
|
||||||
const renderingEngineId = 'myRenderingEngine'
|
const renderingEngineId = 'myRenderingEngine'
|
||||||
|
@ -1366,7 +1366,7 @@ export default {
|
||||||
let file = series.find(item => item.ImageId === imageId)
|
let file = series.find(item => item.ImageId === imageId)
|
||||||
if (file) {
|
if (file) {
|
||||||
getNetWorkSpeed()
|
getNetWorkSpeed()
|
||||||
setNetWorkSpeedSize(percentComplete, file.FileSize, imageId)
|
setNetWorkSpeedSizeAll(percentComplete, detail.total, imageId)
|
||||||
}
|
}
|
||||||
if (percentComplete === 100) {
|
if (percentComplete === 100) {
|
||||||
workSpeedclose()
|
workSpeedclose()
|
||||||
|
|
|
@ -542,7 +542,7 @@ export default {
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
NSTip() {
|
NSTip() {
|
||||||
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
|
return `NS: ${this.$store.state.trials.uploadTip}`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,139 +1,68 @@
|
||||||
<template>
|
<template>
|
||||||
<el-form
|
<el-form ref="questionForm" v-loading="loading" :model="form" label-width="120px" size="small" :rules="rules">
|
||||||
ref="questionForm"
|
|
||||||
v-loading="loading"
|
|
||||||
:model="form"
|
|
||||||
label-width="120px"
|
|
||||||
size="small"
|
|
||||||
:rules="rules"
|
|
||||||
>
|
|
||||||
<div class="base-dialog-body">
|
<div class="base-dialog-body">
|
||||||
<!-- 审核问题 -->
|
<!-- 审核问题 -->
|
||||||
<el-form-item
|
<el-form-item :label="$t('trials:qcCfg:table:questionName')" prop="QuestionName">
|
||||||
:label="$t('trials:qcCfg:table:questionName')"
|
<el-input v-model="form.QuestionName" :disabled="data.IsQuestionQCAuditPassed" />
|
||||||
prop="QuestionName"
|
|
||||||
>
|
|
||||||
<el-input
|
|
||||||
v-model="form.QuestionName"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item-->
|
<!-- <el-form-item-->
|
||||||
<!-- :label="$t('common:title:languageType')"-->
|
<!-- :label="$t('common:title:languageType')"-->
|
||||||
<!-- prop="LanguageType"-->
|
<!-- prop="LanguageType"-->
|
||||||
<!-- >-->
|
<!-- >-->
|
||||||
<!-- <el-select-->
|
<!-- <el-select-->
|
||||||
<!-- v-model="form.LanguageType"-->
|
<!-- v-model="form.LanguageType"-->
|
||||||
<!-- >-->
|
<!-- >-->
|
||||||
<!-- <el-option-->
|
<!-- <el-option-->
|
||||||
<!-- v-for="item of $d.LanguageType"-->
|
<!-- v-for="item of $d.LanguageType"-->
|
||||||
<!-- :key="item.value"-->
|
<!-- :key="item.value"-->
|
||||||
<!-- :value="item.value"-->
|
<!-- :value="item.value"-->
|
||||||
<!-- :label="item.label"-->
|
<!-- :label="item.label"-->
|
||||||
<!-- />-->
|
<!-- />-->
|
||||||
<!-- </el-select>-->
|
<!-- </el-select>-->
|
||||||
<!-- </el-form-item>-->
|
<!-- </el-form-item>-->
|
||||||
<!-- 类型 -->
|
<!-- 类型 -->
|
||||||
<el-form-item
|
<el-form-item :label="$t('trials:qcCfg:table:type')">
|
||||||
:label="$t('trials:qcCfg:table:type')"
|
<el-select v-model="form.Type" @change="((val) => { typeChange(val, form) })"
|
||||||
>
|
:disabled="data.IsQuestionQCAuditPassed">
|
||||||
<el-select
|
<el-option v-for="item of $d.QcType" :key="item.value" :value="item.value" :label="item.label" />
|
||||||
v-model="form.Type"
|
|
||||||
@change="((val)=>{typeChange(val, form)})"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item of $d.QcType"
|
|
||||||
:key="item.value"
|
|
||||||
:value="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
/>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 选项 -->
|
<!-- 选项 -->
|
||||||
<el-form-item
|
<el-form-item v-if="form.Type === 'select' || form.Type === 'radio'" :label="$t('trials:qcCfg:table:typeValue')"
|
||||||
v-if="form.Type === 'select' || form.Type === 'radio'"
|
prop="TypeValue">
|
||||||
:label="$t('trials:qcCfg:table:typeValue')"
|
<el-input v-model="form.TypeValue" :placeholder="$t('trials:qcCfg:message:typeValue')" type="textarea"
|
||||||
prop="TypeValue"
|
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="data.IsQuestionQCAuditPassed" />
|
||||||
>
|
|
||||||
<el-input
|
|
||||||
v-model="form.TypeValue"
|
|
||||||
:placeholder="$t('trials:qcCfg:message:typeValue')"
|
|
||||||
type="textarea"
|
|
||||||
:autosize="{ minRows: 2, maxRows: 4}"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 父问题 -->
|
<!-- 父问题 -->
|
||||||
<el-form-item
|
<el-form-item :label="$t('trials:qcCfg:table:parentQs')">
|
||||||
:label="$t('trials:qcCfg:table:parentQs')"
|
<el-select v-model="form.ParentId" clearable @change="((val) => { parentQuestionChange(val, form) })"
|
||||||
>
|
:disabled="data.IsQuestionQCAuditPassed">
|
||||||
<el-select
|
<el-option v-for="item of parentOptions" :key="item.Id" :label="item.QuestionName" :value="item.Id" />
|
||||||
v-model="form.ParentId"
|
|
||||||
clearable
|
|
||||||
@change="((val)=>{parentQuestionChange(val, form)})"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item of parentOptions"
|
|
||||||
:key="item.Id"
|
|
||||||
:label="item.QuestionName"
|
|
||||||
:value="item.Id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 父问题触发值 -->
|
<!-- 父问题触发值 -->
|
||||||
<el-form-item
|
<el-form-item v-if="form.ParentId" :label="$t('trials:qcCfg:table:parentTriggerValue')" prop="ParentTriggerValue">
|
||||||
v-if="form.ParentId"
|
<el-select v-model="form.ParentTriggerValue" :disabled="data.IsQuestionQCAuditPassed">
|
||||||
:label="$t('trials:qcCfg:table:parentTriggerValue')"
|
<el-option v-for="item of parentTriggerValOptions" :key="item" :label="item" :value="item" />
|
||||||
prop="ParentTriggerValue"
|
|
||||||
>
|
|
||||||
<el-select
|
|
||||||
v-model="form.ParentTriggerValue"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item of parentTriggerValOptions"
|
|
||||||
:key="item"
|
|
||||||
:label="item"
|
|
||||||
:value="item"
|
|
||||||
/>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 序号 -->
|
<!-- 序号 -->
|
||||||
<el-form-item
|
<el-form-item :label="$t('trials:qcCfg:table:order')" prop="ShowOrder">
|
||||||
:label="$t('trials:qcCfg:table:order')"
|
<el-input-number v-model="form.ShowOrder" controls-position="right" :min="0"
|
||||||
prop="ShowOrder"
|
:disabled="data.IsQuestionQCAuditPassed" />
|
||||||
>
|
|
||||||
<el-input-number
|
|
||||||
v-model="form.ShowOrder"
|
|
||||||
controls-position="right"
|
|
||||||
:min="0"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 是否必填 -->
|
<!-- 是否必填 -->
|
||||||
<el-form-item
|
<el-form-item :label="$t('trials:qcCfg:table:isRequired')">
|
||||||
:label="$t('trials:qcCfg:table:isRequired')"
|
<el-radio-group v-model="form.IsRequired">
|
||||||
>
|
<el-radio v-for="item of $d.YesOrNo" :key="`IsRequired${item.value}`" :label="item.value">
|
||||||
<el-radio-group
|
|
||||||
v-model="form.IsRequired"
|
|
||||||
>
|
|
||||||
<el-radio
|
|
||||||
v-for="item of $d.YesOrNo"
|
|
||||||
:key="`IsRequired${item.value}`"
|
|
||||||
:label="item.value"
|
|
||||||
>
|
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</el-radio>
|
</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 启用状态 -->
|
<!-- 启用状态 -->
|
||||||
<el-form-item
|
<el-form-item :label="$t('trials:qcCfg:table:isEnable')">
|
||||||
:label="$t('trials:qcCfg:table:isEnable')"
|
<el-radio-group v-model="form.IsEnable">
|
||||||
>
|
<el-radio v-for="item of $d.YesOrNo" :key="item.value" :label="item.value">
|
||||||
<el-radio-group
|
|
||||||
v-model="form.IsEnable"
|
|
||||||
>
|
|
||||||
<el-radio
|
|
||||||
v-for="item of $d.YesOrNo"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.value"
|
|
||||||
>
|
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</el-radio>
|
</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
|
@ -143,19 +72,11 @@
|
||||||
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
||||||
<el-form-item style="text-align:right;">
|
<el-form-item style="text-align:right;">
|
||||||
<!-- 取消 -->
|
<!-- 取消 -->
|
||||||
<el-button
|
<el-button size="small" type="primary" @click="handleClose">
|
||||||
size="small"
|
|
||||||
type="primary"
|
|
||||||
@click="handleClose"
|
|
||||||
>
|
|
||||||
{{ $t('common:button:cancel') }}
|
{{ $t('common:button:cancel') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- Save -->
|
<!-- Save -->
|
||||||
<el-button
|
<el-button size="small" type="primary" @click="handleSave">
|
||||||
size="small"
|
|
||||||
type="primary"
|
|
||||||
@click="handleSave"
|
|
||||||
>
|
|
||||||
{{ $t('common:button:save') }}
|
{{ $t('common:button:save') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -202,7 +123,7 @@ export default {
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
QuestionName: [{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' },
|
QuestionName: [{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' },
|
||||||
{ max: 300, message: `${this.$t('common:ruleMessage:maxLength')} 300` }],
|
{ max: 300, message: `${this.$t('common:ruleMessage:maxLength')} 300` }],
|
||||||
TypeValue: [
|
TypeValue: [
|
||||||
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' },
|
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' },
|
||||||
{ validator: validateTypeVal, trigger: 'blur' },
|
{ validator: validateTypeVal, trigger: 'blur' },
|
||||||
|
@ -308,6 +229,4 @@ export default {
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss"></style>
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -8,23 +8,23 @@
|
||||||
<el-input v-model="searchData.QuestionName" clearable style="width:120px;" />
|
<el-input v-model="searchData.QuestionName" clearable style="width:120px;" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- 语言类型 -->
|
<!-- 语言类型 -->
|
||||||
<!-- <el-form-item-->
|
<!-- <el-form-item-->
|
||||||
<!-- :label="$t('common:title:languageType')"-->
|
<!-- :label="$t('common:title:languageType')"-->
|
||||||
<!-- style="margin-top: 10px"-->
|
<!-- style="margin-top: 10px"-->
|
||||||
<!-- >-->
|
<!-- >-->
|
||||||
<!-- <el-select-->
|
<!-- <el-select-->
|
||||||
<!-- v-model="searchData.LanguageType"-->
|
<!-- v-model="searchData.LanguageType"-->
|
||||||
<!-- clearable-->
|
<!-- clearable-->
|
||||||
<!-- style="width:120px;"-->
|
<!-- style="width:120px;"-->
|
||||||
<!-- >-->
|
<!-- >-->
|
||||||
<!-- <el-option-->
|
<!-- <el-option-->
|
||||||
<!-- v-for="item of $d.LanguageType"-->
|
<!-- v-for="item of $d.LanguageType"-->
|
||||||
<!-- :key="item.value"-->
|
<!-- :key="item.value"-->
|
||||||
<!-- :value="item.value"-->
|
<!-- :value="item.value"-->
|
||||||
<!-- :label="item.label"-->
|
<!-- :label="item.label"-->
|
||||||
<!-- />-->
|
<!-- />-->
|
||||||
<!-- </el-select>-->
|
<!-- </el-select>-->
|
||||||
<!-- </el-form-item>-->
|
<!-- </el-form-item>-->
|
||||||
<!-- 类型 -->
|
<!-- 类型 -->
|
||||||
<el-form-item :label="$t('trials:qcCfg:table:type')">
|
<el-form-item :label="$t('trials:qcCfg:table:type')">
|
||||||
<el-select v-model="searchData.Type" clearable style="width:120px;">
|
<el-select v-model="searchData.Type" clearable style="width:120px;">
|
||||||
|
@ -38,228 +38,138 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('trials:qcCfg:table:isRequired')">
|
<el-form-item :label="$t('trials:qcCfg:table:isRequired')">
|
||||||
<el-select v-model="searchData.IsRequired" clearable style="width:120px;">
|
<el-select v-model="searchData.IsRequired" clearable style="width:120px;">
|
||||||
<el-option v-for="item of $d.YesOrNo" :key="`IsRequired${item.label}`" :value="item.value" :label="item.label" />
|
<el-option v-for="item of $d.YesOrNo" :key="`IsRequired${item.label}`" :value="item.value"
|
||||||
|
:label="item.label" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item >
|
<el-form-item>
|
||||||
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
|
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
|
||||||
{{ $t('common:button:search') }}
|
{{ $t('common:button:search') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
|
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
|
||||||
{{ $t('common:button:reset') }}
|
{{ $t('common:button:reset') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button v-if="isHaveQCQuestion" type="primary" icon="el-icon-view" @click="preview.visible = true">
|
||||||
v-if="isHaveQCQuestion"
|
|
||||||
type="primary"
|
|
||||||
icon="el-icon-view"
|
|
||||||
@click="preview.visible = true"
|
|
||||||
>
|
|
||||||
{{ $t('trials:qcCfg:button:preview') }}
|
{{ $t('trials:qcCfg:button:preview') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:default-question'])"
|
||||||
v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:default-question'])"
|
type="primary" icon="el-icon-plus" @click="handleAdd">
|
||||||
type="primary"
|
|
||||||
icon="el-icon-plus"
|
|
||||||
@click="handleAdd"
|
|
||||||
>
|
|
||||||
{{ $t('trials:qcCfg:button:default') }}
|
{{ $t('trials:qcCfg:button:default') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:custom-question'])"
|
||||||
v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:custom-question'])"
|
type="primary" icon="el-icon-delete" @click="handleBatchDelete">
|
||||||
type="primary"
|
|
||||||
icon="el-icon-delete"
|
|
||||||
@click="handleBatchDelete"
|
|
||||||
>
|
|
||||||
{{ $t('common:button:batchDelete') }}
|
{{ $t('common:button:batchDelete') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:custom-question'])"
|
||||||
v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:custom-question'])"
|
type="primary" icon="el-icon-plus" @click="handleCustomQS">
|
||||||
type="primary"
|
|
||||||
icon="el-icon-plus"
|
|
||||||
@click="handleCustomQS"
|
|
||||||
>
|
|
||||||
{{ $t('trials:qcCfg:button:custom') }}
|
{{ $t('trials:qcCfg:button:custom') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button v-if="(!isConfirm && isHaveQCQuestion)"
|
||||||
v-if="(!isConfirm && isHaveQCQuestion)"
|
v-hasPermi="['trials:trials-panel:setting:qc-question:confirm']" type="danger" icon="el-icon-circle-check"
|
||||||
v-hasPermi="['trials:trials-panel:setting:qc-question:confirm']"
|
@click="handleConfirm">
|
||||||
type="danger"
|
|
||||||
icon="el-icon-circle-check"
|
|
||||||
@click="handleConfirm"
|
|
||||||
>
|
|
||||||
{{ $t('trials:qcCfg:button:confirm') }}
|
{{ $t('trials:qcCfg:button:confirm') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button v-if="isConfirm" v-hasPermi="['trials:trials-panel:setting:qc-question:resetQuestion']"
|
||||||
|
type="primary" @click="resetQuestion">
|
||||||
|
{{ $t('trials:qcCfg:button:resetQuestion') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button v-if="isConfirm" v-hasPermi="['trials:trials-panel:setting:qc-question:reviewTask']" type="primary"
|
||||||
|
@click="reviewTask">
|
||||||
|
{{ $t('trials:qcCfg:button:reviewTask') }}
|
||||||
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<!-- <span style="margin-left:auto">-->
|
<!-- <span style="margin-left:auto">-->
|
||||||
<!-- </span>-->
|
<!-- </span>-->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-table
|
<el-table v-adaptive="{ bottomOffset: 45 }" :data="list" stripe height="100"
|
||||||
v-adaptive="{bottomOffset:45}"
|
@selection-change="handleSelectionChange">
|
||||||
:data="list"
|
<el-table-column type="selection" width="55" :selectable="(row) => !row.IsQuestionQCAuditPassed" />
|
||||||
stripe
|
|
||||||
height="100"
|
|
||||||
@selection-change="handleSelectionChange"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
type="selection"
|
|
||||||
width="55"
|
|
||||||
/>
|
|
||||||
<!-- 序号 -->
|
<!-- 序号 -->
|
||||||
<el-table-column
|
<el-table-column prop="ShowOrder" :label="$t('trials:qcCfg:table:order')" width="60" />
|
||||||
prop="ShowOrder"
|
|
||||||
:label="$t('trials:qcCfg:table:order')"
|
|
||||||
width="60"
|
|
||||||
/>
|
|
||||||
<!-- 审核问题 -->
|
<!-- 审核问题 -->
|
||||||
<el-table-column
|
<el-table-column prop="QuestionName" :label="$t('trials:qcCfg:table:questionName')" min-width="300"
|
||||||
prop="QuestionName"
|
show-overflow-tooltip />
|
||||||
:label="$t('trials:qcCfg:table:questionName')"
|
|
||||||
min-width="300"
|
|
||||||
show-overflow-tooltip
|
|
||||||
/>
|
|
||||||
<!-- 审核问题 -->
|
<!-- 审核问题 -->
|
||||||
<!-- <el-table-column-->
|
<!-- <el-table-column-->
|
||||||
<!-- prop="LanguageType"-->
|
<!-- prop="LanguageType"-->
|
||||||
<!-- :label="$t('common:title:languageType')"-->
|
<!-- :label="$t('common:title:languageType')"-->
|
||||||
<!-- show-overflow-tooltip-->
|
<!-- show-overflow-tooltip-->
|
||||||
<!-- width="100"-->
|
<!-- width="100"-->
|
||||||
<!-- >-->
|
<!-- >-->
|
||||||
<!-- <template slot-scope="scope">-->
|
<!-- <template slot-scope="scope">-->
|
||||||
<!-- {{ $fd('LanguageType', scope.row.LanguageType) }}-->
|
<!-- {{ $fd('LanguageType', scope.row.LanguageType) }}-->
|
||||||
<!-- </template>-->
|
<!-- </template>-->
|
||||||
<!-- </el-table-column>-->
|
<!-- </el-table-column>-->
|
||||||
<!-- 类型 -->
|
<!-- 类型 -->
|
||||||
<el-table-column
|
<el-table-column prop="Type" :label="$t('trials:qcCfg:table:type')" show-overflow-tooltip width="120">
|
||||||
prop="Type"
|
|
||||||
:label="$t('trials:qcCfg:table:type')"
|
|
||||||
show-overflow-tooltip
|
|
||||||
width="120"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ $fd('QcType', scope.row.Type) }}
|
{{ $fd('QcType', scope.row.Type) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 选项 -->
|
<!-- 选项 -->
|
||||||
<el-table-column
|
<el-table-column prop="TypeValue" :label="$t('trials:qcCfg:table:typeValue')" show-overflow-tooltip width="180" />
|
||||||
prop="TypeValue"
|
|
||||||
:label="$t('trials:qcCfg:table:typeValue')"
|
|
||||||
show-overflow-tooltip
|
|
||||||
width="180"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- 是否必填 -->
|
<!-- 是否必填 -->
|
||||||
<el-table-column
|
<el-table-column prop="IsRequired" :label="$t('trials:qcCfg:table:isRequired')" width="160">
|
||||||
prop="IsRequired"
|
|
||||||
:label="$t('trials:qcCfg:table:isRequired')"
|
|
||||||
width="160"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ $fd('YesOrNo', scope.row.IsRequired) }}
|
{{ $fd('YesOrNo', scope.row.IsRequired) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 启用状态 -->
|
<!-- 启用状态 -->
|
||||||
<el-table-column
|
<el-table-column prop="IsEnable" :label="$t('trials:qcCfg:table:isEnable')" width="120">
|
||||||
prop="IsEnable"
|
|
||||||
:label="$t('trials:qcCfg:table:isEnable')"
|
|
||||||
width="120"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ $fd('YesOrNo', scope.row.IsEnable) }}
|
{{ $fd('YesOrNo', scope.row.IsEnable) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 父问题 -->
|
<!-- 父问题 -->
|
||||||
<el-table-column
|
<el-table-column prop="ParentShowOrder" :label="$t('trials:qcCfg:table:parentQs')" show-overflow-tooltip
|
||||||
prop="ParentShowOrder"
|
width="160" />
|
||||||
:label="$t('trials:qcCfg:table:parentQs')"
|
|
||||||
show-overflow-tooltip
|
|
||||||
width="160"
|
|
||||||
/>
|
|
||||||
<!-- 父问题触发值 -->
|
<!-- 父问题触发值 -->
|
||||||
<el-table-column
|
<el-table-column prop="ParentTriggerValue" :label="$t('trials:qcCfg:table:parentTriggerValue')"
|
||||||
prop="ParentTriggerValue"
|
show-overflow-tooltip width="160" />
|
||||||
:label="$t('trials:qcCfg:table:parentTriggerValue')"
|
|
||||||
show-overflow-tooltip
|
|
||||||
width="160"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-if="hasPermi(['trials:trials-panel:setting:qc-question:edit','trials:trials-panel:setting:qc-question:delete']) && !isConfirm"
|
v-if="hasPermi(['trials:trials-panel:setting:qc-question:edit', 'trials:trials-panel:setting:qc-question:delete']) && !isConfirm"
|
||||||
:label="$t('common:action:action')"
|
:label="$t('common:action:action')" min-width="150">
|
||||||
min-width="150"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button
|
<el-button v-hasPermi="['trials:trials-panel:setting:qc-question:edit']" circle
|
||||||
v-hasPermi="['trials:trials-panel:setting:qc-question:edit']"
|
:title="$t('common:button:edit')" icon="el-icon-edit-outline" @click="handleEdit(scope.row)" />
|
||||||
circle
|
<el-button v-hasPermi="['trials:trials-panel:setting:qc-question:delete']" circle
|
||||||
:title="$t('common:button:edit')"
|
:title="$t('common:button:delete')" icon="el-icon-delete" @click="handleDelete(scope.row)"
|
||||||
icon="el-icon-edit-outline"
|
:disabled="scope.row.IsQuestionQCAuditPassed" />
|
||||||
@click="handleEdit(scope.row)"
|
|
||||||
/>
|
|
||||||
<el-button
|
|
||||||
v-hasPermi="['trials:trials-panel:setting:qc-question:delete']"
|
|
||||||
circle
|
|
||||||
:title="$t('common:button:delete')"
|
|
||||||
icon="el-icon-delete"
|
|
||||||
@click="handleDelete(scope.row)"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<!-- 新增默认问题 -->
|
<!-- 新增默认问题 -->
|
||||||
<el-dialog
|
<el-dialog v-if="addVisible" :visible.sync="addVisible" width="1200px" :close-on-click-modal="false"
|
||||||
v-if="addVisible"
|
custom-class="base-dialog-wrapper" :title="$t('trials:qcCfg:button:default')">
|
||||||
:visible.sync="addVisible"
|
|
||||||
width="1200px"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
custom-class="base-dialog-wrapper"
|
|
||||||
:title="$t('trials:qcCfg:button:default')"
|
|
||||||
>
|
|
||||||
<div class="base-modal-body">
|
<div class="base-modal-body">
|
||||||
<DefaultQS @getList="getList" @close="addVisible = false" />
|
<DefaultQS @getList="getList" @close="addVisible = false" />
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<!-- 新增/编辑问题 -->
|
<!-- 新增/编辑问题 -->
|
||||||
<el-dialog
|
<el-dialog v-if="qsForm.visible" :visible.sync="qsForm.visible" :close-on-click-modal="false"
|
||||||
v-if="qsForm.visible"
|
custom-class="base-dialog-wrapper" :title="qsForm.title" width="600px">
|
||||||
:visible.sync="qsForm.visible"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
custom-class="base-dialog-wrapper"
|
|
||||||
:title="qsForm.title"
|
|
||||||
width="600px"
|
|
||||||
>
|
|
||||||
<QsForm :data="currentRow" @getList="getList" @close="qsForm.visible = false" />
|
<QsForm :data="currentRow" @getList="getList" @close="qsForm.visible = false" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<!--签名框 -->
|
<!--签名框 -->
|
||||||
<el-dialog
|
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px"
|
||||||
v-if="signVisible"
|
custom-class="base-dialog-wrapper">
|
||||||
:visible.sync="signVisible"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
width="600px"
|
|
||||||
custom-class="base-dialog-wrapper"
|
|
||||||
>
|
|
||||||
<div slot="title">
|
<div slot="title">
|
||||||
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
|
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
|
||||||
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${ currentUser })` }}</span>
|
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${currentUser})` }}</span>
|
||||||
</div>
|
</div>
|
||||||
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
|
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<!-- 预览 -->
|
<!-- 预览 -->
|
||||||
<el-dialog
|
<el-dialog v-if="preview.visible" v-dialogDrag :visible.sync="preview.visible" :close-on-click-modal="false"
|
||||||
v-if="preview.visible"
|
:title="preview.title" width="500px" append-to-body custom-class="base-dialog-wrapper">
|
||||||
v-dialogDrag
|
|
||||||
:visible.sync="preview.visible"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
:title="preview.title"
|
|
||||||
width="500px"
|
|
||||||
append-to-body
|
|
||||||
custom-class="base-dialog-wrapper"
|
|
||||||
>
|
|
||||||
<div class="base-dialog-body">
|
<div class="base-dialog-body">
|
||||||
<QcQuestionPreview :trial-id="trialId" />
|
<QcQuestionPreview :trial-id="trialId" />
|
||||||
</div>
|
</div>
|
||||||
|
@ -311,6 +221,18 @@ export default {
|
||||||
this.getList()
|
this.getList()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 重置问题签名
|
||||||
|
resetQuestion() {
|
||||||
|
const { ResetImageQualityControlQuestion } = const_.processSignature
|
||||||
|
this.signCode = ResetImageQualityControlQuestion
|
||||||
|
this.signVisible = true
|
||||||
|
},
|
||||||
|
// 复核任务签名
|
||||||
|
reviewTask() {
|
||||||
|
const { CreateReviewTask } = const_.processSignature
|
||||||
|
this.signCode = CreateReviewTask
|
||||||
|
this.signVisible = true
|
||||||
|
},
|
||||||
handleSelectionChange(value) {
|
handleSelectionChange(value) {
|
||||||
this.selectedList = value
|
this.selectedList = value
|
||||||
},
|
},
|
||||||
|
|
|
@ -2,54 +2,28 @@
|
||||||
<div v-loading="loading" class="clinical-data-wrapper">
|
<div v-loading="loading" class="clinical-data-wrapper">
|
||||||
<el-tabs type="border-card">
|
<el-tabs type="border-card">
|
||||||
<!-- 既往局部治疗史 -->
|
<!-- 既往局部治疗史 -->
|
||||||
<el-tab-pane
|
<el-tab-pane v-for="cd in clinicalDatas" :key="cd.ClinicalDataTrialSetId" :label="cd.ClinicalDataSetName">
|
||||||
v-for="cd in clinicalDatas"
|
<div v-if="cd.ClinicalUploadType * 1 === 0">
|
||||||
:key="cd.ClinicalDataTrialSetId"
|
|
||||||
:label="cd.ClinicalDataSetName"
|
|
||||||
>
|
|
||||||
<div v-if="cd.ClinicalUploadType*1 === 0">
|
|
||||||
<!-- 既往放疗史 -->
|
<!-- 既往放疗史 -->
|
||||||
<h4>{{ $t('trials:uploadClinicalData:title:pastTreatment') }}</h4>
|
<h4>{{ $t('trials:uploadClinicalData:title:pastTreatment') }}</h4>
|
||||||
<el-table
|
<el-table :data="cd.ClinicalTableData.PreviousHistoryList" style="width: 100%">
|
||||||
:data="cd.ClinicalTableData.PreviousHistoryList"
|
<el-table-column type="index" width="50" />
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
type="index"
|
|
||||||
width="50"
|
|
||||||
/>
|
|
||||||
<!-- 放疗部位 -->
|
<!-- 放疗部位 -->
|
||||||
<el-table-column
|
<el-table-column prop="Position" :label="$t('trials:uploadClinicalData:table:bodyPart')" width="180" />
|
||||||
prop="Position"
|
|
||||||
:label="$t('trials:uploadClinicalData:table:bodyPart')"
|
|
||||||
width="180"
|
|
||||||
/>
|
|
||||||
<!-- 开始日期 -->
|
<!-- 开始日期 -->
|
||||||
<el-table-column
|
<el-table-column prop="StartTime" :label="$t('trials:uploadClinicalData:table:beginDate')" width="180">
|
||||||
prop="StartTime"
|
|
||||||
:label="$t('trials:uploadClinicalData:table:beginDate')"
|
|
||||||
width="180"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.StartTime?moment(scope.row.StartTime).format('YYYY-MM-DD'):'' }}
|
{{ scope.row.StartTime ? moment(scope.row.StartTime).format('YYYY-MM-DD') : '' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 结束日期 -->
|
<!-- 结束日期 -->
|
||||||
<el-table-column
|
<el-table-column prop="EndTime" :label="$t('trials:uploadClinicalData:table:endDate')" width="180">
|
||||||
prop="EndTime"
|
|
||||||
:label="$t('trials:uploadClinicalData:table:endDate')"
|
|
||||||
width="180"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.EndTime?moment(scope.row.EndTime).format('YYYY-MM-DD'):'' }}
|
{{ scope.row.EndTime ? moment(scope.row.EndTime).format('YYYY-MM-DD') : '' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 病灶是否PD -->
|
<!-- 病灶是否PD -->
|
||||||
<el-table-column
|
<el-table-column prop="IsPD" :label="$t('trials:uploadClinicalData:table:isPD')" width="180">
|
||||||
prop="IsPD"
|
|
||||||
:label="$t('trials:uploadClinicalData:table:isPD')"
|
|
||||||
width="180"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ $fd('IsPdEnum', scope.row.IsPD) }}
|
{{ $fd('IsPdEnum', scope.row.IsPD) }}
|
||||||
</template>
|
</template>
|
||||||
|
@ -57,133 +31,71 @@
|
||||||
</el-table>
|
</el-table>
|
||||||
<!-- 既往手术史 -->
|
<!-- 既往手术史 -->
|
||||||
<h4>{{ $t('trials:uploadClinicalData:title:pastSurgery') }}</h4>
|
<h4>{{ $t('trials:uploadClinicalData:title:pastSurgery') }}</h4>
|
||||||
<el-table
|
<el-table :data="cd.ClinicalTableData.PreviousSurgeryList" style="width: 100%">
|
||||||
:data="cd.ClinicalTableData.PreviousSurgeryList"
|
<el-table-column type="index" width="50" />
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
type="index"
|
|
||||||
width="50"
|
|
||||||
/>
|
|
||||||
<!-- 手术名称 -->
|
<!-- 手术名称 -->
|
||||||
<el-table-column
|
<el-table-column prop="OperationName" :label="$t('trials:uploadClinicalData:table:surgeryName')"
|
||||||
prop="OperationName"
|
width="180" />
|
||||||
:label="$t('trials:uploadClinicalData:table:surgeryName')"
|
|
||||||
width="180"
|
|
||||||
/>
|
|
||||||
<!-- 手术日期 -->
|
<!-- 手术日期 -->
|
||||||
<el-table-column
|
<el-table-column prop="OperationTime" :label="$t('trials:uploadClinicalData:table:surgeryDate')"
|
||||||
prop="OperationTime"
|
width="180">
|
||||||
:label="$t('trials:uploadClinicalData:table:surgeryDate')"
|
|
||||||
width="180"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.OperationTime?moment(scope.row.OperationTime).format('YYYY-MM-DD'):'' }}
|
{{ scope.row.OperationTime ? moment(scope.row.OperationTime).format('YYYY-MM-DD') : '' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<!-- 既往其他治疗史 -->
|
<!-- 既往其他治疗史 -->
|
||||||
<h4>{{ $t('trials:uploadClinicalData:title:others') }}</h4>
|
<h4>{{ $t('trials:uploadClinicalData:title:others') }}</h4>
|
||||||
<el-table
|
<el-table :data="cd.ClinicalTableData.PreviousOtherList" style="width: 100%">
|
||||||
:data="cd.ClinicalTableData.PreviousOtherList"
|
<el-table-column type="index" width="50" />
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
type="index"
|
|
||||||
width="50"
|
|
||||||
/>
|
|
||||||
<!-- 治疗类型 -->
|
<!-- 治疗类型 -->
|
||||||
<el-table-column
|
<el-table-column prop="TreatmentType" :label="$t('trials:uploadClinicalData:table:treatmentType')"
|
||||||
prop="TreatmentType"
|
width="180" />
|
||||||
:label="$t('trials:uploadClinicalData:table:treatmentType')"
|
|
||||||
width="180"
|
|
||||||
/>
|
|
||||||
<!-- 开始日期 -->
|
<!-- 开始日期 -->
|
||||||
<el-table-column
|
<el-table-column prop="StartTime" :label="$t('trials:uploadClinicalData:table:treatmentbeginDate')"
|
||||||
prop="StartTime"
|
width="180">
|
||||||
:label="$t('trials:uploadClinicalData:table:treatmentbeginDate')"
|
|
||||||
width="180"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.StartTime?moment(scope.row.StartTime).format('YYYY-MM-DD'):'' }}
|
{{ scope.row.StartTime ? moment(scope.row.StartTime).format('YYYY-MM-DD') : '' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 结束日期 -->
|
<!-- 结束日期 -->
|
||||||
<el-table-column
|
<el-table-column prop="EndTime" :label="$t('trials:uploadClinicalData:table:treatmentendDate')" width="180">
|
||||||
prop="EndTime"
|
|
||||||
:label="$t('trials:uploadClinicalData:table:treatmentendDate')"
|
|
||||||
width="180"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.EndTime?moment(scope.row.EndTime).format('YYYY-MM-DD'):'' }}
|
{{ scope.row.EndTime ? moment(scope.row.EndTime).format('YYYY-MM-DD') : '' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="cd.ClinicalUploadType*1 === 1">
|
<div v-if="cd.ClinicalUploadType * 1 === 1">
|
||||||
<el-table
|
<el-table :data="cd.PDFFileList" style="width: 100%">
|
||||||
:data="cd.PDFFileList"
|
<el-table-column type="index" width="50" />
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
type="index"
|
|
||||||
width="50"
|
|
||||||
/>
|
|
||||||
<!-- 文件名称 -->
|
<!-- 文件名称 -->
|
||||||
<el-table-column
|
<el-table-column prop="FileName" :label="$t('trials:uploadClinicalData:table:fileName')" width="250" />
|
||||||
prop="FileName"
|
|
||||||
:label="$t('trials:uploadClinicalData:table:fileName')"
|
|
||||||
width="250"
|
|
||||||
/>
|
|
||||||
<!-- 上传时间 -->
|
<!-- 上传时间 -->
|
||||||
<el-table-column
|
<el-table-column prop="CreateTime" :label="$t('trials:uploadClinicalData:table:uploadedTime')"
|
||||||
prop="CreateTime"
|
width="200" />
|
||||||
:label="$t('trials:uploadClinicalData:table:uploadedTime')"
|
<el-table-column :label="$t('common:action:action')" width="200">
|
||||||
width="200"
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
:label="$t('common:action:action')"
|
|
||||||
width="200"
|
|
||||||
>
|
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<!-- 预览 -->
|
<!-- 预览 -->
|
||||||
|
|
||||||
<el-button
|
<el-button type="text" size="small" @click.native.prevent="preview(scope.row)">
|
||||||
type="text"
|
|
||||||
size="small"
|
|
||||||
@click.native.prevent="preview(scope.row)"
|
|
||||||
>
|
|
||||||
{{ $t('trials:uploadClinicalData:action:preview') }}
|
{{ $t('trials:uploadClinicalData:action:preview') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="cd.ClinicalUploadType*1 === 2">
|
<div v-if="cd.ClinicalUploadType * 1 === 2">
|
||||||
<clinicalDataQuestions
|
<clinicalDataQuestions :data="cd" :trial-clinical-id="cd.ClinicalDataTrialSetId" :is-viewer="false"
|
||||||
:data="cd"
|
:SecondReviewState="SecondReviewState" :visit-id="cd.VisitId" :subject-id="cd.SubjectId"
|
||||||
:trial-clinical-id="cd.ClinicalDataTrialSetId"
|
:trial-id="cd.TrialId" :reading-id="cd.ReadingId" :clinical-form-id="cd.ClinicalFromList[0].ClinicalFormId"
|
||||||
:is-viewer="false"
|
:open-type="'look'" @close="false" />
|
||||||
:visit-id="cd.VisitId"
|
|
||||||
:subject-id="cd.SubjectId"
|
|
||||||
:trial-id="cd.TrialId"
|
|
||||||
:reading-id="cd.ReadingId"
|
|
||||||
:clinical-form-id="cd.ClinicalFromList[0].ClinicalFormId"
|
|
||||||
:open-type="'look'"
|
|
||||||
@close="false"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
<!-- 预览文件 -->
|
<!-- 预览文件 -->
|
||||||
<el-dialog
|
<el-dialog v-if="previewObj.visible" :visible.sync="previewObj.visible" :title="previewObj.fileName"
|
||||||
v-if="previewObj.visible"
|
:fullscreen="true" append-to-body custom-class="base-dialog-wrapper">
|
||||||
:visible.sync="previewObj.visible"
|
|
||||||
:title="previewObj.fileName"
|
|
||||||
:fullscreen="true"
|
|
||||||
append-to-body
|
|
||||||
custom-class="base-dialog-wrapper"
|
|
||||||
>
|
|
||||||
<div class="base-modal-body" style="border:2px solid #ccc;padding: 10px">
|
<div class="base-modal-body" style="border:2px solid #ccc;padding: 10px">
|
||||||
<PreviewFile v-if="previewObj.visible" :file-path="previewObj.filePath" :file-type="previewObj.fileType" />
|
<PreviewFile v-if="previewObj.visible" :file-path="previewObj.filePath" :file-type="previewObj.fileType" />
|
||||||
</div>
|
</div>
|
||||||
|
@ -209,6 +121,10 @@ export default {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 0
|
default: 0
|
||||||
},
|
},
|
||||||
|
SecondReviewState: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
subjectId: {
|
subjectId: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true
|
||||||
|
@ -234,7 +150,7 @@ export default {
|
||||||
// PreviousOtherList: this.subjectClinicalData.PreviousOtherList,
|
// PreviousOtherList: this.subjectClinicalData.PreviousOtherList,
|
||||||
// PreviousPDFList: this.subjectClinicalData.PreviousPDFList,
|
// PreviousPDFList: this.subjectClinicalData.PreviousPDFList,
|
||||||
moment,
|
moment,
|
||||||
previewObj:{visible:false,filePath:'',fileType:''},
|
previewObj: { visible: false, filePath: '', fileType: '' },
|
||||||
clinicalDatas: []
|
clinicalDatas: []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -247,7 +163,7 @@ export default {
|
||||||
if (!row.FileName) return
|
if (!row.FileName) return
|
||||||
this.previewObj.fileName = row.FileName
|
this.previewObj.fileName = row.FileName
|
||||||
this.previewObj.filePath = row.Path
|
this.previewObj.filePath = row.Path
|
||||||
this.previewObj.fileType ='pdf'
|
this.previewObj.fileType = 'pdf'
|
||||||
this.previewObj.visible = true
|
this.previewObj.visible = true
|
||||||
// window.open(this.OSSclientConfig.basePath + path, '_blank')
|
// window.open(this.OSSclientConfig.basePath + path, '_blank')
|
||||||
},
|
},
|
||||||
|
@ -284,4 +200,3 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -49,8 +49,8 @@
|
||||||
<el-button v-if="
|
<el-button v-if="
|
||||||
$store.state.trials.config.IsSupportQCDownloadImage &&
|
$store.state.trials.config.IsSupportQCDownloadImage &&
|
||||||
!hasPermi(['role:spm'])
|
!hasPermi(['role:spm'])
|
||||||
" :loading="downloading" :disabled="selectTableDicom.length <= 0" size="small" type="primary"
|
" :loading="downloading" :disabled="selectTableDicom.length <= 0 || SecondReviewState > 0" size="small"
|
||||||
style="margin-left: 10px" @click="getCRCUploadedStudyInfo('dicom')">
|
type="primary" style="margin-left: 10px" @click="getCRCUploadedStudyInfo('dicom')">
|
||||||
{{ $t('trials:audit:button:downLoadAllDiocms') }}
|
{{ $t('trials:audit:button:downLoadAllDiocms') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- 预览所有影像 -->
|
<!-- 预览所有影像 -->
|
||||||
|
@ -136,7 +136,8 @@
|
||||||
:disabled="scope.row.IsDeleted" @click="handlePreviewStudy(scope.row)" />
|
:disabled="scope.row.IsDeleted" @click="handlePreviewStudy(scope.row)" />
|
||||||
<!-- 编辑 -->
|
<!-- 编辑 -->
|
||||||
<el-button icon="el-icon-edit-outline" :title="$t('trials:audit:action:edit')" circle
|
<el-button icon="el-icon-edit-outline" :title="$t('trials:audit:action:edit')" circle
|
||||||
:disabled="isAudit || scope.row.IsDeleted" @click="handleEditStudy(scope.row)" />
|
:disabled="isAudit || scope.row.IsDeleted || SecondReviewState > 0"
|
||||||
|
@click="handleEditStudy(scope.row)" />
|
||||||
<!-- 预览PET-CT数据 -->
|
<!-- 预览PET-CT数据 -->
|
||||||
<el-button type="primary" icon="el-icon-document tip-i" :title="$t('trials:audit:tab:clinicalData')"
|
<el-button type="primary" icon="el-icon-document tip-i" :title="$t('trials:audit:tab:clinicalData')"
|
||||||
v-if="
|
v-if="
|
||||||
|
@ -180,7 +181,8 @@
|
||||||
<!-- 是否阅片 -->
|
<!-- 是否阅片 -->
|
||||||
<el-table-column prop="IsReading" :label="$t('trials:audit:table:isReading')" sortable>
|
<el-table-column prop="IsReading" :label="$t('trials:audit:table:isReading')" sortable>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-switch v-model="scope.row.IsReading" :disabled="scope.row.IsDeleted || isAudit"
|
<el-switch v-model="scope.row.IsReading"
|
||||||
|
:disabled="scope.row.IsDeleted || isAudit || SecondReviewState > 0"
|
||||||
@change="changeReadingStatus($event, scope.row)" :active-text="$fd('YesOrNo', true)"
|
@change="changeReadingStatus($event, scope.row)" :active-text="$fd('YesOrNo', true)"
|
||||||
:inactive-text="$fd('YesOrNo', false)" />
|
:inactive-text="$fd('YesOrNo', false)" />
|
||||||
</template>
|
</template>
|
||||||
|
@ -188,7 +190,7 @@
|
||||||
<!-- 是否删除 复审时删除的序列不可再次编辑 -->
|
<!-- 是否删除 复审时删除的序列不可再次编辑 -->
|
||||||
<el-table-column prop="IsDeleted" :label="$t('trials:audit:table:isDelete')" sortable>
|
<el-table-column prop="IsDeleted" :label="$t('trials:audit:table:isDelete')" sortable>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-switch v-model="scope.row.IsDeleted" :disabled="isAudit"
|
<el-switch v-model="scope.row.IsDeleted" :disabled="isAudit || SecondReviewState > 0"
|
||||||
@change="changeDeleteStatus($event, scope.row)" :active-text="$fd('YesOrNo', true)"
|
@change="changeDeleteStatus($event, scope.row)" :active-text="$fd('YesOrNo', true)"
|
||||||
:inactive-text="$fd('YesOrNo', false)" />
|
:inactive-text="$fd('YesOrNo', false)" />
|
||||||
</template>
|
</template>
|
||||||
|
@ -242,8 +244,8 @@
|
||||||
<el-button v-if="
|
<el-button v-if="
|
||||||
$store.state.trials.config.IsSupportQCDownloadImage &&
|
$store.state.trials.config.IsSupportQCDownloadImage &&
|
||||||
!hasPermi(['role:spm'])
|
!hasPermi(['role:spm'])
|
||||||
" :loading="downloading" :disabled="selectTableNonedicom.length <= 0" size="small" type="primary"
|
" :loading="downloading" :disabled="selectTableNonedicom.length <= 0 || SecondReviewState > 0"
|
||||||
style="margin-left: 10px" @click="getCRCUploadedStudyInfo('noneDicom')">
|
size="small" type="primary" style="margin-left: 10px" @click="getCRCUploadedStudyInfo('noneDicom')">
|
||||||
{{ $t('trials:audit:button:downLoadAllNonDiocms') }}
|
{{ $t('trials:audit:button:downLoadAllNonDiocms') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- 预览 -->
|
<!-- 预览 -->
|
||||||
|
@ -347,7 +349,7 @@
|
||||||
<!-- 是否删除 -->
|
<!-- 是否删除 -->
|
||||||
<el-table-column prop="IsDeleted" :label="$t('trials:audit:table:isDelete')" sortable>
|
<el-table-column prop="IsDeleted" :label="$t('trials:audit:table:isDelete')" sortable>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-switch v-model="scope.row.IsDeleted" :disabled="isAudit"
|
<el-switch v-model="scope.row.IsDeleted" :disabled="isAudit || SecondReviewState > 0"
|
||||||
@change="changeDeleteStatus($event, scope.row, true)" :active-text="$fd('YesOrNo', true)"
|
@change="changeDeleteStatus($event, scope.row, true)" :active-text="$fd('YesOrNo', true)"
|
||||||
:inactive-text="$fd('YesOrNo', false)" />
|
:inactive-text="$fd('YesOrNo', false)" />
|
||||||
</template>
|
</template>
|
||||||
|
@ -361,7 +363,8 @@
|
||||||
" />
|
" />
|
||||||
<!-- 编辑 -->
|
<!-- 编辑 -->
|
||||||
<el-button icon="el-icon-edit-outline" :title="$t('trials:audit:button:nonDicomsEdit')" circle
|
<el-button icon="el-icon-edit-outline" :title="$t('trials:audit:button:nonDicomsEdit')" circle
|
||||||
:disabled="isAudit" @click.native.prevent="handleEditNoneDicomInfo(scope.row)" />
|
:disabled="isAudit || SecondReviewState > 0"
|
||||||
|
@click.native.prevent="handleEditNoneDicomInfo(scope.row)" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
@ -369,9 +372,10 @@
|
||||||
<!-- 临床数据 -->
|
<!-- 临床数据 -->
|
||||||
<!-- data.IsBaseLine && relationInfo.TrialClinicalInformationTransmissionEnum*1>0 && data.IsHaveClinicalData -->
|
<!-- data.IsBaseLine && relationInfo.TrialClinicalInformationTransmissionEnum*1>0 && data.IsHaveClinicalData -->
|
||||||
<el-tab-pane v-if="data.IsHaveClinicalData" :label="$t('trials:audit:tab:clinicalData')" name="clinical-data">
|
<el-tab-pane v-if="data.IsHaveClinicalData" :label="$t('trials:audit:tab:clinicalData')" name="clinical-data">
|
||||||
<ClinicalData v-if="Object.keys(subjectClinicalData).length > 0" :data="data" style="margin-top: 5px"
|
<ClinicalData v-if="JSON.stringify(subjectClinicalData) != '{}'" :data="data" style="margin-top: 5px"
|
||||||
:subject-clinical-data="subjectClinicalData" :enum-type="relationInfo.TrialClinicalInformationTransmissionEnum * 1
|
:subject-clinical-data="subjectClinicalData" :SecondReviewState="SecondReviewState"
|
||||||
" :subject-visit-id="data.Id" :is-audit="isAudit" :subject-id="data.SubjectId" />
|
:enum-type="relationInfo.TrialClinicalInformationTransmissionEnum * 1" :subject-visit-id="data.Id"
|
||||||
|
:is-audit="isAudit" :subject-id="data.SubjectId"></ClinicalData>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
@ -384,12 +388,38 @@
|
||||||
<div v-if="qCQuestionAnswerList.length > 0" style="overflow-y: auto">
|
<div v-if="qCQuestionAnswerList.length > 0" style="overflow-y: auto">
|
||||||
<QuestionForm ref="questions" :trial-id="trialId" :subject-visit-id="data.Id"
|
<QuestionForm ref="questions" :trial-id="trialId" :subject-visit-id="data.Id"
|
||||||
:qc-process-enum="data.QCProcessEnum" :current-q-c-enum="currentQCType" :answers="qCQuestionAnswerList"
|
:qc-process-enum="data.QCProcessEnum" :current-q-c-enum="currentQCType" :answers="qCQuestionAnswerList"
|
||||||
:is-audit="isAudit" />
|
:is-audit="isAudit || SecondReviewState > 0" />
|
||||||
</div>
|
</div>
|
||||||
<!-- 暂无数据 -->
|
<!-- 暂无数据 -->
|
||||||
<h3 v-else>{{ $t('trials:audit:message:noData') }}</h3>
|
<h3 v-else>{{ $t('trials:audit:message:noData') }}</h3>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
<!-- 复核问题 -->
|
||||||
|
<el-card shadow="hover" style="margin-top: 10px" v-if="!isAudit && SecondReviewState > 0">
|
||||||
|
<!-- 复核问题 -->
|
||||||
|
<h3>{{ $t('trials:audit:title:resetQuestions') }}</h3>
|
||||||
|
<div style="overflow-y: auto">
|
||||||
|
<QuestionForm :ref="`questions_${SecondReviewTime}`" :trial-id="trialId" :subject-visit-id="data.Id"
|
||||||
|
:qc-process-enum="data.QCProcessEnum" :current-q-c-enum="currentQCType" :is-audit="isAudit"
|
||||||
|
:SecondReviewTime="SecondReviewTime" />
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
<!-- 复核问题查看 -->
|
||||||
|
<el-card shadow="hover" style="margin-top: 10px" v-else>
|
||||||
|
<el-tabs v-model="secondReviewActiveName" type="card"
|
||||||
|
v-if="secondReviewList.length > 0 && secondReviewList.find(item => item.SignTime)">
|
||||||
|
<template v-for="item in secondReviewList">
|
||||||
|
<el-tab-pane :key="item.SecondReviewTime" v-if="item.SignTime"
|
||||||
|
:label="`${$t('trials:audit:tab:title:resetQuestions')} ${item.FullName}(${item.SignTime})`"
|
||||||
|
:name="item.SecondReviewTime">
|
||||||
|
<h3>{{ $t('trials:audit:title:resetQuestions') }}</h3>
|
||||||
|
<div style="overflow-y: auto">
|
||||||
|
<QuestionForm :trial-id="trialId" :subject-visit-id="data.Id" :qc-process-enum="data.QCProcessEnum"
|
||||||
|
:current-q-c-enum="currentQCType" :is-audit="isAudit" :SecondReviewTime="item.SecondReviewTime" />
|
||||||
|
</div>
|
||||||
|
</el-tab-pane>
|
||||||
|
</template>
|
||||||
|
</el-tabs>
|
||||||
|
</el-card>
|
||||||
<!-- 发起质疑 -->
|
<!-- 发起质疑 -->
|
||||||
<el-dialog v-if="qcVisible" :title="$t('trials:audit:dialogTitle:question')" :visible.sync="qcVisible"
|
<el-dialog v-if="qcVisible" :title="$t('trials:audit:dialogTitle:question')" :visible.sync="qcVisible"
|
||||||
:close-on-click-modal="false" append-to-body custom-class="base-dialog-wrapper" width="1000px">
|
:close-on-click-modal="false" append-to-body custom-class="base-dialog-wrapper" width="1000px">
|
||||||
|
@ -768,14 +798,40 @@
|
||||||
style="height: 500px; width: 500px" @error="imgObj.loading = false" @load="imgObj.loading = false" />
|
style="height: 500px; width: 500px" @error="imgObj.loading = false" @load="imgObj.loading = false" />
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
<!-- 指派 -->
|
||||||
|
<el-dialog v-if="assignObj.visible" :visible.sync="assignObj.visible"
|
||||||
|
:title="$t('trials:audit:dialogTitle:assign')" width="500px" append-to-body>
|
||||||
|
<el-form :model="assignForm" :rules="assignRules" ref="assignForm" label-width="100px" class="demo-ruleForm">
|
||||||
|
<el-form-item :label="$t('trials:audit:form:assign')" prop="ReplaceUserRoleId">
|
||||||
|
<el-select v-model="assignForm.ReplaceUserRoleId" placeholder="">
|
||||||
|
<el-option v-for="item in userRoleList" :key="item.UserRoleId"
|
||||||
|
:label="`${item.UserName}(${item.FullName})`" :value="item.UserRoleId" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<span slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="assignObj.visible = false">{{ $t("common:button:cancel") }}</el-button>
|
||||||
|
<el-button type="primary" @click="assign">{{ $t("common:button:save") }}</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
<div class="function-wrapper">
|
<div class="function-wrapper">
|
||||||
|
<!-- 复核通过 -->
|
||||||
|
<el-button :disabled="isAudit || SecondReviewState <= 0" size="small" type="primary" round
|
||||||
|
v-if="SecondReviewState > 0" @click="handleResetSave">
|
||||||
|
{{ $t('trials:audit:button:reviewTask') }}
|
||||||
|
</el-button>
|
||||||
|
<!-- 指派 -->
|
||||||
|
<el-button :disabled="isAudit" v-if="SecondReviewState <= 0" size="small" type="primary" round
|
||||||
|
@click="handleAssign">
|
||||||
|
{{ $t('trials:audit:button:assign') }}
|
||||||
|
</el-button>
|
||||||
<!-- 保存 -->
|
<!-- 保存 -->
|
||||||
<el-button :disabled="isAudit" size="small" type="primary" round @click="handleSave(false)">
|
<el-button :disabled="isAudit" size="small" type="primary" round @click="handleSave(false)">
|
||||||
{{ $t('trials:audit:button:save') }}
|
{{ $t('trials:audit:button:save') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- 发质疑 -->
|
<!-- 发质疑 -->
|
||||||
<el-button :disabled="isAudit" size="small" type="primary" round @click="handleQC">
|
<el-button :disabled="isAudit || SecondReviewState > 0" size="small" type="primary" round @click="handleQC">
|
||||||
{{ $t('trials:audit:button:question') }}
|
{{ $t('trials:audit:button:question') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- 历史质疑 -->
|
<!-- 历史质疑 -->
|
||||||
|
@ -792,7 +848,8 @@
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
<!-- 审核通过 -->
|
<!-- 审核通过 -->
|
||||||
<el-button :disabled="isAudit" size="small" type="primary" round @click="handleQCState(8)">
|
<el-button :disabled="isAudit || SecondReviewState > 0" size="small" type="primary" round
|
||||||
|
@click="handleQCState(8)">
|
||||||
{{ $t('trials:audit:button:auditPassed') }}
|
{{ $t('trials:audit:button:auditPassed') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- 审核终止 -->
|
<!-- 审核终止 -->
|
||||||
|
@ -800,7 +857,7 @@
|
||||||
<!-- {{ $t('trials:audit:button:auditFailed') }}-->
|
<!-- {{ $t('trials:audit:button:auditFailed') }}-->
|
||||||
<!-- </el-button>-->
|
<!-- </el-button>-->
|
||||||
</div>
|
</div>
|
||||||
<!--pet-ct临床数据预览-->
|
<!--petct临床数据预览-->
|
||||||
<el-dialog v-if="petVisible" :show-close="true" :visible.sync="petVisible" append-to-body>
|
<el-dialog v-if="petVisible" :show-close="true" :visible.sync="petVisible" append-to-body>
|
||||||
<uploadPetClinicalData :subject-visit-id="data.Id" :data="data" :studyData="rowData" :allow-add-or-edit="false" />
|
<uploadPetClinicalData :subject-visit-id="data.Id" :data="data" :studyData="rowData" :allow-add-or-edit="false" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
@ -825,6 +882,8 @@ import {
|
||||||
closeQCChallenge,
|
closeQCChallenge,
|
||||||
updateModality,
|
updateModality,
|
||||||
getQCChallengeDialogList,
|
getQCChallengeDialogList,
|
||||||
|
replaceQCTaskActionUser,
|
||||||
|
getTrialUserRoleList
|
||||||
} from '@/api/trials'
|
} from '@/api/trials'
|
||||||
import { qCPassedOrFailed } from '@/api/trials/visit'
|
import { qCPassedOrFailed } from '@/api/trials/visit'
|
||||||
import { getBasicDataSelects } from '@/api/dictionary/dictionary'
|
import { getBasicDataSelects } from '@/api/dictionary/dictionary'
|
||||||
|
@ -863,6 +922,10 @@ export default {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 1,
|
default: 1,
|
||||||
},
|
},
|
||||||
|
SecondReviewState: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
isEN() {
|
isEN() {
|
||||||
|
@ -922,7 +985,7 @@ export default {
|
||||||
},
|
},
|
||||||
subjectClinicalData: {},
|
subjectClinicalData: {},
|
||||||
moment,
|
moment,
|
||||||
currentQCType: null,
|
currentQCType: 0,
|
||||||
currentUser: zzSessionStorage.getItem('userName'),
|
currentUser: zzSessionStorage.getItem('userName'),
|
||||||
pickerOption: {
|
pickerOption: {
|
||||||
disabledDate: (time) => {
|
disabledDate: (time) => {
|
||||||
|
@ -947,6 +1010,14 @@ export default {
|
||||||
currentSeriesIsReading: false,
|
currentSeriesIsReading: false,
|
||||||
currentSeriesIsDeleted: false,
|
currentSeriesIsDeleted: false,
|
||||||
imgObj: { url: '', visible: false, loading: false },
|
imgObj: { url: '', visible: false, loading: false },
|
||||||
|
userRoleList: [],
|
||||||
|
assignObj: { visible: false, loading: false },
|
||||||
|
assignForm: { ReplaceUserRoleId: null },
|
||||||
|
assignRules: {
|
||||||
|
ReplaceUserRoleId: [
|
||||||
|
{ required: true, message: this.$t("common:ruleMessage:select"), trigger: 'change' }
|
||||||
|
]
|
||||||
|
},
|
||||||
open: null,
|
open: null,
|
||||||
existsManual: false,
|
existsManual: false,
|
||||||
|
|
||||||
|
@ -961,6 +1032,11 @@ export default {
|
||||||
selectTableDicom: [], // 选中的dicom数据
|
selectTableDicom: [], // 选中的dicom数据
|
||||||
selectTableNonedicom: [], // 选中的非dicom数据
|
selectTableNonedicom: [], // 选中的非dicom数据
|
||||||
downloadId: null,
|
downloadId: null,
|
||||||
|
|
||||||
|
secondReviewList: [],
|
||||||
|
secondReviewActiveName: null,
|
||||||
|
SecondReviewTime: '',
|
||||||
|
IsSecondPass: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
|
@ -969,10 +1045,10 @@ export default {
|
||||||
this.isAudit = true
|
this.isAudit = true
|
||||||
this.currentQCType = this.qType
|
this.currentQCType = this.qType
|
||||||
} else {
|
} else {
|
||||||
this.currentQCType = this.data.AuditState < 6 ? 1 : 2
|
this.currentQCType = this.data.QCProcessEnum === 2 && this.data.PreliminaryAuditUserId ? 2 : 1
|
||||||
|
|
||||||
}
|
}
|
||||||
window.addEventListener('message', this.receiveMsg)
|
window.addEventListener('message', this.receiveMsg)
|
||||||
|
|
||||||
this.trialId = this.$route.query.trialId
|
this.trialId = this.$route.query.trialId
|
||||||
this.getQCInfo()
|
this.getQCInfo()
|
||||||
this.getDicData()
|
this.getDicData()
|
||||||
|
@ -1009,7 +1085,6 @@ export default {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (type === 'noneDicom') {
|
if (type === 'noneDicom') {
|
||||||
console.log(this.selectTableNonedicom)
|
|
||||||
data.NoneDicomStudyIdList = this.selectTableNonedicom.map(
|
data.NoneDicomStudyIdList = this.selectTableNonedicom.map(
|
||||||
(item) => item.Id
|
(item) => item.Id
|
||||||
)
|
)
|
||||||
|
@ -1126,6 +1201,14 @@ export default {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
getVisitQCInfo(this.data.Id, this.data.QCProcessEnum, this.currentQCType)
|
getVisitQCInfo(this.data.Id, this.data.QCProcessEnum, this.currentQCType)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
this.secondReviewList = res.Result.SecondReviewList
|
||||||
|
if (this.secondReviewList.length > 0) {
|
||||||
|
let data = this.secondReviewList.find(item => item.SignTime) || {}
|
||||||
|
this.secondReviewActiveName = data.SecondReviewTime
|
||||||
|
if (!this.isAudit) {
|
||||||
|
this.SecondReviewTime = this.secondReviewList[0].SecondReviewTime
|
||||||
|
}
|
||||||
|
}
|
||||||
this.existsManual = res.Result.ExistsManual
|
this.existsManual = res.Result.ExistsManual
|
||||||
this.qCQuestionAnswerList = res.Result.QCQuestionAnswerList
|
this.qCQuestionAnswerList = res.Result.QCQuestionAnswerList
|
||||||
this.IsHaveStudyClinicalData = res.Result.IsHaveStudyClinicalData
|
this.IsHaveStudyClinicalData = res.Result.IsHaveStudyClinicalData
|
||||||
|
@ -1159,7 +1242,8 @@ export default {
|
||||||
res.Result.RelationInfo.IsHaveFirstGiveMedicineDate
|
res.Result.RelationInfo.IsHaveFirstGiveMedicineDate
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch((err) => {
|
||||||
|
console.log(err)
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -1170,7 +1254,7 @@ export default {
|
||||||
this.trialId,
|
this.trialId,
|
||||||
this.data.Id,
|
this.data.Id,
|
||||||
this.data.QCProcessEnum,
|
this.data.QCProcessEnum,
|
||||||
this.currentQCType
|
this.SecondReviewState > 0 ? 3 : this.currentQCType
|
||||||
)
|
)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
|
@ -1183,24 +1267,74 @@ export default {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
// 指派
|
||||||
|
async handleAssign() {
|
||||||
|
try {
|
||||||
|
let params = {
|
||||||
|
TrialId: this.data.TrialId,
|
||||||
|
UserTypeEnum: 3,
|
||||||
|
SubjectVisitId: this.data.Id
|
||||||
|
}
|
||||||
|
let res = await getTrialUserRoleList(params)
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.userRoleList = res.Result
|
||||||
|
this.assignObj.visible = true
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async assign() {
|
||||||
|
try {
|
||||||
|
let validate = await this.$refs.assignForm.validate()
|
||||||
|
if (!validate) return false
|
||||||
|
let res = await replaceQCTaskActionUser(this.data.TrialId, this.data.Id, this.assignForm)
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.$emit('getList')
|
||||||
|
this.assignObj.visible = false
|
||||||
|
this.$emit("close")
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
if (err.Code === 5 && err.ErrorMessage) {
|
||||||
|
this.$confirm(err.ErrorMessage, {
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: false,
|
||||||
|
callback: (action) => { },
|
||||||
|
})
|
||||||
|
this.$emit('getList')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
// 保存审核问题
|
// 保存审核问题
|
||||||
handleSave(isMessage) {
|
handleSave(isMessage = false) {
|
||||||
return new Promise(async (resolve) => {
|
return new Promise(async (resolve) => {
|
||||||
try {
|
try {
|
||||||
let res = null
|
let res = null, refKey = 'questions'
|
||||||
|
if (this.SecondReviewState > 0) {
|
||||||
|
refKey += `_${this.SecondReviewTime}`
|
||||||
|
}
|
||||||
if (isMessage) {
|
if (isMessage) {
|
||||||
res = await this.$refs['questions'].submit()
|
res = await this.$refs[refKey].submit()
|
||||||
} else {
|
} else {
|
||||||
res = await this.$refs['questions'].save()
|
res = await this.$refs[refKey].save()
|
||||||
}
|
}
|
||||||
var answerList = []
|
var answerList = []
|
||||||
res.forEach((item) => {
|
res.forEach((item) => {
|
||||||
var index = this.qCQuestionAnswerList.findIndex(
|
if (this.SecondReviewState <= 0) {
|
||||||
(v) => v.TrialQCQuestionConfigureId === item.Id
|
var index = this.qCQuestionAnswerList.findIndex(
|
||||||
)
|
(v) => v.TrialQCQuestionConfigureId === item.Id
|
||||||
if (index > -1) {
|
)
|
||||||
|
if (index > -1) {
|
||||||
|
answerList.push({
|
||||||
|
id: this.qCQuestionAnswerList[index].Id,
|
||||||
|
answer: item.answer,
|
||||||
|
trialQCQuestionConfigureId: item.Id,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
answerList.push({
|
answerList.push({
|
||||||
id: this.qCQuestionAnswerList[index].Id,
|
id: item.AnswerId,
|
||||||
answer: item.answer,
|
answer: item.answer,
|
||||||
trialQCQuestionConfigureId: item.Id,
|
trialQCQuestionConfigureId: item.Id,
|
||||||
})
|
})
|
||||||
|
@ -1211,7 +1345,7 @@ export default {
|
||||||
this.trialId,
|
this.trialId,
|
||||||
this.data.Id,
|
this.data.Id,
|
||||||
this.data.QCProcessEnum,
|
this.data.QCProcessEnum,
|
||||||
this.currentQCType,
|
this.SecondReviewState > 0 ? 3 : this.currentQCType,
|
||||||
answerList
|
answerList
|
||||||
)
|
)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
@ -1222,7 +1356,12 @@ export default {
|
||||||
this.$t('common:message:savedSuccessfully')
|
this.$t('common:message:savedSuccessfully')
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
this.getCheckList()
|
if (this.SecondReviewState <= 0) {
|
||||||
|
this.getCheckList()
|
||||||
|
} else {
|
||||||
|
this.$refs[refKey].getQuestions()
|
||||||
|
}
|
||||||
|
|
||||||
resolve(true)
|
resolve(true)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -1647,6 +1786,22 @@ export default {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
// 复核通过
|
||||||
|
async handleResetSave() {
|
||||||
|
try {
|
||||||
|
this.loading = true
|
||||||
|
var isVerify = await this.handleSave(true)
|
||||||
|
if (!isVerify) {
|
||||||
|
return this.loading = false
|
||||||
|
}
|
||||||
|
this.IsSecondPass = true
|
||||||
|
const { ReviewImageQualityControlQuestion } = const_.processSignature
|
||||||
|
this.signCode = ReviewImageQualityControlQuestion
|
||||||
|
this.signVisible = true
|
||||||
|
} catch (err) {
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
// 设置qc通过/不通过
|
// 设置qc通过/不通过
|
||||||
async handleQCState(auditState) {
|
async handleQCState(auditState) {
|
||||||
if (auditState === 7) {
|
if (auditState === 7) {
|
||||||
|
@ -1779,7 +1934,8 @@ export default {
|
||||||
data: {
|
data: {
|
||||||
TrialId: this.trialId,
|
TrialId: this.trialId,
|
||||||
SubjectVisitId: this.data.Id,
|
SubjectVisitId: this.data.Id,
|
||||||
AuditState: this.auditState,
|
AuditState: this.signCode === 219 ? 1 : this.auditState,
|
||||||
|
IsSecondPass: this.signCode === 219 ? this.IsSecondPass : null
|
||||||
},
|
},
|
||||||
signInfo: signInfo,
|
signInfo: signInfo,
|
||||||
}
|
}
|
||||||
|
@ -1792,6 +1948,10 @@ export default {
|
||||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
// this.getQCInfo()
|
// this.getQCInfo()
|
||||||
this.isAudit = true
|
this.isAudit = true
|
||||||
|
if (this.signCode === 219) {
|
||||||
|
this.$emit('getList')
|
||||||
|
return this.getQCInfo()
|
||||||
|
}
|
||||||
this.$forceUpdate()
|
this.$forceUpdate()
|
||||||
getNextIQCQuality({
|
getNextIQCQuality({
|
||||||
trialId: this.trialId,
|
trialId: this.trialId,
|
||||||
|
@ -1986,7 +2146,7 @@ export default {
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
const routeData = this.$router.resolve({
|
const routeData = this.$router.resolve({
|
||||||
path: `/showvisitdicoms?trialId=${this.data.TrialId}&visitInfo=${this.data.VisitName
|
path: `/showvisitdicoms?trialId=${this.data.TrialId}&visitInfo=${this.data.VisitName
|
||||||
}(${this.data.VisitNum})&subjectVisitId=${this.data.Id}&showDelete=${this.isAudit ? 0 : 1
|
}(${this.data.VisitNum})&subjectVisitId=${this.data.Id}&showDelete=${this.isAudit || this.SecondReviewState > 0 ? 0 : 1
|
||||||
}&TokenKey=${token}`,
|
}&TokenKey=${token}`,
|
||||||
})
|
})
|
||||||
this.open = window.open(routeData.href, '_blank')
|
this.open = window.open(routeData.href, '_blank')
|
||||||
|
@ -2052,7 +2212,7 @@ export default {
|
||||||
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&TokenKey=${token}&isReading=1`,
|
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&TokenKey=${token}&isReading=1`,
|
||||||
})
|
})
|
||||||
: this.$router.resolve({
|
: this.$router.resolve({
|
||||||
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&TokenKey=${token}&isQcCheck=1`,
|
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&TokenKey=${token}&isQcCheck=${this.SecondReviewState > 0 ? 0 : 1}`,
|
||||||
})
|
})
|
||||||
this.open = window.open(routeData.href, '_blank')
|
this.open = window.open(routeData.href, '_blank')
|
||||||
},
|
},
|
||||||
|
@ -2064,7 +2224,7 @@ export default {
|
||||||
let trialId = this.$route.query.trialId
|
let trialId = this.$route.query.trialId
|
||||||
var token = getToken()
|
var token = getToken()
|
||||||
const routeData = this.$router.resolve({
|
const routeData = this.$router.resolve({
|
||||||
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&studyId=${row.Id}&TokenKey=${token}&isQcCheck=1`,
|
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&studyId=${row.Id}&TokenKey=${token}&isQcCheck=${this.SecondReviewState > 0 ? 0 : 1}`,
|
||||||
})
|
})
|
||||||
this.open = window.open(routeData.href, '_blank')
|
this.open = window.open(routeData.href, '_blank')
|
||||||
},
|
},
|
||||||
|
|
|
@ -37,6 +37,10 @@ export default {
|
||||||
isAudit: {
|
isAudit: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
SecondReviewTime: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
@ -44,9 +48,17 @@ export default {
|
||||||
loading: false,
|
loading: false,
|
||||||
questions: [],
|
questions: [],
|
||||||
questionForm: {},
|
questionForm: {},
|
||||||
|
AnswerIdObj: {},
|
||||||
isRender: false
|
isRender: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
SecondReviewTime() {
|
||||||
|
if (this.SecondReviewTime) {
|
||||||
|
this.getQuestions()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.getQuestions()
|
this.getQuestions()
|
||||||
},
|
},
|
||||||
|
@ -54,14 +66,18 @@ export default {
|
||||||
getQuestions() {
|
getQuestions() {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
var param = {
|
var param = {
|
||||||
trialId: this.trialId,
|
trialId: this.trialId || this.$route.query.trialId,
|
||||||
subjectVisitId: this.subjectVisitId,
|
subjectVisitId: this.subjectVisitId,
|
||||||
qcProcessEnum: this.qcProcessEnum,
|
qcProcessEnum: this.qcProcessEnum,
|
||||||
currentQCEnum: this.currentQCEnum
|
currentQCEnum: this.SecondReviewTime ? 3 : this.currentQCEnum
|
||||||
|
}
|
||||||
|
if (this.SecondReviewTime) {
|
||||||
|
param.SecondReviewTime = this.SecondReviewTime
|
||||||
}
|
}
|
||||||
getQCQuestionAnswer(param).then(res => {
|
getQCQuestionAnswer(param).then(res => {
|
||||||
res.Result.map((v) => {
|
res.Result.map((v) => {
|
||||||
this.$set(this.questionForm, v.Id, v.Answer)
|
this.$set(this.questionForm, v.Id, v.Answer)
|
||||||
|
this.$set(this.AnswerIdObj, v.Id, v.AnswerId)
|
||||||
if (v.Childrens.length > 0) {
|
if (v.Childrens.length > 0) {
|
||||||
this.setChild(v.Childrens)
|
this.setChild(v.Childrens)
|
||||||
}
|
}
|
||||||
|
@ -70,11 +86,12 @@ export default {
|
||||||
|
|
||||||
this.isRender = true
|
this.isRender = true
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}).catch(() => { this.loading = false })
|
}).catch((err) => { console.log(err); this.loading = false })
|
||||||
},
|
},
|
||||||
setChild(obj) {
|
setChild(obj) {
|
||||||
obj.forEach(i => {
|
obj.forEach(i => {
|
||||||
this.$set(this.questionForm, i.Id, i.Answer)
|
this.$set(this.questionForm, i.Id, i.Answer)
|
||||||
|
this.$set(this.AnswerIdObj, i.Id, i.AnswerId)
|
||||||
if (i.Childrens && i.Childrens.length > 0) {
|
if (i.Childrens && i.Childrens.length > 0) {
|
||||||
this.setChild(i.Childrens)
|
this.setChild(i.Childrens)
|
||||||
}
|
}
|
||||||
|
@ -87,7 +104,11 @@ export default {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.$refs['questionForm'].validate(valid => {
|
this.$refs['questionForm'].validate(valid => {
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
this.$confirm(this.$t('trials:audit:message:specifyQuestions'), {
|
let message = this.$t('trials:audit:message:specifyQuestions')
|
||||||
|
if (this.SecondReviewTime) {
|
||||||
|
message = this.$t('trials:audit:message:specifyResetQuestions')
|
||||||
|
}
|
||||||
|
this.$confirm(message, {
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
showCancelButton: false,
|
showCancelButton: false,
|
||||||
callback: action => { }
|
callback: action => { }
|
||||||
|
@ -96,7 +117,7 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
var answers = []
|
var answers = []
|
||||||
for (const k in this.questionForm) {
|
for (const k in this.questionForm) {
|
||||||
answers.push({ Id: k, answer: this.questionForm[k] })
|
answers.push({ Id: k, answer: this.questionForm[k], AnswerId: this.AnswerIdObj[k] })
|
||||||
}
|
}
|
||||||
resolve(answers)
|
resolve(answers)
|
||||||
// 设置当前节点的Answer
|
// 设置当前节点的Answer
|
||||||
|
@ -114,7 +135,7 @@ export default {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
var answers = []
|
var answers = []
|
||||||
for (const k in this.questionForm) {
|
for (const k in this.questionForm) {
|
||||||
answers.push({ Id: k, answer: this.questionForm[k] })
|
answers.push({ Id: k, answer: this.questionForm[k], AnswerId: this.AnswerIdObj[k] })
|
||||||
}
|
}
|
||||||
resolve(answers)
|
resolve(answers)
|
||||||
})
|
})
|
||||||
|
|
|
@ -339,11 +339,17 @@
|
||||||
'trials:trials-panel:visit:qc-check:receive',
|
'trials:trials-panel:visit:qc-check:receive',
|
||||||
'trials:trials-panel:visit:qc-check:release',
|
'trials:trials-panel:visit:qc-check:release',
|
||||||
'trials:trials-panel:visit:qc-check:audit',
|
'trials:trials-panel:visit:qc-check:audit',
|
||||||
'trials:trials-panel:visit:qc-check:back'
|
'trials:trials-panel:visit:qc-check:back',
|
||||||
|
'trials:trials-panel:visit:qc-check:reviewTask'
|
||||||
])
|
])
|
||||||
" :label="$t('common:action:action')" width="240" fixed="right">
|
" :label="$t('common:action:action')" width="280" fixed="right">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<div v-if="scope.row.AuditState * 1 >= 3">
|
<div v-if="scope.row.AuditState * 1 >= 3">
|
||||||
|
<!--复核 -->
|
||||||
|
<el-button v-if="scope.row.SecondReviewState === 1 && scope.row.AuditState * 1 === 8"
|
||||||
|
v-hasPermi="['trials:trials-panel:visit:qc-check:reviewTask']"
|
||||||
|
:title="$t('trials:qcCheck:button:reviewTask')" circle icon="el-icon-edit-outline"
|
||||||
|
:disabled="scope.row.IsImageBackApplying" @click="reviewTask(scope.row)" />
|
||||||
<!-- 领取 -->
|
<!-- 领取 -->
|
||||||
<!-- ((scope.row.AuditState*1 === 3 || scope.row.AuditState*1 === 5)) ||(!scope.row.IsTake && (scope.row.AuditState*1 === 4 || scope.row.AuditState*1 === 6)) -->
|
<!-- ((scope.row.AuditState*1 === 3 || scope.row.AuditState*1 === 5)) ||(!scope.row.IsTake && (scope.row.AuditState*1 === 4 || scope.row.AuditState*1 === 6)) -->
|
||||||
<el-button v-hasPermi="['trials:trials-panel:visit:qc-check:receive']"
|
<el-button v-hasPermi="['trials:trials-panel:visit:qc-check:receive']"
|
||||||
|
@ -470,8 +476,8 @@
|
||||||
</span>
|
</span>
|
||||||
<div class="qc-dialog-body">
|
<div class="qc-dialog-body">
|
||||||
<quality-assurance v-if="qcVisible" :data="rowData" :disabled="rowData.disabled ? rowData.disabled : false"
|
<quality-assurance v-if="qcVisible" :data="rowData" :disabled="rowData.disabled ? rowData.disabled : false"
|
||||||
:q-type="rowData.qcType ? rowData.qcType : 1" @getList="getList" @nextTask="nextTask"
|
:SecondReviewState="rowData.SecondReviewState" :q-type="rowData.qcType ? rowData.qcType : 1"
|
||||||
@openManuals="openManuals" @close="qcVisible = false" />
|
@getList="getList" @nextTask="nextTask" @openManuals="openManuals" @close="qcVisible = false" />
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
<!-- 手册 -->
|
<!-- 手册 -->
|
||||||
|
@ -814,8 +820,34 @@ export default {
|
||||||
})
|
})
|
||||||
.catch(() => { })
|
.catch(() => { })
|
||||||
},
|
},
|
||||||
|
// 复审
|
||||||
|
async reviewTask(row) {
|
||||||
|
if (!this.OtherInfo.IsQCQuestionConfirmed) return this.$alert(this.$t("trials:qcCheck:alert:questionNoConfirm"))
|
||||||
|
try {
|
||||||
|
this.loading = true
|
||||||
|
let res = await takeOrReleaseQCTask(row.TrialId, row.Id, true)
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.rowData = { ...row }
|
||||||
|
this.qcVisible = true
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
this.loading = false
|
||||||
|
if (err.Code === 5 && err.ErrorMessage) {
|
||||||
|
this.$confirm(err.ErrorMessage, {
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: false,
|
||||||
|
callback: (action) => { },
|
||||||
|
})
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
// 初审
|
// 初审
|
||||||
handlePrimaryQC(row) {
|
handlePrimaryQC(row) {
|
||||||
|
if (!this.OtherInfo.IsQCQuestionConfirmed) return this.$alert(this.$t("trials:qcCheck:alert:questionNoConfirm"))
|
||||||
this.loading = true
|
this.loading = true
|
||||||
isQCCanOpt(row.Id)
|
isQCCanOpt(row.Id)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
@ -834,6 +866,7 @@ export default {
|
||||||
},
|
},
|
||||||
// 复审
|
// 复审
|
||||||
handleSecondaryQC(row) {
|
handleSecondaryQC(row) {
|
||||||
|
if (!this.OtherInfo.IsQCQuestionConfirmed) return this.$alert(this.$t("trials:qcCheck:alert:questionNoConfirm"))
|
||||||
this.loading = true
|
this.loading = true
|
||||||
isQCCanOpt(row.Id)
|
isQCCanOpt(row.Id)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
|
|
@ -50,9 +50,10 @@ module.exports = defineConfig({
|
||||||
pathRewrite: {
|
pathRewrite: {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// uat http://101.132.253.119:7010
|
|
||||||
'/api': {
|
'/api': {
|
||||||
target: 'http://106.14.89.110:30000',
|
target: 'http://106.14.89.110:30000',
|
||||||
|
// target: 'http://101.132.253.119:7010', // uat
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
secure: false,
|
secure: false,
|
||||||
pathRewrite: {
|
pathRewrite: {
|
||||||
|
|
Loading…
Reference in New Issue