<template> <view class="pages"> <u-navbar title="设备详情" :border-bottom="false" :background="bgc" back-icon-color="#3D3D3D" title-color='#3D3D3D' title-size='36' height='44'></u-navbar> <view class="list_item"> <view class="top"> <view class="bh">设备编号:{{obj.deviceNo == undefined ? '--' : obj.deviceNo}}</view> <view class="zx" v-if="obj.onlineStatus == 1"> <view class="yuan"></view> <view class="wz">在线</view> </view> <view class="zx" v-else> <view class="yuan" style="background-color: red;"></view> <view style="color: red;">离线</view> </view> </view> <view class="devixexq"> <view class="xiaoav"> <view class="">设备状态</view> <view style="color: rgb(18, 210, 172);;" v-if="obj.status == 2">使用中</view> <view style="color: rgb(18, 210, 172);;" v-if="obj.status == 1">正常</view> <view style="color: red;" v-if="obj.status == 3">不可用</view> </view> <view class="xiaoav"> <view class="">所属合作伙伴</view> <view class="">{{obj.agentName == undefined ? '--' : obj.agentName}}</view> </view> <view class="xiaoav"> <view class="">所属渠道商</view> <view class="">{{obj.bizManName == undefined ? '--' : obj.bizManName}}</view> </view> <view class="xiaoav"> <view class="">所属创业者</view> <view class="">{{obj.userName == undefined ? '--' : obj.userName}}</view> </view> </view> <view class="zong"> <view class="xiaoav"> <view class="">订单总数</view> <view class="">{{obj.orderCount == undefined ? '--' : obj.orderCount}}</view> </view> <view class="xiaoav"> <view class="">订单总金额</view> <view class="">¥{{obj.orderAmount == undefined ? '--' : obj.orderAmount}}</view> </view> </view> </view> <!-- 开关操作 --> <view class="lishi" v-if="type"> <view class="lt"> 开关操作 </view> <view class="rt"> <image v-if="imgflag" @click="btnimg" src="https://api.ccttiot.com/smartmeter/img/static/uccaWar4FDp37op7haWM " mode=""></image> <image v-else @click="btnimgs" src="https://api.ccttiot.com/smartmeter/img/static/ur9HRtZKY7YcxGewJARz" mode=""></image> </view> </view> <!-- 蓝牙连接 --> <view class="bluetoothbox" v-if="bluetoothflag"> <view class="stop"> 设备已离线,正在连接该设备蓝牙 </view> <view class="xtop"> 请将手机与设备尽量靠近,连接成功后可操作 </view> <image src="https://api.ccttiot.com/smartmeter/img/static/ucDphMKsozqwwllJTAKL" mode=""></image> </view> <!-- 蓝牙连接失败 --> <view class="bluetoothbox" v-if="shibaiflag"> <image class="img" src="https://api.ccttiot.com/smartmeter/img/static/uTb3vSlbcHdPMFQMBjyL" mode=""></image> <view class="one"> 蓝牙连接失败 </view> <view class="two"> 请确保手机足够靠近设备 </view> <view class="thr"> 并且设备处于上电状态 </view> <view class="anfour"> <view class="qx" @click="btnlyqx"> 取消 </view> <view class="cx" @click="topage"> 重新连接 </view> </view> </view> <view v-if="btnmsk" style="width: 100%;height: 100vh;position: fixed;top: 0;left: 0;background-color: #000;opacity: .1;z-index: 999;"> </view> <!-- 商家信息 --> <view class="sjmsg"> <view class="tit"> 商家信息 </view> <view class="jy"> <view class="one">经营场所:</view> <view class="thr">{{obj.storeName == undefined ? '--' : obj.storeName}}</view> </view> <view class="jy"> <view class="one" style="width: 180rpx;">经营地址:</view> <view class="two">{{obj.storeAddress == undefined ? '--' : obj.storeAddress}}</view> </view> <view class="jy"> <view class="one">所在房间:</view> <view class="two">{{obj.room == undefined ? '--' : obj.room}}号</view> </view> </view> <!-- 设备规格 --> <view class="sjmsg"> <view class="tit"> 设备规格 </view> <view class="jy"> <view class="one">设备名称:</view> <view class="two">{{obj.deviceName == undefined ? '--' : obj.deviceName}}</view> </view> <view class="jy"> <view class="one">设备尺寸:</view> <view class="two">{{obj.size == undefined ? '--' : obj.size}}</view> </view> <view class="jy"> <view class="one">设备面料:</view> <view class="two">{{obj.fabric == undefined ? '--' : obj.fabric}}</view> </view> <view class="jy"> <view class="one">设备填充物:</view> <view class="two">{{obj.fill == undefined ? '--' : obj.fill}}</view> </view> </view> <!-- 在线信息 --> <view class="sjmsg"> <view class="tit"> 在线信息 </view> <view class="jy"> <view class="one">首次上线时间:</view> <view class="two">{{obj.firstOnlineTime == undefined ? '--' : obj.firstOnlineTime}}</view> </view> <view class="jy"> <view class="one">最后登录时间:</view> <view class="two">{{obj.lastOnlineTime == undefined ? '--' : obj.lastOnlineTime}}</view> </view> </view> <!-- 收益明细 --> <view class="sjmsg"> <view class="tit"> 收益明细 </view> <view class="jy" v-for="(item,index) in obj.bonusList" :key="index"> <view class="one">{{item.arrivalName == undefined ? '--' : item.arrivalName}} (<text v-if="item.arrivalType == 1">平台</text> <text v-if="item.arrivalType == 2">公司</text> <text v-if="item.arrivalType == 3">合作伙伴</text> <text v-if="item.arrivalType == 4">渠道商</text> <text v-if="item.arrivalType == 5">创业者</text> <text v-if="item.arrivalType == 6">经营场所</text>){{item.point}}%</view> </view> </view> </view> </template> <script> var xBlufi = require("@/components/blufi/xBlufi.js") export default { data() { return { bgc: { backgroundColor: "#F7FAFE", }, id:'', obj:{}, setMode: null, qrResult: '', isUsing: false, bluetoothflag: false, shibaiflag: false, btnmsk: false, deviceId:'', name: '', imgflag:false, pictrim:true, type:'' } }, onLoad(option) { this.$u.get('/app/user/userInfo').then(res =>{ this.type = res.data.type }) this.id = option.deviceId this.getxq() }, // 分享到好友(会话) onShareAppMessage: function() { return { title: '创亿康', path: '/pages/index/index' } }, // 分享到朋友圈 onShareTimeline: function() { return { title: '创亿康', query: '', path: '/pages/index/index' } }, methods: { getxq(){ this.$u.get(`/app/device/${this.id}`).then(res =>{ if(res.code == 200){ this.obj = res.data this.imgflag = res.data.isUsing this.qrResult = res.data.mac } }) }, // 点击临时开关 btnimg() { if(this.pictrim == true){ //防止频繁点击 this.pictrim = false setTimeout(()=>{ this.pictrim = true },5000) if (this.obj.onlineStatus == 1) { this.$u.put(`/app/device/${this.id}/changePower?status=0`).then(res => { if (res.code == 200) { this.imgflag = false } else { uni.showToast({ title: res.msg, icon: 'none', duration: 1000 }) } }) } else { if (this.setMode == null) { this.btnmsk = false this.shibaiflag = false this.bluetoothflag = true 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 }) xBlufi.notifyInitBleEsp32({ deviceId: this.deviceId }) }, 1000) } else { let that = this uni.getNetworkType({ success(res) { if (res.networkType !== 'none') { uni.getConnectedBluetoothDevices({ success(res) { setTimeout(() => { xBlufi.notifySendCustomData({ customData: '11close' }) uni.showToast({ title: '操作成功', icon: 'success', duration: 1000 }) this.imgflag = false that.btnmsk = false that.shibaiflag = false that.bluetoothflag = false }, 1000) }, fail(err) { console.error('获取已连接蓝牙设备信息失败:', err) } }) } } }) } } }else{ uni.showToast({ title: '请不要频繁点击', icon: 'none', duration: 1000 }) } }, btnimgs() { if(this.pictrim == true){ //防止频繁点击 this.pictrim = false setTimeout(()=>{ this.pictrim = true },5000) if (this.obj.onlineStatus == 1) { ///app/bill/switchDevice?billId=${this.id}&open=true this.$u.put(`/app/device/${this.id}/changePower?status=1`).then(res => { if (res.code == 200) { this.imgflag = true } else { uni.showToast({ title: res.msg, icon: 'none', duration: 1000 }) } }) } else { if (this.setMode == null) { this.btnmsk = false this.shibaiflag = false this.bluetoothflag = true 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 }) xBlufi.notifyInitBleEsp32({ deviceId: this.deviceId }) }, 1000) } else { let that = this uni.getNetworkType({ success(res) { if (res.networkType !== 'none') { uni.getConnectedBluetoothDevices({ success(res) { setTimeout(() => { xBlufi.notifySendCustomData({ customData: '11open' }) uni.showToast({ title: '操作成功', icon: 'success', duration: 1000 }) this.imgflag = true that.btnmsk = false that.shibaiflag = false that.bluetoothflag = false }, 1000) }, fail(err) { console.error('获取已连接蓝牙设备信息失败:', err) } }) } } }) } } }else{ uni.showToast({ title: '请不要频繁点击', icon: 'none', duration: 1000 }) } }, // 蓝牙连接取消 btnlyqx() { this.shibaiflag = false this.bluetoothflag = false }, // 蓝牙重新连接 topage() { this.btnmsk = false this.shibaiflag = false this.bluetoothflag = true if (this.setMode == null) { 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 }) xBlufi.notifyInitBleEsp32({ deviceId: this.deviceId }) }, 1000) } }, // 搜索蓝牙部分 funListenDeviceMsgEvent: function(options) { switch (options.type) { case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_MY_DATA: let loadPercent = options.data; let loadText = '文件读取中' // console.log("文件读取中", options.data) break; case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA: let ver_data = this.parseCustomData(options.data) this.setMode = Math.floor(ver_data.setMode / 60) console.log("1收到设备发来的自定义数据结果:", ver_data, this.setMode) break; case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS: if (options.result) { let devicesarr = options.data devicesarr.forEach(device => { const mac = device.name.substring(5) if (device.name.slice(5, 17) == this.qrResult) { this.deviceId = device.deviceId this.name = device.name this.mac = device.name.slice(5, 17) } }) } break; case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED: // console.log("连接回调:" + JSON.stringify(options)) if (options.result) { setTimeout(() => { this.bluetoothflag = false }, 3000) uni.hideLoading(); { console.log("连接回调options.data.deviceId:" + options.data.deviceId, "连接回调options.data.name:" + options.data.name) } } else { this.shibaiflag = true this.bluetoothflag = false uni.hideLoading() } break; case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START: if (!options.result) { setTimeout(() => { uni.hideLoading() this.bluetoothflag = false }, 3000) console.log("蓝牙未开启", options) this.shibaiflag = true return } 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 = [] setTimeout(() => { this.devicesList = list }, 200) console.log('蓝牙停止搜索ok') } else { //蓝牙停止搜索失败 console.log('蓝牙停止搜索失败') } this.searching = false break } }, parseCustomData(data) { const dataArray = data.split('@'); const parsedData = {}; const prefixMap = { 'V': 'voltage', 'S': 'switchState', 'A': 'current', 'P': 'power', 'M': 'remainingPower', 'T': 'setMode', 'W': 'temperature' }; // 遍历数组并解析每个字段 for (let i = 0; i < dataArray.length; i++) { const field = dataArray[i]; for (const prefix in prefixMap) { if (field.startsWith(prefix)) { const value = field.substring(1); const propertyName = prefixMap[prefix]; parsedData[propertyName] = isNaN(parseFloat(value)) ? value : parseFloat(value); break; } } } return parsedData; }, } } </script> <style lang="scss" scoped> /deep/ .u-title { padding-bottom: 15rpx; } /deep/ .u-icon__icon { padding-bottom: 15rpx; } .bluetoothbox { width: 100%; height: 100vh; background-color: #f4f1f6; position: fixed; top: 0; left: 0; z-index: 99; text-align: center; .img { margin-top: 400rpx; width: 320rpx; height: 320rpx; } .one { font-size: 36rpx; color: #000; } .two { margin-top: 30rpx; font-size: 24rpx; color: #ccc; } .thr { margin-top: 30rpx; font-size: 28rpx; color: #ccc; } .anfour { display: flex; margin-top: 30rpx; justify-content: space-between; padding: 0 220rpx; box-sizing: border-box; .qx { width: 100rpx; height: 70rpx; line-height: 70rpx; text-align: center; border: 1px solid #3D3D3D; border-radius: 10rpx; } .cx { width: 200rpx; height: 70rpx; line-height: 70rpx; text-align: center; background-color: #8883F0; color: #fff; border-radius: 10rpx; } } .stop { font-size: 36rpx; color: #000; margin-top: 380rpx; } .xtop { margin-top: 30rpx; font-size: 24rpx; color: #ccc; } .xqx { width: 530rpx; height: 90rpx; line-height: 90rpx; border-radius: 20rpx; text-align: center; background-color: #fff; margin: auto; margin-top: 200rpx; } image { width: 500rpx; height: 500rpx; margin-top: 100rpx; } } .lishi { width: 100%; height: 110rpx; background-color: #fff; padding: 24rpx; box-sizing: border-box; margin-top: 30rpx; border-radius: 20rpx; display: flex; justify-content: space-between; align-items: center; .lt { font-size: 32rpx; } .rt { image { width: 160rpx; height: 80rpx; } } } .pages { background-color: #F7FAFE !important; height: 100%; width: 100%; padding-bottom: 100rpx !important; padding: 0 38rpx; box-sizing: border-box; .sjmsg { margin-top: 50rpx; .tit { font-size: 28rpx; color: #3D3D3D; font-weight: 600; } .jy { margin-top: 24rpx; display: flex; justify-content: space-between; .one { font-size: 28rpx; color: #808080; } .two { font-size: 28rpx; color: #3D3D3D; } .thr { font-size: 28rpx; color: #8883F0; } } } .list_item { margin-top: 32rpx; max-height: 348rpx; padding: 24rpx 28rpx; box-sizing: border-box; background-color: #fff; background: #FFFFFF; box-shadow: 0rpx 4rpx 22rpx 0rpx rgba(0, 0, 0, 0.07); border-radius: 20rpx 20rpx 20rpx 20rpx; .devixexq { display: flex; justify-content: space-between; margin-top: 14rpx; text-align: center; .xiaoav { font-size: 24rpx; color: #3D3D3D; view { margin-top: 12rpx; } } } .zong { margin-top: 30rpx; display: flex; justify-content: space-between; text-align: center; padding: 0 50rpx; box-sizing: border-box; font-size: 24rpx; color: #3D3D3D; view { margin-top: 12rpx; } } .cen { display: flex; justify-content: space-between; margin-top: 22rpx; align-items: center; border-bottom: 1px solid #D8D8D8; padding-bottom: 34rpx; box-sizing: border-box; .fj { font-size: 24rpx; color: #3D3D3D; } input { width: 346rpx; height: 38rpx; background: #F0F0F0; border-radius: 8rpx 8rpx 8rpx 8rpx; } .btn { width: 110rpx; height: 38rpx; background: #8883F0; border-radius: 8rpx 8rpx 8rpx 8rpx; text-align: center; line-height: 38rpx; font-size: 20rpx; color: #FFFFFF; } } .top { display: flex; justify-content: space-between; border-bottom: 1px solid #D8D8D8; padding-bottom: 26rpx; box-sizing: border-box; .bh { font-size: 24rpx; color: #3D3D3D; } .zx { display: flex; align-items: center; .yuan { width: 14rpx; height: 14rpx; background: #12D2AC; border-radius: 50%; margin-right: 10rpx; } .wz { font-size: 24rpx; color: #12D2AC; } } } } } </style>