|
|
|
|
@ -6,63 +6,43 @@ |
|
|
|
|
<el-card class="left-card" shadow="never"> |
|
|
|
|
<div slot="header" class="card-header"> |
|
|
|
|
<span>超声影像</span> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-plus" |
|
|
|
|
@click="handleOpenFile" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<el-button type="text" icon="el-icon-plus" @click="handleOpenFile" :disabled="form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
"> |
|
|
|
|
新增 |
|
|
|
|
</el-button> |
|
|
|
|
</div> |
|
|
|
|
<el-table |
|
|
|
|
:data="form.attachment" |
|
|
|
|
:show-header="false" |
|
|
|
|
height="calc(100vh - 239px)" |
|
|
|
|
@row-dblclick="handleAttachmentClick" |
|
|
|
|
> |
|
|
|
|
<el-table :data="form.attachment" :show-header="false" height="calc(100vh - 239px)" |
|
|
|
|
@row-dblclick="handleAttachmentClick"> |
|
|
|
|
<el-table-column align="center"> |
|
|
|
|
<template slot-scope="scope"> |
|
|
|
|
<div |
|
|
|
|
class="img-wrapper" |
|
|
|
|
@click="handleImageClick(scope.row)" |
|
|
|
|
@dblclick="handleAttachmentClick(scope.row)" |
|
|
|
|
> |
|
|
|
|
<el-image |
|
|
|
|
:src=" |
|
|
|
|
$store.state.user.netConfig.MINIO_ENDPOINT_HTTPS + |
|
|
|
|
<div class="img-wrapper" @click="handleImageClick(scope.row)" |
|
|
|
|
@dblclick="handleAttachmentClick(scope.row)"> |
|
|
|
|
<el-image v-if="!isVideoFile(scope.row)" :src="$store.state.user.netConfig.MINIO_ENDPOINT_HTTPS + |
|
|
|
|
scope.row.bucket_compress + |
|
|
|
|
'/' + |
|
|
|
|
scope.row.object_compress |
|
|
|
|
" fit="cover" style="width: 100px; height: 80px; pointer-events: none" /> |
|
|
|
|
<div v-else class="video-thumb-wrapper"> |
|
|
|
|
<video :src="$store.state.user.netConfig.MINIO_ENDPOINT_HTTPS + |
|
|
|
|
scope.row.bucket_compress + |
|
|
|
|
'/' + |
|
|
|
|
scope.row.object_compress |
|
|
|
|
" |
|
|
|
|
fit="cover" |
|
|
|
|
style="width: 100px; height: 80px; pointer-events: none" |
|
|
|
|
/> |
|
|
|
|
" preload="metadata" |
|
|
|
|
style="width: 100px; height: 80px; object-fit: cover; pointer-events: none" /> |
|
|
|
|
<i class="el-icon-video-play video-play-icon"></i> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="img-status">上传完成</div> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-delete" |
|
|
|
|
@click="handleDeleteImg(scope.row, scope.$index)" |
|
|
|
|
v-if=" |
|
|
|
|
<el-button type="text" icon="el-icon-delete" @click="handleDeleteImg(scope.row, scope.$index)" v-if=" |
|
|
|
|
form.status == 1 || form.status == 5 || form.status == 15 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
"> |
|
|
|
|
删除 |
|
|
|
|
</el-button> |
|
|
|
|
</template> |
|
|
|
|
</el-table-column> |
|
|
|
|
</el-table> |
|
|
|
|
<input |
|
|
|
|
ref="fileInput" |
|
|
|
|
type="file" |
|
|
|
|
multiple |
|
|
|
|
accept="image/*" |
|
|
|
|
style="display: none" |
|
|
|
|
@change="handleFileChange" |
|
|
|
|
/> |
|
|
|
|
<input ref="fileInput" type="file" multiple accept="image/*,video/*" style="display: none" |
|
|
|
|
@change="handleFileChange" /> |
|
|
|
|
</el-card> |
|
|
|
|
</el-col> |
|
|
|
|
<!-- 中间:报告表单 --> |
|
|
|
|
@ -87,56 +67,34 @@ |
|
|
|
|
}} |
|
|
|
|
</span> |
|
|
|
|
<div class="btn-group"> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-check" |
|
|
|
|
@click="handlePass()" |
|
|
|
|
v-if="form.status == 10 && form.reviewer_id == userInfo.id" |
|
|
|
|
> |
|
|
|
|
<el-button type="text" icon="el-icon-check" @click="handlePass()" |
|
|
|
|
v-if="form.status == 10 && form.reviewer_id == userInfo.id"> |
|
|
|
|
审核通过 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-close" |
|
|
|
|
@click="handleReject()" |
|
|
|
|
v-if="form.status == 10 && form.reviewer_id == userInfo.id" |
|
|
|
|
> |
|
|
|
|
<el-button type="text" icon="el-icon-close" @click="handleReject()" |
|
|
|
|
v-if="form.status == 10 && form.reviewer_id == userInfo.id"> |
|
|
|
|
审核拒绝 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-check" |
|
|
|
|
@click=" |
|
|
|
|
<el-button type="text" icon="el-icon-check" @click=" |
|
|
|
|
handleSave( |
|
|
|
|
'您确定暂存病例吗,暂存会保存您当前的内容修改', |
|
|
|
|
{ ...form, submit_type: 0 }, |
|
|
|
|
'暂存成功' |
|
|
|
|
) |
|
|
|
|
" |
|
|
|
|
v-if="form.status == 1 || form.status == 5 || form.status == 15" |
|
|
|
|
> |
|
|
|
|
" v-if="form.status == 1 || form.status == 5 || form.status == 15"> |
|
|
|
|
暂存 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-check" |
|
|
|
|
@click=" |
|
|
|
|
<el-button type="text" icon="el-icon-check" @click=" |
|
|
|
|
handleSave( |
|
|
|
|
'您确定提交病例吗,提交成功之后不可再编辑', |
|
|
|
|
{ ...form, submit_type: 1 }, |
|
|
|
|
'提交成功' |
|
|
|
|
) |
|
|
|
|
" |
|
|
|
|
v-if="form.status == 1 || form.status == 5 || form.status == 15" |
|
|
|
|
> |
|
|
|
|
" v-if="form.status == 1 || form.status == 5 || form.status == 15"> |
|
|
|
|
提交 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-printer" |
|
|
|
|
@click="handlePrint" |
|
|
|
|
v-if="form.status == 10 || form.status == 20" |
|
|
|
|
> |
|
|
|
|
<el-button type="text" icon="el-icon-printer" @click="handlePrint" |
|
|
|
|
v-if="form.status == 10 || form.status == 20"> |
|
|
|
|
打印 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button type="text" icon="el-icon-close" @click="handleClose"> |
|
|
|
|
@ -152,15 +110,13 @@ |
|
|
|
|
<el-form ref="form" :model="form" label-width="90px"> |
|
|
|
|
<el-row :gutter="20" class="green-line" id="anchor-top"> |
|
|
|
|
<el-col :span="20"> |
|
|
|
|
<div |
|
|
|
|
style=" |
|
|
|
|
<div style=" |
|
|
|
|
text-align: center; |
|
|
|
|
vertical-align: middle; |
|
|
|
|
color: #606266; |
|
|
|
|
box-sizing: border-box; |
|
|
|
|
font-weight: 700; |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
"> |
|
|
|
|
远程超声检查报告 |
|
|
|
|
</div> |
|
|
|
|
</el-col> |
|
|
|
|
@ -188,11 +144,7 @@ |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-col> |
|
|
|
|
<el-col :span="3"> |
|
|
|
|
<el-form-item |
|
|
|
|
label="年龄" |
|
|
|
|
prop="patient_age" |
|
|
|
|
label-width="60px" |
|
|
|
|
> |
|
|
|
|
<el-form-item label="年龄" prop="patient_age" label-width="60px"> |
|
|
|
|
{{ form.patient_age }} |
|
|
|
|
{{ |
|
|
|
|
form.patient_age_type |
|
|
|
|
@ -251,125 +203,81 @@ |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-col> |
|
|
|
|
</el-row> |
|
|
|
|
<el-row :gutter="20"> |
|
|
|
|
<el-col |
|
|
|
|
:span="6" |
|
|
|
|
v-for="(item, idx) in form.attachment" |
|
|
|
|
:key="idx" |
|
|
|
|
v-show="item.showInDoc == 1" |
|
|
|
|
> |
|
|
|
|
<el-form-item> |
|
|
|
|
<el-image |
|
|
|
|
:src=" |
|
|
|
|
$store.state.user.netConfig.MINIO_ENDPOINT_HTTPS + |
|
|
|
|
<!-- 影像区域 --> |
|
|
|
|
<el-row :gutter="20" class="imaging-row"> |
|
|
|
|
<el-row :span="24" style="display: flex;justify-content: center;"> |
|
|
|
|
<el-form-item class="imaging-item" v-for="(item, idx) in form.attachment" |
|
|
|
|
v-show="item.showInDoc == 1" :key="idx"> |
|
|
|
|
<el-image v-if="!isVideoFile(item)" :src="$store.state.user.netConfig.MINIO_ENDPOINT_HTTPS + |
|
|
|
|
item.bucket_compress + |
|
|
|
|
'/' + |
|
|
|
|
item.object_compress |
|
|
|
|
" |
|
|
|
|
fit="cover" |
|
|
|
|
:preview-src-list="[ |
|
|
|
|
" fit="cover" :preview-src-list="[ |
|
|
|
|
$store.state.user.netConfig.MINIO_ENDPOINT_HTTPS + |
|
|
|
|
item.bucket_compress + |
|
|
|
|
'/' + |
|
|
|
|
item.object_compress, |
|
|
|
|
]" |
|
|
|
|
style="width: 100px; height: 80px" |
|
|
|
|
/> |
|
|
|
|
]" style="width: 100px; height: 80px" /> |
|
|
|
|
<div v-else class="video-thumb-wrapper"> |
|
|
|
|
<video :src="$store.state.user.netConfig.MINIO_ENDPOINT_HTTPS + |
|
|
|
|
item.bucket_compress + |
|
|
|
|
'/' + |
|
|
|
|
item.object_compress |
|
|
|
|
" preload="metadata" controls style="width: 100px; height: 80px; object-fit: cover" /> |
|
|
|
|
</div> |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-col> |
|
|
|
|
</el-row> |
|
|
|
|
<!-- <el-col :span="6"> |
|
|
|
|
|
|
|
|
|
</el-col> --> |
|
|
|
|
<el-col :span="24" id="anchor-comment"> |
|
|
|
|
<el-form-item label="超声所见"> |
|
|
|
|
<el-input |
|
|
|
|
v-model="form.text_comment" |
|
|
|
|
type="textarea" |
|
|
|
|
:rows="9" |
|
|
|
|
:readonly=" |
|
|
|
|
form.status != 1 && |
|
|
|
|
<el-input v-model="form.text_comment" type="textarea" :rows="9" :readonly="form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
form.status != 15 |
|
|
|
|
" |
|
|
|
|
/> |
|
|
|
|
" /> |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-col> |
|
|
|
|
<el-col :span="24" id="anchor-conclusion"> |
|
|
|
|
<el-form-item label="检查结论"> |
|
|
|
|
<el-input |
|
|
|
|
v-model="form.text_conclusion" |
|
|
|
|
type="textarea" |
|
|
|
|
:rows="4" |
|
|
|
|
:readonly=" |
|
|
|
|
form.status != 1 && |
|
|
|
|
<el-input v-model="form.text_conclusion" type="textarea" :rows="4" :readonly="form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
form.status != 15 |
|
|
|
|
" |
|
|
|
|
/> |
|
|
|
|
" /> |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-col> |
|
|
|
|
<el-col :span="24" id="anchor-expert"> |
|
|
|
|
<el-form-item label="专家意见" /> |
|
|
|
|
</el-col> |
|
|
|
|
<el-col |
|
|
|
|
:span="24" |
|
|
|
|
v-for="(item, idx) in form.experts" |
|
|
|
|
:key="idx" |
|
|
|
|
class="expert-item" |
|
|
|
|
> |
|
|
|
|
<el-col :span="24" v-for="(item, idx) in form.experts" :key="idx" class="expert-item"> |
|
|
|
|
<el-form-item :label="item.expert_name"> |
|
|
|
|
<el-input |
|
|
|
|
v-model="item.user_comment" |
|
|
|
|
type="textarea" |
|
|
|
|
:rows="3" |
|
|
|
|
:readonly=" |
|
|
|
|
(form.status != 1 && |
|
|
|
|
<el-input v-model="item.user_comment" type="textarea" :rows="3" :readonly="(form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
form.status != 15) || |
|
|
|
|
item.confirm > 0 || |
|
|
|
|
item.expert_id != userInfo.id |
|
|
|
|
" |
|
|
|
|
/> |
|
|
|
|
" /> |
|
|
|
|
<div class="expert-btns"> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-document-copy" |
|
|
|
|
:disabled=" |
|
|
|
|
(form.status != 1 && |
|
|
|
|
<el-button type="text" icon="el-icon-document-copy" :disabled="(form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
form.status != 15) || |
|
|
|
|
!item.user_comment || |
|
|
|
|
!item.user_comment.trim() |
|
|
|
|
" |
|
|
|
|
@click="handleCopyAllExpertComments(item)" |
|
|
|
|
> |
|
|
|
|
" @click="handleCopyAllExpertComments(item)"> |
|
|
|
|
全部复制 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-check" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && |
|
|
|
|
<el-button type="text" icon="el-icon-check" :disabled="form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
form.status != 15 |
|
|
|
|
" |
|
|
|
|
v-if=" |
|
|
|
|
" v-if=" |
|
|
|
|
item.confirm == 0 && item.expert_id == userInfo.id |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
"> |
|
|
|
|
一键同意 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-check" |
|
|
|
|
disabled |
|
|
|
|
v-else-if="item.confirm > 0" |
|
|
|
|
> |
|
|
|
|
<el-button type="text" icon="el-icon-check" disabled v-else-if="item.confirm > 0"> |
|
|
|
|
专家已确认 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-warning" |
|
|
|
|
disabled |
|
|
|
|
v-else |
|
|
|
|
> |
|
|
|
|
<el-button type="text" icon="el-icon-warning" disabled v-else> |
|
|
|
|
待确认 |
|
|
|
|
</el-button> |
|
|
|
|
</div> |
|
|
|
|
@ -384,31 +292,17 @@ |
|
|
|
|
|
|
|
|
|
<el-col :span="6"> |
|
|
|
|
<el-form-item label="审核人"> |
|
|
|
|
<el-select |
|
|
|
|
v-model="form.reviewer_id" |
|
|
|
|
clearable |
|
|
|
|
filterable |
|
|
|
|
style="width: 100%" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && |
|
|
|
|
<el-select v-model="form.reviewer_id" clearable filterable style="width: 100%" :disabled="form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
form.status != 15 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<el-option |
|
|
|
|
v-for="item in reviewersList" |
|
|
|
|
:key="item.id" |
|
|
|
|
:label="item.name" |
|
|
|
|
:value="item.id" |
|
|
|
|
> |
|
|
|
|
"> |
|
|
|
|
<el-option v-for="item in reviewersList" :key="item.id" :label="item.name" :value="item.id"> |
|
|
|
|
<span style="float: left">{{ item.name }}</span> |
|
|
|
|
<span |
|
|
|
|
style=" |
|
|
|
|
<span style=" |
|
|
|
|
float: right; |
|
|
|
|
color: #8492a6; |
|
|
|
|
font-size: 13px; |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
"> |
|
|
|
|
{{ item.username }} |
|
|
|
|
</span> |
|
|
|
|
</el-option> |
|
|
|
|
@ -417,15 +311,10 @@ |
|
|
|
|
</el-col> |
|
|
|
|
<el-col :span="12" id="anchor-bottom"> |
|
|
|
|
<el-form-item> |
|
|
|
|
<el-checkbox |
|
|
|
|
:checked="form.negative === 0" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && |
|
|
|
|
<el-checkbox :checked="form.negative === 0" :disabled="form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
form.status != 15 |
|
|
|
|
" |
|
|
|
|
@change="(val) => (form.negative = val ? 0 : 1)" |
|
|
|
|
> |
|
|
|
|
" @change="(val) => (form.negative = val ? 0 : 1)"> |
|
|
|
|
阳性 |
|
|
|
|
</el-checkbox> |
|
|
|
|
</el-form-item> |
|
|
|
|
@ -435,39 +324,19 @@ |
|
|
|
|
</div> |
|
|
|
|
<div class="anchor-nav"> |
|
|
|
|
<el-button type="text" /> |
|
|
|
|
<el-button |
|
|
|
|
type="primary" |
|
|
|
|
circle |
|
|
|
|
@click="scrollToAnchor('anchor-top')" |
|
|
|
|
> |
|
|
|
|
<el-button type="primary" circle @click="scrollToAnchor('anchor-top')"> |
|
|
|
|
顶 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="primary" |
|
|
|
|
circle |
|
|
|
|
@click="scrollToAnchor('anchor-comment')" |
|
|
|
|
> |
|
|
|
|
<el-button type="primary" circle @click="scrollToAnchor('anchor-comment')"> |
|
|
|
|
述 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="primary" |
|
|
|
|
circle |
|
|
|
|
@click="scrollToAnchor('anchor-conclusion')" |
|
|
|
|
> |
|
|
|
|
<el-button type="primary" circle @click="scrollToAnchor('anchor-conclusion')"> |
|
|
|
|
诊 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="primary" |
|
|
|
|
circle |
|
|
|
|
@click="scrollToAnchor('anchor-expert')" |
|
|
|
|
> |
|
|
|
|
<el-button type="primary" circle @click="scrollToAnchor('anchor-expert')"> |
|
|
|
|
专 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="primary" |
|
|
|
|
circle |
|
|
|
|
@click="scrollToAnchor('anchor-bottom')" |
|
|
|
|
> |
|
|
|
|
<el-button type="primary" circle @click="scrollToAnchor('anchor-bottom')"> |
|
|
|
|
底 |
|
|
|
|
</el-button> |
|
|
|
|
</div> |
|
|
|
|
@ -480,100 +349,42 @@ |
|
|
|
|
<el-tabs v-model="activeTab"> |
|
|
|
|
<el-tab-pane label="部位模板" name="template"> |
|
|
|
|
<div class="template-buttons"> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-plus" |
|
|
|
|
@click="openTemplateDialog({})" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<el-button type="text" icon="el-icon-plus" @click="openTemplateDialog({})" :disabled="form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
"> |
|
|
|
|
新增 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-delete" |
|
|
|
|
@click="deleteTemplate(templateForm)" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && |
|
|
|
|
<el-button type="text" icon="el-icon-delete" @click="deleteTemplate(templateForm)" :disabled="form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
templateForm.id != undefined |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
"> |
|
|
|
|
删除 |
|
|
|
|
</el-button> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-edit" |
|
|
|
|
@click="openTemplateDialog(templateForm)" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && |
|
|
|
|
<el-button type="text" icon="el-icon-edit" @click="openTemplateDialog(templateForm)" :disabled="form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
templateForm.id != undefined |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
"> |
|
|
|
|
编辑 |
|
|
|
|
</el-button> |
|
|
|
|
</div> |
|
|
|
|
<el-form |
|
|
|
|
label-position="top" |
|
|
|
|
:model="templateForm" |
|
|
|
|
class="template-form" |
|
|
|
|
> |
|
|
|
|
<el-form label-position="top" :model="templateForm" class="template-form"> |
|
|
|
|
<el-form-item> |
|
|
|
|
<el-select |
|
|
|
|
v-model="templateForm.id" |
|
|
|
|
style="width: 100%" |
|
|
|
|
@change="changeTemplate" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<el-option |
|
|
|
|
v-for="item in templateList" |
|
|
|
|
:key="item.id" |
|
|
|
|
:label="item.name" |
|
|
|
|
:value="item.id" |
|
|
|
|
/> |
|
|
|
|
<el-select v-model="templateForm.id" style="width: 100%" @change="changeTemplate" :disabled="form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
"> |
|
|
|
|
<el-option v-for="item in templateList" :key="item.id" :label="item.name" :value="item.id" /> |
|
|
|
|
</el-select> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="超声所见"> |
|
|
|
|
<el-input |
|
|
|
|
v-model="templateForm.comment" |
|
|
|
|
type="textarea" |
|
|
|
|
readonly |
|
|
|
|
:rows="13" |
|
|
|
|
placeholder="请输入超声所见" |
|
|
|
|
/> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-check" |
|
|
|
|
@click="handleComment" |
|
|
|
|
style="float: right" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<el-input v-model="templateForm.comment" type="textarea" readonly :rows="13" placeholder="请输入超声所见" /> |
|
|
|
|
<el-button type="text" icon="el-icon-check" @click="handleComment" style="float: right" :disabled="form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
"> |
|
|
|
|
应用 |
|
|
|
|
</el-button> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="检查结论"> |
|
|
|
|
<el-input |
|
|
|
|
v-model="templateForm.conclusion" |
|
|
|
|
type="textarea" |
|
|
|
|
readonly |
|
|
|
|
:rows="4" |
|
|
|
|
placeholder="请输入检查结论" |
|
|
|
|
/> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-check" |
|
|
|
|
@click="handleCnclusion" |
|
|
|
|
style="float: right" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
<el-input v-model="templateForm.conclusion" type="textarea" readonly :rows="4" |
|
|
|
|
placeholder="请输入检查结论" /> |
|
|
|
|
<el-button type="text" icon="el-icon-check" @click="handleCnclusion" style="float: right" :disabled="form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
"> |
|
|
|
|
应用 |
|
|
|
|
</el-button> |
|
|
|
|
</el-form-item> |
|
|
|
|
@ -582,45 +393,26 @@ |
|
|
|
|
<!-- ✅ 片语功能改造 --> |
|
|
|
|
<el-tab-pane label="片语" name="phrase"> |
|
|
|
|
<div class="phrase-buttons"> |
|
|
|
|
<el-button |
|
|
|
|
type="text" |
|
|
|
|
icon="el-icon-plus" |
|
|
|
|
@click=" |
|
|
|
|
<el-button type="text" icon="el-icon-plus" @click=" |
|
|
|
|
handleAddPhrase({ |
|
|
|
|
id: 0, |
|
|
|
|
phrase: '', |
|
|
|
|
}) |
|
|
|
|
" |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
" :disabled="form.status != 1 && form.status != 5 && form.status != 15 |
|
|
|
|
"> |
|
|
|
|
新增 |
|
|
|
|
</el-button> |
|
|
|
|
</div> |
|
|
|
|
<el-table |
|
|
|
|
:data="phraseList" |
|
|
|
|
style="width: 100%" |
|
|
|
|
:show-header="false" |
|
|
|
|
height="calc(100vh - 266px)" |
|
|
|
|
> |
|
|
|
|
<el-table-column |
|
|
|
|
prop="phrase" |
|
|
|
|
label="内容" |
|
|
|
|
show-overflow-tooltip |
|
|
|
|
/> |
|
|
|
|
<el-table :data="phraseList" style="width: 100%" :show-header="false" height="calc(100vh - 266px)"> |
|
|
|
|
<el-table-column prop="phrase" label="内容" show-overflow-tooltip /> |
|
|
|
|
<el-table-column label="操作" width="50"> |
|
|
|
|
<template slot-scope="scope"> |
|
|
|
|
<el-dropdown |
|
|
|
|
:disabled=" |
|
|
|
|
form.status != 1 && |
|
|
|
|
<el-dropdown :disabled="form.status != 1 && |
|
|
|
|
form.status != 5 && |
|
|
|
|
form.status != 15 |
|
|
|
|
" |
|
|
|
|
@command=" |
|
|
|
|
" @command=" |
|
|
|
|
(command) => handlePhraseCommand(command, scope.row) |
|
|
|
|
" |
|
|
|
|
> |
|
|
|
|
"> |
|
|
|
|
<el-button type="text" icon="el-icon-more" /> |
|
|
|
|
<el-dropdown-menu slot="dropdown"> |
|
|
|
|
<el-dropdown-item command="edit"> |
|
|
|
|
@ -647,32 +439,12 @@ |
|
|
|
|
</el-row> |
|
|
|
|
|
|
|
|
|
<!-- 模板弹窗:新增 + 编辑 共用 --> |
|
|
|
|
<el-dialog |
|
|
|
|
:title="dialogTitle" |
|
|
|
|
:visible.sync="templateDialogOpen" |
|
|
|
|
width="33%" |
|
|
|
|
> |
|
|
|
|
<el-form |
|
|
|
|
:model="newTemplateForm" |
|
|
|
|
:rules="templateFormRules" |
|
|
|
|
ref="templateFormRef" |
|
|
|
|
label-width="80px" |
|
|
|
|
> |
|
|
|
|
<el-dialog :title="dialogTitle" :visible.sync="templateDialogOpen" width="33%"> |
|
|
|
|
<el-form :model="newTemplateForm" :rules="templateFormRules" ref="templateFormRef" label-width="80px"> |
|
|
|
|
<el-form-item label="检查部位" prop="part_id"> |
|
|
|
|
<el-select |
|
|
|
|
v-model="newTemplateForm.part_id" |
|
|
|
|
style="width: 100%" |
|
|
|
|
placeholder="请选择检查部位" |
|
|
|
|
filterable |
|
|
|
|
clearable |
|
|
|
|
> |
|
|
|
|
<el-select v-model="newTemplateForm.part_id" style="width: 100%" placeholder="请选择检查部位" filterable clearable> |
|
|
|
|
<el-option-group v-for="group in partIdList" :key="group.id"> |
|
|
|
|
<el-option |
|
|
|
|
v-for="item in group.child" |
|
|
|
|
:key="item.id" |
|
|
|
|
:label="item.name" |
|
|
|
|
:value="item.id" |
|
|
|
|
> |
|
|
|
|
<el-option v-for="item in group.child" :key="item.id" :label="item.name" :value="item.id"> |
|
|
|
|
<span style="float: left">{{ item.name }}</span> |
|
|
|
|
<span style="float: right; color: #8492a6; font-size: 13px"> |
|
|
|
|
{{ group.name }} |
|
|
|
|
@ -682,26 +454,13 @@ |
|
|
|
|
</el-select> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="标题" prop="name"> |
|
|
|
|
<el-input |
|
|
|
|
v-model="newTemplateForm.name" |
|
|
|
|
placeholder="请输入模板标题" |
|
|
|
|
/> |
|
|
|
|
<el-input v-model="newTemplateForm.name" placeholder="请输入模板标题" /> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="超声所见"> |
|
|
|
|
<el-input |
|
|
|
|
type="textarea" |
|
|
|
|
:rows="6" |
|
|
|
|
v-model="newTemplateForm.comment" |
|
|
|
|
placeholder="请输入超声所见" |
|
|
|
|
/> |
|
|
|
|
<el-input type="textarea" :rows="6" v-model="newTemplateForm.comment" placeholder="请输入超声所见" /> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="检查结论"> |
|
|
|
|
<el-input |
|
|
|
|
type="textarea" |
|
|
|
|
:rows="6" |
|
|
|
|
v-model="newTemplateForm.conclusion" |
|
|
|
|
placeholder="请输入检查结论" |
|
|
|
|
/> |
|
|
|
|
<el-input type="textarea" :rows="6" v-model="newTemplateForm.conclusion" placeholder="请输入检查结论" /> |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-form> |
|
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
|
@ -711,19 +470,9 @@ |
|
|
|
|
</el-dialog> |
|
|
|
|
<!-- ✅ 片语弹窗:创建 + 更新 共用 --> |
|
|
|
|
<el-dialog :title="phraseTitle" :visible.sync="phraseOpen" width="33%"> |
|
|
|
|
<el-form |
|
|
|
|
ref="phraseFormRef" |
|
|
|
|
:model="phraseForm" |
|
|
|
|
:rules="phraseRules" |
|
|
|
|
label-width="60px" |
|
|
|
|
> |
|
|
|
|
<el-form ref="phraseFormRef" :model="phraseForm" :rules="phraseRules" label-width="60px"> |
|
|
|
|
<el-form-item label="内容" prop="phrase"> |
|
|
|
|
<el-input |
|
|
|
|
type="textarea" |
|
|
|
|
:rows="10" |
|
|
|
|
v-model="phraseForm.phrase" |
|
|
|
|
placeholder="请输入片语内容" |
|
|
|
|
/> |
|
|
|
|
<el-input type="textarea" :rows="10" v-model="phraseForm.phrase" placeholder="请输入片语内容" /> |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-form> |
|
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
|
@ -733,27 +482,12 @@ |
|
|
|
|
</el-dialog> |
|
|
|
|
|
|
|
|
|
<!-- 分享弹窗 - 选择联系人 --> |
|
|
|
|
<CreateGroupDialog |
|
|
|
|
ref="createGroupDialogRef" |
|
|
|
|
title="选择人员" |
|
|
|
|
:min-select-count="1" |
|
|
|
|
@confirm="handleShareToContacts" |
|
|
|
|
/> |
|
|
|
|
<CreateGroupDialog ref="createGroupDialogRef" title="选择人员" :min-select-count="1" @confirm="handleShareToContacts" /> |
|
|
|
|
<!-- 驳回原因弹窗 --> |
|
|
|
|
<el-dialog title="审核拒绝" :visible.sync="rejectDialogOpen" width="30%"> |
|
|
|
|
<el-form |
|
|
|
|
:model="rejectReason" |
|
|
|
|
label-width="80px" |
|
|
|
|
ref="rejectFormRef" |
|
|
|
|
:rules="rejectRules" |
|
|
|
|
> |
|
|
|
|
<el-form :model="rejectReason" label-width="80px" ref="rejectFormRef" :rules="rejectRules"> |
|
|
|
|
<el-form-item label="拒绝理由" prop="comment"> |
|
|
|
|
<el-input |
|
|
|
|
type="textarea" |
|
|
|
|
:rows="4" |
|
|
|
|
v-model="rejectReason.comment" |
|
|
|
|
placeholder="请输入拒绝理由" |
|
|
|
|
/> |
|
|
|
|
<el-input type="textarea" :rows="4" v-model="rejectReason.comment" placeholder="请输入拒绝理由" /> |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-form> |
|
|
|
|
<div slot="footer" class="dialog-footer"> |
|
|
|
|
@ -764,16 +498,12 @@ |
|
|
|
|
<!-- 打印预览弹窗 --> |
|
|
|
|
<UltrasoundReportPrint ref="UltrasoundReportPrintRef" /> |
|
|
|
|
|
|
|
|
|
<!-- 图片预览弹窗 --> |
|
|
|
|
<el-dialog |
|
|
|
|
:visible.sync="imagePreviewVisible" |
|
|
|
|
title="影像预览" |
|
|
|
|
width="80%" |
|
|
|
|
top="3vh" |
|
|
|
|
destroy-on-close |
|
|
|
|
> |
|
|
|
|
<!-- 图片/视频预览弹窗 --> |
|
|
|
|
<el-dialog :visible.sync="imagePreviewVisible" title="影像预览" width="80%" top="3vh" destroy-on-close> |
|
|
|
|
<div class="image-preview-body"> |
|
|
|
|
<img :src="imagePreviewUrl" alt="预览" /> |
|
|
|
|
<img v-if="imagePreviewType === 'image'" :src="imagePreviewUrl" alt="预览" /> |
|
|
|
|
<video v-else-if="imagePreviewType === 'video'" :src="imagePreviewUrl" controls autoplay |
|
|
|
|
style="max-width: 100%; max-height: 75vh; outline: none" /> |
|
|
|
|
</div> |
|
|
|
|
</el-dialog> |
|
|
|
|
</div> |
|
|
|
|
@ -901,6 +631,7 @@ export default { |
|
|
|
|
// ====================== 图片预览 ====================== |
|
|
|
|
imagePreviewVisible: false, |
|
|
|
|
imagePreviewUrl: "", |
|
|
|
|
imagePreviewType: "image", // 'image' | 'video' |
|
|
|
|
imageClickTimer: null, |
|
|
|
|
}; |
|
|
|
|
}, |
|
|
|
|
@ -971,6 +702,20 @@ export default { |
|
|
|
|
], |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
{ |
|
|
|
|
description: "Videos", |
|
|
|
|
accept: { |
|
|
|
|
"video/*": [ |
|
|
|
|
".mp4", |
|
|
|
|
".avi", |
|
|
|
|
".mov", |
|
|
|
|
".wmv", |
|
|
|
|
".flv", |
|
|
|
|
".mkv", |
|
|
|
|
".webm", |
|
|
|
|
], |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
], |
|
|
|
|
}); |
|
|
|
|
// 逐个上传选中的文件 |
|
|
|
|
@ -992,10 +737,12 @@ export default { |
|
|
|
|
this.$refs.fileInput.click(); |
|
|
|
|
}, |
|
|
|
|
async handleFileChange(event) { |
|
|
|
|
const file = event.target.files[0]; |
|
|
|
|
if (!file) return; |
|
|
|
|
const files = event.target.files; |
|
|
|
|
if (!files || files.length === 0) return; |
|
|
|
|
try { |
|
|
|
|
for (const file of files) { |
|
|
|
|
await this.uploadImageToMinIO(file); |
|
|
|
|
} |
|
|
|
|
} catch (error) { |
|
|
|
|
console.error("超声影像上传失败:", error); |
|
|
|
|
this.$modal.msgError("超声影像上传失败: " + error.message); |
|
|
|
|
@ -1057,10 +804,33 @@ export default { |
|
|
|
|
clearTimeout(this.imageClickTimer); |
|
|
|
|
this.imageClickTimer = null; |
|
|
|
|
} |
|
|
|
|
// 视频:双击打开预览弹窗,不插入影像区域 |
|
|
|
|
if (this.isVideoFile(row)) { |
|
|
|
|
this.imagePreviewUrl = |
|
|
|
|
this.$store.state.user.netConfig.MINIO_ENDPOINT_HTTPS + |
|
|
|
|
row.bucket_compress + |
|
|
|
|
"/" + |
|
|
|
|
row.object_compress; |
|
|
|
|
this.imagePreviewType = "video"; |
|
|
|
|
this.imagePreviewVisible = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 图片:双击插入影像区域 |
|
|
|
|
row.showInDoc = 1; |
|
|
|
|
}, |
|
|
|
|
// 图片单击预览(300ms 内无双击则触发) |
|
|
|
|
// 判断文件是否为视频类型 |
|
|
|
|
isVideoFile(row) { |
|
|
|
|
const videoExts = ["mp4", "avi", "mov", "wmv", "flv", "mkv", "webm"]; |
|
|
|
|
const ext = (row.object_compress || "") |
|
|
|
|
.split(".") |
|
|
|
|
.pop() |
|
|
|
|
.toLowerCase(); |
|
|
|
|
return videoExts.includes(ext); |
|
|
|
|
}, |
|
|
|
|
// 图片单击预览(300ms 内无双击则触发,视频单击不触发) |
|
|
|
|
handleImageClick(row) { |
|
|
|
|
// 视频不响应单击 |
|
|
|
|
if (this.isVideoFile(row)) return; |
|
|
|
|
if (this.imageClickTimer) { |
|
|
|
|
clearTimeout(this.imageClickTimer); |
|
|
|
|
this.imageClickTimer = null; |
|
|
|
|
@ -1073,6 +843,7 @@ export default { |
|
|
|
|
row.bucket_compress + |
|
|
|
|
"/" + |
|
|
|
|
row.object_compress; |
|
|
|
|
this.imagePreviewType = "image"; |
|
|
|
|
this.imagePreviewVisible = true; |
|
|
|
|
}, 300); |
|
|
|
|
}, |
|
|
|
|
@ -1611,9 +1382,11 @@ export default { |
|
|
|
|
background: #f0f0f0 !important; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.el-form-item { |
|
|
|
|
margin-bottom: 5px !important; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* 内部滚动区域高度自适应 */ |
|
|
|
|
.report-form { |
|
|
|
|
height: calc(100vh - 239px); |
|
|
|
|
@ -1699,6 +1472,7 @@ export default { |
|
|
|
|
padding: 5px; |
|
|
|
|
box-sizing: border-box; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* 锚点导航:垂直排列,靠右固定,不滚动 */ |
|
|
|
|
.anchor-nav { |
|
|
|
|
display: flex; |
|
|
|
|
@ -1729,4 +1503,47 @@ export default { |
|
|
|
|
display: inline-block; |
|
|
|
|
cursor: pointer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 视频缩略图容器 |
|
|
|
|
.video-thumb-wrapper { |
|
|
|
|
position: relative; |
|
|
|
|
display: inline-block; |
|
|
|
|
width: 100px; |
|
|
|
|
height: 80px; |
|
|
|
|
cursor: pointer; |
|
|
|
|
border-radius: 4px; |
|
|
|
|
overflow: hidden; |
|
|
|
|
background: #000; |
|
|
|
|
|
|
|
|
|
video { |
|
|
|
|
display: block; |
|
|
|
|
width: 100%; |
|
|
|
|
height: 100%; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 视频播放图标 |
|
|
|
|
.video-play-icon { |
|
|
|
|
position: absolute; |
|
|
|
|
top: 50%; |
|
|
|
|
left: 50%; |
|
|
|
|
transform: translate(-50%, -50%); |
|
|
|
|
font-size: 28px; |
|
|
|
|
color: rgba(255, 255, 255, 0.9); |
|
|
|
|
pointer-events: none; |
|
|
|
|
text-shadow: 0 0 4px rgba(0, 0, 0, 0.5); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 影像区域居中 |
|
|
|
|
.imaging-row { |
|
|
|
|
justify-content: center; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.imaging-item { |
|
|
|
|
::v-deep .el-form-item__content { |
|
|
|
|
display: flex; |
|
|
|
|
justify-content: center; |
|
|
|
|
margin: 0 20px !important; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
</style> |