From 4f3a8bb3ecef491b8769444cf776caf73e9e5b01 Mon Sep 17 00:00:00 2001 From: liub Date: Thu, 9 Oct 2025 14:34:22 +0800 Subject: [PATCH] =?UTF-8?q?670=E4=BA=BA=E5=91=98=E7=99=BB=E8=AE=B0?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E8=93=9D=E7=89=99=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E8=B5=B0=E5=90=8E=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 2 +- pages/650/HBY650.vue | 16 ++-- pages/670/HBY670.vue | 44 +++++---- pages/7305/BJQ7305.vue | 18 ++-- pages/common/addBLE/addEquip.vue | 142 +++++++++++++++++++---------- static/images/670/jieN.png | Bin 1339 -> 1528 bytes static/images/670/jieNActive.png | Bin 1873 -> 2042 bytes static/images/670/qiang.png | Bin 2064 -> 2095 bytes static/images/670/qiangActive.png | Bin 3127 -> 2673 bytes static/images/670/ruo.png | Bin 1684 -> 1833 bytes static/images/670/ruoActive.png | Bin 2662 -> 2348 bytes static/images/BLEAdd/bluetooth.png | Bin 0 -> 3335 bytes utils/BleHelper.js | 54 +++++++++-- utils/update.js | 95 +++++++++++-------- utils/wgs84_to_gcj02.js | 122 +++++++++++++++++++++++++ 15 files changed, 360 insertions(+), 133 deletions(-) create mode 100644 static/images/BLEAdd/bluetooth.png create mode 100644 utils/wgs84_to_gcj02.js diff --git a/manifest.json b/manifest.json index 7fe5bd7..5e1e02f 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "name" : "星汉物联", "appid" : "__UNI__A21EF43", "description" : "设备管控", - "versionName" : "1.0.2", + "versionName" : "1.0.3", "versionCode" : "100", "transformPx" : false, /* 5+App特有相关 */ diff --git a/pages/650/HBY650.vue b/pages/650/HBY650.vue index ec02911..9d82461 100644 --- a/pages/650/HBY650.vue +++ b/pages/650/HBY650.vue @@ -1246,14 +1246,14 @@ these.setBleFormData(); - let json = { - deviceId: these.device.id, - name: these.formData.company, - position: these.formData.name, - unitName: these.formData.job, - code: these.formData.id - }; - usrApi.sendUsr(json) + // let json = { + // deviceId: these.device.id, + // name: these.formData.company, + // position: these.formData.name, + // unitName: these.formData.job, + // code: these.formData.id + // }; + // usrApi.sendUsr(json) return; } diff --git a/pages/670/HBY670.vue b/pages/670/HBY670.vue index ec4f0e6..8bb9956 100644 --- a/pages/670/HBY670.vue +++ b/pages/670/HBY670.vue @@ -282,7 +282,7 @@ request, baseURL } from '../../utils/request'; - + import lnglatConvert from '@/utils/wgs84_to_gcj02.js' const pagePath = "pages/670/HBY670"; var ble = null; @@ -369,6 +369,7 @@ showClose: false }, usrToggle: true, + bleLinkCnt:0 }, formData: { battary: "", //电量 @@ -380,9 +381,9 @@ modeCurr: "", //档位 SOS: "", //sos lightCurr: "qiang", //照明模式 - company: "", //单位 - usrname: "", //姓名 - job: "", //职位 + company: "湖北消防总队", //单位 + usrname: "胡红军", //姓名 + job: "中队长", //职位 usrid: "", //id msgTxt: "", //消息1 qzwarn: false, //是否强制报警 @@ -469,6 +470,7 @@ var device = data.data; these.Status.apiType = data.apiType; these.device = device; + these.formData.usrid = device.deviceImei; if (data.apiType !== 'listA') { Common.getdeviceShareId(data.data.id).then(res => { if (res.code == 200) { @@ -523,7 +525,10 @@ }, methods: { showBleUnConnect() { - + this.Status.bleLinkCnt++; + if(this.Status.bleLinkCnt>3){ + return; + } this.showPop({ message: "蓝牙未连接过该设备,请使用蓝牙重新添加该设备", iconUrl: "/static/images/6155/DeviceDetail/uploadErr.png", @@ -557,8 +562,9 @@ }); }, gotoMap() { - this.detailData.longitude = this.formData.Lon; - this.detailData.latitude = this.formData.Lat; + let lnglat=lnglatConvert.wgs84_to_gcj02(this.formData.Lon,this.formData.Lat); + this.detailData.longitude = lnglat[0]; + this.detailData.latitude = lnglat[1]; uni.navigateTo({ url: '/pages/common/map/index', events: { @@ -2196,14 +2202,14 @@ hideLoading(these); - let json = { - deviceId: these.device.id, - name: these.formData.company, - position: these.formData.usrname, - unitName: these.formData.job, - code: these.formData.usrid - }; - api.sendUsr(json) + // let json = { + // deviceId: these.device.id, + // name: these.formData.company, + // position: these.formData.usrname, + // unitName: these.formData.job, + // code: these.formData.usrid + // }; + // api.sendUsr(json) return; } @@ -2221,7 +2227,7 @@ let s = (text.length * 2).toString(16); let len = String(s).padStart(4, '0') len = len.match(/.{1,2}/g); - + // 填充头部 dataView.setUint8(0, 0x55); // 帧头 dataView.setUint8(1, 0x03); // 帧类型:文字 @@ -2251,10 +2257,10 @@ // 发送下一个包 currentPacket++; - setTimeout(sendNextPacket, 0); + setTimeout(sendNextPacket, 2000); }).catch(err => { if (err.code == '10007') { - setTimeout(sendNextPacket, 0); + setTimeout(sendNextPacket,2000); } else { requestSend(); } @@ -2276,7 +2282,7 @@ these.HoldYouHand("word transmit start", 120, f.deviceId, f.writeServiceId, f .wirteCharactId).then( () => { - setTimeout(sendText, 200); + setTimeout(sendText, 2000); }).catch((ex) => { requestSend(); // console.log("握手没有成功", ex); diff --git a/pages/7305/BJQ7305.vue b/pages/7305/BJQ7305.vue index c91f7de..6f8c24c 100644 --- a/pages/7305/BJQ7305.vue +++ b/pages/7305/BJQ7305.vue @@ -67,7 +67,7 @@ 泛光模式 --> - + @@ -611,7 +611,7 @@ let clength = 0; for (let j = 0; j < item.length; j++) { const element = item[j]; - console.log("第" + i + "包,第" + j + "小包,长度:" + element.length) + // console.log("第" + i + "包,第" + j + "小包,长度:" + element.length) length += element.length; clength += element.length; @@ -714,7 +714,7 @@ //发送数据包 ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, - 30) + 1000) .then(() => { let curr = childPacket + (currentPacket - 1) * @@ -732,10 +732,10 @@ childPacket++; } - setTimeout(sendNextPacket, 100); + setTimeout(sendNextPacket, 1000); }).catch(err => { if (err.code == 10007) { - setTimeout(sendNextPacket, 100); + setTimeout(sendNextPacket, 1000); return; } @@ -927,7 +927,7 @@ text: "请稍候..." }); - ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 30).then(() => { + ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 100).then(() => { this.formData.mode = mode; this.setBleFormData(); }).catch((ex) => { @@ -1091,7 +1091,7 @@ let inteval = parseInt(this.inteval ? this.inteval : 50); console.log("inteval=", inteval) ble.sendData(f.deviceId, buffer, f.writeServiceId, f - .wirteCharactId, 30).then(() => { + .wirteCharactId, 100).then(() => { curr++; setTimeout(sendNext, inteval); @@ -1259,7 +1259,7 @@ if (f) { // 发送数据 - ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 30); + ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 100); } @@ -1301,7 +1301,7 @@ if (f) { // 发送数据 - ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 30); + ble.sendData(f.deviceId, buffer, f.writeServiceId, f.wirteCharactId, 100); } diff --git a/pages/common/addBLE/addEquip.vue b/pages/common/addBLE/addEquip.vue index be789a4..2ae01f3 100644 --- a/pages/common/addBLE/addEquip.vue +++ b/pages/common/addBLE/addEquip.vue @@ -10,7 +10,7 @@ - + @@ -44,19 +44,31 @@ - 搜索设备 + + 搜索设备 + 刷新 + - + - - + + {{item.name?item.name:'Unnamed'}} + + + + 信号强度:{{110+item.RSSI>100?100:110+item.RSSI}}% + + + + + @@ -154,34 +166,34 @@ these = this; ble = bleTool.getBleTool(); //已连接过但删除了设备 - let delArr = ble.data.deletedEqs.map(v => { - return { - "deviceId": v.deviceId, - "name": v.name, - "RSSI": -99, - "localName": v.name, - } - }); - //已连接过但没绑定过的设备 - let noDev = ble.data.LinkedList.filter(v => { - return !(v.device && v.device.id); - }).map(v => { - return { - "deviceId": v.deviceId, - "name": v.name, - "RSSI": -99, - "localName": v.name, - } - }); - delArr = delArr.concat(noDev); + // let delArr = ble.data.deletedEqs.map(v => { + // return { + // "deviceId": v.deviceId, + // "name": v.name, + // "RSSI": -99, + // "localName": v.name, + // } + // }); + // //已连接过但没绑定过的设备 + // let noDev = ble.data.LinkedList.filter(v => { + // return !(v.device && v.device.id); + // }).map(v => { + // return { + // "deviceId": v.deviceId, + // "name": v.name, + // "RSSI": -99, + // "localName": v.name, + // } + // }); + // delArr = delArr.concat(noDev); - console.log("可能搜不到的设备=", delArr); - this.EquipMents = delArr; + // console.log("可能搜不到的设备=", delArr); + this.EquipMents = []; //delArr; ble.addDeviceFound((arr) => { - // console.log("发现新设备,",arr); + arr = arr.devices; for (var i = 0; i < arr.length; i++) { @@ -190,15 +202,18 @@ continue; } - let f = these.EquipMents.find(function(v) { - return v.deviceId == arr[i].deviceId; + let f = these.EquipMents.find((v, index) => { + if (v.deviceId == arr[i].deviceId) { + // v.RSSI=arr[i].RSSI;//同一设备上报更新信号强度 + these.$set(these.EquipMents[index], 'RSSI', arr[i].RSSI); + return true; + } + return false; }); if (!f) { - if (arr[i].deviceId == '35:06:00:EF:46:51') { - console.log("EquipMents=", these.EquipMents); - console.log("arr[i]=", arr[i]); - } + console.log("发现新设备,", arr[i]); + arr[i].name=arr[i].name.replace('JQZM-',''); these.EquipMents.push(arr[i]); } else { @@ -237,7 +252,7 @@ // this.EquipMents = []; - this.PairEquip = []; + // this.PairEquip = []; ble && ble.StartSearch().then(res => { console.log("开始搜索成功", res); }).catch((ex) => { @@ -248,6 +263,23 @@ }); }, methods: { + refreshBleList() { + if (!ble) { + return; + } + console.log("111111"); + ble.StopSearch().then(res => { + console.log("停止搜索成功"); + this.EquipMents = []; + ble.StartSearch().then(result => { + console.log("开始搜索成功"); + }).catch(err => { + console.log("err=", err); + }); + }).catch(ex => { + console.log("ex=", ex); + }); + }, isItemLink: function(item, index) { let src = '/static/images/BLEAdd/noLink.png'; @@ -458,7 +490,7 @@ } .content { - background-color: #1d1d1d; + background-color: #121212; color: #ffffffde; box-sizing: border-box; overflow: hidden; @@ -533,6 +565,7 @@ .animate .titleIco { width: 36rpx; height: 36rpx; + } .circle { @@ -542,7 +575,7 @@ animation: expand 4s infinite ease-out; display: inline-block; transform: translate(-50%, -50%); - + border:1rpx solid #bbe6003d; } .circle:nth-child(2) { @@ -561,7 +594,7 @@ } - + 100% { width: 18.75rem; @@ -575,10 +608,10 @@ padding: 30rpx; box-sizing: border-box; width: 100%; - height: calc(100% - 400rpx); + height: calc(100% - 300rpx); overflow-y: scroll; position: absolute; - top: 400rpx; + top: 300rpx; left: 0rpx; } @@ -594,6 +627,13 @@ width: 100%; height: 28rpx; line-height: 28rpx; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-content: center; + align-items: center; + justify-content: space-between; + margin-bottom: 20rpx; } .list { @@ -608,9 +648,10 @@ .list .item { width: 100%; - height: 120rpx; + min-height: 120rpx; + height: auto; box-sizing: border-box; - padding: 30rpx; + padding: 20rpx; border-radius: 8px; background: #1a1a1a; display: flex; @@ -627,7 +668,7 @@ } .list .item .centertxt { - width: calc(100% - 150rpx); + width: calc(100% - 100rpx); height: 100%; padding-left: 10rpx; display: flex; @@ -640,14 +681,21 @@ } .list .item .rightIco { - width: 50rpx; + width: 40rpx; height: 100%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-content: center; + justify-content: space-between; + align-items: center; } .list .item .leftImg .titleIco { width: 100%; height: 100%; + filter:invert(100%); } .list .item .name { @@ -662,7 +710,7 @@ .list .item .id { color: #ffffff99; font-family: "PingFang SC"; - font-size: 24rpx; + font-size: 26rpx; font-weight: 400; line-height: 36rpx; text-align: left; @@ -670,8 +718,8 @@ .list .item .rightIco .img { - width: 45rpx; - height: 45rpx; + width: 40rpx; + height: 40rpx; } .openBlue { diff --git a/static/images/670/jieN.png b/static/images/670/jieN.png index 0919bf8dfff700d7b64ab882345f980295a7741f..5c8228a1316d348c84f5c0f2a73e1ef29cde4da1 100644 GIT binary patch literal 1528 zcmc&!ZA=?w9KWML7hc*%l96?mmyDMsEU7XGhO#yt9rTdV#W>N#QJk#KfFlO*DsNY; zlae`$b<6-_Bi1b02fD=smQlGX&8jd)tRGs^tUXG`B&N_(WLG%u@osH2Tl{3Q_)ng@ z-1GeJ_jdo>z^S_G^b}zV1VQPDQt=9NuVGg0zGUV)H;~%`K}k5GkiV*hg9JR7hnVt^ z=Pq3zo~~9XG#brorgAB-2pUnRhW(E1KkZ`38Feou`D$JFDYu*|ySaDKE{U{8W=+x| zP;LMPlOXY>S$yFQ#OlCA4lKi~TJg(Wl~JpnY(2aCE+tWR9tIr(aI!^q8RH`S2RJW) z4+O7;H*(g#i9?pqqP$~QVsPd=xZcvgsphi$zme$R)+zdr9D3B#D+D}K*4%$4DYPG; z-@8}SnID6rj}v3jspwmXIS%RO;L!6A)$e3#kFx$5{+}8D)sU6@)$&D2DwQ1SFs-lR z`vccAlm2xv{U`0!uo2Fh2RszQlc`%4XJovRI_RMf6W@~lU?i_6Q!I4greJ+SuK^sC zDqYsFxRNSbqUFR;6kj&x|4;;q*@kOj%)rF(_>ghl&!+hQANZ3l1i&Xwq_d4aXTb8k zM!0vMXBnH4==i2BExX6@mcjnCimPC39rB%aiEQTuplTA;854Z{;LJ=aDMY$#zY9R! zq@PQs(J1q*p2f2QG98o2OxmphFuV>)97qurUIQqwm1NKO^r*po8BODJyz&jViw_}82BdeXs*0)Vv0lF9uMR z3VE%GlmL{YkU3{fMH=;_s;P@he#mr`$a2>*w2;@IV1vaY$B2de`#)kw99Xeeooo|{ zN35T3l~(A2Vvg^#%!TZiJL~C{T>6V8x|j%Rf9<|(u`a_c*n!Xow)6DsuIbHee%O3> z`%Adhd1;kZ!*AT3*G;XQh&WBYA)qyYrb#?aD`_ZEA6jc>Xk#R@t6LM4vyv+Oe(#*! z8y=6c>2N$T66&S}eIR3^8jh=QD|duh_BhGo(FqH{FL4z!RW5f3ij!bR*3LwY{iI40 zSJ7;e8n`$1^!B32c=T;#V-BnM+v@F&gqc(i?Bi*(8`__G6TkDMb=7_4CMLy1Dyn%SIp;mWX)RH%cyca6_xiyf7(<8=0}KS<4e#@T;v%Xn3BLgejx>)Ac|pF-p=|0tjEC14Op{FmKua{t+d zOQt`7IP5x8{<-~U&wKy!fI3d>M`6Ob{pYwUsy+K3gVdY=dY+#xj{U}yR%@0z?jLDD zaeKB$|HY2{*X{TpE%1N4!oPgSKlhs|7;ek6)`MrkiT}Lu%D3$~_89#)uj$RP@BME*;qCH|_3WGen*4k3uxZ1|zo$0JKl$HQF52)moXt+CBK2SSuVl~nTncgr zzPU5XAN{WvulzE52h+!xoO+QDfq&kAFrBooE#28hep|fc566G$zok6m4;MS_5!hBQ z0MwoS6R7*t=k_1sH~winSo~xD!)%pWUVVv2t_i;vH}pTc|E_=Mqp3f)gSBzDR|wv$ zOMRf+82&8&IY=SM6?GHp_pYD##q`fKp60WCfLBl&?pFmnH! b{ZZZ#QXjBLiv1+8P-O6Q^>bP0l+XkK@ITnn diff --git a/static/images/670/jieNActive.png b/static/images/670/jieNActive.png index c43abfe6d3c14f2d247eadacf77e13e384619cbd..9c68ba2b11815def3f4095e5b393f587e51c66e6 100644 GIT binary patch literal 2042 zcmd5-eM}Q)7%$+cL)(H&z@W6Sxe-M{wa5px69LHcV^;sFIpGpG8Z2^sovc6uF zHLv0FxwiEg8O6oL+qQxwrkD5b>sW{BPv_>+S&EC-t;;ypraBj5$tlhi9}$a%7CL3l z1ss~lgEQMDEZ%VmuPZyGD&lry72GZBtDnU0^hu-M^Nq#$ROFBof74b%Xo((e`BKQJ zNH!>{)sjHX4?|u;e9$urdH4D%sL$%CV8JsH$o|vd{iXU*pqQ_s0^|4&w7X8a0jdx zCZBY#)G;Y`mAg!3oH$SRrICsFB_rBi<)Jc*Hku9 zFb73!EnK5FarxeuIM@mlZ6-Rw}aYif?5o6(Ao)`QK7+47yhI{|s{+$m15S zrMl8`XyQSglY|OO!xRINYK)zrhcHboo`}~gY}emSX`s62@~~3n@D-vjm5iHuh@ihW zd-6zLH1@jq#lUkoi%Pf7~SJg zYNLQyeVz?qEI3eZHBN-)AFfk0t7Qv?OzvHZrR^9mlFpv_U`r6kMb+dX&#&^2MMOCY zp2YHuzg99aMOP~{xt)8vfsJaOo>n@abXF6v{Q;0B$DUb>=f3DMqK9pI5;-^qn5y+$ zNC&WooRTC@p%1$Ctb}Jue_imP0F9Yq!Be2zBmNwK^M@{N1rvjh zQzD-uS)Q=u`WpS1&e?$WF$B-Wy3)mDIFof)wuBa7Uf9W{y|klr9ljvizGZQ7=M4@cZeLQ zE{PmTC1WQ6Z#!4H%?)cEZHQ}yj>7?tH)(gYciK%Z#Uw90^@Uc1p#;Q2Vzzr*Zf+FUq^jT`=iO#{t_ep zzzf7UP_U*;!8ItZ{kwVw7#l!)N&YMAJY~BQR*-(^d)r02>Va2)hbwF?2=G|eOIQnL zD*xZ_iezW(7m0+K7Wk<|IXbODj25i*^aA_usG)ZQXZ&S{_Di!#XEyz0q6w`8gmP{Y z%YZA4+}i3mGVOtic!S~;J%@WN>$7#?uI4Z!;ho&4($rU~<*KG#O_Yp$XEe8OhdVdK R0{-cYtjx_BKc*E{{RNiHtycg5 literal 1873 zcmd^AZA@EL7`_#;le)Ene8edil(85w9WiOx0xh`8Y;5RarX><@QMU49G@aR?Evvnw zC|qQ6&6p^5THK#y`(ZI;s|hT(NV|@(t}Zd5+fCZ;)^$rrO-l#dj>|pXe(jHc{NoSx zB=;jH@B2RIJkRrtgVwpxX&CU4TC2=eM{kIhlt?V5 zIZaTq9h5AfY8rzjb0vWHq-<4!-}^3w57NT*61+<@?Lnc1d9rCj$408y!L8pTd%!?& z{U;1GV4zc$YPf+;IX|h(m67g9!Vh%tD4oe4#}^oWKk0qxUz+NU1j>67uy(zO#|rk$`1%!Uyf~_coqt#d!P|N1%^Ts^f{;L8NyeJ zbw3(G!!x_2qrhg_)WJ(D(6;by*sJF`d_YHRUBU15J}d#Q?zhclKo~HOSyn%0%Hnqz zaEkl;2FQL@amoPxqebtBEND)v2H*#~;o%f0$S8_V+08FRf$(8kGBEJBlW4xQgPNhi zU1wo@9FI6pEl0r~o8L5B9+~mHzU7w1Zx`D=phaR&_KB}`7hrrkzmfet()%&wv_D$p zKAyVhP2Q2%3+E(YNilbmY#a(jZ;Qk(m2@oh1Y!f98xl5YKD9Ba`QK9QOK;#654%+)09lB%(^J;#3xH&6MudzyX?3PG*8Z0<%c&T5YB&~%N-D$|G2>*y>Ry@ibtXLfQ%rC$qQPN}C;=bR_&r8Yjj=uLFEjwT&RQoq@b45LkM;#STx=+$)lD3P7b zoIjU0|B8mG8cXuMxO!Wq% z^^64cW9V?cm&AvYd-WS1nI%Aip%)&{cIIdMFp#tD%+J*2lu(=83uWV_%*%Le>ixsy S2SM(tgcNVK$$xyK)A}cJ(nFa5 diff --git a/static/images/670/qiang.png b/static/images/670/qiang.png index 6f4df40aae554f1ac98d97a9aceb5614cf78266d..6fc8bad45c9f7f91efdc0b949ced119344389378 100644 GIT binary patch literal 2095 zcmd5;e@qi+7{0T#RS=49t{aY)YLRRz%|PRpVml`aXPq_MwA&nQqYPbWEXmX!2;S8n zP(mDf%rS@B>6*CA%&M4Tq|y@+f~bw%AK-9szy`a_$`wdy>2bF!kon{9E!mgcUGjbJ z`#sP5KJWK_SGjppPJC=qEC2xUP;T}I+;;=_Y@99N-ghcxCIAoyq3ksu!JwZ2kI5lS z4$ZIn>11P0c6LEQ!PYI@utdlB-Tz|jiEgdaMNtY0*00Y#+*o%q*1NGlXW479XuVO$ zjpstr=HO90XO@$?z*YxXGE$wZdd)if`}H&zVok-#59JHx|ALQ*_f3!2+T$CqPG zhgrRi1x+l!=-|-sR>;|bC|Z!rZa$o$=-S}h!I{J9E+_vY@4n{xAvWI?N9F4;@gPMz z0(P$g&!hY0zjf5h&a?+t;;TT#t@_DC>Ijw))^2YEw1a%*u`!HJyK)08O`_7Xx(z(( zGExPAT?vF3%?Y@f&wR=ed&@rX%-y(sDP(F`n;*%s)(#b~o(E?_Zvfq9L20t0Yo}&H z&%D%?j@K05OpxD@vyjOnq~38Gr7}_+V~p@nZ6Ci8aG!O=(Zc#XG;Q=?a&8I4xv1vQ zZx&(V$5p9i7XXt-Mg8n9>Q#`LVNt;|{4PztgYT!B%f5FQ#Hjy$!h+Vgi_EFya7dK@ z)J#}E*^hfin)3j?#&;H8(mf28CMX^mG$q>@-ovNlZkpH_D#Kl5PbDKj3$Kg$gt%SY zr`qBZjY^*hRg@n&jVk(&MD|1G_60WKrO6CjOEsV7^=$T~bBc(GcDGT8=`l9NRn7Cn zo*F!|UkM?%7ubfjN2*W@=a~-K+Yn${E32dSceTy$1$rvPPjcjCvEFh{I4$S+`Ve13 z+)G_;Mbe%zMg2KEwJ1i>l}?po_X8%|(5+x(mi>O*_)e^+@&!{VsJDurjHZ^QdFKR5 zXVhyhJLWJ9^xm9SPfp$rTdqtB@CK@RO1<_k-*W>l0~ng8zb5^9jHHzhnH@yZ8Bdy~ zWHEEvgh;5}?xJBi>4o(+adS{N%X}{`cmY#=%Yoa4?uFi7oo3?GsAVQq?l!8IlRJu; zM8#o$q1C{56*EnGpKfG0KQfof#P?>MSE8$GueNz={MCHbsUfozUJH$n&@zVa>IFmd z&va&@4cOIay4tMcKo77BSMby+B+3G=2CJPfX&If6L+aMJa(G_Xfd#~Y>sQz==wG%Wi@6gagM^>KePF=XW|=)(>z0h*9FO5olV_pkiDG9wwsXGsD18TP3wJ~6yWmAg_Zgh z$TBi7TwM{;7DPJGhJkgXE3u|>?g)R5cL&aecR<5;kgOIYquU^GCo8^-vdKdI3SQ4w z;(Jm}iH;eNF*OgF48jjTC_U;Kq0mzS zJgwT?iJ0lM9#9e;9E)PCscJe|7St}>-LLLU#_Ke{4scoUpj=r=W4O7tWV~?$cdxx} xV;8wB=s4H|aEJFTiI9$=3b7}ITExzlzk(Fb{qdDAxgP-lTDK|t;(Nw}e*>j%W2yiE literal 2064 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 literal 3127 zcmeHKeNa=`6~BCFgs2I)YuK(DR&dj;Ya_cYT8VkM10vO${pc=sa1sRzf2{blRFX(c zP`3zW*Qo6J1^Q;(={Rmjkvf_>JWV2jNCjVYZBc_HB$8N>^}RekUf|`u-e5A*8TQ}) z(azqPBr|vJIp=qO=XcJzsegZC!JOnDB?AEF6t2tr5dNy*M>A_C{66nJwGaRySD3fv z*Sff2Pu$_m!lRjmsSV$pY%9piD=RDex&e9ojp2$#x3wf90AAAx%&-6v;ja-L{>uLE zI+*QTIml&2K_73+sbx~sHTVAd-39gj>d*^84I_OblR8(#NxOw5{ZxhKbE(fNg+2~r zdln!ix&k$jNk^*WcPv4-2vEo^)#^jiEIdPA({~ z7ufNHNW_oKzJl2=ZV5e44nQEGPq@jrbWRXD@1!znwNGa346Z@Py@sWH7>J3%0_<@?cfcI?iFoN^K_b1$wZfvzSVrf3PWg9{mH=b?%rNB3o$NqZ>2Bxso0gI9i2?O zLu)+KZ5e3$lT6JQx_n@NgZv7mH!0_VT*bHWMw;dLTf~sr?a#u$`7ERwn+Cfv{1hSY z<+C@oGzJz^`6!*Hd^Hy!+{*q{o^!gm+1PlMdGOuuw{-ZJ8TO`N{Fj}((b3etr8O`+ z*i3^`zQNauPNpi(@OjASN~423goBOBr^D)IbP&0#3MahSLG8ttd#||1ve-kwIFW>_ z-gI{fGmLD7v^|H!rt>2UeelsUpFWw~qONP!b-S#YDzVMXCG>v0YXzT5RY7iyNBPX@ z;ks08g67B6TljK6(LdG!DWW#OQ_6Po8otw9?Q#Z7SlRTnB^f6uJnxisP$MSG(C{W> zO0L4DQXX=~nFszLHgvia$A|!8pQafV2^l^&8|@K}htbJR{RuD+HV6TgQ>C~#{#&Zf zqEA!}A`hlnipJ)deWw$VZs8jz#AaQSbLUb}qx&f`sx$WahjjzSrxnuMZ9(btY55mS zb~&j$&kky7>Azby*@`PN46d6ra_I8z%H^ZYY<+0-f$lq1UGa{Q|sXX^)hMQ|u zoaECHI&slIj><@R78<@P?vT_C$T8WJxdYzebXuPmtoQuNI7hu4I2t@KOm)1wT{tF*kbZ`rVe}_$w`?;@7Ozr2zaX{ybaqI} zSs2(l3r`{rdcJo1TMcvg_3V8gqi(Mz4YQOyBoC%2E?u36Ol-Sz{|J_-J{=gD13fC6 z`TQH>=!3pz%xj)e9cb6$k4yC??zf=M^e2oJ^!IuPGpoL0{VqJsYUe*hMn(A72a1jz z=|CZUj9&dSQ1@qU84wqRi$VIu2@A;GJc`EEFe@g`JLyN@B%aN$&nH~~b_-*ZX(4b} z??H`Y%c$S5ZrYWK(b?t!OXxW4h_4#GQf7NS;pLY%5&AZX@3MYi>S~NYS?s;cm^>BI z23=%pKek8FQb8B9$X5Cn=y-`CTb>5I`LLb>S1ODRd_n(MYn@~^pcXUrCeP(1${)5C z!=bU2!!CuIE!A1drYUl!GL((YfGIlo&~V3fJq_y-!eLkh&r-#%D3qU+&tMXlSPpAgG*wzY%*T{cEn$veyG7PzftA_92nUKn$4T?D*H zq{&SQKwc6}AD<2CV4sNkx7Ij@@Sakpf*Xcm_Zgp2_|+biLcWZliOf$}wmyAD6A`a& zGRc~VBf4dtDB5s{5%pQWbP|NU&Dv@6@1kPe%Miyec5rgs2|DCw?h^_kwQp=I3U z|KILIm2xia{!eXn8H2k{@NdS7Y)U21W7>Ir9saT;Bg9zY`(rMx>5jd8D?vIZgaaX3 zFnoN>2PObi?3u>l11iu-u8O1H&i%Z?LI{1eG6y|TtyZGLg{r?7z C_1XUb diff --git a/static/images/670/ruo.png b/static/images/670/ruo.png index 3070db2b9a4ab15ca6b36298e875e56f6ad0e12f..20c1435374a031614ee10c12889cce74954fc7ec 100644 GIT binary patch literal 1833 zcmd5-eM}Q)81DzPK&4k!Ga?K+1ca%vet>1ds0c+5KX8k#CTgz}tS+MMGG?m+SJ?Op z(P~i%W5LWdOEwe1k5#lMJrKuGv|0BDHD$DvDPa?OMOKdX+S_%IEt>snvL|`pOP=R> zpWpBKy&u=ObI0cBsJJK^jTQ}VDfoc;7Exnc1dEyQO^hu!8hKO2R{_`!{Y64pdWw#usuEOeEL;EB)0-3wH$p7@n7r+fDOw`{i^t&@ zJ3#N|bk!cRvq$z?Ax}+`EW)0qg;*mAkVQdNTGkGHTw{iYrI;=O)YEZl2)pqeBWT|jC8}zMf7x$S_uaK$xt=69fitm#fjgC0HNY<4Go-C2A z4h2^*#Dg5QkmBLR1%2N2*cJ2#MCD#NQGB9@CuG>6NF-A@e5=TJAjrNJ7(m(6y@8ts z-P789B%%!B5X(Csan>`G%O}1g0J;AoRLDpW+H$cv{ZuHWp$z6>AfkfPCw`q1px#+# z#{w>ETw3&XDTq;5dFOZ{MGnH~!Zk;-7R! z;_1#cXvv&olI!gU(P=KCIxR0~3 zJbj{t@+sy1WzM$h{%P|s38<;)&gZewE=p!D_CD&z%n#LcDEVVuY=X-%;Pulk^^jaB zdEy8@luxibDNS1FB9E9_n6|~o4<6-_d1a2UignnY;Gx@0jTBU4%6c47_}6J?N8vg* zqr1?WNai+>VMYfVPnXxjZT<9YilM#ow4q~E%yNkvC;Mp*#&BQLF#rz(%`Cb9f>z*y z#<@;@N+6Q_ghw`(xoKj6%6OKRQpun$!(Oe(DY?N$ZX2?3T`gX$@ITbv8k4-p)OXiW zBoCr?&*ixi(ER|;>4VqWAr_J#{IcWROlFRDQpg-R6Z=T8^`ta7mK1D$5?t$?)cjl# zVnZ*3mte<{!@)gP)3gBaTpIMY(3Sm7&yJ*2MpLl!ApQE03#6ujEH#=JX|iP*A$2sg z1rYJYnX5#9K9P1~fkhk$-DBG3LH<5E;zXCYb%Dju7GGQ zm(YJVfXuAgWKF~7Wwq0xAK}xM=9&HTV%=pDIVwJRdx}Oq#EBsl!l`3LyiNJurF^@s z3B>qDBKF!{CIVnA>hkJ5Sx)NdZ!Tw(C-BW}iy22ElFu|#zd#x&*->zHlf33H746%G literal 1684 zcmd6ok53b47{{-af`GL!bxaLbw1^waZd=sGiPUPb92$^iS|fUN13MR+mCU&o0zIk- zOya;|VGIWul9t1a%6!|0R(iq6`^{4`yCvndfEJbF%?`CpGJS_AzyfJ} z+4Z&d(1ltQ5 z{BlpTmVON{hV4V={S+xG3cZ52U@@?LzQLc*yhAtRUptC>u|KnZbkc9yWUCChu)VF( z-wk+pT10?vb`-l)r+WyoGjM|^`z5Z4U755!y~5j4;f{y}$F^n#nU6DvzLxI)$apA(b7~ zv)Y-N-IHWMc8p()sNBNkRXOq`Hs!Qoh6S0ZJlbMp~Z%9{i_|&tt92!rHzKx%9)JV3SN47eVco&Ne zekE)4cQWUMWllWDR8Ln;h(2J7U+2l3yJo&`d6s;w*}pgJji=>WWEr04I2t}M+&c?! zoUp>YdJs+W$ZEWG5gBI^Z;5x8s#ZV!Ak=0J?_9XTAaqlCn9|q2@D#y#WIVbg0V>@< ze^x`UvB_eI4e&hO^bQ!5gbgMtrDRz?Hn8m88>rWD&bhfi?%tW* z{pWe!=Xrj=-}`&F>fQ8IpOwKY84QL`+V13^gYRC~!fRIk;qjgJA2ozE%}ez(6ip$&qmw!caFxedjko{_t8{&<3sFDK>wSHLnX4J zR+e==e7q9s7V?|+ZGn!-<7eMU4Vs`%sh_kElBcP3UHzZRB&ombSuhs8EuNN&OIs#O zBPb7nGrp5e#5VOiGpxPC)9Y^5(?*aa=Zk7srRO4jj{MVM= zVf4K#R_J%;xtQm@xz1cmuiR}bHYvkvNDo)|R4v_wtnEC{>avZQf9NH=D9^b&2;P24 zYw?&b*A;E#+|zqwk#jNo3OFY7YwWvt#PLh@X8_Pzf-@S;My5+4M!JK%dUZcMu%mNh zjI#Brbsl- z|8-o2T_u^02Wor91JaEza&p;D~JN(K4hs&C!0os*gG8x8Ge9YOYah3@xu~_lviwNUZur5)ToTm zC6YT9jDa^JYPDP88jHA*0}ZjPcbyzdG+i>A2yb_US4D5d{blrlCZj$K{T%W!WYEEt zt<*L@(L!$c7jykPNl)UM9*xhh#s!anm@=KSiDbyaL#razaWH*2_{0_3$G8dAW?J)y zN7fNiYTA!p0qBBth5}4~sm~5SR$+tWSU7c2ImMAbd!0H*yB{02kBiSw*itG8(cCoz ze?M-bkM_|o0K`9%-;V&H0LU7?DAd%Xt&z*9g1Ou(ouUyrzJX4tgeo-hP)-c-I>l;tUU3;n zBNSrLKTt1(Y2Po^ycKGP;(HL6oPSG=`_XR7=NNCm)>2$=gFefQ#^WZ4Bjh$3xK6mM zLeA}+HT=u;LFy1H1@e0Iot}dV286t7bx`4I+TE*jPRhQEI5?h|#)44Q{hP`rma&cc zK1qJ>9$a=5e-pS+VI1A=N2mQ%Nb>t_Vtbgl)V#ta(@$H8^_Fh5`=9b?TN0ckmbvD zd=;z2Pynn_&S6`ksS;Biu~EErNqmIq?0+u$BX=5r2)I3#a+e2~7vj_-Me(2Wo(}m*KW)~O< zFM&Y^zhZQH+bag8a$hkP*-!lY5QG+6;`ODLC03p5p7Es>e)OFe!|89!^uVgaUg8nD z@LxCTv0MPaeI7X;0-6kEzdWl>rKY~(`4<#pfXZVNE8?oFA@%Qv*Nl0h3K?o#s^CDeHuC1V1 WxrWi;+u$#Vk(QF4{KZ>`OaBS>B11_4 literal 2662 zcmds(acmRk8OA@yKtc>SBx;i~5(kpZlL9lLRZOajozg(CV0ar_)6SJ05|J>0XHd#w zQ{yufLp-Cp13`jJZLQS=Od4(%EoRDroy3Xj1>?1=1k^Nk&cTMT5MOR2XL9lFbKYh%Z;jt+S+z2%-yZcdmub%;kUvG3ceQEN|+*|9u zDrOx`4JBW?0qT&y%OxL*fnnLU{+{BT(Wts)L{6e#%WFT>Y|;OK-$WK@W}C5EU<8JV zC+la=3%OTyN?CL$JX4`X7#}?@P1JM-$CGnsTqiaO)|46@T0~Gz2C!1x7oMrYxXf9a zD$u?6T1k*sotkXvMtgU0Xsm;kzCe}2Il?K?S(o93>=XEh^aRvnfnO>UD2sMnN5 zWSeHL8QaKk=czEcb1l7<`BRq`?mLT!fS0%bQ^#>czM^E9w}JW_lq&3Hw!lYIIobot zo1*l6PY@JzqWyBj-f=O>QRehJ-GLSzH$Fr`v* z*{=@zKgOD*Ot1CPX6+cr6Me!OA{oG@749N*Al)Hf{|X+}{qW4270wx`e>gF~DNVg( zm>~4O3AAxu1^v;(k~Dv+7<$b?XWz~t{K$n!utGBNN5PcV9d5 z1j2lQQbih=llI}=|1>><`&gqpvW*Kv`R?-pPD_jEz5oJarJrxoQV>2l5_R&}sU7gm$^xb;2Tp3rF3~ERW9?K)IwcqPaZcaI% z$Q$j2iwqD7&modI?R|;`S|~M3MrJh-$KYr@K!ngYDDogJZ6<5rlE#~*+%W!bbu|CsA5a>FCcatajHoL9ZrN`gecFV zuK-*%cC{pUD5QTm@eM6HkP%w64tU-DFnPmSN*iu2qI&E=v4a@`~&IDv1r10x$YmdVmyo57o#n$EVZu zRLZcsFhj#J=?b{-{Y9wXp)1*T+LM0Y0(s6-;`Ig0nIg~$gNfkld%bOhvx%keQN{xI zsSLQO7Eqe{U_K+Z`xJ{?7wbxHM*gIgW2E>q1&pU{xBg`&m$mR+!}L))t$gLK|AQvE z^w&|H+7`xDGW^&=Ffdh+(S8FipbndZxXK@EAAL4N9X7%+h9JHJL%>{{k2K5odHb;z TtHKQbKLXi~z4bS?H=X(yw~()a diff --git a/static/images/BLEAdd/bluetooth.png b/static/images/BLEAdd/bluetooth.png new file mode 100644 index 0000000000000000000000000000000000000000..2a1ec40bbb144f1cfac42c4b1902a1a3ade467d4 GIT binary patch literal 3335 zcmcIneNdD49S0qz$IBwyDRU?hYTLVMi91vjFqs-kQ?1?YhMb2a_S^+GUP6a40TLdB zDOtIyW4Br4C3lLqyKxvgP9h}mz`!y)NDg~7#SjvqO=KB)X@KN056`pT?@34=D*rBb zz`+x~Z=aX%H-G%)>AZy4pT4Mbwgr68U+m3`ii+3sdB=V&i(a%w z-`vA*-oyV<)8AXPc|4v-Bs!B1UQ+n-P5eJzmtg3E0+>Z4dgmS9AGED4v4&Hk0;xnQ z{lEZIp1R`~|9&(fQ}G{9_HsARp^qiTBA+19W6nXi?JcZI z!%^SN7YKU{`LpA`);X9qr>z>fT!!e)Qp@UBxbGOA+3y^1%{Z^$4Zgq z(nEo^Lh+#F7I~O9HLv_@qRd*nN3p%4Ey>(HJU# zRqz8Cwj^&%JWc#(x^(4;X13aqPM%%^7M8fEbqxh1vN{IWKQeA~EEn@%UL+($RtDD= z9NzL)vYvX__@RHVb>!SfC88mSp4WtDhllF@FrWc(oW|$aL(k{Q!mJGRy(cAJ_4zucS#K}&*3Ii)l*e#v z;5{#YD>$G`nhUl2wxB11*L$z_rx>V{!H$(;4i_HjWiWR|KDG_5#fV9g2LRsfNIe>^KezMYKiLrg0HAiblS z@8lamlv@Gld-QM`Cr&0NBtzL5T&R=&za+(b(gtYg-7!5_Jp$1v@SfXXFl>ml#k5i! z&9vo8yE+Z9BeWISF(+Jj=}?mw`Kp+m_FSK_1^anWyr*6TNfr$wGXO8X_-#D=hu=s$^LzWq*(vvGP-*lqR6)2+yK2XJzv>CSsp;1b4{wKrhSFxM?@ho`PE$ETP({dSl@(R?ws9 z>SRRp5*4btINCLd>ZQdtdvM(1Mn97>hs!+qHun=edpabra-HXMU*GCks*Im4R62p2 zfw3?>tp7qHmRj%D&EuxkgB3d=vX=H1RmdWNUDQL19BCdp2^1xqe>x#=4|>CeRN}`) zVU^%^tPPCP(Tf?b_&-<)5keTF%OpRGU`*yH$utN9a0MwCxy62lud1}SOKUSpY%6(n zUDq1SIe}BQcLsWBlNk(C1sS$wo$n@$A%B7%HCTphcb_K|m#_HxLCLkZNx72z4NL}{ zt+&o+c6$^yN046oXIqy<}o z+mIPb^h0KdbVb7-2`*`ejY|shtDyB(E0G2Y%|y@H;TrJ2KpcmlIJ!5GMmn?B-Ec!~ zbQoY^j+xsnE=UUe5SgV!?m;KL`$lNHG;{3wY!_Z0+y&Hb4p+k-hCAa~q9=d&1!RpK_ zwB)ee<8d3fmpWvEAYBRFGpbSrO4#NCn8z)1SgE;})>giuanS-comSYGG!=1Uuo>2F z2lh|qDDMV4qqZr@8MZX6V1t36)IchD^6ld6IiJM;#fe zWdmH;V+olv?&;yY=yBk2k&+wyNfd{#D=lEP^eRH;w(-`c2`0uQJlZmJ89W6|skGZI?DrvktDw8l+!AHdFHLYECHr^qS-=Fq0k$R);sX5|MA{4s z0isJhxcsz;n5REMEs^@iPpmr=Bh>*DqaCWPF8zcdI3I2jtrDQ!Fe>O4+5_DS&fi=C z^$>MGs~hNt+U|(1`a>scSL|*uh(a8!Kf>_8~4%ATKlE&ZYFoo y&)R8P@^#0%HL_#Y8Wa>hISEf0_|X7={To^B)kme($H51jD1Po~-u>g}>;DJvCnNO$ literal 0 HcmV?d00001 diff --git a/utils/BleHelper.js b/utils/BleHelper.js index 3eaf028..8f89504 100644 --- a/utils/BleHelper.js +++ b/utils/BleHelper.js @@ -453,7 +453,7 @@ class BleHelper { uni.openBluetoothAdapter({ success: (args) => { - // console.log("蓝牙初始化成功:" + JSON.stringify(args)); + console.log("蓝牙初始化成功:" + JSON.stringify(args)); this.data.isOpenBlue = true; this.data.available = true; resolve(true); @@ -461,7 +461,7 @@ class BleHelper { if (this.data.isSubscribe) { //整个App生命周期,只订阅一次 return; } - // console.log("开始订阅各类变化消息"); + console.log("开始订阅各类变化消息"); this.data.isSubscribe = true; @@ -519,14 +519,29 @@ class BleHelper { } }); - uni.onBluetoothDeviceFound((devices) => { + uni.onBluetoothDeviceFound((res) => { // console.log("发现新设备:" + JSON.stringify(devices)); + let arr=[]; + for (var i = 0; i < res.devices.length; i++) { + let item = res.devices[i]; + let f=serviceDic.find(v=>{ + return item.advertisServiceUUIDs.includes(v.serviceId); + }); + if(f){ + arr.push(item); + } + + } + if(arr.length===0){ + return; + } + res.devices=arr; this.data.searchList = this.data.searchList.concat( - devices); + res); if (this.cfg.onDeviceFound) { if (this.cfg.onDeviceFound.length > 0) { this.cfg.onDeviceFound.forEach((found) => { - found.callback(devices); + found.callback(res); }); } @@ -779,19 +794,40 @@ class BleHelper { //停止搜索 StopSearch() { - return new Promise((resolve, reject) => { + let p1= new Promise((resolve, reject) => { uni.stopBluetoothDevicesDiscovery({ success: (res) => { - //console.log("停止搜索蓝牙设备成功"); + console.log("停止搜索蓝牙设备成功"); resolve(); }, fail: (ex) => { - //console.log("无法停止蓝牙搜索"); + console.log("无法停止蓝牙搜索"); reject(this.getError(ex)); } }); - }) + }); + + let p2 = new Promise((succ, err) => { + setTimeout(() => { + err({ + code: -1 + }); + }, 50); + }); + + + return new Promise((resolve,reject)=>{ + Promise.race([p1,p2]).then(resolve).catch(ex=>{ + if (ex.code == -1) { + resolve(); + return; + } + reject(ex); + }); + }); + + } //获取已连接的设备 diff --git a/utils/update.js b/utils/update.js index 2b30437..41726bf 100644 --- a/utils/update.js +++ b/utils/update.js @@ -12,26 +12,25 @@ function checkAndUpdateWgt(updateUrl) { } // 显示加载提示 - let urls = ['http://114.55.111.217/app/CheckUpdate', 'https://t3v3e2xsjv.by.takin.cc/app/CheckUpdate']; - - - + let urls = ['https://dmsapp.skf.com.cn/HummerService/app/CheckUpdate']; // 1. 获取当前应用版本信息 plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => { const currentVersion = widgetInfo.version; console.log("当前版本:" + currentVersion); - - + + let callbck = (res) => { + let flag = false; uni.hideLoading(); - // console.log("检查更新成功=", res) + console.log("检查更新成功=", res) if (res.statusCode === 200) { - + const updateInfo = res.data.data; if (!updateInfo.hasUpdate) { - return; + return true; } + flag = true; // 3. 显示更新提示 uni.showModal({ title: '检测到更新', @@ -45,16 +44,14 @@ function checkAndUpdateWgt(updateUrl) { } }); } else { - uni.showToast({ - title: '当前已是最新版本', - icon: 'none', - duration: 2000 - }); + console.log('当前已是最新版本'); } + + return flag; }; - + let Update = (url) => { - console.log("url=",url); + console.log("url=", url); return new Promise((resolve, reject) => { uni.request({ url: url, @@ -62,42 +59,57 @@ function checkAndUpdateWgt(updateUrl) { data: { currentVersion: currentVersion, platform: uni.getSystemInfoSync().platform, - appId:"xhyc" + appId: "xhyc" }, success: (res) => { // console.log("res=>",res) - res.type='1'; - resolve(res); + if (res.statusCode === 200) { + res.type = '1'; + resolve(res); + } else { + reject(res); + } + }, fail: (err) => { - console.log("err=",err); + console.log("err=", err); reject(err); }, - complete:()=>{ + complete: () => { console.log("complete"); } }); }); - + } - + let Callback1 = (res) => { console.log("检查版本更新:", res); let os = plus.os.name.toLowerCase(); + + let flag = false; if (res.code != 200) { - return; + return flag; } let f = res.data.find(v => { + if (v.dictLabel.toLowerCase() == os) { + return true; } return false; }); + console.log("f=", f) if (f) { if (f.dictValue == currentVersion) { + flag = false; + return flag; + } + if(!f.dictValue || !f.remark){ + flag=false; return; } - + flag = true; uni.showModal({ title: '检测到更新', content: '当前版本“' + currentVersion + '”,发现新版本“' + f.dictValue + '”,是否立即更新?', @@ -109,17 +121,20 @@ function checkAndUpdateWgt(updateUrl) { } } }); + } else { + flag = false; } + return flag; } - + let Update1 = () => { return request({ url: '/app/auth/version', method: 'get' }); } - - + + let promises = []; for (var i = 0; i < urls.length; i++) { promises.push(Update(urls[i])); @@ -128,25 +143,25 @@ function checkAndUpdateWgt(updateUrl) { Promise.allSettled(promises).then(results => { let length = results.length; - let flag=false; + let flag = false; for (var i = 0; i < length; i++) { - console.log('results['+i+']=',results[i]); - if (results[i].status == 'fulfilled' && results[i].value.type==='1' && !flag ) { - flag=true; - callbck(results[i].value) - + console.log('results[' + i + ']=', results[i]); + if (results[i].status == 'fulfilled' && results[i].value.type === '1' && !flag) { + if (results[i].value.statusCode === 200) { + flag = callbck(results[i].value) + } // break; } - - if(results[i].status == 'fulfilled' && results[i].value.type!=='1' && !flag){ - flag=true; - Callback1(results[i].value); + + if (results[i].status == 'fulfilled' && results[i].value.type !== '1' && !flag) { + + flag = Callback1(results[i].value); // break; } } - if(!flag){ + if (!flag) { console.log("检查更新失败了"); - }else{ + } else { console.log("检查更新成功"); } }); diff --git a/utils/wgs84_to_gcj02.js b/utils/wgs84_to_gcj02.js new file mode 100644 index 0000000..0f9baa4 --- /dev/null +++ b/utils/wgs84_to_gcj02.js @@ -0,0 +1,122 @@ + +//地标 转 国测 常量 +var x_PI = (3.14159265358979324 * 3000.0) / 180.0; +var PI = 3.1415926535897932384626; +var a = 6378245.0; //卫星椭球坐标投影到平面地图坐标系的投影因子。 +var ee = 0.00669342162296594323; //椭球的偏心率。 + + +//判断是否在国内,在中国国内的经纬度才需要做偏移 +function out_of_china(lng, lat) { + return ( + lng < 72.004 || + lng > 137.8347 || + (lat < 0.8293 || lat > 55.8271 || false) + ); +} + +//转化经度 +function transformlng(lng, lat) { + var ret = + 300.0 + + lng + + 2.0 * lat + + 0.1 * lng * lng + + 0.1 * lng * lat + + 0.1 * Math.sqrt(Math.abs(lng)); + ret += + ((20.0 * Math.sin(6.0 * lng * PI) + + 20.0 * Math.sin(2.0 * lng * PI)) * + 2.0) / + 3.0; + ret += + ((20.0 * Math.sin(lng * PI) + + 40.0 * Math.sin((lng / 3.0) * PI)) * + 2.0) / + 3.0; + ret += + ((150.0 * Math.sin((lng / 12.0) * PI) + + 300.0 * Math.sin((lng / 30.0) * PI)) * + 2.0) / + 3.0; + return ret; +} + +//转化纬度 +function transformlat(lng, lat) { + var ret = + -100.0 + + 2.0 * lng + + 3.0 * lat + + 0.2 * lat * lat + + 0.1 * lng * lat + + 0.2 * Math.sqrt(Math.abs(lng)); + ret += + ((20.0 * Math.sin(6.0 * lng * PI) + + 20.0 * Math.sin(2.0 * lng * PI)) * + 2.0) / + 3.0; + ret += + ((20.0 * Math.sin(lat * PI) + + 40.0 * Math.sin((lat / 3.0) * PI)) * + 2.0) / + 3.0; + ret += + ((160.0 * Math.sin((lat / 12.0) * PI) + + 320 * Math.sin((lat * PI) / 30.0)) * + 2.0) / + 3.0; + return ret; +} + +//wgs84 to gcj02 地球坐标系 转 火星坐标系 + function wgs84_to_gcj02(lng, lat) { + if (out_of_china(lng, lat)) { + return [lng, lat]; + } else { + var dlat = transformlat(lng - 105.0, lat - 35.0); + var dlng = transformlng(lng - 105.0, lat - 35.0); + var radlat = (lat / 180.0) * PI; + var magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + var sqrtmagic = Math.sqrt(magic); + dlat = + (dlat * 180.0) / + (((a * (1 - ee)) / (magic * sqrtmagic)) * PI); + dlng = + (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * PI); + var mglat = lat + dlat; + var mglng = lng + dlng; + + return [mglng, mglat]; + } +} + + +//gcj02 to wgs84 火星坐标系 转 地球坐标系 + function gcj02_to_wgs84(lng, lat) { + if (out_of_china(lng, lat)) { + return [lng, lat] + } + else { + var dlat = transformlat(lng - 105.0, lat - 35.0); + var dlng = transformlng(lng - 105.0, lat - 35.0); + var radlat = lat / 180.0 * PI; + var magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + var sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + var mglat = lat + dlat; + var mglng = lng + dlng; + return [lng * 2 - mglng, lat * 2 - mglat] + } +} + +export default { + gcj02_to_wgs84, + wgs84_to_gcj02 +} + + +