diff --git a/pages/index/index.vue b/pages/index/index.vue index 6428235..7fa9aee 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -10,16 +10,26 @@ - 创享电动车 - + + - 嵛你出行 + - - + + + + + + + {{ cleanedText() }} + {{ cleanedText() }} + + + + @@ -665,7 +675,7 @@ style="height: 290rpx;"> - + 继续用车 @@ -777,8 +787,8 @@ 返回 - - 重新连接 + + 重新尝试 @@ -837,7 +847,8 @@ - + + {{item.remainingPower}}% @@ -968,6 +979,8 @@ buleback: false, bulepayback: false, bulebindcar: false, + + backfalse: 0, statusBarHeight: 0, // 导航栏高度 @@ -983,8 +996,9 @@ ispaid: false, isInParkingArea: null, specificDeviceMarkerId: null, - - nearbyMarkers:[] + + nearbyMarkers: [], + duration:0 } }, watch: { @@ -993,6 +1007,11 @@ // console.log('userId 发生变化', newValue, oldValue); this.getisInOrder() }, + cleanedText() { + this.$nextTick(() => { + this.initScroll(); + }); + } }, @@ -1057,8 +1076,8 @@ }, onShow() { this.timestare() - this.backfalse=0 - this.carstause=false + this.backfalse = 0 + this.carstause = false // 检查蓝牙权限状态 uni.getBluetoothAdapterState({ success: function(res) { @@ -1179,6 +1198,7 @@ } }, + onHide() { // 页面隐藏时清除定时器 if (this.timers) { @@ -1216,8 +1236,8 @@ }); }, computed: { - - + + userId() { return this.$store.getters.userId; }, @@ -1231,6 +1251,30 @@ }, }, methods: { + + cleanedText() { + return this.areaInfo.agreement.replace(/<\/?[^>]+(>|$)/g, ""); + }, + tryagain() { + if (this.buleclose) { + this.buleclose = false + this.loackdevice() + } + if (this.buleopen) { + this.buleopen = false + this.unloackdevices() + } + if (this.buleback) { + this.buleback = false + this.cheackgps() + } + if (this.bulepayback) { + this.bulepayback = false + this.payback() + } + // bulepayback: false, + // bulebindcar: false, + }, routePlanning(end_lat, end_long) { console.log('调用了'); let that = this @@ -1285,7 +1329,10 @@ } }) }, - + closemaske() { + this.maskloading = false + this.backfalse = 0 + }, onMapTap(event) { this.showdevice = false @@ -1304,13 +1351,13 @@ // this.close() // 在这里添加你的回调逻辑 }, - tapsn(sn){ + tapsn(sn) { const markerExists = this.listData.some(item => item.sn == sn); - + if (markerExists) { - this.sn =sn; + this.sn = sn; this.deviceInfo(0); - + // Revert the last clicked marker to the default image and zIndex if (this.lastClickedMarkerId !== null) { this.markers = this.markers.map(marker => { @@ -1326,7 +1373,7 @@ return marker; }); } - + // Update the clicked marker's image and zIndex this.markers = this.markers.map(marker => { if (marker.id == sn) { @@ -1340,17 +1387,17 @@ } return marker; }); - + // Store the ID of the currently clicked marker this.lastClickedMarkerId = sn; - - + + } else { console.log('Marker ID does not exist in the list data'); } }, onMarkerTap(e) { - + this.showdevice = false; this.deviceIndex = 0; this.type = 0; @@ -1397,7 +1444,7 @@ }); // Store the ID of the currently clicked marker - + // Get the latitude and longitude of the clicked marker const clickedMarker = this.markers.find(marker => marker.id === e.markerId); @@ -1434,7 +1481,7 @@ } return false; }); - this.nearbyMarkers=nearbyMarkers + this.nearbyMarkers = nearbyMarkers console.log('Nearby markers within 15 meters:', nearbyMarkers); }, haversineDistance(lat1, lon1, lat2, lon2) { @@ -1450,115 +1497,117 @@ }, getmarks() { - let data = { - areaId: this.areaInfo.areaId - }; - if (this.areaInfo.areaId) { - this.$u.get(`/app/allVehicleByArea`, data).then((res) => { - if (res.code === 200 && res.data != '') { - this.listData = res.data; - const newDeviceMarkers = this.listData.map(item => ({ - id: parseFloat(item.sn), - latitude: parseFloat(item.latitude), - longitude: parseFloat(item.longitude), - width: 40, - height: 28, - iconPath: this.defaultMarkerIconPath, - isDeviceMarker: true // 区分为设备标记 - })); - - // 保留停车标记和特定设备标记 - const preservedMarkers = this.markers.filter(marker => marker.isParkingMarker || marker.id === parseFloat(this.OrderdeviceInfos.sn)); - - // 更新markers数组,避免删除已识别的重要标记 - let updatedMarkers = [...newDeviceMarkers, ...preservedMarkers]; - - // 确保点击的标记保持其图标 - if (this.lastClickedMarkerId != null) { - updatedMarkers = updatedMarkers.map(marker => { - if (marker.id === this.lastClickedMarkerId) { - return { - ...marker, - width: 50, - height: 35, - iconPath: this.clickedMarkerIconPath - }; - } - return marker; - }); - } - - // 使用this.$set触发Vue的响应式更新 - this.$set(this, 'markers', updatedMarkers); - - this.oldMarkers = [...this.markers]; - } - }).catch(error => { - console.error("Error fetching device data:", error); - }); - } + let data = { + areaId: this.areaInfo.areaId + }; + if (this.areaInfo.areaId) { + this.$u.get(`/app/allVehicleByArea`, data).then((res) => { + if (res.code === 200 && res.data != '') { + this.listData = res.data; + const newDeviceMarkers = this.listData.map(item => ({ + id: parseFloat(item.sn), + latitude: parseFloat(item.latitude), + longitude: parseFloat(item.longitude), + width: 40, + height: 28, + iconPath: this.defaultMarkerIconPath, + isDeviceMarker: true // 区分为设备标记 + })); + + // 保留停车标记和特定设备标记 + const preservedMarkers = this.markers.filter(marker => marker.isParkingMarker || marker + .id === parseFloat(this.OrderdeviceInfos.sn)); + + // 更新markers数组,避免删除已识别的重要标记 + let updatedMarkers = [...newDeviceMarkers, ...preservedMarkers]; + + // 确保点击的标记保持其图标 + if (this.lastClickedMarkerId != null) { + updatedMarkers = updatedMarkers.map(marker => { + if (marker.id === this.lastClickedMarkerId) { + return { + ...marker, + width: 50, + height: 35, + iconPath: this.clickedMarkerIconPath + }; + } + return marker; + }); + } + + // 使用this.$set触发Vue的响应式更新 + this.$set(this, 'markers', updatedMarkers); + + this.oldMarkers = [...this.markers]; + } + }).catch(error => { + console.error("Error fetching device data:", error); + }); + } }, - + timestare() { - this.timers = setInterval(() => { - this.getmarks(); - - if (this.orderinfo.sn) { - this.$u.get('/app/device/info?sn=' + this.orderinfo.sn).then((res) => { - if (res.code === 200) { - this.mac = this.OrderdeviceInfos.mac; - - if (this.OrderdeviceInfos.onlineStatus !== res.data.onlineStatus) { - this.OrderdeviceInfos = res.data; - } - - if (this.OrderdeviceInfos.status !== res.data.status) { - this.getisInOrder(); - } - - const sn = parseFloat(res.data.sn); - const latitude = parseFloat(res.data.latitude); - const longitude = parseFloat(res.data.longitude); - - // 查找现有的marker - let markerIndex = this.markers.findIndex(marker => marker.id === sn); - - if (markerIndex !== -1) { - // 更新已有的marker - this.markers[markerIndex].latitude = latitude; - this.markers[markerIndex].longitude = longitude; - } else { - // 添加新的marker - const specificDeviceMarker = { - id: sn, - latitude: latitude, - longitude: longitude, - width: 5, - height: 5, - iconPath: 'https://lxnapi.ccttiot.com/bike/img/static/u4D2g8B76trqZLhIiNWN' - }; - this.markers.push(specificDeviceMarker); - } - - // 强制更新 markers 数据 - this.$set(this, 'markers', [...this.markers]); - - } else { - // 处理接口返回错误的情况 - } - }).catch(error => { - console.error("Error fetching specific device data:", error); - }); - } else { - // 查找并移除对应的marker - const markerIndex = this.markers.findIndex(marker => marker.id === parseFloat(this.OrderdeviceInfos.sn)); - if (markerIndex !== -1) { - this.markers.splice(markerIndex, 1); - // 强制更新 markers 数据 - this.$set(this, 'markers', [...this.markers]); - } - } - }, 3000); // 每3秒执行一次 + this.timers = setInterval(() => { + this.getmarks(); + + if (this.orderinfo.sn) { + this.$u.get('/app/device/info?sn=' + this.orderinfo.sn).then((res) => { + if (res.code === 200) { + this.mac = this.OrderdeviceInfos.mac; + // this.OrderdeviceInfos.onlineStatus = '1' + if (this.OrderdeviceInfos.onlineStatus !== res.data.onlineStatus) { + this.OrderdeviceInfos = res.data; + } + + if (this.OrderdeviceInfos.status !== res.data.status) { + this.getisInOrder(); + } + + const sn = parseFloat(res.data.sn); + const latitude = parseFloat(res.data.latitude); + const longitude = parseFloat(res.data.longitude); + + // 查找现有的marker + let markerIndex = this.markers.findIndex(marker => marker.id === sn); + + if (markerIndex !== -1) { + // 更新已有的marker + this.markers[markerIndex].latitude = latitude; + this.markers[markerIndex].longitude = longitude; + } else { + // 添加新的marker + const specificDeviceMarker = { + id: sn, + latitude: latitude, + longitude: longitude, + width: 5, + height: 5, + iconPath: 'https://lxnapi.ccttiot.com/bike/img/static/u4D2g8B76trqZLhIiNWN' + }; + this.markers.push(specificDeviceMarker); + } + + // 强制更新 markers 数据 + this.$set(this, 'markers', [...this.markers]); + + } else { + // 处理接口返回错误的情况 + } + }).catch(error => { + console.error("Error fetching specific device data:", error); + }); + } else { + // 查找并移除对应的marker + const markerIndex = this.markers.findIndex(marker => marker.id === parseFloat(this + .OrderdeviceInfos.sn)); + if (markerIndex !== -1) { + this.markers.splice(markerIndex, 1); + // 强制更新 markers 数据 + this.$set(this, 'markers', [...this.markers]); + } + } + }, 3000); // 每3秒执行一次 }, toggleIconAndCallout() { this.showIconAndCallout = !this.showIconAndCallout; @@ -1692,12 +1741,12 @@ this.seeDetail = false; if (res.code === 200) { this.opencar() - this.backfalse=0 + this.backfalse = 0 this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; this.toploadtxt = '开锁成功'; this.buletxt = '开锁成功'; - this.lastClickedMarkerId=null - this.mappolyline=[] + this.lastClickedMarkerId = null + this.mappolyline = [] setTimeout(() => { this.maskloading = false; this.getisInOrder(); @@ -1910,8 +1959,8 @@ }, 5000) }, - - + + cheackgps() { let that = this uni.getLocation({ @@ -1930,12 +1979,13 @@ that.$u.get('/appVerify/isInParkingArea?', data).then((res) => { if (res.code == 200) { - // let parkingReturn = true + // let parkingReturn = false // let isInParkingArea = false let parkingReturn = res.data .parkingReturn /** 强制停车点还车 true:开启,false:关闭*/ let isInParkingArea = res.data.isInParkingArea /** 是否在停车区内*/ - that.isInParkingArea = res.data.isInParkingArea + that.isInParkingArea = res.data + .parkingReturn if (parkingReturn) { // 不可以在停车点外还车 if (isInParkingArea) { @@ -1958,7 +2008,7 @@ if (res.code === 200) { that.reboot() - that.backfalse=0 + that.backfalse = 0 that.isbackdevice = false // that.close() // that.getisInOrder() @@ -2014,7 +2064,7 @@ if (res.code === 200) { that.reboot() - that.backfalse=0 + that.backfalse = 0 that.isbackdevice = false that.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; @@ -2117,7 +2167,7 @@ }) }, payback() { - + if (this.OrderdeviceInfos.onlineStatus == 1 && this.backfalse < 1) { // 设备未离线 console.log('在线还车'); @@ -2137,20 +2187,21 @@ this.$u.post('/appVerify/device/return?returnType=1&orderNo=' + this.orderinfo.orderNo + '&isInParkingArea=' + this.isInParkingArea).then(( res) => { - + // res.code=500 if (res.code === 200) { - this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; + this.loadimg = + 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; this.toploadtxt = '还车成功!'; - this.backfalse=0 + this.backfalse = 0 setTimeout(() => { this.close() this.maskloading = false; this.getisInOrder(); - + }, 800); - + } else { - + this.backfalse = this.backfalse + 1 this.payback() // this.cheackgps() @@ -2192,7 +2243,7 @@ if (res.code === 200) { this.reboot() - this.backfalse=0 + this.backfalse = 0 this.isbackdevice = false this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; @@ -2246,159 +2297,32 @@ if (res.code === 200) { this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; this.toploadtxt = '还车成功!'; - this.backfalse=0 + this.backfalse = 0 setTimeout(() => { this.close() this.maskloading = false; this.getisInOrder(); - + }, 800); } else { - + this.backfalse = this.backfalse + 1 this.cheackgps() - this.toploadtxt = '还车失败'; - setTimeout(() => { - this.maskloading = false; - uni.showToast({ - title: res.msg, - icon: 'none', - duration: 2000 - }); - }, 1000); + // this.toploadtxt = '还车失败'; + // setTimeout(() => { + // this.maskloading = false; + // uni.showToast({ + // title: res.msg, + // icon: 'none', + // duration: 2000 + // }); + // }, 1000); } }) }, - onlinebackDevice() { - let that = this - uni.getLocation({ - type: 'gcj02', - success: function(lb) { - - let data = { - latitude: lb.latitude, - longitude: lb.longitude, - areaId: that.areaInfo.areaId - } - - that.$u.get('/appVerify/isInParkingArea?', data).then((res) => { - - if (res.code == 200) { - let parkingReturn = res.data.parkingReturn - let isInParkingArea = res.data.isInParkingArea - if (parkingReturn) { - if (isInParkingArea) { - if (that.carstause) { - that.reboot() - that.$u.post( - '/appVerify/device/return?returnType=1&orderNo=' + - that.orderinfo - .orderNo + '&isBluetooth=true' + '&lon=' + - lb - .longitude + '&lat=' + lb.latitude).then(( - res) => { - uni.hideLoading() - if (res.code === 200) { - that.close() - that.getisInOrder() - - } else { - uni.showToast({ - title: res.msg, - icon: 'none', - duration: 2000 - }); - } - }) - - - } else { - uni.showToast({ - title: '蓝牙状态异常,请重新链接', - icon: 'none', - duration: 1000 - }); - setTimeout(() => { - that.isnoline = true - }, 1300) - } - - - } else { - uni.showToast({ - title: '停车点外禁止还车,请行驶至停车区内', - icon: 'none', - duration: 2000 - }); - } - } else { - if (isInParkingArea) { - if (that.carstause) { - that.reboot() - that.$u.post( - '/appVerify/device/return?returnType=1&orderNo=' + - that.orderinfo - .orderNo + '&isBluetooth=true' + '&lon=' + - lb - .longitude + '&lat=' + lb.latitude).then(( - res) => { - uni.hideLoading() - if (res.code === 200) { - that.close() - that.getisInOrder() - - } else { - uni.showToast({ - title: res.msg, - icon: 'none', - duration: 2000 - }); - } - }) - - - } else { - uni.showToast({ - title: '蓝牙状态异常,请重新链接', - icon: 'none', - duration: 1000 - }); - setTimeout(() => { - that.isnoline = true - }, 1300) - } - } else { - that.isbackdevice = true - } - } - } else { - uni.showToast({ - title: res.msg, - icon: 'none', - duration: 2000 - }); - } - }) - - - - }, - fail: function(error) { - // uni.showToast({ - // title: '未获取到定位信息,请点击设置勾选允许位置信息,即可使用全部功能', - // icon: 'none', - // duration: 2000 - // }); - // that.getmarks() - // 在这里处理获取位置信息失败的情况 - } - - }) - - }, // 新增的检查函数 checkBeforeUnlock() { if (!this.freeInfo.ruleId) { @@ -2454,8 +2378,8 @@ if (res.code === 200) { this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; this.toploadtxt = '开锁成功'; - this.lastClickedMarkerId=null - this.mappolyline=[] + this.lastClickedMarkerId = null + this.mappolyline = [] setTimeout(() => { this.maskloading = false; this.getisInOrder(); @@ -2721,7 +2645,7 @@ .orderNo).then((res) => { if (res.code === 200) { - this.backfalse=0 + this.backfalse = 0 this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; this.toploadtxt = '开锁成功'; @@ -2785,7 +2709,7 @@ 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; that.buletxt = '解锁成功'; that.toploadtxt = '解锁成功' - that.backfalse=0 + that.backfalse = 0 setTimeout(() => { that.maskloading = false; that.getisInOrder(); @@ -2853,7 +2777,7 @@ if (res.code === 200) { // this.getisInOrder() - this.backfalse=0 + this.backfalse = 0 this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; this.toploadtxt = '锁车成功'; @@ -2918,7 +2842,7 @@ // console.log('发送了离线锁车请求'); // that.getisInOrder() that.buleclose = false - that.backfalse=0 + that.backfalse = 0 that.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/upNvRa9ZQMyiwxLliF5z'; that.buletxt = '锁车成功'; @@ -3218,8 +3142,8 @@ // } // } }, - - + + starTime() { uni.hideLoading() this.showtcs = false @@ -3229,7 +3153,7 @@ this.$u.get('/app/device/info?sn=' + this.orderinfo.sn).then((res) => { if (res.code === 200) { this.OrderdeviceInfos = res.data - // this.OrderdeviceInfos.onlineStatus = '0' + // this.OrderdeviceInfos.onlineStatus = '1' this.mac = this.OrderdeviceInfos.mac if (this.OrderdeviceInfos.onlineStatus == 0 && this.orderinfo.status != 3) { @@ -3239,7 +3163,7 @@ } } - + } else { // 处理接口返回错误的情况 @@ -4234,7 +4158,7 @@ setTimeout(() => { this.getinfo() }, ) - + } }); @@ -4285,6 +4209,14 @@ // .map(area => this.convertBoundaryToPolyline(area.boundaryStr)); // 更新折线数据 this.areaInfo = res.data + setTimeout(()=>{ + let abb=this.cleanedText() + console.log(abb.length,'cleanedTextcleanedTextcleanedText'); + + // 计算滚动时间,基于文本宽度 + this.duration =abb.length*0.3; // 50 px/s 的速度 + },200) + this.polyline.push(polylines) console.log(); // console.log(this.areaInfo, 'areaInfoareaInfo'); @@ -4646,8 +4578,8 @@ }) } }, - - + + deviceInfo(num) { if (uni.getStorageSync('token')) { @@ -4916,7 +4848,8 @@ .page { width: 750rpx; - .fixdivce{ + + .fixdivce { padding: 12rpx 22rpx 12rpx 22rpx; position: fixed; left: 0; @@ -4925,58 +4858,69 @@ height: 460rpx; background: #FFFFFF; border-radius: 0 40rpx 40rpx 0; - box-shadow: 0rpx 4rpx 10rpx 0rpx rgba(0,0,0,0.3); + box-shadow: 0rpx 4rpx 10rpx 0rpx rgba(0, 0, 0, 0.3); + .scrollable-content { - height: 100%; - overflow-y: auto; - .divce_li:last-child{ + height: 100%; + overflow-y: auto; + + .divce_li:last-child { border-bottom: 1rpx solid #fff; } - .divce_li{ + + .divce_li { padding: 10rpx 0; display: flex; flex-wrap: nowrap; align-items: center; border-bottom: 1rpx solid #D8D8D8; - .left_img{ - image{ + + .left_img { + image { width: 44rpx; height: 70rpx; } } - .right_cont{ + + .right_cont { margin-left: 20rpx; display: flex; flex-wrap: wrap; font-weight: 400; font-size: 24rpx; color: #3D3D3D; - .right_top{ + + .right_top { width: 100%; display: flex; flex-wrap: nowrap; align-items: center; - .right_top_left{ + + .right_top_left { display: flex; flex-wrap: nowrap; align-items: center; - image{ + + image { margin-right: 6rpx; width: 12rpx; height: 26rpx; } } - .right_top_right{ + + .right_top_right { margin-left: auto; } } - .right_bot{ + + .right_bot { margin-top: 8rpx; } } } } } + .maskload { position: fixed; @@ -5122,8 +5066,8 @@ position: fixed; z-index: 10; // background:#fff; - // background: linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 70%, transparent); - background: linear-gradient(to bottom, rgba(255, 255, 255, 1) 50%, rgba(255, 255, 255, 0.5) 75%, transparent 100%); + // background: linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 70%, transparent); + // background: linear-gradient(to bottom, rgba(255, 255, 255, 1) 50%, rgba(255, 255, 255, 0.5) 75%, transparent 100%); // background: linear-gradient( 180deg, #FFFFFF 58%, rgba(255,255,255,0) 52%); .navBar { @@ -5159,6 +5103,64 @@ } } + + .swiper_tips { + display: flex; + flex-wrap: nowrap; + align-items: center; + padding: 18rpx 24rpx; + margin: 0 auto; + width: 688rpx; + height: 72rpx; + background: #3D3D3D; + box-shadow: 0rpx 4rpx 10rpx 0rpx rgba(0, 0, 0, 0.3); + border-radius: 53rpx 53rpx 53rpx 53rpx; + + .cont { + width: 80%; + display: flex; + flex-wrap: nowrap; + align-items: center; + font-weight: 400; + font-size: 28rpx; + color: #FFFFFF; + + image { + width: 36rpx; + height: 36rpx; + margin-right: 32rpx; + } + + .scroll-container { + overflow: hidden; + width: calc(100% - 68rpx); + /* Adjusting width to fit within container */ + display: flex; + + .scroll-text { + white-space: nowrap; + display: inline-block; + // animation: scroll-text 40s linear infinite; + } + } + } + + .icon-xiangyou1 { + margin-left: auto; + color: #fff; + font-size: 30rpx; + } + } + + @keyframes scroll-text { + 0% { + transform: translateX(0); + } + + 100% { + transform: translateX(-100%); + } + } } .my-location { @@ -5168,7 +5170,7 @@ align-items: center; justify-content: center; right: 30rpx; - top: 220rpx; + top: 400rpx; // background-color: #fff; border-radius: 50%; width: 82rpx; @@ -5187,7 +5189,7 @@ align-items: center; justify-content: center; right: 30rpx; - top: 300rpx; + top: 480rpx; // background-color: #fff; border-radius: 50%; width: 82rpx; @@ -5795,8 +5797,8 @@ } .page3 { - - + + .bot_btns { // position: relative; // display: flex; @@ -5808,6 +5810,7 @@ border-radius: 50rpx 50rpx 0 0; // padding-left: 8rpx; padding-left: 10rpx; + .infoss { // margin-top: 20rpx; diff --git a/pages_admin/admin_index.vue b/pages_admin/admin_index.vue index d5d0ce4..9deff7a 100644 --- a/pages_admin/admin_index.vue +++ b/pages_admin/admin_index.vue @@ -98,6 +98,14 @@ {{deviceNum.offlineNum}} + + + 仓库中 + + + {{deviceNum.offlineNum}} + +