| | |
| | | const Store = require('electron-store'); |
| | | const store = new Store(); |
| | | console.log(store.path) |
| | | |
| | | // 读 |
| | | // console.log(store.get('clientCode')) |
| | | // console.log(store.get('deviceList')) |
| | |
| | | // 测试推送消息到Renderer进程 |
| | | win.webContents.on('did-finish-load', () => { |
| | | win?.webContents.send('main-process-message', new Date().toLocaleString()) |
| | | win?.webContents.send('getConfigData',store.get('clientCode'),store.get('deviceList'),store.path) |
| | | win?.webContents.send('getConfigData',store.get('clientCode'),store.get('devices'),store.path) |
| | | win?.webContents.send('getScreenTimeout',store.get('screenTimeout')) |
| | | }) |
| | | |
| | | // Make all links open with the browser, not with the application |
| | |
| | | ipcMain.on("main-process-message2",()=>{ |
| | | console.log("33344") |
| | | }) |
| | | // 渲染端发送消息到主进程 |
| | | ipcMain.on('synchronous-message', (event, arg) => { |
| | | console.log(arg) // 在 Node 控制台中打印“ping” |
| | | event.returnValue = store.get('clientCode') |
| | | // 渲染端发送消息到主进程修改confing文件 |
| | | ipcMain.on('setConfingData', (event, arg) => { |
| | | const mode1=store.store |
| | | const mode2={ |
| | | "clientCode": arg.clientCode, |
| | | "machineName": arg.machineName, |
| | | "screenTimeout": arg.screenTimeout, |
| | | "devices":arg.devices |
| | | } |
| | | //对比两端配置文件 |
| | | if(JSON.stringify(mode1)!=JSON.stringify(mode2)){ |
| | | //更新cofing.json |
| | | console.log('update confing.json') |
| | | store.set(mode2) |
| | | // 重新建立sockte 通讯 |
| | | win?.webContents.send('getConfigData',store.get('clientCode'),store.get('devices'),store.path) |
| | | win?.webContents.send('getScreenTimeout',store.get('screenTimeout')) |
| | | } |
| | | |
| | | |
| | | }) |
| | |
| | | "iconv-lite": "^0.6.3", |
| | | "internet-available": "^1.0.0", |
| | | "pinia": "^2.0.14", |
| | | "sound-play": "^1.1.0", |
| | | "stompjs": "^2.3.3", |
| | | "vue-router": "^4.0.16" |
| | | } |
| | |
| | | import { lstat } from 'fs/promises' |
| | | |
| | | import { cwd } from 'process' |
| | | import { ipcRenderer } from 'electron' |
| | | import {creatorClient} from './sockteStomp' |
| | | import {sockteStore} from '@/stores/sockteInfo' |
| | | import { patientInfoStore } from '@/stores/patient' |
| | | import os from 'os' |
| | | // import internetAvailable from "internet-available" |
| | | var internetAvailable = require("internet-available") |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import { on } from 'events' |
| | | let deviceList=[] |
| | | let clientCode='' |
| | | // 主进程发送消息到渲染进程 |
| | |
| | | ipcRenderer.on('getConfigData',(_event,...args)=>{ |
| | | console.log("config.json",...args) |
| | | if(args[0]===undefined){ |
| | | alert("配置文件没有写入配置,请检查配置文件 文件路径:"+args[2]) |
| | | // alert("配置文件没有写入配置,请检查配置文件 文件路径:"+args[2]) |
| | | ElMessageBox.prompt('没有设定客户编号,请输入客户编号并保存', '警告', { |
| | | confirmButtonText: '保存', |
| | | showClose:false, |
| | | showCancelButton:false, |
| | | inputErrorMessage: 'Invalid Email', |
| | | }) |
| | | .then(({ value }) => { |
| | | const mode={ |
| | | clientCode:value, |
| | | machineName:os.hostname(), |
| | | screenTimeout: 300, |
| | | devices:[] |
| | | } |
| | | ipcRenderer.send('setConfingData',mode) |
| | | }) |
| | | |
| | | } |
| | | else if(args.length>0&&args[0].length>0){ |
| | | clientCode=args[0] |
| | |
| | | creatorClient(deviceList,clientCode) |
| | | } |
| | | }) |
| | | |
| | | ipcRenderer.on("getScreenTimeout",(_event,args)=>{ |
| | | console.log(args,'得到配置文件时间') |
| | | patientInfoStore().setViewNumber(args) |
| | | }) |
| | | setInterval(function(){ |
| | | // 检查网络状态 |
| | | internetAvailable({ |
| | | domainName: "baidu.com", |
| | | host: '114.114.114.114' |
| | | }).then(()=>{ |
| | | console.log('网路已连接') |
| | | sockteStore().setnetLink(true) |
| | | }).catch(()=>{ |
| | | sockteStore().setnetLink(false) |
| | | console.log("网路链接失败") |
| | | }) |
| | | },10000) |
| | | |
| | |
| | | import Stomp from 'stompjs' |
| | | import os from 'os' |
| | | import { ipcRenderer } from 'electron' |
| | | var stompClient: Stomp.Client | null=null |
| | | |
| | | import { userInfoStore } from '@/stores/userInfo' |
| | | import { patientInfoStore } from '@/stores/patient' |
| | | import {sockteStore} from '@/stores/sockteInfo' |
| | | import { result } from 'lodash' |
| | | const sound = require("sound-play"); |
| | | |
| | | |
| | | |
| | |
| | | const deviceInfo=devices.find(de=>{ |
| | | return de.deviceName===resultInfo.deviceNumber |
| | | }) |
| | | console.log('---1-',deviceInfo) |
| | | console.log(deviceInfo,'更具设备number查找到的设备') |
| | | if(deviceInfo!==undefined){ |
| | | switch(deviceInfo.deviceType){ |
| | | case '读卡器': |
| | |
| | | type:"读卡器", |
| | | result:resultInfo.result, |
| | | resultTime:resultInfo.resultTime, |
| | | state:0 |
| | | state:2 |
| | | } |
| | | ) |
| | | break |
| | |
| | | type:"体重秤", |
| | | result:resultInfo.result, |
| | | resultTime:resultInfo.resultTime, |
| | | state:0 |
| | | state:2 |
| | | } |
| | | ) |
| | | break |
| | | case "血压计": |
| | | console.log(resultInfo,'血压计') |
| | | sockteStore().setxyjSockte( |
| | | { |
| | | deviceName:resultInfo.deviceNumber, |
| | | type:"血压计", |
| | | result:resultInfo.result, |
| | | resultTime:resultInfo.resultTime, |
| | | state:0 |
| | | state:2 |
| | | } |
| | | ) |
| | | break |
| | |
| | | } |
| | | |
| | | } |
| | | const writePatient=(resultInfo:any)=>{ |
| | | const info={ |
| | | id:resultInfo.patientInfo===null?0:resultInfo.patientInfo.id, |
| | | code:resultInfo.patientInfo===null?'':resultInfo.patientInfo.code, |
| | | name:resultInfo.patientInfo===null?0:resultInfo.patientInfo.patientName, |
| | | patientAvatarIcon:resultInfo.patientInfo===null?0:resultInfo.patientInfo.patientAvatarIcon, |
| | | deviceCode:resultInfo.deviceCode===null?"":resultInfo.deviceCode, |
| | | hemoCode:resultInfo.hemoCode===null?"":resultInfo.hemoCode, |
| | | pureWeight:resultInfo.pureWeight===null?"":resultInfo.pureWeight |
| | | } |
| | | // 写入vuex里 |
| | | patientInfoStore().setpatientInfo(info) |
| | | console.log('播放声音') |
| | | // sound.play("https://dhcdn.leon056.com/hemo/autoselfsign/step2.mp3") |
| | | |
| | | |
| | | } |
| | | |
| | | // 订阅结果事件返回函数 |
| | | const callback = function(message:any) { |
| | | console.log('接收到数据-----',message.body) |
| | | if (message.body!==undefined) { |
| | | const data=JSON.parse(message.body) |
| | | console.log(data,"体重数据") |
| | | writeResult(data) |
| | | } |
| | | else { |
| | |
| | | if (message.body) { |
| | | const data=JSON.parse(message.body) |
| | | console.log(data,'患者信息读取') |
| | | writePatient(data) |
| | | |
| | | } |
| | | |
| | | } |
| | | const configCallback =function(message:any){ |
| | | if(message.body){ |
| | | const data=JSON.parse(message.body) |
| | | console.log(data,'配置文件读取') |
| | | ipcRenderer.send('setConfingData',data) |
| | | |
| | | } |
| | | } |
| | | const connectCallback=function(){ |
| | | const pcName= os.hostname() |
| | | // 订阅患者信息服务 |
| | | if(stompClient!==null){ |
| | | stompClient.subscribe(`/queue/patient/info/${pcName}`,PatientCallback) |
| | | stompClient.subscribe(`/queue/workstation/config/set/${clientCode}/${pcName}`,configCallback) |
| | | stompClient.send(`/app/workstation/config/set/${clientCode}/${pcName}`,{},JSON.stringify({"clientCode":clientCode,"machineName":pcName})) |
| | | |
| | | } |
| | | console.log("链接成功",stompClient,pcName) |
| | | // 更新sockte链接状态 |
| | | sockteStore().setsockteIsLink(true) |
| | | console.log(sockteStore().isLink) |
| | | console.log(devices) |
| | | if(devices.length>0){ |
| | | if(devices!==undefined&&devices.length>0){ |
| | | devices.forEach(de=>{ |
| | | if(stompClient!==null){ |
| | | stompClient.subscribe(`/queue/${clientCode}/${de.deviceName}/result`,callback) |
| | |
| | | stompClient.connect({}, connectCallback,error_callback) |
| | | |
| | | } |
| | | /** |
| | | * 发送患者卡号返回患者信息 |
| | | * @param codeStr |
| | | */ |
| | | const sendPationCode=(codeStr:string)=>{ |
| | | const mode={ |
| | | clientCode:clientCode, |
| | | queryCode:codeStr |
| | | } |
| | | if(stompClient!==null){ |
| | | stompClient.send(`/app/patient/info/get/${os.hostname()}`,{},codeStr) |
| | | stompClient.send(`/app/patient/info/get/${os.hostname()}`,{},JSON.stringify(mode)) |
| | | } |
| | | } |
| | | export {creatorClient,sendPationCode} |
| | | /** |
| | | * |
| | | * @param mode 发送结果到sockt服务 |
| | | */ |
| | | const sendPationSet=(mode:any)=>{ |
| | | if(stompClient!==null){ |
| | | stompClient.send(`/app/patient/info/set`,{},JSON.stringify(mode)) |
| | | } |
| | | } |
| | | export {creatorClient,sendPationCode,sendPationSet} |
| | |
| | | import { Session } from '@/utils/storage' |
| | | |
| | | export const patientInfoStore =defineStore('patientInfo',()=>{ |
| | | const patientInfo=ref({id:0,code:'',patientCode:'',schemeName:'',scheduleDate:'',patientPreHemoWeight:0,pureWeight:0,confirmUserInfo:{userName:''},patientInfo:{patientName:'',patientGender:0,age:'',patientHemoCode:''},deviceInfo:{deviceNo:''}})// 初始值 |
| | | const patientInfo=ref({ |
| | | id:0, |
| | | code:'', |
| | | name:'', |
| | | patientAvatarIcon:'', |
| | | deviceCode:'', |
| | | hemoCode:'', |
| | | pureWeight:'' |
| | | |
| | | })// 初始值 |
| | | const viewNumber=ref(60) |
| | | function setpatientInfo(patient:any){ |
| | | patientInfo.value=patient |
| | | Session.set('patientInfo', patient) |
| | | } |
| | | return {patientInfo,setpatientInfo} |
| | | function setViewNumber(num:any){ |
| | | viewNumber.value=num |
| | | } |
| | | return {patientInfo,setpatientInfo,viewNumber,setViewNumber} |
| | | }) |
| | |
| | | deviceName:string; |
| | | result:string; |
| | | resultTime:string; |
| | | state:0; |
| | | state:number; |
| | | } |
| | | |
| | | let weightInfo:info={ |
| | | type:"体重秤", |
| | | state:0, |
| | | state:2, |
| | | deviceName:"", |
| | | result:"0", |
| | | resultTime:"" |
| | | } |
| | | let xyjInfo:info={ |
| | | type:"血压计", |
| | | state:0, |
| | | state:2, |
| | | deviceName:"", |
| | | result:"", |
| | | resultTime:"" |
| | | } |
| | | let dkqInfo:info={ |
| | | type:"读卡器", |
| | | state:0, |
| | | state:2, |
| | | deviceName:"", |
| | | result:"", |
| | | resultTime:"" |
| | | } |
| | | export const sockteStore =defineStore('sockteInfo',()=>{ |
| | | const isLink=ref(false) // sockte 链接状态 |
| | | const isLink=ref(true) // sockte 链接状态 |
| | | const netLink=ref(true) // 网络链接状态 |
| | | const weightSockte=ref(weightInfo) // 体重秤sockte结果 |
| | | const xyjSockte=ref(xyjInfo) // 血压计sockte结果 |
| | |
| | | weightSockte.value.deviceName=info.deviceName |
| | | weightSockte.value.result=info.result |
| | | weightSockte.value.resultTime=info.resultTime |
| | | weightSockte.value.state=info.state |
| | | } |
| | | /** |
| | | * 更新体重秤工作状态 |
| | |
| | | xyjSockte.value.deviceName=info.deviceName |
| | | xyjSockte.value.result=info.result |
| | | xyjSockte.value.resultTime=info.resultTime |
| | | weightSockte.value.state=info.state |
| | | } |
| | | /** |
| | | * 更新血压计结果 |
| | |
| | | <script lang="ts"> |
| | | import { userInfoStore } from '@/stores/userInfo' |
| | | import { sockteStore } from '@/stores/sockteInfo' |
| | | import { patientInfoStore } from '@/stores/patient' |
| | | import { ipcRenderer } from 'electron' |
| | | import { reactive,computed, toRefs,onMounted ,ref} from "vue" |
| | | import{sendPationCode} from '../../samples/sockteStomp' |
| | | import os from "os" |
| | | import { reactive,computed, toRefs,onMounted ,ref,watch} from "vue" |
| | | import{sendPationCode,sendPationSet} from '../../samples/sockteStomp' |
| | | import {formatDate} from '@/utils/formatTime' |
| | | export default { |
| | | setup() { |
| | | let timer:any=0 |
| | | const user = userInfoStore() |
| | | const sockte= sockteStore() |
| | | const inputRef=ref() |
| | | const AudioRef0=ref() |
| | | const AudioRef=ref() |
| | | const AudioRef2=ref() |
| | | const AudioRef3=ref() |
| | | const isLink= computed(()=>{ |
| | | return !sockte.isLink |
| | | }) |
| | |
| | | const weightInfo= computed(()=>{ |
| | | return sockte.weightSockte |
| | | }) |
| | | const xyjInfo= computed(()=>{ |
| | | return sockte.xyjSockte |
| | | }) |
| | | const patientInfo=computed(()=>{ |
| | | return patientInfoStore().patientInfo |
| | | }) |
| | | const viewNumber=computed(()=>{ |
| | | return patientInfoStore().viewNumber |
| | | }) |
| | | |
| | | const settime=()=>{ |
| | | // 计数倒计时 |
| | | state.clockNum=patientInfoStore().viewNumber |
| | | // 清除定时器 |
| | | clearInterval(state.timerNum) |
| | | console.log('------------------') |
| | | timer= setInterval(() => { |
| | | if (state.clockNum > 0) { |
| | | state.clockNum-- |
| | | } |
| | | else { |
| | | clearInterval(timer) |
| | | patientInfoStore().setpatientInfo({ |
| | | id:0, |
| | | code:'', |
| | | name:'', |
| | | patientAvatarIcon:'', |
| | | deviceCode:'', |
| | | hemoCode:'', |
| | | pureWeight:'' |
| | | }) |
| | | state.clockNum = patientInfoStore().viewNumber |
| | | } |
| | | }, 1000) |
| | | // 记录定时器 |
| | | state.timerNum=timer |
| | | console.log(timer) |
| | | } |
| | | const state=reactive({ |
| | | dialogVisible:false, |
| | | isActive:false, |
| | | inputCode:"", |
| | | Newdate:"" |
| | | Newdate:"", |
| | | clockNum:60, |
| | | timerNum:0,//定时器数 |
| | | aimTSL:0,// 目标脱水量, |
| | | gao_ya:"",//高压 |
| | | di_ya:"",//低压 |
| | | mai_bu:""//脉搏 |
| | | }) |
| | | watch( |
| | | ()=>patientInfo.value.id, |
| | | ()=>{ |
| | | console.log('患者变化了',patientInfo) |
| | | if(patientInfo.value.id!==0) |
| | | { |
| | | AudioRef.value.play(); |
| | | sockteStore().setweightSockte({ |
| | | type:"体重秤", |
| | | state:2, |
| | | deviceName:"", |
| | | result:"0", |
| | | resultTime:"" |
| | | }) |
| | | sockteStore().setxyjSockte({ |
| | | type:"血压计", |
| | | state:2, |
| | | deviceName:"", |
| | | result:"", |
| | | resultTime:"" |
| | | }) |
| | | settime() |
| | | |
| | | } |
| | | } |
| | | ) |
| | | watch( |
| | | ()=>weightInfo.value.resultTime, |
| | | ()=>{ |
| | | settime() |
| | | console.log("体重变化了") |
| | | // AudioRef2.value.play() |
| | | if(patientInfo.value.id===0){ |
| | | AudioRef0.value.play() |
| | | } |
| | | else{ |
| | | AudioRef2.value.play() |
| | | // 发送结果到sockte服务 |
| | | const mode={ |
| | | patientCode:patientInfo.value.code, |
| | | weight:weightInfo.value.result, |
| | | bloodPressure:'' |
| | | |
| | | } |
| | | console.log('发送患者结果',mode) |
| | | sendPationSet(mode) |
| | | // 计算目标脱水量 |
| | | if(Number(weightInfo.value.result)>0&&Number(patientInfo.value.pureWeight)!==0){ |
| | | state.aimTSL=Number(weightInfo.value.result)-Number(patientInfo.value.pureWeight) |
| | | } |
| | | } |
| | | } |
| | | ) |
| | | watch( |
| | | ()=>xyjInfo.value.resultTime, |
| | | ()=>{ |
| | | if(xyjInfo.value.result!==''){ |
| | | const list=xyjInfo.value.result.split(',') |
| | | if(list.length===3){ |
| | | state.gao_ya=list[0] |
| | | state.di_ya=list[1] |
| | | state.mai_bu=list[2] |
| | | } |
| | | if(patientInfo.value.id===0){ |
| | | AudioRef0.value.play() |
| | | settime() |
| | | }else{ |
| | | AudioRef3.value.play() |
| | | settime() |
| | | const mode={ |
| | | patientCode:patientInfo.value.code, |
| | | weight:weightInfo.value.result, |
| | | bloodPressure:xyjInfo.value.result |
| | | |
| | | } |
| | | console.log('发送患者结果',mode) |
| | | sendPationSet(mode) |
| | | } |
| | | }else{ |
| | | state.gao_ya="" |
| | | state.di_ya="" |
| | | state.mai_bu="" |
| | | } |
| | | } |
| | | ) |
| | | watch(()=>viewNumber, |
| | | ()=>{ |
| | | state.clockNum=viewNumber.value |
| | | } |
| | | ) |
| | | const inputChabge=()=>{ |
| | | sendPationCode(state.inputCode) |
| | | setTimeout(function(){ |
| | | state.inputCode='' |
| | | },1000) |
| | | } |
| | | onMounted(() => { |
| | | console.log('Component is mounted!') |
| | | inputRef.value.focus(); |
| | | console.log(inputRef) |
| | | console.log('页面初始化',os.hostname()) |
| | | state.clockNum=patientInfoStore().viewNumber |
| | | setTimeout(function(){ |
| | | // state.inputCode="3434" |
| | | console.log('-----------sdsds') |
| | | console.log('7秒后操作') |
| | | inputRef.value.focus(); |
| | | },10000) |
| | | },7000) |
| | | setInterval(function(){ |
| | | state.Newdate=formatDate(new Date(),"YYYY-mm-dd HH:MM:SS") |
| | | // console.log(state.Newdate,'----ss') |
| | | },1000) |
| | | }) |
| | | return{ ...toRefs(state),isLink,netLink,weightInfo,inputRef,inputChabge |
| | | return{ ...toRefs(state),isLink,netLink,weightInfo,patientInfo,inputRef,AudioRef0,AudioRef,AudioRef2,AudioRef3,inputChabge |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <template> |
| | | <div class="home"> |
| | | <!-- 提醒刷卡 --> |
| | | <audio src="https://dhcdn.leon056.com/hemo/autoselfsign/step1.mp3" ref="AudioRef0" id="eventAudio"></audio> |
| | | <!-- 患者信息读取成功 --> |
| | | <audio src="https://dhcdn.leon056.com/hemo/autoselfsign/step2.mp3" ref="AudioRef" id="eventAudio"></audio> |
| | | <!-- 体重结果回传成功 --> |
| | | <audio src="https://dhcdn.leon056.com/hemo/autoselfsign/step3.mp3" ref="AudioRef2" id="eventAudio"></audio> |
| | | <!-- 血压结果回传成功 --> |
| | | <audio src="https://dhcdn.leon056.com/hemo/autoselfsign/step4.mp3" ref="AudioRef3" id="eventAudio"></audio> |
| | | <el-dialog |
| | | title="提示" |
| | | v-model="netLink" |
| | |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="datess"> |
| | | 60 |
| | | {{clockNum}} |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | shape="square" |
| | | :size="100" |
| | | fit="cover" |
| | | src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg" |
| | | :src="patientInfo.patientAvatarIcon" |
| | | /> |
| | | <div class="zsf">张三丰</div> |
| | | <div class="zsf">{{patientInfo.name}}</div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="lableText">当前时间:</div> |
| | |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="lableText">透析号:</div> |
| | | <div class="conText">123456</div> |
| | | <div class="conText">{{patientInfo.hemoCode}}</div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="lableText">机号:</div> |
| | | <div class="conText">001</div> |
| | | <div class="conText">{{patientInfo.deviceCode}}</div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="lableText">序号:</div> |
| | | <div class="conText">10</div> |
| | | <div class="conText">0</div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="lableText">干体重(kg):</div> |
| | | <div class="conText">88</div> |
| | | <div class="conText">{{patientInfo.pureWeight}}</div> |
| | | </div> |
| | | <div class="grid-item" > |
| | | <div> |
| | |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="lableText">目标脱水量:</div> |
| | | <div class="conText">2</div> |
| | | <div class="conText">{{aimTSL}}</div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <div class="lableText">血压:</div> |
| | | <div class="conText">140/90</div> |
| | | <div class="conText">{{gao_ya}}/{{di_ya}}</div> |
| | | </div> |
| | | </div> |
| | | </div> |