Compare commits

...

2 Commits

Author SHA1 Message Date
lxd
e0ed5a7680 Merge branch 'master' of http://114.55.171.231:3000/lxd/FlowVue 2024-08-15 13:14:01 +08:00
lxd
0151e97269 完善影像 2024-08-15 13:11:18 +08:00
14 changed files with 170 additions and 127 deletions

4
.env
View File

@ -11,10 +11,10 @@ VITE_OPEN=true
VITE_APP_TENANT_ENABLE=true
# 验证码的开关
VITE_APP_CAPTCHA_ENABLE=true
VITE_APP_CAPTCHA_ENABLE=false
# 文档地址的开关
VITE_APP_DOCALERT_ENABLE=true
VITE_APP_DOCALERT_ENABLE=false
# 百度统计
VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc

View File

@ -1,15 +1,15 @@
# 开发环境本地只启动前端项目依赖开发环境后端、APP
NODE_ENV=production
VITE_DEV=true
VITE_DEV=false
# 请求路径
VITE_BASE_URL='http://api-dashboard.yudao.iocoder.cn'
VITE_BASE_URL='http://localhost:48080'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server
# 上传路径
VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload'
VITE_UPLOAD_URL='http://114.55.171.231:48080/admin-api/infra/file/upload'
# 接口地址
VITE_API_URL=/admin-api
@ -33,4 +33,4 @@ VITE_OUT_DIR=dist
VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn'
# 验证码的开关
VITE_APP_CAPTCHA_ENABLE=true
VITE_APP_CAPTCHA_ENABLE=false

View File

@ -1,33 +1,36 @@
# 生产环境:只在打包时使用
# 开发环境本地只启动前端项目依赖开发环境后端、APP
NODE_ENV=production
VITE_DEV=false
# 请求路径
VITE_BASE_URL='http://localhost:48080'
VITE_BASE_URL='http://114.55.171.231:48080'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server
# 上传路径
VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
VITE_UPLOAD_URL='http://114.55.171.231:48080/admin-api/infra/file/upload'
# 接口地址
VITE_API_URL=/admin-api
# 是否删除debugger
VITE_DROP_DEBUGGER=true
VITE_DROP_DEBUGGER=false
# 是否删除console.log
VITE_DROP_CONSOLE=true
VITE_DROP_CONSOLE=false
# 是否sourcemap
VITE_SOURCEMAP=false
VITE_SOURCEMAP=true
# 打包路径
VITE_BASE_PATH=/
# 输出路径
VITE_OUT_DIR=dist-prod
VITE_OUT_DIR=dist
# 商城H5会员端域名
VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn'
# 验证码的开关
VITE_APP_CAPTCHA_ENABLE=false

BIN
public/static/ctlogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -102,6 +102,8 @@
.series_img {
border: 0px solid green;
width: 70px;
height: 70px;
}
.series_img_active {
@ -304,31 +306,31 @@
<body>
<div id="container">
<div id="top-menu" class="btn-group">
<button type="button" id="Magnify" class="btn btn-default" onclick="switchAction('Magnify',1,this)">Magnify</button>
<button type="button" id="Pan" class="btn btn-default" onclick="switchAction('Pan',1,this)">Pan</button>
<button type="button" id="Zoom" class="btn btn-default" onclick="switchAction('Zoom',1,this)">Zoom</button>
<button type="button" id="ZoomMouseWheel" class="btn btn-default" onclick="switchAction('ZoomMouseWheel',1,this)">ZoomMouseWheel</button>
<button type="button" id="Wwwc" class="btn btn-default" onclick="switchAction('Wwwc',1,this)">Wwwc</button>
<button type="button" id="WwwcRegion" class="btn btn-default" onclick="switchAction('WwwcRegion',1,this)">WwwcRegion</button>
<button type="button" id="ScaleOverlay" class="btn btn-default" onclick="switchAction('ScaleOverlay',1,this)">ScaleOverlay</button>
<button type="button" id="Rotate" class="btn btn-default" onclick="switchAction('Rotate',1,this)">Rotate</button>
<button type="button" id="OrientationMarkers" class="btn btn-default" onclick="switchAction('OrientationMarkers',1,this)">OrientationMarkers</button>
<button type="button" id="Angle" class="btn btn-default" onclick="switchAction('Angle',1,this)">Angle</button>
<button type="button" id="ArrowAnnotate" class="btn btn-default" onclick="switchAction('ArrowAnnotate',1,this)">ArrowAnnotate</button>
<button type="button" id="Bidirectional" class="btn btn-default" onclick="switchAction('Bidirectional',1,this)">Bidirectional</button>
<button type="button" id="CobbAngle" class="btn btn-default" onclick="switchAction('CobbAngle',1,this)">CobbAngle</button>
<button type="button" id="EllipticalRoi" class="btn btn-default" onclick="switchAction('EllipticalRoi',1,this)">EllipticalRoi</button>
<button type="button" id="FreehandRoi" class="btn btn-default" onclick="switchAction('FreehandRoi',1,this)">FreehandRoi</button>
<button type="button" id="Length" class="btn btn-default" onclick="switchAction('Length',1,this)">Length</button>
<button type="button" id="Probe" class="btn btn-default" onclick="switchAction('Probe',1,this)">Probe</button>
<button type="button" id="RectangleRoi" class="btn btn-default" onclick="switchAction('RectangleRoi',1,this)">RectangleRoi</button>
<button type="button" id="TextMarker" class="btn btn-default" onclick="switchAction('TextMarker',1,this)">TextMarker</button>
<button type="button" id="StackScroll" class="btn btn-default" onclick="switchAction('StackScroll',1,this)">StackScroll</button>
<button type="button" id="StackScrollMouseWheel" class="btn btn-default" onclick="switchAction('StackScrollMouseWheel',1,this)">StackScrollMouseWheel</button>
<button type="button" id="Magnify" class="btn btn-default" onclick="switchAction('Magnify',1,this)">放大镜</button>
<button type="button" id="Pan" class="btn btn-default" onclick="switchAction('Pan',1,this)">平移</button>
<button type="button" id="Zoom" class="btn btn-default" onclick="switchAction('Zoom',1,this)">缩放</button>
<button type="button" id="ZoomMouseWheel" class="btn btn-default" onclick="switchAction('ZoomMouseWheel',1,this)">滚轮缩放</button>
<button type="button" id="Wwwc" class="btn btn-default" onclick="switchAction('Wwwc',1,this)">对比度</button>
<button type="button" id="WwwcRegion" class="btn btn-default" onclick="switchAction('WwwcRegion',1,this)">选区对比度</button>
<button type="button" id="ScaleOverlay" class="btn btn-default" onclick="switchAction('ScaleOverlay',1,this)">比例尺</button>
<button type="button" id="Rotate" class="btn btn-default" onclick="switchAction('Rotate',1,this)">旋转</button>
<button type="button" id="OrientationMarkers" class="btn btn-default" onclick="switchAction('OrientationMarkers',1,this)">方向标记</button>
<button type="button" id="Angle" class="btn btn-default" onclick="switchAction('Angle',1,this)">角度</button>
<button type="button" id="ArrowAnnotate" class="btn btn-default" onclick="switchAction('ArrowAnnotate',1,this)">箭头注释</button>
<button type="button" id="Bidirectional" class="btn btn-default" onclick="switchAction('Bidirectional',1,this)">长宽尺</button>
<button type="button" id="CobbAngle" class="btn btn-default" onclick="switchAction('CobbAngle',1,this)">科布角</button>
<button type="button" id="EllipticalRoi" class="btn btn-default" onclick="switchAction('EllipticalRoi',1,this)">椭圆选区</button>
<button type="button" id="FreehandRoi" class="btn btn-default" onclick="switchAction('FreehandRoi',1,this)">自由选区</button>
<button type="button" id="Length" class="btn btn-default" onclick="switchAction('Length',1,this)">长度尺</button>
<button type="button" id="Probe" class="btn btn-default" onclick="switchAction('Probe',1,this)">探针</button>
<button type="button" id="RectangleRoi" class="btn btn-default" onclick="switchAction('RectangleRoi',1,this)">矩形选区</button>
<button type="button" id="TextMarker" class="btn btn-default" onclick="switchAction('TextMarker',1,this)">文本标记</button>
<button type="button" id="StackScroll" class="btn btn-default" onclick="switchAction('StackScroll',1,this)">左键翻页</button>
<button type="button" id="StackScrollMouseWheel" class="btn btn-default" onclick="switchAction('StackScrollMouseWheel',1,this)">滚轮翻页</button>
<button type="button" id="invert" class="btn btn-default" onclick="invert(1,this)">反转色</button>
<button type="button" id="changeColorx" class="btn btn-default" onclick="changColor(1,this)">改变颜色</button>
<button type="button" id="changeColorx" class="btn btn-default" onclick="changColor(1,this)">彩色对比</button>
<button type="button" class="btn btn-default" onclick="resetTool()">重置</button>
<input type="text" id='row-count' placeholder="行数" value='1' /> x <input type="text" id='column-count' placeholder="列数" value='1' /> <input type='button' onclick="doCreate()" value="生成" />
<input type="text" id='row-count' placeholder="行数" value='1' /> x <input type="text" id='column-count' placeholder="列数" value='1' /> <input type='button' onclick="doCreate()" value="多视窗" />
</div>
<div id="body-part">

View File

@ -438,6 +438,7 @@ function initImgList(data) {
className += "_active";
}
$("#dicom-list").append('<img id="img_' + i + '" onclick="changeIndex(' + i + ')" class="' + className + '" src="' + data.seriesList[i].thumbUrl + '"/>');
$("#dicom-list").append('<h6 style="color: white; id="h_' + i + '" onclick="changeIndex(' + i + ')" >"'+data.seriesList[i].SeriesDesc+'"</h6>');
}
}

View File

@ -31,6 +31,7 @@ export interface PatientexamlistVO {
deviceName: string // 影像设备名称
notes:string//备注
billDoctorDepartment:string// 开单科室 送检科室
StudyInsta:string
}
// PACS检查列表 API

View File

@ -30,7 +30,7 @@ export const ultrasoniccomApi = {
},
//获取dicom数据
getdcmlist: async () => {
return await request.get({ url: `/ultrasoniccom/ultrasonic/getdcm`})
getdcmlist: async (studyInsta:string,orgid:string,regId:string) => {
return await request.get({ url: `/ultrasoniccom/ultrasonic/getdcm?orgID=${orgid}&&studyInsta=${studyInsta}&&regId=${regId}`})
},
}

View File

@ -40,16 +40,26 @@ export const usePermissionStore = defineStore('permission', {
}
const routerMap: AppRouteRecordRaw[] = generateRoute(res)
// 动态路由404一定要放到最后面
// 李晓东
this.addRouters = routerMap.concat([
{
path: '/:path(.*)*',
redirect: '/404',
name: '404Page',
meta: {
hidden: true,
breadcrumb: false
}
}
// {
// path: '/:path(.*\.html)*',
// redirect: '/403',
// name: 'allowHtml',
// meta: {
// hidden: true,
// breadcrumb: false
// }
// },
// {
// path: '/:path(.*)*',
// redirect: '/404',
// name: '404Page',
// meta: {
// hidden: true,
// breadcrumb: false
// }
// }
])
// 渲染菜单的所有路由
this.routers = cloneDeep(remainingRouter).concat(routerMap)

View File

@ -21,8 +21,8 @@
<el-option
v-for="item in fordevicemData"
:key="item.deviceId"
:label="item.deviceName + '|' + item.deviceType + '|' + item.deviceId+'|'+item.ScheduledAET"
:value="item.deviceName + '|' + item.deviceId + '|' + item.deviceType+'|'+item.ScheduledAET"
:label="item.deviceName + '|' + item.deviceType + '|' + item.deviceId+'|'+item.scheduledAET"
:value="item.deviceName + '|' + item.deviceId + '|' + item.deviceType+'|'+item.scheduledAET"
/>
</el-select>
</el-form-item>

View File

@ -479,16 +479,23 @@ const handleselectchange = async () => {
let ID: number
//orgid
const orgId = ref('')
//regid
const regId = ref('')
const examid = ref('')
//
const newSrc = ref('')
/** 打开弹窗 */
const open = async (id: number, orgid: string, regid: string) => {
const open = async (
id: number,
orgid: string,
regid: string,
examId: string
) => {
resetForm()
const Src = `/dicom/dicomViewPc1.html?t=${new Date().getTime()}`
const Src = `/static/dicom/dicomViewPc1.html?t=${new Date().getTime()}`
// const Src="D:\pacs\vue\FlowVue-1\dist-prod\dicom\dicomViewPc1.html"+"?"+new Date().getTime()
newSrc.value = Src
console.log('orgid' + orgid)
@ -496,6 +503,7 @@ const open = async (id: number, orgid: string, regid: string) => {
console.log('id' + id)
orgId.value = orgid
regId.value = regid
examid.value = examId
ID = id
dialogVisible.value = true
dialogTitle.value = '书写报告(影像)'
@ -527,15 +535,17 @@ const open = async (id: number, orgid: string, regid: string) => {
//
const iframeData = async () => {
try {
const response = await ultrasoniccomApi.getdcmlist()
const response = await ultrasoniccomApi.getdcmlist(examid.value, orgId.value, regId.value)
if (response) {
//html
var localData = {
regid: '', // 'someNumber'
orgId: '' ,// 'someOrgId' ID
do:response
orgId: '', // 'someOrgId' ID
do: response
}
// 'data'
localStorage.removeItem('data')
// JSON
var localStorageData = JSON.stringify(localData)
localStorage.setItem('data', localStorageData)

View File

@ -448,17 +448,19 @@ const exportLoading = ref(false) // 导出的加载中
/** 影像组件 */
const dicomViewRef = ref()
const opendicomViewFrom = (id: number, orgid: string, regid: string) => {
dicomViewRef.value.open(id, orgid, regid)
}
const opendicomViewFrom= (id: number, orgid: string, regid: string,examId:string) => {
dicomViewRef.value.open(id, orgid, regid,examId)
/** 表格行点击 */
const clickNumber = ref(0)
function handleEdit(row) {
console.log(111111121212)
if (row.deviceType != 'US') {
//US
opendicomViewFrom(row.id, row.orgId, row.regId)
}
if(!row.deviceType.includes("US"))//US
{
opendicomViewFrom(row.id,row.orgId,row.regId,row.examId)
/* clickNumber.value++;
if (clickNumber.value == 2) {
@ -466,6 +468,7 @@ function handleEdit(row) {
}
clickNumber.value = 0; */
}
}
/** aaaaa **/
const examDate_picker = ref(null)

View File

@ -457,11 +457,10 @@ const openultrForm = (id: number, orgid: string, regid: string) => {
const clickNumber = ref(0)
function handleEdit(row) {
console.log(111111121212)
openultrForm(row.id, row.orgId, row.regId)
if (row.deviceType == 'US') {
//US
openultrForm(row.id, row.orgId, row.regId)
}
if(row.deviceType.includes("US"))//US
{
openultrForm(row.id,row.orgId,row.regId)
/* clickNumber.value++;
if (clickNumber.value == 2) {
@ -469,6 +468,7 @@ function handleEdit(row) {
}
clickNumber.value = 0; */
}
}
/** aaaaa **/
const examDate_picker = ref(null)

View File

@ -27,11 +27,11 @@
<el-option label="体检" value="体检模版" />
</el-select>
<el-tabs type="border-card" style="height: 91.4vh; ">
<el-tabs type="border-card" style="height: 91.4vh">
<el-tab-pane label="通用模版">
<!-- -->
<el-tree
style="min-width: 195px;"
style="min-width: 195px"
v-loading="formLoading"
class="treeStyle"
:check-on-click-node="true"
@ -76,19 +76,19 @@
class="demo-tabs"
type="border-card"
style="height: 94.4vh"
@tab-change="handleTabChange"
@tab-click="handleClick"
>
<el-tab-pane label="用户信息" name="first" >
<div class="my-app-container" >
<el-tab-pane label="用户信息" name="first">
<div class="my-app-container">
<el-form
:model="applyFormVO"
label-width="auto"
style="max-width: 900px;"
style="max-width: 900px"
:inline="true"
>
<el-row>
<el-col :span="7">
<el-form-item label="检查号" style="font-weight: bold;">
<el-form-item label="检查号" style="font-weight: bold">
<el-input
v-model="applyFormVO.examId"
style="width: 190px"
@ -97,12 +97,12 @@
</el-form-item>
</el-col>
<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-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="性别" style="font-weight: bold;">
<el-form-item label="性别" style="font-weight: bold">
<el-input
v-model="applyFormVO.gender"
style="width: 190px"
@ -255,7 +255,7 @@
<label style="text-align: center; font-size: 17px; font-weight: bold">检查所见</label>
<el-input
v-model="sj"
style="width: 100%;font-size:19px;"
style="width: 100%; font-size: 19px"
:rows="5"
type="textarea"
placeholder="检查所见"
@ -264,14 +264,14 @@
<label style="font-size: 17px; font-weight: bold">诊断结论</label>
<el-input
v-model="zdjl"
style="width: 100%;font-size:19px;"
style="width: 100%; font-size: 19px"
:rows="5"
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-input v-model="notes" style="width: 100%; font-size: 19px" placeholder="" />
<el-radio-group
v-model="radio1"
size="small"
@ -306,7 +306,7 @@
<el-button
type="success"
plain
style="width: 80px; float: right; margin-right: 15px;margin-top: 30px"
style="width: 80px; float: right; margin-right: 15px; margin-top: 30px"
@click="save"
:disabled="savedisabled"
>保存</el-button
@ -320,9 +320,9 @@
>审核</el-button
>
</el-tab-pane>
<el-tab-pane label="报告" name="report" >
<el-tab-pane label="报告" name="report">
<!--报告区域-->
<div id="my-printMe" style="height: calc(100% - 15px)">
<div style="height: calc(100% - 15px)">
<div class="my-ultrasound-report1" id="PDF">
<h2>超声检查报告单</h2>
<hr />
@ -340,7 +340,7 @@
<!-- 图片展示区域 -->
<h3>超声图像</h3>
<div class="my-image-gallery1">
<div v-for="image in reportimages" :key="image.id">
<div v-for="image in reportimages" :key="image.id">
<img :src="image.imgUrl" alt="" style="width: 180px; height: 180px" />
</div>
</div>
@ -445,6 +445,8 @@ import { getNowDateTimeS } from '@/utils/formatTime'
import print from 'vue3-print-nb'
import htmlToPdf from '@/utils/htmlPdf'
import { Check, Delete, Edit, Message, Search, Star } from '@element-plus/icons-vue'
import type { TabsPaneContext } from 'element-plus'
/** 超声组件 */
defineOptions({ name: 'Ultrasonic' })
@ -465,26 +467,22 @@ const isImageLoaded3 = ref(false) //是否展示图片清除按钮
//
const handleLoad = (id: string) => {
if (applyFormVO.value.reportstatus == '已分析' || applyFormVO.value.reportstatus == '已审核') {
isImageLoaded.value = false
isImageLoaded2.value = false
isImageLoaded3.value = false
}
else
{
} else {
switch (id) {
case '1':
isImageLoaded.value = true
break
case '2':
isImageLoaded2.value = true
break
case '3':
isImageLoaded3.value = true
break
case '1':
isImageLoaded.value = true
break
case '2':
isImageLoaded2.value = true
break
case '3':
isImageLoaded3.value = true
break
}
}
}
}
const handleError = (id: string) => {
switch (id) {
@ -589,6 +587,8 @@ const examine = async () => {
// ID
getPatientexamlist(ID)
//
loadimagelist()
emit('success')
}
} else if (applyFormVO.value.reportstatus === '已审核') {
@ -627,15 +627,14 @@ const images = ref<any[]>([])
//
const reportimages = ref<any[]>([])
//
const getimages = async (type:string) => {
const getimages = async (type: string) => {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, type)
console.log(imageslist)
images.value = imageslist
}
//
const loadimage =async () => {
const loadimage = async () => {
if (applyFormVO.value.reportstatus == '已分析' || applyFormVO.value.reportstatus == '已审核') {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, '1')
if (imageslist.length > 0) {
imageslist.forEach((image, index) => {
@ -735,38 +734,54 @@ const upimagedeleteor = async () => {
deleteimageid.value = ''
updateexamineimage.value = []
}
//
const handleTabChange = async () => {
if (activeName.value == 'report') {
//table
const activeName = ref('first')
//
const handleClick = (tab: TabsPaneContext, event: Event) => {
/* if (tab.paneName == 'report') {
if (applyFormVO.value.reportstatus == '已分析' || applyFormVO.value.reportstatus == '已审核') {
showDiv()
if (reportimages.value.length ==0 ) {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, '1')
console.log(imageslist)
reportimages.value = imageslist
if (reportimages.value.length == 0) {
}
} else {
hideDiv()
}
} */
}
//
const loadimagelist = async () => {
if (applyFormVO.value.reportstatus == '已分析' || applyFormVO.value.reportstatus == '已审核') {
if (reportimages.value.length == 0) {
const imageslist = await ultrasoniccomApi.getimageslist(orgId.value, regId.value, '1')
console.log(imageslist)
reportimages.value = imageslist
}
} else {
}
}
// const handleTabChange = async () => {
// }
//
function hideDiv() {
/* function hideDiv() {
var div = document.getElementById('my-printMe')
if (div) {
div.style.display = 'none'
}
}
//
function showDiv() {
var div = document.getElementById('my-printMe')
if (div) {
div.style.display = 'block'
}
}
} */
//
const age = ref()
const calculateAge = (birthdate) => {
@ -810,8 +825,6 @@ const fordevicemData = ref<any[]>([])
const formRules = reactive({})
const formRef = ref() // Ref
//table
const activeName = ref('first')
//
const radio1 = ref('')
@ -888,7 +901,11 @@ const open = async (id: number, orgid: string, regid: string) => {
formLoading.value = true
try {
//
const dd = await ultrasoniccomApi.getreporttemplatelist(orgid, String(fordevicemValue.value), '')
const dd = await ultrasoniccomApi.getreporttemplatelist(
orgid,
String(fordevicemValue.value),
''
)
treeData.value = dd
console.log('返回值1' + dd)
console.log('返回值2' + treeData.value)
@ -904,7 +921,6 @@ const open = async (id: number, orgid: string, regid: string) => {
//
getlogininfo()
} finally {
formLoading.value = false
}
@ -923,10 +939,12 @@ const getPatientexamlist = async (id: number) => {
if (applyFormVO.value.reportstatus == '已分检' || applyFormVO.value.reportstatus == '待分析') {
savedisabled.value = false
} else {
//
loadimage()
//
loadimage()
savedisabled.value = true
}
//
loadimagelist()
}
defineExpose({ open }) // open
@ -1020,7 +1038,7 @@ const chooseImage = (event, id: number) => {
width: 60%;
margin-left: 2px;
background: rgb(238, 240, 238);
height: 94.4vh;
height: 94.4vh;
}
.my-right {
@ -1032,12 +1050,10 @@ const chooseImage = (event, id: number) => {
height: 91.3vh;
}
.my-app-container {
display: flex;
justify-content: center;
align-items: center;
}
/* 分割线内部的间距 */
.el-divider--horizontal {
@ -1177,10 +1193,7 @@ const chooseImage = (event, id: number) => {
{
height: 970px;
} */
.el-divider--horizontal
{
.el-divider--horizontal {
margin: 6px;
}
</style>