| 1 |
- if("undefined"==typeof Promise||Promise.prototype.finally||(Promise.prototype.finally=function(e){const t=this.constructor;return this.then((a=>t.resolve(e()).then((()=>a))),(a=>t.resolve(e()).then((()=>{throw a}))))}),"undefined"!=typeof uni&&uni&&uni.requireGlobal){const e=uni.requireGlobal();ArrayBuffer=e.ArrayBuffer,Int8Array=e.Int8Array,Uint8Array=e.Uint8Array,Uint8ClampedArray=e.Uint8ClampedArray,Int16Array=e.Int16Array,Uint16Array=e.Uint16Array,Int32Array=e.Int32Array,Uint32Array=e.Uint32Array,Float32Array=e.Float32Array,Float64Array=e.Float64Array,BigInt64Array=e.BigInt64Array,BigUint64Array=e.BigUint64Array}uni.restoreGlobal&&uni.restoreGlobal(Vue,weex,plus,setTimeout,clearTimeout,setInterval,clearInterval),function(e){"use strict";function t(e,t,...a){uni.__log__?uni.__log__(e,t,...a):console[e].apply(console,[...a,t])}const a=(e,t)=>{const a=e.__vccOpts||e;for(const[i,s]of t)a[i]=s;return a};const i=a({data:()=>({currentTime:"",hhmmss:"",whatDay:"",timeTimer:null,ws:null,reconnectTimer:null,heartbeatTimer:null,heartbeatTimeout:null,heartbeatInterval:3e4,heartbeatTimeoutTime:1e4,isPongReceived:!0,connectionStatus:"connecting",statusText:{observing:"留观中",completed:"留观完成,可离开",warning:"提前离开",hasleft:"已离开"},serverIp:"192.168.0.41",serverPort:"8811",allData:[],currentPage:1,pageSize:10,autoScroll:!0,autoScrollTimer:null,scrollInterval:6e3,windowHeight:0,touchStartX:0,touchStartTime:0,isTouching:!1,touchStartY:0,lastSwipeTime:0,linkShow:!1,ipArray:[],keyboardHeight:0,now:new Date,timer:null,heartbeatRate:0,isSend:!0,reconnectionNum:0}),computed:{connectionText(){const{connectionStatus:e,serverIp:t,serverPort:a}=this;return{connecting:`正在连接 ${t}:${a}...`,connected:`已连接到 ${t}:${a}`,disconnected:"连接已断开"}[e]},specialStatusData(){return this.allData.filter((e=>3===e.status||4===e.status||1==e.IsOut))},normalData(){return this.allData.filter((e=>0===e.status||1===e.status))},actualPageSize(){return Math.max(1,this.pageSize-1)},totalPages(){return this.actualPageSize<=0||0===this.normalData.length?1:Math.ceil(this.normalData.length/this.actualPageSize)},displayNormalData(){const e=(this.currentPage-1)*this.actualPageSize,t=Math.min(e+this.pageSize,this.normalData.length);return this.normalData.slice(e,t).map((e=>{const t=new Date(e.outTime)-this.now;if(t>0){const i=Math.floor(t%36e5/6e4),s=Math.floor(t%6e4/1e3);var a="";return a=i?`剩余${i}分钟`:`剩余${s}秒`,{...e,remainingTime:a}}return{...e,remainingTime:"留观完成,可离开"}}))}},mounted(){this.reconnectionNum=0,this.timer=setInterval((()=>{this.now=new Date}),1e3),this.getIpAddress(),this.initPage();const e=uni.getStorageSync("serverIp"),t=uni.getStorageSync("serverPort");e&&t&&(this.serverIp=e,this.serverPort=t),this.updateCurrentTime(),this.timeTimer=setInterval((()=>{this.updateCurrentTime()}),1e3)},beforeDestroy(){this.timer&&(this.timer=null,clearInterval(this.timer)),this.stopAutoScroll(),uni.offWindowResize(this.handleWindowResize),this.ws&&this.ws.close(),this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.stopHeartbeat(),this.timeTimer&&clearInterval(this.timeTimer)},methods:{keyboardheightchange(){uni.onKeyboardHeightChange((e=>{this.keyboardHeight=e.height}))},findFirstWebSocketIp(e,a=0,i,s){if(a>=e.length)return void("function"==typeof s&&s());const n=e[a].trim(),r=this.serverPort,o=`ws://${n}:${r}/`;this.ws&&(this.ws.close(),this.ws=null),this.ws=uni.connectSocket({url:o,success:e=>{t("log","at pages/index/home.vue:299","connectSocket success",e)},fail:r=>{t("error","at pages/index/home.vue:302","connectSocket 失败",r),this.connectionStatus="disconnected",this.serverIp==n&&(this.heartbeatRate=0,this.reconnectionNum++),this.reconnectionNum++,this.isSend=!0,this.heartbeatRate=0,this.findFirstWebSocketIp(e,a+1,i,s)}}),this.ws.onOpen((e=>{this.serverIp=n,uni.setStorageSync("serverIp",this.serverIp),uni.setStorageSync("serverPort",this.serverPort),this.connectionStatus="connected",this.ws.send({data:"link"}),i(n),this.startHeartbeat(),uni.hideLoading()})),this.ws.onMessage((e=>{if("PONG"===e.data||'{"type":"PONG"}'===e.data)return uni.hideToast(),this.isSend=!0,this.reconnectionNum=0,this.heartbeatRate=0,this.isPongReceived=!0,void(this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=null));try{const t=JSON.parse(e.data);this.handleMessage(t)}catch(a){t("warn","at pages/index/home.vue:356","非 JSON 消息,已忽略",e.data)}})),this.ws.onClose((n=>{t("log","at pages/index/home.vue:360","WebSocket 连接关闭",n),this.connectionStatus="disconnected",this.stopHeartbeat();var r=setTimeout((()=>{clearTimeout(r),this.serverIp,this.isSend=!0,this.heartbeatRate=0,this.reconnectionNum++,this.findFirstWebSocketIp(e,a+1,i,s)}),2e3)})),this.ws.onError((n=>{t("error","at pages/index/home.vue:382","WebSocket 错误",n),this.connectionStatus="disconnected",this.isSend=!0,this.heartbeatRate=0,this.reconnectionNum++,this.findFirstWebSocketIp(e,a+1,i,s)}))},linkSet(){this.linkShow=!0},getClose(){this.linkShow=!1},getIpAddress(){var e;(e="Alikes-NetTools-DeviceFinder",weex.requireModule(e)).scan({},(e=>{this.ipArray=e,this.ipArray.unshift(this.serverIp),this.startCheck()}))},startCheck(){var e;e=this.ipArray,this.findFirstWebSocketIp(e,0,(e=>{this.onDeviceFound(e),this.linkShow=!1}),(()=>{this.onNoDevice()}))},onDeviceFound(e){uni.showToast({title:"连接成功",icon:"success"})},onNoDevice(){uni.showToast({title:"无设备响应",icon:"none",duration:3e3}),this.getIpAddress()},getClass(e){var t="";return 0==e?t="observing":1==e?t="completed":3==e?t="warning":4==e&&(t="hasleft"),t},getStatusText(e){return 0==e.status?e.remainingTime:1==e.status?this.statusText.completed:3==e.status?this.statusText.warning:4==e.status?this.statusText.hasleft:void 0},initPage(){this.calculatePageSize(),this.handleWindowResize=this.debounce(this.calculatePageSize,300),uni.onWindowResize(this.handleWindowResize)},calculatePageSize(){try{const e=uni.getSystemInfoSync();this.windowHeight=e.windowHeight;const t=uni.upx2px(130),a=uni.upx2px(100),i=uni.upx2px(120),s=this.specialStatusData.length>0?uni.upx2px(80*this.specialStatusData.length):0,n=uni.upx2px(0),r=this.windowHeight-t-a-i-s-n,o=uni.upx2px(140),l=Math.floor(r/o);this.pageSize=Math.max(4,Math.min(30,l)),this.validateCurrentPage()}catch(e){t("error","at pages/index/home.vue:517","计算页面大小失败:",e),this.pageSize=10}},debounce(e,t){let a;return function(...i){clearTimeout(a),a=setTimeout((()=>{clearTimeout(a),e(...i)}),t)}},validateCurrentPage(){this.currentPage>this.totalPages&&this.totalPages>0&&(this.currentPage=this.totalPages),this.currentPage<1&&(this.currentPage=1)},getWebSocketUrl(){return`ws://${this.serverIp}:${this.serverPort}`},onIpInput(e){this.serverIp=e.detail.value},onPortInput(e){this.serverPort=e.detail.value},handleReconnect(){uni.showLoading({title:"正在重连..."}),this.linkShow=!1,this.connectionStatus="connecting",this.ws?this.ws.close({success:()=>{this.getIpAddress()},fail:()=>{this.getIpAddress()}}):this.getIpAddress(),setTimeout((()=>{uni.hideLoading()}),2e3)},handleMessage(e){if("link"!=e.action)if("object"==typeof e&&null!==e){const a=e.action;if(!a)return void t("warn","at pages/index/home.vue:605","消息缺少 action 字段",e);switch(a){case"add":case"create":this.batchAdd(e.data);break;case"update":this.batchUpdate(e.data);break;case"remove":case"delete":this.batchRemove(e.data);break;default:t("warn","at pages/index/home.vue:621","未知操作类型:",a)}}else t("warn","at pages/index/home.vue:624","收到未知格式消息:",e);else this.updateListWithArray(e.data)},batchAdd(e){if(!e)return;const a=(Array.isArray(e)?e:[e]).filter((e=>e&&void 0!==e.id));if(0===a.length)return void t("warn","at pages/index/home.vue:633","没有有效数据用于新增",e);const i=[...this.allData];a.forEach((e=>{const t=i.findIndex((t=>t.id==e.id));t>-1?i[t]={...i[t],...e}:i.unshift(e)})),this.allData=i},batchUpdate(e){if(!e)return;const t=Array.isArray(e)?e:[e],a=[...this.allData];t.forEach((e=>{if(!e||void 0===e.id)return;const t=a.findIndex((t=>t.id==e.id));t>-1&&(a[t]={...a[t],...e})})),this.allData=a},batchRemove(e){let a=[];if(Array.isArray(e.id))a=e.id;else if(void 0!==e.id)a=[e.id];else{if(!Array.isArray(e.data))return a=[e.id],void t("warn","at pages/index/home.vue:684","无法解析删除指令",e);a=e.data.map((e=>e.id)).filter((e=>void 0!==e))}if(0===a.length)return;const i=this.allData.filter((e=>!a.includes(e.id)));this.allData=i},updateListWithArray(e){if(this.allData=[],!Array.isArray(e))return;const t=new Map;e.forEach((e=>{void 0!==e.id&&t.set(e.id,e)}));const a=[...this.allData];for(const[s,n]of t.entries()){const e=a.findIndex((e=>e.id==s));e>-1?a[e]=n:a.push(n)}const i=a.filter((e=>t.has(e.id)));this.allData=i},reconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout((()=>{this.connectWebSocket(),this.reconnectTimer=null}),3e3))},startHeartbeat(){var e=this;e.stopHeartbeat(),e.heartbeatTimer=setInterval((()=>{if(e.ws&&"connected"===e.connectionStatus){if(!e.isSend&&!e.isPongReceived&&(e.heartbeatRate++,t("warn","at pages/index/home.vue:733",e.heartbeatRate,"上一次心跳未收到 pong,可能已断线新"),e.heartbeatRate>=3))return void e.ws.close();e.isPongReceived=!1,e.heartbeatTimeout=setTimeout((()=>{e.isSend&&!e.isPongReceived&&(t("warn","at pages/index/home.vue:744","⚠️ 心跳超时:未在规定时间内收到 pong,即将重连"),uni.showToast({title:"连接异常,正在重连...",icon:"none",duration:2e3}),e.ws.close())}),e.heartbeatTimeoutTime),e.isSend&&e.ws.send({data:"PING",success:()=>{e.isSend=!1},fail:a=>{t("error","at pages/index/home.vue:761","ping 发送失败",a),e.ws.close()}})}}),e.heartbeatInterval)},stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=null)},formatTime(e){const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`},prevPage(){this.currentPage>1&&(this.currentPage--,this.resetAutoScroll())},nextPage(){this.currentPage<this.totalPages&&(this.currentPage++,this.resetAutoScroll())},handleTouchStart(e){this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.touchStartTime=Date.now(),this.isTouching=!0,this.autoScroll&&this.stopAutoScroll()},handleTouchMove(e){this.isTouching},handleTouchEnd(e){if(!this.isTouching)return;const t=e.changedTouches[0].clientX,a=e.changedTouches[0].clientY,i=Date.now(),s=t-this.touchStartX,n=a-this.touchStartY,r=i-this.touchStartTime,o=Date.now();if(o-this.lastSwipeTime<300)return void(this.isTouching=!1);const l=Math.abs(s),c=Math.abs(n);l>50&&l>c&&r<500?(this.lastSwipeTime=o,s>0?this.prevPage():this.nextPage()):c>50&&c>l&&r<500&&(this.lastSwipeTime=o,n>0?this.prevPage():this.nextPage()),this.isTouching=!1,this.autoScroll&&this.resetAutoScroll()},toggleAutoScroll(e){this.autoScroll=e.detail.value,this.autoScroll?this.startAutoScroll():this.stopAutoScroll()},startAutoScroll(){this.stopAutoScroll(),this.autoScroll&&this.normalData.length>0&&this.totalPages>1&&(this.autoScrollTimer=setInterval((()=>{this.currentPage<this.totalPages?this.currentPage++:this.currentPage=1}),this.scrollInterval))},stopAutoScroll(){this.autoScrollTimer&&(clearInterval(this.autoScrollTimer),this.autoScrollTimer=null)},resetAutoScroll(){this.autoScroll&&(this.stopAutoScroll(),setTimeout((()=>{this.startAutoScroll()}),this.scrollInterval))},updateCurrentTime(){const e=new Date,t=e.getFullYear(),a=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),s=String(e.getHours()).padStart(2,"0"),n=String(e.getMinutes()).padStart(2,"0"),r=String(e.getSeconds()).padStart(2,"0");this.currentTime=`${t}-${a}-${i}`,this.hhmmss=`${s}:${n}:${r}`;const o=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"][e.getDay()];this.whatDay=o}},watch:{allData:{handler(){this.$nextTick((()=>{this.validateCurrentPage(),this.autoScroll&&this.startAutoScroll()}))},immediate:!0},pageSize(){this.validateCurrentPage()},specialStatusData(){this.$nextTick((()=>{this.calculatePageSize()}))},reconnectionNum:{handler(e,t){e>=50&&(plus.runtime.restart(),setTimeout((()=>{plus.navigator.closeSplashscreen()}),3e3),this.reconnectionNum=0)},deep:!0,immediate:!0}}},[["render",function(t,a,i,s,n,r){return e.openBlock(),e.createElementBlock("view",{class:"notice-board"},[e.createElementVNode("view",{class:"board-header"},[e.createElementVNode("view",{class:"card_logo",onClick:a[0]||(a[0]=(...e)=>r.linkSet&&r.linkSet(...e))},[e.createElementVNode("image",{class:"logo_image",src:"/static/logo.png",mode:""}),e.createElementVNode("view",{class:"logo_title"},"观山湖区疾控中心")]),e.createElementVNode("view",{class:"card_yellow"},[e.createElementVNode("view",{class:"card_board"},[e.createElementVNode("text",{class:"board-title"},"接种留观等待")])]),e.createElementVNode("view",{class:"card_time"},[e.createElementVNode("view",{class:"time_title"},e.toDisplayString(n.hhmmss),1),e.createElementVNode("view",{class:"current-time"},e.toDisplayString(n.currentTime)+" "+e.toDisplayString(n.whatDay),1)])]),e.createElementVNode("view",{class:"table-container"},[e.createElementVNode("view",{class:"table-header"},[e.createElementVNode("view",{class:"table-row header-row"},[e.createElementVNode("view",{class:"cell name title_color"},"姓名"),e.createElementVNode("view",{class:"cell time title_color"},"留观时间"),e.createElementVNode("view",{class:"cell time title_color"},"离开时间"),e.createElementVNode("view",{class:"cell status title_color"},"状态")])]),r.specialStatusData.length>0?(e.openBlock(),e.createElementBlock("view",{key:0,class:"special-status-container"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.specialStatusData,((t,a)=>(e.openBlock(),e.createElementBlock("view",{class:e.normalizeClass(["table-row",`item-${r.getClass(t.status)}`]),key:t.id},[e.createElementVNode("view",{class:e.normalizeClass(["table-cell name",`title-${r.getClass(t.status)}`])},e.toDisplayString(t.patientName),3),e.createElementVNode("view",{class:"table-cell time"},e.toDisplayString(r.formatTime(t.createTime)),1),e.createElementVNode("view",{class:"table-cell time"},e.toDisplayString(r.formatTime(t.outTime)),1),e.createElementVNode("view",{class:"table-cell status"},[e.createElementVNode("view",{class:e.normalizeClass(["status-tag",`status-${r.getClass(t.status)}`])},e.toDisplayString(r.getStatusText(t)),3)])],2)))),128)),e.createElementVNode("view",{class:"divider"})])):e.createCommentVNode("",!0),e.createElementVNode("view",{class:"table-body",onTouchstart:a[1]||(a[1]=(...e)=>r.handleTouchStart&&r.handleTouchStart(...e)),onTouchmove:a[2]||(a[2]=(...e)=>r.handleTouchMove&&r.handleTouchMove(...e)),onTouchend:a[3]||(a[3]=(...e)=>r.handleTouchEnd&&r.handleTouchEnd(...e))},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.displayNormalData,((t,a)=>(e.openBlock(),e.createElementBlock("view",{class:e.normalizeClass(["table-row",`item-${r.getClass(t.status)}`]),key:t.id},[e.createElementVNode("view",{class:e.normalizeClass(["table-cell name",`title-${r.getClass(t.status)}`])},e.toDisplayString(t.patientName),3),e.createElementVNode("view",{class:"table-cell time"},e.toDisplayString(r.formatTime(t.createTime)),1),e.createElementVNode("view",{class:"table-cell time"},e.toDisplayString(r.formatTime(t.outTime)),1),e.createElementVNode("view",{class:"table-cell status"},[e.createElementVNode("view",{class:e.normalizeClass(["status-tag",`status-${r.getClass(t.status)}`])},e.toDisplayString(r.getStatusText(t)),3)])],2)))),128)),0===r.displayNormalData.length&&0===r.specialStatusData.length?(e.openBlock(),e.createElementBlock("view",{key:0,class:"empty-tip"}," 暂无留观人员信息 ")):e.createCommentVNode("",!0)],32)]),e.createElementVNode("view",{class:"card_foot"},[e.createElementVNode("view",{class:"card_tips_box"},[e.createElementVNode("image",{class:"tips_imageil",src:"/static/horn.png",mode:""}),e.createElementVNode("view",{class:"title_tips"},"温馨提示:")]),e.createElementVNode("view",{class:"title_tips_foot"},"请注意留观30分钟后无不良反应后再离开,谢谢。")]),n.linkShow?(e.openBlock(),e.createElementBlock("view",{key:0,class:"box_link_set"},[e.createElementVNode("view",{class:"box_popup",style:e.normalizeStyle({bottom:n.keyboardHeight+"px"})},[e.createElementVNode("view",{class:"head_popup_title"},[e.createElementVNode("view",{class:"title_head_popup"},"连接设置"),e.createElementVNode("view",{class:"close_title",onClick:a[4]||(a[4]=(...e)=>r.getClose&&r.getClose(...e))},"×")]),e.createElementVNode("view",{class:e.normalizeClass(["status-bar-bottom",`status-${n.connectionStatus}`])},[e.createElementVNode("view",{class:"ip-input-group"},[e.createElementVNode("text",{class:"ip-label"},"IP:"),e.createElementVNode("input",{type:"text",value:n.serverIp,onInput:a[5]||(a[5]=(...e)=>r.onIpInput&&r.onIpInput(...e)),placeholder:"192.168.0.41",class:"ip-input",onKeyboardheightchange:a[6]||(a[6]=(...e)=>r.keyboardheightchange&&r.keyboardheightchange(...e))},null,40,["value"]),e.createElementVNode("text",{class:"colon"},":"),e.createElementVNode("input",{type:"number",value:n.serverPort,onInput:a[7]||(a[7]=(...e)=>r.onPortInput&&r.onPortInput(...e)),placeholder:"8811",class:"port-input",onKeyboardheightchange:a[8]||(a[8]=(...e)=>r.keyboardheightchange&&r.keyboardheightchange(...e))},null,40,["value"]),e.createElementVNode("button",{class:"btn-reconnect",size:"mini",onClick:a[9]||(a[9]=(...e)=>r.handleReconnect&&r.handleReconnect(...e))}," 更新并重连 ")]),e.createElementVNode("view",{class:"status-text-box"},[e.createElementVNode("text",{class:e.normalizeClass(["dot",`dot-${n.connectionStatus}`])},"●",2),e.createElementVNode("text",{class:"status-text"},e.toDisplayString(r.connectionText),1)])],2)],4)])):e.createCommentVNode("",!0)])}],["__scopeId","data-v-91c2a532"]]);const s=a({data:()=>({currentTime:"",timeTimer:null,ws:null,reconnectTimer:null,heartbeatTimer:null,heartbeatTimeout:null,heartbeatInterval:3e4,heartbeatTimeoutTime:1e4,isPongReceived:!0,connectionStatus:"connecting",list:[],statusText:{observing:"留观中",completed:"留观完成,可离开",warning:"提前离开",hasleft:"已离开"},serverIp:"192.168.11.132",serverPort:"8811"}),computed:{connectionText(){const{connectionStatus:e,serverIp:t,serverPort:a}=this;return{connecting:`正在连接 ${t}:${a}...`,connected:`已连接到 ${t}:${a}`,disconnected:"连接已断开"}[e]},carouselList(){return 0===this.list.length?[]:this.list.length<=5?this.list:[...this.list,...this.list]},shouldAnimate(){return this.list.length>5}},methods:{getClass(e){var t="";return 0==e?t="observing":1==e?t="completed":3==e?t="warning":4==e&&(t="completed"),t},getStatusText(e){var t="";return 0==e?t=this.statusText.observing:1==e?t=this.statusText.completed:3==e?t=this.statusText.warning:4==e&&(t=this.statusText.hasleft),t},getTime(e){const t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`},formatTimeRange:(e,t)=>e&&t?`${e} - ${t}`:"--",onIpInput(e){this.serverIp=e.detail.value},onPortInput(e){this.serverPort=e.detail.value},getWebSocketUrl(){return`ws://${this.serverIp}:${this.serverPort}`},handleReconnect(){uni.showLoading({title:"正在重连..."}),this.connectionStatus="connecting",this.ws?this.ws.close({success:()=>{t("log","at pages/index/index.vue:180","旧连接已关闭"),this.connectWebSocket("link")},fail:()=>{this.connectWebSocket("link")}}):this.connectWebSocket("link"),setTimeout((()=>{uni.hideLoading()}),2e3)},connectWebSocket(e){const a=this.getWebSocketUrl();this.ws=uni.connectSocket({url:a,success:e=>{t("log","at pages/index/index.vue:201","connectSocket success",e)},fail:e=>{t("error","at pages/index/index.vue:204","connectSocket 失败",e),this.connectionStatus="disconnected",this.reconnect()}}),this.ws.onOpen((t=>{this.connectionStatus="connected",this.ws.send({data:e}),this.startHeartbeat(),uni.hideLoading()})),this.ws.onMessage((e=>{if("PONG"===e.data||'{"type":"PONG"}'===e.data)return this.isPongReceived=!0,void(this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=null));try{const t=JSON.parse(e.data);this.handleMessage(t)}catch(a){t("warn","at pages/index/index.vue:237","非 JSON 消息,已忽略",e.data)}})),this.ws.onClose((e=>{t("log","at pages/index/index.vue:241","WebSocket 连接关闭",e),this.connectionStatus="disconnected",this.stopHeartbeat(),this.reconnect()})),this.ws.onError((e=>{t("error","at pages/index/index.vue:247","WebSocket 错误",e),this.connectionStatus="disconnected"}))},handleMessage(e){if("link"!=e.action)if("object"==typeof e&&null!==e){const a=e.action;if(!a)return void t("warn","at pages/index/index.vue:263","消息缺少 action 字段",e);switch(a){case"add":case"create":this.batchAdd(e.data);break;case"update":this.batchUpdate(e.data);break;case"remove":case"delete":this.batchRemove(e.data);break;default:t("warn","at pages/index/index.vue:279","未知操作类型:",a)}}else t("warn","at pages/index/index.vue:282","收到未知格式消息:",e);else this.updateListWithArray(e.data)},batchAdd(e){if(!e)return;const a=(Array.isArray(e)?e:[e]).filter((e=>e&&void 0!==e.id));if(0===a.length)return void t("warn","at pages/index/index.vue:291","没有有效数据用于新增",e);const i=[...this.list];a.forEach((e=>{const t=i.findIndex((t=>t.id==e.id));t>-1?i[t]={...i[t],...e}:i.unshift(e)})),this.list=i},batchUpdate(e){if(!e)return;const t=Array.isArray(e)?e:[e],a=[...this.list];t.forEach((e=>{if(!e||void 0===e.id)return;const t=a.findIndex((t=>t.id==e.id));t>-1&&(a[t]={...a[t],...e})})),this.list=a},batchRemove(e){let a=[];if(Array.isArray(e.id))a=e.id;else if(void 0!==e.id)a=[e.id];else{if(!Array.isArray(e.data))return a=[e.id],void t("warn","at pages/index/index.vue:342","无法解析删除指令",e);a=e.data.map((e=>e.id)).filter((e=>void 0!==e))}if(0===a.length)return;const i=this.list.filter((e=>!a.includes(e.id)));this.list=i},updateListWithArray(e){if(!Array.isArray(e))return;const t=new Map;e.forEach((e=>{void 0!==e.id&&t.set(e.id,e)}));const a=[...this.list];for(const[s,n]of t.entries()){const e=a.findIndex((e=>e.id==s));e>-1?a[e]=n:a.push(n)}const i=a.filter((e=>t.has(e.id)));this.list=i},reconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout((()=>{t("log","at pages/index/index.vue:377","正在尝试重新连接..."),this.connectWebSocket("link"),this.reconnectTimer=null}),3e3))},startHeartbeat(){t("log","at pages/index/index.vue:384",2324),this.stopHeartbeat(),this.heartbeatTimer=setInterval((()=>{if(this.ws&&"connected"===this.connectionStatus){if(!this.isPongReceived)return t("warn","at pages/index/index.vue:392","上一次心跳未收到 pong,可能已断线"),void this.ws.close();this.isPongReceived=!1,this.heartbeatTimeout=setTimeout((()=>{this.isPongReceived||(t("warn","at pages/index/index.vue:401","⚠️ 心跳超时:未在规定时间内收到 pong,即将重连"),uni.showToast({title:"连接异常,正在重连...",icon:"none",duration:2e3}),this.ws.close())}),this.heartbeatTimeoutTime);try{this.ws.send({data:"PING",success:()=>{},fail:e=>{t("error","at pages/index/index.vue:417","ping 发送失败",e),this.ws.close()}})}catch(e){t("error","at pages/index/index.vue:422","发送 ping 异常",e),this.ws.close()}}}),this.heartbeatInterval)},stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.heartbeatTimeout&&(clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=null)},updateCurrentTime(){const e=new Date,t=e.getFullYear(),a=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),s=String(e.getHours()).padStart(2,"0"),n=String(e.getMinutes()).padStart(2,"0"),r=String(e.getSeconds()).padStart(2,"0");this.currentTime=`${t}-${a}-${i} ${s}:${n}:${r}`},goback(){uni.navigateTo({url:"/pages/index/home"})}},mounted(){this.connectWebSocket("link"),this.updateCurrentTime(),this.timeTimer=setInterval((()=>{this.updateCurrentTime()}),1e3)},beforeDestroy(){this.ws&&this.ws.close(),this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.stopHeartbeat(),this.timeTimer&&clearInterval(this.timeTimer)}},[["render",function(t,a,i,s,n,r){return e.openBlock(),e.createElementBlock("view",{class:"container"},[e.createElementVNode("view",{class:"header"},[e.createElementVNode("text",{class:"title"},"接种留观人员信息表"),e.createElementVNode("text",{class:"current-time"},e.toDisplayString(n.currentTime),1)]),e.createElementVNode("view",{class:"table-container"},[e.createElementVNode("view",{class:"table-header"},[e.createElementVNode("view",{class:"table-row header-row"},[e.createElementVNode("view",{class:"cell name title_color"},"姓名"),e.createElementVNode("view",{class:"cell time title_color"},"留观时间"),e.createElementVNode("view",{class:"cell time title_color"},"离开时间"),e.createElementVNode("view",{class:"cell status title_color"},"状态")])]),e.createElementVNode("view",{class:"table-body-container"},[e.createElementVNode("view",{class:e.normalizeClass(["table-body-wrapper",{animate:r.shouldAnimate}])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.carouselList,((t,a)=>(e.openBlock(),e.createElementBlock("view",{key:a,class:e.normalizeClass(["table-row body-row",`item-${r.getClass(t.status)}`])},[e.createElementVNode("view",{class:"cell name"},e.toDisplayString(t.patientName),1),e.createElementVNode("view",{class:"cell time"},e.toDisplayString(r.getTime(t.createTime)),1),e.createElementVNode("view",{class:"cell time"},e.toDisplayString(r.getTime(t.outTime)),1),e.createElementVNode("view",{class:"cell status"},[e.createElementVNode("text",{class:e.normalizeClass(["status-tag",`status-${r.getClass(t.status)}`])},e.toDisplayString(r.getStatusText(t.status)),3)])],2)))),128))],2)])]),e.createElementVNode("view",{class:e.normalizeClass(["status-bar-bottom",`status-${n.connectionStatus}`])},[e.createElementVNode("view",{class:"status-text-box"},[e.createElementVNode("text",{class:e.normalizeClass(["dot",`dot-${n.connectionStatus}`])},"●",2),e.createElementVNode("text",{class:"status-text"},e.toDisplayString(r.connectionText),1)]),e.createElementVNode("view",{class:"ip-input-group"},[e.createElementVNode("text",{class:"ip-label"},"IP:"),e.createElementVNode("input",{type:"text",value:n.serverIp,onInput:a[0]||(a[0]=(...e)=>r.onIpInput&&r.onIpInput(...e)),placeholder:"192.168.0.41",class:"ip-input"},null,40,["value"]),e.createElementVNode("text",{class:"colon"},":"),e.createElementVNode("input",{type:"number",value:n.serverPort,onInput:a[1]||(a[1]=(...e)=>r.onPortInput&&r.onPortInput(...e)),placeholder:"8811",class:"port-input"},null,40,["value"]),e.createElementVNode("button",{class:"btn-reconnect",size:"mini",onClick:a[2]||(a[2]=(...e)=>r.handleReconnect&&r.handleReconnect(...e))}," 更新并重连 "),e.createElementVNode("button",{class:"btn-reconnect",size:"mini",onClick:a[3]||(a[3]=(...e)=>r.goback&&r.goback(...e))}," 测试 ")])],2)])}],["__scopeId","data-v-cac2fd6c"]]);const n=a({data:()=>({serverIp:uni.getStorageSync("serverIp")||"",scanning:!1}),methods:{async scan(){if(this.scanning)return;this.scanning=!0;const e=await this.scanNetwork();e?(this.serverIp=e,uni.showToast({title:"发现: "+e})):uni.showToast({icon:"none",title:"未发现"}),this.scanning=!1},async scanNetwork(){const e=uni.getStorageSync("serverIp");if(e&&await this.testIp(e))return e;const t=this.getNetworkPrefix();for(let a=1;a<=50;a++){const e=`${t}${a}`;if(await this.testIp(e))return e;await this.delay(100)}return null},testIp:e=>new Promise((t=>{uni.request({url:`http://${e}:8811/ping`,timeout:3e3,success:a=>{t(200===a.statusCode?e:null)},fail:()=>t(null)})})),getNetworkPrefix(){let e="192.168.1.";if("undefined"!=typeof plus&&plus.networkinfo){const t=plus.networkinfo.getIPAddress();t&&(e=t.replace(/\.\d+$/,".")+".")}return e},delay:e=>new Promise((t=>setTimeout(t,e))),connect(){this.serverIp?(uni.setStorageSync("serverIp",this.serverIp),uni.connectSocket({url:`ws://${this.serverIp}:8811`}),uni.onSocketOpen((()=>{}))):uni.showToast({icon:"none",title:"请先设置IP"})}}},[["render",function(t,a,i,s,n,r){return e.openBlock(),e.createElementBlock("view",{class:"container"},[e.createElementVNode("text",null,"服务端IP:"),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":a[0]||(a[0]=e=>n.serverIp=e),placeholder:"192.168.1.100"},null,512),[[e.vModelText,n.serverIp]]),e.createElementVNode("button",{onClick:a[1]||(a[1]=(...e)=>r.scan&&r.scan(...e))},"🔍 自动扫描"),e.createElementVNode("button",{onClick:a[2]||(a[2]=(...e)=>r.connect&&r.connect(...e))},"🚀 连接"),n.scanning?(e.openBlock(),e.createElementBlock("text",{key:0},"扫描中...")):e.createCommentVNode("",!0)])}]]);__definePage("pages/index/home",i),__definePage("pages/index/index",s),__definePage("pages/index/mine",n);const r={mounted(){plus.screen.lockOrientation("landscape-primary")},onLaunch:function(){t("log","at App.vue:11","App Launch"),plus.screen.lockOrientation("landscape-primary")},onShow:function(){t("log","at App.vue:18","App Show")},onHide:function(){t("log","at App.vue:21","App Hide")}};const{app:o,Vuex:l,Pinia:c}={app:e.createVueApp(r)};uni.Vuex=l,uni.Pinia=c,o.provide("__globalStyles",__uniConfig.styles),o._component.mpType="app",o._component.render=()=>{},o.mount("#app")}(Vue);
|