质控添加复核
continuous-integration/drone/push Build encountered an error Details

uat
wangxiaoshuang 2025-07-15 15:25:00 +08:00
parent 79b14eee67
commit 07fbbf5a74
9 changed files with 829 additions and 1662 deletions

View File

@ -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;

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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,139 @@
</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 :disabled="scope.row.IsQuestionQCAuditPassed" />
:title="$t('common:button:edit')" <el-button v-hasPermi="['trials:trials-panel:setting:qc-question:delete']" circle
icon="el-icon-edit-outline" :title="$t('common:button:delete')" icon="el-icon-delete" @click="handleDelete(scope.row)"
@click="handleEdit(scope.row)" :disabled="scope.row.IsQuestionQCAuditPassed" />
/>
<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 +222,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
}, },

View File

@ -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>

View File

@ -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() {
@ -59,6 +51,13 @@ export default {
isRender: false isRender: false
} }
}, },
watch: {
SecondReviewTime() {
if (this.SecondReviewTime) {
this.getQuestions()
}
}
},
mounted() { mounted() {
this.getQuestions() this.getQuestions()
}, },
@ -66,11 +65,14 @@ 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.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)
@ -99,10 +101,14 @@ 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 {
@ -111,7 +117,7 @@ export default {
answers.push({ Id: k, answer: this.questionForm[k] }) answers.push({ Id: k, answer: this.questionForm[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 +127,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] })
}
resolve(answers)
})
} }
} }
} }
</script> </script>

View File

@ -337,9 +337,14 @@
'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'
]) ])
" :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 > 0"
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 +466,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,6 +810,11 @@ export default {
}) })
.catch(() => { }) .catch(() => { })
}, },
//
reviewTask(row) {
this.rowData = { ...row }
this.qcVisible = true
},
// //
handlePrimaryQC(row) { handlePrimaryQC(row) {
this.loading = true this.loading = true