|
|
|
@ -75,6 +75,13 @@ |
|
|
|
<footer class="bottom-bar"> |
|
|
|
<footer class="bottom-bar"> |
|
|
|
<div class="left-section"> |
|
|
|
<div class="left-section"> |
|
|
|
<el-button type="primary" @click="handleAddCase">创建病例</el-button> |
|
|
|
<el-button type="primary" @click="handleAddCase">创建病例</el-button> |
|
|
|
|
|
|
|
<div class="patient-info" v-if="patientInfo"> |
|
|
|
|
|
|
|
<span class="patient-field">姓名:{{ patientInfo.patient_name }}</span> |
|
|
|
|
|
|
|
<span class="patient-field">年龄:{{ patientInfo.ageText }}</span> |
|
|
|
|
|
|
|
<span class="patient-field"> |
|
|
|
|
|
|
|
部位:{{ patientInfo.positions.join(' | ') }} |
|
|
|
|
|
|
|
</span> |
|
|
|
|
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="tools-section"> |
|
|
|
<div class="tools-section"> |
|
|
|
<div class="tool-item" @click="toggleMic"> |
|
|
|
<div class="tool-item" @click="toggleMic"> |
|
|
|
@ -263,6 +270,7 @@ import { |
|
|
|
postConsultationInfo, |
|
|
|
postConsultationInfo, |
|
|
|
postConsultationStop |
|
|
|
postConsultationStop |
|
|
|
} from "@/api/videoCommunication"; |
|
|
|
} from "@/api/videoCommunication"; |
|
|
|
|
|
|
|
import { patientAgeTypeList } from "@/api/cases/index.js"; |
|
|
|
export default { |
|
|
|
export default { |
|
|
|
name: 'MeetingRoom', |
|
|
|
name: 'MeetingRoom', |
|
|
|
components: { |
|
|
|
components: { |
|
|
|
@ -271,9 +279,12 @@ export default { |
|
|
|
}, |
|
|
|
}, |
|
|
|
data() { |
|
|
|
data() { |
|
|
|
return { |
|
|
|
return { |
|
|
|
|
|
|
|
// ==================== 当前患者基本信息 ==================== |
|
|
|
|
|
|
|
patientInfo: null, // { patient_name, ageText, positions, reportCount } |
|
|
|
|
|
|
|
|
|
|
|
// ==================== 会议基础信息 ==================== |
|
|
|
// ==================== 会议基础信息 ==================== |
|
|
|
meetingTitle: '', |
|
|
|
meetingTitle: '', |
|
|
|
meetingCode: '1687110', |
|
|
|
meetingCode: '', |
|
|
|
participantCount: 1, |
|
|
|
participantCount: 1, |
|
|
|
resolution: '1080P', |
|
|
|
resolution: '1080P', |
|
|
|
frameRate: 25, |
|
|
|
frameRate: 25, |
|
|
|
@ -301,6 +312,12 @@ export default { |
|
|
|
micOn: true, |
|
|
|
micOn: true, |
|
|
|
camOn: true, |
|
|
|
camOn: true, |
|
|
|
localStream: null, |
|
|
|
localStream: null, |
|
|
|
|
|
|
|
device: { |
|
|
|
|
|
|
|
isInit: false, |
|
|
|
|
|
|
|
audio: [], |
|
|
|
|
|
|
|
video: [], |
|
|
|
|
|
|
|
output: [], |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 音频说话音量波形 |
|
|
|
// 音频说话音量波形 |
|
|
|
audioContext: null, |
|
|
|
audioContext: null, |
|
|
|
@ -375,6 +392,51 @@ export default { |
|
|
|
fullPageCaptureIsSelecting: false, |
|
|
|
fullPageCaptureIsSelecting: false, |
|
|
|
fullPageCaptureStartX: 0, |
|
|
|
fullPageCaptureStartX: 0, |
|
|
|
fullPageCaptureStartY: 0, |
|
|
|
fullPageCaptureStartY: 0, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
userID: '', |
|
|
|
|
|
|
|
roomID: "", |
|
|
|
|
|
|
|
isJoined: false, |
|
|
|
|
|
|
|
isDisconnect: false, |
|
|
|
|
|
|
|
isEnvChange: false, |
|
|
|
|
|
|
|
localCameraStream: { |
|
|
|
|
|
|
|
aDeviceID: "", |
|
|
|
|
|
|
|
vDeviceID: "", |
|
|
|
|
|
|
|
oDeviceID: "", |
|
|
|
|
|
|
|
isPreviewed: false, |
|
|
|
|
|
|
|
videoElement: null, |
|
|
|
|
|
|
|
publishID: "", |
|
|
|
|
|
|
|
muteVideo: false, |
|
|
|
|
|
|
|
muteAudio: false, |
|
|
|
|
|
|
|
type: window.hirtcwebsdk.StreamType.Camera, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
localScreenStream: { |
|
|
|
|
|
|
|
type: window.hirtcwebsdk.StreamType.Screen, |
|
|
|
|
|
|
|
publishID: "", |
|
|
|
|
|
|
|
muteVideo: false, |
|
|
|
|
|
|
|
muteAudio: false, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
localCameraStreamEx: { |
|
|
|
|
|
|
|
tag: "tag1", |
|
|
|
|
|
|
|
aDeviceID: "", |
|
|
|
|
|
|
|
vDeviceID: "", |
|
|
|
|
|
|
|
isPreviewed: false, |
|
|
|
|
|
|
|
videoElement: null, |
|
|
|
|
|
|
|
publishID: "", |
|
|
|
|
|
|
|
muteVideo: false, |
|
|
|
|
|
|
|
muteAudio: false, |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
remoteStream: [], |
|
|
|
|
|
|
|
userList: [], |
|
|
|
|
|
|
|
device: { |
|
|
|
|
|
|
|
isInit: false, |
|
|
|
|
|
|
|
audio: [], |
|
|
|
|
|
|
|
video: [], |
|
|
|
|
|
|
|
output: [], |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
joinRetry: 0, |
|
|
|
|
|
|
|
publishRetry: 0, |
|
|
|
|
|
|
|
subscribeRetry: 0, |
|
|
|
|
|
|
|
maxRetry: 3, |
|
|
|
}; |
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
computed: { |
|
|
|
computed: { |
|
|
|
@ -391,10 +453,12 @@ export default { |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
mounted() { |
|
|
|
mounted() { |
|
|
|
|
|
|
|
|
|
|
|
if (this.$route.query.roomId_id) this.creatRoom() |
|
|
|
if (this.$route.query.roomId_id) this.creatRoom() |
|
|
|
|
|
|
|
this.initSDK() |
|
|
|
|
|
|
|
|
|
|
|
this.initPage(); |
|
|
|
this.initPage(); |
|
|
|
this.initSDK(); |
|
|
|
// this.initSDK(); |
|
|
|
|
|
|
|
|
|
|
|
}, |
|
|
|
}, |
|
|
|
methods: { |
|
|
|
methods: { |
|
|
|
@ -407,7 +471,6 @@ export default { |
|
|
|
name: '', |
|
|
|
name: '', |
|
|
|
room_id: this.$route.query.roomId_id |
|
|
|
room_id: this.$route.query.roomId_id |
|
|
|
}) |
|
|
|
}) |
|
|
|
console.log(1111111111,res) |
|
|
|
|
|
|
|
this.consultation_id = res.data.consultation_id |
|
|
|
this.consultation_id = res.data.consultation_id |
|
|
|
const ret = await postConsultationInfo({ |
|
|
|
const ret = await postConsultationInfo({ |
|
|
|
consultation_id: res.data.consultation_id, |
|
|
|
consultation_id: res.data.consultation_id, |
|
|
|
@ -415,6 +478,10 @@ export default { |
|
|
|
room_id: '' |
|
|
|
room_id: '' |
|
|
|
}) |
|
|
|
}) |
|
|
|
this.meetingTitle = ret.data.name |
|
|
|
this.meetingTitle = ret.data.name |
|
|
|
|
|
|
|
this.meetingCode = ret.data.invite_code |
|
|
|
|
|
|
|
this.participantCount = ret.data.user_num |
|
|
|
|
|
|
|
this.userID = ret.data.user_id |
|
|
|
|
|
|
|
this.roomID = ret.data.room_id |
|
|
|
} catch (error) { |
|
|
|
} catch (error) { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
@ -423,9 +490,30 @@ export default { |
|
|
|
handleAddCase() { |
|
|
|
handleAddCase() { |
|
|
|
this.$refs.caseFormDialogRef.handleAdd(); |
|
|
|
this.$refs.caseFormDialogRef.handleAdd(); |
|
|
|
}, |
|
|
|
}, |
|
|
|
// 查看按钮操作 |
|
|
|
// 查看按钮操作(病例创建成功后回调,提取患者基本信息) |
|
|
|
handleView(row) { |
|
|
|
handleView(row) { |
|
|
|
this.$tab.openPage(row.patient_name + '-' + row.id, '/cases/detail/' + row.id); |
|
|
|
if (!row) return; |
|
|
|
|
|
|
|
// 年龄格式化 |
|
|
|
|
|
|
|
let ageText = ''; |
|
|
|
|
|
|
|
if (row.patient_age != null) { |
|
|
|
|
|
|
|
const ageList = patientAgeTypeList(); |
|
|
|
|
|
|
|
const ageLabel = ageList.find(i => i.value == row.patient_age_type); |
|
|
|
|
|
|
|
ageText = `${row.patient_age}${ageLabel ? ageLabel.label : ''}`; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 部位格式化(取 positions 数组或 position_text) |
|
|
|
|
|
|
|
let positions = []; |
|
|
|
|
|
|
|
if (row.positions && row.positions.length) { |
|
|
|
|
|
|
|
positions = row.positions.reduce((prev, cur) => { |
|
|
|
|
|
|
|
prev.push(cur.level2.name) |
|
|
|
|
|
|
|
return prev |
|
|
|
|
|
|
|
}, []) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.patientInfo = { |
|
|
|
|
|
|
|
patient_name: row.patient_name || '', |
|
|
|
|
|
|
|
ageText, |
|
|
|
|
|
|
|
positions: row.position_text ? [...positions, row.position_text] : positions |
|
|
|
|
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
// ==================== 【1】初始化 ==================== |
|
|
|
// ==================== 【1】初始化 ==================== |
|
|
|
// 页面初始化 |
|
|
|
// 页面初始化 |
|
|
|
@ -458,7 +546,7 @@ export default { |
|
|
|
window.hirtcwebsdk.init({ |
|
|
|
window.hirtcwebsdk.init({ |
|
|
|
serviceID: '56da5fd8921f4f7093a42e2a', |
|
|
|
serviceID: '56da5fd8921f4f7093a42e2a', |
|
|
|
serviceKey: '2c17c6393771ee3048ae34d6b965sdew', |
|
|
|
serviceKey: '2c17c6393771ee3048ae34d6b965sdew', |
|
|
|
Services: { BasicRoomServiceToken: "http://120.221.95.4/v1/auth/token" }, |
|
|
|
Services: { BasicRoomServiceToken: "https://120.221.95.4:7080/v1/auth/token" }, |
|
|
|
cameraLayers: [ |
|
|
|
cameraLayers: [ |
|
|
|
{ |
|
|
|
{ |
|
|
|
width: 320, |
|
|
|
width: 320, |
|
|
|
@ -487,19 +575,148 @@ export default { |
|
|
|
forceArea: true, |
|
|
|
forceArea: true, |
|
|
|
screenEnableAudio: true, |
|
|
|
screenEnableAudio: true, |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("joined", this.handleJoined); // 进房成功 |
|
|
|
const roomId = 'room_' + (this.meetingCode || 'default'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// window.hirtcwebsdk.join(this.userID, this.roomID, this.$store.state.user.userInfo.name); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// this.join() |
|
|
|
|
|
|
|
// const userID = this.userID.trim(); |
|
|
|
|
|
|
|
// const roomID = this.roomID.trim(); |
|
|
|
|
|
|
|
// const uName = (this.$store.state.user.name || '用户').trim(); |
|
|
|
|
|
|
|
// console.log(12121212) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// console.log(userID, roomID); |
|
|
|
|
|
|
|
// if (userID === "") { |
|
|
|
|
|
|
|
// this.$message({ |
|
|
|
|
|
|
|
// message: "用户名不能为空", |
|
|
|
|
|
|
|
// type: "warning", |
|
|
|
|
|
|
|
// }); |
|
|
|
|
|
|
|
// return; |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
// if (roomID === "") { |
|
|
|
|
|
|
|
// this.$message({ |
|
|
|
|
|
|
|
// message: "房间号不能为空", |
|
|
|
|
|
|
|
// type: "warning", |
|
|
|
|
|
|
|
// }); |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
// 初始化设备 |
|
|
|
|
|
|
|
// askForPermission() => permission事件 => getDevices() => deviceList事件 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.askForPermission(true, true); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// this.join() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const roomId = 'room_' + (this.meetingCode || 'default'); |
|
|
|
const uid = String(this.$store.state.user.id || Date.now()); |
|
|
|
const uid = String(this.$store.state.user.id || Date.now()); |
|
|
|
const uName = (this.$store.state.user.name || '用户').trim(); |
|
|
|
const uName = (this.$store.state.user.name || '用户').trim(); |
|
|
|
console.log(roomId, uid, uName) |
|
|
|
// // console.log(roomId, uid, uName) |
|
|
|
window.hirtcwebsdk.addListener('joined', () => { |
|
|
|
window.hirtcwebsdk.addListener('joined', userList => { |
|
|
|
this.$message.success('加入会议成功'); |
|
|
|
userList.forEach(user => { |
|
|
|
this.updateParticipantCount(); |
|
|
|
const { userID, streams } = user |
|
|
|
|
|
|
|
console.log(userID, streams) |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
window.hirtcwebsdk.join(this.$route.query.roomId_id, uid, this.$store.state.user.userInfo.name); |
|
|
|
|
|
|
|
// window.hirtcwebsdk.join(this.userID, this.roomID, ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener('user-joined', this.updateParticipantCount); |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener('user-left', this.updateParticipantCount); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
join() { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
publish() { |
|
|
|
|
|
|
|
// 进房后才能推流 |
|
|
|
|
|
|
|
if (!this.isJoined) { |
|
|
|
|
|
|
|
this.$message({ |
|
|
|
|
|
|
|
message: "请进房成功后,再发布", |
|
|
|
|
|
|
|
type: "warning", |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 推流依赖 init() 硬件权限 和 initLocalStream() 硬件配置和预览 |
|
|
|
|
|
|
|
// publish() => published事件 |
|
|
|
|
|
|
|
if (this.localCameraStream.isPreviewed) { |
|
|
|
|
|
|
|
window.hirtcwebsdk.publish(this.localCameraStream.type); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
this.$message({ |
|
|
|
|
|
|
|
message: "没有预览成功,请检查设备", |
|
|
|
|
|
|
|
type: "warning", |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bindEvent() { |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("permission", this.handlePermission); // 音视频设备权限回调 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("deviceList", this.handleDeviceList); // 获取设备列表回调 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("deviceChanged", this.handleDeviceChanged); // 硬件插拔事件 |
|
|
|
|
|
|
|
window.hirtcwebsdk.addListener("joined", this.handleJoined); // 进房成功 |
|
|
|
|
|
|
|
console.log(111111111) |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("camera", this.handleCameraPreview); // 本地音视频预览回调 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("screen", this.handleSreenPreview); // 屏幕共享预览回调 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("cameraEx", this.handleCameraExPreview); // 本地音视频预览回调 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("published", this.handlePublished); // 本地音视频/屏幕共享发布成功 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("publishedEx", this.handlePublishedEx); // 本地音视频/屏幕共享发布成功 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("subscribed", this.handleSubscribed); // 订阅远端流成功 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("someoneJoined", this.handleSomeoneJoined); // 远端用户加入 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("someoneLeft", this.handleSomeoneLeft); // 远端用户离开 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("streamAdded", this.handleStreamAdded); // 远端用户发布流 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("streamRemoved", this.handleStreamRemoved); // 远端用户取消流 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("streamUpdated", this.handleStreamUpdated); // 远端用户更新流状态(开关音视频) |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("disconnected", this.handleDisconnected); // 服务器断开,若已进房成功,会自动重连 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("reconnected", this.handleReconnected); // 重连成功 |
|
|
|
|
|
|
|
// window.hirtcwebsdk.addListener("error", this.handleError); // 错误处理 |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handleDeviceList(info) { |
|
|
|
|
|
|
|
if (!info) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
const newDevice = JSON.parse(JSON.stringify(info)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!this.device.isInit) { |
|
|
|
|
|
|
|
this.device.audio = newDevice.audioinput; |
|
|
|
|
|
|
|
this.device.video = newDevice.videoinput; |
|
|
|
|
|
|
|
this.device.output = newDevice.audiooutput; |
|
|
|
|
|
|
|
this.device.isInit = true; |
|
|
|
|
|
|
|
this.initLocalStream(this.localCameraStream.type); |
|
|
|
|
|
|
|
this.initLocalStream(this.localCameraStreamEx.tag); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// TODO 检测 device 与 newDevice 的差异,提示设备插拔,和相应的操作 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
handleJoined(users) { |
|
|
|
|
|
|
|
console.log("handleJoined>>>>>>>>>>>>>") |
|
|
|
|
|
|
|
this.joinRetry = 0; |
|
|
|
|
|
|
|
if (users && users.length > 0) { |
|
|
|
|
|
|
|
this.userList = users; |
|
|
|
|
|
|
|
users.forEach((user) => { |
|
|
|
|
|
|
|
if (user.streams && user.streams.length > 0) { |
|
|
|
|
|
|
|
user.streams.forEach((stream) => { |
|
|
|
|
|
|
|
this.subscribe({ |
|
|
|
|
|
|
|
...stream, |
|
|
|
|
|
|
|
userID: user.userID, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// 添加自己 |
|
|
|
|
|
|
|
this.userList.unshift({ |
|
|
|
|
|
|
|
userID: `${this.userID}(我)`, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
this.isJoined = true; |
|
|
|
|
|
|
|
this.$message({ |
|
|
|
|
|
|
|
message: "进房成功", |
|
|
|
|
|
|
|
type: "success", |
|
|
|
}); |
|
|
|
}); |
|
|
|
window.hirtcwebsdk.join(this.$route.query.roomId_id, uid, uName); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
window.hirtcwebsdk.addListener('user-joined', this.updateParticipantCount); |
|
|
|
// 进房推流 |
|
|
|
window.hirtcwebsdk.addListener('user-left', this.updateParticipantCount); |
|
|
|
if (this.localCameraStream.isPreviewed) { |
|
|
|
|
|
|
|
this.publish(); |
|
|
|
|
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// ==================== 【2】设备:摄像头 + 麦克风 ==================== |
|
|
|
// ==================== 【2】设备:摄像头 + 麦克风 ==================== |
|
|
|
@ -1241,7 +1458,7 @@ export default { |
|
|
|
ConsultationCaseStatsDialog.open(this.consultation_id); |
|
|
|
ConsultationCaseStatsDialog.open(this.consultation_id); |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
.catch(() => {}); |
|
|
|
.catch(() => { }); |
|
|
|
}, |
|
|
|
}, |
|
|
|
endMeeting() { |
|
|
|
endMeeting() { |
|
|
|
this.$confirm('确定结束会议?', '提示', { type: 'warning' }) |
|
|
|
this.$confirm('确定结束会议?', '提示', { type: 'warning' }) |
|
|
|
@ -1253,7 +1470,7 @@ export default { |
|
|
|
ConsultationCaseStatsDialog.open(this.consultation_id); |
|
|
|
ConsultationCaseStatsDialog.open(this.consultation_id); |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
.catch(() => {}); |
|
|
|
.catch(() => { }); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 快捷键监听 |
|
|
|
// 快捷键监听 |
|
|
|
@ -1481,6 +1698,25 @@ export default { |
|
|
|
|
|
|
|
|
|
|
|
.left-section { |
|
|
|
.left-section { |
|
|
|
margin-right: 20px; |
|
|
|
margin-right: 20px; |
|
|
|
|
|
|
|
display: flex; |
|
|
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
gap: 12px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.patient-info { |
|
|
|
|
|
|
|
color: white; |
|
|
|
|
|
|
|
font-size: 13px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.patient-field { |
|
|
|
|
|
|
|
display: flex; |
|
|
|
|
|
|
|
align-items: center; |
|
|
|
|
|
|
|
gap: 2px; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
label { |
|
|
|
|
|
|
|
color: #80cbc4; |
|
|
|
|
|
|
|
font-weight: 400; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.tools-section { |
|
|
|
.tools-section { |
|
|
|
|