病理相关

This commit is contained in:
旺仔 2024-10-25 21:52:24 +08:00
parent 6e3b489177
commit 1bb63d52e5
10 changed files with 1028 additions and 618 deletions

View File

@ -35,6 +35,7 @@
"@wangeditor/editor-for-vue": "^5.1.10",
"@zxcvbn-ts/core": "^3.0.4",
"animate.css": "^4.1.1",
"autofit.js": "^3.1.4",
"axios": "^1.6.8",
"benz-amr-recorder": "^1.1.5",
"bpmn-js-token-simulation": "^0.10.0",

View File

@ -38,6 +38,9 @@ importers:
animate.css:
specifier: ^4.1.1
version: 4.1.1
autofit.js:
specifier: ^3.1.4
version: 3.1.4
axios:
specifier: ^1.6.8
version: 1.6.8
@ -2424,6 +2427,9 @@ packages:
engines: {node: '>= 4.5.0'}
hasBin: true
autofit.js@3.1.4:
resolution: {integrity: sha512-SLKn73fHeWsxJZJ5yisCYLvw0U10OLjrcOEWlPHvSRvIcvQHwuSemFtrcoTM+zccwtVWi3dwfJxT282728j9HQ==}
autoprefixer@10.4.19:
resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==}
engines: {node: ^10 || ^12 || >=14}
@ -4887,7 +4893,7 @@ packages:
engines: {node: '>=0.10.0'}
source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, tarball: https://r2.cnpmjs.org/source-map/-/source-map-0.6.1.tgz}
engines: {node: '>=0.10.0'}
split-string@3.1.0:
@ -7958,6 +7964,8 @@ snapshots:
atob@2.1.2: {}
autofit.js@3.1.4: {}
autoprefixer@10.4.19(postcss@8.4.38):
dependencies:
browserslist: 4.23.0

View File

@ -248,8 +248,8 @@ function screenshotTool() {
$.ajax({
type: 'POST',
contentType: 'application/json',
url: 'http://127.0.0.1:48080/admin-api/ultrasoniccom/ultrasonic/ftpimage',
data: JSON.stringify({ id: window.localStorage.regid_pathology, imagebase: imageDataUrl, imgType: '3' }),
url: 'http://192.168.0.110:8095/admin-api/ultrasoniccom/ultrasonic/ftpimage',
data: JSON.stringify({ id: window.localStorage.regid_pathology, orgId: window.localStorage.orgId_pathology, imagebase: imageDataUrl, imgType: '3' }),
success: function (data, textStatus, jqXHR) {
alert('添加成功,请刷新报告单中的图片');
}

View File

@ -1,146 +1,196 @@
<template>
<span class="my-span" style="margin-left: 14px">快捷入口</span>
<div class="my-quickdiv">
<ContentWrap class="my-quick" v-for="(item, index) in projects" :key="`ContentWrap-${index}`">
<router-link
:to="item.message"
class="flex items-center justify-center"
style="width: 100%; height: 100%; text-decoration: none"
>
<div class="my-linkimagediv" :style="getbackground(item.name)">
<img :src="getImageUrl(item.name)" />
</div>
<span class="my-span">{{ item.name }}</span>
<img :src="getarrowImageUrl(item.name)" />
</router-link>
</ContentWrap>
</div>
<div class="stats-container">
<!-- 左侧上下两个统计图区域 -->
<div class="left-stats">
<div class="my-statistics">
<ContentWrap class="my-quickstatistics">
<span class="my-span">累计已检查登记单概况</span>
<div class="div-inline">
<div v-if="isDataReady" style="background-color: rgb(243, 247, 254)">
<YY :mytotalcount=totalcount :myy="y" :myyx="yx" :myzdyx="zdyx" style="height: 300px" />
</div>
<div class="flex-gap"></div>
<!-- 间隙 -->
<div v-if="isDataReady" style="background-color: rgb(243, 247, 254)">
<mw :F="F" :M="M" :mytotalcount="totalcount" style="height: 300px" />
</div>
</div>
</ContentWrap>
</div>
<div class="my-statistics">
<ContentWrap class="my-quickstatistics">
<span class="my-span">已检查登记单概况分布</span>
<div v-if="iszxDataReady">
<zx :yxArray="yxArray" :yArray="yArray" :zdyxArray="zdyxArray" style="height: 300px" />
</div>
</ContentWrap>
</div>
</div>
<!-- 右侧竖直统计图区域 -->
<div class="right-stats">
<ContentWrap class="my-right-statistics" style="height: 753px">
<span class="my-span" style="margin-left: 10px">检查状态概况</span>
<div
style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px"
<div id="indexPage">
<span class="my-span" style="margin-left: 14px">快捷入口</span>
<div class="my-quickdiv">
<ContentWrap class="my-quick" v-for="(item, index) in projects" :key="`ContentWrap-${index}`">
<router-link
:to="item.message"
class="flex items-center justify-center"
style="width: 100%; height: 100%; text-decoration: none"
>
<img src="/static/djdtj.jpg" style="width: 55px; height: 60px" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128)">登记单累计总数</span>
<span class="my-span" style="margin-top: 8px">{{regtotalcount}}</span>
<div class="my-linkimagediv" :style="getbackground(item.name)">
<img :src="getImageUrl(item.name)" />
</div>
</div>
<el-divider />
<div
style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px"
>
<img src="/static/djwfj.jpg" style="width: 55px; height: 60px; margin-left: 40px;" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128)">登记单未分检数</span>
<span class="my-span" style="margin-top: 8px">{{wfj}}</span>
</div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px">({{usePercentageCalculation(regtotalcount,wfj)}}%)</span>
</div>
<!-- -->
<div
style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px"
>
<img src="/static/djwjc.jpg" style="width: 55px; height: 60px;margin-left: 40px;" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128)">登记单未检查数</span>
<span class="my-span" style="margin-top: 8px">{{wjc}}</span>
</div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px">({{usePercentageCalculation(regtotalcount,wjc)}}%)</span>
</div>
<!-- -->
<div style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px">
<img src="/static/djyjc.jpg" style="width: 55px; height: 60px;margin-left: 40px;" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128);">登记单已检查数</span>
<span class="my-span" style="margin-top: 8px;">{{yjc}}</span>
</div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px;">({{usePercentageCalculation(regtotalcount,yjc)}}%)</span>
</div>
<!-- -->
<div style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px">
<img src="/static/djfq.jpg" style="width: 55px; height: 60px;margin-left: 40px;" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128);">登记单已放弃数</span>
<span class="my-span" style="margin-top: 8px;">{{yfq}}</span>
</div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px;">({{usePercentageCalculation(regtotalcount,yfq)}}%)</span>
</div>
<span class="my-span">{{ item.name }}</span>
<img :src="getarrowImageUrl(item.name)" />
</router-link>
</ContentWrap>
</div>
<div class="stats-container">
<!-- 左侧上下两个统计图区域 -->
<div class="left-stats">
<div class="my-statistics">
<ContentWrap class="my-quickstatistics">
<span class="my-span">累计已检查登记单概况</span>
<div class="div-inline">
<div v-if="isDataReady" style="background-color: rgb(243, 247, 254)">
<YY
:mytotalcount="totalcount"
:myy="y"
:myyx="yx"
:myzdyx="zdyx"
style="height: 300px"
/>
</div>
<div class="flex-gap"></div>
<!-- 间隙 -->
<div v-if="isDataReady" style="background-color: rgb(243, 247, 254)">
<mw :F="F" :M="M" :mytotalcount="totalcount" style="height: 300px" />
</div>
</div>
</ContentWrap>
</div>
<div class="my-statistics">
<ContentWrap class="my-quickstatistics">
<span class="my-span">已检查登记单概况分布</span>
<div v-if="iszxDataReady">
<zx
:yxArray="yxArray"
:yArray="yArray"
:zdyxArray="zdyxArray"
style="height: 300px"
/>
</div>
</ContentWrap>
</div>
</div>
<!-- 右侧竖直统计图区域 -->
<div class="right-stats">
<ContentWrap class="my-right-statistics" style="height: 753px">
<span class="my-span" style="margin-left: 10px">检查状态概况</span>
<div
style="
display: flex;
align-items: flex-start;
justify-content: center;
margin-top: 50px;
"
>
<img src="/static/djdtj.jpg" style="width: 55px; height: 60px" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128)">登记单累计总数</span>
<span class="my-span" style="margin-top: 8px">{{ regtotalcount }}</span>
</div>
</div>
<el-divider />
<div
style="
display: flex;
align-items: flex-start;
justify-content: center;
margin-top: 50px;
"
>
<img src="/static/djwfj.jpg" style="width: 55px; height: 60px; margin-left: 40px" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128)">登记单未分检数</span>
<span class="my-span" style="margin-top: 8px">{{ wfj }}</span>
</div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px"
>({{ usePercentageCalculation(regtotalcount, wfj) }}%)</span
>
</div>
<!-- -->
<div
style="
display: flex;
align-items: flex-start;
justify-content: center;
margin-top: 50px;
"
>
<img src="/static/djwjc.jpg" style="width: 55px; height: 60px; margin-left: 40px" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128)">登记单未检查数</span>
<span class="my-span" style="margin-top: 8px">{{ wjc }}</span>
</div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px"
>({{ usePercentageCalculation(regtotalcount, wjc) }}%)</span
>
</div>
<!-- -->
<div
style="
display: flex;
align-items: flex-start;
justify-content: center;
margin-top: 50px;
"
>
<img src="/static/djyjc.jpg" style="width: 55px; height: 60px; margin-left: 40px" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128)">登记单已检查数</span>
<span class="my-span" style="margin-top: 8px">{{ yjc }}</span>
</div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px"
>({{ usePercentageCalculation(regtotalcount, yjc) }}%)</span
>
</div>
<!-- -->
<div
style="
display: flex;
align-items: flex-start;
justify-content: center;
margin-top: 50px;
"
>
<img src="/static/djfq.jpg" style="width: 55px; height: 60px; margin-left: 40px" />
<div
style="
margin-left: 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
"
>
<span style="color: rgb(128, 128, 128)">登记单已放弃数</span>
<span class="my-span" style="margin-top: 8px">{{ yfq }}</span>
</div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px"
>({{ usePercentageCalculation(regtotalcount, yfq) }}%)</span
>
</div>
</ContentWrap>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import autofit from 'autofit.js'
import { set } from 'lodash-es'
import { EChartsOption } from 'echarts'
import { formatTime } from '@/utils'
import { useUserStore } from '@/store/modules/user'
import { useWatermark } from '@/hooks/web/useWatermark'
import type { WorkplaceTotal, Project, Notice, Shortcut } from './types'
@ -153,8 +203,25 @@ import { ApplyformApi } from '@/api/applyregistration/applyform'
defineOptions({ name: 'Home' })
const isDataReady = ref(false);
const iszxDataReady = ref(false);
onMounted(async () => {
autofit.init(
{
dw: 1920 * 1.03,
dh: 1080 * 1.03,
el: '#indexPage',
resize: true
},
false
)
await getAllApi()
})
onBeforeUnmount(() => {
autofit.off()
})
const isDataReady = ref(false)
const iszxDataReady = ref(false)
const { t } = useI18n()
const userStore = useUserStore()
const { setWatermark } = useWatermark()
@ -163,7 +230,6 @@ const avatar = userStore.getUser.avatar
const username = userStore.getUser.nickname
const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption
//
let projects = reactive<Project[]>([])
const getProject = async () => {
@ -195,85 +261,86 @@ const getProject = async () => {
]
projects = Object.assign(projects, data)
}
const y=ref()
const yx=ref()
const totalcount=ref()
const zdyx=ref()
const F=ref()
const M=ref()
const GetWholeDiagFlagCount=async ()=>
{
const data= await PatientexamlistApi.WholeDiagFlagCount()
totalcount.value=data.totalcount//
y.value=data.y
yx.value=data.yx
zdyx.value=data.zdyx
F.value=data.f
M.value=data.m
console.log("统计"+ data.f)
isDataReady.value=true
const y = ref()
const yx = ref()
const totalcount = ref()
const zdyx = ref()
const F = ref()
const M = ref()
const GetWholeDiagFlagCount = async () => {
const data = await PatientexamlistApi.WholeDiagFlagCount()
totalcount.value = data.totalcount //
y.value = data.y
yx.value = data.yx
zdyx.value = data.zdyx
F.value = data.f
M.value = data.m
console.log('统计' + data.f)
isDataReady.value = true
}
// 70
const yxArray = ref(new Array(7).fill(0));
const yArray = ref(new Array(7).fill(0));
const zdyxArray = ref(new Array(7).fill(0));
const yxArray = ref(new Array(7).fill(0))
const yArray = ref(new Array(7).fill(0))
const zdyxArray = ref(new Array(7).fill(0))
const GetDateYYZDYXCount =async () => {
const data= await PatientexamlistApi.GetDateYYZDYXCount()
const GetDateYYZDYXCount = async () => {
const data = await PatientexamlistApi.GetDateYYZDYXCount()
for (let i = 0; i < data.length; i++) {
yxArray.value[i]=data[i].yx
yArray.value[i]=data[i].y
zdyxArray.value[i]=data[i].zdyx
yxArray.value[i] = data[i].yx
yArray.value[i] = data[i].y
zdyxArray.value[i] = data[i].zdyx
}
iszxDataReady.value=true
iszxDataReady.value = true
}
const regtotalcount=ref(0)
const wfj=ref(0)
const wjc=ref(0)
const yjc=ref(0)
const yfq=ref(0)
const GetReglistCount=async ()=>
{
const data= await ApplyformApi.GetReglistCount()
regtotalcount.value=data.totalcount
wfj.value=data.wfj
wjc.value=data.wjc
yjc.value=data.yjc
yfq.value=data.yfq
const regtotalcount = ref(0)
const wfj = ref(0)
const wjc = ref(0)
const yjc = ref(0)
const yfq = ref(0)
const GetReglistCount = async () => {
const data = await ApplyformApi.GetReglistCount()
regtotalcount.value = data.totalcount
wfj.value = data.wfj
wjc.value = data.wjc
yjc.value = data.yjc
yfq.value = data.yfq
}
//
function usePercentageCalculation(total, value) {
return computed(() => {
const totalNum = parseInt(total); //
const valueNum = parseInt(value); //
const totalNum = parseInt(total) //
const valueNum = parseInt(value) //
// total00
if (totalNum <= 0) {
return 0;
return 0
}
// total0
const percentage = (valueNum / totalNum) * 100;
const percentage = (valueNum / totalNum) * 100
//
return parseFloat(percentage.toFixed(2));
});
return parseFloat(percentage.toFixed(2))
})
}
const barOptionsData = reactive<EChartsOption>(barOptions) as EChartsOption
const getAllApi = async () => {
await Promise.all([getProject(),GetWholeDiagFlagCount(),GetDateYYZDYXCount(),GetReglistCount()])
await Promise.all([
getProject(),
GetWholeDiagFlagCount(),
GetDateYYZDYXCount(),
GetReglistCount()
])
loading.value = false
}
// getAllApi
onMounted(getAllApi);
// onMounted(getAllApi)
//
function getImageUrl(name) {
@ -312,8 +379,6 @@ function getarrowImageUrl(name) {
}
return imageMap[name] || '/static/djjt.jpg' //
}
</script>
<style scoped>
.menu-button {

View File

@ -2,7 +2,7 @@
<div class="ultrasound-report">
<el-row style="font-size: 14px">
<el-col :span="12">
<h2 class="ml-6px">科右前旗康立寿医院</h2>
<h2 class="ml-6px">{{ orgInfo?.orgName }}</h2>
</el-col>
<el-col :span="12">
<h2 style="text-align: right" class="mr-6px">CT检查报告单</h2>
@ -75,6 +75,8 @@
<script setup lang="ts">
import { formatDate } from '@/utils/formatTime'
import { getUserProfile } from '@/api/system/user/profile'
import { ReportPrintStatisticsApi } from '@/api/applyregistration/reportPrintStatistics'
defineOptions({ name: 'ReportInfoCT' })
/*
@ -109,6 +111,7 @@ const infoParams = defineProps({
})
/** 数据内容 **/
const orgInfo = ref<any>('')
const VITE_BASE_URL_YunJiaoPian = ref(import.meta.env.VITE_BASE_URL_YunJiaoPian)
const age = computed(() => {
@ -130,7 +133,11 @@ const age = computed(() => {
})
/** 钩子方法 **/
onMounted(async () => {})
onMounted(async () => {
let userInfo = await getUserProfile()
if (userInfo && userInfo.orgId)
orgInfo.value = await ReportPrintStatisticsApi.getOrg(userInfo.orgId.trim())
})
/** 导出内容 **/
/**

View File

@ -0,0 +1,224 @@
<template>
<div class="ultrasound-report">
<h2>病理样本报告单</h2>
<hr />
<div style="margin: 4px 6px">
<el-row>
<el-col :span="7">门诊号{{ infoParams.regId }}</el-col>
<el-col :span="5">姓名{{ infoParams.pname }}</el-col>
<el-col :span="6">性别{{ infoParams.gender }}</el-col>
<el-col :span="6">年龄{{ age }}</el-col>
</el-row>
<el-row>
<el-col :span="12">检查号{{ infoParams.examId }}</el-col>
<el-col :span="12">设备{{ infoParams.deviceName }}</el-col>
<el-col :span="12" v-if="false">检查项目{{ infoParams.examItemName }}</el-col>
</el-row>
<el-row>
<el-col :span="12">送检科室{{ infoParams.billDoctorDepartment }}</el-col>
</el-row>
</div>
<div class="patient-info" v-if="false">
<p class="info-item">门诊号{{ infoParams.regId }}</p>
<p class="info-item">姓名{{ infoParams.pname }}</p>
<p class="info-item">性别{{ infoParams.gender }}</p>
<p class="info-item">年龄{{ age }}</p>
<p class="info-item">检查号{{ infoParams.examId }}</p>
<p class="info-item">检查项目{{ infoParams.examItemName }}</p>
<p class="info-item">设备{{ infoParams.deviceName }}</p>
<p class="info-item">送检科室{{ infoParams.billDoctorDepartment }}</p>
</div>
<hr />
<h3>肉眼所见</h3>
<div class="image-gallery">
<div v-for="image in reportimages" :key="image.id">
<img alt="" style="width: 140px; height: 140px" :src="image.imgUrl" v-if="false" />
<div style="flex: 1; height: 100%; margin-left: 6px; margin-right: 6px">
<el-image
alt=""
fit="fill"
loading="eager"
style="width: 99%; height: 99%"
:src="image.imgUrl"
:preview-src-list="[image.imgUrl]"
v-if="true"
/>
</div>
</div>
</div>
<div class="ultrasound-findings">
<h3>标本名称</h3>
<p>{{ infoParams.examItemName }}</p>
</div>
<div class="ultrasound-findings">
<h3>病理所见</h3>
<p>{{ infoParams.examDescription }}</p>
</div>
<div class="ultrasound-recommendation">
<h3>病理结论</h3>
<p>{{ infoParams.diagResults }}</p>
</div>
<div style="width: 94%; position: absolute; bottom: 20px; right: 20px">
<div style="text-align: center" v-if="infoParams.showQRcode">
<Qrcode
:text="
VITE_BASE_URL_YunJiaoPian + '?no=' + infoParams.regId + '&orgId=' + infoParams.orgId
"
:width="90"
/>
<div class="-mt-6px mb-1px" style="font-size: 11px">扫码查看云胶片</div>
</div>
<p v-if="false" style="text-align: right">医生签名{{ infoParams.reviewDoctor }}</p>
<hr />
<el-row style="font-size: 14px">
<el-col :span="6" class="pl-6px">报告医师{{ infoParams.diagDoctor }}</el-col>
<el-col :span="6">
报告日期{{ formatDate(infoParams.diagDate as unknown as Date, 'YYYY-MM-DD') }}
</el-col>
<el-col :span="6">审核医师{{ infoParams.reviewDoctor }}</el-col>
<el-col :span="6">
审核日期{{ formatDate(infoParams.reviewDate as unknown as Date, 'YYYY-MM-DD') }}
</el-col>
</el-row>
<div style="font-size: 11px; text-align: center; margin-top: 16px; margin-bottom: -14px">
本报告只作临床参考不作证明材料
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { formatDate } from '@/utils/formatTime'
import { ultrasoniccomApi } from '@/api/ultrasoniccom'
defineOptions({ name: 'ReportInfoPathology' })
/*
* 李传洋
* ReportInfoPathology
**/
/** 导入内容 **/
const infoParams = defineProps({
showQRcode: {
type: Boolean,
default: false,
required: false
},
id: String,
examId: String,
regId: String,
orgId: String,
pname: String,
gender: String,
birthday: String,
billDoctorDepartment: String,
applicationDate: String,
examDescription: String,
diagResults: String,
examItemName: String,
deviceName: String,
deviceType: String,
diagDoctor: String,
diagDate: String,
reviewDoctor: String,
reviewDate: String
})
/** 数据内容 **/
const VITE_BASE_URL_YunJiaoPian = ref(import.meta.env.VITE_BASE_URL_YunJiaoPian)
const age = computed(() => {
let birthdate = infoParams.birthday
if (!birthdate) {
return ''
}
const today = new Date()
const birth = new Date(birthdate)
let yearsDiff = today.getFullYear() - birth.getFullYear()
// Check if the birthday hasn't occurred yet this year
const hasBirthdayPassed =
today.getMonth() > birth.getMonth() ||
(today.getMonth() === birth.getMonth() && today.getDate() >= birth.getDate())
if (!hasBirthdayPassed) {
yearsDiff--
}
return yearsDiff
})
const reportimages = ref<any[]>([])
const loadimage = async (orgId: string, regId: string) => {
reportimages.value = []
const imageslist = await ultrasoniccomApi.getpathologyimglist(orgId, regId, '1')
reportimages.value = imageslist
}
watch(
[() => infoParams.orgId, () => infoParams.regId],
([orgIdNew, regIdNew], [orgIdOld, regIdOld]) => {
console.log(orgIdOld == null, regIdOld == null)
loadimage(orgIdNew ? orgIdNew : '', regIdNew ? regIdNew : '')
},
{ deep: true }
)
/** 钩子方法 **/
onMounted(async () => {
loadimage(infoParams.orgId ? infoParams.orgId : '', infoParams.regId ? infoParams.regId : '')
})
/** 导出内容 **/
/**
* 备注
*
* **/
</script>
<style lang="scss" scoped>
/*** 报告单 ***/
.ultrasound-report {
font-family: Arial, sans-serif;
width: 94%;
margin: 3px auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 8px;
position: relative;
min-height: 750px;
}
.ultrasound-report h1,
.ultrasound-report h2 {
text-align: center;
}
.patient-info {
display: flex;
flex-wrap: wrap;
}
.patient-info p {
font-size: 14px;
margin: 4px 6px;
min-width: calc(25% - 2 * 6px - 2px);
}
.ultrasound-recommendation {
margin-bottom: 180px;
}
.ultrasound-findings p,
.ultrasound-recommendation p {
font-size: 16px;
margin: 5px 2px 5px 30px;
}
.ultrasound-findings h3,
.ultrasound-recommendation h3 {
margin-top: 30px;
}
.image-gallery {
display: flex;
justify-content: space-around;
margin: 10px 0;
}
</style>

View File

@ -416,6 +416,9 @@
<template v-if="reportInfoType == 'ct'">
<ReportInfoCT v-bind="{ ...infoParams, showQRcode }" class="page-item" />
</template>
<template v-if="reportInfoType == 'csh1'">
<ReportInfoPathology v-bind="{ ...infoParams, showQRcode }" class="page-item" />
</template>
</div>
<div style="margin-bottom: 40px"></div>
</div>
@ -453,6 +456,11 @@
v-if="item.deviceType && item.deviceType.trim().toLowerCase() == 'us'"
class="page-item"
/>
<ReportInfoPathology
v-bind="{ ...item, showQRcode }"
v-else-if="item.deviceType && item.deviceType.trim().toLowerCase() == 'csh1'"
class="page-item"
/>
<ReportInfoCT v-bind="{ ...item, showQRcode }" v-else class="page-item" />
</template>
</div>
@ -473,6 +481,7 @@ import { getUserProfile } from '@/api/system/user/profile'
import { ElLoading } from 'element-plus'
import ReportInfoCT from './ReportInfoCT.vue'
import ReportInfoUS from './ReportInfoUS.vue'
import ReportInfoPathology from './ReportInfoPathology.vue'
defineOptions({ name: 'ReportPrintStatistics' })
/*
@ -683,6 +692,8 @@ const handleRowClick = async (row) => {
examItemNameEdit.value = row.examItemName
examItemNameEditShow.value = true
if (row.deviceType && row.deviceType.trim().toLowerCase() == 'us') reportInfoType.value = 'us'
else if (row.deviceType && row.deviceType.trim().toLowerCase() == 'csh1')
reportInfoType.value = 'csh1'
else reportInfoType.value = 'ct'
}
await showQRcodeSet()

View File

@ -18,270 +18,284 @@
v-if="dataLoaded"
frameborder="0"
scrolling="no"
style="width: 100%; height: 87vh"
style="width: 100%; height: 87vh; margin-right: 14px"
:src="newSrc"
></iframe>
</el-tab-pane>
<el-tab-pane label="报告单" name="second">
<!-- 外层 Flex 容器 -->
<div style="display: flex; height: 100%">
<!-- 模版区域 -->
<div style="flex: 1; min-width: 0; overflow: auto">
<el-select
v-model="fordevicemValue"
placeholder="请选择模版类别"
clearable
@change="handleselectchange"
@clear="selectclear"
>
<el-option label="门诊" value="门诊模版" />
<el-option label="住院" value="住院模版" />
<el-option label="体检" value="体检模版" />
</el-select>
<el-scrollbar height="80vh">
<div style="display: flex">
<!-- 模版区域 -->
<div style="flex: 1; min-width: 0; border: 1px solid rgb(220, 223, 230)">
<el-select
v-model="fordevicemValue"
placeholder="请选择模版类别"
clearable
@change="handleselectchange"
@clear="selectclear"
style="width: 100%"
>
<el-option label="门诊" value="门诊模版" />
<el-option label="住院" value="住院模版" />
<el-option label="体检" value="体检模版" />
</el-select>
<el-tabs type="border-card" style="height: 83vh; overflow: auto">
<el-tab-pane label="通用模版">
<!-- -->
<el-tree
style="min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="false"
:data="treeData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@check="handleTreeNodeClick"
ref="selectTree"
:expand-on-click-node="false"
/>
</el-tab-pane>
<el-tab-pane label="私有模版">
<!-- -->
<el-tree
style="min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="false"
:data="privateData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@node-click="handleTreeNodeClick"
ref="priselectTree"
:expand-on-click-node="false"
/>
</el-tab-pane>
</el-tabs>
</div>
<!-- 用户信息区域 -->
<div style="flex: 3; min-width: 0">
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">患者信息</label>
<el-divider />
<el-form
:model="applyFormVO"
label-width="auto"
style="max-width: 1000px; margin: auto"
:inline="true"
<el-tabs type="border-card" style="border: none">
<el-tab-pane label="通用模版">
<el-scrollbar height="114vh" style="border: 2px solid rgb(220, 223, 230)">
<el-tree
style="padding-top: 15px; padding-bottom: 20px; min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="true"
:data="treeData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@check="handleTreeNodeClick"
ref="selectTree"
:expand-on-click-node="false"
/>
</el-scrollbar>
</el-tab-pane>
<el-tab-pane label="私有模版">
<el-scrollbar height="114vh" style="border: 2px solid rgb(220, 223, 230)">
<el-tree
style="padding-top: 15px; padding-bottom: 20px; min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="true"
:data="privateData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@node-click="handleTreeNodeClick"
ref="priselectTree"
:expand-on-click-node="false"
/>
</el-scrollbar>
</el-tab-pane>
</el-tabs>
</div>
<!-- 用户信息区域 -->
<div
style="
flex: 3;
min-width: 0;
border: 1px solid rgb(220, 223, 230);
padding: 10px 14px 12px 2px;
margin-left: 6px;
margin-right: 14px;
"
>
<el-row>
<el-col :span="7">
<el-form-item label="检查号" style="font-weight: bold" label-width="110px">
<el-input v-model="applyFormVO.examId" style="width: 220px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="姓名" style="font-weight: bold" label-width="130px">
<el-input v-model="applyFormVO.pname" style="width: 220px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="性别" style="font-weight: bold" label-width="160px">
<el-input v-model="applyFormVO.gender" style="width: 220px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="出生日期" style="font-weight: bold" label-width="110px">
<el-date-picker
v-model="applyFormVO.birthday"
type="date"
placeholder="出生日期"
size="default"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查时间" style="font-weight: bold" label-width="130px">
<el-date-picker
v-model="applyFormVO.examDate"
type="datetime"
placeholder="检查时间"
size="default"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="送检科室" style="font-weight: bold" label-width="160px">
<el-input
v-model="applyFormVO.billDoctorDepartment"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">患者信息</label>
<el-divider />
<el-form
:model="applyFormVO"
label-width="96px"
style="max-width: 1000px; margin-left: 28px"
:inline="false"
>
<el-row>
<el-col :span="7">
<el-form-item label="检查号" style="font-weight: bold">
<el-input v-model="applyFormVO.examId" style="width: 100%" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="姓名" style="font-weight: bold">
<el-input v-model="applyFormVO.pname" style="width: 100%" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="性别" style="font-weight: bold">
<el-input v-model="applyFormVO.gender" style="width: 100%" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="出生日期" style="font-weight: bold">
<el-date-picker
v-model="applyFormVO.birthday"
type="date"
placeholder="出生日期"
size="default"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查时间" style="font-weight: bold">
<el-date-picker
v-model="applyFormVO.examDate"
type="datetime"
placeholder="检查时间"
size="default"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="送检科室" style="font-weight: bold">
<el-input
v-model="applyFormVO.billDoctorDepartment"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="申请时间" style="font-weight: bold" label-width="110px">
<el-date-picker
v-model="applyFormVO.applicationDate"
type="datetime"
placeholder="检查时间"
size="default"
style="width: 220px"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请单号" style="font-weight: bold" label-width="130px">
<el-input v-model="applyFormVO.regId" style="width: 220px" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="7">
<!-- <el-form-item label="检查项目名称" label-width="160px" style="font-weight: bold">
<el-col :span="7">
<el-form-item label="申请时间" style="font-weight: bold">
<el-date-picker
v-model="applyFormVO.applicationDate"
type="datetime"
placeholder="检查时间"
size="default"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请单号" style="font-weight: bold">
<el-input v-model="applyFormVO.regId" style="width: 100%" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="7">
<!-- <el-form-item label="检查项目名称" label-width="160px" style="font-weight: bold">
<el-input
v-model="applyFormVO.examItemName"
style="width: 220px"
:disabled="true"
/>
</el-form-item> -->
</el-col>
</el-row>
</el-form>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">检查项目</label>
<el-divider />
<el-input
v-model="applyFormVO.examItemName"
style="width: 95%; font-size: 20px; margin-left: 40px; margin-bottom: 6px"
:rows="1"
:disabled="true"
/>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">影像所见</label>
<el-divider />
<el-input
v-model="sj"
style="width: 95%; font-size: 20px; margin-left: 40px; margin-bottom: 3px"
:rows="4"
type="textarea"
placeholder="影像所见"
/>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">影像结论</label>
<el-divider />
<el-input
v-model="zdjl"
style="width: 95%; font-size: 20px; margin-left: 40px; margin-bottom: 3px"
:rows="4"
type="textarea"
placeholder="影像结论"
/>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">报告备注</label>
<el-divider />
<el-input
v-model="notes"
style="
width: 95%;
font-size: 19px;
margin-left: 40px;
margin-top: 6px;
margin-bottom: 6px;
"
placeholder=""
/>
<el-divider />
<el-radio-group
v-model="radio1"
size="small"
class="radio-group-wrapper"
@dblclick="cancelSelection"
>
<el-radio-button label="阴性" value="0" />
<el-radio-button label="阳性" value="1" />
<el-radio-button label="重大阳性" value="2" />
</el-radio-group>
<el-divider />
<div class="form-row-yx">
<el-form-item label="诊断医生" class="form-item">
<el-input v-model="applyFormVO.diagDoctor" style="width: 180px" :disabled="true" />
</el-form-item>
<el-form-item label="审核医生" class="form-item">
<el-input
v-model="applyFormVO.reviewDoctor"
style="width: 180px"
:disabled="true"
/>
</el-form-item>
<el-form-item label="报告状态" class="form-item">
<el-input
v-model="applyFormVO.reportstatus"
style="width: 180px"
:disabled="true"
/>
</el-form-item>
</div>
<div style="position: absolute; bottom: 0; right: 0">
<el-button
type="success"
plain
</el-col>
</el-row>
</el-form>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">检查项目</label>
<el-divider />
<el-input
v-model="applyFormVO.examItemName"
style="width: 95%; font-size: 20px; margin-left: 40px; margin-bottom: 6px"
:rows="1"
:disabled="true"
placeholder="检查项目"
/>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">影像所见</label>
<el-divider />
<el-input
v-model="sj"
style="width: 95%; font-size: 20px; margin-left: 40px; margin-bottom: 3px"
:rows="4"
type="textarea"
placeholder="影像所见"
/>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">影像结论</label>
<el-divider />
<el-input
v-model="zdjl"
style="width: 95%; font-size: 20px; margin-left: 40px; margin-bottom: 3px"
:rows="4"
type="textarea"
placeholder="影像结论"
/>
<label style="font-size: 18px; font-weight: bold; margin-left: 50px">报告备注</label>
<el-divider />
<el-input
v-model="notes"
style="
width: 80px;
float: right;
margin-right: 15px;
margin-top: 30px;
background-color: rgba(56, 119, 246, 1);
font-size: 14;
color: rgb(255, 255, 255);
width: 95%;
font-size: 19px;
margin-left: 40px;
margin-top: 6px;
margin-bottom: 6px;
"
@click="save"
:disabled="savedisabled"
>保存</el-button
>
<!-- v-show="examinedisabled" -->
<el-button
type="primary"
plain
v-show="examinedisabled"
style="
width: 80px;
float: right;
margin-right: 15px;
margin-top: 30px;
background-color: rgba(56, 119, 246, 1);
font-size: 14;
color: rgb(255, 255, 255);
"
@click="examine"
>审核</el-button
placeholder="报告备注"
/>
<el-divider />
<el-radio-group
v-model="radio1"
size="small"
class="radio-group-wrapper"
@dblclick="cancelSelection"
>
<el-radio-button label="阴性" value="0" />
<el-radio-button label="阳性" value="1" />
<el-radio-button label="重大阳性" value="2" />
</el-radio-group>
<el-divider />
<div class="form-row-yx">
<el-form-item label="诊断医生" class="form-item">
<el-input
v-model="applyFormVO.diagDoctor"
style="width: 180px"
:disabled="true"
/>
</el-form-item>
<el-form-item label="审核医生" class="form-item">
<el-input
v-model="applyFormVO.reviewDoctor"
style="width: 180px"
:disabled="true"
/>
</el-form-item>
<el-form-item label="报告状态" class="form-item">
<el-input
v-model="applyFormVO.reportstatus"
style="width: 180px"
:disabled="true"
/>
</el-form-item>
</div>
<div style="text-align: right">
<el-button
type="primary"
plain
v-show="examinedisabled"
style="
width: 80px;
margin-right: 15px;
background-color: rgba(56, 119, 246, 1);
font-size: 14;
color: rgb(255, 255, 255);
"
@click="examine"
>
审核
</el-button>
<el-button
type="success"
plain
style="
width: 80px;
margin-right: 15px;
background-color: rgba(56, 119, 246, 1);
font-size: 14;
color: rgb(255, 255, 255);
"
@click="save"
:disabled="savedisabled"
>
保存
</el-button>
</div>
</div>
</div>
</div>
</el-scrollbar>
</el-tab-pane>
</el-tabs>
</el-dialog>
<!-- </Dialog> -->
<!-- 弹窗-->
<el-dialog v-model="dialogTableVisible" title="选择结论添加方式" width="320" align-center>
<div>
@ -323,7 +337,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const examineFormVO = ref<PatientexamlistVO>({} as PatientexamlistVO)
const savedisabled = ref(true) //
const savedisabled = ref(false) //
const examinedisabled = ref(false) //
const dataLoaded = ref(false) //
const tagLoaded = ref(true) //
@ -404,8 +418,6 @@ const examine = async () => {
const response = await PatientexamlistApi.examine(ID.toString())
if (response) {
message.alertSuccess('审核成功')
// ID
getPatientexamlist(ID)
emit('success')
}
@ -694,7 +706,12 @@ const getPatientexamlist = async (id: number) => {
notes.value = applyFormVO.value.notes
calculateAge(applyFormVO.value.birthday)
if (applyFormVO.value.reportstatus == '已分检' || applyFormVO.value.reportstatus == '待分析') {
if (
applyFormVO.value.reportstatus &&
(applyFormVO.value.reportstatus == '已分析' ||
applyFormVO.value.reportstatus == '已分检' ||
applyFormVO.value.reportstatus == '待分析')
) {
savedisabled.value = false
} else {
savedisabled.value = true
@ -742,7 +759,7 @@ const resetForm = () => {
}
</script>
<style>
<style scoped>
/* .my-container-yx {
height: 100vh;
width: 100vw;

View File

@ -6,7 +6,15 @@
:fullscreen="true"
:close-on-press-escape="false"
>
<el-tabs v-model="activeName" type="card">
<el-tabs
@tab-click="
(tabpane) => {
if (tabpane.props.name == 'second') loadimage()
}
"
v-model="activeName"
type="card"
>
<el-tab-pane v-if="tagLoaded" label="影像" name="first">
<el-scrollbar height="80vh">
<iframe
@ -14,7 +22,7 @@
frameborder="0"
scrolling="no"
:src="newSrc"
style="width: 100%; height: 104vh; margin-right: 14px"
style="width: 100%; height: 87vh; margin-right: 14px"
></iframe>
</el-scrollbar>
</el-tab-pane>
@ -495,7 +503,7 @@ let selecteimagedoneid: number = 0
let selecteimagedtwoid: number = 0
let selecteimagedthreeid: number = 0
const handleLoad = (id: string) => {
if (applyFormVO.value.reportstatus == '已分析' || applyFormVO.value.reportstatus == '已审核') {
if (applyFormVO.value.reportstatus && applyFormVO.value.reportstatus == '已审核') {
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
@ -543,6 +551,7 @@ const deleteimage = (flag: string) => {
}
const upimageselect = async () => {
try {
updateexamineimage.value = []
updateexamineimage.value.push({
id: selecteimagedoneid.toString(),
isDelete: '',
@ -577,12 +586,15 @@ const loadimage = async () => {
switch (index) {
case 0:
selecteimagedone.value = image.imgUrl
selecteimagedoneid = image.id
break
case 1:
selecteimagedtwo.value = image.imgUrl
selecteimagedtwoid = image.id
break
case 2:
selecteimagedthree.value = image.imgUrl
selecteimagedthreeid = image.id
break
}
})
@ -605,8 +617,8 @@ const dataLoaded = ref(false) //是否加载网页
const tagLoaded = ref(true) //
const newSrc = ref('') //
//
const savedisabled = ref(true) //
const examinedisabled = ref(false) //
const savedisabled = ref(false) //
const examinedisabled = ref(true) //
const fordevicemValue = ref('') //
//()
const formLoading = ref(false)
@ -656,7 +668,7 @@ const resetForm = () => {
const getlogininfo = async () => {
Profilevo.value = await getUserProfile()
console.log('审核是否可见' + Profilevo.value.isimageexamine)
if (Profilevo.value.isimageexamine === '1') {
if (false && Profilevo.value.isimageexamine === '1') {
examinedisabled.value = true
}
}
@ -677,12 +689,17 @@ const getPatientexamlist = async (id: number) => {
notes.value = applyFormVO.value.notes
calculateAge(applyFormVO.value.birthday)
if (applyFormVO.value.reportstatus == '已分检' || applyFormVO.value.reportstatus == '待分析') {
if (
applyFormVO.value.reportstatus &&
(applyFormVO.value.reportstatus == '已分析' ||
applyFormVO.value.reportstatus == '已分检' ||
applyFormVO.value.reportstatus == '待分析')
) {
savedisabled.value = false
} else {
loadimage()
savedisabled.value = true
}
loadimage()
}
const age = ref()
@ -726,7 +743,9 @@ const iframeData = async () => {
localStorage.setItem('data', localStorageData)
localStorage.removeItem('regid_pathology')
localStorage.setItem('regid_pathology', regId.value)
const Src = `/static/dicom/dicomViewPc1.html?method=screenshot&t=${new Date().getTime()}`
localStorage.removeItem('orgId_pathology')
localStorage.setItem('orgId_pathology', orgId.value)
const Src = `/static/dicom/dicomViewPc1.html?method=PathologyView&t=${new Date().getTime()}`
newSrc.value = Src
} else {
// statussuccess
@ -763,7 +782,7 @@ const open = async (id: number, orgid: string, regid: string, examId: string, is
examid.value = examId
ID = id
dialogVisible.value = true
dialogTitle.value = '书写报告(影像)'
dialogTitle.value = '书写报告(病理)'
//
formLoading.value = true
try {
@ -786,6 +805,7 @@ const open = async (id: number, orgid: string, regid: string, examId: string, is
setTimeout(() => {
dataLoaded.value = true // iframe
}, 200)
if (savedisabled.value == false) getimages('')
} finally {
formLoading.value = false
}
@ -826,9 +846,6 @@ const save = async () => {
console.log('data:', response.data)
// ID
getPatientexamlist(ID)
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
emit('success')
} else {
//
@ -845,9 +862,11 @@ const examine = async () => {
const response = await PatientexamlistApi.examine(ID.toString())
if (response) {
message.alertSuccess('审核成功')
// ID
getPatientexamlist(ID)
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
images.value = []
emit('success')
}
} else if (applyFormVO.value.reportstatus === '已审核') {
@ -1001,7 +1020,7 @@ const PrintForm = () => {
transition: transform 0.3s ease; /* 添加过渡效果 */
}
.image-item:hover {
.image-item2:hover {
transform: scale(1.1); /* 放大容器 */
}
@ -1011,7 +1030,7 @@ const PrintForm = () => {
box-shadow: 0 0 10px blue;
}
.image-item:active {
.image-item2:active {
transform: scale(0.9); /* 缩小图像 */
}

View File

@ -22,93 +22,88 @@
clearable
@change="handleselectchange"
@clear="selectclear"
style="width: 100%"
>
<el-option label="门诊" value="门诊模版" />
<el-option label="住院" value="住院模版" />
<el-option label="体检" value="体检模版" />
</el-select>
<el-tabs type="border-card" style="height: 91.4vh;overflow: auto;">
<el-tabs type="border-card" style="border: none">
<el-tab-pane label="通用模版">
<!-- -->
<el-tree
style="min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="false"
:data="treeData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@check="handleTreeNodeClick"
ref="selectTree"
:expand-on-click-node="false"
/>
<el-scrollbar height="114vh" style="border: 2px solid rgb(220, 223, 230)">
<el-tree
style="padding-top: 15px; padding-bottom: 20px; min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="true"
:data="treeData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@check="handleTreeNodeClick"
ref="selectTree"
:expand-on-click-node="false"
/>
</el-scrollbar>
</el-tab-pane>
<el-tab-pane label="私有模版">
<!-- -->
<el-tree
style="min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="false"
:data="privateData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@node-click="handleTreeNodeClick"
ref="priselectTree"
:expand-on-click-node="false"
/>
<el-scrollbar height="114vh" style="border: 2px solid rgb(220, 223, 230)">
<el-tree
style="padding-top: 15px; padding-bottom: 20px; min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
:highlight-current="true"
:default-expand-all="true"
:data="privateData"
:props="treeDefaultProps"
node-key="id"
:show-checkbox="false"
:check-strictly="true"
@node-click="handleTreeNodeClick"
ref="priselectTree"
:expand-on-click-node="false"
/>
</el-scrollbar>
</el-tab-pane>
</el-tabs>
</div>
<!--用户信息区域-->
<div class="my-middle">
<!--用户信息区域 "-->
<el-tabs
v-model="activeName"
class="demo-tabs"
type="border-card"
style="height: 94.4vh"
style="border: none; width: 100%"
@tab-click="handleClick"
>
<el-tab-pane label="用户信息" name="first">
<div class="my-app-container">
<div>
<el-form
:model="applyFormVO"
label-width="auto"
style="max-width: 900px"
:inline="true"
label-width="96px"
style="max-width: 900px; margin-left: -22px"
:inline="false"
>
<el-row>
<el-col :span="7">
<el-form-item label="检查号" style="font-weight: bold">
<el-input
v-model="applyFormVO.examId"
style="width: 190px"
:disabled="true"
/>
<el-input v-model="applyFormVO.examId" style="width: 100%" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="姓名" style="font-weight: bold">
<el-input v-model="applyFormVO.pname" style="width: 190px" :disabled="true" />
<el-input v-model="applyFormVO.pname" style="width: 100%" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="性别" style="font-weight: bold">
<el-input
v-model="applyFormVO.gender"
style="width: 190px"
:disabled="true"
/>
<el-input v-model="applyFormVO.gender" style="width: 100%" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="7">
@ -118,7 +113,7 @@
type="date"
placeholder="出生日期"
size="default"
style="width: 190px"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
@ -130,16 +125,16 @@
type="datetime"
placeholder="检查时间"
size="default"
style="width: 190px"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查项目名称" style="font-weight: bold">
<el-col :span="9">
<el-form-item label="检查项目" style="font-weight: bold">
<el-input
v-model="applyFormVO.examItemName"
style="width: 190px"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
@ -152,21 +147,21 @@
type="datetime"
placeholder="检查时间"
size="default"
style="width: 190px"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="申请单号" style="font-weight: bold">
<el-input v-model="applyFormVO.regId" style="width: 190px" :disabled="true" />
<el-input v-model="applyFormVO.regId" style="width: 100%" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="9">
<el-form-item label="送检科室" style="font-weight: bold">
<el-input
v-model="applyFormVO.billDoctorDepartment"
style="width: 190px"
style="width: 100%"
:disabled="true"
/>
</el-form-item>
@ -175,6 +170,7 @@
</el-form>
</div>
<label style="text-align: center; font-size: 17px; font-weight: bold">超声图像</label>
<el-divider />
<!--图片显示区域-->
<div class="demo-image">
@ -195,7 +191,6 @@
:preview-src-list="[selecteimagedone]"
@load="handleLoad('1')"
@error="handleError('1')"
@dblclick="deleteimage('1')"
>
<template #error>
<div class="image-error">
@ -255,8 +250,8 @@
</el-image>
</el-card>
</div>
<el-divider />
<label style="text-align: center; font-size: 17px; font-weight: bold">检查所见</label>
<el-divider />
<el-input
v-model="sj"
style="width: 100%; font-size: 19px"
@ -264,8 +259,8 @@
type="textarea"
placeholder="检查所见"
/>
<el-divider />
<label style="font-size: 17px; font-weight: bold">诊断结论</label>
<el-divider />
<el-input
v-model="zdjl"
style="width: 100%; font-size: 19px"
@ -273,9 +268,10 @@
type="textarea"
placeholder="诊断结论"
/>
<el-divider />
<label style="font-size: 17px; font-weight: bold">报告备注</label>
<el-input v-model="notes" style="width: 100%; font-size: 19px" placeholder="" />
<el-divider />
<el-input v-model="notes" style="width: 100%; font-size: 19px" placeholder="报告备注" />
<el-divider />
<el-radio-group
v-model="radio1"
size="small"
@ -307,20 +303,36 @@
</el-form-item>
</div>
<el-button
style="width: 80px; float: right; margin-right: 15px; margin-top: 30px ;background-color: rgba(56, 119, 246, 1);font-size: 14; color: rgb(255, 255, 255);"
@click="save"
:disabled="savedisabled"
>保存</el-button
>
<el-button
type="primary"
plain
v-show="examinedisabled"
style="width: 80px; float: right; margin-right: 15px; margin-top: 30px;background-color: rgba(56, 119, 246, 1);font-size: 14; color: rgb(255, 255, 255);"
@click="examine"
>审核</el-button
>
<div style="text-align: right">
<el-button
type="primary"
plain
v-show="examinedisabled"
style="
width: 80px;
margin-right: 15px;
background-color: rgba(56, 119, 246, 1);
font-size: 14;
color: rgb(255, 255, 255);
"
@click="examine"
>
审核
</el-button>
<el-button
style="
width: 80px;
margin-right: 15px;
background-color: rgba(56, 119, 246, 1);
font-size: 14;
color: rgb(255, 255, 255);
"
@click="save"
:disabled="savedisabled"
>
保存
</el-button>
</div>
</el-tab-pane>
<el-tab-pane label="报告" name="report" v-if="false">
<!--报告区域-->
@ -363,55 +375,90 @@
<!--功能区-->
<div>
<el-button
style="width: 100px; float: right; background-color: rgba(56, 119, 246, 1);font-size: 14; color: rgb(255, 255, 255);"
style="
width: 100px;
float: right;
background-color: rgba(56, 119, 246, 1);
font-size: 14;
color: rgb(255, 255, 255);
"
class="ignore-print"
:disabled="formLoading"
v-print="'my-printMe'"
>打印</el-button
>
打印
</el-button>
<el-button
class="ignore-print"
style="width: 100px;background-color: rgba(56, 119, 246, 1);font-size: 14; color: rgb(255, 255, 255);"
style="
width: 100px;
background-color: rgba(56, 119, 246, 1);
font-size: 14;
color: rgb(255, 255, 255);
"
:disabled="formLoading"
@click="() => htmlToPdf.getPdf('超声报告单', '#PDF')"
>导出PDF</el-button
>
导出PDF
</el-button>
</div>
<div> </div>
</div>
</el-tab-pane>
</el-tabs>
</div>
<div class="my-right" style="border: 1px solid #dcdfe6; height: 94.4vh">
<!--图片区域-->
<!--图片区域-->
<div class="my-right">
<div style="width: 100%">
<el-button
style=" background-color: rgb(56, 119, 246); font-size: 14; color: rgb(255, 255, 255) ;width: 100%"
style="
background-color: rgb(56, 119, 246);
font-size: 14;
color: rgb(255, 255, 255);
width: 100%;
margin-top: 4px;
margin-bottom: 4px;
"
@click="getimages('')"
:disabled="savedisabled"
>
<el-icon style="margin-right: 10px"><RefreshLeft /></el-icon>
图像刷新
</el-button>
</div>
<div style="width: 100%">
<el-button
style="
background-color: rgb(56, 119, 246);
font-size: 14;
color: rgb(255, 255, 255);
width: 100%;
margin-bottom: 4px;
"
@click="upimagedeleteor()"
:disabled="savedisabled"
>
<el-icon style="margin-right: 10px;"><RefreshLeft/></el-icon></el-button
>
<el-icon style="margin-right: 10px"><DeleteFilled /></el-icon>
图像删除
</el-button>
</div>
<div style="width: 100%">
<el-button
style="background-color: rgb(56, 119, 246); font-size: 14; color: rgb(255, 255, 255) ;width: 100%"
@click="getimages('')"
:disabled="savedisabled"
>
<el-icon style="margin-right: 10px;"><DeleteFilled /></el-icon></el-button
>
</div>
<div style="width: 100%">
<el-button
style="background-color: rgb(56, 119, 246); font-size: 14; color: rgb(255, 255, 255) ;width: 100%"
style="
background-color: rgb(56, 119, 246);
font-size: 14;
color: rgb(255, 255, 255);
width: 100%;
margin-bottom: 4px;
"
@click="openvideo"
:disabled="savedisabled"
>
<el-icon style="margin-right: 10px;"><VideoCameraFilled/></el-icon></el-button
:disabled="savedisabled"
>
<el-icon style="margin-right: 10px"><VideoCameraFilled /></el-icon>
查看视频
</el-button>
</div>
<div class="image-container image-wrapper image-item-container">
<div class="image-container image-wrapper">
<el-image
class="image-item"
v-for="image in images"
@ -423,25 +470,24 @@
</div>
</div>
</div>
</el-dialog>
<!-- </Dialog> -->
<!-- 弹窗-->
<el-dialog v-model="dialogTableVisible" title="选择结论添加方式" width="320" align-center>
<div>
<el-button @click="handleButtonClick('覆盖')" type="primary" style="font-size: 20px"
>覆盖</el-button
>
<el-button @click="handleButtonClick('追加')" type="success" style="font-size: 20px"
>追加</el-button
>
<el-button @click="dialogTableVisible = false" type="info" style="font-size: 20px"
>关闭</el-button
>
<el-button @click="handleButtonClick('覆盖')" type="primary" style="font-size: 20px">
覆盖
</el-button>
<el-button @click="handleButtonClick('追加')" type="success" style="font-size: 20px">
追加
</el-button>
<el-button @click="dialogTableVisible = false" type="info" style="font-size: 20px">
关闭
</el-button>
</div>
</el-dialog>
<videoForm ref="videoformRef"/>
<videoForm ref="videoformRef" />
</template>
<script setup lang="ts">
@ -469,7 +515,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const examineFormVO = ref<PatientexamlistVO>({} as PatientexamlistVO)
const savedisabled = ref(true) //
const savedisabled = ref(false) //
const examinedisabled = ref(false) //
const isImageLoaded = ref(false) //
const isImageLoaded2 = ref(false) //
@ -477,7 +523,7 @@ const isImageLoaded3 = ref(false) //是否展示图片清除按钮
//
const handleLoad = (id: string) => {
if (applyFormVO.value.reportstatus == '已分析' || applyFormVO.value.reportstatus == '已审核') {
if (applyFormVO.value.reportstatus && applyFormVO.value.reportstatus == '已审核') {
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
@ -576,10 +622,6 @@ const save = async () => {
console.log('data:', response.data)
// ID
getPatientexamlist(ID)
//
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
emit('success')
} else {
//
@ -596,9 +638,12 @@ const examine = async () => {
const response = await PatientexamlistApi.examine(ID.toString())
if (response) {
message.alertSuccess('审核成功')
// ID
getPatientexamlist(ID)
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
images.value = []
//
loadimagelist()
emit('success')
@ -641,8 +686,15 @@ const reportimages = ref<any[]>([])
//
const getimages = async (type: string) => {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, type)
console.log(imageslist)
images.value = imageslist
//choose
deleteimageid.value = ''
let items = document.querySelectorAll('.image-item')
if (items) {
items.forEach((item) => {
item.classList.remove('image-item-selected')
})
}
}
//
const loadimage = async () => {
@ -653,12 +705,15 @@ const loadimage = async () => {
switch (index) {
case 0:
selecteimagedone.value = image.imgUrl
selecteimagedoneid = image.id
break
case 1:
selecteimagedtwo.value = image.imgUrl
selecteimagedtwoid = image.id
break
case 2:
selecteimagedthree.value = image.imgUrl
selecteimagedthreeid = image.id
break
}
})
@ -668,8 +723,6 @@ const loadimage = async () => {
//
const selectImage = (imageUrl: string, id: number) => {
console.log(imageUrl)
console.log(id)
if (selecteimagedone.value == '1') {
selecteimagedone.value = imageUrl
selecteimagedoneid = id
@ -704,6 +757,8 @@ const deleteimage = (flag: string) => {
}
//
const upimageselect = async () => {
updateexamineimage.value = []
updateexamineimage.value.push({
id: selecteimagedoneid.toString(),
isDelete: '',
@ -727,10 +782,13 @@ const upimageselect = async () => {
if (response) {
console.log('更新图片标识接口调用成功')
}
updateexamineimage.value = []
}
//
const upimagedeleteor = async () => {
updateexamineimage.value = []
updateexamineimage.value.push({
id: deleteimageid.value,
isDelete: '1',
@ -742,9 +800,10 @@ const upimagedeleteor = async () => {
if (response) {
console.log('删除图片标识接口调用成功')
}
//ID
deleteimageid.value = ''
updateexamineimage.value = []
getimages('')
}
//table
@ -767,10 +826,8 @@ const loadimagelist = async () => {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, '1')
console.log(imageslist)
reportimages.value = imageslist
}
} else {
}
}
@ -835,7 +892,6 @@ const selectclear = async () => {
}
const fordevicemData = ref<any[]>([])
const formRef = ref() // Ref
//
@ -869,8 +925,8 @@ const handleTreeNodeClick = async (data) => {
strsj = data.examDescription
pid = data.pid
console.log('父节点' + data.pid)
//
if (data.dataType === '0') {
//
if (data.dataType === '0') {
dialogTableVisible.value = true
}
}
@ -936,14 +992,14 @@ const open = async (id: number, orgid: string, regid: string) => {
//
getlogininfo()
if (savedisabled.value == false) getimages('')
} finally {
formLoading.value = false
}
}
//
const videoformRef=ref()
const openvideo=()=>
{
const videoformRef = ref()
const openvideo = () => {
videoformRef.value.open(regId.value)
}
@ -958,13 +1014,17 @@ const getPatientexamlist = async (id: number) => {
notes.value = applyFormVO.value.notes
calculateAge(applyFormVO.value.birthday)
if (applyFormVO.value.reportstatus == '已分检' || applyFormVO.value.reportstatus == '待分析') {
if (
applyFormVO.value.reportstatus &&
(applyFormVO.value.reportstatus == '已分析' ||
applyFormVO.value.reportstatus == '已分检' ||
applyFormVO.value.reportstatus == '待分析')
) {
savedisabled.value = false
} else {
//
loadimage()
savedisabled.value = true
}
loadimage()
//
loadimagelist()
}
@ -997,6 +1057,9 @@ const resetForm = () => {
activeName.value = 'first'
deleteimageid.value = ''
updateexamineimage.value = []
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
//
selecteimagedone.value = '1'
//
@ -1035,10 +1098,9 @@ const chooseImage = (event, id: number) => {
}
</script>
<style>
<style scoped>
.my-container-cs {
display: flex;
height: calc(100% - 40px);
}
/* .my-container * {
@ -1051,33 +1113,28 @@ const chooseImage = (event, id: number) => {
}
.my-left {
width: 20%;
background: lightblue;
height: 91.4vh;
overflow: auto;
flex: 28;
min-width: 0;
border: 1px solid rgb(220, 223, 230);
}
.my-middle {
width: 60%;
margin-left: 2px;
background: rgb(238, 240, 238);
height: 94.4vh;
flex: 58;
min-width: 0;
border: 1px solid rgb(220, 223, 230);
margin-left: 6px;
margin-right: 6px;
}
.my-right {
width: 20%;
background: rgb(255, 255, 255);
display: flex;
flex-direction: column;
align-items: flex-start;
height: 91.3vh;
flex: 14;
min-width: 0;
padding-left: 4px;
padding-right: 4px;
margin-right: 14px;
border: 1px solid rgb(220, 223, 230);
}
.my-app-container {
display: flex;
justify-content: center;
align-items: center;
}
/* 分割线内部的间距 */
.el-divider--horizontal {
margin: 6px;
@ -1085,6 +1142,7 @@ const chooseImage = (event, id: number) => {
.demo-image {
display: flex;
justify-content: center;
margin-bottom: 10px;
}
.demo-image .el-card:not(:last-child) {
@ -1123,17 +1181,17 @@ const chooseImage = (event, id: number) => {
transition: transform 0.3s ease; /* 添加过渡效果 */
}
.image-item:hover {
.image-item2:hover {
transform: scale(1.1); /* 放大容器 */
}
.image-item-selected {
outline: none;
border-color: yellow;
box-shadow: 0 0 10px yellow;
border-color: blue;
box-shadow: 0 0 10px blue;
}
.image-item:active {
.image-item2:active {
transform: scale(0.9); /* 缩小图像 */
}
/* 诊断医生等样式 */