Commit 81b7a05a authored by 柳 佳乐's avatar 柳 佳乐
Browse files

头版

parents
Pipeline #81 failed with stages
in 0 seconds
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# paceperfect-cameraconsole
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}
{
"compilerOptions": {
"target": "es5",
"module": "esnext",
"baseUrl": "./",
"moduleResolution": "node",
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
}
}
This diff is collapsed.
{
"name": "paceperfect-cameraconsole",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
"dependencies": {
"axios": "^1.11.0",
"core-js": "^3.8.3",
"element-ui": "^2.15.14",
"vue": "^2.6.14",
"vuex": "^3.6.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"vue-template-compiler": "^2.6.14"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
<template>
<div>
<!-- 患者信息 -->
<div>
<el-button
class="toggle-btn"
@click="togglePanel"
circle
:icon="isVisible ? 'el-icon-close' : 'el-icon-menu'"
size="mini"
/>
<transition name="slide">
<div v-show="isVisible" class="scale-panel">
<RaiseTheScale></RaiseTheScale>
</div>
</transition>
</div>
<!-- 静态相机 -->
<div>
<StillCamera></StillCamera>
</div>
<!-- 动态相机和双目相机 -->
<div>
<DynamiCamera></DynamiCamera>
</div>
</div>
</template>
<script>
import RaiseTheScale from '@/components/raiseTheScale.vue'
import StillCamera from "@/components/stillCamera.vue"
import DynamiCamera from "@/components/dynamiCamera.vue"
export default {
name: 'App',
components: {
RaiseTheScale,
StillCamera,
DynamiCamera
},
data() {
return {
isVisible: true
}
},
methods: {
togglePanel() {
this.isVisible = !this.isVisible
}
}
}
</script>
<style>
.scale-panel {
position: fixed;
right: 20px;
top: 20px;
z-index: 99;
}
.toggle-btn {
position: fixed;
right: 20px;
top: 70px;
z-index: 100;
background: #409EFF;
color: white;
}
.slide-enter-active, .slide-leave-active {
transition: all 0.3s ease;
}
.slide-enter, .slide-leave-to {
transform: translateX(100%);
opacity: 0;
}
</style>
import request from '@/utils/request'
import { baseURLConsole } from '@/utils/url'
//获取双目相机列表
export function getStereoCameraList() {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/rgbd/rgbd',
method: 'GET',
})
}
//初始化双目相机
export function initStereoCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/rgbd/rgbd/initialize',
method: 'POST',
data
})
}
//关闭指定的双目相机
export function closeStereoCamera(camera_id) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/${camera_id}/close`,
method: 'POST',
})
}
//获取双目相机当前帧
export function getStereoCameraFrame(camera_id) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/${camera_id}/current-frame`,
method: 'GET',
})
}
//获取指定双目相机的录制状态
export function getStereoCameraRecordStatus(camera_id) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/${camera_id}/recording-status`,
method: 'GET',
})
}
//开始双目相机录制
export function startStereoCameraRecording(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/start-recording`,
method: 'POST',
data
})
}
//停止双目相机录制
export function stopStereoCameraRecording(camera_id) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/${camera_id}/stop-recording`,
method: 'POST',
})
}
//设置相机曝光和增益参数
export function setStereoCameraExposureGain(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/set_rgbd_exposure_gain`,
method: 'PUT',
data
})
}
//设置相机亮度
export function setStereoCameraBrightness(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/brightness`,
method: 'PUT',
data
})
}
//设置相机对比度
export function setStereoCameraContrast(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/contrast`,
method: 'PUT',
data
})
}
//设置相机色调
export function setStereoCameraHue(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/hue`,
method: 'PUT',
data
})
}
//设置相机饱和度
export function setStereoCameraSaturation(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/saturation`,
method: 'PUT',
data
})
}
//设置相机锐度
export function setStereoCameraSharpness(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/sharpness`,
method: 'PUT',
data
})
}
//设置相机伽马
export function setStereoCameraGamma(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/gamma`,
method: 'PUT',
data
})
}
//设置相机白平衡
export function setStereoCameraWhiteBalance(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/whitebalance`,
method: 'PUT',
data
})
}
//设置相机分辨率
export function setStereoCameraResolution(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/resolution`,
method: 'PUT',
data
})
}
//设置相机帧率
export function setStereoCameraFps(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/frame-rate`,
method: 'PUT',
data
})
}
//设置相机深度开关
export function setStereoCameraDepthEnabled(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/depth-enabled`,
method: 'PUT',
data
})
}
//设置相机深度模式
export function setStereoCameraDepthMode(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/rgbd/rgbd/depth-mode`,
method: 'PUT',
data
})
}
import request from '@/utils/request'
import { baseURLConsole } from '@/utils/url'
//获取测量数据
export function quickMMeasure(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/bluetooth_scale/quick-measure',
method: 'POST',
data
})
}
import request from '@/utils/request'
import { baseURL } from '@/utils/url'
//获取预约列表
export function getBookList(data) {
return request({
baseURL:baseURL,
url: '/booking/get_book_list',
method: 'POST',
data,
})
}
//获取患者信息
export function getPatients(data) {
return request({
baseURL:baseURL,
url: '/patient/get_patients',
method: 'POST',
data,
})
}
//获取医生列表
export function getDoctorList(data) {
return request({
baseURL:baseURL,
url: '/doctor/get_doctor_list',
method: 'POST',
data,
})
}
import request from '@/utils/request'
import { baseURLConsole } from '@/utils/url'
//获取动态拍摄高清相机列表
export function getDynamiCameraList() {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/hd_video/get_list',
method: 'GET',
})
}
//初始化指定的动态高清相机
export function initDynamiCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/hd_video/initialize',
method: 'POST',
data,
})
}
//配置高清-视频采集相机参数
export function configDynamiCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_video/${data.camera_id}/set_orientation`,
method: 'POST',
data,
})
}
//关闭指定的静态采集高清相机
export function closeDynamiCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/hd_video/close',
method: 'POST',
data
})
}
//断开视频相机WebSocket连接
export function disconnectDynamiCamera(camera_id) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_video/ws/disconnect/${camera_id}`,
method: 'POST',
})
}
//设置视频相机低帧率模式
export function lowDynamiCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_video/ws/fps/batch/set_ws_fps`,
method: 'POST',
data
})
}
//动态视频拍摄相机同步视频采集
export function startDynamiCameraStart(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_video/multi_hd_video_recode/start`,
method: 'POST',
data
})
}
//动态视频拍摄相机同步视频采集停止
export function stopDynamiCameraStart(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_video/multi_hd_video_recode/stop`,
method: 'POST',
data
})
}
//获取动态相机的链接状态
export function getWebSocketLink(){
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_video/ws/status`,
method: 'GET',
})
}
//双目相机和动态相机一键录制
export function startMultiCameraRecode(data){
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/multi_control/multi_camera_recode/start`,
method: 'POST',
})
}
//双目相机和动态相机一键停止
export function stopMultiCameraRecode(data){
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/multi_control/multi_camera_recode/stop`,
method: 'POST',
})
}
import request from '@/utils/request'
import { baseURLConsole } from '@/utils/url'
//获取静态拍摄高清相机列表
export function getStillCameraList() {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/hd_static/get_list',
method: 'GET',
})
}
//初始化指定的静态高清相机
export function initializeStillCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/hd_static/initialize',
method: 'POST',
data
})
}
//配置静态采集高清相机参数
export function setStillCameraOrientation(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/hd_static/set_orientation',
method: 'POST',
data
})
}
//批量设置低帧率模式
export function lowStillCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_static/ws/fps/batch/set_ws_rate`,
method: 'POST',
data
})
}
//关闭指定的静态采集高清相机
export function closeStillCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_static/close`,
method: 'POST',
data
})
}
//捕获高清相机的单帧图像并保存
export function captureStillCamera(data) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_static/capture`,
method: 'POST',
data
})
}
//websocket断开链接清理后端状态
export function disconnectStillCamera(camera_id) {
return request({
baseURL:`http://${baseURLConsole}`,
url: `/api/cameras/hd_static/ws/disconnect/${camera_id}`,
method: 'POST',
})
}
//查询webSocket链接
export function getWebSocketLink() {
return request({
baseURL:`http://${baseURLConsole}`,
url: '/api/cameras/hd_static/ws/status',
method: 'GET',
})
}
import {
getStereoCameraList, // 获取双目相机列表
initStereoCamera, // 初始化双目相机
closeStereoCamera, // 关闭双目相机
getStereoCameraFrame, // 获取双目相机帧
getStereoCameraRecordStatus, // 获取双目相机录制状态
setStereoCameraExposureGain, // 设置相机曝光和增益参数
setStereoCameraBrightness, // 设置相机亮度
setStereoCameraContrast, // 设置相机对比度
setStereoCameraHue, // 设置相机色调
setStereoCameraSaturation, // 设置相机饱和度
setStereoCameraSharpness, // 设置相机锐度
setStereoCameraGamma, // 设置相机伽马值
setStereoCameraWhiteBalance, // 设置相机白平衡
setStereoCameraResolution, // 设置相机分辨率
setStereoCameraFps, // 设置相机帧率
setStereoCameraDepthEnabled, // 设置相机深度传感器是否启用
setStereoCameraDepthMode // 设置相机深度传感器模式
} from '@/api/binocularCamera'
export const binocularCameraMixins = {
data() {
return {
stereoCameras: [],
stereoCamerasImage: {
depthImage: null,//深度图像
leftImage: null,//左目图像
rightImage: null,//右目图像
},
// 双目相机设置
stereoSettings: {
autoExposure: true,//自动曝光
exposure: 0,//曝光值
gain: 0,//增益
brightness: 4,//亮度
contrast: 4,//对比度
hue: 0,//色调
saturation: 4,//饱和度
sharpness: 4,//锐度
gamma: 5,//伽马值
whiteBalanceAuto: true,//自动白平衡
whiteBalance: 40,//白平衡
resolution: 'HD720',//分辨率
fps: 60,//帧率
depthEnabled: true,//深度传感器是否启用
depthMode: 'NEURAL_PLUS'//深度传感器模式
},
resolutionOptions: [
{ label: 'HD720 2560×720', value: 'HD720', fpsOptions: [15, 30, 60] },
{ label: 'HD1080 3840×1080', value: 'HD1080', fpsOptions: [15, 30] },
{ label: 'HD2K 4416×1242', value: 'HD2K', fpsOptions: [15] },
{ label: 'VGA 1344×376', value: 'VGA', fpsOptions: [15, 30, 60, 100] }
],
currentFpsOptions: [15, 30, 60],
depthModes: [
'PERFORMANCE',
'QUALITY',
'ULTRA',
'NEURAL_LIGHT',
'NEURAL',
'NEURAL_PLUS'
],
autoRefresh: false,
refreshInterval: 15,
interval: null,
}
},
methods: {
// 获取双目相机列表
getStereoCameraList() {
this.activeTab = 'stereo'
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
if (sessionStorage.getItem('stereoCameras')) {
this.stereoCameras = JSON.parse(sessionStorage.getItem('stereoCameras'))
this.stereoSettings.fps = this.stereoCameras[0].camera_fps
this.stereoSettings.resolution = this.stereoCameras[0].camera_resolution
this.stereoSettings.depthMode = this.stereoCameras[0].depth_mode
this.$message.success(`获取到 ${this.stereoCameras.length} 个双目相机`);
loading.close();
return
}
getStereoCameraList().then(res => {
console.log(res)
if (res.data.length > 0) {
this.stereoSettings.fps = res.data[0].camera_fps
this.stereoSettings.resolution = res.data[0].camera_resolution
this.stereoSettings.depthMode = res.data[0].depth_mode
this.stereoCameras = res.data
this.$message.success(`获取到 ${this.stereoCameras.length} 个双目相机`);
} else {
this.$message.error('未检测到双目相机')
}
}).finally(() => {
loading.close();
})
},
//初始化相机
initStereoCameras() {
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
let param = {
camera_ids: this.stereoCameras[0].camera_id + '',
camear_config: {
init_params_config: {
camera_resolution: this.stereoSettings.resolution,
camera_fps: this.stereoSettings.fps,
depth_mode: this.stereoSettings.depthMode,
coordinate_units: this.stereoCameras[0].coordinate_units,
sdk_verbose: this.stereoCameras[0].sdk_verbose,
sdk_verbose_log_file: this.stereoCameras[0].sdk_verbose_log_file,
depth_minimum_distance: this.stereoCameras[0].depth_minimum_distance,
depth_maximum_distance: this.stereoCameras[0].depth_maximum_distance,
depth_stabilization: this.stereoCameras[0].depth_stabilization
},
video_params_config: {
aec_agc: this.stereoSettings.autoExposure,
gain: this.stereoSettings.gain,
exposure: this.stereoSettings.exposure,
whitebalance_auto: this.stereoSettings.whiteBalanceAuto,
whitebalance: this.stereoSettings.whiteBalance,
gamma: this.stereoSettings.gamma,
sharpness: this.stereoSettings.sharpness,
brightness: this.stereoSettings.brightness,
contrast: this.stereoSettings.contrast,
saturation: this.stereoSettings.saturation,
hue: this.stereoSettings.hue,
}
}
}
initStereoCamera(param).then(res => {
console.log(res)
sessionStorage.setItem('stereoCameras', JSON.stringify(this.stereoCameras));
getStereoCameraRecordStatus(this.stereoCameras[0].camera_id).then(res => {
console.log(res)
})
}).finally(() => {
loading.close();
})
},
//关闭双目相机
closeStereoCameras() {
closeStereoCamera(this.stereoCameras[0].camera_id).then(res => {
sessionStorage.removeItem('stereoCameras')
this.stereoCameras = []
console.log(res)
})
},
//获取帧
getStereoFrame() {
getStereoCameraFrame(this.stereoCameras[0].camera_id).then(res => {
console.log(res)
this.stereoCamerasImage.leftImage = res.data.frame_data.left_image
this.stereoCamerasImage.rightImage = res.data.frame_data.right_image
this.stereoCamerasImage.depthImage = res.data.frame_data.depth_image
this.$nextTick(() => {
this.canvasLeftImage();
this.canvasRightImage();
this.canvasDepthImage();
});
})
},
canvasLeftImage() {
if (!this.stereoCamerasImage.leftImage) return;
const canvas = this.$refs['canvas-leftImage'];
if (!canvas) return;
const img = new Image();
img.onload = () => {
// 计算保持比例的尺寸
const containerWidth = canvas.parentElement.clientWidth;
const ratio = img.width / img.height;
const height = containerWidth / ratio;
// 设置canvas尺寸
canvas.width = containerWidth;
canvas.height = height;
// 绘制图像
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
img.src = '';
};
img.src = this.stereoCamerasImage.leftImage;
},
canvasRightImage() {
if (!this.stereoCamerasImage.rightImage) return;
const canvas = this.$refs['canvas-rightImage'];
if (!canvas) return;
const img = new Image();
img.onload = () => {
// 计算保持比例的尺寸
const containerWidth = canvas.parentElement.clientWidth;
const ratio = img.width / img.height;
const height = containerWidth / ratio;
// 设置canvas尺寸
canvas.width = containerWidth;
canvas.height = height;
// 绘制图像
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
img.src = '';
};
img.src = this.stereoCamerasImage.rightImage;
},
canvasDepthImage() {
if (!this.stereoCamerasImage.depthImage) return;
const canvas = this.$refs['canvas-depthImage'];
if (!canvas) return;
const img = new Image();
img.onload = () => {
// 计算保持比例的尺寸
const containerWidth = canvas.parentElement.clientWidth;
const ratio = img.width / img.height;
const height = containerWidth / ratio;
// 设置canvas尺寸
canvas.width = containerWidth;
canvas.height = height;
// 绘制图像
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
img.src = '';
};
img.src = this.stereoCamerasImage.depthImage;
},
toggleAutoRefresh() {
console.log("123")
this.autoRefresh = !this.autoRefresh
if (this.autoRefresh) {
let intervalTime = 1000 / this.refreshInterval
this.interval = setInterval(() => {
this.getStereoFrame()
}, intervalTime);
} else {
clearInterval(this.interval)
this.interval = null;
}
},
//修改曝光和增益
handleAutoExposureChange() {
console.log("修改曝光和增益")
let param = {
camera_id: this.stereoCameras[0].camera_id,
is_auto_exposure_gain: this.stereoSettings.autoExposure,
exposure: this.stereoSettings.exposure,
gain: this.stereoSettings.gain
}
// console.log(param)
//修改曝光和增益
setStereoCameraExposureGain(param).then(res => {
console.log(res)
})
},
//修改亮度
handleBrightnessChange() {
console.log("修改亮度")
let param = {
camera_id: this.stereoCameras[0].camera_id,
brightness: this.stereoSettings.brightness
}
setStereoCameraBrightness(param).then(res => {
console.log(res)
})
},
//修改对比度
handleContrastChange() {
console.log("修改对比度")
let param = {
camera_id: this.stereoCameras[0].camera_id,
contrast: this.stereoSettings.contrast
}
setStereoCameraContrast(param).then(res => {
console.log(res)
})
},
//修改色调
handleHueChange() {
console.log("修改色调")
let param = {
camera_id: this.stereoCameras[0].camera_id,
hue: this.stereoSettings.hue
}
setStereoCameraHue(param).then(res => {
console.log(res)
})
},
//修改饱和度
handleSaturationChange() {
console.log("修改饱和度")
let param = {
camera_id: this.stereoCameras[0].camera_id,
saturation: this.stereoSettings.saturation
}
setStereoCameraSaturation(param).then(res => {
console.log(res)
})
},
//修改锐度
handleSharpnessChange() {
console.log("修改锐度")
let param = {
camera_id: this.stereoCameras[0].camera_id,
sharpness: this.stereoSettings.sharpness
}
setStereoCameraSharpness(param).then(res => {
console.log(res)
})
},
//修改伽马值
handleGammaChange() {
console.log("修改伽马值")
let param = {
camera_id: this.stereoCameras[0].camera_id,
gamma: this.stereoSettings.gamma
}
setStereoCameraGamma(param).then(res => {
console.log(res)
})
},
//修改白平衡
handleWhiteBalanceChange() {
console.log("修改白平衡")
let param = {
camera_id: this.stereoCameras[0].camera_id,
is_auto_whitebalance: this.stereoSettings.whiteBalanceAuto,
whitebalance_temperature: this.stereoSettings.whiteBalance
}
setStereoCameraWhiteBalance(param).then(res => {
console.log(res)
})
},
//修改分辨率
handleResolutionChange() {
if (this.interval) {
clearInterval(this.interval)
this.autoRefresh = !this.autoRefresh
}
this.list = this.resolutionOptions.filter(item => item.value == this.stereoSettings.resolution)
let param = {
camera_id: this.stereoCameras[0].camera_id,
resolution: this.stereoSettings.resolution
}
setStereoCameraResolution(param).then(res => {
console.log(res)
this.currentFpsOptions = this.list.fpsOptions
this.stereoSettings.fps = this.currentFpsOptions[this.currentFpsOptions.length - 1]
this.handleFpsChange()
})
},
//修改帧率
handleFpsChange() {
if (this.interval) {
clearInterval(this.interval)
this.autoRefresh = !this.autoRefresh
}
let param = {
camera_id: this.stereoCameras[0].camera_id,
frame_rate: this.stereoSettings.fps
}
setStereoCameraFps(param).then(res => {
console.log(res)
})
},
//修改深度传感器是否启用
handleDepthEnabledChange() {
if (this.interval) {
clearInterval(this.interval)
this.autoRefresh = !this.autoRefresh
}
let param = {
camera_id: this.stereoCameras[0].camera_id,
depth_enabled: this.stereoSettings.depthEnabled
}
setStereoCameraDepthEnabled(param).then(res => {
console.log(res)
})
},
//修改深度传感器模式
handleDepthModeChange() {
if (this.interval) {
clearInterval(this.interval)
this.autoRefresh = !this.autoRefresh
}
let param = {
camera_id: this.stereoCameras[0].camera_id,
depth_mode: this.stereoSettings.depthMode
}
setStereoCameraDepthMode(param).then(res => {
console.log(res)
})
},
},
beforeDestroy() {
//关闭双目相机
this.closeStereoCameras()
//清除自动获取帧
if (this.interval) {
clearInterval(this.interval)
}
//清除相机缓存
sessionStorage.removeItem('stereoCameras')
}
}
<template>
<div class="work-container">
<el-tabs v-model="activeTab" stretch>
<el-tab-pane label="预约" name="appointment">
<bookingList :work="true" @selectBookingList="selectBookingList"></bookingList>
</el-tab-pane>
<el-tab-pane label="非预约" name="nonAppointment">
<el-form :model="nonAppointmentForm" :rules="formRules" ref="nonAppointmentForm" label-width="80px">
<el-form-item label="姓名" prop="name">
<el-input v-model="nonAppointmentForm.name"></el-input>
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input v-model="nonAppointmentForm.age" type="number" max="150" min="0"></el-input>
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-select v-model="nonAppointmentForm.gender" placeholder="请选择">
<el-option label="男" :value="0"></el-option>
<el-option label="女" :value="1"></el-option>
</el-select>
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input v-model="nonAppointmentForm.phone" placeholder="请输入手机号"></el-input>
</el-form-item>
<el-form-item label="身份证号" prop="idCard">
<el-input v-model="nonAppointmentForm.idCard" placeholder="请输入身份证号"></el-input>
</el-form-item>
<el-form-item label="籍贯">
<el-input v-model="nonAppointmentForm.nativePlace" placeholder="请输入籍贯"></el-input>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
<div class="button-group">
<el-button type="primary" @click="handleSubmit">确认</el-button>
<el-button @click="handleCancel">取消</el-button>
</div>
</div>
</template>
<script>
import bookingList from "@/components/bookingList.vue"
import { timeProcessing } from "@/utils/myMethod"
export default {
name:'Booking',
components: {
bookingList
},
data() {
return {
activeTab: 'appointment',
selectedRows: null,
nonAppointmentForm: {},
formRules: {
name: [
{ required: true, message: '请输入姓名', trigger: 'blur' }
],
gender: [
{ required: true, message: '请选择性别', trigger: 'change' }
],
phone: [
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
],
idCard: [
{ pattern: /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/, message: '请输入正确的身份证号', trigger: 'blur' }
]
}
}
},
created(){
this.nonAppointmentForm = this.$store.getters.patientInfo
},
methods: {
selectBookingList(val) {
this.selectedRows = val;
},
handleSubmit() {
if (this.activeTab === 'appointment') {
if (this.selectedRows) {
let param = {
...this.selectedRows,
phone: null,
idCard: null,
nativePlace: null
}
this.$store.dispatch('updatePatientInfo', param)
this.$emit('handleCloseBooking')
} else {
this.$message.error('请选择预约记录')
return
}
} else {
this.$refs.nonAppointmentForm.validate(valid => {
if (!valid) {
this.$message.error('请填写完整表单')
return
}
this.nonAppointmentForm.bkBkTime = timeProcessing()
this.$store.dispatch('updatePatientInfo', this.nonAppointmentForm)
this.$emit('handleCloseBooking')
})
}
},
handleCancel(){
this.$emit('handleCloseBooking')
}
}
}
</script>
<style scoped>
.work-container {
padding: 20px;
background: #fff;
border-radius: 4px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
}
.button-group {
display: flex;
justify-content: center;
margin-top: 20px;
gap: 20px;
}
</style>
<template>
<!-- 预约列表 -->
<div>
<!-- 搜索 -->
<el-form ref="form" :inline="true" :model="queryForm" @submit.native.prevent>
<el-form-item>
<!-- 患者 -->
<el-select v-model="queryForm.pkPtPtid" clearable filterable :loading="patientLoading" placeholder="患者搜索" remote
:remote-method="patientRemoteMethod" reserve-keyword>
<el-option v-for="item in patientList" :key="item.patientId" :label="item.patientName"
:value="item.patientId" />
</el-select>
</el-form-item>
<el-form-item>
<!-- 医生 -->
<el-select v-model="queryForm.pkDocDocid" clearable filterable :loading="doctorLoading" placeholder="医生搜索"
remote :remote-method="doctorRemoteMethod" reserve-keyword>
<el-option v-for="item in doctorList" :key="item.docId" :label="item.docName" :value="item.docId" />
</el-select>
</el-form-item>
<el-form-item>
<!-- 时间 -->
<el-date-picker v-model="timeValue" clearable end-placeholder="结束日期" range-separator="至"
start-placeholder="开始日期" type="daterange" @change="getData" />
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" native-type="submit" type="primary" @click="handleQuery">查询</el-button>
</el-form-item>
</el-form>
<!-- 内容 -->
<el-table ref="tableSort" v-loading="listLoading" :data="bookingList" highlight-current-row
@current-change="selectBooking">
<el-table-column label="序号" show-overflow-tooltip width="95">
<template #default="scope">
{{ (queryForm.pageNum - 1) * 10 + scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column label="医生" prop="doctorVO.docName" show-overflow-tooltip />
<el-table-column label="患者" prop="patientVO.patientName" show-overflow-tooltip />
<el-table-column label="性别" prop="patientVO.patientSex" show-overflow-tooltip />
<el-table-column label="年龄" prop="patientVO.patientAge" show-overflow-tooltip />
<el-table-column label="身高(cm)" prop="bkHeight" show-overflow-tooltip />
<el-table-column label="体重(kg)" prop="bkWeight" show-overflow-tooltip />
<el-table-column label="预约时间" prop="bkBkTime" show-overflow-tooltip />
<el-table-column label="创建时间" prop="bkCreateTime" show-overflow-tooltip />
</el-table>
<div class="pagination">
<el-pagination :background="true" :current-page="queryForm.pageNum" layout="total, sizes, prev, pager, next, jumper"
:page-size="queryForm.pageSize" :total="total" @current-change="handleCurrentChange"
@size-change="handleSizeChange" />
</div>
</div>
</template>
<script>
import { getBookList } from '@/api/booking.js'
import { getPatients } from '@/api/booking.js'
import { getDoctorList } from '@/api/booking.js'
import { timeProcessing, startTimeProcessing, endTimeProcessing } from '@/utils/myMethod.js'
export default {
name: 'Booking',
props: {
work: {
type: Boolean,
default: false
}
},
data() {
return {
listLoading: false,
bookingList: [],
queryForm: {
bkHeight: null, //身高
bkStatus: null, //状态
bkWeight: null, //体重
endTime: null, //结束时间
pkDocDocid: null, //医生ID
pkPtPtid: null, //患者ID
startTime: null, //开始时间
pageNum: 1,
pageSize: 10,
},
total: 0,
patientLoading: false,
patientList: [], //患者列表
doctorLoading: false,
doctorList: [], //医生列表
timeValue: null, //时间
//选择
selectedRows: [],
}
},
created() {
this.getList()
},
methods: {
//选择
selectBooking(val) {
if (this.work) {
//数据处理
let userInfo = {
bookingId: val.bookingId,//预约ID
gender: val.patientVO.patientSex,//性别 0男 1女
age: val.patientVO.patientAge,//年龄
height: val.bkHeight,//身高
weight: val.bkWeight,//体重
name: val.patientVO.patientName,//患者姓名
bkBkTime: val.bkBkTime,//预约时间
}
this.$emit('selectBookingList', userInfo)
}
},
//获取数据
getList() {
if (this.work) {
this.listLoading = true
this.bookingList = [
{
bookingId: 1,
doctorVO: {
docName: '张医生'
},
patientVO: {
patientName: '李患者',
patientSex: 0,
patientAge: 20,
},
bkHeight: 175,
bkWeight: 70,
bkBkTime: '2025-07-22 10:00',
bkCreateTime: '2025-07-22 10:00'
},
{
bookingId: 2,
doctorVO: {
docName: '王医生'
},
patientVO: {
patientName: '赵患者',
patientSex: 1,
patientAge: 21,
},
bkHeight: 165,
bkWeight: 55,
bkBkTime: '2025-07-22 11:00',
bkCreateTime: '2025-07-22 11:00'
}
]
this.listLoading = false
} else {
getBookList(this.queryForm)
.then((res) => {
if (res.success) {
this.bookingList = res.data.list
for (let item of this.bookingList) {
item.bkBkTime = timeProcessing(item.bkBkTime)
item.bkCreateTime = timeProcessing(item.bkCreateTime)
}
this.total = res.data.total
} else {
this.$baseMessage(res.msg, 'error')
}
})
.catch((error) => {
console.log(error)
})
.finally(() => {
this.listLoading = false
})
}
},
//查询患者
patientRemoteMethod(query) {
if (query !== '') {
this.patientLoading = true
let param = {
pageNum: 1,
pageSize: 10,
patientName: query,
}
getPatients(param)
.then((res) => {
if (res.success) {
this.patientList = res.data.list
}
this.patientLoading = false
})
.catch((error) => {
this.patientLoading = false
this.patientList = []
})
}
},
//查询医生
doctorRemoteMethod(query) {
if (query !== '') {
this.doctorLoading = true
let param = {
pageNum: 1,
pageSize: 10,
docName: query,
}
getDoctorList(param)
.then((res) => {
if (res.success) {
this.doctorList = res.data.list
}
this.doctorLoading = false
})
.catch((error) => {
this.doctorLoading = false
this.doctorList = []
})
}
},
//时间筛选
getData(value) {
if (value == null) {
this.queryForm.startTime = null
this.queryForm.endTime = null
} else {
this.queryForm.startTime = startTimeProcessing(value[0])
this.queryForm.endTime = endTimeProcessing(value[1])
}
},
//查询
handleQuery() {
this.queryForm.pageNum = 1
this.getList()
},
//分页
handleSizeChange(val) {
this.queryForm.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.queryForm.pageNum = val
this.getList()
},
},
}
</script>
<style scoped>
.pagination{
display: flex;
justify-content: center;
margin-top: 20px;
}
</style>
This diff is collapsed.
<template>
<div class="raise-scale-container">
<el-card class="patient-info">
<div slot="header" class="clearfix">
<span>患者信息</span>
<el-button style="float: right; padding: 3px 0" type="text" @click="changePatient">
选择患者
</el-button>
</div>
<div class="compact-info">
<div class="info-line">
<span class="info-label">患者:</span>
<span>{{ patientInfo.name }} ({{ patientInfo.gender == 0 ? '' : '' }}, {{ patientInfo.age }}岁)</span>
</div>
<div class="info-line">
<span class="info-label">手机:</span>
<span>{{ patientInfo.phone || '-' }}</span>
</div>
<div class="info-line">
<span class="info-label">身份证:</span>
<span>{{ patientInfo.idCard || '-' }}</span>
</div>
<div class="info-line">
<span class="info-label">预约号:</span>
<span>{{ patientInfo.bookingId }}</span>
<span class="info-divider">|</span>
<span class="info-label">时间:</span>
<span>{{ patientInfo.bkBkTime }}</span>
<span class="info-divider">|</span>
<span class="info-label">籍贯:</span>
<span>{{ patientInfo.nativePlace || '-' }}</span>
</div>
<div class="info-line">
<span class="info-label">身高:</span>
<span>{{ patientInfo.height || '-' }}cm</span>
<span class="info-divider">|</span>
<span class="info-label">体重:</span>
<span>{{ patientInfo.weight || '-' }}kg</span>
</div>
</div>
<el-col :span="24" style="margin-top: 20px; text-align: center;">
<el-button type="primary" @click="getBodyData">
获取身高体重数据
</el-button>
</el-col>
</el-card>
<el-dialog
:visible.sync="showBookingDialog"
fullscreen
title="更换患者"
:show-close="true"
:close-on-click-modal="false"
:modal="false"
>
<booking @handleCloseBooking="handleCloseBooking" />
</el-dialog>
</div>
</template>
<script>
import { quickMMeasure } from '@/api/bluetoothScale'
import { mapState } from 'vuex';
import booking from '@/components/booking.vue'
export default {
name: 'RaiseTheScale',
components: {
booking
},
data() {
return {
showBookingDialog: false
}
},
computed: {
...mapState({
patientInfo: (state) => state.patientInfo
})
},
methods: {
//获取升高体重称的数据
getBodyData() {
if(this.patientInfo.gender == null && this.patientInfo.name == null){
this.$message.error('请先选择患者')
return
}
let param = {
isBooking: this.patientInfo.bookingId ? true : false,
bookingId: this.patientInfo.bookingId || 1,//预约ID
gender: this.patientInfo.gender,//性别
age: this.patientInfo.age,//年龄
deviceAddress: null,//设备地址
timeout: null,//测量超时时间
}
quickMMeasure(param).then(res => {
if (res.code == 200) {
let patientInfo = {
... this.patientInfo
}
patientInfo.height = res.data.height
patientInfo.weight = res.data.weight
this.$store.dispatch('updatePatientInfo', patientInfo)
this.$message.success(`测量成功:身高: ${this.patientInfo.height}cm, 体重: ${this.patientInfo.weight}kg`)
}
})
},
// 更换患者
changePatient() {
this.showBookingDialog = true
},
handleCloseBooking() {
this.showBookingDialog = false
},
handleSubmit() {
if (this.patientInfo.height <= 0 || this.patientInfo.weight <= 0) {
this.$message.error('请先获取身高和体重数据')
return
}
this.$emit('next-step', this.patientInfo)
}
}
}
</script>
<style scoped>
.patient-info {
margin-bottom: 20px;
}
.compact-info {
font-size: 14px;
line-height: 1.8;
}
.info-line {
padding: 6px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.info-label {
color: #666;
font-weight: 500;
margin-right: 4px;
}
.info-divider {
color: #ddd;
margin: 0 8px;
}
</style>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment