病理相关

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", "@wangeditor/editor-for-vue": "^5.1.10",
"@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/core": "^3.0.4",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"autofit.js": "^3.1.4",
"axios": "^1.6.8", "axios": "^1.6.8",
"benz-amr-recorder": "^1.1.5", "benz-amr-recorder": "^1.1.5",
"bpmn-js-token-simulation": "^0.10.0", "bpmn-js-token-simulation": "^0.10.0",

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<template> <template>
<div id="indexPage">
<span class="my-span" style="margin-left: 14px">快捷入口</span> <span class="my-span" style="margin-left: 14px">快捷入口</span>
<div class="my-quickdiv"> <div class="my-quickdiv">
<ContentWrap class="my-quick" v-for="(item, index) in projects" :key="`ContentWrap-${index}`"> <ContentWrap class="my-quick" v-for="(item, index) in projects" :key="`ContentWrap-${index}`">
<router-link <router-link
@ -24,7 +24,13 @@
<span class="my-span">累计已检查登记单概况</span> <span class="my-span">累计已检查登记单概况</span>
<div class="div-inline"> <div class="div-inline">
<div v-if="isDataReady" style="background-color: rgb(243, 247, 254)"> <div v-if="isDataReady" style="background-color: rgb(243, 247, 254)">
<YY :mytotalcount=totalcount :myy="y" :myyx="yx" :myzdyx="zdyx" style="height: 300px" /> <YY
:mytotalcount="totalcount"
:myy="y"
:myyx="yx"
:myzdyx="zdyx"
style="height: 300px"
/>
</div> </div>
<div class="flex-gap"></div> <div class="flex-gap"></div>
<!-- 间隙 --> <!-- 间隙 -->
@ -38,7 +44,12 @@
<ContentWrap class="my-quickstatistics"> <ContentWrap class="my-quickstatistics">
<span class="my-span">已检查登记单概况分布</span> <span class="my-span">已检查登记单概况分布</span>
<div v-if="iszxDataReady"> <div v-if="iszxDataReady">
<zx :yxArray="yxArray" :yArray="yArray" :zdyxArray="zdyxArray" style="height: 300px" /> <zx
:yxArray="yxArray"
:yArray="yArray"
:zdyxArray="zdyxArray"
style="height: 300px"
/>
</div> </div>
</ContentWrap> </ContentWrap>
</div> </div>
@ -49,7 +60,12 @@
<ContentWrap class="my-right-statistics" style="height: 753px"> <ContentWrap class="my-right-statistics" style="height: 753px">
<span class="my-span" style="margin-left: 10px">检查状态概况</span> <span class="my-span" style="margin-left: 10px">检查状态概况</span>
<div <div
style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px" style="
display: flex;
align-items: flex-start;
justify-content: center;
margin-top: 50px;
"
> >
<img src="/static/djdtj.jpg" style="width: 55px; height: 60px" /> <img src="/static/djdtj.jpg" style="width: 55px; height: 60px" />
<div <div
@ -66,9 +82,14 @@
</div> </div>
<el-divider /> <el-divider />
<div <div
style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px" 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;" /> <img src="/static/djwfj.jpg" style="width: 55px; height: 60px; margin-left: 40px" />
<div <div
style=" style="
margin-left: 10px; margin-left: 10px;
@ -80,13 +101,20 @@
<span style="color: rgb(128, 128, 128)">登记单未分检数</span> <span style="color: rgb(128, 128, 128)">登记单未分检数</span>
<span class="my-span" style="margin-top: 8px">{{ wfj }}</span> <span class="my-span" style="margin-top: 8px">{{ wfj }}</span>
</div> </div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px">({{usePercentageCalculation(regtotalcount,wfj)}}%)</span> <span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px"
>({{ usePercentageCalculation(regtotalcount, wfj) }}%)</span
>
</div> </div>
<!-- --> <!-- -->
<div <div
style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px" 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;" /> <img src="/static/djwjc.jpg" style="width: 55px; height: 60px; margin-left: 40px" />
<div <div
style=" style="
margin-left: 10px; margin-left: 10px;
@ -98,11 +126,20 @@
<span style="color: rgb(128, 128, 128)">登记单未检查数</span> <span style="color: rgb(128, 128, 128)">登记单未检查数</span>
<span class="my-span" style="margin-top: 8px">{{ wjc }}</span> <span class="my-span" style="margin-top: 8px">{{ wjc }}</span>
</div> </div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px">({{usePercentageCalculation(regtotalcount,wjc)}}%)</span> <span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px"
>({{ usePercentageCalculation(regtotalcount, wjc) }}%)</span
>
</div> </div>
<!-- --> <!-- -->
<div style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px"> <div
<img src="/static/djyjc.jpg" style="width: 55px; height: 60px;margin-left: 40px;" /> 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 <div
style=" style="
margin-left: 10px; margin-left: 10px;
@ -111,14 +148,23 @@
align-items: flex-start; align-items: flex-start;
" "
> >
<span style="color: rgb(128, 128, 128);">登记单已检查数</span> <span style="color: rgb(128, 128, 128)">登记单已检查数</span>
<span class="my-span" style="margin-top: 8px;">{{yjc}}</span> <span class="my-span" style="margin-top: 8px">{{ yjc }}</span>
</div> </div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px;">({{usePercentageCalculation(regtotalcount,yjc)}}%)</span> <span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px"
>({{ usePercentageCalculation(regtotalcount, yjc) }}%)</span
>
</div> </div>
<!-- --> <!-- -->
<div style="display: flex; align-items: flex-start; justify-content: center; margin-top: 50px"> <div
<img src="/static/djfq.jpg" style="width: 55px; height: 60px;margin-left: 40px;" /> 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 <div
style=" style="
margin-left: 10px; margin-left: 10px;
@ -127,20 +173,24 @@
align-items: flex-start; align-items: flex-start;
" "
> >
<span style="color: rgb(128, 128, 128);">登记单已放弃数</span> <span style="color: rgb(128, 128, 128)">登记单已放弃数</span>
<span class="my-span" style="margin-top: 8px;">{{yfq}}</span> <span class="my-span" style="margin-top: 8px">{{ yfq }}</span>
</div> </div>
<span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px;">({{usePercentageCalculation(regtotalcount,yfq)}}%)</span> <span style="color: rgb(128, 128, 128); margin-left: auto; margin-top: 20px"
>({{ usePercentageCalculation(regtotalcount, yfq) }}%)</span
>
</div> </div>
</ContentWrap> </ContentWrap>
</div> </div>
</div> </div>
</div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import autofit from 'autofit.js'
import { set } from 'lodash-es' import { set } from 'lodash-es'
import { EChartsOption } from 'echarts' import { EChartsOption } from 'echarts'
import { formatTime } from '@/utils' import { formatTime } from '@/utils'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import { useWatermark } from '@/hooks/web/useWatermark' import { useWatermark } from '@/hooks/web/useWatermark'
import type { WorkplaceTotal, Project, Notice, Shortcut } from './types' import type { WorkplaceTotal, Project, Notice, Shortcut } from './types'
@ -153,8 +203,25 @@ import { ApplyformApi } from '@/api/applyregistration/applyform'
defineOptions({ name: 'Home' }) defineOptions({ name: 'Home' })
const isDataReady = ref(false); onMounted(async () => {
const iszxDataReady = ref(false); 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 { t } = useI18n()
const userStore = useUserStore() const userStore = useUserStore()
const { setWatermark } = useWatermark() const { setWatermark } = useWatermark()
@ -163,7 +230,6 @@ const avatar = userStore.getUser.avatar
const username = userStore.getUser.nickname const username = userStore.getUser.nickname
const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption const pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption
// //
let projects = reactive<Project[]>([]) let projects = reactive<Project[]>([])
const getProject = async () => { const getProject = async () => {
@ -201,8 +267,7 @@ const totalcount=ref()
const zdyx = ref() const zdyx = ref()
const F = ref() const F = ref()
const M = ref() const M = ref()
const GetWholeDiagFlagCount=async ()=> const GetWholeDiagFlagCount = async () => {
{
const data = await PatientexamlistApi.WholeDiagFlagCount() const data = await PatientexamlistApi.WholeDiagFlagCount()
totalcount.value = data.totalcount // totalcount.value = data.totalcount //
y.value = data.y y.value = data.y
@ -210,15 +275,14 @@ const GetWholeDiagFlagCount=async ()=>
zdyx.value = data.zdyx zdyx.value = data.zdyx
F.value = data.f F.value = data.f
M.value = data.m M.value = data.m
console.log("统计"+ data.f) console.log('统计' + data.f)
isDataReady.value = true isDataReady.value = true
} }
// 70 // 70
const yxArray = ref(new Array(7).fill(0)); const yxArray = ref(new Array(7).fill(0))
const yArray = ref(new Array(7).fill(0)); const yArray = ref(new Array(7).fill(0))
const zdyxArray = ref(new Array(7).fill(0)); const zdyxArray = ref(new Array(7).fill(0))
const GetDateYYZDYXCount = async () => { const GetDateYYZDYXCount = async () => {
const data = await PatientexamlistApi.GetDateYYZDYXCount() const data = await PatientexamlistApi.GetDateYYZDYXCount()
@ -232,14 +296,12 @@ const GetDateYYZDYXCount =async () => {
iszxDataReady.value = true iszxDataReady.value = true
} }
const regtotalcount = ref(0) const regtotalcount = ref(0)
const wfj = ref(0) const wfj = ref(0)
const wjc = ref(0) const wjc = ref(0)
const yjc = ref(0) const yjc = ref(0)
const yfq = ref(0) const yfq = ref(0)
const GetReglistCount=async ()=> const GetReglistCount = async () => {
{
const data = await ApplyformApi.GetReglistCount() const data = await ApplyformApi.GetReglistCount()
regtotalcount.value = data.totalcount regtotalcount.value = data.totalcount
wfj.value = data.wfj wfj.value = data.wfj
@ -251,29 +313,34 @@ const GetReglistCount=async ()=>
// //
function usePercentageCalculation(total, value) { function usePercentageCalculation(total, value) {
return computed(() => { return computed(() => {
const totalNum = parseInt(total); // const totalNum = parseInt(total) //
const valueNum = parseInt(value); // const valueNum = parseInt(value) //
// total00 // total00
if (totalNum <= 0) { if (totalNum <= 0) {
return 0; return 0
} }
// total0 // 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 barOptionsData = reactive<EChartsOption>(barOptions) as EChartsOption
const getAllApi = async () => { const getAllApi = async () => {
await Promise.all([getProject(),GetWholeDiagFlagCount(),GetDateYYZDYXCount(),GetReglistCount()]) await Promise.all([
getProject(),
GetWholeDiagFlagCount(),
GetDateYYZDYXCount(),
GetReglistCount()
])
loading.value = false loading.value = false
} }
// getAllApi // getAllApi
onMounted(getAllApi); // onMounted(getAllApi)
// //
function getImageUrl(name) { function getImageUrl(name) {
@ -312,8 +379,6 @@ function getarrowImageUrl(name) {
} }
return imageMap[name] || '/static/djjt.jpg' // return imageMap[name] || '/static/djjt.jpg' //
} }
</script> </script>
<style scoped> <style scoped>
.menu-button { .menu-button {

View File

@ -2,7 +2,7 @@
<div class="ultrasound-report"> <div class="ultrasound-report">
<el-row style="font-size: 14px"> <el-row style="font-size: 14px">
<el-col :span="12"> <el-col :span="12">
<h2 class="ml-6px">科右前旗康立寿医院</h2> <h2 class="ml-6px">{{ orgInfo?.orgName }}</h2>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<h2 style="text-align: right" class="mr-6px">CT检查报告单</h2> <h2 style="text-align: right" class="mr-6px">CT检查报告单</h2>
@ -75,6 +75,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { formatDate } from '@/utils/formatTime' import { formatDate } from '@/utils/formatTime'
import { getUserProfile } from '@/api/system/user/profile'
import { ReportPrintStatisticsApi } from '@/api/applyregistration/reportPrintStatistics'
defineOptions({ name: 'ReportInfoCT' }) 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 VITE_BASE_URL_YunJiaoPian = ref(import.meta.env.VITE_BASE_URL_YunJiaoPian)
const age = computed(() => { 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'"> <template v-if="reportInfoType == 'ct'">
<ReportInfoCT v-bind="{ ...infoParams, showQRcode }" class="page-item" /> <ReportInfoCT v-bind="{ ...infoParams, showQRcode }" class="page-item" />
</template> </template>
<template v-if="reportInfoType == 'csh1'">
<ReportInfoPathology v-bind="{ ...infoParams, showQRcode }" class="page-item" />
</template>
</div> </div>
<div style="margin-bottom: 40px"></div> <div style="margin-bottom: 40px"></div>
</div> </div>
@ -453,6 +456,11 @@
v-if="item.deviceType && item.deviceType.trim().toLowerCase() == 'us'" v-if="item.deviceType && item.deviceType.trim().toLowerCase() == 'us'"
class="page-item" 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" /> <ReportInfoCT v-bind="{ ...item, showQRcode }" v-else class="page-item" />
</template> </template>
</div> </div>
@ -473,6 +481,7 @@ import { getUserProfile } from '@/api/system/user/profile'
import { ElLoading } from 'element-plus' import { ElLoading } from 'element-plus'
import ReportInfoCT from './ReportInfoCT.vue' import ReportInfoCT from './ReportInfoCT.vue'
import ReportInfoUS from './ReportInfoUS.vue' import ReportInfoUS from './ReportInfoUS.vue'
import ReportInfoPathology from './ReportInfoPathology.vue'
defineOptions({ name: 'ReportPrintStatistics' }) defineOptions({ name: 'ReportPrintStatistics' })
/* /*
@ -683,6 +692,8 @@ const handleRowClick = async (row) => {
examItemNameEdit.value = row.examItemName examItemNameEdit.value = row.examItemName
examItemNameEditShow.value = true examItemNameEditShow.value = true
if (row.deviceType && row.deviceType.trim().toLowerCase() == 'us') reportInfoType.value = 'us' 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' else reportInfoType.value = 'ct'
} }
await showQRcodeSet() await showQRcodeSet()

View File

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

View File

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

View File

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