裁判阅片及规则配置更改

uat_us^2
caiyiling 2026-08-17 15:40:49 +08:00
parent 38ef9c9d58
commit 2b04301d1c
7 changed files with 1699 additions and 314 deletions

View File

@ -488,3 +488,51 @@ export function setRandomTaskOrder(data) {
data
})
}
export function getJudgeForm(data) {
return request({
url: `/ReadingImageTask/getJudgeForm`,
method: 'post',
data
})
}
export function setJudgeForm(data) {
return request({
url: `/ReadingImageTask/setJudgeForm`,
method: 'post',
data
})
}
export function getSingleVisitJudgeAnswer(data) {
return request({
url: `/ReadingImageTask/getSingleVisitJudgeAnswer`,
method: 'post',
data
})
}
export function submitJudgeForm(data) {
return request({
url: `/Inspection/ReadingImageTask/SubmitJudgeForm`,
method: 'post',
data
})
}
export function getTrialQuestionVisitJudgeRule(data) {
return request({
url: `/ReadingQuestion/getTrialQuestionVisitJudgeRule`,
method: 'post',
data
})
}
export function setTrialQuestionVisitJudgeRule(data) {
return request({
url: `/ReadingQuestion/setTrialQuestionVisitJudgeRule`,
method: 'post',
data
})
}

View File

@ -94,6 +94,14 @@ export function getTrialJudgyInfo(params) {
data: params
})
}
export function setTrialJudgeRuleInfo(params) {
return request({
url: `/ReadingQuestion/setTrialJudgeRuleInfo`,
method: 'post',
data: params
})
}
// 获取检查部位列表
export function getTrialBodyPartList(params) {
return request({

View File

@ -1,7 +1,11 @@
<template>
<div class="adReview_wrapper">
<el-card v-if="isReadingShowSubjectInfo" shadow="never" :body-style="{ padding: '10px' }"
style="margin-bottom: 10px">
<el-card
v-if="isReadingShowSubjectInfo"
shadow="never"
:body-style="{ padding: '10px' }"
style="margin-bottom: 10px"
>
<h4>
<!-- 受试者 -->
{{ $t("trials:adReview:title:subject") }}
@ -10,14 +14,14 @@
</h4>
</el-card>
<el-card :body-style="{ padding: '10px' }" shadow="never">
<!-- <div slot="header" class="clearfix">
<span style="font-weight: bold;">评估结果</span>
</div> -->
<div slot="header" style="
<div
slot="header"
style="
display: flex;
flex-direction: row;
justify-content: space-between;
">
"
>
<!-- 评估结果 -->
<div style="font-weight: bold">
{{ $t("trials:adReview:title:result") }}
@ -30,21 +34,37 @@
</div>
</div>
<el-table :data="adInfo.VisitInfoList" style="width: 100%">
<el-table v-if="taskInfo.ArbitrationRule !== 1" :data="adInfo.VisitInfoList" style="width: 100%">
<!-- 访视名称 -->
<el-table-column prop="VisitName" :label="$t('trials:adReview:table:visitName')" show-overflow-tooltip
width="150" />
<el-table-column
prop="VisitName"
:label="$t('trials:adReview:table:visitName')"
show-overflow-tooltip
width="150"
/>
<!-- 评估结果 -->
<el-table-column v-for="j in judgeQuestion" :key="j.armEnum" :label="j.armEnum === 1
<el-table-column
v-for="j in judgeQuestion"
:key="j.armEnum"
:label="j.armEnum === 1
? $t('trials:adReview:table:viewR1')
: j.armEnum === 2
? $t('trials:adReview:table:viewR2')
: $fd('ArmEnum', j.armEnum)
" align="center" prop="">
"
align="center"
prop=""
>
<template>
<el-table-column v-for="(qs, i) in j.judgeQuestionList" :key="i" prop="" :label="qs" show-overflow-tooltip
width="150">
<el-table-column
v-for="(qs, i) in j.judgeQuestionList"
:key="i"
prop=""
:label="qs"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope">
<div v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].QuestionType === 1">
<span v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].DictionaryCode">
@ -57,8 +77,11 @@
{{ scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer }}
</span>
<span
v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Unit && !isNaN(parseFloat(scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer))">{{
$fd('ValueUnit', parseInt(scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Unit)) }}</span>
v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Unit && !isNaN(parseFloat(scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer))"
>
{{ scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Unit !== 4 ? $fd('ValueUnit',
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Unit) : scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].CustomUnit }}
</span>
</div>
<div v-else-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].QuestionType === 2">
<div v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer">
@ -66,11 +89,15 @@
{{ $fd("YesOrNo", scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer) }}
</span>
<!-- 查看详情 -->
<el-button type="text" style="margin-left: 5px" @click="
<el-button
type="text"
style="margin-left: 5px"
@click="
handleViewDetail(
scope.row.VisitTaskInfoList[j.index].GlobalVisitTaskId
)
">
"
>
{{ $t("trials:adReview:table:view") }}
</el-button>
</div>
@ -95,10 +122,14 @@
</el-table-column>
<!-- 查看详情 -->
<el-table-column :label="criterionType === 10
<el-table-column
:label="criterionType === 10
? $t('trials:adReview:table:visitInfoview')
: $t('trials:adReview:table:view')
" width="200" :fixed="isFixed ? 'right' : false">
"
width="200"
:fixed="isFixed ? 'right' : false"
>
<template slot-scope="scope">
<!-- 查看R1详情 -->
<el-button type="text" :title="$t('trials:adReview:table:viewR1')" @click="handleView(scope.row, 1)">
@ -112,88 +143,205 @@
</el-table-column>
<!-- 全局详情 PCWG -->
<el-table-column v-if="criterionType === 10" prop="VisitName" :label="$t('trials:adReview:table:glInfo')"
show-overflow-tooltip width="150">
<el-table-column
v-if="criterionType === 10"
prop="VisitName"
:label="$t('trials:adReview:table:glInfo')"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope">
<!-- 查看R1详情 -->
<el-button v-if="scope.$index === adInfo.VisitInfoList.length - 1" type="text"
:title="$t('trials:adReview:table:viewR1')" @click="handleViewGl(scope.row, 1)">
<el-button
v-if="scope.$index === adInfo.VisitInfoList.length - 1"
type="text"
:title="$t('trials:adReview:table:viewR1')"
@click="handleViewGl(scope.row, 1)"
>
R1
</el-button>
<!-- 查看R2详情 -->
<el-button v-if="scope.$index === adInfo.VisitInfoList.length - 1" type="text"
:title="$t('trials:adReview:table:viewR2')" @click="handleViewGl(scope.row, 2)">
<el-button
v-if="scope.$index === adInfo.VisitInfoList.length - 1"
type="text"
:title="$t('trials:adReview:table:viewR2')"
@click="handleViewGl(scope.row, 2)"
>
R2
</el-button>
</template>
</el-table-column>
</el-table>
<el-table v-else :data="judgeAnswers" border style="width: 100%">
<!-- 问题名称 -->
<el-table-column
prop="QuestionName"
:label="$t('trials:readingTracking:config:questionName')"
show-overflow-tooltip
width="500"
/>
<!-- R1 -->
<el-table-column
prop="R1Answer"
show-overflow-tooltip
width="150"
>
<template slot="header">
<el-button
type="text"
class="judge-answer-header-btn"
@click.stop="handleViewDetail(r1VisitTaskId)"
>
R1
</el-button>
</template>
<template slot-scope="scope">
<span v-if="scope.row.DictionaryCode">
{{ $fd(scope.row.DictionaryCode, parseInt(scope.row.R1Answer)) }}
</span>
<span v-else>
{{ scope.row.R1Answer }}
</span>
<span v-if="scope.row.Unit">
{{ scope.row.Unit !== 4 ? $fd('ValueUnit', scope.row.Unit) : scope.row.CustomUnit }}
</span>
</template>
</el-table-column>
<!-- R2 -->
<el-table-column
prop="R2Answer"
show-overflow-tooltip
width="150"
>
<template slot="header">
<el-button
type="text"
class="judge-answer-header-btn"
@click.stop="handleViewDetail(r2VisitTaskId)"
>
R2
</el-button>
</template>
<template slot-scope="scope">
<span v-if="scope.row.DictionaryCode">
{{ $fd(scope.row.DictionaryCode, parseInt(scope.row.R2Answer)) }}
</span>
<span v-else>
{{ scope.row.R2Answer }}
</span>
<span v-if="scope.row.Unit">
{{ scope.row.Unit !== 4 ? $fd('ValueUnit', scope.row.Unit) : scope.row.CustomUnit }}
</span>
</template>
</el-table-column>
</el-table>
</el-card>
<el-card :body-style="{ padding: '10px' }" class="box-mr">
<el-card
v-if="taskInfo.JudgeModeEnum === 0"
:key="'judge-mode-0'"
:body-style="{ padding: '10px' }"
class="box-mr"
>
<div slot="header" class="clearfix">
<!-- 裁判结果 -->
<span style="font-weight: bold">{{
$t("trials:adReview:title:adResult")
}}</span>
</div>
<el-form ref="adForm" v-loading="loading" :model="adForm" style="width: 800px" label-width="100">
<el-form
ref="adForm"
v-loading="loading"
:model="adForm"
style="width: 800px"
label-width="300px"
>
<!-- 选择阅片人 -->
<el-form-item :label="$t('trials:adReview:title:choseReader')" prop="judgeResultTaskId" :rules="[
{ required: true, message: this.$t('common:ruleMessage:select') },
]">
<el-form-item
:label="$t('trials:adReview:title:choseReader')"
prop="judgeResultTaskId"
:rules="[
{ required: true, message: $t('common:ruleMessage:select') },
]"
>
<el-radio-group v-model="adForm.judgeResultTaskId" :disabled="adInfo.ReadingTaskState >= 2">
<el-radio v-for="t in visitTaskArmList" :key="t.VisitTaskId" :label="t.VisitTaskId"
@change="handleVisitTaskArmChange">
<el-radio
v-for="t in visitTaskArmList"
:key="t.VisitTaskId"
:label="t.VisitTaskId"
@change="handleVisitTaskArmChange"
>
{{ $fd("ArmEnum", t.ArmEnum) }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- 裁判原因 -->
<el-form-item :label="$t('trials:adReview:title:adReason')" prop="judgeResultRemark" :rules="[
{ required: true, message: this.$t('common:ruleMessage:specify') },
<el-form-item
:label="$t('trials:adReview:title:adReason')"
prop="judgeResultRemark"
:rules="[
{ required: true, message: $t('common:ruleMessage:specify') },
{
max: 500,
message: `${this.$t('common:ruleMessage:maxLength')} 500`,
message: `${$t('common:ruleMessage:maxLength')} 500`,
trigger: ['blur', 'change'],
},
]">
<div style="position: relative">
<div style="
position: absolute;
left: 0;
top: 30px;
color: #606266;
font-size: 13px;
">
]"
>
<div class="judge-remark-tip">
{{ remark }}
</div>
<el-input v-model="adForm.judgeResultRemark" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }"
:disabled="adInfo.ReadingTaskState >= 2" style="margin-top: 25px" />
</div>
<el-input
v-model="adForm.judgeResultRemark"
type="textarea"
:autosize="{ minRows: 4, maxRows: 6 }"
:disabled="adInfo.ReadingTaskState >= 2"
class="judge-remark-input"
/>
</el-form-item>
<!-- 截图说明 -->
<el-form-item :label="$t('trials:adReview:title:screenShot')">
<el-upload action :accept="accept" :on-preview="handlePictureCardPreview" :before-upload="handleBeforeUpload"
:http-request="uploadScreenshot" list-type="picture-card" :on-remove="handleRemove" :file-list="fileList"
:class="{ disabled: adInfo.ReadingTaskState >= 2 }" :disabled="adInfo.ReadingTaskState >= 2">
<el-upload
action
:accept="accept"
:on-preview="handlePictureCardPreview"
:before-upload="handleBeforeUpload"
:http-request="uploadScreenshot"
list-type="picture-card"
:on-remove="handleRemove"
:file-list="fileList"
:class="{ disabled: adInfo.ReadingTaskState >= 2 }"
:disabled="adInfo.ReadingTaskState >= 2"
>
<i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{ file }" style="width: 100%; height: 100%">
<viewer :ref="file.url" :images="images" style="
<viewer
:ref="file.url"
:images="images"
style="
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
">
<img class="el-upload-list__item-thumbnail" :src="OSSclientConfig.basePath + file.url" alt=""
crossorigin="anonymous" style="max-width: 100%; max-height: 100%">
"
>
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
crossorigin="anonymous"
style="max-width: 100%; max-height: 100%"
>
<span class="el-upload-list__item-actions">
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
<i class="el-icon-zoom-in" />
</span>
<span v-if="adInfo.ReadingTaskState < 2" class="el-upload-list__item-delete"
@click="handleRemove(file)">
<span
v-if="adInfo.ReadingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" />
</span>
</span>
@ -201,8 +349,7 @@
</div>
</el-upload>
</el-form-item>
</el-form>
<div style="text-align: center;width:100%" v-if="adInfo.ReadingTaskState < 2">
<el-form-item v-if="adInfo.ReadingTaskState < 2">
<el-button type="primary" @click="skipTask">
<!-- 跳过 -->
{{ $t("trials:readingReport:button:skip") }}
@ -215,7 +362,203 @@
<el-button type="primary" :loading="submitLockAction === 'submit'" :disabled="!!submitLockAction" @click="handleSubmit">{{
$t("common:button:submit")
}}</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card
v-else
:key="'judge-mode-1'"
:body-style="{ padding: '10px' }"
class="box-mr"
>
<div slot="header" class="clearfix">
<!-- 裁判结果 -->
<span style="font-weight: bold">
{{ $t("trials:adReview:title:adResult") }}
</span>
</div>
<el-form
ref="adForm2"
v-loading="loading"
:model="judgeForm"
style="width: 800px"
label-width="300px"
>
<el-form-item
v-for="question in judgeQs"
:key="question.ReadingQuestionId"
:label="`${question.QuestionName}`"
:prop="question.ReadingQuestionId"
:rules="[{
required: true,
message: ['radio', 'select', 'checkbox'].includes(question.Type) ? $t('common:ruleMessage:select') : $t('common:ruleMessage:specify'), trigger: ['blur', 'change']
}]"
>
<div class="judge-form-row">
<div class="judge-form-control">
<el-input
v-if="question.Type === 'number'"
v-model="judgeForm[question.ReadingQuestionId]"
type="text"
:disabled="readingTaskState >= 2"
style="width: 200px;"
>
<template v-if="question.Unit !== 0" slot="append">
{{ question.Unit !== 4 ? $fd('ValueUnit', question.Unit) : question.CustomUnit }}
</template>
</el-input>
<el-radio-group
v-else-if="question.Type === 'radio'"
v-model="judgeForm[question.ReadingQuestionId]"
:disabled="readingTaskState >= 2"
>
<template v-if="question.DictionaryCode">
<el-radio v-for="val in $d[question.DictionaryCode]" :key="val.id" :label="String(val.value)">
{{ val.label }}
</el-radio>
</template>
<template v-else>
<el-radio v-for="val in question.TypeValue.split('|')" :key="val.trim()" :label="val.trim()">
{{ val.trim() }}
</el-radio>
</template>
</el-radio-group>
<el-select
v-else-if="question.Type === 'select'"
v-model="judgeForm[question.ReadingQuestionId]"
:disabled="readingTaskState >= 2"
>
<template
v-if="question.QuestionGenre === 2 && question.DictionaryCode"
>
<el-option
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:value="String(item.value)"
:label="item.label"
/>
</template>
<template v-else>
<el-option
v-for="val in question.TypeValue.split('|')"
:key="val.trim()"
:label="val.trim()"
:value="val.trim()"
/>
</template>
</el-select>
<el-checkbox-group
v-else-if="question.Type === 'checkbox'"
v-model="judgeForm[question.ReadingQuestionId]"
:disabled="readingTaskState >= 2"
>
<template v-if="question.DictionaryCode">
<el-checkbox v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="String(item.value)">
{{ item.label }}
</el-checkbox>
</template>
<template v-else>
<el-checkbox v-for="val in question.TypeValue.split('|')" :key="val.trim()" :label="val.trim()">
{{ val.trim() }}
</el-checkbox>
</template>
</el-checkbox-group>
</div>
<div v-if="readingTaskState < 2" class="judge-form-actions">
<el-button
type="text"
@click="applyJudgeAnswer(question, 1)"
>
R1
</el-button>
<el-button
type="text"
@click="applyJudgeAnswer(question, 2)"
>
R2
</el-button>
</div>
</div>
</el-form-item>
<el-form-item :label="$t('trials:adReview:title:adReason1')">
<el-input
v-model="judgeForm.judgeResultRemark"
type="textarea"
:autosize="{ minRows: 4, maxRows: 6 }"
:disabled="readingTaskState >= 2"
style="width: 360px"
/>
</el-form-item>
<!-- 截图说明 -->
<el-form-item :label="$t('trials:adReview:title:screenShot')">
<el-upload
action
:accept="accept"
:on-preview="handlePictureCardPreview"
:before-upload="handleBeforeUpload"
:http-request="uploadScreenshot"
list-type="picture-card"
:on-remove="handleRemove"
:file-list="fileList"
:class="{ disabled: readingTaskState >= 2 }"
:disabled="readingTaskState >= 2"
>
<i slot="default" class="el-icon-plus" />
<div slot="file" slot-scope="{ file }" style="width: 100%; height: 100%">
<viewer
:ref="file.url"
:images="images"
style="
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
"
>
<img
class="el-upload-list__item-thumbnail"
:src="OSSclientConfig.basePath + file.url"
alt=""
crossorigin="anonymous"
style="max-width: 100%; max-height: 100%"
>
<span class="el-upload-list__item-actions">
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
<i class="el-icon-zoom-in" />
</span>
<span
v-if="readingTaskState < 2"
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete" />
</span>
</span>
</viewer>
</div>
</el-upload>
</el-form-item>
<div v-if="readingTaskState < 2" style="text-align: center;width:100%">
<el-button type="primary" @click="skipTask">
<!-- 跳过 -->
{{ $t("trials:readingReport:button:skip") }}
</el-button>
<!-- 保存 -->
<el-button type="primary" :loading="submitLockAction === 'save'" :disabled="!!submitLockAction" @click="handleSaveJudgeForm">{{
$t("common:button:save")
}}</el-button>
<!-- 提交 -->
<el-button type="primary" :loading="submitLockAction === 'submit'" :disabled="!!submitLockAction" @click="handleSubmitJudgeForm">{{
$t("common:button:submit")
}}</el-button>
</div>
</el-form>
</el-card>
<el-card v-if="isReadingShowPreviousResults" :body-style="{ padding: '10px' }">
@ -228,10 +571,18 @@
<el-table v-loading="priorLoading" :data="priorADList" style="width: 100%">
<!-- 裁判阅片 -->
<el-table-column prop="TaskBlindName" :label="$t('trials:adReview:table:adReading')" show-overflow-tooltip
width="200" />
<el-table-column prop="JudgeResultArm" :label="$t('trials:adReview:table:adResult')" show-overflow-tooltip
width="200">
<el-table-column
prop="TaskBlindName"
:label="$t('trials:adReview:table:adReading')"
show-overflow-tooltip
width="200"
/>
<el-table-column
prop="JudgeResultArm"
:label="$t('trials:adReview:table:adResult')"
show-overflow-tooltip
width="200"
>
<template slot-scope="scope">
{{ $fd("ArmEnum", scope.row.JudgeResultArm) }}
</template>
@ -239,15 +590,24 @@
<el-table-column :label="$t('common:action:action')" width="200">
<template slot-scope="scope">
<!-- 查看详情 -->
<el-button circle :title="$t('trials:adReview:table:view')" icon="el-icon-view"
@click="handleViewDetail(scope.row.VisitTaskId)" />
<el-button
circle
:title="$t('trials:adReview:table:view')"
icon="el-icon-view"
@click="handleViewDetail(scope.row.VisitTaskId)"
/>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 签名框 -->
<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">{{
@ -266,6 +626,12 @@ import {
submitJudgeVisitTaskResult,
getReadingPastResultList
} from '@/api/trials'
import {
getSingleVisitJudgeAnswer,
getJudgeForm,
setJudgeForm,
submitJudgeForm
} from '@/api/trials/reading'
import { getAutoCutNextTask } from '@/api/user'
import { setSkipReadingCache } from '@/api/reading'
import const_ from '@/const/sign-code'
@ -320,6 +686,7 @@ export default {
}
},
data() {
const taskInfo = JSON.parse(localStorage.getItem('taskInfo') || '{}')
return {
adInfo: {},
judgeQuestion: [],
@ -348,25 +715,26 @@ export default {
isFixed: false,
images: [],
remark: '',
submitLockAction: ''
submitLockAction: '',
taskInfo,
judgeAnswers: [],
r1VisitTaskId: '',
r2VisitTaskId: '',
judgeQs: [],
judgeForm: {
judgeResultRemark: ''
},
readingTaskState: taskInfo.ReadingTaskState || 2
}
},
// watch: {
// visitTaskId: {
// immediate: true,
// handler(val) {
// this.$nextTick(() => {
// this.getAdInfo()
// if (this.isReadingShowPreviousResults) {
// this.getPriorAdList()
// }
// })
// }
// }
// },
mounted() {
this.criterionType = parseInt(this.$route.query.criterionType)
if (this.taskInfo.JudgeModeEnum === 1) {
this.getVisitJudgeAnswer()
} else {
this.getAdInfo()
}
if (this.isReadingShowPreviousResults) {
this.getPriorAdList()
}
@ -453,6 +821,81 @@ export default {
this.loading = false
}
},
async getVisitJudgeAnswer() {
try {
this.loading = true
const res = await getSingleVisitJudgeAnswer({ visitTaskId: this.visitTaskId })
if (res.IsSuccess) {
this.judgeAnswers = res.Result.QuestionList
this.r1VisitTaskId = res.Result.R1VisitTaskId
this.r2VisitTaskId = res.Result.R2VisitTaskId
this.getJudgeForm()
}
} catch (e) {
console.log(e)
} finally {
this.loading = false
}
},
async getJudgeForm() {
try {
this.loading = true
const res = await getJudgeForm({ visitTaskId: this.visitTaskId })
if (res.IsSuccess) {
const { QuestionList, JudgeResultImagePathList } = res.Result
this.fileList = []
if (JudgeResultImagePathList.length > 0) {
JudgeResultImagePathList.map((url) => {
if (url) {
this.fileList.push({ name: '', url: url })
}
})
}
this.judgeQs = QuestionList
this.$set(this.judgeForm, 'judgeResultRemark', res.Result.JudgeResultRemark || '')
QuestionList.map((item) => {
this.$set(
this.judgeForm,
item.ReadingQuestionId,
item.Answer
)
})
}
} catch (e) {
console.log(e)
} finally {
this.loading = false
}
},
getJudgeAnswerValue(question, armEnum) {
const row = this.judgeAnswers.find((item) => {
return item.ReadingQuestionId === question.ReadingQuestionId
})
if (!row) return null
return armEnum === 1 ? row.R1Answer : row.R2Answer
},
applyJudgeAnswer(question, armEnum) {
const answer = this.getJudgeAnswerValue(question, armEnum)
this.$set(
this.judgeForm,
question.ReadingQuestionId,
answer
)
if (this.$refs.adForm2) {
this.$refs.adForm2.clearValidate(question.ReadingQuestionId)
}
},
applyAllJudgeAnswers(armEnum) {
const props = []
this.judgeQs.forEach((question) => {
const answer = this.getJudgeAnswerValue(question, armEnum)
this.$set(this.judgeForm, question.ReadingQuestionId, answer)
props.push(question.ReadingQuestionId)
})
if (this.$refs.adForm2 && props.length > 0) {
this.$refs.adForm2.clearValidate(props)
}
},
async getPriorAdList() {
this.priorLoading = true
try {
@ -499,9 +942,9 @@ export default {
this.submitLockAction = 'save'
this.loading = true
try {
const valid = await this.$refs['adForm'].validate()
const valid = await this.$refs.adForm.validate()
if (!valid) return false
var paths = []
const paths = []
this.fileList.map((file) => {
if (file.url) {
paths.push(file.url)
@ -523,7 +966,7 @@ export default {
if (this.submitLockAction) return false
this.submitLockAction = 'submit'
try {
const valid = await this.$refs['adForm'].validate()
const valid = await this.$refs.adForm.validate()
if (!valid) return false
const { ImageAssessmentReportConfirmation } = const_.processSignature
this.signCode = ImageAssessmentReportConfirmation
@ -543,35 +986,39 @@ export default {
},
//
async signConfirm(signInfo) {
try {
this.loading = true
var paths = []
this.fileList.map((file) => {
paths.push(file.url)
})
var params = {
const paths = this.fileList.reduce((acc, file) => {
if (file.url) acc.push(file.url)
return acc
}, [])
if (this.taskInfo.JudgeModeEnum === 1) {
// 访
const qsList = this.judgeQs.map((question) => ({
readingQuestionId: question.ReadingQuestionId,
answer: this.judgeForm[question.ReadingQuestionId]
}))
const params = {
data: {
visitTaskId: this.visitTaskId,
judgeResultTaskId: this.adForm.judgeResultTaskId,
judgeResultRemark: this.adForm.judgeResultRemark,
judgeResultImagePathList: paths
judgeResultRemark: this.judgeForm.judgeResultRemark,
judgeResultImagePathList: paths,
questionList: qsList
},
signInfo: signInfo
}
try {
const res = await submitJudgeVisitTaskResult(params)
const res = await submitJudgeForm(params)
if (res.IsSuccess) {
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.isEdit = false
this.$refs['signForm'].btnLoading = false
this.signVisible = false
// window.location.reload()
// window.opener.postMessage('refreshTaskList', window.location)
//
this.adInfo.ReadingTaskState = 2
const res = await getAutoCutNextTask({imageToolType: this.imageToolType})
var isAutoTask = res.Result.AutoCutNextTask
this.readingTaskState = 2
const res = await getAutoCutNextTask({ imageToolType: this.imageToolType })
const isAutoTask = res.Result.AutoCutNextTask
if (isAutoTask) {
// store.dispatch('reading/resetVisitTasks')
window.location.reload()
} else {
// ''
@ -583,8 +1030,6 @@ export default {
}
)
if (confirm === 'confirm') {
// store.dispatch('reading/resetVisitTasks')
// DicomEvent.$emit('getNextTask')
window.location.reload()
} else {
changeURLStatic('visitTaskId', this.visitTaskId)
@ -593,11 +1038,99 @@ export default {
window.opener.postMessage('refreshTaskList', window.location)
}
this.loading = false
} else {
const params = {
data: {
visitTaskId: this.visitTaskId,
judgeResultTaskId: this.adForm.judgeResultTaskId,
judgeResultRemark: this.adForm.judgeResultRemark,
judgeResultImagePathList: paths
},
signInfo: signInfo
}
const res = await submitJudgeVisitTaskResult(params)
if (res.IsSuccess) {
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.isEdit = false
this.$refs['signForm'].btnLoading = false
this.signVisible = false
//
this.adInfo.ReadingTaskState = 2
const res = await getAutoCutNextTask({ imageToolType: this.imageToolType })
const isAutoTask = res.Result.AutoCutNextTask
if (isAutoTask) {
window.location.reload()
} else {
// ''
const confirm = await this.$confirm(
this.$t('trials:adReview:title:msg2'),
{
type: 'warning',
distinguishCancelAndClose: true
}
)
if (confirm === 'confirm') {
window.location.reload()
} else {
changeURLStatic('visitTaskId', this.visitTaskId)
}
}
window.opener.postMessage('refreshTaskList', window.location)
}
this.loading = false
}
} catch (e) {
console.log(e)
} finally {
this.loading = false
this.$refs['signForm'] ? this.$refs['signForm'].btnLoading = false : ''
}
},
async handleSaveJudgeForm() {
if (this.submitLockAction) return false
this.submitLockAction = 'save'
this.loading = true
try {
const valid = await this.$refs.adForm2.validate()
if (!valid) return false
const qsList = this.judgeQs.map((question) => ({
readingQuestionId: question.ReadingQuestionId,
answer: this.judgeForm[question.ReadingQuestionId]
}))
const paths = this.fileList.reduce((acc, file) => {
if (file.url) acc.push(file.url)
return acc
}, [])
await setJudgeForm({
visitTaskId: this.visitTaskId,
judgeResultRemark: this.judgeForm.judgeResultRemark,
judgeResultImagePathList: paths,
questionList: qsList
})
this.$message.success(this.$t('common:message:savedSuccessfully'))
return true
} catch (e) {
console.log(e)
return false
} finally {
this.loading = false
this.submitLockAction = ''
}
},
async handleSubmitJudgeForm() {
if (this.submitLockAction) return false
this.submitLockAction = 'submit'
try {
const valid = await this.$refs['adForm2'].validate()
if (!valid) return false
const { ImageAssessmentReportConfirmation } = const_.processSignature
this.signCode = ImageAssessmentReportConfirmation
this.signVisible = true
return true
} finally {
this.submitLockAction = ''
}
},
handleViewDetail(visitTaskId) {
if (this.openWindow) {
this.openWindow.close()
@ -804,6 +1337,43 @@ export default {
margin: 10px 0;
}
.judge-form-row {
display: grid;
grid-template-columns: 250px 72px;
column-gap: 12px;
align-items: flex-start;
}
.judge-form-control {
min-width: 0;
}
.judge-remark-tip {
margin-bottom: 8px;
color: #606266;
font-size: 13px;
line-height: 20px;
word-break: break-word;
width: 500px;
}
.judge-remark-input {
width: 500px;
}
.judge-form-actions {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 12px;
white-space: nowrap;
}
.judge-answer-header-btn {
padding: 0;
font-weight: 600;
}
.disabled {
::v-deep .el-upload--picture-card {
display: none;

View File

@ -30,12 +30,12 @@
<div class="image-viewer__actions__inner">
<i class="el-icon-zoom-out" @click="handleActions('zoomOut')" />
<i class="el-icon-zoom-in" @click="handleActions('zoomIn')" />
<i class="el-image-viewer__actions__divider" />
<!-- <i class="el-image-viewer__actions__divider" /> -->
<i class="el-icon-c-scale-to-original" @click="toggleMode" />
<i class="el-image-viewer__actions__divider" />
<!-- <i class="el-image-viewer__actions__divider" /> -->
<i class="el-icon-refresh-left" @click="handleActions('anticlocelise')" />
<i class="el-icon-refresh-right" @click="handleActions('clocelise')" />
<i v-if="readingTaskState < 2" class="el-icon-bottom-right"
<i v-if="readingTaskState < 2 && taskInfo.CriterionType !== 19 && taskInfo.CriterionType !== 20" class="el-icon-bottom-right"
:style="{ cursor: isToolDisabled || readingTaskState >= 2 ? 'not-allowed' : 'pointer' }"
@click="handleDrawArrow" />
@ -44,7 +44,7 @@
:style="{cursor:isToolDisabled || readingTaskState >=2 ?'not-allowed':'pointer'}"
@click="handleDrawRectangle"
/> -->
<svg-icon v-if="readingTaskState < 2" icon-class="rectangle" class="svg-icon"
<svg-icon v-if="readingTaskState < 2 && taskInfo.CriterionType !== 19 && taskInfo.CriterionType !== 20" icon-class="rectangle" class="svg-icon"
:style="{ cursor: isToolDisabled || readingTaskState >= 2 ? 'not-allowed' : 'pointer' }"
@click="handleDrawRectangle" />
</div>
@ -109,6 +109,7 @@ export default {
}
},
data() {
const taskInfo = JSON.parse(localStorage.getItem('taskInfo') || '{}')
return {
loading: false,
index: this.initialIndex,
@ -137,11 +138,13 @@ export default {
currentDrawData: {},
canvasData: [],
imgZoom: 1,
isDragging: false,
isToolDisabled: false,
lesionName: '',
visitTaskId: '',
isInit: false,
imgSize: { height: '', width: '' } //
imgSize: { height: '', width: '' }, //
taskInfo
}
},
computed: {
@ -209,6 +212,10 @@ export default {
}
this.deviceSupportInstall()
},
beforeDestroy() {
window.removeEventListener('message', this.receiveMsg)
this.stopDragging()
},
methods: {
getCanvasData() {
return new Promise(async resolve => {
@ -337,25 +344,55 @@ export default {
//
initCanvas(img) {
this.loading = true
this.canvasSize.height = img.height
this.canvasSize.width = img.width
this.imgSize.height = img.height
this.imgSize.width = img.width
const canvasDiv = document.getElementsByClassName('image-viewer__canvas')[0]
const widthRatio = canvasDiv && canvasDiv.offsetWidth ? canvasDiv.offsetWidth / img.width : 1
const heightRatio = canvasDiv && canvasDiv.offsetHeight ? canvasDiv.offsetHeight / img.height : 1
this.imgZoom = Math.min(widthRatio, heightRatio, 1)
this.canvasSize.height = Math.round(img.height * this.imgZoom)
this.canvasSize.width = Math.round(img.width * this.imgZoom)
this.canvasPosition = {
x: canvasDiv.offsetWidth / 2 - img.width / 2,
y: canvasDiv.offsetHeight / 2 - img.height / 2 - 25
x: canvasDiv.offsetWidth / 2 - this.canvasSize.width / 2,
y: canvasDiv.offsetHeight / 2 - this.canvasSize.height / 2 - 25
} //
this.$nextTick(async () => {
ctx = document.getElementById('canvas').getContext('2d') //
await ctx.drawImage(img, 0, 0, img.width, img.height) // canvas()
await ctx.drawImage(img, 0, 0, this.canvasSize.width, this.canvasSize.height) // canvas()
this.drawToArr()
this.loading = false
})
},
scalePoint(point) {
return {
x: point.x * this.imgZoom,
y: point.y * this.imgZoom
}
},
startDragging(e) {
const { offsetX, offsetY } = this.transform
const startX = e.pageX
const startY = e.pageY
this.isDragging = true
this._dragHandler = rafThrottle((ev) => {
this.transform.offsetX = offsetX + ev.pageX - startX
this.transform.offsetY = offsetY + ev.pageY - startY
})
this._dragEndHandler = () => {
this.stopDragging()
}
on(document, 'mousemove', this._dragHandler)
on(document, 'mouseup', this._dragEndHandler)
},
stopDragging() {
off(document, 'mousemove', this._dragHandler)
off(document, 'mouseup', this._dragEndHandler)
this._dragHandler = null
this._dragEndHandler = null
this.isDragging = false
},
//
clearCanvas() {
@ -381,6 +418,11 @@ export default {
if (e.button !== 0) {
return
}
if (!this.model) {
this.startDragging(e)
e.preventDefault()
return
}
this.isMouseDown = true //
//
this.canvasMouseStart = {
@ -391,6 +433,9 @@ export default {
//
async handleMouseMove(e) {
if (!this.model || this.isDragging) {
return
}
// ()
this.mousePosition = {
x: e.pageX,
@ -437,10 +482,12 @@ export default {
var headlen = 10// 线
var theta = 45// 线线
var arrowX, arrowY// 线
var fromX = e.data.handles.start.x
var fromY = e.data.handles.start.y
var toX = e.data.handles.end.x
var toY = e.data.handles.end.y
var start = this.scalePoint(e.data.handles.start)
var end = this.scalePoint(e.data.handles.end)
var fromX = start.x
var fromY = start.y
var toX = end.x
var toY = end.y
//
var angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI
var angle1 = (angle + theta) * Math.PI / 180
@ -453,8 +500,8 @@ export default {
// 线
ctx.lineWidth = this.lineWidth
ctx.beginPath()
ctx.moveTo(fromX * this.imgZoom, fromY * this.imgZoom)
ctx.lineTo(toX * this.imgZoom, toY * this.imgZoom)
ctx.moveTo(fromX, fromY)
ctx.lineTo(toX, toY)
arrowX = toX + topX
arrowY = toY + topY
@ -473,18 +520,16 @@ export default {
ctx.lineWidth = this.lineWidth
ctx.beginPath()
ctx.strokeStyle = this.color
const start = this.scalePoint(e.data.handles.start)
const end = this.scalePoint(e.data.handles.end)
//
ctx.strokeRect(
// this.canvasMouseStart.x,
// this.canvasMouseStart.y,
// e.offsetX - this.canvasMouseStart.x,
// e.offsetY - this.canvasMouseStart.y
e.data.handles.start.x,
e.data.handles.start.y,
e.data.handles.end.x - e.data.handles.start.x,
e.data.handles.end.y - e.data.handles.start.y
start.x,
start.y,
end.x - start.x,
end.y - start.y
)
this.drawText(ctx, { x: e.data.handles.start.x, y: e.data.handles.start.y }, { x: e.data.handles.end.x, y: e.data.handles.end.y }, e.data.remark, this.color)
this.drawText(ctx, start, end, e.data.remark, this.color)
}
}
})
@ -495,6 +540,10 @@ export default {
if (e.button !== 0) {
return //
}
if (this.isDragging) {
this.stopDragging()
return
}
//
if (this.model === 'ArrowAnnotate' || this.model === 'RectangleRoi') {

View File

@ -1,18 +1,60 @@
<!-- eslint-disable -->
<!-- eslint-disable vue/no-unused-vars -->
<!-- eslint-disable vue/no-template-shadow -->
/* eslint-disable */
<template>
<el-form v-loading="loading">
<el-form v-loading="loading" :label-width="'100px'">
<!-- 仲裁对象 -->
<el-form-item :label="$t('trials:adRules:title:arbitrationRule')" :label-width="'180px'">
<el-radio-group v-model="JudgyInfo.ArbitrationRule" :disabled="OtherInfo.IsSign">
<el-form-item :label="$t('trials:adRules:title:arbitrationRule')">
<el-radio-group v-model="JudgyInfo.ArbitrationRule" :disabled="isSign">
<el-radio v-for="item of $d.ArbitrationRule" :key="item.id"
:disabled="!JudgyInfo.IsReadingTaskViewInOrder || true" :label="item.value" @change="changeArbitrationRule">
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-collapse v-model="activeNames" style="border-top:none;">
<!-- 仲裁模式JudgeModeEnum 整体结果择一判定指标组合判定-->
<el-form-item :label="$t('trials:adRules:title:judgeMode')">
<el-radio-group v-model="JudgyInfo.JudgeModeEnum" :disabled="isSign">
<el-radio
v-for="item of $d.JudgeMode"
:key="item.id"
:disabled="JudgyInfo.ArbitrationRule !== 1"
:label="item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- 裁判规则JudgeRuleEnum 访视一致规则访视差异规则-->
<el-form-item :label="$t('trials:adRules:title:judgeRule')">
<el-radio-group v-model="JudgyInfo.JudgeRuleEnum" :disabled="isSign">
<el-radio
v-for="item of $d.JudgeRule"
:key="item.id"
:label="item.value"
>
{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button
v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
type="primary"
size="small"
@click="saveJugeRule"
v-show="!isSign">
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
<ArbitrationRulesByVisit
v-if="judgeRuleEnum === 1"
ref="visitRules"
:trial-reading-criterion-id="trialReadingCriterionId"
:isSign="isSign"
/>
<el-collapse v-else-if="judgeRuleEnum === 0" v-model="activeNames" style="border-top:none;">
<el-collapse-item v-for="(item, index) of QuestionList" :key="item.ReadingQuestionTrialId"
style="position: relative;padding:0 10px;" :name="item.ReadingQuestionTrialId">
<div slot="title">
@ -21,24 +63,28 @@
<div style="position: relative">
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
style="position: absolute; right: 0; top: 0; z-index: 10" size="mini" type="primary"
:disabled="OtherInfo.IsSign" @click="apply(item.ReadingQuestionTrialId, index)">{{ $t('common:button:save')
:disabled="isSign" @click="apply(item.ReadingQuestionTrialId, index)">{{ $t('common:button:save')
}}</el-button>
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
style="position: absolute; right: 60px; top: 0; z-index: 10" size="mini" type="primary"
:disabled="OtherInfo.IsSign" @click="reset(item.ReadingQuestionTrialId, index)">{{ $t('common:button:reset')
:disabled="isSign" @click="reset(item.ReadingQuestionTrialId, index)">{{ $t('common:button:reset')
}}</el-button>
<!-- 产生裁判阅片的条件 -->
<el-form-item :label-width="'280px'" :label="$t('trials:adRules:title:judgeTypeEnum')" style="width: 95%">
<el-radio-group v-model="QuestionList[index].JudgeType" @input="(val) => JudgeTypeChange(val, index)">
<template v-for="item of $d.JudgeTypeEnum">
<el-radio style="margin-bottom: 5px" :key="item.id" :disabled="OtherInfo.IsSign ||
!hasPermi(['trials:trials-panel:setting:reading-unit:edit'])
" :label="item.value" v-if="
item.value < 4 ||
(item.value > 3 &&
(QuestionList[index].Type === 'number' ||
QuestionList[index].Type === 'calculation'))
">
<el-radio
style="margin-bottom: 5px"
:key="item.id"
:disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])"
:label="item.value"
v-if="
(['number', 'calculation'].includes(QuestionList[index].Type)
? [1, 4, 5]
: [1, 2, 3]
).includes(item.value)
"
>
{{ item.label }}
</el-radio>
</template>
@ -48,7 +94,7 @@
<div v-if="QuestionList[index].JudgeType === 3" style="text-align: right; margin: 10px 0">
<!-- 添加规则 -->
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']" size="mini" type="primary"
:disabled="OtherInfo.IsSign" @click="addGroup(index, null)">{{ $t('trials:adRules:button:addRule')
:disabled="isSign" @click="addGroup(index, null)">{{ $t('trials:adRules:button:addRule')
}}</el-button>
</div>
<el-table v-if="QuestionList[index].JudgeType === 3" v-loading="loading"
@ -87,10 +133,10 @@
<template slot-scope="scope">
<!-- 编辑 -->
<el-button icon="el-icon-edit" circle :title="$t('common:button:edit')" size="mini"
:disabled="OtherInfo.IsSign" @click="addGroup(index, scope.$index)" />
:disabled="isSign" @click="addGroup(index, scope.$index)" />
<!-- 删除 -->
<el-button icon="el-icon-delete" circle :title="$t('common:button:delete')" size="mini"
:disabled="OtherInfo.IsSign" @click="tagClose(index, scope.$index)" />
:disabled="isSign" @click="tagClose(index, scope.$index)" />
</template>
</el-table-column>
</el-table>
@ -103,12 +149,12 @@
">
<el-checkbox-group v-if="QuestionList[index].QuestionGenre === 3" v-model="QuestionList[index].grouping">
<template v-for="item of $d[QuestionList[index].DictionaryCode]">
<el-checkbox v-if="item.value !== -1" :key="item.id" :disabled="OtherInfo.IsSign" :label="item.value">{{
<el-checkbox v-if="item.value !== -1" :key="item.id" :disabled="isSign" :label="item.value">{{
item.label }}</el-checkbox>
</template>
</el-checkbox-group>
<el-checkbox-group v-else v-model="QuestionList[index].grouping">
<el-checkbox v-for="item of item.TypeValue.split('|')" :key="item" :disabled="OtherInfo.IsSign"
<el-checkbox v-for="item of item.TypeValue.split('|')" :key="item" :disabled="isSign"
:label="item">{{
item }}</el-checkbox>
</el-checkbox-group>
@ -135,7 +181,7 @@
.toString()
.replaceAll(',', '|')
}}</el-tag>
<el-button size="mini" type="primary" :disabled="OtherInfo.IsSign" @click="addGroup2(index)">
<el-button size="mini" type="primary" :disabled="isSign" @click="addGroup2(index)">
<!-- 添加分组 -->
{{ $t('trials:adRules:title:addGroup') }}
</el-button>
@ -181,7 +227,7 @@
)
" prop="JudgeDifferenceType">
<el-select v-model="QuestionList[index].JudgeDifferenceType" placeholder="请选择"
:disabled="OtherInfo.IsSign">
:disabled="isSign">
<el-option v-for="item of $d.JudgeDifferenceType" :key="item.id" :label="item.label"
:value="item.value">
</el-option>
@ -193,7 +239,7 @@
" prop="JudgeDifferenceValue">
<div style="display: flex">
<el-input v-model="QuestionList[index].JudgeDifferenceValue" clearable
:disabled="OtherInfo.IsSign"></el-input>
:disabled="isSign"></el-input>
<span style="margin-left: 10px" v-if="QuestionList[index].JudgeType !== 5 && QuestionList[index].Unit !== 0">
{{ `${QuestionList[index].Unit === 4 ? QuestionList[index].CustomUnit : $fd('ValueUnit', QuestionList[index].Unit)}`}}
</span>
@ -203,8 +249,6 @@
</div>
</el-collapse-item>
</el-collapse>
<!-- </el-tab-pane>-->
<!-- </el-tabs>-->
<!-- 选择答案 -->
<el-dialog v-if="QuestionVisible" :title="$t('trials:adRules:title:selectAnswer')" :visible.sync="QuestionVisible"
width="800px" :close-on-click-modal="false" custom-class="base-dialog-wrapper" append-to-body>
@ -212,40 +256,50 @@
<!-- 阅片人A -->
<el-form-item label-width="110px" :label="$t('trials:adRules:title:answerGroupA')">
<el-checkbox-group v-model="QuestionList[selectIndex].groupingA">
<template v-for="item of QuestionList[selectIndex].TypeValue.split('|')">
<el-checkbox v-if="QuestionList[selectIndex].QuestionGenre !== 3" :key="item" :label="item" :disabled="QuestionList[selectIndex].groupingB.length
? ~QuestionList[selectIndex].groupingB.indexOf(item)
: false
">{{ item }}</el-checkbox>
<template v-for="item of QuestionList[selectIndex].TypeValue.split('|') || []">
<el-checkbox
v-if="QuestionList[selectIndex].QuestionGenre !== 3"
:key="item"
:label="item"
:disabled="QuestionList[selectIndex]?.groupingB?.includes(item) ?? false"
>
{{ item }}
</el-checkbox>
</template>
<template v-for="item of $d[QuestionList[selectIndex].DictionaryCode]">
<el-checkbox v-if="
QuestionList[selectIndex].QuestionGenre === 3 &&
item.value !== -1
" :key="item.id" :label="item.value" :disabled="QuestionList[selectIndex].groupingB.length
? ~QuestionList[selectIndex].groupingB.indexOf(item.value)
: false
">{{ item.label }}</el-checkbox>
<el-checkbox
v-if="QuestionList[selectIndex].QuestionGenre === 3 && item.value !== -1"
:key="item.id"
:label="item.value"
:disabled="QuestionList[selectIndex]?.groupingB?.includes(item.value) ?? false"
>
{{ item.label }}
</el-checkbox>
</template>
</el-checkbox-group>
</el-form-item>
<!-- 阅片人B -->
<el-form-item label-width="110px" :label="$t('trials:adRules:title:answerGroupB')">
<el-checkbox-group v-model="QuestionList[selectIndex].groupingB">
<template v-for="item of QuestionList[selectIndex].TypeValue.split('|')">
<el-checkbox v-if="QuestionList[selectIndex].QuestionGenre !== 3" :key="item" :label="item" :disabled="QuestionList[selectIndex].groupingA.length
? ~QuestionList[selectIndex].groupingA.indexOf(item)
: false
">{{ item }}</el-checkbox>
<template v-for="item of QuestionList[selectIndex].TypeValue.split('|') || []">
<el-checkbox
v-if="QuestionList[selectIndex].QuestionGenre !== 3"
:key="item"
:label="item"
:disabled="QuestionList[selectIndex]?.groupingA?.includes(item) ?? false"
>
{{ item }}
</el-checkbox>
</template>
<template v-for="item of $d[QuestionList[selectIndex].DictionaryCode]">
<el-checkbox v-if="
QuestionList[selectIndex].QuestionGenre === 3 &&
item.value !== -1
" :key="item.id" :label="item.value" :disabled="QuestionList[selectIndex].groupingA.length
? ~QuestionList[selectIndex].groupingA.indexOf(item.value)
: false
">{{ item.label }}</el-checkbox>
<el-checkbox
v-if="QuestionList[selectIndex].QuestionGenre === 3 && item.value !== -1"
:key="item.id"
:label="item.value"
:disabled="QuestionList[selectIndex]?.groupingA?.includes(item.value) ?? false"
>
{{ item.label }}
</el-checkbox>
</template>
</el-checkbox-group>
</el-form-item>
@ -269,13 +323,17 @@
</el-form>
</template>
<script>
/* eslint-disable */
import {
getTrialConfirmCriterionList,
getTrialCriterionJudgeQuestionList,
setTrialCriterionJudgeQuestionAnswerGroup,
} from '@/api/trials/reading'
import { setTrialJudgyInfo, getTrialJudgyInfo } from '@/api/trials/setting'
import { setTrialJudgyInfo, getTrialJudgyInfo, setTrialJudgeRuleInfo } from '@/api/trials/setting'
import ArbitrationRulesByVisit from './ArbitrationRulesByVisit'
export default {
components: {
ArbitrationRulesByVisit,
},
props: {
trialReadingCriterionId: {
type: String,
@ -294,9 +352,7 @@ export default {
activeNames: null,
indexA: null,
type: null,
OtherInfo: {
IsSign: true,
},
isSign: true,
JudgyInfo: {},
JudgeDifferenceValueQRules: {
JudgeDifferenceType: [
@ -339,47 +395,25 @@ export default {
},
],
},
judgeRuleEnum: -1,
}
},
watch: {
TrialReadingCriterionId(v) {
async trialReadingCriterionId(v) {
if (v === null) return
this.loading = true
getTrialCriterionJudgeQuestionList({
TrialId: this.$route.query.trialId,
// ReadingQuestionCriterionTrialId: v,
TrialReadingCriterionId: this.trialReadingCriterionId,
})
.then((res) => {
this.loading = false
this.QuestionList = res.Result
this.OtherInfo = res.OtherInfo
this.activeNames = this.QuestionList.map(
(v) => v.ReadingQuestionTrialId
)
this.QuestionList.forEach((v) => {
this.$set(v, 'grouping', [])
this.$set(v, 'groupingA', [])
this.$set(v, 'groupingB', [])
this.$set(
v,
'AnswerGroupList',
Object.assign([], v.AnswerCombination)
)
this.$set(v, 'AnswerGroup2List', Object.assign([], v.AnswerGroup))
})
})
.catch(() => {
this.btnLoading = false
this.loading = false
})
await this.initData()
},
},
mounted() {
this.getList()
this.getTrialJudgyInfo()
async mounted() {
await this.initData()
},
methods: {
async initData() {
await this.getTrialJudgyInfo()
if (this.judgeRuleEnum !== 1) {
await this.getList()
}
},
//
changeArbitrationRule(value) {
if (value !== 1) {
@ -387,6 +421,9 @@ export default {
item.JudgeDifferenceValue = 0
item.JudgeDifferenceType = 0
})
if (this.$refs.visitRules) {
this.$refs.visitRules.changeArbitrationRule(value)
}
}
},
JudgeTypeChange(value, index) {
@ -400,25 +437,25 @@ export default {
})
},
saveAllSync() {
return new Promise((resolve, reject) => {
if (this.judgeRuleEnum === 1 && this.$refs.visitRules) {
return this.$refs.visitRules.saveAllSync()
}
return new Promise((resolve) => {
var arr = []
this.QuestionList.forEach((v, i) => {
arr.push(this.applySync(v.ReadingQuestionTrialId, i))
})
Promise.all(arr)
.then((res) => {
console.log(res)
.then(() => {
resolve(true)
})
.catch((res) => {
console.log('进入catch')
.catch(() => {
resolve(false)
})
})
},
applySync(ReadingQuestionTrialId, index) {
return new Promise(async (resolve, reject) => {
console.log(this.QuestionList[index].JudgeType)
if (this.QuestionList[index].JudgeType === 0) {
reject(false)
return
@ -442,7 +479,7 @@ export default {
this.QuestionList[index].JudgeType === 5
) {
try {
let validate = await this.$refs[
const validate = await this.$refs[
'JudgeDifferenceValue' +
this.QuestionList[index].JudgeType +
index
@ -493,19 +530,55 @@ export default {
this.loading = false
})
},
getTrialJudgyInfo() {
async getTrialJudgyInfo() {
try {
this.loading = true
getTrialJudgyInfo({
const res = await getTrialJudgyInfo({
TrialId: this.$route.query.trialId,
TrialReadingCriterionId: this.trialReadingCriterionId,
})
.then((res) => {
this.JudgyInfo = res.Result
this.judgeRuleEnum = this.JudgyInfo.JudgeRuleEnum
this.isSign = res.Result.IsSigned
} catch (e) {
console.log(e)
} finally {
this.loading = false
})
.catch((v) => {
}
},
async saveJugeRule(showMessage = true) {
try {
this.loading = true
const prevJudgeRuleEnum = this.judgeRuleEnum
const params = {
trialReadingCriterionId: this.trialReadingCriterionId,
judgeModeEnum: this.JudgyInfo.JudgeModeEnum,
judgeRuleEnum: this.JudgyInfo.JudgeRuleEnum,
}
const res = await setTrialJudgeRuleInfo(params)
if (res.IsSuccess) {
if (showMessage) {
this.$message.success(this.$t('common:message:savedSuccessfully'))
}
this.judgeRuleEnum = this.JudgyInfo.JudgeRuleEnum
if (prevJudgeRuleEnum !== this.judgeRuleEnum) {
if (this.judgeRuleEnum === 1) {
await this.$nextTick()
if (this.$refs.visitRules) {
await this.$refs.visitRules.initData()
}
} else {
await this.getList()
}
}
}
return true
} catch (e) {
console.log(e)
return false
} finally {
this.loading = false
})
}
},
tagClose2(index, indexA) {
// ''
@ -593,7 +666,7 @@ export default {
AnswerCombination: [],
JudgeType: 0,
JudgeDifferenceValue: 0,
JudgeDifferenceType: 0,
JudgeDifferenceType: 0
})
.then((res) => {
this.$set(this.QuestionList[index], 'AnswerGroup2List', [])
@ -635,7 +708,7 @@ export default {
this.QuestionList[index].JudgeType === 5
) {
try {
let validate = await this.$refs[
const validate = await this.$refs[
'JudgeDifferenceValue' + this.QuestionList[index].JudgeType + index
][0].validate()
if (!validate) return
@ -655,7 +728,7 @@ export default {
),
JudgeDifferenceType: Number(
this.QuestionList[index].JudgeDifferenceType
),
)
})
.then((res) => {
this.$message.success(this.$t('trials:adRules:message:msg9')) // ''
@ -672,17 +745,19 @@ export default {
this.CriterionList[this.index].ReadingQuestionCriterionTrialId
},
getList() {
if (this.judgeRuleEnum === 1 && this.$refs.visitRules) {
return this.$refs.visitRules.getList()
}
this.loading = true
getTrialCriterionJudgeQuestionList({
return getTrialCriterionJudgeQuestionList({
TrialId: this.$route.query.trialId,
TrialReadingCriterionId: this.trialReadingCriterionId,
})
.then((res) => {
this.loading = false
this.QuestionList = res.Result
this.OtherInfo = res.OtherInfo
this.activeNames = this.QuestionList.map(
(v) => v.ReadingQuestionTrialId
(item) => item.ReadingQuestionTrialId
)
this.QuestionList.forEach((v) => {
this.$set(v, 'grouping', [])

View File

@ -0,0 +1,632 @@
<template>
<div v-loading="loading">
<el-tabs v-model="activeVisitTab" class="visit-tabs" type="border-card">
<el-tab-pane v-for="visit in visitPlanOptions" :key="visit.Id"
:label="visit.VisitName" :name="visit.Id">
<el-collapse v-if="questionListMap[visit.Id]" v-model="visitActiveNamesMap[visit.Id]" style="border-top:none;">
<el-collapse-item v-for="(item, index) of questionListMap[visit.Id]"
:key="item.ReadingQuestionTrialId"
style="position: relative;padding:0 10px;" :name="item.ReadingQuestionTrialId">
<div slot="title">
{{ item.PageName }}Q{{ index + 1 }}{{ item.QuestionName }}
</div>
<div style="position: relative">
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
style="position: absolute; right: 0; top: 0; z-index: 10" size="mini" type="primary"
:disabled="isSign"
@click="visitApply(item.ReadingQuestionTrialId, index, visit.Id, visit.VisitNum)">{{ $t('common:button:save')
}}</el-button>
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']"
style="position: absolute; right: 60px; top: 0; z-index: 10" size="mini" type="primary"
:disabled="isSign"
@click="visitReset(item.ReadingQuestionTrialId, index, visit.Id, visit.VisitNum)">{{ $t('common:button:reset')
}}</el-button>
<el-form-item :label-width="'280px'" :label="$t('trials:adRules:title:judgeTypeEnum')" style="width: 95%">
<el-radio-group
v-model="questionListMap[visit.Id][index].JudgeType"
@input="(val) => visitJudgeTypeChange(val, index, visit.Id)"
>
<template v-for="judgeTypeItem of $d.JudgeTypeEnum">
<el-radio
style="margin-bottom: 5px"
:key="judgeTypeItem.id"
:disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])"
:label="judgeTypeItem.value"
v-if="
(['number', 'calculation'].includes(questionListMap[visit.Id][index].Type)
? [1, 4, 5, 6]
: [1, 2, 3, 6]
).includes(judgeTypeItem.value)
"
>
{{ judgeTypeItem.label }}
</el-radio>
</template>
</el-radio-group>
</el-form-item>
</div>
<div v-if="questionListMap[visit.Id][index].JudgeType === 3" style="text-align: right; margin: 10px 0">
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']" size="mini" type="primary"
:disabled="isSign"
@click="visitAddGroup(index, null, visit.Id)">{{ $t('trials:adRules:button:addRule')
}}</el-button>
</div>
<el-table v-if="questionListMap[visit.Id][index].JudgeType === 3" v-loading="loading"
:data="questionListMap[visit.Id][index].AnswerGroupList" border stripe>
<el-table-column prop="AnswerGroupA" :label="$t('trials:adRules:title:order')" width="160">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="AnswerGroupA" :label="$t('trials:adRules:title:answerGroupA')" min-width="100">
<template slot-scope="scope">
{{
questionListMap[visit.Id][index].QuestionGenre === 3
? scope.row.AnswerGroupA.map((v) =>
$fd(questionListMap[visit.Id][index].DictionaryCode, parseInt(v))
).toString()
: scope.row.AnswerGroupA.toString()
}}
</template>
</el-table-column>
<el-table-column prop="AnswerGroupB" :label="$t('trials:adRules:title:answerGroupB')" min-width="100">
<template slot-scope="scope">
{{
questionListMap[visit.Id][index].QuestionGenre === 3
? scope.row.AnswerGroupB.map((v) =>
$fd(questionListMap[visit.Id][index].DictionaryCode, parseInt(v))
).toString()
: scope.row.AnswerGroupB.toString()
}}
</template>
</el-table-column>
<el-table-column prop="AnswerGroupB" :label="$t('common:action:action')" min-width="80">
<template slot-scope="scope">
<el-button icon="el-icon-edit" circle :title="$t('common:button:edit')" size="mini"
:disabled="isSign"
@click="visitAddGroup(index, scope.$index, visit.Id)" />
<el-button icon="el-icon-delete" circle :title="$t('common:button:delete')" size="mini"
:disabled="isSign"
@click="visitTagClose(index, scope.$index, visit.Id)" />
</template>
</el-table-column>
</el-table>
<div v-if="questionListMap[visit.Id][index].JudgeType === 2">
<div style="
background: #f6f6f6;
border-radius: 20px;
padding: 15px 20px;
margin-top: 10px;
">
<el-checkbox-group v-if="questionListMap[visit.Id][index].QuestionGenre === 3"
v-model="questionListMap[visit.Id][index].grouping"
>
<template v-for="dictItem of $d[questionListMap[visit.Id][index].DictionaryCode]">
<el-checkbox v-if="dictItem.value !== -1" :key="dictItem.id" :disabled="isSign"
:label="dictItem.value">{{ dictItem.label }}</el-checkbox>
</template>
</el-checkbox-group>
<el-checkbox-group v-else v-model="questionListMap[visit.Id][index].grouping">
<el-checkbox v-for="answerItem of item.TypeValue.split('|')" :key="answerItem"
:disabled="isSign" :label="answerItem">{{ answerItem }}</el-checkbox>
</el-checkbox-group>
<div style="margin-top: 20px">
{{ $t('trials:adRules:title:selectAnswerGroup') }}
<el-tag v-if="
questionListMap[visit.Id][index].grouping.length > 0 &&
questionListMap[visit.Id][index].QuestionGenre !== 3
">{{
questionListMap[visit.Id][index].grouping.toString().replaceAll(',', '|')
}}</el-tag>
<el-tag v-if="
questionListMap[visit.Id][index].grouping.length > 0 &&
questionListMap[visit.Id][index].QuestionGenre === 3
">{{
questionListMap[visit.Id][index].grouping
.map(
(v) =>
$d[questionListMap[visit.Id][index].DictionaryCode].find(
(v1) => v1.value === v
).label
)
.toString()
.replaceAll(',', '|')
}}</el-tag>
<el-button size="mini" type="primary" :disabled="isSign"
@click="visitAddGroup2(index, visit.Id)">
{{ $t('trials:adRules:title:addGroup') }}</el-button>
</div>
</div>
<div v-if="questionListMap[visit.Id][index].QuestionGenre !== 3" style="margin-top: 20px">
{{ $t('trials:adRules:title:group') }}
<el-tag v-for="(itemA, indexA) of questionListMap[visit.Id][index].AnswerGroup2List"
:key="itemA" closable
style="margin-right: 10px" @close="() => visitTagClose2(index, indexA, visit.Id)">{{ itemA }}</el-tag>
</div>
<div v-if="questionListMap[visit.Id][index].QuestionGenre === 3" style="margin-top: 20px">
{{ $t('trials:adRules:title:group') }}
<el-tag v-for="(itemA, indexA) of questionListMap[visit.Id][index].AnswerGroup2List"
:key="itemA" closable
style="margin-right: 10px" @close="() => visitTagClose2(index, indexA, visit.Id)">
{{
itemA
.split('|')
.map((v) =>
$fd(questionListMap[visit.Id][index].DictionaryCode, parseInt(v))
)
.join('|')
}}
</el-tag>
</div>
</div>
<div v-if="
questionListMap[visit.Id][index].JudgeType === 4 ||
questionListMap[visit.Id][index].JudgeType === 5
">
<el-form :inline="true" :model="questionListMap[visit.Id][index]" class="demo-form-inline"
:ref="`JudgeDifferenceValue${questionListMap[visit.Id][index].JudgeType}_${visit.Id}_${index}`"
:rules="JudgeDifferenceValueQRules">
<el-form-item :label="$t(
`trials:trials-panel:setting:reading-unit:JudgeDifferenceType`
)
" prop="JudgeDifferenceType">
<el-select
v-model="questionListMap[visit.Id][index].JudgeDifferenceType"
:disabled="isSign">
<el-option v-for="judgeDiffItem of $d.JudgeDifferenceType" :key="judgeDiffItem.id"
:label="judgeDiffItem.label" :value="judgeDiffItem.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t(
`trials:trials-panel:setting:reading-unit:JudgeDifferenceValue${questionListMap[visit.Id][index].JudgeType}`
)
" prop="JudgeDifferenceValue">
<div style="display: flex">
<el-input v-model="questionListMap[visit.Id][index].JudgeDifferenceValue" clearable
:disabled="isSign"></el-input>
<span style="margin-left: 10px"
v-if="questionListMap[visit.Id][index].JudgeType !== 5 && questionListMap[visit.Id][index].Unit !== 0">
{{ `${questionListMap[visit.Id][index].Unit === 4 ? questionListMap[visit.Id][index].CustomUnit : $fd('ValueUnit', questionListMap[visit.Id][index].Unit)}` }}
</span>
</div>
</el-form-item>
</el-form>
</div>
</el-collapse-item>
</el-collapse>
</el-tab-pane>
</el-tabs>
<el-dialog v-if="questionVisible" :title="$t('trials:adRules:title:selectAnswer')" :visible.sync="questionVisible"
width="800px" :close-on-click-modal="false" custom-class="base-dialog-wrapper" append-to-body>
<div class="base-dialog-body">
<el-form-item label-width="110px" :label="$t('trials:adRules:title:answerGroupA')">
<el-checkbox-group v-model="questionList[selectIndex].groupingA">
<template v-for="item of questionList[selectIndex].TypeValue.split('|') || []">
<el-checkbox
v-if="questionList[selectIndex].QuestionGenre !== 3"
:key="item"
:label="item"
:disabled="questionList[selectIndex]?.groupingB?.includes(item) ?? false"
>
{{ item }}
</el-checkbox>
</template>
<template v-for="item of $d[questionList[selectIndex].DictionaryCode]">
<el-checkbox
v-if="questionList[selectIndex].QuestionGenre === 3 && item.value !== -1"
:key="item.id"
:label="item.value"
:disabled="questionList[selectIndex]?.groupingB?.includes(item.value) ?? false"
>{{ item.label }}</el-checkbox>
</template>
</el-checkbox-group>
</el-form-item>
<el-form-item label-width="110px" :label="$t('trials:adRules:title:answerGroupB')">
<el-checkbox-group v-model="questionList[selectIndex].groupingB">
<template v-for="item of questionList[selectIndex].TypeValue.split('|') || []">
<el-checkbox
v-if="questionList[selectIndex].QuestionGenre !== 3"
:key="item"
:label="item"
:disabled="questionList[selectIndex]?.groupingA?.includes(item) ?? false"
>
{{ item }}
</el-checkbox>
</template>
<template v-for="item of $d[questionList[selectIndex].DictionaryCode]">
<el-checkbox
v-if="questionList[selectIndex].QuestionGenre === 3 && item.value !== -1"
:key="item.id"
:label="item.value"
:disabled="questionList[selectIndex]?.groupingA?.includes(item.value) ?? false"
>
{{ item.label }}
</el-checkbox>
</template>
</el-checkbox-group>
</el-form-item>
</div>
<div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']" :disabled="btnLoading" size="small"
type="primary" @click="
questionVisible = false
$set(questionList[selectIndex], 'groupingA', [])
$set(questionList[selectIndex], 'groupingB', [])
">
{{ $t('common:button:cancel') }}
</el-button>
<el-button v-hasPermi="['trials:trials-panel:setting:reading-unit:edit']" :disabled="btnLoading" size="small"
type="primary" @click="save">
{{ $t('common:button:save') }}
</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
/* eslint-disable */
import {
getTrialQuestionVisitJudgeRule,
setTrialQuestionVisitJudgeRule,
} from '@/api/trials/reading'
import { getTrialVisitStageSelect } from '@/api/trials'
export default {
props: {
trialReadingCriterionId: {
type: String,
default: '',
},
isSign: {
type: Boolean,
required: true
}
},
data() {
return {
btnLoading: false,
loading: false,
activeVisitTab: '',
visitActiveNamesMap: {},
questionListMap: {},
visitPlanOptions: [],
questionVisible: false,
selectIndex: 0,
indexA: null,
selectVisitKey: '',
type: null,
OtherInfo: {
IsSign: true,
},
JudgeDifferenceValueQRules: {
JudgeDifferenceType: [
{
required: true,
message: this.$t(
'trials:trials-list:setitng:JudgeDifferenceTypeRequired'
),
trigger: 'blur',
},
],
JudgeDifferenceValue: [
{
required: true,
message: this.$t(
'trials:trials-list:setitng:JudgeDifferenceValueRequired'
),
trigger: 'blur',
},
{
pattern: /^[0-9]+(.[0-9]{2})?$/,
message: this.$t('trials:trials-list:setitng:JudgeDifferenceValue'),
trigger: 'blur',
},
{
validator: (rule, value, callback) => {
if (value <= 0) {
callback(
new Error(
this.$t(
'trials:trials-list:setitng:JudgeDifferenceValueMin'
)
)
)
} else {
callback()
}
},
trigger: 'blur',
},
],
},
}
},
computed: {
questionList() {
return this.questionListMap[this.selectVisitKey]
},
},
watch: {
async activeVisitTab(v) {
if (!v) return
if (this.questionListMap[v]) {
return
}
await this.getList(v)
},
},
async mounted() {
await this.initData()
},
methods: {
async initData() {
this.questionListMap = {}
this.visitActiveNamesMap = {}
this.activeVisitTab = ''
await this.getVisitPlanOptions()
},
normalizeQuestionList(questionList = []) {
return questionList.map((item) => ({
...item,
grouping: [],
groupingA: [],
groupingB: [],
AnswerGroupList: Array.isArray(item.AnswerCombination)
? item.AnswerCombination.map((group) => ({
...group,
AnswerGroupA: Array.isArray(group.AnswerGroupA)
? [...group.AnswerGroupA]
: group.AnswerGroupA,
AnswerGroupB: Array.isArray(group.AnswerGroupB)
? [...group.AnswerGroupB]
: group.AnswerGroupB
}))
: [],
AnswerGroup2List: Array.isArray(item.AnswerGroup)
? [...item.AnswerGroup]
: []
}))
},
async getVisitPlanOptions() {
try {
const trialId = this.$route.query.trialId
const res = await getTrialVisitStageSelect(trialId)
if (res.IsSuccess) {
this.visitPlanOptions = res.Result || []
if (!this.activeVisitTab && this.visitPlanOptions.length > 0) {
this.activeVisitTab = this.visitPlanOptions[0].Id
}
}
} catch (e) {
console.log(e)
}
},
getVisitById(visitKey) {
return this.visitPlanOptions.find((visit) => visit.Id === visitKey)
},
async getList(visitKey = this.activeVisitTab) {
const visit = this.getVisitById(visitKey)
if (!visit) return
try {
this.loading = true
let params = {
trialId: this.$route.query.trialId,
trialReadingCriterionId: this.trialReadingCriterionId,
visitNum: visit.VisitNum
}
const res = await getTrialQuestionVisitJudgeRule(params)
const questionList = this.normalizeQuestionList(res.Result)
this.$set(this.questionListMap, visitKey, questionList)
this.$set(
this.visitActiveNamesMap,
visitKey,
questionList.map((item) => item.ReadingQuestionTrialId)
)
} catch (e) {
console.log(e)
} finally {
this.loading = false
}
},
changeArbitrationRule(value) {
if (value !== 1) {
Object.values(this.questionListMap).forEach((questionList) => {
questionList.forEach((item) => {
item.JudgeDifferenceValue = 0
item.JudgeDifferenceType = 0
})
})
}
},
visitJudgeTypeChange(value, index, visitKey) {
this.$nextTick(() => {
if (value === 4 || value === 5) {
const refName = `JudgeDifferenceValue${value}_${visitKey}_${index}`
if (this.$refs[refName] && this.$refs[refName][0]) {
this.$refs[refName][0].resetFields()
}
}
})
},
saveAllSync() {
return Promise.resolve(true)
},
save() {
const questionList = this.questionList
let index = this.selectIndex
let indexA = this.indexA
if (questionList[index].groupingA.length === 0) {
this.$alert(this.$t('trials:adRules:message:msg2'))
return
}
if (questionList[index].groupingB.length === 0) {
this.$alert(this.$t('trials:adRules:message:msg3'))
return
}
if (this.type === 'add') {
questionList[index].AnswerGroupList.push({
AnswerGroupA: questionList[index].groupingA,
AnswerGroupB: questionList[index].groupingB
})
} else {
this.$set(
questionList[index].AnswerGroupList[indexA],
'AnswerGroupA',
questionList[index].groupingA
)
this.$set(
questionList[index].AnswerGroupList[indexA],
'AnswerGroupB',
questionList[index].groupingB
)
}
this.$set(questionList[index], 'groupingA', [])
this.$set(questionList[index], 'groupingB', [])
this.$message.success(this.$t('trials:adRules:message:msg4'))
this.questionVisible = false
},
visitTagClose2(index, indexA, visitKey) {
this.$confirm(this.$t('trials:adRules:message:msg1')).then(() => {
this.questionListMap[visitKey][index].AnswerGroup2List.splice(indexA, 1)
})
},
visitTagClose(index, indexA, visitKey) {
this.$confirm(this.$t('trials:adRules:message:msg1')).then(() => {
this.questionListMap[visitKey][index].AnswerGroupList.splice(indexA, 1)
})
},
visitAddGroup2(index, visitKey) {
const questionList = this.questionListMap[visitKey]
if (questionList[index].grouping.length === 0) {
this.$alert(this.$t('trials:adRules:message:msg5'))
return
}
let grouping = questionList[index].grouping
.toString()
.replaceAll(',', '|')
questionList[index].AnswerGroup2List.push(`|${grouping}|`)
this.$set(questionList[index], 'grouping', [])
},
visitAddGroup(index, indexA, visitKey) {
const questionList = this.questionListMap[visitKey]
this.selectIndex = index
this.selectVisitKey = visitKey
this.type = 'add'
if (indexA !== null) {
this.indexA = indexA
this.type = 'edit'
this.$set(
questionList[index],
'groupingA',
questionList[index].AnswerGroupList[indexA].AnswerGroupA
)
this.$set(
questionList[index],
'groupingB',
questionList[index].AnswerGroupList[indexA].AnswerGroupB
)
}
this.questionVisible = true
},
async visitReset(ReadingQuestionTrialId, index, visitKey, visitNum) {
const questionList = this.questionListMap[visitKey]
this.btnLoading = true
this.loading = true
try {
await this.$confirm(this.$t('trials:adRules:message:msg6'))
const params = {
TrialReadingCriterionId: this.trialReadingCriterionId,
VisitNum: visitNum,
QuestionList: [
{
ReadingQuestionTrialId: ReadingQuestionTrialId,
AnswerGroup: [],
AnswerCombination: [],
JudgeType: 0,
JudgeDifferenceValue: 0,
JudgeDifferenceType: 0
}
]
}
await setTrialQuestionVisitJudgeRule(params)
this.$set(questionList[index], 'AnswerGroup2List', [])
this.$set(questionList[index], 'AnswerGroupList', [])
this.$set(questionList[index], 'JudgeType', 0)
this.$set(questionList[index], 'JudgeDifferenceValue', 0)
this.$set(questionList[index], 'JudgeDifferenceType', 0)
this.$message.success(this.$t('trials:adRules:message:msg7'))
} catch(e) {
console.log(e)
} finally {
this.btnLoading = false
this.loading = false
}
},
async visitApply(ReadingQuestionTrialId, index, visitKey, visitNum) {
try {
const questionList = this.questionListMap[visitKey]
if (questionList[index].JudgeType === 0) {
this.$alert(this.$t('trials:adRules:message:msg8'))
return
}
if (
questionList[index].JudgeType === 2 &&
questionList[index].AnswerGroup2List.length === 0
) {
this.$alert(this.$t('trials:adRules:message:msg8'))
return
}
if (
questionList[index].JudgeType === 3 &&
questionList[index].AnswerGroupList.length === 0
) {
this.$alert(this.$t('trials:adRules:message:msg8'))
return
}
if (
questionList[index].JudgeType === 4 ||
questionList[index].JudgeType === 5
) {
const refName = `JudgeDifferenceValue${questionList[index].JudgeType}_${visitKey}_${index}`
const validate = await this.$refs[refName][0].validate()
if (!validate) return
}
this.btnLoading = true
this.loading = true
let params = {
TrialReadingCriterionId: this.trialReadingCriterionId,
VisitNum: visitNum,
QuestionList: [
{
ReadingQuestionTrialId: ReadingQuestionTrialId,
AnswerGroup: questionList[index].AnswerGroup2List,
AnswerCombination: questionList[index].AnswerGroupList,
JudgeType: questionList[index].JudgeType,
JudgeDifferenceValue: questionList[index].JudgeDifferenceValue,
JudgeDifferenceType: questionList[index].JudgeDifferenceType
}
]
}
let res = await setTrialQuestionVisitJudgeRule(params)
if (res.IsSuccess) {
this.$message.success(this.$t('trials:adRules:message:msg9'))
}
} catch(e) {
console.log(e)
} finally {
this.btnLoading = false
this.loading = false
}
}
},
}
</script>
<style scoped>
.visit-tabs ::v-deep .el-tabs__content {
min-height: 520px;
padding-top: 20px !important;
}
</style>

View File

@ -240,7 +240,6 @@ export default {
if (ReadingTool === 3) {
this.readingSegmentTools = getCustomizeStandardsSegmentDicomTools(readingSegmentTools)
}
console.log(this.readingSegmentTools, 'this.readingSegmentTools')
},
setIsClinicalReading(isClinicalReading) {
this.isClinicalReading = isClinicalReading;
@ -300,11 +299,15 @@ export default {
this.$refs["arbitrationRules" + this.TrialReadingCriterionId]
.length
) {
var arbitrationRules = await this.$refs[
const arbitrationRulesRef = this.$refs[
"arbitrationRules" + this.TrialReadingCriterionId
][0].saveAllSync();
][0];
var judgeRuleSaved = await arbitrationRulesRef.saveJugeRule(false);
var arbitrationRules = judgeRuleSaved
? await arbitrationRulesRef.saveAllSync()
: false;
isCheckList.push({
isCheck: arbitrationRules,
isCheck: judgeRuleSaved && arbitrationRules,
msg: this.$t("trials:readingUnit:adRules"), // ''
});
}