<template> <view class="page"> <u-navbar :title="tittxt" :border-bottom="false" :background="bgc" back-icon-color="#fff" title-color='#fff' title-size='36' height='50' id="navbar"> </u-navbar> <view class="zhuhu"> <view class="card1"> <view class="top"> <view class="left"> 设备 </view> <view class="right"> <!-- <image class="img1" src="https://api.ccttiot.com/smartmeter/img/static/uGvS4RQvbw7OOfhzy6xf" mode="" style="margin-right: 30rpx;" @click="opendevices"></image> <image class="img1" src="https://api.ccttiot.com/smartmeter/img/static/uNEKwe2WKsJdtQzOdEay" mode="" @click="toewm()"></image> --> </view> </view> <view class="mid"> <view class="mid_left" @click="btnpic"> <image :src="imglist" mode=""></image> </view> <view class="mid_right"> <view class="mid_top"> {{ deviceInfo.deviceName == null ? '' : deviceInfo.deviceName }} </view> <view class="mid_bot"> <view class="txt" v-if="deviceInfo">S/N码:{{ deviceInfo.deviceNo == null ? '' : deviceInfo.deviceNo }}</view> <div class="tip" v-if="deviceInfo.onlineStatus==1">在线</div> <div class="tip" v-if="deviceInfo.onlineStatus==0">离线</div> <div class="tip" v-if="deviceInfo.powerStatus==0">断电</div> <div class="tip" v-if="deviceInfo.powerStatus==1">正常</div> </view> </view> </view> <view class="bot"> <!-- <view class="bot_left"> <view class="echarts"> <l-echart ref="chart" @finished="initChart"></l-echart> <uni-ec-canvas class="uni-ec-canvas" id="uni-ec-canvas" ref="canvas" canvas-id="uni-ec-canvas" :ec="ec"> </uni-ec-canvas> </view> </view> --> <view class="bot_right"> <view class="cont" style="text-align: center;"> <view class="tit"> {{deviceInfo.orderAmount == null ? 0 : deviceInfo.orderAmount}} </view> <view class="txt"> 订单金额 </view> </view> <view class="cont" style="text-align: center;"> <view class="tit"> {{deviceInfo.orderCount == null ? 0 : deviceInfo.orderCount}} </view> <view class="txt"> 订单数 </view> </view> <view class="cont" style="text-align: center;"> <view class="tit"> {{timeday == null ? 0 : timeday}} </view> <view class="txt"> 剩余分钟 </view> </view> </view> </view> </view> <view class="card2"> <view class="tit">实时</view> <view class="cont_box"> <view class="cont"> <view class="top">{{deviceInfo.realTimePower == null ? '' : deviceInfo.realTimePower}}KW</view> <view class="bot">实时功率</view> </view> <view class="cont" style="width: 70rpx;"> <view class="top">{{deviceInfo.electricity == null ? '' : deviceInfo.electricity}}A</view> <view class="bot">电流</view> </view> <view class="cont" style="width: 110rpx;"> <view class="top">{{deviceInfo.voltage == null ? '' : deviceInfo.voltage}}V</view> <view class="bot">电压</view> </view> </view> </view> <view class="card3"> <view class="tit">其他</view> <view class="cont_box" style="display: block;"> <view class="" style="display: flex;justify-content: space-between;"> <view class="cont" style="width: 120rpx;" @click="topage(0)"> <view class="top"> <image src="https://api.ccttiot.com/smartmeter/img/static/uj4DT6WructS782RY0J7" mode="" style="width: 58rpx;height: 56rpx;"></image> </view> <view class="bot">充值记录</view> </view> <view class="cont" style="width: 60rpx;" @click="topage(1)"> <view class="top"> <image src="https://api.ccttiot.com/smartmeter/img/static/uGaAuulryhDmaDwWLuwo" mode="" style="width: 58rpx;height: 58rpx;"></image> </view> <view class="bot">归零</view> </view> <view class="cont" style="width: 60rpx;" @click="topage(2)"> <view class="top"> <image src="https://api.ccttiot.com/smartmeter/img/static/u8QfFAKCq8wE32dFA9Go" mode="" style="width: 58rpx;height: 60rpx;"></image> </view> <view class="bot">异常</view> </view> <view class="cont" style="width: 120rpx;" @click="toydfx()"> <view class="top"> <image src="https://api.ccttiot.com/smartmeter/img/static/u0N4pFke1isIzNrNT6Wh" mode=""> </image> </view> <view class="bot">用电分析</view> </view> </view> <view class="" style="display: flex;margin-top: 20rpx;"> <view class="cont" style="width: 120rpx;" @click="topage(3)"> <view class="top"> <image src="https://api.ccttiot.com/smartmeter/img/static/uW2T5sbuiMPbPaJp9p2U" mode="" style="width: 58rpx;height: 60rpx;"></image> </view> <view class="bot">收费方式</view> </view> <view class="cont" style="width: 60rpx;" @click="topage(4)"> <view class="top"> <image src="https://api.ccttiot.com/smartmeter/img/static/ubxoYVnbIK1rk0cfoL3j" mode=""> </image> </view> <view class="bot">设置</view> </view> <view class="cont" style="width: 60rpx;" @click="topage(5)"> <view class="top"> <image src="https://api.ccttiot.com/smartmeter/img/static/uWaQjL7vph474LWTyGfs" mode=""> </image> </view> <view class="bot">配网</view> </view> </view> </view> <view class="cont_box" style="padding-left: 30rpx;"> </view> </view> </view> </view> </template> <script> var xBlufi = require("@/page_components/blufi/xBlufi.js") import uniEcCanvas from '@/components/uni-ec-canvas/uni-ec-canvas.vue' import * as echarts from '@/components/uni-ec-canvas/echarts' let chart = null export default { components: { uniEcCanvas }, data() { return { bgc: { backgroundColor: "#8883f0", }, ec: { lazyLoad: true }, deviceInfo: {}, loadings: false, info: '', tittxt: "设备列表", titlist: [ "全部", "电表", "水表", ], curtitidx: 0, id: '', timeday: '', imglist: '', token: '', userImgs: '', imgflag: true, mac: "", name: '', deviceId: '', storeId: '', qrResult: '', devicesList:[] } }, onLoad(option) { // setTimeout(() => { // this.$refs.canvas.init(this.initChart) // }, 1000) let id = option.id this.id = id this.getDevice(id) }, onShow() { setTimeout(() => { this.getDevice(this.id) }, 1000) this.getQiniuToken() }, onUnload: function() { xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent); xBlufi.notifyStartDiscoverBle({ 'isStart': false }); }, onHide() { xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent); xBlufi.notifyStartDiscoverBle({ 'isStart': false }); }, onBeforeUnmount() { xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent); xBlufi.notifyStartDiscoverBle({ 'isStart': false }); }, methods: { async initChart() { let value = 100; let value2 = this.deviceInfo.orderAmount const option = { series: [{ type: 'pie', // 饼图类型 radius: ['98%', '70%'], // 饼图半径,第一个值是内半径,第二个值是外半径 silent: true, clockwise: true, startAngle: 90, // 起始角度 z: 0, zlevel: 0, data: [{ value: value, name: '占比', // 数据项名称 itemStyle: { normal: { color: '#8883F0', // 数据项颜色 }, }, label: { normal: { position: 'center', formatter: ` {a|${value2 == null ? 0 : value2}}\n\n{b|订单金额}`, // 标签内容格式 rich: { a: { fontSize: 15, fontWeight: '700', color: '#333', }, b: { fontSize: 11, color: '#888', }, }, }, }, }, ], }, ], }; // console.log( this.$refs.chartRef,'1111'); const chart = await this.$refs.chart.init(echarts); // console.log(option,11); chart.setOption(option) return chart }, getQiniuToken() { this.$u.get("/common/qiniu/uploadInfo").then((res) => { if (res.code == 200) { this.token = res.token } }); }, btnpic() { let _this = this let math = 'static/' + _this.$u.guid(20) uni.chooseImage({ count: 1, type: 'all', success(res) { const tempFilePaths = res.tempFiles wx.uploadFile({ url: 'https://up-z2.qiniup.com', name: 'file', filePath: tempFilePaths[0].path, formData: { token: _this.token, //后端返回的token key: 'smartmeter/img/' + math }, success: function(res) { let str = JSON.parse(res.data) _this.userImgs = 'https://api.ccttiot.com/' + str.key _this.imglist = _this.userImgs let data = { deviceId: _this.id, customPicture: _this.imglist } _this.putdevice(data) } }); } }) }, putdevice(data) { this.$u.put('/app/device', data).then((res) => { if (res.code == 200) { uni.showToast({ title: '修改成功', icon: 'success', duration: 2000 }) } else if (res.code == 500) { uni.showToast({ title: '设备不在线', icon: 'none', duration: 2000 }) } }) }, // 获取设备详情 getDevice(id) { this.$u.get("/app/device/" + id).then((res) => { // this.$forceUpdate() if (res.code == 200) { this.deviceInfo = res.data this.storeId = res.data.storeId this.qrResult = 'CTKG-' + res.data.mac if (res.data.customPicture != '自定义图片路径') { this.imglist = res.data.customPicture } else { this.imglist = res.data.picture } let expireTimeStr = this.deviceInfo.expireTime let expireTimeParts = expireTimeStr.split(" "); let expireDateParts = expireTimeParts[0].split("-"); let expireTimePartsTime = expireTimeParts[1].split(":"); let expireDate = new Date(expireDateParts[0], expireDateParts[1] - 1, expireDateParts[2], expireTimePartsTime[0], expireTimePartsTime[1], expireTimePartsTime[2] ); // 注意月份是从0开始的,所以要减1 let now = new Date(); let differenceInMs = expireDate - now; if (differenceInMs <= 0) { this.timeday = 0 } else { this.timeday = Math.abs(Math.floor(differenceInMs / (1000 * 60))); } this.loadings = true // this.initChart() } }); }, opendevice() { let stause = 0 if (this.deviceInfo.powerStatus == 1) { stause = 0 } else { stause = 1 } console.log(stause, 'stausestause'); this.$u.put(`/app/device/${this.deviceInfo.deviceId}/changePower?status=` + stause).then((res) => { // this.$forceUpdate() if (res.code == 200) { // this.groupList=res.rows setTimeout(() => { this.getDevice(this.id) }, 2000) // this.loadings=true // this.initChart() } else { uni.showToast({ title: res.msg, icon: 'none' }); } }); }, opendevices() { }, swiperchange(e) { this.curtitidx = e.detail.current console.log(e, 'aaaa'); }, changeidx(index) { this.curtitidx = index }, toydfx() { uni.navigateTo({ url: "/page_components/eletj?id=" + this.id }) }, // 其他部分 点击进行跳转 topage(num) { if (num == 0) { uni.navigateTo({ //抄表 url: '/page_user/cbRecord?id=' + this.id }) } else if (num == 1) { //归零 this.$u.put(`/app/device/${this.id}/reset`).then((res) => { if (res.code == 200) { console.log(res.data); uni.showToast({ title: res.data, icon: 'none', duration: 2000 }); this.getDevice(this.id) } else if (res.msg == '设备剩余时间不足,无需归零') { uni.showToast({ title: '设备剩余时间不足,无需归零', icon: 'none', duration: 2000 }); this.getDevice(this.id) } }) } else if (num == 2) { //异常 uni.navigateTo({ url: '/page_fenbao/statulist/fault/yichang/index' }) } else if (num == 3) { uni.navigateTo({ url: "/page_fenbao/statulist/taocanlist/index?id=" + this.id }) } else if (num == 4) { //设置 uni.navigateTo({ url: '/page_user/setting?id=' + this.id }) } else if (num == 5) { console.log(this.deviceInfo); // uni.navigateTo({ // url: '/page_fenbao/device/lianjie?mac=' + this.deviceInfo.mac + '&storeId=' + this // .deviceInfo.storeId // }) uni.showLoading({ title: '加载中...' }); xBlufi.initXBlufi(1); xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent); xBlufi.notifyStartDiscoverBle({ 'isStart': true }); // 停止蓝牙搜索 setTimeout(() => { xBlufi.notifyStartDiscoverBle({ 'isStart': false }); xBlufi.notifyConnectBle({ isStart: true, deviceId: this.deviceId, name: this.name }) // if(this.devicesList.length == 0){ // uni.hideLoading(); // uni.showToast({ // title: '设备离线或不在范围内', // icon: 'none', // duration: 2000 // }); // } }, 2000) } }, funListenDeviceMsgEvent: function(options) { switch (options.type) { case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS: if (options.result) { let devicesarr = options.data // console.log(devicesarr,'devicesarrdevicesarr'); devicesarr.forEach(device => { const mac = device.name.substring(5); if (device.name == this.qrResult) { this.deviceId = device.deviceId this.name = device.name this.mac = device.name.slice(5, 17) console.log(this.mac, 'macmacmac'); this.devicesList = uniqueDevicesList; } }) } break; case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED: console.log("连接回调:" + JSON.stringify(options)); if (options.result) { uni.hideLoading(); // uni.showToast({ // title: '连接成功', // icon: 'none' // }); { console.log("连接回调options.data.deviceId:" + options.data.deviceId, "连接回调options.data.name:" + options.data.name); let name = '' let index = this.name.indexOf('-'); if (index !== -1) { name = this.name.slice(index + 1); } let data = { storeId: this.storeId, mac: this.mac } this.$u.put('/app/device/bind', data).then((res) => { if (res.code == 200) { uni.showToast({ title: '绑定成功', icon: 'none', duration: 2000 }); uni.hideLoading(); uni.removeStorageSync('mac'); let vm = this uni.showModal({ title: '提示', content: '你已绑定该设备,需前去配网吗?', success: function(res) { if (res.confirm) { let systemInfo = uni.getSystemInfoSync(); if (systemInfo.platform === 'android') { // 当前设备是 Android uni.navigateTo({ url: '/page_components/wifilist/index?deviceId=' + options .data.deviceId + '&name=' + options.data.name }) } else if (systemInfo.platform === 'ios') { // 当前设备是 iOS uni.navigateTo({ url: '/page_fenbao/device/wifivideo?deviceId=' + options .data.deviceId + '&name=' + options.data.name }) } } else if (res.cancel) { console.log('用户点击了取消'); } } }) } else if (res.msg == '设备编号和mac不能同时为空') { uni.showToast({ title: '设备不在线,未找到设备', icon: 'none', duration: 2000 }); } else { uni.showToast({ title: '连接失败', icon: 'none', duration: 2000 }); // uni.navigateBack() } }) } }else{ uni.hideLoading() uni.showToast({ title: '设备离线或不在范围内', icon: 'none', duration: 2000 }) } break; case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START: if (!options.result) { console.log("蓝牙未开启", options); uni.showToast({ title: '蓝牙未开启', icon: 'none', duration: 3000 }); } else { // this.searching = true //蓝牙搜索开始 // _this.setData({ // searching: true // }); } break; case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP: if (options.result) { let uniqueDevicesList = Array.from(new Set(this.devicesList)); // 将去重后的数组重新赋值给 this.devicesList this.devicesList = uniqueDevicesList; let list = [] filteredDevices.forEach(device => { // 从设备名称中提取 MAC 地址(假设 MAC 地址是设备名称的后6个字符) let macFromName = device.name.substring(device.name.length - 12); this.$u.get(`/app/device/${macFromName}/isBind`).then((res) => { if (res.data == false) { list.push(device) } else { } }) }); setTimeout(() => { this.devicesList = list }, 200) console.log('蓝牙停止搜索ok'); } else { //蓝牙停止搜索失败 console.log('蓝牙停止搜索失败'); } this.searching = false // _this.setData({ // searching: false // }); break; } }, } } </script> <style lang="scss"> /deep/ .u-title{ padding-bottom: 22rpx; } /deep/ .u-icon__icon{ padding-bottom: 22rpx; } page { background-color: #F7FAFE; } .page { .zhuhu { margin-top: 20rpx; padding: 0 40rpx; .card1 { padding: 34rpx 0 0 40rpx; width: 670rpx; height: 470rpx; background: #FFFFFF; box-shadow: 0rpx 14rpx 35rpx 0rpx rgba(53, 140, 255, 0.1); border-radius: 28rpx 28rpx 28rpx 28rpx; .top { display: flex; flex-wrap: nowrap; justify-content: space-between; align-items: center; .left { font-size: 35rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #8883F0; } .right { margin-right: 56rpx; .img1 { width: 76rpx; height: 76rpx; } } } .mid { margin-top: 20rpx; display: flex; flex-wrap: nowrap; align-content: flex-start; .mid_left { image { width: 170rpx; height: 160rpx; border-radius: 20rpx; } } .mid_right { margin-left: 40rpx; display: flex; flex-wrap: wrap; .mid_top { width: 100%; font-size: 42rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #262B37; } .mid_bot { display: flex; flex-wrap: nowrap; align-items: center; .txt { font-size: 24rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #95989D; } .tip { display: flex; align-items: center; justify-content: center; margin-left: 19rpx; // width: 38rpx; // height: 23rpx; padding: 5rpx 10rpx; box-sizing: border-box; background: rgba(204, 204, 204, 0); opacity: 1; border: 2rpx solid #8883F0; border-radius: 40rpx; font-size: 24rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #8883F0; } } } } .bot { margin-top: 53rpx; display: flex; flex-wrap: nowrap; align-items: center; .bot_left { width: 210rpx; height: 180rpx; margin-right: 34rpx; .echarts { // width: 210rpx; height: 200rpx; .uni-ec-canvas { width: 100%; height: 100rpx !important; display: block; // margin-top: 30rpx; } } } .bot_right { // margin-top: 50rpx; display: flex; // flex-wrap: nowrap; width: 100%; justify-content: space-between; padding-left: 80rpx; padding-right: 120rpx; box-sizing: border-box; .cont { .tit { font-size: 28rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 600; color: #262B37; line-height: 49rpx; } .txt { font-size: 24rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #262B37; } } } } } .card2 { padding-top: 40rpx; margin-top: 24rpx; width: 670rpx; height: 254rpx; background: #FFFFFF; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(53, 140, 255, 0.1); border-radius: 28rpx; .tit { margin-left: 40rpx; font-size: 35rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #8883F0; } .cont_box { margin-top: 32rpx; display: flex; flex-wrap: nowrap; justify-content: space-around; .cont { width: 25%; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; text-align: center; .top { width: 110rpx; font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #262B37; } .bot { margin-top: 20rpx; font-size: 24rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #262B37; } } } } .card3 { padding-top: 40rpx; margin-top: 24rpx; width: 670rpx; // height: 318rpx; background: #FFFFFF; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(53, 140, 255, 0.1); border-radius: 28rpx; padding-bottom: 20rpx; .tit { margin-left: 40rpx; font-size: 35rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #8883F0; } .cont_box { // padding-left: 30rpx; // padding-right: 30rpx; padding: 0 40rpx; margin-top: 32rpx; display: flex; flex-wrap: nowrap; justify-content: space-around; .cont:last-child { margin-right: 0rpx; } .cont { width: 112rpx; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; margin-right: 80rpx; .top { image { width: 56rpx; height: 56rpx; } } .bot { margin-top: 15rpx; font-size: 28rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #808080; } } } } .button { margin-left: 76rpx; margin-top: 178rpx; display: flex; justify-content: center; align-items: center; width: 520rpx; height: 104rpx; background: #8883F0; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); border-radius: 52rpx 52rpx 52rpx 52rpx; font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #FFFFFF; } } } </style>