待阅列表添加双屏
continuous-integration/drone/push Build is passing Details

main
wangxiaoshuang 2025-09-04 13:49:10 +08:00
parent 038f477d9e
commit 6d0b3928ee
1 changed files with 132 additions and 339 deletions

View File

@ -1,15 +1,8 @@
<template>
<BaseContainer
v-loading="loading"
style="height: 100%; background-color: #fff"
>
<BaseContainer v-loading="loading" style="height: 100%; background-color: #fff">
<el-tabs v-model="TrialReadingCriterionId" type="border-card">
<el-tab-pane
v-for="i in trialCriterionList"
:key="i.TrialReadingCriterionId"
:label="i.TrialReadingCriterionName"
:name="i.TrialReadingCriterionId"
>
<el-tab-pane v-for="i in trialCriterionList" :key="i.TrialReadingCriterionId" :label="i.TrialReadingCriterionName"
:name="i.TrialReadingCriterionId">
<div v-if="TrialReadingCriterionId === i.TrialReadingCriterionId">
<div slot="search-container" style="position: relative">
<el-form :inline="true">
@ -31,57 +24,24 @@
</el-form-item> -->
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:reviewTrack:table:subjectCode')">
<el-input
v-model="searchData.SubjectCode"
style="width: 100px"
clearable
/>
<el-input v-model="searchData.SubjectCode" style="width: 100px" clearable />
</el-form-item>
<!-- 患者编号 -->
<el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input
v-model="searchData.PatientIdStr"
style="width: 140px"
clearable
/>
<el-input v-model="searchData.PatientIdStr" style="width: 140px" clearable />
</el-form-item>
<!-- 患者姓名 -->
<el-form-item
:label="$t('trials:uploadDicomList:table:patientName')"
>
<el-input
v-model="searchData.SubjectName"
style="width: 140px"
clearable
/>
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.SubjectName" style="width: 140px" clearable />
</el-form-item>
<!-- 访视名称 -->
<el-form-item
style="margin-bottom: 10px"
:label="$t('trials:adReview:table:visitName')"
>
<el-input
v-model="searchData.TaskName"
style="width: 140px"
clearable
/>
<el-form-item style="margin-bottom: 10px" :label="$t('trials:adReview:table:visitName')">
<el-input v-model="searchData.TaskName" style="width: 140px" clearable />
</el-form-item>
<!-- 任务状态 -->
<el-form-item
style="margin-bottom: 10px"
:label="$t('trials:readTask:table:taskState')"
>
<el-select
v-model="searchData.TaskState"
clearable
style="width: 120px"
>
<el-option
v-for="i of $d.TaskState"
:key="'TaskState' + i.label"
:value="i.value"
:label="i.label"
/>
<el-form-item style="margin-bottom: 10px" :label="$t('trials:readTask:table:taskState')">
<el-select v-model="searchData.TaskState" clearable style="width: 120px">
<el-option v-for="i of $d.TaskState" :key="'TaskState' + i.label" :value="i.value" :label="i.label" />
</el-select>
</el-form-item>
<!-- 任务类型 -->
@ -104,65 +64,35 @@
</el-form-item> -->
<!-- 签名时间 -->
<el-form-item :label="$t('trials:readTask:table:signTime')">
<el-date-picker
v-model="dateValue"
type="datetimerange"
range-separator="-"
<el-date-picker v-model="dateValue" type="datetimerange" range-separator="-"
:start-placeholder="$t('trials:uploadClinicalData:table:beginDate')"
:end-placeholder="$t('trials:uploadClinicalData:table:endDate')"
clearable
:default-time="['00:00:00', '23:59:59']"
>
:end-placeholder="$t('trials:uploadClinicalData:table:endDate')" clearable
:default-time="['00:00:00', '23:59:59']">
</el-date-picker>
</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') }}
</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') }}
</el-button>
</el-form-item>
</el-form>
</div>
<div slot="main-container">
<el-table
v-adaptive="{ bottomOffset: 75 }"
:data="list"
stripe
height="100"
@sort-change="handleSortChange"
>
<el-table v-adaptive="{ bottomOffset: 75 }" :data="list" stripe height="100"
@sort-change="handleSortChange">
<!-- 受试者编号 -->
<el-table-column
prop="SubjectCode"
min-width="100"
:label="$t('trials:reviewTrack:table:subjectCode')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="SubjectCode" min-width="100" :label="$t('trials:reviewTrack:table:subjectCode')"
show-overflow-tooltip sortable="custom" />
<!-- 患者编号 -->
<el-table-column
prop="PatientIdStr"
min-width="100"
:label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
>
<el-table-column prop="PatientIdStr" min-width="100" :label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip>
<template slot-scope="scope">
<span
v-for="(item, index) in scope.row.PatientList"
:key="`${index}${item.PatientId}`"
>
<span v-for="(item, index) in scope.row.PatientList" :key="`${index}${item.PatientId}`">
{{
index === scope.row.PatientList.length - 1
? item.PatientIdStr
@ -172,37 +102,18 @@
</template>
</el-table-column>
<!-- 患者姓名 -->
<el-table-column
prop="SubjectShortName"
min-width="100"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column prop="SubjectShortName" min-width="100"
:label="$t('trials:uploadDicomList:table:patientName')" show-overflow-tooltip sortable="custom" />
<!-- 访视名称 -->
<el-table-column
prop="TaskName"
:label="$t('trials:adReview:table:visitName')"
min-width="100"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column prop="TaskName" :label="$t('trials:adReview:table:visitName')" min-width="100"
sortable="custom" show-overflow-tooltip />
<!-- 阅片标准 -->
<el-table-column
prop="TrialReadingCriterionName"
:label="$t('trials:adReview:table:TrialReadingCriterionName')"
min-width="100"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column prop="TrialReadingCriterionName"
:label="$t('trials:adReview:table:TrialReadingCriterionName')" min-width="100" sortable="custom"
show-overflow-tooltip />
<!-- 任务状态 -->
<el-table-column
prop="TaskState"
:label="$t('trials:readTask:table:taskState')"
min-width="100"
sortable="custom"
show-overflow-tooltip
>
<el-table-column prop="TaskState" :label="$t('trials:readTask:table:taskState')" min-width="100"
sortable="custom" show-overflow-tooltip>
<template slot-scope="scope">
<el-tag v-if="scope.row.TaskState === 0" type="primary">{{
$fd('TaskState', scope.row.TaskState)
@ -245,13 +156,8 @@
</template>
</el-table-column> -->
<!-- 签名时间 -->
<el-table-column
prop="SignTime"
min-width="120"
:label="$t('trials:readTask:table:signTime')"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column prop="SignTime" min-width="120" :label="$t('trials:readTask:table:signTime')"
sortable="custom" show-overflow-tooltip />
<!-- 打包状态 -->
<!-- <el-table-column
prop="PackState"
@ -303,113 +209,63 @@
</template>
</el-table-column> -->
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
min-width="140"
fixed="right"
v-if="
<el-table-column :label="$t('common:action:action')" min-width="140" fixed="right" v-if="
hasPermi([
'trials:readTask:view',
'trials:readTask:reread',
'trials:readTask:report',
'trials:readTask:auditRecord',
])
"
>
">
<template slot-scope="scope">
<!-- 查看 -->
<el-button
v-hasPermi="['trials:readTask:view']"
circle
:title="$t('trials:readTask:button:view')"
icon="el-icon-view"
@click="handleReadImage(scope.row)"
/>
<el-button v-hasPermi="['trials:readTask:view']" circle :title="$t('trials:readTask:button:view')"
icon="el-icon-view" @click="handleReadImage(scope.row)" />
<!-- 重阅 -->
<el-button
v-hasPermi="['trials:readTask:reread']"
circle
:disabled="scope.row.TaskState > 0"
:title="$t('trials:readTask:button:reread')"
icon="el-icon-collection"
@click="openApplyReReading(scope.row)"
/>
<el-button v-hasPermi="['trials:readTask:reread']" circle :disabled="scope.row.TaskState > 0"
:title="$t('trials:readTask:button:reread')" icon="el-icon-collection"
@click="openApplyReReading(scope.row)" />
<!--肿瘤负荷报告-->
<el-button
circle
v-hasPermi="['trials:readTask:report']"
icon="el-icon-document"
<el-button circle v-hasPermi="['trials:readTask:report']" icon="el-icon-document"
:title="$t('trials:trials-panel:hirVisit:EvaluationReport')"
@click="handleCommand('showReport', scope.row, 'evaluate')"
:disabled="scope.row.ReadingTaskState !== 2"
/>
:disabled="scope.row.ReadingTaskState !== 2" />
<!--疗效评估报告-->
<el-button
circle
v-hasPermi="['trials:readTask:report']"
icon="el-icon-document"
<el-button circle v-hasPermi="['trials:readTask:report']" icon="el-icon-document"
:title="$t('trials:trials-panel:hirVisit:TumorReport')"
@click="handleCommand('showReport', scope.row, 'tumor')"
:disabled="scope.row.ReadingTaskState !== 2"
/>
:disabled="scope.row.ReadingTaskState !== 2" />
<!--下载影像-->
<el-button
circle
v-hasPermi="['trials:readTask:report']"
icon="el-icon-download"
:loading="downloading"
:title="$t('trials:reading:button:uploadImages')"
@click="
<el-button circle v-hasPermi="['trials:readTask:report']" icon="el-icon-download"
:loading="downloading" :title="$t('trials:reading:button:uploadImages')" @click="
handleCommand(
'getDownloadSubjectVisitStudyInfo',
scope.row
)
"
/>
" />
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
@pagination="getList" />
</div>
</div>
</el-tab-pane>
</el-tabs>
<el-dialog
v-if="ApplyforReasonVisible"
:title="$t('trials:readTask:dagTitle:apply')"
:visible.sync="ApplyforReasonVisible"
width="1460px"
append-to-body
:close-on-click-modal="false"
custom-class="base-dialog-wrapper"
>
<el-form
ref="reasonForm"
:rules="rules"
:model="ApplyforReasonForm"
class="demo-ruleForm"
size="small"
label-width="380px"
>
<el-dialog v-if="ApplyforReasonVisible" :title="$t('trials:readTask:dagTitle:apply')"
:visible.sync="ApplyforReasonVisible" width="1460px" append-to-body :close-on-click-modal="false"
custom-class="base-dialog-wrapper">
<el-form ref="reasonForm" :rules="rules" :model="ApplyforReasonForm" class="demo-ruleForm" size="small"
label-width="380px">
<!-- 申请原因 -->
<el-divider content-position="left">{{
$t('trials:readTask:title:applyReason')
}}</el-divider>
<!-- 申请原因 -->
<el-form-item
:label="$t('trials:readTask:title:applyReason')"
prop="Type"
:rules="[
<el-form-item :label="$t('trials:readTask:title:applyReason')" prop="Type" :rules="[
{ required: true, message: $t('common:ruleMessage:select') },
]"
>
]">
<el-radio-group v-model="ApplyforReasonForm.Type">
<!-- 阅片记录错误 -->
<el-radio :label="1">{{
@ -422,36 +278,19 @@
</el-radio-group>
</el-form-item>
<!-- 备注 -->
<el-form-item
v-if="ApplyforReasonForm.Type === 2"
:label="$t('trials:readTask:title:remark')"
prop="RequestReReadingReason"
>
<el-input
v-model="ApplyforReasonForm.RequestReReadingReason"
type="textarea"
style="width: 400px"
:autosize="{ minRows: 2, maxRows: 4 }"
:placeholder="$t('common:ruleMessage:specify')"
maxlength="500"
show-word-limit
/>
<el-form-item v-if="ApplyforReasonForm.Type === 2" :label="$t('trials:readTask:title:remark')"
prop="RequestReReadingReason">
<el-input v-model="ApplyforReasonForm.RequestReReadingReason" type="textarea" style="width: 400px"
:autosize="{ minRows: 2, maxRows: 4 }" :placeholder="$t('common:ruleMessage:specify')" maxlength="500"
show-word-limit />
</el-form-item>
<!-- 是否复制阅片表单 -->
<el-form-item
:label="$t('trials:readTask:title:copyForm')"
prop="IsCopyOrigenalForms"
:rules="[
<el-form-item :label="$t('trials:readTask:title:copyForm')" prop="IsCopyOrigenalForms" :rules="[
{ required: true, message: $t('common:ruleMessage:select') },
]"
>
]">
<el-radio-group v-model="ApplyforReasonForm.IsCopyOrigenalForms">
<el-radio
v-for="item of $d.YesOrNo"
:key="`IsCopyOrigenalForms${item.raw.Id}`"
:label="item.value"
>{{ item.label }}</el-radio
>
<el-radio v-for="item of $d.YesOrNo" :key="`IsCopyOrigenalForms${item.raw.Id}`" :label="item.value">{{
item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
@ -459,42 +298,22 @@
<el-divider content-position="left">{{
$t('trials:readTask:title:influenceList')
}}</el-divider>
<div
style="
<div style="
padding: 10px;
border: 1px solid #e0e0e0;
max-height: 650px;
overflow-y: auto;
"
>
<el-table
v-loading="loading"
:data="InfluenceTaskList"
stripe
height="100"
style="min-height: 400px"
>
">
<el-table v-loading="loading" :data="InfluenceTaskList" stripe height="100" style="min-height: 400px">
<!-- 任务编号 -->
<el-table-column
prop="TaskCode"
:label="$t('trials:readTask:table:taskCode')"
min-width="100"
show-overflow-tooltip
/>
<el-table-column prop="TaskCode" :label="$t('trials:readTask:table:taskCode')" min-width="100"
show-overflow-tooltip />
<!-- 中心编号 -->
<el-table-column
prop="TrialSiteCode"
:label="$t('trials:readTask:table:siteCode')"
min-width="100"
show-overflow-tooltip
/>
<el-table-column prop="TrialSiteCode" :label="$t('trials:readTask:table:siteCode')" min-width="100"
show-overflow-tooltip />
<!-- 受试者编号 -->
<el-table-column
prop="SubjectCode"
:label="$t('trials:readTask:table:subjectCode')"
min-width="120"
show-overflow-tooltip
/>
<el-table-column prop="SubjectCode" :label="$t('trials:readTask:table:subjectCode')" min-width="120"
show-overflow-tooltip />
<!-- <el-table-column
prop="VisitTaskNum"
label="访视/阅片期名称"
@ -506,26 +325,14 @@
</template>
</el-table-column> -->
<!-- 盲态任务标识 -->
<el-table-column
prop="TaskName"
:label="$t('trials:readTask:table:TaskName')"
min-width="120"
show-overflow-tooltip
/>
<el-table-column prop="TaskName" :label="$t('trials:readTask:table:TaskName')" min-width="120"
show-overflow-tooltip />
<!-- 阅片标准 -->
<el-table-column
prop="TrialReadingCriterionName"
:label="$t('trials:readTask:table:criterionName')"
min-width="100"
show-overflow-tooltip
/>
<el-table-column prop="TrialReadingCriterionName" :label="$t('trials:readTask:table:criterionName')"
min-width="100" show-overflow-tooltip />
<!-- 任务状态 -->
<el-table-column
prop="TaskState"
:label="$t('trials:readTask:table:taskState')"
min-width="100"
show-overflow-tooltip
>
<el-table-column prop="TaskState" :label="$t('trials:readTask:table:taskState')" min-width="100"
show-overflow-tooltip>
<template slot-scope="scope">
<el-tag v-if="scope.row.TaskState === 0" type="primary">{{
$fd('TaskState', scope.row.TaskState)
@ -567,12 +374,8 @@
</template>
</el-table-column> -->
<!-- 阅片状态 -->
<el-table-column
prop="ReadingTaskState"
:label="$t('trials:readTask:table:readingTaskState')"
min-width="100"
show-overflow-tooltip
>
<el-table-column prop="ReadingTaskState" :label="$t('trials:readTask:table:readingTaskState')" min-width="100"
show-overflow-tooltip>
<template slot-scope="scope">
<el-tag v-if="scope.row.ReadingTaskState === 2" type="primary">{{
$fd('ReadingTaskState', scope.row.ReadingTaskState)
@ -583,12 +386,8 @@
</template>
</el-table-column>
<!-- 生效后影响 -->
<el-table-column
prop="OptType"
:label="$t('trials:readTask:table:optType')"
min-width="100"
show-overflow-tooltip
>
<el-table-column prop="OptType" :label="$t('trials:readTask:table:optType')" min-width="100"
show-overflow-tooltip>
<template slot-scope="scope">
<el-tag v-if="scope.row.OptType === 0" type="primary">{{
$fd('ReReadingOrBackOptType', scope.row.OptType)
@ -602,12 +401,8 @@
</template>
</el-table-column>
<!-- 阅片人 -->
<el-table-column
prop="UserName"
:label="$t('trials:readTask:table:reader')"
min-width="160"
show-overflow-tooltip
>
<el-table-column prop="UserName" :label="$t('trials:readTask:table:reader')" min-width="160"
show-overflow-tooltip>
<template v-if="scope.row.DoctorUser" slot-scope="scope">
{{ scope.row.DoctorUser.UserName }}({{
scope.row.DoctorUser.FullName
@ -618,42 +413,23 @@
</div>
<div slot="footer" class="dialog-footer">
<!-- 取消 -->
<el-button
:disabled="btnLoading"
size="small"
type="primary"
@click="
<el-button :disabled="btnLoading" size="small" type="primary" @click="
ApplyforReasonVisible = false
ApplyforReasonForm = { Type: null, RequestReReadingReason: null }
"
>
">
{{ $t('common:button:cancel') }}
</el-button>
<!-- 保存 -->
<el-button
:loading="btnLoading"
size="small"
type="primary"
@click="applyReReading"
>
<el-button :loading="btnLoading" size="small" type="primary" @click="applyReReading">
{{ $t('common:button:save') }}
</el-button>
</div>
</el-dialog>
<!-- 审核记录 -->
<el-dialog
v-if="auditRecordVisible"
:visible.sync="auditRecordVisible"
:close-on-click-modal="false"
custom-class="base-dialog-wrapper"
:title="`审核记录(${currentRow.SubjectCode} | ${currentRow.TaskName}`"
width="600px"
>
<ChatForm
:row-data="currentRow"
@getList="getList"
@close="auditRecordVisible = false"
/>
<el-dialog v-if="auditRecordVisible" :visible.sync="auditRecordVisible" :close-on-click-modal="false"
custom-class="base-dialog-wrapper" :title="`审核记录(${currentRow.SubjectCode} | ${currentRow.TaskName}`"
width="600px">
<ChatForm :row-data="currentRow" @getList="getList" @close="auditRecordVisible = false" />
</el-dialog>
</BaseContainer>
</template>
@ -671,10 +447,12 @@ import ChatForm from './components/ChatForm'
import { getToken } from '@/utils/auth'
import { showReadReport, showTumorReport } from '@/api/export'
import { downLoadFile } from '@/utils/stream.js'
import { getAutoCutNextTask } from '@/api/user'
import {
getDownloadSubjectVisitStudyInfo,
downloadImageSuccess,
} from '@/api/trials.js'
import { openWindow } from "@/utils/splitScreen";
const searchDataDefault = () => {
return {
SubjectCode: '',
@ -852,10 +630,8 @@ export default {
series.InstanceList.forEach((instance) => {
let fileName = instance.Path.split('/').pop()
let obj = {
name: `${data.SubjectCode}_${data.VisitName}/${
study.StudyCode
}_${study.StudyTime.split(' ')[0]}_${
series.Modality
name: `${data.SubjectCode}_${data.VisitName}/${study.StudyCode
}_${study.StudyTime.split(' ')[0]}_${series.Modality
}/${fileName}`,
url: this.OSSclientConfig.basePath + instance.Path,
}
@ -929,7 +705,7 @@ export default {
this.dateValue = []
this.getList()
},
handleReadImage(row) {
async handleReadImage(row) {
if (this.openWindow) {
this.openWindow.close()
}
@ -950,7 +726,24 @@ export default {
path = `/noneDicomReading?TrialReadingCriterionId=${row.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&visitTaskId=${row.Id}&isReadingTaskViewInOrder=${row.IsReadingTaskViewInOrder}&criterionType=${row.CriterionType}&readingTool=${row.ReadingTool}&TokenKey=${token}`
}
var routeData = this.$router.resolve({ path })
this.openWindow = window.open(routeData.href, '_blank')
const res = await getAutoCutNextTask()
let IsDoubleScreen = false
if (res.IsSuccess) {
IsDoubleScreen = res.Result.IsDoubleScreen
}
if (IsDoubleScreen) {
this.openWindow = await openWindow(routeData.href)
if (!this.openWindow) {
let html = `<div><span>${this.$t("trials:reading:tip:MultiScreen2")}</span><a style="color:#409EFF"
href="/screen.pdf"
target="blank">${this.$t("trials:reading:tip:openFile")}</a></div>`
let confirm = await this.$confirm(html, '', { dangerouslyUseHTMLString: true })
if (!confirm) return false
this.openWindow = await openWindow(routeData.href, '', true)
}
} else {
this.openWindow = window.open(routeData.href, "_blank");
}
},
async openApplyReReading(row) {
try {