123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566 |
- 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;
|