import React from 'react'; import Login from '@components/login/Index.jsx'; import DoctorScreen from '@pages/doctorScreen/Index.jsx'; import BigScreen from '@pages/bigScreen/Index.jsx'; import OperateScreen from '@pages/operateScreen/Index.jsx'; import FingerprintJS from '@fingerprintjs/fingerprintjs'; import { initSocket } from '@api/index.js'; import { AntOutline, SetOutline } from 'antd-mobile-icons'; import { Toast } from 'antd-mobile'; // // 安卓相关处理 import audioSrc from './../../assets/mp3.wav'; window.webGetDeviceId = function (callback) { window.callback = callback; }; class Home extends React.Component { constructor(props) { super(props); this.state = { visibleLogin: false, userData: {}, // 用户及房间数据 patList: [], // 就诊等待数据 waitPat: [], patListArea: [], //区域等待就诊患者数据 reWaitPat: [], // 复诊的患者 roomObj: {}, delayPat: [], //候诊数据 showType: 'doctor', // doctor医生诊室 area诊区叫号 operate手术室 cache: {}, colorName: localStorage.getItem('ZZJ-color'), // white-bg白色 dark-bg深色 deviceID: '', hosLogo: '', voiceSrc: [], isPlay: false, voiceList: [], myStatus: false, // 模拟数据 tempList: [ { 'roomDesc': '专家诊室一', 'docName': '宦大达', 'callMsg': { 'callPat': [{ 'patCallNo': '11号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '1', 'patName': '患*者1' }, { 'patCallNo': '2', 'patName': '患*者2' }, { 'patCallNo': '3', 'patName': '患*者3' }, { 'patCallNo': '4', 'patName': '患*者4' }, { 'patCallNo': '5', 'patName': '患*者5' }, { 'patCallNo': '6', 'patName': '患*者6' }, { 'patCallNo': '7', 'patName': '患*者7' }, { 'patCallNo': '8', 'patName': '患*者8' }, { 'patCallNo': '9', 'patName': '患*者9' }, { 'patCallNo': '10', 'patName': '患*者10' }, { 'patCallNo': '11', 'patName': '患*者11' }, { 'patCallNo': '12', 'patName': '患*者12' }], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, { 'patCallNo': '复02', 'patName': '患*者2' }, { 'patCallNo': '复03', 'patName': '患者3a' }, { 'patCallNo': '复01', 'patName': '患*者1' }, { 'patCallNo': '复02', 'patName': '患*者2' }, { 'patCallNo': '复03', 'patName': '患者3a' }, { 'patCallNo': '复04', 'patName': '患者4a' }], }, delayPat: '患*者1,患*者2,患者3a,患*者1,患*者2,患者3a,患者4a,患*者1,患*者2,患者3a,患*者1,患*者2,患者3a,患者4a患*者1,患*者2,患者3a,患*者1,患*者2,患者3a,患者4a', }, { 'roomDesc': '诊室1', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室2', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室3', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室4', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室5', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室6', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室7', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室8', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室9', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室10', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室11', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '11号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '1', 'patName': '患*者1' }, { 'patCallNo': '2', 'patName': '患*者2' }, { 'patCallNo': '3', 'patName': '患*者3' }, { 'patCallNo': '4', 'patName': '患*者4' }, { 'patCallNo': '5', 'patName': '患*者5' }, { 'patCallNo': '6', 'patName': '患*者6' }, { 'patCallNo': '7', 'patName': '患*者7' }, { 'patCallNo': '8', 'patName': '患*者8' }, { 'patCallNo': '9', 'patName': '患*者9' }, { 'patCallNo': '10', 'patName': '患*者10' }, { 'patCallNo': '11', 'patName': '患*者11' }, { 'patCallNo': '12', 'patName': '患*者12' }], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, { 'patCallNo': '复02', 'patName': '患*者2' }, { 'patCallNo': '复03', 'patName': '患者3a' }, { 'patCallNo': '复04', 'patName': '患者4a' }], } }, { 'roomDesc': '诊室12', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, { 'roomDesc': '诊室13', 'docName': '医生1', 'callMsg': { 'callPat': [{ 'patCallNo': '1号', 'patName': '患*者' }], 'waitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], 'reWaitPat': [ { 'patCallNo': '复01', 'patName': '患*者1' }, ], } }, ], }; } componentDidMount() { this.initDevice(); this.initAndroidVoice(); const test = () => { var start = 0; setInterval(() => { const data = this.state.tempList[start]; const patList = [...data.callMsg.callPat, ...data.callMsg.waitPat.map(v => { return { ...v, status: 'waiting' }; })]; const { roomObj } = this.state; roomObj[data.roomDesc] = data; const newArray = Object.keys(roomObj).map(key => { return roomObj[key]; }); this.setState({ userData: { ...data?.userData, areaDesc: data.locDesc, // 大屏诊区 roomDesc: data.roomDesc, // 诊室 }, patList, waitPat: data.callMsg.waitPat, reWaitPat: data.callMsg.reWaitPat, patListArea: newArray, roomObj, delayPat: data.delayPat, }); ++start; if (start > 13) { start = 0; } this.initVoice('/mp3.wav'); }, 2950); }; //test(); } initAndroidVoice() { window.mediaPlayOver = (flag) => { if (flag == 'success') { this.state.voiceList.splice(0, 1); this.setState({ voiceList: this.state.voiceList, }, () => { this.soundPaly(); }); } }; } soundPaly() { if (this.state.voiceList.length > 0) { this.setState({ myStatus: true, }, () => { const ua = navigator.userAgent.toLowerCase(); if (/android/.test(ua)) { window.JavaClientCall && window.JavaClientCall.mediaFilePlay(this.state.voiceList[0]); } }); } else { this.setState({ myStatus: false }); } } // 音频播放事件 initVoice = (src) => { const { voiceSrc } = this.state; voiceSrc.push(src); this.setState({ voiceSrc, }, () => { if (voiceSrc.length == 1) { playVioce(src); } }); const playVioce = (audioSrc) => { if (this.state.isPlay) { return; } this.setState({ isPlay: true, }, () => { const domAudio = document.querySelector('#audio'); domAudio.src = audioSrc; domAudio.playbackRate = 1; domAudio.currentTime = 0; domAudio.load(); domAudio.play(); const mes = () => { Toast.show({ duration: 10000, content: '播放完成', }); const { voiceSrc } = this.state; voiceSrc.splice(0, 1); const newArr = voiceSrc; this.setState({ isPlay: false, voiceSrc: newArr, }, () => { if (newArr.length > 0) { playVioce(newArr[0]); } domAudio.removeEventListener('ended', mes); }); }; domAudio.addEventListener('ended', mes); // 10s看是否播放结束 // setTimeout(() => { // if (this.state.isPlay) { // mes(); // } // }, 10000); }); }; }; initDevice = async () => { //接收Android端身份证信息函数 window.webGetDeviceId = (deviceId) => { this.setState({ deviceID: deviceId, }, () => { this.loginInit(); }); }; const ua = navigator.userAgent.toLowerCase(); if (/android/.test(ua)) { window.JavaClientCall && window.JavaClientCall.getDeviceID(); } // 测试环境无法从安卓获取数据 const isDev = import.meta.env.MODE == 'development'; if (isDev) { const fp = await FingerprintJS.load(); const AndroidInfo = await fp.get(); this.setState({ deviceID: AndroidInfo.visitorId, }, () => { this.loginInit(); }); } }; // 改变颜色 changeSwitch = () => { let { colorName } = this.state; if (!colorName) { colorName = 'white-bg'; } else if (colorName == 'white-bg') { colorName = 'dark-bg'; } else { colorName = ''; } this.setState({ colorName, }); localStorage.setItem('ZZJ-color', colorName); }; openLogin = (cache) => { if (!cache) { cache = { BASE_URL: 'http://10.1.?.29:8090', Address: '/bdhealth/', room: '', use: '', hospital: '', }; } this.setState({ cache, visibleLogin: true, }); }; hideLogin = () => { this.setState({ visibleLogin: false, }); }; loginInit = async() => { let cache = localStorage.getItem('ZZJ-base'); if (cache) { cache = JSON.parse(cache); } if (!cache || (cache && !cache.room)) { this.openLogin(cache); return; } const obj = await this.login(cache); if (!obj) { return; } obj.deviceID = this.state.deviceID; initSocket(obj, (data) => { // console.log('Room接收消息:',data ); data = JSON.parse(data); if (data.callMsg) { const patList = [...data.callMsg.callPat, ...data.callMsg.waitPat.map(v => { return { ...v, status: 'waiting' }; })]; const { roomObj } = this.state; roomObj[data.roomDesc] = data; const newArray = Object.keys(roomObj).map(key => { return roomObj[key]; }); this.setState({ userData: { ...data?.userData, areaDesc: data.locDesc, // 大屏诊区 roomDesc: data.roomDesc, // 诊室 }, patList, waitPat: data.callMsg.waitPat, reWaitPat: data.callMsg.reWaitPat, patListArea: newArray, roomObj, delayPat: data.delayPat, }); if (!data.path || !data.voiceFileName) { return; } this.state.voiceList.push(data.path + data.voiceFileName); this.setState({ voiceList: this.state.voiceList, }, () => { if (!this.state.myStatus) { this.soundPaly(); } }); // this.initVoice(data.path + data.voiceFileName); } }); }; //登录事件 login = async () => { let cache = localStorage.getItem('ZZJ-base'); if (!cache) { return; } cache = JSON.parse(cache); return React.$fetchPost('04150020', { params: [{ ip: cache.BASE_URL, identifyCode: this.state.deviceID, }], }, true).then((data) => { if (data) { const obj = { Loc: 'area', Room: 'doctor', OptomeRoom: 'doctor', OperLoc: 'operate', }; this.setState({ userData: data?.result[0] || {}, // https://172.16.1.6/images/hoslogo/H02.png 医院logo hosLogo: `/images/hoslogo/${data?.result[0]?.hospCode}.png` }); if (obj[data.code]) { this.setState({ showType: obj[data.code], // Loc医生诊室 Room,OptomeRoom大屏 OperLoc 手术室 }); if (obj[data.code] == 'doctor') { document.querySelector('html').className = ''; } else { document.querySelector('html').className = 'big'; } return data?.result[0] || null; } else { this.openLogin(); return null; } } }); }; render () { return ( <> <div className={ this.state.colorName}> {/* 设备信息配置,选择医院 */} <Login visibleLogin={this.state.visibleLogin} formData={this.state.cache} hideLogin={this.hideLogin} loginInit={this.loginInit} deviceID={this.state.deviceID} /> {/* 医生诊室呼叫 */} {this.state.showType == 'doctor' ? <DoctorScreen userData={this.state.userData} patList={this.state.patList} reWaitPat={this.state.reWaitPat} hosLogo={this.state.hosLogo} /> : this.state.showType == 'operate' ? <OperateScreen patList={this.state.waitPat} userData={this.state.userData} hosLogo={this.state.hosLogo} /> : < BigScreen userData={this.state.userData} patListArea={this.state.patListArea} delayPat={this.state.delayPat} hosLogo={this.state.hosLogo} /> } </div> <span className='bottom-set' > <AntOutline style={{color: this.state.colorName == 'dark-bg' ? '#fff' : '#0D2764', marginLeft: '10px'}} onClick={this.changeSwitch} /> <SetOutline onClick={this.openLogin} style={{color: this.state.colorName == 'dark-bg' ? '#fff' : '#0D2764', marginLeft: '10px'}} /> </span> <audio controls id="audio" style={{ position: 'fixed', left: '-1000px', top: '100px' }} ></audio> </> ); } } export default Home;