29 Commits

Author SHA1 Message Date
wangxiaoshuang cc788b9833 1
continuous-integration/drone/push Build encountered an error
2025-07-24 17:48:00 +08:00
wangxiaoshuang 0aaf2f3edb tableQuestionId为空时增加判断
continuous-integration/drone/push Build encountered an error
2025-07-24 16:41:00 +08:00
wangxiaoshuang ef489552ea 1
continuous-integration/drone/push Build encountered an error
2025-07-23 17:41:18 +08:00
wangxiaoshuang 0c040719b0 复核按钮添加置灰条件
continuous-integration/drone/push Build encountered an error
2025-07-23 13:48:45 +08:00
wangxiaoshuang bdfef06b5f 复核图标变更
continuous-integration/drone/push Build encountered an error
2025-07-22 17:20:19 +08:00
wangxiaoshuang c03e85ff22 复核时也可以指派
continuous-integration/drone/push Build encountered an error
2025-07-22 15:36:35 +08:00
wangxiaoshuang 26914c2b2b 影像为加载前网速计算文件大小取值更改
continuous-integration/drone/push Build encountered an error
2025-07-18 17:08:18 +08:00
wangxiaoshuang 98ce2b27da 【质控复核】复核页面,去除指派按钮
continuous-integration/drone/push Build encountered an error
2025-07-18 15:28:32 +08:00
wangxiaoshuang 5805ea0778 关联访视影像过滤删除和不阅片影像
continuous-integration/drone/push Build encountered an error
2025-07-18 13:23:16 +08:00
wangxiaoshuang 17737d901c 影像浏览页面-关联访视,左侧的影像列表按照访视-检查-序列的层级展示;点击单个序列时,自动下载当前序列影像
continuous-integration/drone/push Build encountered an error
2025-07-18 11:43:29 +08:00
wangxiaoshuang 51a94ad89e 排序问题 2025-07-18 11:43:16 +08:00
wangxiaoshuang 9187c9db8c 复核报错提示信息修改
continuous-integration/drone/push Build encountered an error
2025-07-18 09:40:41 +08:00
wangxiaoshuang 5e67f8b65f 1
continuous-integration/drone/push Build encountered an error
2025-07-17 16:50:32 +08:00
wangxiaoshuang 6218b536f9 【质控复核】A领取质控任务后指派给B,A点击替换按钮将此任务完成,B已进入质控页面点击指派时无响应
continuous-integration/drone/push Build encountered an error
2025-07-17 16:23:44 +08:00
wangxiaoshuang 7493c1a98a 【质控复核】同一个复核任务可以同时被2个iqc打开,当一个iqc复核完成后,另一个iqc也可以复核完成 2025-07-17 16:23:17 +08:00
wangxiaoshuang d91a9170de 【系统文档】新增可上传的mp4格式缺少格式icon 2025-07-17 16:22:45 +08:00
wangxiaoshuang 57bec076b7 影像质控问题配置未确认时禁止质控操作
continuous-integration/drone/push Build encountered an error
2025-07-17 14:41:44 +08:00
wangxiaoshuang 36ea567229 影像质控问题配置未确认时禁止质控操作
continuous-integration/drone/push Build encountered an error
2025-07-17 14:20:03 +08:00
wangxiaoshuang e9dd669d48 1
continuous-integration/drone/push Build encountered an error
2025-07-17 11:40:29 +08:00
wangxiaoshuang 4d27cbfe41 【质控复核】历史审核人页面中复核问题需要默认展开
continuous-integration/drone/push Build encountered an error
2025-07-17 11:12:59 +08:00
wangxiaoshuang b8208dffed 1
continuous-integration/drone/push Build encountered an error
2025-07-17 10:12:35 +08:00
wangxiaoshuang 10b8cc6a5e 复核按钮显示判断
continuous-integration/drone/push Build encountered an error
2025-07-16 17:39:33 +08:00
wangxiaoshuang edf1377374 阅片页面加载网速监控
continuous-integration/drone/push Build encountered an error
2025-07-16 17:29:54 +08:00
wangxiaoshuang f8b4dd70c8 部分问题修复
continuous-integration/drone/push Build encountered an error
2025-07-16 16:58:38 +08:00
wangxiaoshuang 33a8d8743e 影像质控添加指派功能
continuous-integration/drone/push Build encountered an error
2025-07-16 10:11:50 +08:00
wangxiaoshuang a357fe7ce6 质控复核
continuous-integration/drone/push Build encountered an error
2025-07-15 17:51:42 +08:00
wangxiaoshuang 07fbbf5a74 质控添加复核
continuous-integration/drone/push Build encountered an error
2025-07-15 15:25:00 +08:00
wangxiaoshuang 79b14eee67 配置国际化修改
continuous-integration/drone/push Build encountered an error
2025-07-15 10:05:16 +08:00
wangxiaoshuang 9f76310101 【影像下载】原始检查数中可以查看影像数量,该数量需要过滤不阅片的数量
continuous-integration/drone/push Build encountered an error
2025-07-14 16:32:54 +08:00
31 changed files with 1218 additions and 1905 deletions
+4 -3
View File
@@ -75,10 +75,11 @@ export function getRelationVisitList(visitNum, tpCode) {
method: 'get'
})
}
export function getAllRelationStudyList(studyId) {
export function getAllRelationStudyList(studyId, params) {
return request({
url: `/study/getAllRelationStudyList/${studyId}`,
method: 'get'
method: 'get',
params
})
}
export function getTrialListByReviewer(param) {
@@ -134,7 +135,7 @@ export function AddAdjudicationReport(param) {
}
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
return request({
url: url,
+10 -3
View File
@@ -969,13 +969,20 @@ export function takeOrReleaseQCTask(trialId, subjectVisitId, obtainOrCancel) {
method: 'put'
})
}
export function replaceQCTaskActionUser(trialId, subjectVisitId) {
export function replaceQCTaskActionUser(trialId, subjectVisitId, params = {}) {
return request({
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) {
return request({
url: `/QCOperation/verifyReuploadIsCanJump/${trialId}/${qcChallengeId}`,
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

+1 -1
View File
@@ -123,7 +123,7 @@ export default {
components: { DicomTags },
computed: {
NSTip() {
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
return `${this.$store.state.trials.uploadSize}, NS: ${this.$store.state.trials.uploadTip}`
}
},
data() {
@@ -1,51 +1,37 @@
<template>
<div class="criterion-form-item">
<div
v-if="!!question.QuestionName && question.ClinicalQuestionType==='group'"
style="font-weight: bold;font-size: 16px;margin: 5px 0px;margin-bottom: 10px"
>
{{ language==='en'?question.QuestionEnName:question.QuestionName }}
<div v-if="!!question.QuestionName && question.ClinicalQuestionType === 'group'"
style="font-weight: bold;font-size: 16px;margin: 5px 0px;margin-bottom: 10px">
{{ language === 'en' ? question.QuestionEnName : question.QuestionName }}
</div>
<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
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
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;"
>
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;">
<span>
{{ question.QuestionName }}
</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') }}
</el-button>
</div>
<el-table
: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
:label="$t('common:action:action')"
min-width="100"
show-overflow-tooltip
>
<el-table :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 :label="$t('common:action:action')" min-width="100" show-overflow-tooltip
v-if="SecondReviewState <= 0">
<template slot-scope="scope">
<el-button type="text" size="mini" @click="openAddTableCol(question, scope.$index)">
{{ $t('common:button:edit') }}
</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') }}
</el-button>
</template>
@@ -54,187 +40,109 @@
</div>
<el-col v-else :span="12">
<el-form-item
v-if="(question.ClinicalQuestionShowEnum===1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum===0"
:label="`${question.QuestionName}`"
: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',
message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']}
]"
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
>
v-if="(question.ClinicalQuestionShowEnum === 1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum === 0"
:label="`${question.QuestionName}`" :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',
message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']
}
]" :class="[question.Type === 'group' ? 'mb' : question.Type === 'upload' ? 'uploadWrapper' : '']">
<!-- 输入框 -->
<el-input
v-if="question.ClinicalQuestionType==='input'"
v-model="questionForm[question.Id]"
<el-input v-if="question.ClinicalQuestionType === 'input'" v-model="questionForm[question.Id]"
:disabled="question.TableQuestionType === 2"
:max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200"
/>
:max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200" />
<!-- 多行文本输入框 -->
<el-input
v-if="question.ClinicalQuestionType==='textarea'"
v-model="questionForm[question.Id]"
type="textarea"
:max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200"
:autosize="{ minRows: 2, maxRows: 4}"
/>
<el-input v-if="question.ClinicalQuestionType === 'textarea'" v-model="questionForm[question.Id]"
type="textarea" :max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200"
:autosize="{ minRows: 2, maxRows: 4 }" />
<!-- 下拉框 -->
<el-select
v-if="question.ClinicalQuestionType==='select'"
v-model="questionForm[question.Id]"
clearable
<el-select v-if="question.ClinicalQuestionType === 'select'" v-model="questionForm[question.Id]" clearable
: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">
<el-option
v-for="item in organList"
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
<el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]" />
</template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="item.value"
:label="item.label" />
</template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="item.value"
:label="item.label"
/>
<template
v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
<el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="item.value"
:label="item.label" />
</template>
<template v-else>
<el-option
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val.trim()"
/>
<el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val.trim()" />
</template>
</el-select>
<!-- 单选 -->
<el-date-picker
v-if="question.ClinicalQuestionType === 'time'"
v-model="questionForm[question.Id]"
style="width: 200px"
align="right"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
<el-date-picker v-if="question.ClinicalQuestionType === 'time'" v-model="questionForm[question.Id]"
style="width: 200px" align="right" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" />
<!-- 单选 -->
<el-radio-group
v-if="question.ClinicalQuestionType==='radio'"
v-model="questionForm[question.Id]"
@change="((val)=>{formItemChange(val, question)})"
>
<el-radio-group v-if="question.ClinicalQuestionType === 'radio'" v-model="questionForm[question.Id]"
@change="((val) => { formItemChange(val, question) })">
<template v-if="question.DictionaryCode">
<el-radio
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="item.value"
>
<el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="item.value">
{{ item.label }}
</el-radio>
</template>
<template v-if="question.TypeValue">
<el-radio
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
<el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
{{ val }}
</el-radio>
</template>
</el-radio-group>
<!-- 复选框 -->
<el-checkbox-group
v-if="question.ClinicalQuestionType==='checkbox' && 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-group v-if="question.ClinicalQuestionType === 'checkbox' && questionForm[question.Id] !== ''"
v-model="questionForm[question.Id]">
<el-checkbox v-for="val of question.TypeValue.split('|')" :key="val" :label="val" :value="val">
{{ val }}
</el-checkbox>
</el-checkbox-group>
<el-input
v-if="question.ClinicalQuestionType === 'number'"
:ref="question.Id"
v-model="questionForm[question.Id]"
type="number"
style="width: 200px"
:disabled="question.CustomCalculateMark > 0"
@input="limitInput($event, questionForm, question)"
>
<el-input v-if="question.ClinicalQuestionType === 'number'" :ref="question.Id"
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>
</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">
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{ questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId] }}
<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">
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{
questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId] }}
</span>
<span 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
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 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') }}
</span>
</el-form-item>
</el-col>
<!-- eslint-disable vue/no-use-v-if-with-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">
<QuestionFormItem
:key="item.Id"
:question="item"
:question-form="questionForm"
:trial-clinical-id="trialClinicalId"
@formItemNumberChange="formItemNumberChange"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
<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">
<QuestionFormItem :key="item.Id" :question="item" :question-form="questionForm"
:trial-clinical-id="trialClinicalId" @formItemNumberChange="formItemNumberChange"
@setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" />
</el-col>
<el-dialog
v-if="addOrEdit.visible"
class="my_dialog"
:visible.sync="addOrEdit.visible"
:close-on-click-modal="false"
: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"
/>
<el-dialog v-if="addOrEdit.visible" class="my_dialog" :visible.sync="addOrEdit.visible"
:close-on-click-modal="false" :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;">
<el-form-item>
<!-- 取消 -->
<el-button
size="small"
type="primary"
@click="addOrEdit.visible = false"
>
<el-button size="small" type="primary" @click="addOrEdit.visible = false">
{{ $t('common:button:cancel') }}
</el-button>
<!-- 保存 -->
@@ -251,7 +159,6 @@
import { getTrialClinicalQuestionCalculateRelation } from '@/api/dictionary'
import QuestionTableFormItem from './QuestionTableFormItem'
import { mapGetters } from 'vuex'
import DicomEvent from "../../../views/trials/trials-panel/reading/dicoms/components/DicomEvent";
export default {
name: 'QuestionFormItem',
@@ -263,6 +170,10 @@ export default {
return ''
}
},
SecondReviewState: {
type: Number,
default: 0
},
questionForm: {
type: Object,
default() {
@@ -282,7 +193,7 @@ export default {
},
data() {
return {
addOrEdit: { visible: false, title: '', id: null, index: 0},
addOrEdit: { visible: false, title: '', id: null, index: 0 },
fileList: [],
accept: '.png,.jpg,.jpeg',
imgVisible: false,
@@ -591,40 +502,47 @@ export default {
}
</script>
<style lang="scss" scoped>
.my_dialog{
.criterion-form-item{
::v-deep .el-form-item__content{
.my_dialog {
.criterion-form-item {
::v-deep .el-form-item__content {
width: auto;
}
}
}
.el-col-12 .el-col-12{
.el-col-12 .el-col-12 {
width: 100%;
}
.criterion-form-item{
.el-form-item{
.criterion-form-item {
.el-form-item {
display: flex;
flex-direction: row;
align-items: flex-start;
}
.el-input{
width:100%;
.el-input {
width: 100%;
}
.mb{
.mb {
margin-bottom: 0px;
}
.disabled{
.disabled {
::v-deep .el-upload--picture-card {
display: none;
}
}
.uploadWrapper{
.uploadWrapper {
display: flex;
flex-direction: column;
align-items: flex-start;
}
}
.clearfix:after{
.clearfix:after {
content: '';
display: table;
clear: both;
@@ -1,52 +1,31 @@
<template>
<div v-loading="loading" style="min-height: 500px;">
<el-form
v-if="isRender"
data-viewport-uid="lc"
ref="questions"
size="small"
:model="questionForm"
:disabled="openType === 'look'"
>
<el-form v-if="isRender" data-viewport-uid="lc" ref="questions" size="small" :model="questionForm"
:disabled="openType === 'look'">
<template>
<QuestionFormItem
class="father"
v-for="question of questions"
:key="question.Id"
:question="question"
:question-form="questionForm"
:trial-clinical-id="trialClinicalId"
@resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData"
/>
<QuestionFormItem class="father" v-for="question of questions" :key="question.Id" :question="question"
:question-form="questionForm" :trial-clinical-id="trialClinicalId" :SecondReviewState="SecondReviewState"
@resetFormItemData="resetFormItemData" @setFormItemData="setFormItemData" />
</template>
</el-form>
<div class="base-dialog-footer" v-if="!isViewer && openType !== 'look' && [2, 3].includes(clinicalDataLevel)" style="text-align:right;margin-top:10px;">
<!-- 取消 -->
<el-button
size="small"
type="primary"
@click="close"
v-show="$route.path !== '/trials/trials-panel/visit/crc-upload'&&$route.path!=='/trials/trials-panel/visit/crc-question'"
>
{{ $t('common:button:cancel') }}
</el-button>
<!-- 保存 -->
<el-button size="small" type="primary" @click="submitClinicalForm">
{{ $t('common:button:save') }}
</el-button>
<div class="base-dialog-footer"
v-if="!isViewer && openType !== 'look' && [2, 3].includes(clinicalDataLevel) && SecondReviewState <= 0"
style="text-align:right;margin-top:10px;">
<!-- 取消 -->
<el-button size="small" type="primary" @click="close"
v-show="$route.path !== '/trials/trials-panel/visit/crc-upload' && $route.path !== '/trials/trials-panel/visit/crc-question'">
{{ $t('common:button:cancel') }}
</el-button>
<!-- 保存 -->
<el-button size="small" type="primary" @click="submitClinicalForm">
{{ $t('common:button:save') }}
</el-button>
</div>
<el-dialog
v-if="signVisible"
:visible.sync="signVisible"
:close-on-click-modal="false"
width="600px"
append-to-body
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px" append-to-body
custom-class="base-dialog-wrapper">
<div slot="title">
<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>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog>
@@ -77,6 +56,10 @@ export default {
return 2
}
},
SecondReviewState: {
type: Number,
default: 0
},
openType: {
type: String,
},
@@ -106,7 +89,7 @@ export default {
},
data: {
type: Object,
default: () => {}
default: () => { }
},
trialClinicalId: {
type: String,
@@ -166,7 +149,7 @@ export default {
let item = this.questionForm[v]
if (item instanceof Array) {
let TableQuestionAnswers = item.map(o => {
if (o instanceof Object) {
if (o instanceof Object) {
return Object.keys(o).map(x => {
return {
TableQuestionId: x,
@@ -251,7 +234,7 @@ export default {
if (item instanceof Array) {
let isCheckBox = false
let TableQuestionAnswers = item.map(o => {
if (o instanceof Object) {
if (o instanceof Object) {
return Object.keys(o).map(x => {
return {
TableQuestionId: x,
@@ -387,11 +370,11 @@ export default {
}
if (i.ClinicalQuestionType === 'table') {
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(',') : [])
console.log(i.Answer ? i.Answer.split(',') : [])
console.log(this.questionForm)
} else if (i.ClinicalQuestionType === 'number') {
} else if (i.ClinicalQuestionType === 'number') {
this.$set(this.questionForm, i.Id, i.Answer)
} else if (i.Childrens && i.Childrens.length > 0) {
this.setChild(i.Childrens)
@@ -405,7 +388,7 @@ export default {
this.questionForm[v] = 0
} else if (qs.ClinicalQuestionType === 'checkbox') {
this.questionForm[v] = []
} else{
} else {
this.questionForm[v] = ''
}
},
@@ -426,23 +409,26 @@ export default {
</script>
<style lang="scss" scoped>
::-webkit-scrollbar {
width: 7px;
height: 7px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background: #d0d0d0;
}
.tabContent{
height:300px;
width: 7px;
height: 7px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background: #d0d0d0;
}
.tabContent {
height: 300px;
overflow-y: auto;
}
.father:after{
.father:after {
content: "";
display: block;
height: 0;
clear:both;
clear: both;
visibility: hidden;
}
</style>
+23 -33
View File
@@ -1,42 +1,30 @@
<template>
<div v-loading="loading">
<QuestionsForm
v-if="clinicalUploadType === 2"
:data="data"
:trial-clinical-id="trialClinicalId"
:is-viewer="isViewer"
:visit-id="visitId"
:subject-id="subjectId"
: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="() => {}">
<QuestionsForm v-if="clinicalUploadType === 2" :data="data" :trial-clinical-id="trialClinicalId"
:is-viewer="isViewer" :visit-id="visitId" :subject-id="subjectId" :open-type="openType"
:system-clinical-id="systemClinicalId" :trial-id="trialId" :reading-id="readingId"
:clinical-form-id="clinicalFormId" :SecondReviewState="SecondReviewState" :clinical-data-level="clinicalDataLevel"
@close="close"></QuestionsForm>
<uploadClinicalData v-else :subject-visit-id="subjectVisitId" :SecondReviewState="SecondReviewState" :data="data"
:enum-type="0" :allow-add-or-edit="true" @getList="() => { }">
</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">
{{ $t('common:button:submit') }}
</el-button>
</div>
<!-- 临床数据签名框 -->
<el-dialog
v-if="signVisible"
:visible.sync="signVisible"
:close-on-click-modal="false"
width="600px"
append-to-body
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px" append-to-body
custom-class="base-dialog-wrapper">
<div slot="title">
<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>
<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>
</div>
</template>
@@ -49,7 +37,7 @@ import uploadClinicalData from './components/uploadClinicalData'
import const_ from '@/const/sign-code'
export default {
name: "index",
name: "index",
components: { QuestionsForm, uploadClinicalData, SignForm },
methods: {
submitClinicalForm() {
@@ -83,7 +71,7 @@ name: "index",
this.close()
}).catch((res) => {
this.$refs['signForm'].btnLoading = false
})
})
},
},
data() {
@@ -106,6 +94,10 @@ name: "index",
type: String,
default: () => ''
},
SecondReviewState: {
type: Number,
default: 0
},
clinicalUploadType: {
type: Number,
default: () => {
@@ -148,7 +140,7 @@ name: "index",
},
data: {
type: Object,
default: () => {}
default: () => { }
},
trialClinicalId: {
type: String,
@@ -166,6 +158,4 @@ name: "index",
}
</script>
<style scoped>
</style>
<style scoped></style>
@@ -24,7 +24,7 @@
</div>
<!--上传列表@selection-change="handleSelectionChange"-->
<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' }">
<!-- <el-table-column
type="selection"
@@ -37,10 +37,10 @@
show-overflow-tooltip />
<!--任务名称-->
<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"
sortable="custom">
sortable>
<template slot-scope="scope">
<span>{{ $fd('IsDicom', scope.row.IsDicom) }}</span>
</template>
@@ -40,13 +40,13 @@
</el-table-column>
<!--序列数量-->
<el-table-column
prop="SeriesCount"
prop="ReadingSeriesCount"
:label="$t('trials:uploadImage:table:SeriesCount')"
v-if="IsDicom"
/>
<!--图像数量-->
<el-table-column
prop="InstanceCount"
prop="ReadingInstanceCount"
:label="$t('trials:uploadImage:table:InstanceCount')"
v-if="IsDicom"
/>
@@ -83,7 +83,7 @@
</el-table-column>
<!--文件数量-->
<el-table-column
prop="FileCount"
prop="ReadingFileCount"
:label="$t('trials:uploadImage:table:FileCount')"
v-if="!IsDicom"
/>
@@ -245,13 +245,13 @@ export default {
if (this.IsDicom) {
var token = getToken()
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 {
let trialId = this.$route.query.trialId
var token = getToken()
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')
+4
View File
@@ -29,6 +29,10 @@ export default {
MedicalAudit: 215, // 医学审核
HeavyReadingApproval: 216, // 重阅审批
ResetAndAsyncCriterion: 218, //同步签名
ResetImageQualityControlQuestion: 112, // 重置影像质控问题
CreateReviewTask: 113, // 生成复核任务
ReviewImageQualityControlQuestion: 219, // 复核质控问题
},
};
</script>
+2 -2
View File
@@ -12,7 +12,7 @@ import { getCustomTag } from '@/api/reading'
import requestPoolManager from '@/utils/request-pool'
import { getReadingVisitStudyList } from '@/api/trials'
import { getNetWorkSpeed, setNetWorkSpeedSize, workSpeedclose } from "@/utils"
import { getNetWorkSpeed, setNetWorkSpeedSizeAll, workSpeedclose } from "@/utils"
const hangingAgreement = [
{ name: 'A', row: 1, col: 1 },
{ name: 'A|A', row: 1, col: 2 },
@@ -1076,7 +1076,7 @@ const actions = {
let file = series.instanceInfoList.find(item => item.ImageId === obj.imageId)
if (file) {
getNetWorkSpeed()
setNetWorkSpeedSize(obj.percentComplete, file.FileSize, obj.imageId)
setNetWorkSpeedSizeAll(obj.percentComplete, obj.FileTotal, obj.imageId)
}
if (prefetchInstanceCount >= instanceCount * 100) {
series.prefetchInstanceCount = instanceCount * 100
+34 -3
View File
@@ -105,12 +105,14 @@ export function formatSize(size, fixed = 2) {
let timer = null, // 网速定时器
lastPercentage = 0,
percentageById = {},
imageId = null,
bytesReceivedPerSecond = {}; // 时间节点上传文件总量
// 获取网速
export function getNetWorkSpeed() {
if (timer) return false;
if (lastPercentage < 100) 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);
@@ -135,8 +137,9 @@ 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)
// 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);
@@ -152,10 +155,37 @@ export function setNetWorkSpeedSize(totalPercentage, total, Id) {
}
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;
@@ -164,5 +194,6 @@ export function workSpeedclose(isForce = false) {
}
bytesReceivedPerSecond = {};
lastPercentage = 0;
imageId = null
imageId = null;
percentageById = {};
}
+15 -4
View File
@@ -192,7 +192,9 @@ export default {
imageList: [],
showSeriesList: [],
currentLoadIns: [],
isFromCRCUpload: false
isFromCRCUpload: false,
isReading: null,
activeSeriesId: null
}
},
created: function () {
@@ -206,6 +208,9 @@ export default {
store.dispatch('user/setToken', this.$router.currentRoute.query.TokenKey)
changeURLStatic('TokenKey', '')
}
if (this.$router.currentRoute.query.isReading) {
this.isReading = this.$router.currentRoute.query.isReading
}
this.studyId = this.$router.currentRoute.query.studyId
this.isFromCRCUpload = !!this.$router.currentRoute.query.isFromCRCUpload
if (this.type === 'Series') {
@@ -244,7 +249,8 @@ export default {
this.seriesCount = data.Result.SeriesCount
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)
}
},
@@ -439,6 +445,8 @@ export default {
}
},
showSeriesImage(e, seriesIndex, series) {
this.activeSeriesId = series.seriesId
workSpeedclose(true)
// if (seriesIndex === this.currentSeriesIndex) return
const element = e.currentTarget
const elements = document.querySelectorAll('[series-type]')
@@ -828,6 +836,9 @@ export default {
const seriesIndex = params.seriesIndex
var prefetchInstanceCount = this.seriesList[seriesIndex].prefetchInstanceCount
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) {
const i = this.currentLoadIns.findIndex(i => i.imageId === imageId)
if (i > -1) {
@@ -848,9 +859,9 @@ export default {
}
}
let file = this.seriesList[seriesIndex].instanceInfoList.find(item => item.ImageId === imageId)
if (file) {
if (file && this.activeSeriesId === this.seriesList[seriesIndex].seriesId) {
getNetWorkSpeed()
setNetWorkSpeedSize(percentComplete, file.FileSize, imageId)
setNetWorkSpeedSize(percentComplete, e.detail.total, imageId)
}
if (prefetchInstanceCount >= instanceCount * 100) {
this.seriesList[seriesIndex].prefetchInstanceCount = instanceCount * 100
+135 -80
View File
@@ -149,92 +149,109 @@
</div>
</div>
</el-tab-pane>
<el-tab-pane v-if="!visitTaskId" :label="$t('trials:dicom-show:relatedVisit')" name="relation-study"
<el-tab-pane v-show="!visitTaskId" :label="$t('trials:dicom-show:relatedVisit')" name="relation-study"
class="pane-relation-wrapper">
<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">
{{ study.StudyCode }}
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
<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 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 }}
</div> -->
<div v-show="study.SeriesCount" class="text-desc">
{{ study.Modalities }} : {{ study.SeriesCount }} Series
</div>
</template>
<div v-show="study.Description" class="text-desc" style="background-color: #1f1f1f;">
{{ study.Description }}
</div>
<div v-if="study.seriesList" class="viewerSidethumbs ps" style="position: relative;">
<div class="viewerSidethumbinner">
<div v-for="(seriesItem, index) in study.seriesList" :key="index"
class="viewernavigatorwrapper" style="position: relative;border:1px solid #434343;"
series-type="relation"
@click="showRelationSeriesImage($event, seriesItem, studyIndex, index)">
<!-- <el-image
<div v-show="study.SeriesCount" class="text-desc">
{{ study.Modalities }} : {{ study.SeriesCount }} Series
</div>
</template>
<div v-show="study.Description" class="text-desc" style="background-color: #1f1f1f;">
{{ study.Description }}
</div>
<div class="viewerSidethumbs ps" style="position: relative;">
<div class="viewerSidethumbinner">
<div v-for="(seriesItem, index) in study.seriesList" :key="seriesItem.seriesId">
<div class="viewernavigatorwrapper"
style="position: relative;border:1px solid #434343;" series-type="relation"
@click="showRelationSeriesImage($event, seriesItem, studyIndex, index)">
<img class="image-preview" :src="seriesItem.previewImageUrl" crossorigin="anonymous"
alt="" style="width: 85px;height:85px;" fit="fill">
<div class="viewernavitextwrapper">
<div
style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
<div v-if="seriesItem.keySeries" style="color:red">
Key Images
</div>
<div v-else>#{{ seriesItem.seriesNumber }}</div>
<div v-if="seriesItem.isExistMutiFrames && seriesItem.instanceCount > 1">
<el-popover placement="right-start" trigger="click"
popper-class="instance_frame_wrapper">
<div class="frame_list">
<div v-for="(instance, idx) in seriesItem.instanceInfoList"
:key="instance.Id" class="frame_content"
:style="{ 'margin-bottom': idx < seriesItem.instanceInfoList.length - 1 ? '5px' : '0px' }"
@click="showMultiFrames(studyIndex, seriesItem, index, instance)">
<div>
<div>{{ instance.InstanceNumber }}</div>
<div>{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1}
frame`
}}</div>
</div>
</div>
</div>
<i slot="reference" class="el-icon-connection"
style="font-size: 15px;cursor: pointer;" />
</el-popover>
</div>
</div>
<div v-show="seriesItem.instanceCount" style="padding: 1px;">
{{ seriesItem.modality }}: {{ seriesItem.instanceCount }} image
</div>
<div v-show="seriesItem.sliceThickness" style="padding: 1px;">
T: {{ seriesItem.sliceThickness }}
</div>
<el-tooltip v-show="seriesItem.description" class="item" effect="dark"
:content="seriesItem.description" placement="bottom">
<div v-show="seriesItem.description"
style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
{{ seriesItem.description }}
</div>
</el-tooltip>
</div>
</div>
<!-- <el-image
class="image-preview"
style="height:72px;width:72px;"
:src="seriesItem.previewImageUrl"
fit="fill"
/> -->
<img class="image-preview" :src="seriesItem.previewImageUrl" crossorigin="anonymous" alt=""
style="width: 85px;height:85px;" fit="fill">
<div class="viewernavitextwrapper">
<div style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
<div v-if="seriesItem.keySeries" style="color:red">
Key Images
<div
v-if="seriesItem.prefetchInstanceCount > 0 && seriesItem.prefetchInstanceCount < seriesItem.instanceCount * 100">
<el-progress
:percentage="parseInt((seriesItem.prefetchInstanceCount / seriesItem.instanceCount).toFixed(2))" />
</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 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 style="position: absolute;bottom: -10px;left: 0;width: 100%;">
<el-progress v-if="seriesItem.prefetchInstanceCount>0 && seriesItem.prefetchInstanceCount<seriesItem.instanceCount" :percentage="Number(seriesItem.prefetchInstanceCount/seriesItem.instanceCount)*100" />
</div> -->
</div>
</div>
</el-collapse-item>
</template>
</div>
</el-collapse-item>
</template>
</el-collapse>
</div>
@@ -290,6 +307,7 @@ export default {
visitInfo: '',
activeName: 'current-study',
relationStudyList: [],
relationStudyListByVisitName: [],
cachedImages: [],
isReading: null,
isStartLoad: false,
@@ -303,7 +321,8 @@ export default {
currentLoadIns: [],
isFromCRCUpload: false,
visitTaskId: null,
page: ''
page: '',
activeSeriesId: null
}
},
mounted() {
@@ -435,6 +454,8 @@ export default {
}
},
showSeriesImage(e, studyIndex, seriesIndex, series) {
this.activeSeriesId = series.seriesId
workSpeedclose(true)
const element = e.currentTarget
const elements = document.querySelectorAll('[series-type]')
Array.from(elements).forEach((e) => {
@@ -683,10 +704,26 @@ export default {
spinner: 'el-icon-loading'
})
try {
const res = await getAllRelationStudyList(this.subjectVisitId)
let params = {
IsReading: !!this.isReading
}
const res = await getAllRelationStudyList(this.subjectVisitId, params)
loading.close()
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) {
console.log(e)
loading.close()
}
}
@@ -715,7 +752,8 @@ export default {
spinner: 'el-icon-loading'
})
try {
const data = await getSeriesList(`/series/list/${studyId}`)
let isReading = !!this.isReading ? `?IsReading=true` : ''
const data = await getSeriesList(`/series/list/${studyId}${isReading}`)
loading.close()
if (data.Result != null && data.Result.length > 0) {
var seriesList = []
@@ -725,9 +763,15 @@ export default {
item.InstanceInfoList.forEach(i => {
if (i.NumberOfFrames && i.NumberOfFrames > 1) {
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`)
}
} 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`)
}
})
@@ -751,9 +795,12 @@ export default {
isShowPopper: false
})
})
scope.relationStudyList[index].seriesCount = seriesList.length
scope.relationStudyList[index].seriesList = seriesList
scope.relationStudyList[index].showSeries = true
// scope.relationStudyList[index].seriesCount = seriesList.length
// scope.relationStudyList[index].seriesList = seriesList
// 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()
}
} catch (e) {
@@ -762,6 +809,8 @@ export default {
}
},
showRelationSeriesImage(e, series, studyIndex, index) {
this.activeSeriesId = series.seriesId
workSpeedclose(true)
this.currentRelationIndex = index
const element = e.currentTarget
const elements = document.querySelectorAll('[series-type]')
@@ -781,6 +830,9 @@ export default {
this.imageList.push({ imageId: imageId, seriesId: series.seriesId, priority })
})
}
if (this.imageList.length > 0) {
this.loopLoad()
}
}
},
loadAllImages() {
@@ -840,8 +892,11 @@ export default {
}
const studyIndex = params.idx.split('|')[0]
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 (!this.activeSeriesId) {
this.activeSeriesId = series.seriesId
}
var prefetchInstanceCount = series.prefetchInstanceCount
var instanceCount = series.instanceCount
if (series.imageloadedArr.indexOf(imageId) < 0) {
@@ -863,10 +918,10 @@ export default {
series.imageloadedArr.push(imageId)
}
}
let file = this.studyList[studyIndex].SeriesList[seriesIndex].instanceInfoList.find(item => item.ImageId === imageId)
if (file) {
let file = series.instanceInfoList.find(item => item.ImageId === imageId)
if (file && this.activeSeriesId === series.seriesId) {
getNetWorkSpeed()
setNetWorkSpeedSize(percentComplete, file.FileSize, imageId)
setNetWorkSpeedSize(percentComplete, e.detail.total, imageId)
}
if (prefetchInstanceCount >= instanceCount * 100) {
series.prefetchInstanceCount = instanceCount * 100
@@ -70,6 +70,7 @@ import ppt from '@/assets/file_icon/ppt.png'
import pptx from '@/assets/file_icon/pptx.png'
import xls from '@/assets/file_icon/xls.png'
import xlsx from '@/assets/file_icon/xlsx.png'
import mp4 from '@/assets/file_icon/xlsx.png'
import PreviewFile from '@/components/PreviewFile'
import imageViewer from './image-viewer'
import { getSystemDocumentAttachmentList } from '@/api/dictionary'
@@ -112,6 +113,7 @@ export default {
pptx,
xls,
xlsx,
mp4,
rowData: {},
list: [],
searchData: defaultSearchData(),
@@ -14,7 +14,7 @@
<el-form-item :label="$t('dictionary:sign:label:sceneType')" prop="Name">
<el-input v-model="form.Name" />
</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-form-item>
<el-form-item :label="$t('dictionary:sign:label:valueCN')" prop="ValueCN">
@@ -299,7 +299,7 @@ export default {
computed: {
...mapGetters(['visitTaskList', 'currentReadingTaskState']),
NSTip() {
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
return `NS: ${this.$store.state.trials.uploadTip}`
}
},
watch: {
@@ -8,7 +8,8 @@
<div v-if="(visitTaskList.length > 0)" style="display: flex;flex-direction: row;">
<div v-for="s in visitTaskList" :key="s.VisitTaskId" class="visit-item"
:class="{ 'visit-item-active': activeTaskVisitId == s.VisitTaskId }" @click.prevent="handleClick(s)">{{
:class="{ 'visit-item-active': activeTaskVisitId == s.VisitTaskId }" @click.prevent="handleClick(s)">
{{
s.TaskBlindName }}</div>
</div>
@@ -510,13 +511,13 @@ export default {
},
cornerstoneimageloadprogress(e) {
const imageId = e.detail.imageId
console.log(imageId,'imageId')
const params = {}
const searchParams = new URLSearchParams(imageId.split('?')[1])
for (const [key, value] of searchParams.entries()) {
params[key] = value
}
params.percentComplete = e.detail.percentComplete
params.FileTotal = e.detail.total
params.imageId = imageId
store.dispatch('reading/setImageLoadedProgress', params)
}
@@ -297,7 +297,7 @@ export default {
computed: {
...mapGetters(['visitTaskList', 'currentReadingTaskState']),
NSTip() {
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
return `NS: ${this.$store.state.trials.uploadTip}`
}
},
watch: {
@@ -663,6 +663,7 @@ export default {
params[key] = value
}
params.percentComplete = e.detail.percentComplete
params.FileTotal = e.detail.total
params.imageId = imageId
store.dispatch('reading/setImageLoadedProgress', params)
}
@@ -85,7 +85,7 @@
</template>
</el-select>
<span
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && scope.row.Type === 'select' || scope.row.Type === 'radio'">
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && (scope.row.Type === 'select' || scope.row.Type === 'radio')">
{{ questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] }}
</span>
<el-select
@@ -789,7 +789,7 @@ export default {
},
computed: {
NSTip() {
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
return `NS: ${this.$store.state.trials.uploadTip}`
}
},
}
@@ -617,7 +617,7 @@ import colorMap from './colorMap.vue'
import RectangleROITool from './tools/RectangleROITool'
import uploadDicomAndNonedicom from '@/components/uploadDicomAndNonedicom'
import downloadDicomAndNonedicom from '@/components/downloadDicomAndNonedicom'
import { getNetWorkSpeed, setNetWorkSpeedSize, workSpeedclose } from "@/utils"
import { getNetWorkSpeed, setNetWorkSpeedSizeAll, workSpeedclose } from "@/utils"
const { visibility } = annotation
const { ViewportType, Events } = Enums
const renderingEngineId = 'myRenderingEngine'
@@ -1326,7 +1326,7 @@ export default {
let file = series.find(item => item.ImageId === imageId)
if (file) {
getNetWorkSpeed()
setNetWorkSpeedSize(percentComplete, file.FileSize, imageId)
setNetWorkSpeedSizeAll(percentComplete, detail.total, imageId)
}
if (percentComplete === 100) {
workSpeedclose()
@@ -540,7 +540,7 @@ export default {
},
computed: {
NSTip() {
return `${this.$store.state.trials.uploadSize},NS: ${this.$store.state.trials.uploadTip}`
return `NS: ${this.$store.state.trials.uploadTip}`
}
},
}
@@ -1,139 +1,68 @@
<template>
<el-form
ref="questionForm"
v-loading="loading"
:model="form"
label-width="120px"
size="small"
:rules="rules"
>
<el-form ref="questionForm" v-loading="loading" :model="form" label-width="120px" size="small" :rules="rules">
<div class="base-dialog-body">
<!-- 审核问题 -->
<el-form-item
:label="$t('trials:qcCfg:table:questionName')"
prop="QuestionName"
>
<el-input
v-model="form.QuestionName"
/>
<el-form-item :label="$t('trials:qcCfg:table:questionName')" prop="QuestionName">
<el-input v-model="form.QuestionName" :disabled="data.IsQuestionQCAuditPassed" />
</el-form-item>
<!-- <el-form-item-->
<!-- :label="$t('common:title:languageType')"-->
<!-- prop="LanguageType"-->
<!-- >-->
<!-- <el-select-->
<!-- v-model="form.LanguageType"-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="item of $d.LanguageType"-->
<!-- :key="item.value"-->
<!-- :value="item.value"-->
<!-- :label="item.label"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- <el-form-item-->
<!-- :label="$t('common:title:languageType')"-->
<!-- prop="LanguageType"-->
<!-- >-->
<!-- <el-select-->
<!-- v-model="form.LanguageType"-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="item of $d.LanguageType"-->
<!-- :key="item.value"-->
<!-- :value="item.value"-->
<!-- :label="item.label"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- 类型 -->
<el-form-item
:label="$t('trials:qcCfg:table:type')"
>
<el-select
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-form-item :label="$t('trials:qcCfg:table:type')">
<el-select v-model="form.Type" @change="((val) => { typeChange(val, form) })"
:disabled="data.IsQuestionQCAuditPassed">
<el-option v-for="item of $d.QcType" :key="item.value" :value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<!-- 选项 -->
<el-form-item
v-if="form.Type === 'select' || form.Type === 'radio'"
:label="$t('trials:qcCfg:table:typeValue')"
prop="TypeValue"
>
<el-input
v-model="form.TypeValue"
:placeholder="$t('trials:qcCfg:message:typeValue')"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
/>
<el-form-item v-if="form.Type === 'select' || form.Type === 'radio'" :label="$t('trials:qcCfg:table:typeValue')"
prop="TypeValue">
<el-input v-model="form.TypeValue" :placeholder="$t('trials:qcCfg:message:typeValue')" type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }" :disabled="data.IsQuestionQCAuditPassed" />
</el-form-item>
<!-- 父问题 -->
<el-form-item
:label="$t('trials:qcCfg:table:parentQs')"
>
<el-select
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-form-item :label="$t('trials:qcCfg:table:parentQs')">
<el-select v-model="form.ParentId" clearable @change="((val) => { parentQuestionChange(val, form) })"
:disabled="data.IsQuestionQCAuditPassed">
<el-option v-for="item of parentOptions" :key="item.Id" :label="item.QuestionName" :value="item.Id" />
</el-select>
</el-form-item>
<!-- 父问题触发值 -->
<el-form-item
v-if="form.ParentId"
:label="$t('trials:qcCfg:table:parentTriggerValue')"
prop="ParentTriggerValue"
>
<el-select
v-model="form.ParentTriggerValue"
>
<el-option
v-for="item of parentTriggerValOptions"
:key="item"
:label="item"
:value="item"
/>
<el-form-item v-if="form.ParentId" :label="$t('trials:qcCfg:table:parentTriggerValue')" prop="ParentTriggerValue">
<el-select v-model="form.ParentTriggerValue" :disabled="data.IsQuestionQCAuditPassed">
<el-option v-for="item of parentTriggerValOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<!-- 序号 -->
<el-form-item
:label="$t('trials:qcCfg:table:order')"
prop="ShowOrder"
>
<el-input-number
v-model="form.ShowOrder"
controls-position="right"
:min="0"
/>
<el-form-item :label="$t('trials:qcCfg:table:order')" prop="ShowOrder">
<el-input-number v-model="form.ShowOrder" controls-position="right" :min="0"
:disabled="data.IsQuestionQCAuditPassed" />
</el-form-item>
<!-- 是否必填 -->
<el-form-item
: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-form-item :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">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- 启用状态 -->
<el-form-item
: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-form-item :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">
{{ item.label }}
</el-radio>
</el-radio-group>
@@ -143,19 +72,11 @@
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
<el-form-item style="text-align:right;">
<!-- 取消 -->
<el-button
size="small"
type="primary"
@click="handleClose"
>
<el-button size="small" type="primary" @click="handleClose">
{{ $t('common:button:cancel') }}
</el-button>
<!-- Save -->
<el-button
size="small"
type="primary"
@click="handleSave"
>
<el-button size="small" type="primary" @click="handleSave">
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
@@ -202,7 +123,7 @@ export default {
},
rules: {
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: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' },
{ validator: validateTypeVal, trigger: 'blur' },
@@ -308,6 +229,4 @@ export default {
}
</script>
<style lang="scss">
</style>
<style lang="scss"></style>
@@ -8,23 +8,23 @@
<el-input v-model="searchData.QuestionName" clearable style="width:120px;" />
</el-form-item>
<!-- 语言类型 -->
<!-- <el-form-item-->
<!-- :label="$t('common:title:languageType')"-->
<!-- style="margin-top: 10px"-->
<!-- >-->
<!-- <el-select-->
<!-- v-model="searchData.LanguageType"-->
<!-- clearable-->
<!-- style="width:120px;"-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="item of $d.LanguageType"-->
<!-- :key="item.value"-->
<!-- :value="item.value"-->
<!-- :label="item.label"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- <el-form-item-->
<!-- :label="$t('common:title:languageType')"-->
<!-- style="margin-top: 10px"-->
<!-- >-->
<!-- <el-select-->
<!-- v-model="searchData.LanguageType"-->
<!-- clearable-->
<!-- style="width:120px;"-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="item of $d.LanguageType"-->
<!-- :key="item.value"-->
<!-- :value="item.value"-->
<!-- :label="item.label"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- 类型 -->
<el-form-item :label="$t('trials:qcCfg:table:type')">
<el-select v-model="searchData.Type" clearable style="width:120px;">
@@ -38,228 +38,138 @@
</el-form-item>
<el-form-item :label="$t('trials:qcCfg:table:isRequired')">
<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-form-item>
<el-form-item >
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t('common:button:search') }}
</el-button>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">
{{ $t('common:button:reset') }}
</el-button>
<el-button
v-if="isHaveQCQuestion"
type="primary"
icon="el-icon-view"
@click="preview.visible = true"
>
<el-button v-if="isHaveQCQuestion" type="primary" icon="el-icon-view" @click="preview.visible = true">
{{ $t('trials:qcCfg:button:preview') }}
</el-button>
<el-button
v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:default-question'])"
type="primary"
icon="el-icon-plus"
@click="handleAdd"
>
<el-button v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:default-question'])"
type="primary" icon="el-icon-plus" @click="handleAdd">
{{ $t('trials:qcCfg:button:default') }}
</el-button>
<el-button
v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:custom-question'])"
type="primary"
icon="el-icon-delete"
@click="handleBatchDelete"
>
<el-button v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:custom-question'])"
type="primary" icon="el-icon-delete" @click="handleBatchDelete">
{{ $t('common:button:batchDelete') }}
</el-button>
<el-button
v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:custom-question'])"
type="primary"
icon="el-icon-plus"
@click="handleCustomQS"
>
<el-button v-if="!isConfirm && hasPermi(['trials:trials-panel:setting:qc-question:custom-question'])"
type="primary" icon="el-icon-plus" @click="handleCustomQS">
{{ $t('trials:qcCfg:button:custom') }}
</el-button>
<el-button
v-if="(!isConfirm && isHaveQCQuestion)"
v-hasPermi="['trials:trials-panel:setting:qc-question:confirm']"
type="danger"
icon="el-icon-circle-check"
@click="handleConfirm"
>
<el-button v-if="(!isConfirm && isHaveQCQuestion)"
v-hasPermi="['trials:trials-panel:setting:qc-question:confirm']" type="danger" icon="el-icon-circle-check"
@click="handleConfirm">
{{ $t('trials:qcCfg:button:confirm') }}
</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>
<!-- <span style="margin-left:auto">-->
<!-- </span>-->
<!-- <span style="margin-left:auto">-->
<!-- </span>-->
</div>
<el-table
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
/>
<el-table v-adaptive="{ bottomOffset: 45 }" :data="list" stripe height="100"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" :selectable="(row) => !row.IsQuestionQCAuditPassed" />
<!-- 序号 -->
<el-table-column
prop="ShowOrder"
:label="$t('trials:qcCfg:table:order')"
width="60"
/>
<el-table-column prop="ShowOrder" :label="$t('trials:qcCfg:table:order')" width="60" />
<!-- 审核问题 -->
<el-table-column
prop="QuestionName"
:label="$t('trials:qcCfg:table:questionName')"
min-width="300"
show-overflow-tooltip
/>
<el-table-column prop="QuestionName" :label="$t('trials:qcCfg:table:questionName')" min-width="300"
show-overflow-tooltip />
<!-- 审核问题 -->
<!-- <el-table-column-->
<!-- prop="LanguageType"-->
<!-- :label="$t('common:title:languageType')"-->
<!-- show-overflow-tooltip-->
<!-- width="100"-->
<!-- >-->
<!-- <template slot-scope="scope">-->
<!-- {{ $fd('LanguageType', scope.row.LanguageType) }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column-->
<!-- prop="LanguageType"-->
<!-- :label="$t('common:title:languageType')"-->
<!-- show-overflow-tooltip-->
<!-- width="100"-->
<!-- >-->
<!-- <template slot-scope="scope">-->
<!-- {{ $fd('LanguageType', scope.row.LanguageType) }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- 类型 -->
<el-table-column
prop="Type"
:label="$t('trials:qcCfg:table:type')"
show-overflow-tooltip
width="120"
>
<el-table-column prop="Type" :label="$t('trials:qcCfg:table:type')" show-overflow-tooltip width="120">
<template slot-scope="scope">
{{ $fd('QcType', scope.row.Type) }}
</template>
</el-table-column>
<!-- 选项 -->
<el-table-column
prop="TypeValue"
:label="$t('trials:qcCfg:table:typeValue')"
show-overflow-tooltip
width="180"
/>
<el-table-column prop="TypeValue" :label="$t('trials:qcCfg:table:typeValue')" show-overflow-tooltip width="180" />
<!-- 是否必填 -->
<el-table-column
prop="IsRequired"
:label="$t('trials:qcCfg:table:isRequired')"
width="160"
>
<el-table-column prop="IsRequired" :label="$t('trials:qcCfg:table:isRequired')" width="160">
<template slot-scope="scope">
{{ $fd('YesOrNo', scope.row.IsRequired) }}
</template>
</el-table-column>
<!-- 启用状态 -->
<el-table-column
prop="IsEnable"
:label="$t('trials:qcCfg:table:isEnable')"
width="120"
>
<el-table-column prop="IsEnable" :label="$t('trials:qcCfg:table:isEnable')" width="120">
<template slot-scope="scope">
{{ $fd('YesOrNo', scope.row.IsEnable) }}
</template>
</el-table-column>
<!-- 父问题 -->
<el-table-column
prop="ParentShowOrder"
:label="$t('trials:qcCfg:table:parentQs')"
show-overflow-tooltip
width="160"
/>
<el-table-column prop="ParentShowOrder" :label="$t('trials:qcCfg:table:parentQs')" show-overflow-tooltip
width="160" />
<!-- 父问题触发值 -->
<el-table-column
prop="ParentTriggerValue"
:label="$t('trials:qcCfg:table:parentTriggerValue')"
show-overflow-tooltip
width="160"
/>
<el-table-column prop="ParentTriggerValue" :label="$t('trials:qcCfg:table:parentTriggerValue')"
show-overflow-tooltip width="160" />
<el-table-column
v-if="hasPermi(['trials:trials-panel:setting:qc-question:edit','trials:trials-panel:setting:qc-question:delete']) && !isConfirm"
:label="$t('common:action:action')"
min-width="150"
>
v-if="hasPermi(['trials:trials-panel:setting:qc-question:edit', 'trials:trials-panel:setting:qc-question:delete']) && !isConfirm"
:label="$t('common:action:action')" min-width="150">
<template slot-scope="scope">
<el-button
v-hasPermi="['trials:trials-panel:setting:qc-question:edit']"
circle
:title="$t('common:button:edit')"
icon="el-icon-edit-outline"
@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)"
/>
<el-button v-hasPermi="['trials:trials-panel:setting:qc-question:edit']" circle
:title="$t('common:button:edit')" icon="el-icon-edit-outline" @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)"
:disabled="scope.row.IsQuestionQCAuditPassed" />
</template>
</el-table-column>
</el-table>
<!-- 新增默认问题 -->
<el-dialog
v-if="addVisible"
:visible.sync="addVisible"
width="1200px"
:close-on-click-modal="false"
custom-class="base-dialog-wrapper"
:title="$t('trials:qcCfg:button:default')"
>
<el-dialog v-if="addVisible" :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">
<DefaultQS @getList="getList" @close="addVisible = false" />
</div>
</el-dialog>
<!-- 新增/编辑问题 -->
<el-dialog
v-if="qsForm.visible"
:visible.sync="qsForm.visible"
:close-on-click-modal="false"
custom-class="base-dialog-wrapper"
:title="qsForm.title"
width="600px"
>
<el-dialog v-if="qsForm.visible" :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" />
</el-dialog>
<!--签名框 -->
<el-dialog
v-if="signVisible"
:visible.sync="signVisible"
:close-on-click-modal="false"
width="600px"
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px"
custom-class="base-dialog-wrapper">
<div slot="title">
<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>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog>
<!-- 预览 -->
<el-dialog
v-if="preview.visible"
v-dialogDrag
:visible.sync="preview.visible"
:close-on-click-modal="false"
:title="preview.title"
width="500px"
append-to-body
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="preview.visible" 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">
<QcQuestionPreview :trial-id="trialId" />
</div>
@@ -311,6 +221,18 @@ export default {
this.getList()
},
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) {
this.selectedList = value
},
@@ -2,54 +2,28 @@
<div v-loading="loading" class="clinical-data-wrapper">
<el-tabs type="border-card">
<!-- 既往局部治疗史 -->
<el-tab-pane
v-for="cd in clinicalDatas"
:key="cd.ClinicalDataTrialSetId"
:label="cd.ClinicalDataSetName"
>
<div v-if="cd.ClinicalUploadType*1 === 0">
<el-tab-pane v-for="cd in clinicalDatas" :key="cd.ClinicalDataTrialSetId" :label="cd.ClinicalDataSetName">
<div v-if="cd.ClinicalUploadType * 1 === 0">
<!-- 既往放疗史 -->
<h4>{{ $t('trials:uploadClinicalData:title:pastTreatment') }}</h4>
<el-table
:data="cd.ClinicalTableData.PreviousHistoryList"
style="width: 100%"
>
<el-table-column
type="index"
width="50"
/>
<el-table :data="cd.ClinicalTableData.PreviousHistoryList" style="width: 100%">
<el-table-column type="index" width="50" />
<!-- 放疗部位 -->
<el-table-column
prop="Position"
:label="$t('trials:uploadClinicalData:table:bodyPart')"
width="180"
/>
<el-table-column prop="Position" :label="$t('trials:uploadClinicalData:table:bodyPart')" width="180" />
<!-- 开始日期 -->
<el-table-column
prop="StartTime"
:label="$t('trials:uploadClinicalData:table:beginDate')"
width="180"
>
<el-table-column prop="StartTime" :label="$t('trials:uploadClinicalData:table:beginDate')" width="180">
<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>
</el-table-column>
<!-- 结束日期 -->
<el-table-column
prop="EndTime"
:label="$t('trials:uploadClinicalData:table:endDate')"
width="180"
>
<el-table-column prop="EndTime" :label="$t('trials:uploadClinicalData:table:endDate')" width="180">
<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>
</el-table-column>
<!-- 病灶是否PD -->
<el-table-column
prop="IsPD"
:label="$t('trials:uploadClinicalData:table:isPD')"
width="180"
>
<el-table-column prop="IsPD" :label="$t('trials:uploadClinicalData:table:isPD')" width="180">
<template slot-scope="scope">
{{ $fd('IsPdEnum', scope.row.IsPD) }}
</template>
@@ -57,133 +31,71 @@
</el-table>
<!-- 既往手术史 -->
<h4>{{ $t('trials:uploadClinicalData:title:pastSurgery') }}</h4>
<el-table
:data="cd.ClinicalTableData.PreviousSurgeryList"
style="width: 100%"
>
<el-table-column
type="index"
width="50"
/>
<el-table :data="cd.ClinicalTableData.PreviousSurgeryList" style="width: 100%">
<el-table-column type="index" width="50" />
<!-- 手术名称 -->
<el-table-column
prop="OperationName"
:label="$t('trials:uploadClinicalData:table:surgeryName')"
width="180"
/>
<el-table-column prop="OperationName" :label="$t('trials:uploadClinicalData:table:surgeryName')"
width="180" />
<!-- 手术日期 -->
<el-table-column
prop="OperationTime"
:label="$t('trials:uploadClinicalData:table:surgeryDate')"
width="180"
>
<el-table-column prop="OperationTime" :label="$t('trials:uploadClinicalData:table:surgeryDate')"
width="180">
<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>
</el-table-column>
</el-table>
<!-- 既往其他治疗史 -->
<h4>{{ $t('trials:uploadClinicalData:title:others') }}</h4>
<el-table
:data="cd.ClinicalTableData.PreviousOtherList"
style="width: 100%"
>
<el-table-column
type="index"
width="50"
/>
<el-table :data="cd.ClinicalTableData.PreviousOtherList" style="width: 100%">
<el-table-column type="index" width="50" />
<!-- 治疗类型 -->
<el-table-column
prop="TreatmentType"
:label="$t('trials:uploadClinicalData:table:treatmentType')"
width="180"
/>
<el-table-column prop="TreatmentType" :label="$t('trials:uploadClinicalData:table:treatmentType')"
width="180" />
<!-- 开始日期 -->
<el-table-column
prop="StartTime"
:label="$t('trials:uploadClinicalData:table:treatmentbeginDate')"
width="180"
>
<el-table-column prop="StartTime" :label="$t('trials:uploadClinicalData:table:treatmentbeginDate')"
width="180">
<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>
</el-table-column>
<!-- 结束日期 -->
<el-table-column
prop="EndTime"
:label="$t('trials:uploadClinicalData:table:treatmentendDate')"
width="180"
>
<el-table-column prop="EndTime" :label="$t('trials:uploadClinicalData:table:treatmentendDate')" width="180">
<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>
</el-table-column>
</el-table>
</div>
<div v-if="cd.ClinicalUploadType*1 === 1">
<el-table
:data="cd.PDFFileList"
style="width: 100%"
>
<el-table-column
type="index"
width="50"
/>
<div v-if="cd.ClinicalUploadType * 1 === 1">
<el-table :data="cd.PDFFileList" style="width: 100%">
<el-table-column type="index" width="50" />
<!-- 文件名称 -->
<el-table-column
prop="FileName"
:label="$t('trials:uploadClinicalData:table:fileName')"
width="250"
/>
<el-table-column prop="FileName" :label="$t('trials:uploadClinicalData:table:fileName')" width="250" />
<!-- 上传时间 -->
<el-table-column
prop="CreateTime"
:label="$t('trials:uploadClinicalData:table:uploadedTime')"
width="200"
/>
<el-table-column
:label="$t('common:action:action')"
width="200"
>
<el-table-column prop="CreateTime" :label="$t('trials:uploadClinicalData:table:uploadedTime')"
width="200" />
<el-table-column :label="$t('common:action:action')" width="200">
<template slot-scope="scope">
<!-- 预览 -->
<el-button
type="text"
size="small"
@click.native.prevent="preview(scope.row)"
>
<el-button type="text" size="small" @click.native.prevent="preview(scope.row)">
{{ $t('trials:uploadClinicalData:action:preview') }}
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div v-if="cd.ClinicalUploadType*1 === 2">
<clinicalDataQuestions
:data="cd"
:trial-clinical-id="cd.ClinicalDataTrialSetId"
:is-viewer="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 v-if="cd.ClinicalUploadType * 1 === 2">
<clinicalDataQuestions :data="cd" :trial-clinical-id="cd.ClinicalDataTrialSetId" :is-viewer="false"
:SecondReviewState="SecondReviewState" :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>
</el-tab-pane>
</el-tabs>
<!-- 预览文件 -->
<el-dialog
v-if="previewObj.visible"
:visible.sync="previewObj.visible"
:title="previewObj.fileName"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
>
<el-dialog v-if="previewObj.visible" :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">
<PreviewFile v-if="previewObj.visible" :file-path="previewObj.filePath" :file-type="previewObj.fileType" />
</div>
@@ -209,6 +121,10 @@ export default {
type: Number,
default: 0
},
SecondReviewState: {
type: Number,
default: 0
},
subjectId: {
type: String,
required: true
@@ -234,7 +150,7 @@ export default {
// PreviousOtherList: this.subjectClinicalData.PreviousOtherList,
// PreviousPDFList: this.subjectClinicalData.PreviousPDFList,
moment,
previewObj:{visible:false,filePath:'',fileType:''},
previewObj: { visible: false, filePath: '', fileType: '' },
clinicalDatas: []
}
},
@@ -247,7 +163,7 @@ export default {
if (!row.FileName) return
this.previewObj.fileName = row.FileName
this.previewObj.filePath = row.Path
this.previewObj.fileType ='pdf'
this.previewObj.fileType = 'pdf'
this.previewObj.visible = true
// window.open(this.OSSclientConfig.basePath + path, '_blank')
},
@@ -284,4 +200,3 @@ export default {
}
}
</script>
File diff suppressed because it is too large Load Diff
@@ -1,20 +1,8 @@
<template>
<div v-loading="loading">
<el-form
v-if="isRender"
ref="questionForm"
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 v-if="isRender" ref="questionForm" 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>
</div>
@@ -49,6 +37,10 @@ export default {
isAudit: {
type: Boolean,
default: false
},
SecondReviewTime: {
type: String,
default: ''
}
},
data() {
@@ -56,9 +48,17 @@ export default {
loading: false,
questions: [],
questionForm: {},
AnswerIdObj: {},
isRender: false
}
},
watch: {
SecondReviewTime() {
if (this.SecondReviewTime) {
this.getQuestions()
}
}
},
mounted() {
this.getQuestions()
},
@@ -66,14 +66,18 @@ export default {
getQuestions() {
this.loading = true
var param = {
trialId: this.trialId,
trialId: this.trialId || this.$route.query.trialId,
subjectVisitId: this.subjectVisitId,
qcProcessEnum: this.qcProcessEnum,
currentQCEnum: this.currentQCEnum
currentQCEnum: this.SecondReviewTime ? 3 : this.currentQCEnum
}
if (this.SecondReviewTime) {
param.SecondReviewTime = this.SecondReviewTime
}
getQCQuestionAnswer(param).then(res => {
res.Result.map((v) => {
this.$set(this.questionForm, v.Id, v.Answer)
this.$set(this.AnswerIdObj, v.Id, v.AnswerId)
if (v.Childrens.length > 0) {
this.setChild(v.Childrens)
}
@@ -82,11 +86,12 @@ export default {
this.isRender = true
this.loading = false
}).catch(() => { this.loading = false })
}).catch((err) => { console.log(err); this.loading = false })
},
setChild(obj) {
obj.forEach(i => {
this.$set(this.questionForm, i.Id, i.Answer)
this.$set(this.AnswerIdObj, i.Id, i.AnswerId)
if (i.Childrens && i.Childrens.length > 0) {
this.setChild(i.Childrens)
}
@@ -99,19 +104,23 @@ export default {
return new Promise((resolve, reject) => {
this.$refs['questionForm'].validate(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',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
reject()
} else {
var answers = []
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)
// Answer
// Answer
// this.answers.forEach((item, index) => {
// if (item.IsShow) {
// 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>
@@ -335,11 +335,18 @@
'trials:trials-panel:visit:qc-check:receive',
'trials:trials-panel:visit:qc-check:release',
'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">
<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"
:disabled="(scope.row.CurrentActionUserId && scope.row.CurrentActionUserId !== userId) || 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)) -->
<el-button v-hasPermi="['trials:trials-panel:visit:qc-check:receive']"
@@ -461,8 +468,8 @@
</span>
<div class="qc-dialog-body">
<quality-assurance v-if="qcVisible" :data="rowData" :disabled="rowData.disabled ? rowData.disabled : false"
:q-type="rowData.qcType ? rowData.qcType : 1" @getList="getList" @nextTask="nextTask"
@openManuals="openManuals" @close="qcVisible = false" />
:SecondReviewState="rowData.SecondReviewState" :q-type="rowData.qcType ? rowData.qcType : 1"
@getList="getList" @nextTask="nextTask" @openManuals="openManuals" @close="qcVisible = false" />
</div>
</el-dialog>
<!-- 手册 -->
@@ -805,8 +812,34 @@ export default {
})
.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) {
if (!this.OtherInfo.IsQCQuestionConfirmed) return this.$alert(this.$t("trials:qcCheck:alert:questionNoConfirm"))
this.loading = true
isQCCanOpt(row.Id)
.then((res) => {
@@ -825,6 +858,7 @@ export default {
},
//
handleSecondaryQC(row) {
if (!this.OtherInfo.IsQCQuestionConfirmed) return this.$alert(this.$t("trials:qcCheck:alert:questionNoConfirm"))
this.loading = true
isQCCanOpt(row.Id)
.then((res) => {
+2 -1
View File
@@ -50,9 +50,10 @@ module.exports = defineConfig({
pathRewrite: {
}
},
// uat http://101.132.253.119:7010
'/api': {
target: 'http://106.14.89.110:30000',
// target: 'http://101.132.253.119:7010', // uat
changeOrigin: true,
secure: false,
pathRewrite: {