Compare commits
25 Commits
45a54d69a4
...
v1.13.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 26914c2b2b | |||
| 98ce2b27da | |||
| 5805ea0778 | |||
| 17737d901c | |||
| 51a94ad89e | |||
| 9187c9db8c | |||
| 5e67f8b65f | |||
| 6218b536f9 | |||
| 7493c1a98a | |||
| d91a9170de | |||
| 57bec076b7 | |||
| 36ea567229 | |||
| e9dd669d48 | |||
| 4d27cbfe41 | |||
| b8208dffed | |||
| 10b8cc6a5e | |||
| edf1377374 | |||
| f8b4dd70c8 | |||
| 33a8d8743e | |||
| a357fe7ce6 | |||
| 07fbbf5a74 | |||
| 79b14eee67 | |||
| 9f76310101 | |||
| 4b700b5db3 | |||
| b7f4cccbfa |
+4
-3
@@ -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,
|
||||||
|
|||||||
+10
-3
@@ -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 |
@@ -3,7 +3,7 @@
|
|||||||
id="canvas"
|
id="canvas"
|
||||||
ref="canvas"
|
ref="canvas"
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
element-loading-text="Loading..."
|
:element-loading-text="NSTip"
|
||||||
element-loading-background="rgba(0, 0, 0, 0.8)"
|
element-loading-background="rgba(0, 0, 0, 0.8)"
|
||||||
style="width:100%;height:100%;position:relative;"
|
style="width:100%;height:100%;position:relative;"
|
||||||
class="cornerstone-element"
|
class="cornerstone-element"
|
||||||
@@ -121,6 +121,11 @@ import DicomTags from './DicomTags'
|
|||||||
export default {
|
export default {
|
||||||
name: 'DicomCanvas',
|
name: 'DicomCanvas',
|
||||||
components: { DicomTags },
|
components: { DicomTags },
|
||||||
|
computed: {
|
||||||
|
NSTip() {
|
||||||
|
return `${this.$store.state.trials.uploadSize}, NS: ${this.$store.state.trials.uploadTip}`
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
loading: false,
|
||||||
|
|||||||
@@ -1,51 +1,37 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="criterion-form-item">
|
<div class="criterion-form-item">
|
||||||
<div
|
<div v-if="!!question.QuestionName && question.ClinicalQuestionType === 'group'"
|
||||||
v-if="!!question.QuestionName && question.ClinicalQuestionType==='group'"
|
style="font-weight: bold;font-size: 16px;margin: 5px 0px;margin-bottom: 10px">
|
||||||
style="font-weight: bold;font-size: 16px;margin: 5px 0px;margin-bottom: 10px"
|
{{ language === 'en' ? question.QuestionEnName : question.QuestionName }}
|
||||||
>
|
</div>
|
||||||
{{ language==='en'?question.QuestionEnName:question.QuestionName }}
|
<div v-else-if="question.ClinicalQuestionType === 'summary'"
|
||||||
|
style="background:#f3f3f3;border-radius:4px;font-size: 12px;margin: 5px 0px;margin-bottom: 10px;font-size: 12px;padding: 10px">
|
||||||
|
{{ language === 'en' ? question.QuestionEnName : question.QuestionName }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-else-if="question.ClinicalQuestionType==='summary'"
|
v-else-if="question.ClinicalQuestionType === 'table' && ((question.ClinicalQuestionShowEnum === 1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum === 0)"
|
||||||
style="background:#f3f3f3;border-radius:4px;font-size: 12px;margin: 5px 0px;margin-bottom: 10px;font-size: 12px;padding: 10px"
|
style="font-weight: bold;font-size: 14px;margin: 5px 0px;">
|
||||||
>
|
|
||||||
{{ language==='en'?question.QuestionEnName:question.QuestionName }}
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-else-if="question.ClinicalQuestionType==='table' && ((question.ClinicalQuestionShowEnum===1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum===0)"
|
|
||||||
style="font-weight: bold;font-size: 14px;margin: 5px 0px;"
|
|
||||||
>
|
|
||||||
<div style="display: flex;justify-content: space-between;">
|
<div style="display: flex;justify-content: space-between;">
|
||||||
<span>
|
<span>
|
||||||
{{ 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>
|
||||||
<el-table
|
<el-table :data="questionForm[question.Id]">
|
||||||
:data="questionForm[question.Id]"
|
<el-table-column v-for="item of question.TableQuestions" :key="item.Id" :prop="item.Id"
|
||||||
>
|
:label="item.QuestionName" min-width="100" show-overflow-tooltip />
|
||||||
<el-table-column
|
<el-table-column :label="$t('common:action:action')" min-width="100" show-overflow-tooltip
|
||||||
v-for="item of question.TableQuestions"
|
v-if="SecondReviewState <= 0">
|
||||||
:key="item.Id"
|
|
||||||
:prop="item.Id"
|
|
||||||
:label="item.QuestionName"
|
|
||||||
min-width="100"
|
|
||||||
show-overflow-tooltip
|
|
||||||
/>
|
|
||||||
<el-table-column
|
|
||||||
:label="$t('common:action:action')"
|
|
||||||
min-width="100"
|
|
||||||
show-overflow-tooltip
|
|
||||||
>
|
|
||||||
<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') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="text" size="mini" v-if="scope.row.IsCurrentTaskAdd === 'True' || !question.IsCopyLesions || IsBaseline" @click="deleteTableCol(question, scope.$index)">
|
<el-button type="text" size="mini"
|
||||||
|
v-if="scope.row.IsCurrentTaskAdd === 'True' || !question.IsCopyLesions || IsBaseline"
|
||||||
|
@click="deleteTableCol(question, scope.$index)">
|
||||||
{{ $t('common:button:delete') }}
|
{{ $t('common:button:delete') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
@@ -54,187 +40,109 @@
|
|||||||
</div>
|
</div>
|
||||||
<el-col v-else :span="12">
|
<el-col v-else :span="12">
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-if="(question.ClinicalQuestionShowEnum===1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum===0"
|
v-if="(question.ClinicalQuestionShowEnum === 1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum === 0"
|
||||||
:label="`${question.QuestionName}`"
|
:label="`${question.QuestionName}`" :prop="question.Id" :rules="[
|
||||||
:prop="question.Id"
|
{
|
||||||
:rules="[
|
required: (question.IsRequired === 0 || (question.IsRequired === 1 && question.RelevanceId && (question.RelevanceValue === questionForm[question.RelevanceId].toString()))) && question.ClinicalQuestionType !== 'summary' && question.ClinicalQuestionType !== 'group' && question.ClinicalQuestionType !== 'table',
|
||||||
{ required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (question.RelevanceValue === questionForm[question.RelevanceId].toString()))) && question.ClinicalQuestionType !== 'summary' && question.ClinicalQuestionType!=='group' && question.ClinicalQuestionType!=='table',
|
message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']
|
||||||
message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']}
|
}
|
||||||
]"
|
]" :class="[question.Type === 'group' ? 'mb' : question.Type === 'upload' ? 'uploadWrapper' : '']">
|
||||||
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
|
|
||||||
>
|
|
||||||
<!-- 输入框 -->
|
<!-- 输入框 -->
|
||||||
<el-input
|
<el-input v-if="question.ClinicalQuestionType === 'input'" v-model="questionForm[question.Id]"
|
||||||
v-if="question.ClinicalQuestionType==='input'"
|
|
||||||
v-model="questionForm[question.Id]"
|
|
||||||
:disabled="question.TableQuestionType === 2"
|
:disabled="question.TableQuestionType === 2"
|
||||||
:max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200"
|
:max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200" />
|
||||||
/>
|
|
||||||
<!-- 多行文本输入框 -->
|
<!-- 多行文本输入框 -->
|
||||||
<el-input
|
<el-input v-if="question.ClinicalQuestionType === 'textarea'" v-model="questionForm[question.Id]"
|
||||||
v-if="question.ClinicalQuestionType==='textarea'"
|
type="textarea" :max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200"
|
||||||
v-model="questionForm[question.Id]"
|
:autosize="{ minRows: 2, maxRows: 4 }" />
|
||||||
type="textarea"
|
|
||||||
:max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200"
|
|
||||||
:autosize="{ minRows: 2, maxRows: 4}"
|
|
||||||
/>
|
|
||||||
<!-- 下拉框 -->
|
<!-- 下拉框 -->
|
||||||
<el-select
|
<el-select v-if="question.ClinicalQuestionType === 'select'" v-model="questionForm[question.Id]" clearable
|
||||||
v-if="question.ClinicalQuestionType==='select'"
|
|
||||||
v-model="questionForm[question.Id]"
|
|
||||||
clearable
|
|
||||||
:disabled="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode"
|
:disabled="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode"
|
||||||
@change="((val)=>{formItemChange(val, question)})"
|
@change="((val) => { formItemChange(val, question) })">
|
||||||
>
|
|
||||||
<template v-if="question.TableQuestionType === 1">
|
<template v-if="question.TableQuestionType === 1">
|
||||||
<el-option
|
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
|
||||||
v-for="item in organList"
|
:value="item[question.DataTableColumn]" />
|
||||||
:key="item.Id"
|
|
||||||
:label="item[question.DataTableColumn]"
|
|
||||||
:value="item[question.DataTableColumn]"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
|
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
|
||||||
<el-option
|
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="item.value"
|
||||||
v-for="item of $d[question.DictionaryCode]"
|
:label="item.label" />
|
||||||
:key="item.id"
|
|
||||||
:value="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
<template
|
||||||
<el-option
|
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
|
||||||
v-for="item of $d[question.DictionaryCode]"
|
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="item.value"
|
||||||
:key="item.id"
|
:label="item.label" />
|
||||||
:value="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<el-option
|
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val.trim()" />
|
||||||
v-for="val in question.TypeValue.split('|')"
|
|
||||||
:key="val"
|
|
||||||
:label="val"
|
|
||||||
:value="val.trim()"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
</el-select>
|
</el-select>
|
||||||
<!-- 单选 -->
|
<!-- 单选 -->
|
||||||
<el-date-picker
|
<el-date-picker v-if="question.ClinicalQuestionType === 'time'" v-model="questionForm[question.Id]"
|
||||||
v-if="question.ClinicalQuestionType === 'time'"
|
style="width: 200px" align="right" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" />
|
||||||
v-model="questionForm[question.Id]"
|
|
||||||
style="width: 200px"
|
|
||||||
align="right"
|
|
||||||
type="date"
|
|
||||||
format="yyyy-MM-dd"
|
|
||||||
value-format="yyyy-MM-dd"
|
|
||||||
/>
|
|
||||||
<!-- 单选 -->
|
<!-- 单选 -->
|
||||||
<el-radio-group
|
<el-radio-group v-if="question.ClinicalQuestionType === 'radio'" v-model="questionForm[question.Id]"
|
||||||
v-if="question.ClinicalQuestionType==='radio'"
|
@change="((val) => { formItemChange(val, question) })">
|
||||||
v-model="questionForm[question.Id]"
|
|
||||||
@change="((val)=>{formItemChange(val, question)})"
|
|
||||||
>
|
|
||||||
<template v-if="question.DictionaryCode">
|
<template v-if="question.DictionaryCode">
|
||||||
<el-radio
|
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="item.value">
|
||||||
v-for="item of $d[question.DictionaryCode]"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.value"
|
|
||||||
>
|
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</el-radio>
|
</el-radio>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="question.TypeValue">
|
<template v-if="question.TypeValue">
|
||||||
<el-radio
|
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
|
||||||
v-for="val in question.TypeValue.split('|')"
|
|
||||||
:key="val"
|
|
||||||
:label="val"
|
|
||||||
>
|
|
||||||
{{ val }}
|
{{ val }}
|
||||||
</el-radio>
|
</el-radio>
|
||||||
</template>
|
</template>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
<!-- 复选框 -->
|
<!-- 复选框 -->
|
||||||
<el-checkbox-group
|
<el-checkbox-group v-if="question.ClinicalQuestionType === 'checkbox' && questionForm[question.Id] !== ''"
|
||||||
v-if="question.ClinicalQuestionType==='checkbox' && questionForm[question.Id] !== ''"
|
v-model="questionForm[question.Id]">
|
||||||
v-model="questionForm[question.Id]"
|
<el-checkbox v-for="val of question.TypeValue.split('|')" :key="val" :label="val" :value="val">
|
||||||
>
|
|
||||||
<el-checkbox
|
|
||||||
v-for="val of question.TypeValue.split('|')"
|
|
||||||
:key="val"
|
|
||||||
:label="val"
|
|
||||||
:value="val"
|
|
||||||
>
|
|
||||||
{{ val }}
|
{{ val }}
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
</el-checkbox-group>
|
</el-checkbox-group>
|
||||||
<el-input
|
<el-input v-if="question.ClinicalQuestionType === 'number'" :ref="question.Id"
|
||||||
v-if="question.ClinicalQuestionType === 'number'"
|
v-model="questionForm[question.Id]" type="number" style="width: 200px"
|
||||||
:ref="question.Id"
|
:disabled="question.CustomCalculateMark > 0" @input="limitInput($event, questionForm, question)">
|
||||||
v-model="questionForm[question.Id]"
|
|
||||||
type="number"
|
|
||||||
style="width: 200px"
|
|
||||||
:disabled="question.CustomCalculateMark > 0"
|
|
||||||
@input="limitInput($event, questionForm, question)"
|
|
||||||
>
|
|
||||||
<template v-if="question.Unit" slot="append">{{ question.Unit }}</template>
|
<template v-if="question.Unit" slot="append">{{ question.Unit }}</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
<span v-if="question.CustomCalculateMark === 11 && question.ClinicalQuestionType === 'number'" v-show="questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] <= questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId]" style="margin-left: 10px">
|
<span v-if="question.CustomCalculateMark === 11 && question.ClinicalQuestionType === 'number'"
|
||||||
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{ questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId] }}
|
v-show="questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] <= questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId]"
|
||||||
|
style="margin-left: 10px">
|
||||||
|
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{
|
||||||
|
questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId] }}
|
||||||
</span>
|
</span>
|
||||||
<span v-if="question.CustomCalculateMark === 10 && question.ClinicalQuestionType === 'number' && questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId]" style="margin-left: 10px">
|
<span
|
||||||
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{ questionForm.CreateTime ? questionForm.CreateTime : parseTime(new Date(), '{y}-{m}-{d}') }}
|
v-if="question.CustomCalculateMark === 10 && question.ClinicalQuestionType === 'number' && questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId]"
|
||||||
|
style="margin-left: 10px">
|
||||||
|
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{ questionForm.CreateTime ?
|
||||||
|
questionForm.CreateTime : parseTime(new Date(), '{y}-{m}-{d}') }}
|
||||||
</span>
|
</span>
|
||||||
<!-- 生日不能大于截止日期 -->
|
<!-- 生日不能大于截止日期 -->
|
||||||
<span v-if="question.CustomCalculateMark === 11 && question.ClinicalQuestionType === 'number'" v-show="questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] > questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId]" style="margin-left: 10px;font-size: 12px;color:#f66">
|
<span v-if="question.CustomCalculateMark === 11 && question.ClinicalQuestionType === 'number'"
|
||||||
|
v-show="questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] > questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId]"
|
||||||
|
style="margin-left: 10px;font-size: 12px;color:#f66">
|
||||||
{{ $t('trials:components:clinicalDataQS:msg:birthDay') }}
|
{{ $t('trials:components:clinicalDataQS:msg:birthDay') }}
|
||||||
</span>
|
</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
|
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
|
||||||
<!-- eslint-disable vue/valid-v-for -->
|
<!-- eslint-disable vue/valid-v-for -->
|
||||||
<el-col v-for="(item) in question.Childrens" :key="item.Id" v-if="question.Childrens && question.Childrens.length>0 && question.ClinicalQuestionType !== 'table'" :span="['group', 'summary', 'table'].includes(item.ClinicalQuestionType) || item.Childrens.length > 0 ? 24 : 12">
|
<el-col v-for="(item) in question.Childrens" :key="item.Id"
|
||||||
<QuestionFormItem
|
v-if="question.Childrens && question.Childrens.length > 0 && question.ClinicalQuestionType !== 'table'"
|
||||||
:key="item.Id"
|
:span="['group', 'summary', 'table'].includes(item.ClinicalQuestionType) || item.Childrens.length > 0 ? 24 : 12">
|
||||||
:question="item"
|
<QuestionFormItem :key="item.Id" :question="item" :question-form="questionForm"
|
||||||
:question-form="questionForm"
|
:trial-clinical-id="trialClinicalId" @formItemNumberChange="formItemNumberChange"
|
||||||
:trial-clinical-id="trialClinicalId"
|
@setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" />
|
||||||
@formItemNumberChange="formItemNumberChange"
|
|
||||||
@setFormItemData="setFormItemData"
|
|
||||||
@resetFormItemData="resetFormItemData"
|
|
||||||
/>
|
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-dialog
|
<el-dialog v-if="addOrEdit.visible" class="my_dialog" :visible.sync="addOrEdit.visible"
|
||||||
v-if="addOrEdit.visible"
|
:close-on-click-modal="false" :title="addOrEdit.title" width="400px" append-to-body>
|
||||||
class="my_dialog"
|
<el-form ref="tableQsForm" v-loading="loading" size="small" :model="QuestionsForm">
|
||||||
:visible.sync="addOrEdit.visible"
|
<QuestionTableFormItem v-for="(item) in QuestionsList" :key="item.Id" :question="item"
|
||||||
:close-on-click-modal="false"
|
:question-form="QuestionsForm" @setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" />
|
||||||
:title="addOrEdit.title"
|
|
||||||
width="400px"
|
|
||||||
append-to-body
|
|
||||||
>
|
|
||||||
<el-form
|
|
||||||
ref="tableQsForm"
|
|
||||||
v-loading="loading"
|
|
||||||
size="small"
|
|
||||||
:model="QuestionsForm"
|
|
||||||
>
|
|
||||||
<QuestionTableFormItem
|
|
||||||
v-for="(item) in QuestionsList"
|
|
||||||
:key="item.Id"
|
|
||||||
:question="item"
|
|
||||||
:question-form="QuestionsForm"
|
|
||||||
@setFormItemData="setFormItemData"
|
|
||||||
@resetFormItemData="resetFormItemData"
|
|
||||||
/>
|
|
||||||
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<!-- 取消 -->
|
<!-- 取消 -->
|
||||||
<el-button
|
<el-button size="small" type="primary" @click="addOrEdit.visible = false">
|
||||||
size="small"
|
|
||||||
type="primary"
|
|
||||||
@click="addOrEdit.visible = false"
|
|
||||||
>
|
|
||||||
{{ $t('common:button:cancel') }}
|
{{ $t('common:button:cancel') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<!-- 保存 -->
|
<!-- 保存 -->
|
||||||
@@ -251,7 +159,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',
|
||||||
@@ -263,6 +170,10 @@ export default {
|
|||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
SecondReviewState: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
questionForm: {
|
questionForm: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default() {
|
default() {
|
||||||
@@ -282,7 +193,7 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
addOrEdit: { visible: false, title: '', id: null, index: 0},
|
addOrEdit: { visible: false, title: '', id: null, index: 0 },
|
||||||
fileList: [],
|
fileList: [],
|
||||||
accept: '.png,.jpg,.jpeg',
|
accept: '.png,.jpg,.jpeg',
|
||||||
imgVisible: false,
|
imgVisible: false,
|
||||||
@@ -591,40 +502,47 @@ export default {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.my_dialog{
|
.my_dialog {
|
||||||
.criterion-form-item{
|
.criterion-form-item {
|
||||||
::v-deep .el-form-item__content{
|
::v-deep .el-form-item__content {
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.el-col-12 .el-col-12{
|
|
||||||
|
.el-col-12 .el-col-12 {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
.criterion-form-item{
|
|
||||||
.el-form-item{
|
.criterion-form-item {
|
||||||
|
.el-form-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
.el-input{
|
|
||||||
width:100%;
|
.el-input {
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
.mb{
|
|
||||||
|
.mb {
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
.disabled{
|
|
||||||
|
.disabled {
|
||||||
::v-deep .el-upload--picture-card {
|
::v-deep .el-upload--picture-card {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.uploadWrapper{
|
|
||||||
|
.uploadWrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.clearfix:after{
|
|
||||||
|
.clearfix:after {
|
||||||
content: '';
|
content: '';
|
||||||
display: table;
|
display: table;
|
||||||
clear: both;
|
clear: both;
|
||||||
|
|||||||
@@ -1,52 +1,31 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading" style="min-height: 500px;">
|
<div v-loading="loading" style="min-height: 500px;">
|
||||||
<el-form
|
<el-form v-if="isRender" data-viewport-uid="lc" ref="questions" size="small" :model="questionForm"
|
||||||
v-if="isRender"
|
:disabled="openType === 'look'">
|
||||||
data-viewport-uid="lc"
|
|
||||||
ref="questions"
|
|
||||||
size="small"
|
|
||||||
:model="questionForm"
|
|
||||||
:disabled="openType === 'look'"
|
|
||||||
>
|
|
||||||
<template>
|
<template>
|
||||||
<QuestionFormItem
|
<QuestionFormItem class="father" v-for="question of questions" :key="question.Id" :question="question"
|
||||||
class="father"
|
:question-form="questionForm" :trial-clinical-id="trialClinicalId" :SecondReviewState="SecondReviewState"
|
||||||
v-for="question of questions"
|
@resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData" />
|
||||||
:key="question.Id"
|
|
||||||
:question="question"
|
|
||||||
:question-form="questionForm"
|
|
||||||
:trial-clinical-id="trialClinicalId"
|
|
||||||
@resetFormItemData="resetFormItemData"
|
|
||||||
@setFormItemData="setFormItemData"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div class="base-dialog-footer" v-if="!isViewer && openType !== 'look' && [2, 3].includes(clinicalDataLevel)" style="text-align:right;margin-top:10px;">
|
<div class="base-dialog-footer"
|
||||||
<!-- 取消 -->
|
v-if="!isViewer && openType !== 'look' && [2, 3].includes(clinicalDataLevel) && SecondReviewState <= 0"
|
||||||
<el-button
|
style="text-align:right;margin-top:10px;">
|
||||||
size="small"
|
<!-- 取消 -->
|
||||||
type="primary"
|
<el-button size="small" type="primary" @click="close"
|
||||||
@click="close"
|
v-show="$route.path !== '/trials/trials-panel/visit/crc-upload' && $route.path !== '/trials/trials-panel/visit/crc-question'">
|
||||||
v-show="$route.path !== '/trials/trials-panel/visit/crc-upload'&&$route.path!=='/trials/trials-panel/visit/crc-question'"
|
{{ $t('common:button:cancel') }}
|
||||||
>
|
</el-button>
|
||||||
{{ $t('common:button:cancel') }}
|
<!-- 保存 -->
|
||||||
</el-button>
|
<el-button size="small" type="primary" @click="submitClinicalForm">
|
||||||
<!-- 保存 -->
|
{{ $t('common:button:save') }}
|
||||||
<el-button size="small" type="primary" @click="submitClinicalForm">
|
</el-button>
|
||||||
{{ $t('common:button:save') }}
|
|
||||||
</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
<el-dialog
|
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px" append-to-body
|
||||||
v-if="signVisible"
|
custom-class="base-dialog-wrapper">
|
||||||
:visible.sync="signVisible"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
width="600px"
|
|
||||||
append-to-body
|
|
||||||
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>
|
||||||
@@ -77,6 +56,10 @@ export default {
|
|||||||
return 2
|
return 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
SecondReviewState: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
openType: {
|
openType: {
|
||||||
type: String,
|
type: String,
|
||||||
},
|
},
|
||||||
@@ -106,7 +89,7 @@ export default {
|
|||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => {}
|
default: () => { }
|
||||||
},
|
},
|
||||||
trialClinicalId: {
|
trialClinicalId: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -166,7 +149,7 @@ export default {
|
|||||||
let item = this.questionForm[v]
|
let item = this.questionForm[v]
|
||||||
if (item instanceof Array) {
|
if (item instanceof Array) {
|
||||||
let TableQuestionAnswers = item.map(o => {
|
let TableQuestionAnswers = item.map(o => {
|
||||||
if (o instanceof Object) {
|
if (o instanceof Object) {
|
||||||
return Object.keys(o).map(x => {
|
return Object.keys(o).map(x => {
|
||||||
return {
|
return {
|
||||||
TableQuestionId: x,
|
TableQuestionId: x,
|
||||||
@@ -251,7 +234,7 @@ export default {
|
|||||||
if (item instanceof Array) {
|
if (item instanceof Array) {
|
||||||
let isCheckBox = false
|
let isCheckBox = false
|
||||||
let TableQuestionAnswers = item.map(o => {
|
let TableQuestionAnswers = item.map(o => {
|
||||||
if (o instanceof Object) {
|
if (o instanceof Object) {
|
||||||
return Object.keys(o).map(x => {
|
return Object.keys(o).map(x => {
|
||||||
return {
|
return {
|
||||||
TableQuestionId: x,
|
TableQuestionId: x,
|
||||||
@@ -387,11 +370,11 @@ export default {
|
|||||||
}
|
}
|
||||||
if (i.ClinicalQuestionType === 'table') {
|
if (i.ClinicalQuestionType === 'table') {
|
||||||
this.$set(this.questionForm, i.Id, i.TableAnswer)
|
this.$set(this.questionForm, i.Id, i.TableAnswer)
|
||||||
} else if (i.ClinicalQuestionType === 'checkbox') {
|
} else if (i.ClinicalQuestionType === 'checkbox') {
|
||||||
this.$set(this.questionForm, i.Id, i.Answer ? i.Answer.split(',') : [])
|
this.$set(this.questionForm, i.Id, i.Answer ? i.Answer.split(',') : [])
|
||||||
console.log(i.Answer ? i.Answer.split(',') : [])
|
console.log(i.Answer ? i.Answer.split(',') : [])
|
||||||
console.log(this.questionForm)
|
console.log(this.questionForm)
|
||||||
} else if (i.ClinicalQuestionType === 'number') {
|
} else if (i.ClinicalQuestionType === 'number') {
|
||||||
this.$set(this.questionForm, i.Id, i.Answer)
|
this.$set(this.questionForm, i.Id, i.Answer)
|
||||||
} else if (i.Childrens && i.Childrens.length > 0) {
|
} else if (i.Childrens && i.Childrens.length > 0) {
|
||||||
this.setChild(i.Childrens)
|
this.setChild(i.Childrens)
|
||||||
@@ -405,7 +388,7 @@ export default {
|
|||||||
this.questionForm[v] = 0
|
this.questionForm[v] = 0
|
||||||
} else if (qs.ClinicalQuestionType === 'checkbox') {
|
} else if (qs.ClinicalQuestionType === 'checkbox') {
|
||||||
this.questionForm[v] = []
|
this.questionForm[v] = []
|
||||||
} else{
|
} else {
|
||||||
this.questionForm[v] = ''
|
this.questionForm[v] = ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -426,23 +409,26 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
}
|
}
|
||||||
::-webkit-scrollbar-thumb {
|
|
||||||
border-radius: 10px;
|
::-webkit-scrollbar-thumb {
|
||||||
background: #d0d0d0;
|
border-radius: 10px;
|
||||||
}
|
background: #d0d0d0;
|
||||||
.tabContent{
|
}
|
||||||
height:300px;
|
|
||||||
|
.tabContent {
|
||||||
|
height: 300px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|
||||||
}
|
}
|
||||||
.father:after{
|
|
||||||
|
.father:after {
|
||||||
content: "";
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
height: 0;
|
height: 0;
|
||||||
clear:both;
|
clear: both;
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,42 +1,30 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<QuestionsForm
|
<QuestionsForm v-if="clinicalUploadType === 2" :data="data" :trial-clinical-id="trialClinicalId"
|
||||||
v-if="clinicalUploadType === 2"
|
:is-viewer="isViewer" :visit-id="visitId" :subject-id="subjectId" :open-type="openType"
|
||||||
:data="data"
|
:system-clinical-id="systemClinicalId" :trial-id="trialId" :reading-id="readingId"
|
||||||
:trial-clinical-id="trialClinicalId"
|
:clinical-form-id="clinicalFormId" :SecondReviewState="SecondReviewState" :clinical-data-level="clinicalDataLevel"
|
||||||
:is-viewer="isViewer"
|
@close="close"></QuestionsForm>
|
||||||
:visit-id="visitId"
|
<uploadClinicalData v-else :subject-visit-id="subjectVisitId" :SecondReviewState="SecondReviewState" :data="data"
|
||||||
:subject-id="subjectId"
|
:enum-type="0" :allow-add-or-edit="true" @getList="() => { }">
|
||||||
:open-type="openType"
|
|
||||||
:system-clinical-id="systemClinicalId"
|
|
||||||
:trial-id="trialId"
|
|
||||||
:reading-id="readingId"
|
|
||||||
:clinical-form-id="clinicalFormId"
|
|
||||||
:clinical-data-level="clinicalDataLevel"
|
|
||||||
@close="close"
|
|
||||||
></QuestionsForm>
|
|
||||||
<uploadClinicalData v-else :subject-visit-id="subjectVisitId" :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)" style="text-align:right;margin-top:10px;">
|
<div class="base-dialog-footer"
|
||||||
|
v-if="!isViewer && openType !== 'look' && [0, 1].includes(clinicalDataLevel) && SecondReviewState <= 0"
|
||||||
|
style="text-align:right;margin-top:10px;">
|
||||||
<!-- 保存 -->
|
<!-- 保存 -->
|
||||||
<el-button size="small" type="primary" @click="submitClinicalForm">
|
<el-button size="small" type="primary" @click="submitClinicalForm">
|
||||||
{{ $t('common:button:submit') }}
|
{{ $t('common:button:submit') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<!-- 临床数据签名框 -->
|
<!-- 临床数据签名框 -->
|
||||||
<el-dialog
|
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px" append-to-body
|
||||||
v-if="signVisible"
|
custom-class="base-dialog-wrapper">
|
||||||
:visible.sync="signVisible"
|
|
||||||
:close-on-click-modal="false"
|
|
||||||
width="600px"
|
|
||||||
append-to-body
|
|
||||||
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" :subject-visit-id="subjectVisitId" @closeDialog="closeSignDialog" />
|
<SignForm ref="signForm" :sign-code-enum="signCode" :subject-visit-id="subjectVisitId"
|
||||||
|
@closeDialog="closeSignDialog" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -49,7 +37,7 @@ import uploadClinicalData from './components/uploadClinicalData'
|
|||||||
import const_ from '@/const/sign-code'
|
import const_ from '@/const/sign-code'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "index",
|
name: "index",
|
||||||
components: { QuestionsForm, uploadClinicalData, SignForm },
|
components: { QuestionsForm, uploadClinicalData, SignForm },
|
||||||
methods: {
|
methods: {
|
||||||
submitClinicalForm() {
|
submitClinicalForm() {
|
||||||
@@ -83,7 +71,7 @@ name: "index",
|
|||||||
this.close()
|
this.close()
|
||||||
}).catch((res) => {
|
}).catch((res) => {
|
||||||
this.$refs['signForm'].btnLoading = false
|
this.$refs['signForm'].btnLoading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -106,6 +94,10 @@ name: "index",
|
|||||||
type: String,
|
type: String,
|
||||||
default: () => ''
|
default: () => ''
|
||||||
},
|
},
|
||||||
|
SecondReviewState: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
clinicalUploadType: {
|
clinicalUploadType: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: () => {
|
default: () => {
|
||||||
@@ -148,7 +140,7 @@ name: "index",
|
|||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: () => {}
|
default: () => { }
|
||||||
},
|
},
|
||||||
trialClinicalId: {
|
trialClinicalId: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -166,6 +158,4 @@ name: "index",
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped></style>
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<!--上传列表@selection-change="handleSelectionChange"-->
|
<!--上传列表@selection-change="handleSelectionChange"-->
|
||||||
<el-table ref="dicomFilesTable" v-adaptive="{ bottomOffset: 85 }" height="100" :data="list" :loading="loading"
|
<el-table ref="dicomFilesTable" v-adaptive="{ bottomOffset: 85 }" height="100" :data="list" :loading="loading"
|
||||||
class="dicomFiles-table" @sort-change="handleSortByColumn"
|
class="dicomFiles-table"
|
||||||
:default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
|
:default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
|
||||||
<!-- <el-table-column
|
<!-- <el-table-column
|
||||||
type="selection"
|
type="selection"
|
||||||
@@ -37,10 +37,10 @@
|
|||||||
show-overflow-tooltip />
|
show-overflow-tooltip />
|
||||||
<!--任务名称-->
|
<!--任务名称-->
|
||||||
<el-table-column :label="$t('download:table:taskName')" min-width="130" show-overflow-tooltip prop="TaskBlindName"
|
<el-table-column :label="$t('download:table:taskName')" min-width="130" show-overflow-tooltip prop="TaskBlindName"
|
||||||
sortable="custom" />
|
sortable />
|
||||||
<!--检查类型-->
|
<!--检查类型-->
|
||||||
<el-table-column :label="$t('download:table:studyType')" min-width="130" show-overflow-tooltip prop="IsDicom"
|
<el-table-column :label="$t('download:table:studyType')" min-width="130" show-overflow-tooltip prop="IsDicom"
|
||||||
sortable="custom">
|
sortable>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ $fd('IsDicom', scope.row.IsDicom) }}</span>
|
<span>{{ $fd('IsDicom', scope.row.IsDicom) }}</span>
|
||||||
</template>
|
</template>
|
||||||
@@ -406,7 +406,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=${row.SourceSubjectVisitId}&TokenKey=${token}`,
|
path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${row.SourceSubjectVisitId}&TokenKey=${token}&isReading=true`,
|
||||||
})
|
})
|
||||||
this.open = window.open(routeData.href, '_blank')
|
this.open = window.open(routeData.href, '_blank')
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -40,13 +40,13 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!--序列数量-->
|
<!--序列数量-->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="SeriesCount"
|
prop="ReadingSeriesCount"
|
||||||
:label="$t('trials:uploadImage:table:SeriesCount')"
|
:label="$t('trials:uploadImage:table:SeriesCount')"
|
||||||
v-if="IsDicom"
|
v-if="IsDicom"
|
||||||
/>
|
/>
|
||||||
<!--图像数量-->
|
<!--图像数量-->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="InstanceCount"
|
prop="ReadingInstanceCount"
|
||||||
:label="$t('trials:uploadImage:table:InstanceCount')"
|
:label="$t('trials:uploadImage:table:InstanceCount')"
|
||||||
v-if="IsDicom"
|
v-if="IsDicom"
|
||||||
/>
|
/>
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!--文件数量-->
|
<!--文件数量-->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="FileCount"
|
prop="ReadingFileCount"
|
||||||
:label="$t('trials:uploadImage:table:FileCount')"
|
:label="$t('trials:uploadImage:table:FileCount')"
|
||||||
v-if="!IsDicom"
|
v-if="!IsDicom"
|
||||||
/>
|
/>
|
||||||
@@ -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,6 +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, 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 },
|
||||||
@@ -644,15 +645,15 @@ const actions = {
|
|||||||
resolve(noneDicomMeasureData)
|
resolve(noneDicomMeasureData)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
addMeasuredData({ state }, obj) {
|
addMeasuredData({ state }, obj) {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
const criterionType = parseInt(localStorage.getItem('CriterionType'))
|
const criterionType = parseInt(localStorage.getItem('CriterionType'))
|
||||||
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
|
||||||
var measureData = state.visitTaskList[index].MeasureData
|
var measureData = state.visitTaskList[index].MeasureData
|
||||||
// var idx = measureData.findIndex(item => item.MeasureData.uuid === obj.data.MeasureData.data.uuid)
|
// var idx = measureData.findIndex(item => item.MeasureData.uuid === obj.data.MeasureData.data.uuid)
|
||||||
|
|
||||||
if (criterionType === 21) {
|
if (criterionType === 21) {
|
||||||
let i = measureData.findIndex(i=>i.TableQuestionId === obj.data.TableQuestionId)
|
let i = measureData.findIndex(i => i.TableQuestionId === obj.data.TableQuestionId)
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
for (const k in state.visitTaskList[index].MeasureData[i]) {
|
for (const k in state.visitTaskList[index].MeasureData[i]) {
|
||||||
if (k !== 'Id' && obj.data[k]) {
|
if (k !== 'Id' && obj.data[k]) {
|
||||||
@@ -676,7 +677,7 @@ const actions = {
|
|||||||
console.log('新增标记成功')
|
console.log('新增标记成功')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
// sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
@@ -775,15 +776,15 @@ const actions = {
|
|||||||
const criterionType = parseInt(localStorage.getItem('CriterionType'))
|
const criterionType = parseInt(localStorage.getItem('CriterionType'))
|
||||||
if (criterionType === 21) {
|
if (criterionType === 21) {
|
||||||
const i = measureData.findIndex(item => item.QuestionId === obj.questionId && item.OrderMarkName === obj.orderMarkName)
|
const i = measureData.findIndex(item => item.QuestionId === obj.questionId && item.OrderMarkName === obj.orderMarkName)
|
||||||
if (i > -1) {
|
if (i > -1) {
|
||||||
if (measureData[i].FristAddTaskId) {
|
if (measureData[i].FristAddTaskId) {
|
||||||
measureData[i].MeasureData = ''
|
measureData[i].MeasureData = ''
|
||||||
console.log('清除标记成功', i)
|
console.log('清除标记成功', i)
|
||||||
} else {
|
} else {
|
||||||
measureData.splice(i, 1)
|
measureData.splice(i, 1)
|
||||||
console.log('移除标记成功', i)
|
console.log('移除标记成功', i)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
state.visitTaskList[index].MeasureData = measureData
|
state.visitTaskList[index].MeasureData = measureData
|
||||||
} else {
|
} else {
|
||||||
var idx = measureData.findIndex(item => item.QuestionId === obj.questionId && item.RowIndex === obj.rowIndex)
|
var idx = measureData.findIndex(item => item.QuestionId === obj.questionId && item.RowIndex === obj.rowIndex)
|
||||||
@@ -810,7 +811,7 @@ const actions = {
|
|||||||
state.visitTaskList[index].MeasureData = measureData
|
state.visitTaskList[index].MeasureData = measureData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (idx > -1) {
|
// if (idx > -1) {
|
||||||
// measureData.splice(idx, 1)
|
// measureData.splice(idx, 1)
|
||||||
|
|
||||||
@@ -1072,16 +1073,22 @@ const actions = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let file = series.instanceInfoList.find(item => item.ImageId === obj.imageId)
|
||||||
|
if (file) {
|
||||||
|
getNetWorkSpeed()
|
||||||
|
setNetWorkSpeedSizeAll(obj.percentComplete, obj.FileTotal, obj.imageId)
|
||||||
|
}
|
||||||
if (prefetchInstanceCount >= instanceCount * 100) {
|
if (prefetchInstanceCount >= instanceCount * 100) {
|
||||||
series.prefetchInstanceCount = instanceCount * 100
|
series.prefetchInstanceCount = instanceCount * 100
|
||||||
// 设置当前序列状态为已下载完成
|
// 设置当前序列状态为已下载完成
|
||||||
series.loadStatus = true
|
series.loadStatus = true
|
||||||
|
workSpeedclose()
|
||||||
}
|
}
|
||||||
if (prefetchInstanceCount2 !== null && instanceCount2 !== null && prefetchInstanceCount2 >= instanceCount2 * 100) {
|
if (prefetchInstanceCount2 !== null && instanceCount2 !== null && prefetchInstanceCount2 >= instanceCount2 * 100) {
|
||||||
pSeries.prefetchInstanceCount = instanceCount2 * 100
|
pSeries.prefetchInstanceCount = instanceCount2 * 100
|
||||||
// 设置当前序列状态为已下载完成
|
// 设置当前序列状态为已下载完成
|
||||||
pSeries.loadStatus = true
|
pSeries.loadStatus = true
|
||||||
|
workSpeedclose()
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log('error')
|
console.log('error')
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ const getDefaultState = () => {
|
|||||||
unlock: false,
|
unlock: false,
|
||||||
config: {},
|
config: {},
|
||||||
uploadTip: '0.00KB/s',
|
uploadTip: '0.00KB/s',
|
||||||
|
uploadSize: '',
|
||||||
timer: null,
|
timer: null,
|
||||||
whiteList: [],
|
whiteList: [],
|
||||||
checkTaskId: null
|
checkTaskId: null
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
|
import store from "@/store";
|
||||||
/**
|
/**
|
||||||
* Parse the time to string
|
* Parse the time to string
|
||||||
* @param {(Object|string|number)} time
|
* @param {(Object|string|number)} time
|
||||||
@@ -91,4 +92,108 @@ export function deepClone(source, map = new WeakMap()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return target;
|
return target;
|
||||||
|
}
|
||||||
|
export function formatSize(size, fixed = 2) {
|
||||||
|
if (isNaN(parseFloat(size))) return ''
|
||||||
|
let kbSize = size / 1024
|
||||||
|
if (kbSize <= 1024) {
|
||||||
|
return `${kbSize.toFixed(fixed)}KB`
|
||||||
|
}
|
||||||
|
let mbSize = kbSize / 1024
|
||||||
|
return `${mbSize.toFixed(fixed)}MB`
|
||||||
|
}
|
||||||
|
|
||||||
|
let timer = null, // 网速定时器
|
||||||
|
lastPercentage = 0,
|
||||||
|
percentageById = {},
|
||||||
|
imageId = null,
|
||||||
|
bytesReceivedPerSecond = {}; // 时间节点上传文件总量
|
||||||
|
// 获取网速
|
||||||
|
export function getNetWorkSpeed() {
|
||||||
|
if (timer) return false;
|
||||||
|
// if (lastPercentage < 100) return false;
|
||||||
|
if (imageId && imageId !== Id) return false
|
||||||
|
imageId = null
|
||||||
|
timer = setInterval(() => {
|
||||||
|
let timeList = Object.keys(bytesReceivedPerSecond).sort((a, b) => a - b);
|
||||||
|
if (timeList.length > 0) {
|
||||||
|
let totalBytes = timeList.reduce((sum, bytes) => sum + bytesReceivedPerSecond[bytes], 0) / (5 * 1024);
|
||||||
|
let unit = 'KB/s';
|
||||||
|
if (totalBytes > 1024) {
|
||||||
|
totalBytes = totalBytes / 1024;
|
||||||
|
unit = "MB/s";
|
||||||
|
}
|
||||||
|
store.state.trials.uploadTip = totalBytes.toFixed(3) + unit;
|
||||||
|
}
|
||||||
|
if (timeList.length >= 5) {
|
||||||
|
delete bytesReceivedPerSecond[timeList[0]]
|
||||||
|
}
|
||||||
|
let time = new Date().getTime();
|
||||||
|
bytesReceivedPerSecond[time] = 0;
|
||||||
|
}, 1000)
|
||||||
|
|
||||||
|
}
|
||||||
|
export function setNetWorkSpeedSize(totalPercentage, total, Id) {
|
||||||
|
if (imageId && imageId !== Id) return false
|
||||||
|
imageId = Id
|
||||||
|
let percentage = totalPercentage - lastPercentage
|
||||||
|
percentage = percentage / 100
|
||||||
|
lastPercentage = 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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) {
|
||||||
|
if (!isForce && lastPercentage < 100) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
console.log('workSpeedclose')
|
||||||
|
if (timer) {
|
||||||
|
clearInterval(timer);
|
||||||
|
timer = null;
|
||||||
|
store.state.trials.uploadTip = '0KB/s'
|
||||||
|
store.state.trials.uploadSize = ''
|
||||||
|
}
|
||||||
|
bytesReceivedPerSecond = {};
|
||||||
|
lastPercentage = 0;
|
||||||
|
imageId = null;
|
||||||
|
percentageById = {};
|
||||||
}
|
}
|
||||||
@@ -19,14 +19,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="viewerSidethumbs ps" style="position: relative;">
|
<div class="viewerSidethumbs ps" style="position: relative;">
|
||||||
<div class="viewerSidethumbinner">
|
<div class="viewerSidethumbinner">
|
||||||
<div
|
<div v-for="(item, index) in seriesList" :key="index" :class="{ 'viewerSideActive': index == 0 }"
|
||||||
v-for="(item, index) in seriesList"
|
|
||||||
:key="index"
|
|
||||||
:class="{'viewerSideActive': index==0}"
|
|
||||||
style="position: relative;margin-bottom:5px;border-radius: 2px;border: 1px solid #404040;"
|
style="position: relative;margin-bottom:5px;border-radius: 2px;border: 1px solid #404040;"
|
||||||
series-type="current"
|
series-type="current" @click="showSeriesImage($event, index, item)">
|
||||||
@click="showSeriesImage($event,index,item)"
|
|
||||||
>
|
|
||||||
<div class="viewernavigatorwrapper">
|
<div class="viewernavigatorwrapper">
|
||||||
<!-- <el-image
|
<!-- <el-image
|
||||||
class="image-preview"
|
class="image-preview"
|
||||||
@@ -34,14 +29,8 @@
|
|||||||
:src="item.previewImageUrl"
|
:src="item.previewImageUrl"
|
||||||
fit="fill"
|
fit="fill"
|
||||||
/> -->
|
/> -->
|
||||||
<img
|
<img class="image-preview" :src="item.previewImageUrl" crossorigin="anonymous" alt=""
|
||||||
class="image-preview"
|
style="width: 72px;height:72px;" fit="fill">
|
||||||
:src="item.previewImageUrl"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
alt=""
|
|
||||||
style="width: 72px;height:72px;"
|
|
||||||
fit="fill"
|
|
||||||
>
|
|
||||||
<div class="viewernavitextwrapper">
|
<div class="viewernavitextwrapper">
|
||||||
<div style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
|
<div style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
|
||||||
<div v-if="item.keySeries" style="color:red">
|
<div v-if="item.keySeries" style="color:red">
|
||||||
@@ -51,23 +40,17 @@
|
|||||||
#{{ item.seriesNumber }}
|
#{{ item.seriesNumber }}
|
||||||
</div>
|
</div>
|
||||||
<div v-if="item.isExistMutiFrames && item.instanceCount > 1">
|
<div v-if="item.isExistMutiFrames && item.instanceCount > 1">
|
||||||
<el-popover
|
<el-popover v-model="item.isShowPopper" placement="right-start" trigger="manual"
|
||||||
v-model="item.isShowPopper"
|
popper-class="instance_frame_wrapper">
|
||||||
placement="right-start"
|
|
||||||
trigger="manual"
|
|
||||||
popper-class="instance_frame_wrapper"
|
|
||||||
>
|
|
||||||
<div style="text-align: right;">
|
<div style="text-align: right;">
|
||||||
<i class="el-icon-circle-close" style="font-size: 20px;cursor: pointer;color:#ddd;" @click="item.isShowPopper = false" />
|
<i class="el-icon-circle-close" style="font-size: 20px;cursor: pointer;color:#ddd;"
|
||||||
|
@click="item.isShowPopper = false" />
|
||||||
</div>
|
</div>
|
||||||
<div class="frame_list">
|
<div class="frame_list">
|
||||||
<div
|
<div v-for="(instance, idx) in item.instanceInfoList" :key="instance.Id"
|
||||||
v-for="(instance, idx) in item.instanceInfoList"
|
|
||||||
:key="instance.Id"
|
|
||||||
class="frame_content"
|
class="frame_content"
|
||||||
:style="{'margin-bottom':idx<item.instanceInfoList.length-1? '5px':'0px'}"
|
:style="{ 'margin-bottom': idx < item.instanceInfoList.length - 1 ? '5px' : '0px' }"
|
||||||
@click="showMultiFrames(item, index, instance)"
|
@click="showMultiFrames(item, index, instance)">
|
||||||
>
|
|
||||||
<div>
|
<div>
|
||||||
<div>{{ instance.InstanceNumber }}</div>
|
<div>{{ instance.InstanceNumber }}</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -75,22 +58,17 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="showDelete">
|
<div v-if="showDelete">
|
||||||
<span>{{ $t('trials:audit:table:isDelete') }}</span>
|
<span>{{ $t('trials:audit:table:isDelete') }}</span>
|
||||||
<el-switch
|
<el-switch v-model="instance.IsDeleted" size="mini"
|
||||||
v-model="instance.IsDeleted"
|
@change="changeInstanceDeleteStatus($event, item, instance)" />
|
||||||
size="mini"
|
|
||||||
@change="changeInstanceDeleteStatus($event, item, instance)"
|
|
||||||
/>
|
|
||||||
<span style="margin-left:10px;">{{ $t('trials:audit:table:isReading') }}</span>
|
<span style="margin-left:10px;">{{ $t('trials:audit:table:isReading') }}</span>
|
||||||
<el-switch
|
<el-switch v-model="instance.IsReading" size="mini"
|
||||||
v-model="instance.IsReading"
|
@change="changeInstanceReadingStatus($event, item, instance)" />
|
||||||
size="mini"
|
|
||||||
@change="changeInstanceReadingStatus($event, item, instance)"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;" @click="popperClick(seriesList, item)" />
|
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;"
|
||||||
|
@click="popperClick(seriesList, item)" />
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -100,7 +78,8 @@
|
|||||||
<div v-show="!item.keySeries && item.sliceThickness" style="padding: 1px;">
|
<div v-show="!item.keySeries && item.sliceThickness" style="padding: 1px;">
|
||||||
T: {{ parseFloat(item.sliceThickness).toFixed(2) }}
|
T: {{ parseFloat(item.sliceThickness).toFixed(2) }}
|
||||||
</div>
|
</div>
|
||||||
<div v-show="!item.keySeries &&item.description" style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
|
<div v-show="!item.keySeries && item.description"
|
||||||
|
style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
|
||||||
{{ item.description }}
|
{{ item.description }}
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!item.keySeries" style="padding: 1px;">
|
<div v-if="!item.keySeries" style="padding: 1px;">
|
||||||
@@ -109,27 +88,23 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="showDelete" style="display: flex;flex-direction: row;justify-content: space-between;" @click.stop="">
|
<div v-if="showDelete" style="display: flex;flex-direction: row;justify-content: space-between;"
|
||||||
|
@click.stop="">
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isReading') }}</span>
|
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isReading')
|
||||||
<el-switch
|
}}</span>
|
||||||
v-model="item.isReading"
|
<el-switch v-model="item.isReading" size="mini" @change="changeReadingStatus($event, item)" />
|
||||||
size="mini"
|
|
||||||
@change="changeReadingStatus($event, item)"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isDelete') }}</span>
|
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isDelete') }}</span>
|
||||||
<el-switch
|
<el-switch v-model="item.isDeleted" size="mini" @change="changeDeleteStatus($event, item)" />
|
||||||
v-model="item.isDeleted"
|
|
||||||
size="mini"
|
|
||||||
@change="changeDeleteStatus($event, item)"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="item.prefetchInstanceCount>0 && item.prefetchInstanceCount<item.instanceCount * 100">
|
<div
|
||||||
<el-progress :percentage="parseInt((item.prefetchInstanceCount/item.instanceCount).toFixed(2))" />
|
v-if="item.prefetchInstanceCount > 0 && item.prefetchInstanceCount < item.instanceCount * 100">
|
||||||
|
<el-progress
|
||||||
|
:percentage="parseInt((item.prefetchInstanceCount / item.instanceCount).toFixed(2))" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -164,6 +139,7 @@ import requestPoolManager from '@/utils/request-pool'
|
|||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { changeURLStatic } from '@/utils/history.js'
|
import { changeURLStatic } from '@/utils/history.js'
|
||||||
import metaDataProvider from '@/utils/metaDataProvider'
|
import metaDataProvider from '@/utils/metaDataProvider'
|
||||||
|
import { getNetWorkSpeed, setNetWorkSpeedSize, workSpeedclose } from "@/utils"
|
||||||
cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 })
|
cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 })
|
||||||
var config = {
|
var config = {
|
||||||
maxWebWorkers: 4,
|
maxWebWorkers: 4,
|
||||||
@@ -184,7 +160,7 @@ export default {
|
|||||||
'dicom-viewer': dicomViewer
|
'dicom-viewer': dicomViewer
|
||||||
},
|
},
|
||||||
|
|
||||||
data: function() {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
trialId: '',
|
trialId: '',
|
||||||
studyId: '',
|
studyId: '',
|
||||||
@@ -216,10 +192,12 @@ export default {
|
|||||||
imageList: [],
|
imageList: [],
|
||||||
showSeriesList: [],
|
showSeriesList: [],
|
||||||
currentLoadIns: [],
|
currentLoadIns: [],
|
||||||
isFromCRCUpload: false
|
isFromCRCUpload: false,
|
||||||
|
isReading: null,
|
||||||
|
activeSeriesId: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created: function() {
|
created: function () {
|
||||||
requestPoolManager.resetRequestPool()
|
requestPoolManager.resetRequestPool()
|
||||||
this.type = this.$router.currentRoute.query.type ? this.$router.currentRoute.query.type : ''
|
this.type = this.$router.currentRoute.query.type ? this.$router.currentRoute.query.type : ''
|
||||||
|
|
||||||
@@ -230,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') {
|
||||||
@@ -256,6 +237,7 @@ export default {
|
|||||||
cornerstone.imageCache.purgeCache()
|
cornerstone.imageCache.purgeCache()
|
||||||
requestPoolManager.resetRequestPool()
|
requestPoolManager.resetRequestPool()
|
||||||
})
|
})
|
||||||
|
workSpeedclose(true)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async loadStudy() {
|
async loadStudy() {
|
||||||
@@ -267,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)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -462,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]')
|
||||||
@@ -851,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) {
|
||||||
@@ -870,10 +858,16 @@ export default {
|
|||||||
this.seriesList[seriesIndex].imageloadedArr.push(imageId)
|
this.seriesList[seriesIndex].imageloadedArr.push(imageId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let file = this.seriesList[seriesIndex].instanceInfoList.find(item => item.ImageId === imageId)
|
||||||
|
if (file && this.activeSeriesId === this.seriesList[seriesIndex].seriesId) {
|
||||||
|
getNetWorkSpeed()
|
||||||
|
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
|
||||||
// 设置当前序列状态为已下载完成
|
// 设置当前序列状态为已下载完成
|
||||||
this.seriesList[seriesIndex].loadStatus = true
|
this.seriesList[seriesIndex].loadStatus = true
|
||||||
|
workSpeedclose()
|
||||||
if (!this.isFromCRCUpload) {
|
if (!this.isFromCRCUpload) {
|
||||||
this.loadAllImages()
|
this.loadAllImages()
|
||||||
}
|
}
|
||||||
@@ -881,90 +875,102 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.viewerContainer .el-tabs--border-card{
|
.viewerContainer .el-tabs--border-card {
|
||||||
background:none;
|
background: none;
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
.viewerContainer .el-tabs__item{
|
|
||||||
|
.viewerContainer .el-tabs__item {
|
||||||
height: 35px;
|
height: 35px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
}
|
}
|
||||||
.viewerContainer .el-tabs--border-card>.el-tabs__content{
|
|
||||||
|
.viewerContainer .el-tabs--border-card>.el-tabs__content {
|
||||||
padding: 5px 0px 0px 0px;
|
padding: 5px 0px 0px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer ::-webkit-scrollbar {
|
.viewerContainer ::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer ::-webkit-scrollbar-thumb {
|
.viewerContainer ::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
.viewerContainer .relationVisit{
|
|
||||||
|
.viewerContainer .relationVisit {
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
.viewerContainer{
|
|
||||||
display: block;
|
.viewerContainer {
|
||||||
height: 100%;
|
display: block;
|
||||||
margin-left: auto;
|
height: 100%;
|
||||||
margin-right: auto;
|
margin-left: auto;
|
||||||
background-color: #444;
|
margin-right: auto;
|
||||||
overflow: hidden;
|
background-color: #444;
|
||||||
}
|
overflow: hidden;
|
||||||
.viewerContainer .viewerBanner {
|
|
||||||
background: linear-gradient(0,#444,#222);
|
|
||||||
min-height: 28px;
|
|
||||||
font-size: 16px;
|
|
||||||
margin: 0;
|
|
||||||
height: 30px;
|
|
||||||
padding-top: 0;
|
|
||||||
padding-left: 5px;
|
|
||||||
padding-right: 5px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.viewerContainer .viewerBanner {
|
||||||
|
background: linear-gradient(0, #444, #222);
|
||||||
|
min-height: 28px;
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 0;
|
||||||
|
height: 30px;
|
||||||
|
padding-top: 0;
|
||||||
|
padding-left: 5px;
|
||||||
|
padding-right: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContentWrapper {
|
.viewerContainer .viewerContentWrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
/* height: 95%; */
|
/* height: 95%; */
|
||||||
height: 99%;
|
height: 99%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: clip;
|
text-overflow: clip;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContentWrapper>div {
|
.viewerContainer .viewerContentWrapper>div {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerLeftSidePanel {
|
.viewerContainer .viewerLeftSidePanel {
|
||||||
width: 215px;
|
width: 215px;
|
||||||
background-color: #323232;
|
background-color: #323232;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
color: #D0D0D0;
|
color: #D0D0D0;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContentWrapper>div>.sidePanelBody {
|
.viewerContainer .viewerContentWrapper>div>.sidePanelBody {
|
||||||
background: rgba(50,50,50,1);
|
background: rgba(50, 50, 50, 1);
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
display: table;
|
display: table;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: 1px solid #3e3f3a;
|
border: 1px solid #3e3f3a;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContentWrapper>div>div.sidePanelBody>div {
|
.viewerContainer .viewerContentWrapper>div>div.sidePanelBody>div {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.viewerContainer .studyDesc{
|
|
||||||
|
.viewerContainer .studyDesc {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -972,81 +978,96 @@ export default {
|
|||||||
color: #d0d0d0;
|
color: #d0d0d0;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .ps {
|
.viewerContainer .ps {
|
||||||
overflow: hidden !important;
|
overflow: hidden !important;
|
||||||
overflow-anchor: none;
|
overflow-anchor: none;
|
||||||
-ms-overflow-style: none;
|
-ms-overflow-style: none;
|
||||||
touch-action: auto;
|
touch-action: auto;
|
||||||
-ms-touch-action: auto;
|
-ms-touch-action: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerLeftSidePanel .viewernavigatorwrapper {
|
.viewerContainer .viewerLeftSidePanel .viewernavigatorwrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
height: 84px;
|
height: 84px;
|
||||||
padding: 1px 2px 1px 8px;
|
padding: 1px 2px 1px 8px;
|
||||||
margin: 6px 0 6px 1px;
|
margin: 6px 0 6px 1px;
|
||||||
/* border-radius: 2px;
|
/* border-radius: 2px;
|
||||||
border: 1px solid #404040; */
|
border: 1px solid #404040; */
|
||||||
}
|
}
|
||||||
.viewerContainer .viewernavigatorwrapper .el-progress__text{
|
|
||||||
|
.viewerContainer .viewernavigatorwrapper .el-progress__text {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.viewerContainer .viewernavigatorwrapper .el-progress-bar{
|
|
||||||
padding-right:0px;
|
|
||||||
}
|
|
||||||
.viewerContainer .ui-draggable-handle {
|
|
||||||
-ms-touch-action: none;
|
|
||||||
touch-action: none;
|
|
||||||
}
|
|
||||||
.viewerContainer .viewerLeftSidePanel .image-preview {
|
|
||||||
border: 2px solid #252525;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.viewerContainer .viewerLeftSidePanel .viewernavitextwrapper {
|
|
||||||
/* width: 120px;
|
|
||||||
height: 80px; */
|
|
||||||
flex:1;
|
|
||||||
padding: 3px 1px 3px 4px;
|
|
||||||
vertical-align: top;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
.viewerContainer .viewerLeftSidePanel .viewerlabelwrapper {
|
|
||||||
width: 20px;
|
|
||||||
|
|
||||||
font-size: 12px;
|
.viewerContainer .viewernavigatorwrapper .el-progress-bar {
|
||||||
|
padding-right: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.viewerContainer .ui-draggable-handle {
|
||||||
|
-ms-touch-action: none;
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewerContainer .viewerLeftSidePanel .image-preview {
|
||||||
|
border: 2px solid #252525;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewerContainer .viewerLeftSidePanel .viewernavitextwrapper {
|
||||||
|
/* width: 120px;
|
||||||
|
height: 80px; */
|
||||||
|
flex: 1;
|
||||||
|
padding: 3px 1px 3px 4px;
|
||||||
|
vertical-align: top;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewerContainer .viewerLeftSidePanel .viewerlabelwrapper {
|
||||||
|
width: 20px;
|
||||||
|
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerSideActive {
|
.viewerContainer .viewerSideActive {
|
||||||
background: #16477b;
|
background: #16477b;
|
||||||
background: #16477b80;
|
background: #16477b80;
|
||||||
border: 1px solid #23527b;
|
border: 1px solid #23527b;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContent {
|
.viewerContainer .viewerContent {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: block;
|
display: block;
|
||||||
background-color: black;
|
background-color: black;
|
||||||
color: #D0D0D0;
|
color: #D0D0D0;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
.instance_frame_wrapper{
|
|
||||||
|
.instance_frame_wrapper {
|
||||||
min-width: 120px;
|
min-width: 120px;
|
||||||
background-color: #2c2c2c;
|
background-color: #2c2c2c;
|
||||||
border: 1px solid #2c2c2c;
|
border: 1px solid #2c2c2c;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
.frame_list{
|
|
||||||
|
.frame_list {
|
||||||
max-height: 500px;
|
max-height: 500px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.instance_frame_wrapper ::-webkit-scrollbar {
|
.instance_frame_wrapper ::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
}
|
}
|
||||||
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
|
||||||
|
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
.frame_content{
|
|
||||||
|
.frame_content {
|
||||||
/* height: 50px; */
|
/* height: 50px; */
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -1055,6 +1076,7 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
border: 1px solid #404040;
|
border: 1px solid #404040;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frame_content:hover {
|
.frame_content:hover {
|
||||||
/* font-weight: bold; */
|
/* font-weight: bold; */
|
||||||
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
|
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
|
||||||
@@ -1063,6 +1085,7 @@ export default {
|
|||||||
border-color: #213a54 !important;
|
border-color: #213a54 !important;
|
||||||
background-color: #213a54;
|
background-color: #213a54;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* .viewerRightSidePanel {
|
/* .viewerRightSidePanel {
|
||||||
width: 300px;
|
width: 300px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -16,7 +16,8 @@
|
|||||||
:key="index"
|
:key="index"
|
||||||
> -->
|
> -->
|
||||||
<el-collapse v-model="activeNames">
|
<el-collapse v-model="activeNames">
|
||||||
<el-collapse-item v-for="(study, index) in studyList" :key="`${study.StudyId}`" :name="`${study.StudyId}`">
|
<el-collapse-item v-for="(study, index) in studyList" :key="`${study.StudyId}`"
|
||||||
|
:name="`${study.StudyId}`">
|
||||||
<template slot="title">
|
<template slot="title">
|
||||||
|
|
||||||
<div class="text-desc">
|
<div class="text-desc">
|
||||||
@@ -25,8 +26,10 @@
|
|||||||
<!-- <div v-show="study.Description" class="text-desc">
|
<!-- <div v-show="study.Description" class="text-desc">
|
||||||
{{ study.Description }}
|
{{ study.Description }}
|
||||||
</div> -->
|
</div> -->
|
||||||
<el-tooltip v-show="study.Description" class="item" effect="dark" :content="study.Description" placement="bottom">
|
<el-tooltip v-show="study.Description" class="item" effect="dark" :content="study.Description"
|
||||||
<div v-show="study.Description" style="width: 50px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
|
placement="bottom">
|
||||||
|
<div v-show="study.Description"
|
||||||
|
style="width: 50px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
|
||||||
{{ study.Description }}
|
{{ study.Description }}
|
||||||
</div>
|
</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
@@ -37,44 +40,29 @@
|
|||||||
<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
|
<div v-for="(series, i) in study.SeriesList" :key="i"
|
||||||
v-for="(series, i) in study.SeriesList"
|
:class="{ 'viewerSideActive': i == 0 && index === 0 }"
|
||||||
:key="i"
|
|
||||||
:class="{'viewerSideActive': i==0 && index === 0}"
|
|
||||||
style="position: relative;margin-bottom:5px;border-radius: 2px;border: 1px solid #404040;"
|
style="position: relative;margin-bottom:5px;border-radius: 2px;border: 1px solid #404040;"
|
||||||
series-type="current"
|
series-type="current" @click="showSeriesImage($event, index, i, series)">
|
||||||
@click="showSeriesImage($event,index,i,series)"
|
|
||||||
>
|
|
||||||
<div class="viewernavigatorwrapper">
|
<div class="viewernavigatorwrapper">
|
||||||
<img
|
<img class="image-preview" :src="series.previewImageUrl" crossorigin="anonymous" alt=""
|
||||||
class="image-preview"
|
style="width: 85px;height:85px;" fit="fill">
|
||||||
:src="series.previewImageUrl"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
alt=""
|
|
||||||
style="width: 85px;height:85px;"
|
|
||||||
fit="fill"
|
|
||||||
>
|
|
||||||
<div class="viewernavitextwrapper">
|
<div class="viewernavitextwrapper">
|
||||||
<div style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
|
<div style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
|
||||||
<div>#{{ series.seriesNumber }}</div>
|
<div>#{{ series.seriesNumber }}</div>
|
||||||
<div v-if="series.isExistMutiFrames && series.instanceCount > 1">
|
<div v-if="series.isExistMutiFrames && series.instanceCount > 1">
|
||||||
<el-popover
|
<el-popover v-model="series.isShowPopper" placement="right-start" trigger="manual"
|
||||||
v-model="series.isShowPopper"
|
popper-class="instance_frame_wrapper">
|
||||||
placement="right-start"
|
|
||||||
trigger="manual"
|
|
||||||
popper-class="instance_frame_wrapper"
|
|
||||||
>
|
|
||||||
<div style="text-align: right;">
|
<div style="text-align: right;">
|
||||||
<i class="el-icon-circle-close" style="font-size: 20px;cursor: pointer;color:#ddd;" @click="series.isShowPopper = false" />
|
<i class="el-icon-circle-close"
|
||||||
|
style="font-size: 20px;cursor: pointer;color:#ddd;"
|
||||||
|
@click="series.isShowPopper = false" />
|
||||||
</div>
|
</div>
|
||||||
<div class="frame_list">
|
<div class="frame_list">
|
||||||
<div
|
<div v-for="(instance, idx) in series.instanceInfoList" :key="instance.Id"
|
||||||
v-for="(instance, idx) in series.instanceInfoList"
|
|
||||||
:key="instance.Id"
|
|
||||||
class="frame_content"
|
class="frame_content"
|
||||||
:style="{'margin-bottom':idx<series.instanceInfoList.length-1? '5px':'0px'}"
|
:style="{ 'margin-bottom': idx < series.instanceInfoList.length - 1 ? '5px' : '0px' }"
|
||||||
@click="showMultiFrames(index,series, i, instance)"
|
@click="showMultiFrames(index, series, i, instance)">
|
||||||
>
|
|
||||||
<!-- <div>
|
<!-- <div>
|
||||||
<img
|
<img
|
||||||
class="image-preview"
|
class="image-preview"
|
||||||
@@ -92,23 +80,20 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="showDelete">
|
<div v-if="showDelete">
|
||||||
<span>{{ $t('trials:audit:table:isDelete') }}</span>
|
<span>{{ $t('trials:audit:table:isDelete') }}</span>
|
||||||
<el-switch
|
<el-switch v-model="instance.IsDeleted" size="mini"
|
||||||
v-model="instance.IsDeleted"
|
@change="changeInstanceDeleteStatus($event, series, instance)" />
|
||||||
size="mini"
|
<span style="margin-left:10px;">{{ $t('trials:audit:table:isReading')
|
||||||
@change="changeInstanceDeleteStatus($event, series, instance)"
|
}}</span>
|
||||||
/>
|
<el-switch v-model="instance.IsReading" size="mini"
|
||||||
<span style="margin-left:10px;">{{ $t('trials:audit:table:isReading') }}</span>
|
@change="changeInstanceReadingStatus($event, series, instance)" />
|
||||||
<el-switch
|
|
||||||
v-model="instance.IsReading"
|
|
||||||
size="mini"
|
|
||||||
@change="changeInstanceReadingStatus($event, series, instance)"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;" @click="popperClick(studyList, series)" />
|
<i slot="reference" class="el-icon-connection"
|
||||||
|
style="font-size: 15px;cursor: pointer;"
|
||||||
|
@click="popperClick(studyList, series)" />
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -116,12 +101,14 @@
|
|||||||
<div v-show="series.InstanceCount" style="padding: 1px;">
|
<div v-show="series.InstanceCount" style="padding: 1px;">
|
||||||
{{ series.modality }}: {{ series.instanceCount }} image
|
{{ series.modality }}: {{ series.instanceCount }} image
|
||||||
</div>
|
</div>
|
||||||
<div v-show=" series.sliceThickness" style="padding: 1px;">
|
<div v-show="series.sliceThickness" style="padding: 1px;">
|
||||||
T: {{ series.sliceThickness }}
|
T: {{ series.sliceThickness }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-tooltip v-show="series.description" class="item" effect="dark" :content="series.description" placement="bottom">
|
<el-tooltip v-show="series.description" class="item" effect="dark"
|
||||||
<div v-show="series.description" style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
|
:content="series.description" placement="bottom">
|
||||||
|
<div v-show="series.description"
|
||||||
|
style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
|
||||||
{{ series.description }}
|
{{ series.description }}
|
||||||
</div>
|
</div>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
@@ -131,30 +118,27 @@
|
|||||||
<div />
|
<div />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="showDelete" style="display: flex;flex-direction: row;justify-content: space-between;" @click.stop="">
|
<div v-if="showDelete"
|
||||||
|
style="display: flex;flex-direction: row;justify-content: space-between;" @click.stop="">
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<span style="font-size: 12px;">{{ $t('trials:audit:table:isReading') }}</span>
|
<span style="font-size: 12px;">{{ $t('trials:audit:table:isReading') }}</span>
|
||||||
<el-switch
|
<el-switch v-model="series.isReading" size="mini"
|
||||||
v-model="series.isReading"
|
@change="changeReadingStatus($event, series)" />
|
||||||
size="mini"
|
|
||||||
@change="changeReadingStatus($event, series)"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span style="font-size: 12px;">{{ $t('trials:audit:table:isDelete') }}</span>
|
<span style="font-size: 12px;">{{ $t('trials:audit:table:isDelete') }}</span>
|
||||||
<el-switch
|
<el-switch v-model="series.isDeleted" size="mini"
|
||||||
v-model="series.isDeleted"
|
@change="changeDeleteStatus($event, series)" />
|
||||||
size="mini"
|
|
||||||
@change="changeDeleteStatus($event, series)"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div style="position: absolute;bottom: -10px;left: 0;width: 100%;">
|
<!-- <div style="position: absolute;bottom: -10px;left: 0;width: 100%;">
|
||||||
<el-progress v-if="series.prefetchInstanceCount>0 && series.prefetchInstanceCount<series.instanceCount" :percentage="Number(series.prefetchInstanceCount/series.instanceCount)*100" />
|
<el-progress v-if="series.prefetchInstanceCount>0 && series.prefetchInstanceCount<series.instanceCount" :percentage="Number(series.prefetchInstanceCount/series.instanceCount)*100" />
|
||||||
</div> -->
|
</div> -->
|
||||||
<div v-if="series.prefetchInstanceCount>0 && series.prefetchInstanceCount<series.instanceCount * 100">
|
<div
|
||||||
<el-progress :percentage="parseInt((series.prefetchInstanceCount/series.instanceCount).toFixed(2))" />
|
v-if="series.prefetchInstanceCount > 0 && series.prefetchInstanceCount < series.instanceCount * 100">
|
||||||
|
<el-progress
|
||||||
|
:percentage="parseInt((series.prefetchInstanceCount / series.instanceCount).toFixed(2))" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -165,102 +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" class="pane-relation-wrapper">
|
<el-tab-pane v-show="!visitTaskId" :label="$t('trials:dicom-show:relatedVisit')" name="relation-study"
|
||||||
|
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
|
<div v-for="(seriesItem, index) in study.seriesList" :key="seriesItem.seriesId">
|
||||||
v-for="(seriesItem, index) in study.seriesList"
|
<div class="viewernavigatorwrapper"
|
||||||
:key="index"
|
style="position: relative;border:1px solid #434343;" series-type="relation"
|
||||||
class="viewernavigatorwrapper"
|
@click="showRelationSeriesImage($event, seriesItem, studyIndex, index)">
|
||||||
style="position: relative;border:1px solid #434343;"
|
<img class="image-preview" :src="seriesItem.previewImageUrl" crossorigin="anonymous"
|
||||||
series-type="relation"
|
alt="" style="width: 85px;height:85px;" fit="fill">
|
||||||
@click="showRelationSeriesImage($event,seriesItem,studyIndex,index)"
|
|
||||||
>
|
<div class="viewernavitextwrapper">
|
||||||
<!-- <el-image
|
<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
|
<div
|
||||||
class="image-preview"
|
v-if="seriesItem.prefetchInstanceCount > 0 && seriesItem.prefetchInstanceCount < seriesItem.instanceCount * 100">
|
||||||
:src="seriesItem.previewImageUrl"
|
<el-progress
|
||||||
crossorigin="anonymous"
|
:percentage="parseInt((seriesItem.prefetchInstanceCount / seriesItem.instanceCount).toFixed(2))" />
|
||||||
alt=""
|
</div>
|
||||||
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>
|
||||||
<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>
|
||||||
@@ -287,6 +278,7 @@ import { getTaskUploadedDicomStudyList } from '@/api/reading'
|
|||||||
import requestPoolManager from '@/utils/request-pool'
|
import requestPoolManager from '@/utils/request-pool'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
import { changeURLStatic } from '@/utils/history.js'
|
import { changeURLStatic } from '@/utils/history.js'
|
||||||
|
import { getNetWorkSpeed, setNetWorkSpeedSize, workSpeedclose } from "@/utils"
|
||||||
import metaDataProvider from '@/utils/metaDataProvider'
|
import metaDataProvider from '@/utils/metaDataProvider'
|
||||||
cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 })
|
cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 })
|
||||||
// import * as cornerstoneTools from 'cornerstone-tools'
|
// import * as cornerstoneTools from 'cornerstone-tools'
|
||||||
@@ -315,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,
|
||||||
@@ -328,7 +321,8 @@ export default {
|
|||||||
currentLoadIns: [],
|
currentLoadIns: [],
|
||||||
isFromCRCUpload: false,
|
isFromCRCUpload: false,
|
||||||
visitTaskId: null,
|
visitTaskId: null,
|
||||||
page: ''
|
page: '',
|
||||||
|
activeSeriesId: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -361,6 +355,7 @@ export default {
|
|||||||
cornerstone.imageCache.purgeCache()
|
cornerstone.imageCache.purgeCache()
|
||||||
requestPoolManager.resetRequestPool()
|
requestPoolManager.resetRequestPool()
|
||||||
})
|
})
|
||||||
|
workSpeedclose(true)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 获取某个访视下所有的检查信息
|
// 获取某个访视下所有的检查信息
|
||||||
@@ -459,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) => {
|
||||||
@@ -707,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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -739,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 = []
|
||||||
@@ -749,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`)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -775,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) {
|
||||||
@@ -786,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]')
|
||||||
@@ -805,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() {
|
||||||
@@ -864,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) {
|
||||||
@@ -887,6 +918,11 @@ export default {
|
|||||||
series.imageloadedArr.push(imageId)
|
series.imageloadedArr.push(imageId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let file = series.instanceInfoList.find(item => item.ImageId === imageId)
|
||||||
|
if (file && this.activeSeriesId === series.seriesId) {
|
||||||
|
getNetWorkSpeed()
|
||||||
|
setNetWorkSpeedSize(percentComplete, e.detail.total, imageId)
|
||||||
|
}
|
||||||
if (prefetchInstanceCount >= instanceCount * 100) {
|
if (prefetchInstanceCount >= instanceCount * 100) {
|
||||||
series.prefetchInstanceCount = instanceCount * 100
|
series.prefetchInstanceCount = instanceCount * 100
|
||||||
// 设置当前序列状态为已下载完成
|
// 设置当前序列状态为已下载完成
|
||||||
@@ -894,96 +930,110 @@ export default {
|
|||||||
if (!this.isFromCRCUpload) {
|
if (!this.isFromCRCUpload) {
|
||||||
this.loadAllImages()
|
this.loadAllImages()
|
||||||
}
|
}
|
||||||
|
workSpeedclose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style >
|
<style>
|
||||||
.viewerContainer .el-tabs--border-card{
|
.viewerContainer .el-tabs--border-card {
|
||||||
background:none;
|
background: none;
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
.viewerContainer .el-tabs__item{
|
|
||||||
|
.viewerContainer .el-tabs__item {
|
||||||
height: 35px;
|
height: 35px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
width: 100px;
|
width: 100px;
|
||||||
padding: 0!important;
|
padding: 0 !important;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
transform: scale(.8);
|
transform: scale(.8);
|
||||||
}
|
}
|
||||||
.viewerContainer .el-tabs--border-card>.el-tabs__content{
|
|
||||||
|
.viewerContainer .el-tabs--border-card>.el-tabs__content {
|
||||||
padding: 5px 0px 0px 0px;
|
padding: 5px 0px 0px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer ::-webkit-scrollbar {
|
.viewerContainer ::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer ::-webkit-scrollbar-thumb {
|
.viewerContainer ::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
.viewerContainer .relationVisit{
|
|
||||||
|
.viewerContainer .relationVisit {
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
.viewerContainer{
|
|
||||||
display: block;
|
.viewerContainer {
|
||||||
height: 100%;
|
display: block;
|
||||||
margin-left: auto;
|
height: 100%;
|
||||||
margin-right: auto;
|
margin-left: auto;
|
||||||
background-color: #444;
|
margin-right: auto;
|
||||||
overflow: hidden;
|
background-color: #444;
|
||||||
}
|
overflow: hidden;
|
||||||
.viewerContainer .viewerBanner {
|
|
||||||
background: linear-gradient(0,#444,#222);
|
|
||||||
min-height: 28px;
|
|
||||||
font-size: 16px;
|
|
||||||
margin: 0;
|
|
||||||
height: 30px;
|
|
||||||
padding-top: 0;
|
|
||||||
padding-left: 5px;
|
|
||||||
padding-right: 5px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.viewerContainer .viewerBanner {
|
||||||
|
background: linear-gradient(0, #444, #222);
|
||||||
|
min-height: 28px;
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 0;
|
||||||
|
height: 30px;
|
||||||
|
padding-top: 0;
|
||||||
|
padding-left: 5px;
|
||||||
|
padding-right: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContentWrapper {
|
.viewerContainer .viewerContentWrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
/* height: 95%; */
|
/* height: 95%; */
|
||||||
height: 99%;
|
height: 99%;
|
||||||
/* overflow: hidden;
|
/* overflow: hidden;
|
||||||
text-overflow: clip; */
|
text-overflow: clip; */
|
||||||
/* white-space: nowrap; */
|
/* white-space: nowrap; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContentWrapper>div {
|
.viewerContainer .viewerContentWrapper>div {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerLeftSidePanel {
|
.viewerContainer .viewerLeftSidePanel {
|
||||||
width: 220px;
|
width: 220px;
|
||||||
background-color: #323232;
|
background-color: #323232;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
color: #D0D0D0;
|
color: #D0D0D0;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContentWrapper>div>.sidePanelBody {
|
.viewerContainer .viewerContentWrapper>div>.sidePanelBody {
|
||||||
background: rgba(50,50,50,1);
|
background: rgba(50, 50, 50, 1);
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
display: table;
|
display: table;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: 1px solid #3e3f3a;
|
border: 1px solid #3e3f3a;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContentWrapper>div>div.sidePanelBody>div {
|
.viewerContainer .viewerContentWrapper>div>div.sidePanelBody>div {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.viewerContainer .text-desc{
|
|
||||||
|
.viewerContainer .text-desc {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -991,107 +1041,126 @@ export default {
|
|||||||
color: #d0d0d0;
|
color: #d0d0d0;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .ps {
|
.viewerContainer .ps {
|
||||||
overflow: hidden !important;
|
overflow: hidden !important;
|
||||||
overflow-anchor: none;
|
overflow-anchor: none;
|
||||||
-ms-overflow-style: none;
|
-ms-overflow-style: none;
|
||||||
touch-action: auto;
|
touch-action: auto;
|
||||||
-ms-touch-action: auto;
|
-ms-touch-action: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerLeftSidePanel .viewernavigatorwrapper {
|
.viewerContainer .viewerLeftSidePanel .viewernavigatorwrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 220px;
|
width: 220px;
|
||||||
/* height: 84px; */
|
/* height: 84px; */
|
||||||
padding: 1px 2px 1px 2px;
|
padding: 1px 2px 1px 2px;
|
||||||
margin: 2px 0 1px 1px;
|
margin: 2px 0 1px 1px;
|
||||||
/* border-radius: 2px;
|
/* border-radius: 2px;
|
||||||
border: 1px solid #404040; */
|
border: 1px solid #404040; */
|
||||||
|
|
||||||
}
|
}
|
||||||
.viewerContainer .viewernavigatorwrapper .el-progress__text{
|
|
||||||
|
.viewerContainer .viewernavigatorwrapper .el-progress__text {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.viewerContainer .viewernavigatorwrapper .el-progress-bar{
|
|
||||||
padding-right:0px;
|
|
||||||
}
|
|
||||||
.viewerContainer .ui-draggable-handle {
|
|
||||||
-ms-touch-action: none;
|
|
||||||
touch-action: none;
|
|
||||||
}
|
|
||||||
.viewerContainer .viewerLeftSidePanel .image-preview {
|
|
||||||
border: 2px solid #252525;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.viewerContainer .viewerLeftSidePanel .viewernavitextwrapper {
|
|
||||||
/* width: 120px;
|
|
||||||
height: 80px; */
|
|
||||||
flex:1;
|
|
||||||
padding: 3px 1px 3px 4px;
|
|
||||||
vertical-align: top;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
.viewerContainer .viewerLeftSidePanel .viewerlabelwrapper {
|
|
||||||
width: 20px;
|
|
||||||
|
|
||||||
font-size: 12px;
|
.viewerContainer .viewernavigatorwrapper .el-progress-bar {
|
||||||
|
padding-right: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.viewerContainer .ui-draggable-handle {
|
||||||
|
-ms-touch-action: none;
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewerContainer .viewerLeftSidePanel .image-preview {
|
||||||
|
border: 2px solid #252525;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewerContainer .viewerLeftSidePanel .viewernavitextwrapper {
|
||||||
|
/* width: 120px;
|
||||||
|
height: 80px; */
|
||||||
|
flex: 1;
|
||||||
|
padding: 3px 1px 3px 4px;
|
||||||
|
vertical-align: top;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.viewerContainer .viewerLeftSidePanel .viewerlabelwrapper {
|
||||||
|
width: 20px;
|
||||||
|
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerSideActive {
|
.viewerContainer .viewerSideActive {
|
||||||
background: #16477b;
|
background: #16477b;
|
||||||
background: #16477b80;
|
background: #16477b80;
|
||||||
border: 1px solid #23527b;
|
border: 1px solid #23527b;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .viewerContent {
|
.viewerContainer .viewerContent {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: block;
|
display: block;
|
||||||
background-color: black;
|
background-color: black;
|
||||||
color: #D0D0D0;
|
color: #D0D0D0;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
.viewerContainer .pane-relation-wrapper{
|
|
||||||
|
.viewerContainer .pane-relation-wrapper {
|
||||||
min-height: 500px;
|
min-height: 500px;
|
||||||
}
|
}
|
||||||
.viewerContainer .el-collapse{
|
|
||||||
|
.viewerContainer .el-collapse {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.viewerContainer .el-collapse-item{
|
.viewerContainer .el-collapse-item {
|
||||||
background-color: #585453!important;
|
background-color: #585453 !important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
|
|
||||||
}
|
}
|
||||||
.viewerContainer .el-collapse-item__content{
|
|
||||||
padding-bottom:5px;
|
.viewerContainer .el-collapse-item__content {
|
||||||
background-color: #2c2c2c!important;
|
padding-bottom: 5px;
|
||||||
|
background-color: #2c2c2c !important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
}
|
}
|
||||||
.viewerContainer .el-collapse-item__header{
|
|
||||||
background-color: #585453!important;
|
.viewerContainer .el-collapse-item__header {
|
||||||
|
background-color: #585453 !important;
|
||||||
color: #ddd;
|
color: #ddd;
|
||||||
border-bottom-color:#5a5a5a;
|
border-bottom-color: #5a5a5a;
|
||||||
padding-left: 5px;
|
padding-left: 5px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
.instance_frame_wrapper{
|
|
||||||
|
.instance_frame_wrapper {
|
||||||
min-width: 120px;
|
min-width: 120px;
|
||||||
background-color: #2c2c2c;
|
background-color: #2c2c2c;
|
||||||
border: 1px solid #2c2c2c;
|
border: 1px solid #2c2c2c;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
.frame_list{
|
|
||||||
|
.frame_list {
|
||||||
max-height: 500px;
|
max-height: 500px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.instance_frame_wrapper ::-webkit-scrollbar {
|
.instance_frame_wrapper ::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
}
|
}
|
||||||
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
|
||||||
|
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
.frame_content{
|
|
||||||
|
.frame_content {
|
||||||
/* height: 50px; */
|
/* height: 50px; */
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -1100,6 +1169,7 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
border: 1px solid #404040;
|
border: 1px solid #404040;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frame_content:hover {
|
.frame_content:hover {
|
||||||
/* font-weight: bold; */
|
/* font-weight: bold; */
|
||||||
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
|
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
|
||||||
@@ -1121,4 +1191,3 @@ export default {
|
|||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
} */
|
} */
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
@@ -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'
|
||||||
@@ -112,6 +113,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">
|
||||||
|
|||||||
@@ -1,15 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div id="canvas" ref="canvas" v-loading="loading" :element-loading-text="NSTip"
|
||||||
id="canvas"
|
element-loading-background="rgba(0, 0, 0, 0.8)" style="position:relative;" class="cornerstone-element"
|
||||||
ref="canvas"
|
@mouseup="sliderMouseup" @contextmenu.prevent="onContextmenu">
|
||||||
v-loading="loading"
|
|
||||||
element-loading-text="Loading..."
|
|
||||||
element-loading-background="rgba(0, 0, 0, 0.8)"
|
|
||||||
style="position:relative;"
|
|
||||||
class="cornerstone-element"
|
|
||||||
@mouseup="sliderMouseup"
|
|
||||||
@contextmenu.prevent="onContextmenu"
|
|
||||||
>
|
|
||||||
<!-- 临床数据 -->
|
<!-- 临床数据 -->
|
||||||
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
|
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
|
||||||
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom">
|
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom">
|
||||||
@@ -18,46 +10,39 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- 切换访视 -->
|
<!-- 切换访视 -->
|
||||||
<div
|
<div v-if="stack.imageRendered && isReadingTaskViewInOrder === 1" class="info-visit"
|
||||||
v-if="stack.imageRendered && isReadingTaskViewInOrder === 1"
|
@dblclick.stop="preventDefault($event)">
|
||||||
class="info-visit"
|
<div class="arrw_div_wrapper"
|
||||||
@dblclick.stop="preventDefault($event)"
|
:style="{ cursor: stack.visitTaskNum <= minVistNum ? 'not-allowed' : 'pointer', color: stack.visitTaskNum <= minVistNum ? '#888' : '#fff' }"
|
||||||
>
|
@click.stop.prevent="toggleSeries($event, -1)" @dblclick.stop="preventDefault($event)">
|
||||||
<div
|
|
||||||
class="arrw_div_wrapper"
|
|
||||||
:style="{cursor:stack.visitTaskNum <= minVistNum?'not-allowed':'pointer',color:stack.visitTaskNum <= minVistNum?'#888':'#fff'}"
|
|
||||||
@click.stop.prevent="toggleSeries($event,-1)"
|
|
||||||
@dblclick.stop="preventDefault($event)"
|
|
||||||
>
|
|
||||||
<i class="el-icon-caret-left" />
|
<i class="el-icon-caret-left" />
|
||||||
</div>
|
</div>
|
||||||
<div class="blind_name_wrapper">
|
<div class="blind_name_wrapper">
|
||||||
{{ stack.taskBlindName }}
|
{{ stack.taskBlindName }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div class="arrw_div_wrapper"
|
||||||
class="arrw_div_wrapper"
|
:style="{ cursor: stack.visitTaskNum >= maxVistNum ? 'not-allowed' : 'pointer', color: stack.visitTaskNum >= maxVistNum ? '#888' : '#fff' }"
|
||||||
:style="{cursor:stack.visitTaskNum >= maxVistNum?'not-allowed':'pointer',color:stack.visitTaskNum >= maxVistNum?'#888':'#fff'}"
|
@click.stop.prevent="toggleSeries($event, 1)" @dblclick.stop="preventDefault($event)">
|
||||||
@click.stop.prevent="toggleSeries($event,1)"
|
|
||||||
@dblclick.stop="preventDefault($event)"
|
|
||||||
>
|
|
||||||
<i class="el-icon-caret-right" />
|
<i class="el-icon-caret-right" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-series">
|
<div class="info-series">
|
||||||
<h2 v-if="isReadingShowSubjectInfo" style="color:#f44336;padding: 5px 0px;margin: 0;">{{ subjectCode }} {{ stack.taskBlindName }}</h2>
|
<h2 v-if="isReadingShowSubjectInfo" style="color:#f44336;padding: 5px 0px;margin: 0;">{{ subjectCode }} {{
|
||||||
|
stack.taskBlindName }}</h2>
|
||||||
<div v-show="dicomInfo.series">Series: #{{ dicomInfo.series }}</div>
|
<div v-show="dicomInfo.series">Series: #{{ dicomInfo.series }}</div>
|
||||||
<div>Image: #{{ dicomInfo.frame }}</div>
|
<div>Image: #{{ dicomInfo.frame }}</div>
|
||||||
<div>{{ dicomInfo.modality }}</div>
|
<div>{{ dicomInfo.modality }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-image">
|
<div class="info-image">
|
||||||
<div v-show="mousePosition.mo">
|
<div v-show="mousePosition.mo">
|
||||||
Pos: {{ mousePosition.x?mousePosition.x.toFixed(0):'' }}, {{ mousePosition.y?mousePosition.y.toFixed(0):'' }}
|
Pos: {{ mousePosition.x ? mousePosition.x.toFixed(0) : '' }}, {{ mousePosition.y ? mousePosition.y.toFixed(0) : '' }}
|
||||||
</div>
|
</div>
|
||||||
<div v-if="(dicomInfo.modality === 'CT' || dicomInfo.modality === 'DR' || dicomInfo.modality === 'CR') && mousePosition.mo">
|
<div
|
||||||
|
v-if="(dicomInfo.modality === 'CT' || dicomInfo.modality === 'DR' || dicomInfo.modality === 'CR') && mousePosition.mo">
|
||||||
HU: {{ mousePosition.mo }}
|
HU: {{ mousePosition.mo }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="(dicomInfo.modality === 'PT' && mousePosition.suv)">
|
<div v-else-if="(dicomInfo.modality === 'PT' && mousePosition.suv)">
|
||||||
SUVbw(g/ml): {{ digitPlaces === -1 ?mousePosition.suv.toFixed(3) :mousePosition.suv.toFixed(digitPlaces) }}
|
SUVbw(g/ml): {{ digitPlaces === -1 ? mousePosition.suv.toFixed(3) : mousePosition.suv.toFixed(digitPlaces) }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="mousePosition.mo">
|
<div v-else-if="mousePosition.mo">
|
||||||
Density: {{ mousePosition.mo }}
|
Density: {{ mousePosition.mo }}
|
||||||
@@ -81,8 +66,12 @@
|
|||||||
<!-- <div v-show="dicomInfo.acc">ACC {{ dicomInfo.acc }}</div> -->
|
<!-- <div v-show="dicomInfo.acc">ACC {{ dicomInfo.acc }}</div> -->
|
||||||
<!-- <div>{{ dicomInfo.time }}</div> -->
|
<!-- <div>{{ dicomInfo.time }}</div> -->
|
||||||
</div>
|
</div>
|
||||||
<div ref="sliderBox" class="my_slider_box" style="position: absolute;right: 1px;height: calc(100% - 140px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer" @click.stop="goViewer($event)">
|
<div ref="sliderBox" class="my_slider_box"
|
||||||
<div :style="{top: height + '%'}" style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move" @click.stop.prevent="() => {return}" @mousedown.stop="sliderMousedown($event)" />
|
style="position: absolute;right: 1px;height: calc(100% - 140px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer"
|
||||||
|
@click.stop="goViewer($event)">
|
||||||
|
<div :style="{ top: height + '%' }"
|
||||||
|
style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move"
|
||||||
|
@click.stop.prevent="() => { return }" @mousedown.stop="sliderMousedown($event)" />
|
||||||
</div>
|
</div>
|
||||||
<div style="position: absolute;left: 50%;top: 30px;color: #f44336;transform: translateX(-50%);">
|
<div style="position: absolute;left: 50%;top: 30px;color: #f44336;transform: translateX(-50%);">
|
||||||
{{ markers.top }}
|
{{ markers.top }}
|
||||||
@@ -117,7 +106,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<style>
|
<style>
|
||||||
.my_slider_box:after{
|
.my_slider_box:after {
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: -20px;
|
bottom: -20px;
|
||||||
@@ -308,7 +297,10 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['visitTaskList', 'currentReadingTaskState'])
|
...mapGetters(['visitTaskList', 'currentReadingTaskState']),
|
||||||
|
NSTip() {
|
||||||
|
return `NS: ${this.$store.state.trials.uploadTip}`
|
||||||
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
currentReadingTaskState: {
|
currentReadingTaskState: {
|
||||||
@@ -572,7 +564,7 @@ export default {
|
|||||||
type: 'warning'
|
type: 'warning'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
|
|
||||||
}).catch(() => {})
|
}).catch(() => { })
|
||||||
e.stopImmediatePropagation()
|
e.stopImmediatePropagation()
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@@ -1111,7 +1103,7 @@ export default {
|
|||||||
var frame = imageInfo.frame
|
var frame = imageInfo.frame
|
||||||
this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null
|
this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null
|
||||||
this.stack.instanceId = instanceId
|
this.stack.instanceId = instanceId
|
||||||
|
|
||||||
const element = this.$refs.canvas
|
const element = this.$refs.canvas
|
||||||
cornerstone.enable(element)
|
cornerstone.enable(element)
|
||||||
element.tabIndex = 0
|
element.tabIndex = 0
|
||||||
@@ -1164,7 +1156,7 @@ export default {
|
|||||||
|
|
||||||
// const scope = this
|
// const scope = this
|
||||||
Array.from(toolButtons).forEach((toolBtn) => {
|
Array.from(toolButtons).forEach((toolBtn) => {
|
||||||
// Add the tool
|
// Add the tool
|
||||||
const toolName = toolBtn.getAttribute('data-tool')
|
const toolName = toolBtn.getAttribute('data-tool')
|
||||||
const apiTool = cornerstoneTools[`${toolName}Tool`]
|
const apiTool = cornerstoneTools[`${toolName}Tool`]
|
||||||
if (apiTool) {
|
if (apiTool) {
|
||||||
@@ -1172,17 +1164,17 @@ export default {
|
|||||||
|
|
||||||
if (!toolAlreadyAddedToElement) {
|
if (!toolAlreadyAddedToElement) {
|
||||||
if (toolName === 'Length') {
|
if (toolName === 'Length') {
|
||||||
cornerstoneTools.addToolForElement(element, LengthTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true }})
|
cornerstoneTools.addToolForElement(element, LengthTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true } })
|
||||||
} else if (toolName === 'Bidirectional') {
|
} else if (toolName === 'Bidirectional') {
|
||||||
// cornerstoneTools.addToolForElement(element, BidirectionalTool, { digits: this.digitPlaces })
|
// cornerstoneTools.addToolForElement(element, BidirectionalTool, { digits: this.digitPlaces })
|
||||||
// , handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true
|
// , handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true
|
||||||
cornerstoneTools.addToolForElement(element, BidirectionalTool, { configuration: { digits: this.digitPlaces, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, BidirectionalTool, { configuration: { digits: this.digitPlaces, hideHandlesIfMoving: true } })
|
||||||
} else if (toolName === 'ArrowAnnotate') {
|
} else if (toolName === 'ArrowAnnotate') {
|
||||||
cornerstoneTools.addToolForElement(element, ArrowAnnotateTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, ArrowAnnotateTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true } })
|
||||||
} else if (toolName === 'RectangleRoi') {
|
} else if (toolName === 'RectangleRoi') {
|
||||||
cornerstoneTools.addToolForElement(element, RectangleRoiTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, RectangleRoiTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true } })
|
||||||
} else if (toolName === 'Probe' && parseInt(localStorage.getItem('CriterionType')) === 21) {
|
} else if (toolName === 'Probe' && parseInt(localStorage.getItem('CriterionType')) === 21) {
|
||||||
cornerstoneTools.addToolForElement(element, ProbeTool, { configuration: { fixedRadius: 5, handleRadius: true, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces }})
|
cornerstoneTools.addToolForElement(element, ProbeTool, { configuration: { fixedRadius: 5, handleRadius: true, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces } })
|
||||||
} else {
|
} else {
|
||||||
cornerstoneTools.addToolForElement(element, apiTool)
|
cornerstoneTools.addToolForElement(element, apiTool)
|
||||||
}
|
}
|
||||||
@@ -1208,10 +1200,10 @@ export default {
|
|||||||
mouseButtonMask: 4
|
mouseButtonMask: 4
|
||||||
})
|
})
|
||||||
|
|
||||||
// if (!cornerstoneTools.getToolForElement(element, OrientationMarkersTool)) {
|
// if (!cornerstoneTools.getToolForElement(element, OrientationMarkersTool)) {
|
||||||
// cornerstoneTools.addToolForElement(element, OrientationMarkersTool)
|
// cornerstoneTools.addToolForElement(element, OrientationMarkersTool)
|
||||||
// }
|
// }
|
||||||
// cornerstoneTools.setToolActiveForElement(element, 'OrientationMarkers', { })
|
// cornerstoneTools.setToolActiveForElement(element, 'OrientationMarkers', { })
|
||||||
}
|
}
|
||||||
|
|
||||||
// cornerstoneTools.addStackStateManager(this.canvas, ['stack', 'stackPrefetch', 'playClip'])
|
// cornerstoneTools.addStackStateManager(this.canvas, ['stack', 'stackPrefetch', 'playClip'])
|
||||||
@@ -1228,7 +1220,7 @@ export default {
|
|||||||
this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null
|
this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null
|
||||||
this.stack.instanceId = instanceId
|
this.stack.instanceId = instanceId
|
||||||
this.height = (this.stack.currentImageIdIndex) * 100 / (this.stack.imageIds.length - 1)
|
this.height = (this.stack.currentImageIdIndex) * 100 / (this.stack.imageIds.length - 1)
|
||||||
|
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@@ -1256,9 +1248,8 @@ export default {
|
|||||||
data.string('x00080030')
|
data.string('x00080030')
|
||||||
)
|
)
|
||||||
this.dicomInfo.series = data.string('x00200011')
|
this.dicomInfo.series = data.string('x00200011')
|
||||||
this.dicomInfo.frame = `${this.stack.currentImageIdIndex + 1}/${
|
this.dicomInfo.frame = `${this.stack.currentImageIdIndex + 1}/${this.stack.imageIds.length
|
||||||
this.stack.imageIds.length
|
}`
|
||||||
}`
|
|
||||||
this.dicomInfo.size = `${data.uint16('x00280011')}*${data.uint16(
|
this.dicomInfo.size = `${data.uint16('x00280011')}*${data.uint16(
|
||||||
'x00280010'
|
'x00280010'
|
||||||
)}`
|
)}`
|
||||||
@@ -1461,9 +1452,9 @@ export default {
|
|||||||
var element = cornerstone.getEnabledElement(this.canvas)
|
var element = cornerstone.getEnabledElement(this.canvas)
|
||||||
const { rowPixelSpacing, colPixelSpacing } = this.getPixelSpacing(element.image)
|
const { rowPixelSpacing, colPixelSpacing } = this.getPixelSpacing(element.image)
|
||||||
const dx =
|
const dx =
|
||||||
(data.handles.end.x - data.handles.start.x) * (colPixelSpacing || 1)
|
(data.handles.end.x - data.handles.start.x) * (colPixelSpacing || 1)
|
||||||
const dy =
|
const dy =
|
||||||
(data.handles.end.y - data.handles.start.y) * (rowPixelSpacing || 1)
|
(data.handles.end.y - data.handles.start.y) * (rowPixelSpacing || 1)
|
||||||
const length = Math.sqrt(dx * dx + dy * dy)
|
const length = Math.sqrt(dx * dx + dy * dy)
|
||||||
|
|
||||||
return length.toFixed(this.digitPlaces)
|
return length.toFixed(this.digitPlaces)
|
||||||
@@ -1477,9 +1468,9 @@ export default {
|
|||||||
if (imagePlane) {
|
if (imagePlane) {
|
||||||
return {
|
return {
|
||||||
rowPixelSpacing:
|
rowPixelSpacing:
|
||||||
imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing,
|
imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing,
|
||||||
colPixelSpacing:
|
colPixelSpacing:
|
||||||
imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing
|
imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1536,7 +1527,7 @@ export default {
|
|||||||
},
|
},
|
||||||
debounce(callback, delay) {
|
debounce(callback, delay) {
|
||||||
let timerId
|
let timerId
|
||||||
return function() {
|
return function () {
|
||||||
clearTimeout(timerId)
|
clearTimeout(timerId)
|
||||||
timerId = setTimeout(() => {
|
timerId = setTimeout(() => {
|
||||||
callback.apply(this, arguments)
|
callback.apply(this, arguments)
|
||||||
@@ -2019,88 +2010,102 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.context-menu-wrapper{
|
.context-menu-wrapper {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
ul{
|
|
||||||
list-style: none;
|
ul {
|
||||||
margin: 0px;
|
list-style: none;
|
||||||
padding: 0px;
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
background: #343333;
|
||||||
|
color: #fff;
|
||||||
|
margin: 0;
|
||||||
|
border: 1px solid #2a2a2a;
|
||||||
|
border-radius: 3px;
|
||||||
|
height: auto;
|
||||||
|
min-height: 50px;
|
||||||
|
line-height: 1.5em;
|
||||||
|
width: 80px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu {
|
||||||
|
li {
|
||||||
|
padding: 2px 5px;
|
||||||
|
position: relative;
|
||||||
|
border-bottom: 1px solid #666;
|
||||||
|
|
||||||
|
div {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu {
|
||||||
|
position: absolute;
|
||||||
|
left: 77px;
|
||||||
|
top: -1px;
|
||||||
background: #343333;
|
background: #343333;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
margin: 0;
|
display: none;
|
||||||
border: 1px solid #2a2a2a;
|
|
||||||
border-radius: 3px;
|
|
||||||
height: auto;
|
|
||||||
min-height: 50px;
|
|
||||||
line-height: 1.5em;
|
|
||||||
width:80px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.menu{
|
|
||||||
li {
|
li {
|
||||||
padding: 2px 5px;
|
padding: 2px 5px;
|
||||||
position: relative;
|
|
||||||
border-bottom: 1px solid #666;
|
border-bottom: 1px solid #666;
|
||||||
div{
|
|
||||||
|
div {
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.submenu{
|
|
||||||
position: absolute;
|
|
||||||
left: 77px;
|
|
||||||
top: -1px;
|
|
||||||
background: #343333;
|
|
||||||
color: #fff;
|
|
||||||
display: none;
|
|
||||||
li {
|
|
||||||
padding: 2px 5px;
|
|
||||||
border-bottom: 1px solid #666;
|
|
||||||
div{
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
.menu li:hover{
|
|
||||||
background-color: #ff5722;
|
|
||||||
.submenu{
|
|
||||||
display:block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.menu_active{
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.menu_disabled{
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.info-visit{
|
|
||||||
position: absolute;
|
.menu li:hover {
|
||||||
left:50%;
|
background-color: #ff5722;
|
||||||
top: 5px;
|
|
||||||
transform: translateX(-50%);
|
.submenu {
|
||||||
display: flex;
|
display: block;
|
||||||
flex-direction: row;
|
|
||||||
.arrw_div_wrapper{
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
background-color: #3f3f3f;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 20px;
|
|
||||||
border-radius: 10%;
|
|
||||||
}
|
|
||||||
.blind_name_wrapper{
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
background-color: #00000057;
|
|
||||||
color: #fff;
|
|
||||||
padding:0 10px;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.info-cd{
|
|
||||||
|
.menu_active {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu_disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-visit {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 5px;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
.arrw_div_wrapper {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-color: #3f3f3f;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 20px;
|
||||||
|
border-radius: 10%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blind_name_wrapper {
|
||||||
|
height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
background-color: #00000057;
|
||||||
|
color: #fff;
|
||||||
|
padding: 0 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-cd {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
@@ -2109,6 +2114,7 @@ export default {
|
|||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-series {
|
.info-series {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
@@ -2118,6 +2124,7 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
/* z-index: 1; */
|
/* z-index: 1; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-image {
|
.info-image {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
@@ -2137,6 +2144,7 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
/* z-index: 1; */
|
/* z-index: 1; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-instance {
|
.info-instance {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 15px;
|
right: 15px;
|
||||||
@@ -2169,6 +2177,7 @@ export default {
|
|||||||
margin: 10px;
|
margin: 10px;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu__item:hover {
|
.menu__item:hover {
|
||||||
color: #ff0000;
|
color: #ff0000;
|
||||||
}
|
}
|
||||||
@@ -2188,11 +2197,12 @@ li:hover {
|
|||||||
background-color: #e0e0e2;
|
background-color: #e0e0e2;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.msg-div {
|
.msg-div {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
background-color: rgba(255, 255, 255, 0.5);
|
background-color: rgba(255, 255, 255, 0.5);
|
||||||
color: #000;
|
color: #000;
|
||||||
padding: 5px 20px;
|
padding: 5px 20px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -7,14 +7,10 @@
|
|||||||
<div class="visit-name-wrapper">
|
<div class="visit-name-wrapper">
|
||||||
|
|
||||||
<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
|
<div v-for="s in visitTaskList" :key="s.VisitTaskId" class="visit-item"
|
||||||
v-for="s in visitTaskList"
|
:class="{ 'visit-item-active': activeTaskVisitId == s.VisitTaskId }" @click.prevent="handleClick(s)">
|
||||||
:key="s.VisitTaskId"
|
{{
|
||||||
class="visit-item"
|
s.TaskBlindName }}</div>
|
||||||
:class="{'visit-item-active': activeTaskVisitId==s.VisitTaskId}"
|
|
||||||
|
|
||||||
@click.prevent="handleClick(s)"
|
|
||||||
>{{ s.TaskBlindName }}</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -22,23 +18,12 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<div
|
<div v-for="s in visitTaskList" v-show="activeTaskVisitId === s.VisitTaskId" :key="s.VisitTaskId"
|
||||||
v-for="s in visitTaskList"
|
class="study-wrapper">
|
||||||
v-show="activeTaskVisitId === s.VisitTaskId"
|
<StudyList v-if="selectArr.includes(s.VisitTaskId)" :ref="s.VisitTaskId" :visit-task-id="s.VisitTaskId"
|
||||||
:key="s.VisitTaskId"
|
:trial-id="trialId" :subject-visit-id="s.VisitId" :task-blind-name="s.TaskBlindName"
|
||||||
class="study-wrapper"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo" @loadImageStack="loadImageStack"
|
||||||
>
|
@previewNoneDicoms="previewNoneDicoms" />
|
||||||
<StudyList
|
|
||||||
v-if="selectArr.includes(s.VisitTaskId)"
|
|
||||||
:ref="s.VisitTaskId"
|
|
||||||
:visit-task-id="s.VisitTaskId"
|
|
||||||
:trial-id="trialId"
|
|
||||||
:subject-visit-id="s.VisitId"
|
|
||||||
:task-blind-name="s.TaskBlindName"
|
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
|
||||||
@loadImageStack="loadImageStack"
|
|
||||||
@previewNoneDicoms="previewNoneDicoms"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -46,20 +31,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="dicom-viewer">
|
<div class="dicom-viewer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<DicomViewer
|
<DicomViewer v-if="activeTaskVisitId" ref="dicomViewer" :is-show="isShow"
|
||||||
v-if="activeTaskVisitId"
|
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
|
||||||
ref="dicomViewer"
|
:is-exists-clinical-data="isExistsClinicalData" :is-exists-no-dicom-file="isExistsNoDicomFile"
|
||||||
:is-show="isShow"
|
|
||||||
:question-form-change-state="questionFormChangeState"
|
|
||||||
:question-form-change-num="questionFormChangeNum"
|
|
||||||
:is-exists-clinical-data="isExistsClinicalData"
|
|
||||||
:is-exists-no-dicom-file="isExistsNoDicomFile"
|
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
||||||
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
|
:is-reading-task-view-in-order="isReadingTaskViewInOrder" :is-exists-manual="isExistsManual"
|
||||||
:is-exists-manual="isExistsManual"
|
:iseCRFShowInDicomReading="iseCRFShowInDicomReading" @previewCD="previewCD" />
|
||||||
:iseCRFShowInDicomReading="iseCRFShowInDicomReading"
|
|
||||||
@previewCD="previewCD"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -75,6 +52,7 @@ import { getToken } from '@/utils/auth'
|
|||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
import * as dicomParser from 'dicom-parser'
|
import * as dicomParser from 'dicom-parser'
|
||||||
import * as cornerstone from 'cornerstone-core'
|
import * as cornerstone from 'cornerstone-core'
|
||||||
|
import { workSpeedclose } from "@/utils"
|
||||||
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
||||||
// import metaDataProvider from '@/utils/metaDataProvider'
|
// import metaDataProvider from '@/utils/metaDataProvider'
|
||||||
// cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 });
|
// cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 });
|
||||||
@@ -248,6 +226,7 @@ export default {
|
|||||||
DicomEvent.$off('addNoneDicomMeasureData')
|
DicomEvent.$off('addNoneDicomMeasureData')
|
||||||
DicomEvent.$off('selectSeries')
|
DicomEvent.$off('selectSeries')
|
||||||
window.removeEventListener('beforeunload', e => { cornerstone.imageCache.purgeCache() })
|
window.removeEventListener('beforeunload', e => { cornerstone.imageCache.purgeCache() })
|
||||||
|
workSpeedclose(true)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async getVisitInfo() {
|
async getVisitInfo() {
|
||||||
@@ -474,7 +453,7 @@ export default {
|
|||||||
getSeriesInfoByMark(baseSeries, visitTaskId, obj, visitTaskIdx) {
|
getSeriesInfoByMark(baseSeries, visitTaskId, obj, visitTaskIdx) {
|
||||||
var seriesInfo = null
|
var seriesInfo = null
|
||||||
if (obj) {
|
if (obj) {
|
||||||
// 根据任务ID测量病灶信息
|
// 根据任务ID测量病灶信息
|
||||||
var index = visitTaskIdx
|
var index = visitTaskIdx
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
var idx = -1
|
var idx = -1
|
||||||
@@ -497,7 +476,7 @@ export default {
|
|||||||
// var instanceIdx = series.instanceList.findIndex(imageId => !!~imageId.indexOf(instanceId))
|
// var instanceIdx = series.instanceList.findIndex(imageId => !!~imageId.indexOf(instanceId))
|
||||||
const frame = this.visitTaskList[index].MeasureData[idx].MeasureData.frame
|
const frame = this.visitTaskList[index].MeasureData[idx].MeasureData.frame
|
||||||
// const filterStr = series.isExistMutiFrames ? `frame=${frame}&instanceId=${instanceId}` : `instanceId=${instanceId}`
|
// const filterStr = series.isExistMutiFrames ? `frame=${frame}&instanceId=${instanceId}` : `instanceId=${instanceId}`
|
||||||
let n = series.instanceInfoList.findIndex(k=>k.Id === instanceId)
|
let n = series.instanceInfoList.findIndex(k => k.Id === instanceId)
|
||||||
let filterStr = ''
|
let filterStr = ''
|
||||||
if (n > -1 && series.isExistMutiFrames) {
|
if (n > -1 && series.isExistMutiFrames) {
|
||||||
if (series.instanceInfoList[n].NumberOfFrames > 0) {
|
if (series.instanceInfoList[n].NumberOfFrames > 0) {
|
||||||
@@ -538,13 +517,15 @@ 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
|
||||||
store.dispatch('reading/setImageLoadedProgress', params)
|
store.dispatch('reading/setImageLoadedProgress', params)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.dicom-container{
|
.dicom-container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -553,32 +534,35 @@ export default {
|
|||||||
background-color: #000;
|
background-color: #000;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 5px;
|
width: 5px;
|
||||||
height: 5px;
|
height: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dicom-viewer{
|
.dicom-viewer {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
|
||||||
.container{
|
.container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.dicom-list{
|
|
||||||
width: 200px;
|
.dicom-list {
|
||||||
padding: 5px 0px;
|
width: 200px;
|
||||||
|
padding: 5px 0px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
|
||||||
.container{
|
.container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@@ -586,7 +570,8 @@ export default {
|
|||||||
// border: 1px solid #ccc;
|
// border: 1px solid #ccc;
|
||||||
|
|
||||||
}
|
}
|
||||||
::v-deep.el-tabs{
|
|
||||||
|
::v-deep.el-tabs {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@@ -594,26 +579,31 @@ export default {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
// justify-content: flex-start;
|
// justify-content: flex-start;
|
||||||
border: 1px solid #727272;
|
border: 1px solid #727272;
|
||||||
.el-tabs__item{
|
|
||||||
|
.el-tabs__item {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.el-tabs__header{
|
|
||||||
|
.el-tabs__header {
|
||||||
height: 55px;
|
height: 55px;
|
||||||
margin:0px;
|
margin: 0px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
.el-tabs__content{
|
|
||||||
|
.el-tabs__content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin:0px;
|
margin: 0px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
.el-tabs__item{
|
|
||||||
|
.el-tabs__item {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.dicom-desc{
|
|
||||||
|
.dicom-desc {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -621,23 +611,28 @@ export default {
|
|||||||
color: #d0d0d0;
|
color: #d0d0d0;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ps {
|
.ps {
|
||||||
overflow-anchor: none;
|
overflow-anchor: none;
|
||||||
touch-action: auto;
|
touch-action: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.series-active {
|
.series-active {
|
||||||
background-color: #607d8b!important;
|
background-color: #607d8b !important;
|
||||||
border: 1px solid #607d8b!important;
|
border: 1px solid #607d8b !important;
|
||||||
}
|
}
|
||||||
::v-deep.el-progress__text{
|
|
||||||
|
::v-deep.el-progress__text {
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
.series{
|
|
||||||
|
.series {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
|
|
||||||
.series-wrapper {
|
.series-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -650,11 +645,13 @@ export default {
|
|||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
border: 1px solid #404040;
|
border: 1px solid #404040;
|
||||||
background-color: #3a3a3a;
|
background-color: #3a3a3a;
|
||||||
.el-progress__text{
|
|
||||||
|
.el-progress__text {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.el-progress-bar{
|
|
||||||
padding-right:0px;
|
.el-progress-bar {
|
||||||
|
padding-right: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-preview {
|
.image-preview {
|
||||||
@@ -663,9 +660,11 @@ export default {
|
|||||||
border: 2px solid #252525;
|
border: 2px solid #252525;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-desc {
|
.image-desc {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
p{
|
|
||||||
|
p {
|
||||||
width: 100px;
|
width: 100px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -678,7 +677,8 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.related-study-wrapper{
|
|
||||||
|
.related-study-wrapper {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
padding-bottom: 5px;
|
padding-bottom: 5px;
|
||||||
@@ -686,14 +686,15 @@ export default {
|
|||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
||||||
.left{
|
.left {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 25px;
|
width: 25px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
.visit-name-wrapper{
|
|
||||||
|
.visit-name-wrapper {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
|
|
||||||
@@ -708,30 +709,34 @@ export default {
|
|||||||
// flex-direction: row;
|
// flex-direction: row;
|
||||||
// align-content: flex-start;
|
// align-content: flex-start;
|
||||||
}
|
}
|
||||||
.visit-item{
|
|
||||||
|
.visit-item {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
padding: 0px 4px;
|
padding: 0px 4px;
|
||||||
border: 1px solid #999999;
|
border: 1px solid #999999;
|
||||||
border-bottom:none ;
|
border-bottom: none;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: #4e4e4e;
|
background-color: #4e4e4e;
|
||||||
color: #d5d5d5;
|
color: #d5d5d5;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
// margin-left: 10px;
|
// margin-left: 10px;
|
||||||
}
|
}
|
||||||
.visit-item-active{
|
|
||||||
|
.visit-item-active {
|
||||||
background-color: #607d8b;
|
background-color: #607d8b;
|
||||||
border: 1px solid #607d8b;
|
border: 1px solid #607d8b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.right{
|
|
||||||
width:170px;
|
.right {
|
||||||
flex:1;
|
width: 170px;
|
||||||
|
flex: 1;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border-left: 1px solid #4a4a4a;
|
border-left: 1px solid #4a4a4a;
|
||||||
color: #d5d5d5;
|
color: #d5d5d5;
|
||||||
.study-wrapper{
|
|
||||||
|
.study-wrapper {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div id="canvas" ref="canvas" v-loading="loading" :element-loading-text="NSTip"
|
||||||
id="canvas"
|
element-loading-background="rgba(0, 0, 0, 0.8)" style="position:relative;" class="cornerstone-element"
|
||||||
ref="canvas"
|
@mouseup="sliderMouseup" @contextmenu.prevent="onContextmenu">
|
||||||
v-loading="loading"
|
|
||||||
element-loading-text="Loading..."
|
|
||||||
element-loading-background="rgba(0, 0, 0, 0.8)"
|
|
||||||
style="position:relative;"
|
|
||||||
class="cornerstone-element"
|
|
||||||
@mouseup="sliderMouseup"
|
|
||||||
@contextmenu.prevent="onContextmenu"
|
|
||||||
>
|
|
||||||
<!-- 临床数据 -->
|
<!-- 临床数据 -->
|
||||||
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
|
<div v-if="stack.isExistsClinicalData" class="info-cd" @click.stop="handleViewCD($event)">
|
||||||
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom">
|
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom">
|
||||||
@@ -18,46 +10,39 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- 切换访视 -->
|
<!-- 切换访视 -->
|
||||||
<div
|
<div v-if="stack.imageRendered && isReadingTaskViewInOrder === 1" class="info-visit"
|
||||||
v-if="stack.imageRendered && isReadingTaskViewInOrder === 1"
|
@dblclick.stop="preventDefault($event)">
|
||||||
class="info-visit"
|
<div class="arrw_div_wrapper"
|
||||||
@dblclick.stop="preventDefault($event)"
|
:style="{ cursor: stack.visitTaskNum <= minVistNum ? 'not-allowed' : 'pointer', color: stack.visitTaskNum <= minVistNum ? '#888' : '#fff' }"
|
||||||
>
|
@click.stop.prevent="toggleSeries($event, -1)" @dblclick.stop="preventDefault($event)">
|
||||||
<div
|
|
||||||
class="arrw_div_wrapper"
|
|
||||||
:style="{cursor:stack.visitTaskNum <= minVistNum?'not-allowed':'pointer',color:stack.visitTaskNum <= minVistNum?'#888':'#fff'}"
|
|
||||||
@click.stop.prevent="toggleSeries($event,-1)"
|
|
||||||
@dblclick.stop="preventDefault($event)"
|
|
||||||
>
|
|
||||||
<i class="el-icon-caret-left" />
|
<i class="el-icon-caret-left" />
|
||||||
</div>
|
</div>
|
||||||
<div class="blind_name_wrapper">
|
<div class="blind_name_wrapper">
|
||||||
{{ stack.taskBlindName }}
|
{{ stack.taskBlindName }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div class="arrw_div_wrapper"
|
||||||
class="arrw_div_wrapper"
|
:style="{ cursor: stack.visitTaskNum >= maxVistNum ? 'not-allowed' : 'pointer', color: stack.visitTaskNum >= maxVistNum ? '#888' : '#fff' }"
|
||||||
:style="{cursor:stack.visitTaskNum >= maxVistNum?'not-allowed':'pointer',color:stack.visitTaskNum >= maxVistNum?'#888':'#fff'}"
|
@click.stop.prevent="toggleSeries($event, 1)" @dblclick.stop="preventDefault($event)">
|
||||||
@click.stop.prevent="toggleSeries($event,1)"
|
|
||||||
@dblclick.stop="preventDefault($event)"
|
|
||||||
>
|
|
||||||
<i class="el-icon-caret-right" />
|
<i class="el-icon-caret-right" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-series">
|
<div class="info-series">
|
||||||
<h2 v-if="isReadingShowSubjectInfo" style="color:#f44336;padding: 5px 0px;margin: 0;">{{ subjectCode }} {{ stack.taskBlindName }}</h2>
|
<h2 v-if="isReadingShowSubjectInfo" style="color:#f44336;padding: 5px 0px;margin: 0;">{{ subjectCode }} {{
|
||||||
|
stack.taskBlindName }}</h2>
|
||||||
<div v-show="dicomInfo.series">Series: #{{ dicomInfo.series }}</div>
|
<div v-show="dicomInfo.series">Series: #{{ dicomInfo.series }}</div>
|
||||||
<div>Image: #{{ dicomInfo.frame }}</div>
|
<div>Image: #{{ dicomInfo.frame }}</div>
|
||||||
<div>{{ dicomInfo.modality }}</div>
|
<div>{{ dicomInfo.modality }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-image">
|
<div class="info-image">
|
||||||
<div v-show="mousePosition.mo">
|
<div v-show="mousePosition.mo">
|
||||||
Pos: {{ mousePosition.x?mousePosition.x.toFixed(0):'' }}, {{ mousePosition.y?mousePosition.y.toFixed(0):'' }}
|
Pos: {{ mousePosition.x ? mousePosition.x.toFixed(0) : '' }}, {{ mousePosition.y ? mousePosition.y.toFixed(0) : '' }}
|
||||||
</div>
|
</div>
|
||||||
<div v-if="(dicomInfo.modality === 'CT' || dicomInfo.modality === 'DR' || dicomInfo.modality === 'CR') && mousePosition.mo">
|
<div
|
||||||
|
v-if="(dicomInfo.modality === 'CT' || dicomInfo.modality === 'DR' || dicomInfo.modality === 'CR') && mousePosition.mo">
|
||||||
HU: {{ mousePosition.mo }}
|
HU: {{ mousePosition.mo }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="(dicomInfo.modality === 'PT' && mousePosition.suv)">
|
<div v-else-if="(dicomInfo.modality === 'PT' && mousePosition.suv)">
|
||||||
SUVbw(g/ml): {{ digitPlaces === -1 ?mousePosition.suv.toFixed(3) :mousePosition.suv.toFixed(digitPlaces) }}
|
SUVbw(g/ml): {{ digitPlaces === -1 ? mousePosition.suv.toFixed(3) : mousePosition.suv.toFixed(digitPlaces) }}
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="mousePosition.mo">
|
<div v-else-if="mousePosition.mo">
|
||||||
Density: {{ mousePosition.mo }}
|
Density: {{ mousePosition.mo }}
|
||||||
@@ -81,8 +66,12 @@
|
|||||||
<!-- <div v-show="dicomInfo.acc">ACC {{ dicomInfo.acc }}</div> -->
|
<!-- <div v-show="dicomInfo.acc">ACC {{ dicomInfo.acc }}</div> -->
|
||||||
<!-- <div>{{ dicomInfo.time }}</div> -->
|
<!-- <div>{{ dicomInfo.time }}</div> -->
|
||||||
</div>
|
</div>
|
||||||
<div ref="sliderBox" class="my_slider_box" style="position: absolute;right: 1px;height: calc(100% - 140px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer" @click.stop="goViewer($event)">
|
<div ref="sliderBox" class="my_slider_box"
|
||||||
<div :style="{top: height + '%'}" style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move" @click.stop.prevent="() => {return}" @mousedown.stop="sliderMousedown($event)" />
|
style="position: absolute;right: 1px;height: calc(100% - 140px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer"
|
||||||
|
@click.stop="goViewer($event)">
|
||||||
|
<div :style="{ top: height + '%' }"
|
||||||
|
style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move"
|
||||||
|
@click.stop.prevent="() => { return }" @mousedown.stop="sliderMousedown($event)" />
|
||||||
</div>
|
</div>
|
||||||
<div style="position: absolute;left: 50%;top: 30px;color: #f44336;transform: translateX(-50%);">
|
<div style="position: absolute;left: 50%;top: 30px;color: #f44336;transform: translateX(-50%);">
|
||||||
{{ markers.top }}
|
{{ markers.top }}
|
||||||
@@ -117,7 +106,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<style>
|
<style>
|
||||||
.my_slider_box:after{
|
.my_slider_box:after {
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: -20px;
|
bottom: -20px;
|
||||||
@@ -306,7 +295,10 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['visitTaskList', 'currentReadingTaskState'])
|
...mapGetters(['visitTaskList', 'currentReadingTaskState']),
|
||||||
|
NSTip() {
|
||||||
|
return `NS: ${this.$store.state.trials.uploadTip}`
|
||||||
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
currentReadingTaskState: {
|
currentReadingTaskState: {
|
||||||
@@ -562,7 +554,7 @@ export default {
|
|||||||
mouseDown(e) {
|
mouseDown(e) {
|
||||||
this.image = e.detail.image
|
this.image = e.detail.image
|
||||||
var pointNearTool = this.pointNearTool(e)
|
var pointNearTool = this.pointNearTool(e)
|
||||||
if (pointNearTool) {
|
if (pointNearTool) {
|
||||||
e.stopImmediatePropagation()
|
e.stopImmediatePropagation()
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@@ -574,7 +566,7 @@ export default {
|
|||||||
type: 'warning'
|
type: 'warning'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
|
|
||||||
}).catch(() => {})
|
}).catch(() => { })
|
||||||
e.stopImmediatePropagation()
|
e.stopImmediatePropagation()
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
@@ -672,7 +664,7 @@ export default {
|
|||||||
this.sliderInfo.isMove = false
|
this.sliderInfo.isMove = false
|
||||||
},
|
},
|
||||||
getMeasureData() {
|
getMeasureData() {
|
||||||
console.log('getMeasureData')
|
console.log('getMeasureData')
|
||||||
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.stack.visitTaskId)
|
var idx = this.visitTaskList.findIndex(i => i.VisitTaskId === this.stack.visitTaskId)
|
||||||
this.measureData = this.visitTaskList[idx].MeasureData
|
this.measureData = this.visitTaskList[idx].MeasureData
|
||||||
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
|
||||||
@@ -889,7 +881,7 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
// cornerstoneTools.setToolEnabledForElement(element, data.MeasureData.type, { mouseButtonMask: 1 })
|
// cornerstoneTools.setToolEnabledForElement(element, data.MeasureData.type, { mouseButtonMask: 1 })
|
||||||
cornerstoneTools.setToolPassiveForElement(element, data.MeasureData.type, { mouseButtonMask: 1 })
|
cornerstoneTools.setToolPassiveForElement(element, data.MeasureData.type, { mouseButtonMask: 1 })
|
||||||
|
|
||||||
}
|
}
|
||||||
if (this.stack.instanceId.includes(data.InstanceId) && ((this.stack.isExistMutiFrames && (data.MeasureData.frame === this.stack.frame) && data.MeasureData) || (!this.stack.isExistMutiFrames && data.MeasureData))) {
|
if (this.stack.instanceId.includes(data.InstanceId) && ((this.stack.isExistMutiFrames && (data.MeasureData.frame === this.stack.frame) && data.MeasureData) || (!this.stack.isExistMutiFrames && data.MeasureData))) {
|
||||||
// console.log('renderMeasuredData', this.stack.frame,data.MeasureData.frame,this.stack.isExistMutiFrames)
|
// console.log('renderMeasuredData', this.stack.frame,data.MeasureData.frame,this.stack.isExistMutiFrames)
|
||||||
@@ -991,32 +983,32 @@ export default {
|
|||||||
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === toolState.data[i].uuid)
|
var idx = this.measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === toolState.data[i].uuid)
|
||||||
if (idx > -1) {
|
if (idx > -1) {
|
||||||
DicomEvent.$emit('setCollapseActive', this.measureData[idx])
|
DicomEvent.$emit('setCollapseActive', this.measureData[idx])
|
||||||
const measureData = {}
|
const measureData = {}
|
||||||
// var markName = this.measureData[idx].OrderMarkName
|
// var markName = this.measureData[idx].OrderMarkName
|
||||||
var markName = this.measureData[idx].MeasureData.data.remark
|
var markName = this.measureData[idx].MeasureData.data.remark
|
||||||
if (this.activeToolName === 'Eraser' && this.disabledMarks.indexOf(markName) === -1) {
|
if (this.activeToolName === 'Eraser' && this.disabledMarks.indexOf(markName) === -1) {
|
||||||
const questionInfo = this.measureData[idx]
|
const questionInfo = this.measureData[idx]
|
||||||
measureData.orderMarkName = markName
|
measureData.orderMarkName = markName
|
||||||
this.$emit('moveMeasureData', { measureData, questionInfo, orderMarkName: markName})
|
this.$emit('moveMeasureData', { measureData, questionInfo, orderMarkName: markName })
|
||||||
}
|
}
|
||||||
if ((this.disabledMarks.indexOf(markName) === -1 || !this.disabledMarks) && this.activeToolName !== 'Eraser') {
|
if ((this.disabledMarks.indexOf(markName) === -1 || !this.disabledMarks) && this.activeToolName !== 'Eraser') {
|
||||||
const questionInfo = this.measureData[idx]
|
const questionInfo = this.measureData[idx]
|
||||||
const canvas = this.canvas.querySelector('canvas')
|
const canvas = this.canvas.querySelector('canvas')
|
||||||
measureData.pictureBaseStr = canvas.toDataURL('image/png', 1)
|
measureData.pictureBaseStr = canvas.toDataURL('image/png', 1)
|
||||||
measureData.studyId = this.stack.studyId
|
measureData.studyId = this.stack.studyId
|
||||||
measureData.seriesId = this.stack.seriesId
|
measureData.seriesId = this.stack.seriesId
|
||||||
measureData.instanceId = instanceId
|
measureData.instanceId = instanceId
|
||||||
measureData.frame = this.stack.frame ? this.stack.frame : 0
|
measureData.frame = this.stack.frame ? this.stack.frame : 0
|
||||||
measureData.data = toolState.data[i]
|
measureData.data = toolState.data[i]
|
||||||
measureData.type = toolType
|
measureData.type = toolType
|
||||||
measureData.thick = this.dicomInfo.thick
|
measureData.thick = this.dicomInfo.thick
|
||||||
measureData.location = this.dicomInfo.location
|
measureData.location = this.dicomInfo.location
|
||||||
measureData.ww = Math.round(viewport.voi.windowWidth)
|
measureData.ww = Math.round(viewport.voi.windowWidth)
|
||||||
measureData.wc = Math.round(viewport.voi.windowCenter)
|
measureData.wc = Math.round(viewport.voi.windowCenter)
|
||||||
measureData.data.active = false
|
measureData.data.active = false
|
||||||
this.$emit('modifyMeasureData', { measureData, questionInfo })
|
this.$emit('modifyMeasureData', { measureData, questionInfo })
|
||||||
}
|
}
|
||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1117,7 +1109,7 @@ export default {
|
|||||||
const toolButtons = document.querySelectorAll('[data-tool]')
|
const toolButtons = document.querySelectorAll('[data-tool]')
|
||||||
// const scope = this
|
// const scope = this
|
||||||
Array.from(toolButtons).forEach((toolBtn) => {
|
Array.from(toolButtons).forEach((toolBtn) => {
|
||||||
// Add the tool
|
// Add the tool
|
||||||
const toolName = toolBtn.getAttribute('data-tool')
|
const toolName = toolBtn.getAttribute('data-tool')
|
||||||
const apiTool = cornerstoneTools[`${toolName}Tool`]
|
const apiTool = cornerstoneTools[`${toolName}Tool`]
|
||||||
if (apiTool) {
|
if (apiTool) {
|
||||||
@@ -1125,17 +1117,17 @@ export default {
|
|||||||
|
|
||||||
if (!toolAlreadyAddedToElement) {
|
if (!toolAlreadyAddedToElement) {
|
||||||
if (toolName === 'Length') {
|
if (toolName === 'Length') {
|
||||||
cornerstoneTools.addToolForElement(element, LengthTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true }})
|
cornerstoneTools.addToolForElement(element, LengthTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true } })
|
||||||
} else if (toolName === 'Bidirectional') {
|
} else if (toolName === 'Bidirectional') {
|
||||||
// cornerstoneTools.addToolForElement(element, BidirectionalTool, { digits: this.digitPlaces })
|
// cornerstoneTools.addToolForElement(element, BidirectionalTool, { digits: this.digitPlaces })
|
||||||
// , handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true
|
// , handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true
|
||||||
cornerstoneTools.addToolForElement(element, BidirectionalTool, { configuration: { digits: this.digitPlaces, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, BidirectionalTool, { configuration: { digits: this.digitPlaces, hideHandlesIfMoving: true } })
|
||||||
} else if (toolName === 'ArrowAnnotate') {
|
} else if (toolName === 'ArrowAnnotate') {
|
||||||
cornerstoneTools.addToolForElement(element, ArrowAnnotateTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, ArrowAnnotateTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true } })
|
||||||
} else if (toolName === 'RectangleRoi') {
|
} else if (toolName === 'RectangleRoi') {
|
||||||
cornerstoneTools.addToolForElement(element, RectangleRoiTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true }})
|
cornerstoneTools.addToolForElement(element, RectangleRoiTool, { configuration: { allowEmptyLabel: true, handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true } })
|
||||||
} else if (toolName === 'CircleRoi') {
|
} else if (toolName === 'CircleRoi') {
|
||||||
cornerstoneTools.addToolForElement(element, CircleRoiTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true, showMinMax: true }})
|
cornerstoneTools.addToolForElement(element, CircleRoiTool, { configuration: { handleRadius: false, drawHandlesOnHover: true, hideHandlesIfMoving: true, digits: this.digitPlaces, drawHandles: true, showMinMax: true } })
|
||||||
} else {
|
} else {
|
||||||
cornerstoneTools.addToolForElement(element, apiTool)
|
cornerstoneTools.addToolForElement(element, apiTool)
|
||||||
}
|
}
|
||||||
@@ -1161,10 +1153,10 @@ export default {
|
|||||||
mouseButtonMask: 4
|
mouseButtonMask: 4
|
||||||
})
|
})
|
||||||
|
|
||||||
// if (!cornerstoneTools.getToolForElement(element, OrientationMarkersTool)) {
|
// if (!cornerstoneTools.getToolForElement(element, OrientationMarkersTool)) {
|
||||||
// cornerstoneTools.addToolForElement(element, OrientationMarkersTool)
|
// cornerstoneTools.addToolForElement(element, OrientationMarkersTool)
|
||||||
// }
|
// }
|
||||||
// cornerstoneTools.setToolActiveForElement(element, 'OrientationMarkers', { })
|
// cornerstoneTools.setToolActiveForElement(element, 'OrientationMarkers', { })
|
||||||
}
|
}
|
||||||
|
|
||||||
// cornerstoneTools.addStackStateManager(this.canvas, ['stack', 'stackPrefetch', 'playClip'])
|
// cornerstoneTools.addStackStateManager(this.canvas, ['stack', 'stackPrefetch', 'playClip'])
|
||||||
@@ -1209,9 +1201,8 @@ export default {
|
|||||||
data.string('x00080030')
|
data.string('x00080030')
|
||||||
)
|
)
|
||||||
this.dicomInfo.series = data.string('x00200011')
|
this.dicomInfo.series = data.string('x00200011')
|
||||||
this.dicomInfo.frame = `${this.stack.currentImageIdIndex + 1}/${
|
this.dicomInfo.frame = `${this.stack.currentImageIdIndex + 1}/${this.stack.imageIds.length
|
||||||
this.stack.imageIds.length
|
}`
|
||||||
}`
|
|
||||||
this.dicomInfo.size = `${data.uint16('x00280011')}*${data.uint16(
|
this.dicomInfo.size = `${data.uint16('x00280011')}*${data.uint16(
|
||||||
'x00280010'
|
'x00280010'
|
||||||
)}`
|
)}`
|
||||||
@@ -1392,9 +1383,9 @@ export default {
|
|||||||
var element = cornerstone.getEnabledElement(this.canvas)
|
var element = cornerstone.getEnabledElement(this.canvas)
|
||||||
const { rowPixelSpacing, colPixelSpacing } = this.getPixelSpacing(element.image)
|
const { rowPixelSpacing, colPixelSpacing } = this.getPixelSpacing(element.image)
|
||||||
const dx =
|
const dx =
|
||||||
(data.handles.end.x - data.handles.start.x) * (colPixelSpacing || 1)
|
(data.handles.end.x - data.handles.start.x) * (colPixelSpacing || 1)
|
||||||
const dy =
|
const dy =
|
||||||
(data.handles.end.y - data.handles.start.y) * (rowPixelSpacing || 1)
|
(data.handles.end.y - data.handles.start.y) * (rowPixelSpacing || 1)
|
||||||
const length = Math.sqrt(dx * dx + dy * dy)
|
const length = Math.sqrt(dx * dx + dy * dy)
|
||||||
|
|
||||||
return length.toFixed(this.digitPlaces)
|
return length.toFixed(this.digitPlaces)
|
||||||
@@ -1408,9 +1399,9 @@ export default {
|
|||||||
if (imagePlane) {
|
if (imagePlane) {
|
||||||
return {
|
return {
|
||||||
rowPixelSpacing:
|
rowPixelSpacing:
|
||||||
imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing,
|
imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing,
|
||||||
colPixelSpacing:
|
colPixelSpacing:
|
||||||
imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing
|
imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1462,7 +1453,7 @@ export default {
|
|||||||
},
|
},
|
||||||
debounce(callback, delay) {
|
debounce(callback, delay) {
|
||||||
let timerId
|
let timerId
|
||||||
return function() {
|
return function () {
|
||||||
clearTimeout(timerId)
|
clearTimeout(timerId)
|
||||||
timerId = setTimeout(() => {
|
timerId = setTimeout(() => {
|
||||||
callback.apply(this, arguments)
|
callback.apply(this, arguments)
|
||||||
@@ -1480,7 +1471,7 @@ export default {
|
|||||||
if (imageId) {
|
if (imageId) {
|
||||||
ToolStateManager.clearImageIdToolState(imageId)
|
ToolStateManager.clearImageIdToolState(imageId)
|
||||||
let elements = cornerstone.getEnabledElementsByImageId(imageId)
|
let elements = cornerstone.getEnabledElementsByImageId(imageId)
|
||||||
elements.map(el=>{
|
elements.map(el => {
|
||||||
cornerstone.updateImage(el.element)
|
cornerstone.updateImage(el.element)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1766,7 +1757,7 @@ export default {
|
|||||||
this.activeToolName = toolName
|
this.activeToolName = toolName
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
// console.log(cornerstoneTools.isToolActiveForElement(this.canvas, 'Bidirectional'))
|
// console.log(cornerstoneTools.isToolActiveForElement(this.canvas, 'Bidirectional'))
|
||||||
|
|
||||||
if (toolName === 'Zoom') {
|
if (toolName === 'Zoom') {
|
||||||
cornerstoneTools.setToolActiveForElement(this.canvas, 'Zoom', {
|
cornerstoneTools.setToolActiveForElement(this.canvas, 'Zoom', {
|
||||||
mouseButtonMask: [1, 2]
|
mouseButtonMask: [1, 2]
|
||||||
@@ -1920,7 +1911,7 @@ export default {
|
|||||||
for (const [key, value] of searchParams.entries()) {
|
for (const [key, value] of searchParams.entries()) {
|
||||||
params[key] = value
|
params[key] = value
|
||||||
}
|
}
|
||||||
if (isNaN(params.frame)){
|
if (isNaN(params.frame)) {
|
||||||
params.frame = 0
|
params.frame = 0
|
||||||
}
|
}
|
||||||
return params
|
return params
|
||||||
@@ -1942,88 +1933,102 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.context-menu-wrapper{
|
.context-menu-wrapper {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
ul{
|
|
||||||
list-style: none;
|
ul {
|
||||||
margin: 0px;
|
list-style: none;
|
||||||
padding: 0px;
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
background: #343333;
|
||||||
|
color: #fff;
|
||||||
|
margin: 0;
|
||||||
|
border: 1px solid #2a2a2a;
|
||||||
|
border-radius: 3px;
|
||||||
|
height: auto;
|
||||||
|
min-height: 50px;
|
||||||
|
line-height: 1.5em;
|
||||||
|
width: 80px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu {
|
||||||
|
li {
|
||||||
|
padding: 2px 5px;
|
||||||
|
position: relative;
|
||||||
|
border-bottom: 1px solid #666;
|
||||||
|
|
||||||
|
div {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.submenu {
|
||||||
|
position: absolute;
|
||||||
|
left: 77px;
|
||||||
|
top: -1px;
|
||||||
background: #343333;
|
background: #343333;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
margin: 0;
|
display: none;
|
||||||
border: 1px solid #2a2a2a;
|
|
||||||
border-radius: 3px;
|
|
||||||
height: auto;
|
|
||||||
min-height: 50px;
|
|
||||||
line-height: 1.5em;
|
|
||||||
width:80px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.menu{
|
|
||||||
li {
|
li {
|
||||||
padding: 2px 5px;
|
padding: 2px 5px;
|
||||||
position: relative;
|
|
||||||
border-bottom: 1px solid #666;
|
border-bottom: 1px solid #666;
|
||||||
div{
|
|
||||||
|
div {
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.submenu{
|
|
||||||
position: absolute;
|
|
||||||
left: 77px;
|
|
||||||
top: -1px;
|
|
||||||
background: #343333;
|
|
||||||
color: #fff;
|
|
||||||
display: none;
|
|
||||||
li {
|
|
||||||
padding: 2px 5px;
|
|
||||||
border-bottom: 1px solid #666;
|
|
||||||
div{
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
.menu li:hover{
|
|
||||||
background-color: #ff5722;
|
|
||||||
.submenu{
|
|
||||||
display:block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.menu_active{
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.menu_disabled{
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.info-visit{
|
|
||||||
position: absolute;
|
.menu li:hover {
|
||||||
left:50%;
|
background-color: #ff5722;
|
||||||
top: 5px;
|
|
||||||
transform: translateX(-50%);
|
.submenu {
|
||||||
display: flex;
|
display: block;
|
||||||
flex-direction: row;
|
|
||||||
.arrw_div_wrapper{
|
|
||||||
width: 20px;
|
|
||||||
height: 20px;
|
|
||||||
background-color: #3f3f3f;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 20px;
|
|
||||||
border-radius: 10%;
|
|
||||||
}
|
|
||||||
.blind_name_wrapper{
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
background-color: #00000057;
|
|
||||||
color: #fff;
|
|
||||||
padding:0 10px;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.info-cd{
|
|
||||||
|
.menu_active {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu_disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-visit {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 5px;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
.arrw_div_wrapper {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-color: #3f3f3f;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 20px;
|
||||||
|
border-radius: 10%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blind_name_wrapper {
|
||||||
|
height: 20px;
|
||||||
|
line-height: 20px;
|
||||||
|
background-color: #00000057;
|
||||||
|
color: #fff;
|
||||||
|
padding: 0 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-cd {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
@@ -2032,6 +2037,7 @@ export default {
|
|||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-series {
|
.info-series {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
@@ -2041,6 +2047,7 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
/* z-index: 1; */
|
/* z-index: 1; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-image {
|
.info-image {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 10px;
|
left: 10px;
|
||||||
@@ -2060,6 +2067,7 @@ export default {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
/* z-index: 1; */
|
/* z-index: 1; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-instance {
|
.info-instance {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 15px;
|
right: 15px;
|
||||||
@@ -2092,6 +2100,7 @@ export default {
|
|||||||
margin: 10px;
|
margin: 10px;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu__item:hover {
|
.menu__item:hover {
|
||||||
color: #ff0000;
|
color: #ff0000;
|
||||||
}
|
}
|
||||||
@@ -2111,11 +2120,12 @@ li:hover {
|
|||||||
background-color: #e0e0e2;
|
background-color: #e0e0e2;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.msg-div {
|
.msg-div {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
background-color: rgba(255, 255, 255, 0.5);
|
background-color: rgba(255, 255, 255, 0.5);
|
||||||
color: #000;
|
color: #000;
|
||||||
padding: 5px 20px;
|
padding: 5px 20px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -5,42 +5,22 @@
|
|||||||
<div class="related-study-wrapper">
|
<div class="related-study-wrapper">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<div class="visit-name-wrapper">
|
<div class="visit-name-wrapper">
|
||||||
<div
|
<div v-if="visitTaskList.length > 0" style="display: flex; flex-direction: row">
|
||||||
v-if="visitTaskList.length > 0"
|
<div v-for="s in visitTaskList" :key="s.VisitTaskId" class="visit-item" :class="{
|
||||||
style="display: flex; flex-direction: row"
|
'visit-item-active': activeTaskVisitId == s.VisitTaskId,
|
||||||
>
|
}" @click.prevent="handleClick(s)">
|
||||||
<div
|
|
||||||
v-for="s in visitTaskList"
|
|
||||||
:key="s.VisitTaskId"
|
|
||||||
class="visit-item"
|
|
||||||
:class="{
|
|
||||||
'visit-item-active': activeTaskVisitId == s.VisitTaskId,
|
|
||||||
}"
|
|
||||||
@click.prevent="handleClick(s)"
|
|
||||||
>
|
|
||||||
{{ s.TaskBlindName }}
|
{{ s.TaskBlindName }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<div
|
<div v-for="s in visitTaskList" v-show="activeTaskVisitId === s.VisitTaskId" :key="s.VisitTaskId"
|
||||||
v-for="s in visitTaskList"
|
class="study-wrapper">
|
||||||
v-show="activeTaskVisitId === s.VisitTaskId"
|
<StudyList v-if="selectArr.includes(s.VisitTaskId)" :ref="s.VisitTaskId" :visit-task-id="s.VisitTaskId"
|
||||||
:key="s.VisitTaskId"
|
:trial-id="trialId" :subject-visit-id="s.VisitId" :task-blind-name="s.TaskBlindName"
|
||||||
class="study-wrapper"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo" @loadImageStack="loadImageStack"
|
||||||
>
|
@previewNoneDicoms="previewNoneDicoms" />
|
||||||
<StudyList
|
|
||||||
v-if="selectArr.includes(s.VisitTaskId)"
|
|
||||||
:ref="s.VisitTaskId"
|
|
||||||
:visit-task-id="s.VisitTaskId"
|
|
||||||
:trial-id="trialId"
|
|
||||||
:subject-visit-id="s.VisitId"
|
|
||||||
:task-blind-name="s.TaskBlindName"
|
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
|
||||||
@loadImageStack="loadImageStack"
|
|
||||||
@previewNoneDicoms="previewNoneDicoms"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -48,21 +28,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="dicom-viewer">
|
<div class="dicom-viewer">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<DicomViewer
|
<DicomViewer v-if="activeTaskVisitId" ref="dicomViewer" :trial-id="trialId"
|
||||||
v-if="activeTaskVisitId"
|
:trial-reading-criterion-id="trialReadingCriterionId" :subject-id="subjectId" :is-show="isShow"
|
||||||
ref="dicomViewer"
|
:is-exists-clinical-data="isExistsClinicalData" :is-exists-no-dicom-file="isExistsNoDicomFile"
|
||||||
:trial-id="trialId"
|
|
||||||
:trial-reading-criterion-id="trialReadingCriterionId"
|
|
||||||
:subject-id="subjectId"
|
|
||||||
:is-show="isShow"
|
|
||||||
:is-exists-clinical-data="isExistsClinicalData"
|
|
||||||
:is-exists-no-dicom-file="isExistsNoDicomFile"
|
|
||||||
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
:is-reading-show-subject-info="isReadingShowSubjectInfo"
|
||||||
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
|
:is-reading-task-view-in-order="isReadingTaskViewInOrder" :isExistsManual="isExistsManual"
|
||||||
:isExistsManual="isExistsManual"
|
:IseCRFShowInDicomReading="IseCRFShowInDicomReading" @previewCD="previewCD" />
|
||||||
:IseCRFShowInDicomReading="IseCRFShowInDicomReading"
|
|
||||||
@previewCD="previewCD"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -77,6 +48,7 @@ import { mapGetters } from "vuex";
|
|||||||
import * as dicomParser from 'dicom-parser'
|
import * as dicomParser from 'dicom-parser'
|
||||||
import * as cornerstone from 'cornerstone-core'
|
import * as cornerstone from 'cornerstone-core'
|
||||||
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
|
||||||
|
import { workSpeedclose } from "@/utils"
|
||||||
// import metaDataProvider from '@/utils/metaDataProvider'
|
// import metaDataProvider from '@/utils/metaDataProvider'
|
||||||
// cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 });
|
// cornerstone.metaData.addProvider(metaDataProvider, { priority: 10 });
|
||||||
var config = {
|
var config = {
|
||||||
@@ -261,6 +233,7 @@ export default {
|
|||||||
DicomEvent.$off("addNoneDicomMeasureData");
|
DicomEvent.$off("addNoneDicomMeasureData");
|
||||||
DicomEvent.$off("selectSeries");
|
DicomEvent.$off("selectSeries");
|
||||||
window.removeEventListener('beforeunload', e => { cornerstone.imageCache.purgeCache() })
|
window.removeEventListener('beforeunload', e => { cornerstone.imageCache.purgeCache() })
|
||||||
|
workSpeedclose(true)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async getVisitInfo() {
|
async getVisitInfo() {
|
||||||
@@ -547,7 +520,7 @@ export default {
|
|||||||
if (obj) {
|
if (obj) {
|
||||||
let index = Math.floor(
|
let index = Math.floor(
|
||||||
obj.imageIds.length *
|
obj.imageIds.length *
|
||||||
((baseSeries.imageIdIndex + 1) / baseSeries.imageIds)
|
((baseSeries.imageIdIndex + 1) / baseSeries.imageIds)
|
||||||
);
|
);
|
||||||
obj.imageIdIndex = index > 0 ? index - 1 : 0;
|
obj.imageIdIndex = index > 0 ? index - 1 : 0;
|
||||||
}
|
}
|
||||||
@@ -636,7 +609,7 @@ export default {
|
|||||||
// );
|
// );
|
||||||
let frame = this.visitTaskList[index].MeasureData[idx].MeasureData.frame
|
let frame = this.visitTaskList[index].MeasureData[idx].MeasureData.frame
|
||||||
// let filterStr = series.isExistMutiFrames ? `frame=${frame}&instanceId=${instanceId}` : `instanceId=${instanceId}`
|
// let filterStr = series.isExistMutiFrames ? `frame=${frame}&instanceId=${instanceId}` : `instanceId=${instanceId}`
|
||||||
let n = series.instanceInfoList.findIndex(k=>k.Id === instanceId)
|
let n = series.instanceInfoList.findIndex(k => k.Id === instanceId)
|
||||||
let filterStr = ''
|
let filterStr = ''
|
||||||
if (n > -1 && series.isExistMutiFrames) {
|
if (n > -1 && series.isExistMutiFrames) {
|
||||||
if (series.instanceInfoList[n].NumberOfFrames > 0) {
|
if (series.instanceInfoList[n].NumberOfFrames > 0) {
|
||||||
@@ -683,12 +656,15 @@ 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
|
||||||
store.dispatch('reading/setImageLoadedProgress', params)
|
store.dispatch('reading/setImageLoadedProgress', params)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -699,22 +675,27 @@ export default {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
// background-color: #fff;
|
// background-color: #fff;
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 7px;
|
width: 7px;
|
||||||
height: 7px;
|
height: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.report-header {
|
.report-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-card {
|
.el-card {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-table,
|
::v-deep .el-table,
|
||||||
.el-table__expanded-cell {
|
.el-table__expanded-cell {
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
@@ -728,19 +709,23 @@ export default {
|
|||||||
color: #fff;
|
color: #fff;
|
||||||
border-color: #444444;
|
border-color: #444444;
|
||||||
}
|
}
|
||||||
::v-deep .el-table__body tr > td {
|
|
||||||
|
::v-deep .el-table__body tr>td {
|
||||||
background-color: #000 !important;
|
background-color: #000 !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color: #444444;
|
border-color: #444444;
|
||||||
}
|
}
|
||||||
::v-deep .el-table__body tr:hover > td {
|
|
||||||
|
::v-deep .el-table__body tr:hover>td {
|
||||||
background-color: #858282 !important;
|
background-color: #858282 !important;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-color: #444444;
|
border-color: #444444;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-table--border th.gutter:last-of-type {
|
::v-deep .el-table--border th.gutter:last-of-type {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-card__header {
|
::v-deep .el-card__header {
|
||||||
border: none;
|
border: none;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
@@ -753,10 +738,12 @@ export default {
|
|||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 5px;
|
width: 5px;
|
||||||
height: 5px;
|
height: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
::-webkit-scrollbar-thumb {
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #d0d0d0;
|
background: #d0d0d0;
|
||||||
@@ -773,6 +760,7 @@ export default {
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.dicom-list {
|
.dicom-list {
|
||||||
width: 200px;
|
width: 200px;
|
||||||
padding: 5px 0px;
|
padding: 5px 0px;
|
||||||
@@ -785,6 +773,7 @@ export default {
|
|||||||
border: 1px solid #727272;
|
border: 1px solid #727272;
|
||||||
// border: 1px solid #ccc;
|
// border: 1px solid #ccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-tabs {
|
.el-tabs {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
@@ -793,24 +782,29 @@ export default {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
// justify-content: flex-start;
|
// justify-content: flex-start;
|
||||||
border: 1px solid #727272;
|
border: 1px solid #727272;
|
||||||
|
|
||||||
.el-tabs__item {
|
.el-tabs__item {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-tabs__header {
|
::v-deep .el-tabs__header {
|
||||||
height: 55px;
|
height: 55px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-tabs__content {
|
::v-deep .el-tabs__content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-tabs__item {
|
::v-deep .el-tabs__item {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.dicom-desc {
|
.dicom-desc {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
@@ -819,23 +813,28 @@ export default {
|
|||||||
color: #d0d0d0;
|
color: #d0d0d0;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ps {
|
.ps {
|
||||||
overflow-anchor: none;
|
overflow-anchor: none;
|
||||||
touch-action: auto;
|
touch-action: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.series-active {
|
.series-active {
|
||||||
background-color: #607d8b !important;
|
background-color: #607d8b !important;
|
||||||
border: 1px solid #607d8b !important;
|
border: 1px solid #607d8b !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .el-progress__text {
|
::v-deep .el-progress__text {
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.series {
|
.series {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
|
|
||||||
.series-wrapper {
|
.series-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -848,9 +847,11 @@ export default {
|
|||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
border: 1px solid #404040;
|
border: 1px solid #404040;
|
||||||
background-color: #3a3a3a;
|
background-color: #3a3a3a;
|
||||||
|
|
||||||
.el-progress__text {
|
.el-progress__text {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-progress-bar {
|
.el-progress-bar {
|
||||||
padding-right: 0px;
|
padding-right: 0px;
|
||||||
}
|
}
|
||||||
@@ -861,8 +862,10 @@ export default {
|
|||||||
border: 2px solid #252525;
|
border: 2px solid #252525;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.image-desc {
|
.image-desc {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
|
|
||||||
p {
|
p {
|
||||||
width: 100px;
|
width: 100px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
@@ -876,6 +879,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.related-study-wrapper {
|
.related-study-wrapper {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@@ -891,6 +895,7 @@ export default {
|
|||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
|
||||||
.visit-name-wrapper {
|
.visit-name-wrapper {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
@@ -906,6 +911,7 @@ export default {
|
|||||||
// flex-direction: row;
|
// flex-direction: row;
|
||||||
// align-content: flex-start;
|
// align-content: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
.visit-item {
|
.visit-item {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
@@ -918,17 +924,20 @@ export default {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
// margin-left: 10px;
|
// margin-left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.visit-item-active {
|
.visit-item-active {
|
||||||
background-color: #607d8b;
|
background-color: #607d8b;
|
||||||
border: 1px solid #607d8b;
|
border: 1px solid #607d8b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.right {
|
.right {
|
||||||
width: 170px;
|
width: 170px;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border-left: 1px solid #4a4a4a;
|
border-left: 1px solid #4a4a4a;
|
||||||
color: #d5d5d5;
|
color: #d5d5d5;
|
||||||
|
|
||||||
.study-wrapper {
|
.study-wrapper {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div ref="viewport-fusion" class="viewport-wrapper" @mouseup="sliderMouseup" @mousemove="sliderMousemove"
|
<div ref="viewport-fusion" class="viewport-wrapper" v-loading="loading" :element-loading-text="NSTip"
|
||||||
|
element-loading-background="rgba(0, 0, 0, 0.8)" @mouseup="sliderMouseup" @mousemove="sliderMousemove"
|
||||||
@mouseleave="sliderMouseleave" :style="{ color: series.Modality === 'PT' || isMip ? '#666' : '#ddd' }">
|
@mouseleave="sliderMouseleave" :style="{ color: series.Modality === 'PT' || isMip ? '#666' : '#ddd' }">
|
||||||
<div v-if="series && taskInfo" class="left-top-text">
|
<div v-if="series && taskInfo" class="left-top-text">
|
||||||
<div v-if="taskInfo.IsExistsClinicalData && !isMip && !isFusion" class="cd-info"
|
<div v-if="taskInfo.IsExistsClinicalData && !isMip && !isFusion" class="cd-info"
|
||||||
@@ -185,6 +186,7 @@ export default {
|
|||||||
isMove: false
|
isMove: false
|
||||||
},
|
},
|
||||||
ptVolumeId: null,
|
ptVolumeId: null,
|
||||||
|
loading: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -501,10 +503,12 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
async createImageIdsAndCacheMetaData(obj) {
|
async createImageIdsAndCacheMetaData(obj) {
|
||||||
|
this.loading = true
|
||||||
await createImageIdsAndCacheMetaData({
|
await createImageIdsAndCacheMetaData({
|
||||||
modality: obj.Modality,
|
modality: obj.Modality,
|
||||||
imageIds: obj.ImageIds
|
imageIds: obj.ImageIds
|
||||||
})
|
})
|
||||||
|
this.loading = false
|
||||||
},
|
},
|
||||||
async setSeriesInfo(obj, option = {}) {
|
async setSeriesInfo(obj, option = {}) {
|
||||||
try {
|
try {
|
||||||
@@ -782,7 +786,12 @@ export default {
|
|||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
computed: {
|
||||||
|
NSTip() {
|
||||||
|
return `NS: ${this.$store.state.trials.uploadTip}`
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@@ -617,6 +617,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, setNetWorkSpeedSizeAll, workSpeedclose } from "@/utils"
|
||||||
const { visibility } = annotation
|
const { visibility } = annotation
|
||||||
const { ViewportType, Events } = Enums
|
const { ViewportType, Events } = Enums
|
||||||
const renderingEngineId = 'myRenderingEngine'
|
const renderingEngineId = 'myRenderingEngine'
|
||||||
@@ -1322,6 +1323,14 @@ export default {
|
|||||||
const isCriticalSequence = this.visitTaskList[taskIndex].StudyList[studyIndex].IsCriticalSequence
|
const isCriticalSequence = this.visitTaskList[taskIndex].StudyList[studyIndex].IsCriticalSequence
|
||||||
const keyImages = this.visitTaskList[taskIndex].KeyImages
|
const keyImages = this.visitTaskList[taskIndex].KeyImages
|
||||||
const series = this.visitTaskList[taskIndex].StudyList[studyIndex].SeriesList[seriesIndex]
|
const series = this.visitTaskList[taskIndex].StudyList[studyIndex].SeriesList[seriesIndex]
|
||||||
|
let file = series.find(item => item.ImageId === imageId)
|
||||||
|
if (file) {
|
||||||
|
getNetWorkSpeed()
|
||||||
|
setNetWorkSpeedSizeAll(percentComplete, detail.total, imageId)
|
||||||
|
}
|
||||||
|
if (percentComplete === 100) {
|
||||||
|
workSpeedclose()
|
||||||
|
}
|
||||||
this.setImageLoadedProgress(series, percentComplete, instanceId)
|
this.setImageLoadedProgress(series, percentComplete, instanceId)
|
||||||
if (!isCriticalSequence && series.IsBeMark && keyImages.length > 0) {
|
if (!isCriticalSequence && series.IsBeMark && keyImages.length > 0) {
|
||||||
const i = keyImages.findIndex(i => i.Id === params.instanceId)
|
const i = keyImages.findIndex(i => i.Id === params.instanceId)
|
||||||
@@ -2940,6 +2949,9 @@ export default {
|
|||||||
this.uploadStatus = status
|
this.uploadStatus = status
|
||||||
this[`${status}ImageVisible`] = true
|
this[`${status}ImageVisible`] = true
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
workSpeedclose(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
<div
|
<div
|
||||||
ref="viewport"
|
ref="viewport"
|
||||||
class="viewport-wrapper"
|
class="viewport-wrapper"
|
||||||
|
v-loading="loading"
|
||||||
|
:element-loading-text="NSTip"
|
||||||
|
element-loading-background="rgba(0, 0, 0, 0.8)"
|
||||||
@mouseup="sliderMouseup"
|
@mouseup="sliderMouseup"
|
||||||
@mousemove="sliderMousemove"
|
@mousemove="sliderMousemove"
|
||||||
@mouseleave="sliderMouseleave"
|
@mouseleave="sliderMouseleave"
|
||||||
@@ -166,7 +169,8 @@ export default {
|
|||||||
originalMarkers: [],
|
originalMarkers: [],
|
||||||
markers: { top: '', right: '', bottom: '', left: '' },
|
markers: { top: '', right: '', bottom: '', left: '' },
|
||||||
playClipState: false,
|
playClipState: false,
|
||||||
wwwcIdx: 2
|
wwwcIdx: 2,
|
||||||
|
loading: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -403,7 +407,9 @@ export default {
|
|||||||
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
const renderingEngine = getRenderingEngine(this.renderingEngineId)
|
||||||
const viewport = renderingEngine.getViewport(this.viewportId)
|
const viewport = renderingEngine.getViewport(this.viewportId)
|
||||||
let imageId = obj.ImageIds[obj.SliceIndex] ? obj.ImageIds[obj.SliceIndex] : obj.ImageIds[0]
|
let imageId = obj.ImageIds[obj.SliceIndex] ? obj.ImageIds[obj.SliceIndex] : obj.ImageIds[0]
|
||||||
|
this.loading = true
|
||||||
const image = await cornerstoneDICOMImageLoader.wadouri.loadImage(imageId).promise
|
const image = await cornerstoneDICOMImageLoader.wadouri.loadImage(imageId).promise
|
||||||
|
this.loading = false
|
||||||
if (obj.Modality === 'PT') {
|
if (obj.Modality === 'PT') {
|
||||||
this.cachePTMetadata([image])
|
this.cachePTMetadata([image])
|
||||||
}
|
}
|
||||||
@@ -531,7 +537,12 @@ export default {
|
|||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
computed: {
|
||||||
|
NSTip() {
|
||||||
|
return `NS: ${this.$store.state.trials.uploadTip}`
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,20 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<el-form
|
<el-form v-if="isRender" ref="questionForm" size="small" :model="questionForm" style="width:100%;">
|
||||||
v-if="isRender"
|
<qSFormItem v-for="question of questions" :key="question.Id" :question="question" :question-form="questionForm"
|
||||||
ref="questionForm"
|
:is-audit="isAudit" @resetFormItemData="resetFormItemData" />
|
||||||
size="small"
|
|
||||||
:model="questionForm"
|
|
||||||
style="width:100%;"
|
|
||||||
>
|
|
||||||
<qSFormItem
|
|
||||||
v-for="question of questions"
|
|
||||||
:key="question.Id"
|
|
||||||
:question="question"
|
|
||||||
:question-form="questionForm"
|
|
||||||
:is-audit="isAudit"
|
|
||||||
@resetFormItemData="resetFormItemData"
|
|
||||||
/>
|
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -49,6 +37,10 @@ export default {
|
|||||||
isAudit: {
|
isAudit: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
SecondReviewTime: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -56,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()
|
||||||
},
|
},
|
||||||
@@ -66,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)
|
||||||
}
|
}
|
||||||
@@ -82,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)
|
||||||
}
|
}
|
||||||
@@ -99,19 +104,23 @@ 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 => { }
|
||||||
})
|
})
|
||||||
reject()
|
reject()
|
||||||
} 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
|
||||||
// this.answers.forEach((item, index) => {
|
// this.answers.forEach((item, index) => {
|
||||||
// if (item.IsShow) {
|
// if (item.IsShow) {
|
||||||
// this.$set(this.answers[index], 'Answer', this.questionForm[item.TrialQCQuestionConfigureId])
|
// this.$set(this.answers[index], 'Answer', this.questionForm[item.TrialQCQuestionConfigureId])
|
||||||
@@ -121,8 +130,16 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
save() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
var answers = []
|
||||||
|
for (const k in this.questionForm) {
|
||||||
|
answers.push({ Id: k, answer: this.questionForm[k], AnswerId: this.AnswerIdObj[k] })
|
||||||
|
}
|
||||||
|
resolve(answers)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -335,11 +335,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']"
|
||||||
@@ -461,8 +467,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>
|
||||||
<!-- 手册 -->
|
<!-- 手册 -->
|
||||||
@@ -805,8 +811,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) => {
|
||||||
@@ -825,6 +857,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,8 +50,10 @@ module.exports = defineConfig({
|
|||||||
pathRewrite: {
|
pathRewrite: {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
'/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: {
|
||||||
|
|||||||
Reference in New Issue
Block a user