SmartBeehive/page_Beehive/Beehive_detail.vue
2024-12-04 17:32:25 +08:00

2427 lines
62 KiB
Vue
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="page">
<u-navbar :title="title" :border-bottom="false" :background="bgc" title-color='#000' title-size='36'
:title-bold='true' height='45' id="navbar">
</u-navbar>
<view class="mapbox">
<map class="map" id="map" ref="map" :scale="zoomSize" :latitude="latitude" :longitude="longitude"
:show-location='true' :markers="covers"> </map>
<view class="fxmask" v-if="dtflag">
未找到位置信息
</view>
<!-- <view class="btn" @click="showwl = true">
<image src="https://api.ccttiot.com/smartmeter/img/static/uAJBChYkLJO66dYUkJ8M" mode=""></image>
</view> -->
</view>
<view class="tit">
{{obj.apiaryName == undefined ? '--' : obj.apiaryName}}-{{obj.name == undefined ? '--' : obj.name}}
<view class="sets">
<view class="tongbu" v-if="tbszflag" @click="btntbsz">
同步设置
</view>
<!-- <image @click="btnmenu" src="https://api.ccttiot.com/smartmeter/img/static/ulHBKvkXDfe9OIveIJKZ" mode=""></image> -->
<!-- 正在连接 -->
<image v-if="zcljflag" style="width: 180rpx;height: 40rpx;margin-right:20rpx" src="https://api.ccttiot.com/smartmeter/img/static/uYUoki4Tc56rzINzY2Ba" mode=""></image>
<!-- 连接成功 -->
<image v-if="ljcgflag" style="width: 40rpx;height: 40rpx;margin-right:20rpx" src="https://api.ccttiot.com/smartmeter/img/static/uhSqWj4f07z8oDMh0i8f" mode=""></image>
<!-- 未连接 -->
<image v-if="wljflag" style="width: 40rpx;height: 40rpx;margin-right:20rpx" src="https://api.ccttiot.com/smartmeter/img/static/uBp1lbXlGEMD4s5P8LGu" mode=""></image>
<image @click="btnedit" src="https://api.ccttiot.com/smartmeter/img/static/ulHBKvkXDfe9OIveIJKZ"
mode=""></image>
<view class="menu" v-if="menuflag">
<view class="menu_li" @click="btnedit">
<image src="https://api.ccttiot.com/smartmeter/img/static/uE84FLJ6hKTfgt6gxYMw" mode=""></image>
编辑信息
</view>
<!-- <view class="menu_li">
<image src="https://api.ccttiot.com/smartmeter/img/static/uBfAFsDIhqFTFKxL0PVP" mode=""></image>
投放认养
</view>
<view class="menu_li" @click="btnfx">
<image src="https://api.ccttiot.com/smartmeter/img/static/uwkwkl1CDZfUhQyZdNFY" mode=""></image>
分享认养
</view> -->
</view>
</view>
</view>
<view class="address">
<image src="https://api.ccttiot.com/smartmeter/img/static/uMOucOG04nN4PrLJfqj6" mode=""></image>
{{obj.apiaryAddress == undefined ? '--' : obj.apiaryAddress}}
</view>
<view class="weather">
<view class="weather_left">
<view class="txt">
多云 {{daily[0].tempMin == undefined ? '--' : daily[0].tempMin}}℃ ~
{{daily[0].tempMax == undefined ? '--' : daily[0].tempMax}}℃
</view>
<view class="txt" style="margin-left: 40rpx;">
{{daily[0].windDirDay == undefined ? '--' : daily[0].windDirDay }}
{{daily[0].windSpeedDay == undefined ? '--' : daily[0].windSpeedDay}}级
</view>
</view>
<view class="weather_right" @click="btngd">
更多天气 <view class="iconfont icon-xiangyou1"></view>
</view>
</view>
<view class="weather">
<view class="weather_left">
<view class="txt">
<image src="https://api.ccttiot.com/smartmeter/img/static/uZqKuAjf2idHAtkknKEU" mode=""></image>
{{obj.innerHumidity < -40 || obj.innerHumidity > 100? '--' : obj.innerHumidity}}%
</view>
<view class="txt" style="margin-left: 26rpx;">
<image src="https://api.ccttiot.com/smartmeter/img/static/uJmWnkVE9UeIhNYdPexV" mode=""></image>
{{obj.innerTemperature < -40 || obj.innerTemperature > 100? '--' : obj.innerTemperature}}℃
</view>
</view>
<view class="weather_right" style="font-weight: 400;font-size: 24rpx;color: #808080;">
更新于 {{obj.lastOnlineTime == undefined ? '--' : obj.lastOnlineTime}}
</view>
</view>
<view class="setbox">
<view class="setcard" @click="btnyj">
<view class="top">
<view class="left">
预警记录
</view>
<view class="right iconfont icon-xiangyou1">
</view>
</view>
<view class="bot">
时刻注意蜂箱变化
</view>
<view class="img">
<image src="https://api.ccttiot.com/smartmeter/img/static/uxDnt5rGbJcc6mU6W3cE" mode=""></image>
</view>
</view>
<view class="setcard" @click="btnvideo">
<view class="top">
<view class="left">
操作日志
</view>
<view class="right iconfont icon-xiangyou1">
</view>
</view>
<view class="bot">
记录蜂箱情况
</view>
<view class="img">
<image src="https://api.ccttiot.com/smartmeter/img/static/u90wdyoHsspUHR6tpifv" mode=""></image>
</view>
</view>
</view>
<view class="card_top">
<view class="name">
<!-- {{obj.name == undefined ? '--' : obj.name}} -->
箱内环境
</view>
<view class="time">
{{obj.lastOnlineTime == undefined ? '--' : obj.lastOnlineTime}}
</view>
<view class="ele" v-if="obj.onlineStatus == 1">
<image style="height: 25rpx;" v-if="obj.surplusPowerPoint <= 100 && obj.surplusPowerPoint >= 80"
src="https://api.ccttiot.com/smartmeter/img/static/uWbKPMvIuFZjzviEJjmP" mode=""></image>
<image style="height: 25rpx;" v-if="obj.surplusPowerPoint < 80 && obj.surplusPowerPoint >= 50"
src="https://api.ccttiot.com/smartmeter/img/static/u0mCXpSrvcROLCMsahNh" mode=""></image>
<image style="height: 25rpx;" v-if="obj.surplusPowerPoint < 50 && obj.surplusPowerPoint >= 20"
src="https://api.ccttiot.com/smartmeter/img/static/uGGgEPbe8ryHspQPL2o8" mode=""></image>
<image style="height: 25rpx;" v-if="obj.surplusPowerPoint < 20"
src="https://api.ccttiot.com/smartmeter/img/static/uIRhPmP5WUJaIg0nft9E" mode=""></image>
{{obj.surplusPowerPoint == undefined ? '--' : obj.surplusPowerPoint}}%
</view>
<view class="ele" v-else>
<image style="height: 25rpx;" v-if="ver_data.bat <= 100 && ver_data.bat >= 80"
src="https://api.ccttiot.com/smartmeter/img/static/uWbKPMvIuFZjzviEJjmP" mode=""></image>
<image style="height: 25rpx;" v-if="ver_data.bat < 80 && ver_data.bat >= 50"
src="https://api.ccttiot.com/smartmeter/img/static/u0mCXpSrvcROLCMsahNh" mode=""></image>
<image style="height: 25rpx;" v-if="ver_data.bat < 50 && ver_data.bat >= 20"
src="https://api.ccttiot.com/smartmeter/img/static/uGGgEPbe8ryHspQPL2o8" mode=""></image>
<image style="height: 25rpx;" v-if="ver_data.bat < 20"
src="https://api.ccttiot.com/smartmeter/img/static/uIRhPmP5WUJaIg0nft9E" mode=""></image>
{{this.point == undefined ? '--' : this.point}}%
</view>
</view>
<view class="echarts_box" v-if="xnwd" @click="btnec(1)">
<view class="echarts_top">
<view class="top_left">
温度
<image style="width: 36rpx;height: 34rpx;"
src="https://api.ccttiot.com/smartmeter/img/static/utoKXhZBoejfRZwNUMP9" mode=""></image>
</view>
<view class="top_cont" v-if="obj.onlineStatus == 1">
当前 {{obj.innerTemperature == undefined ? '--' : obj.innerTemperature}}℃
</view>
<view class="top_cont" v-else>
当前 {{ver_data.temp_n == undefined ? '--' : ver_data.temp_n}}℃
</view>
<view class="top_right">
<view style="width: 1rpx;">
</view>
<view class="txt">
历史走势<view class="iconfont icon-xiangyou1"></view>
</view>
</view>
</view>
<view class="echarts">
<uni-ec-canvas class="uni-ec-canvas" id="uni-ec-canvas" ref="canvas1" canvas-id="uni-ec-canvas"
:ec="ec">
</uni-ec-canvas>
</view>
</view>
<view class="echarts_box" v-if="xnsd" @click="btnec(2)">
<view class="echarts_top">
<view class="top_left">
湿度
<image style="width: 30rpx;height: 32rpx;"
src="https://api.ccttiot.com/smartmeter/img/static/una6Kbd2gdBZ9gG6lg44" mode=""></image>
</view>
<view class="top_cont" v-if="obj.onlineStatus == 1">
当前 {{obj.innerHumidity == undefined ? '--' : obj.innerHumidity}}%
</view>
<view class="top_cont" v-else>
当前 {{ver_data.hp_n == undefined ? '--' : ver_data.hp_n}}%
</view>
<view class="top_right">
<view style="width: 1rpx;">
</view>
<view class="txt">
历史走势<view class="iconfont icon-xiangyou1"></view>
</view>
</view>
</view>
<view class="echarts">
<uni-ec-canvas class="uni-ec-canvas" id="uni-ec-canvas" ref="canvas2" canvas-id="uni-ec-canvas"
:ec="ec">
</uni-ec-canvas>
</view>
</view>
<view class="echarts_box" v-if="height" @click="btnec(3)">
<view class="echarts_top">
<view class="top_left">
重量
<image style="width: 28rpx;height: 33rpx;"
src="https://api.ccttiot.com/smartmeter/img/static/uk7CvwzeU0ukxvS9cBtD" mode=""></image>
</view>
<view class="top_cont" v-if="obj.onlineStatus == 1">
当前 {{obj.totalWeight == 999999 ? '--' : (obj.totalWeight / 1000).toFixed(1)}}kg
</view>
<view class="top_cont" v-else>
当前 {{ver_data.weight == undefined ? '--' : (ver_data.weight / 1000).toFixed(1)}}kg
</view>
<view class="top_right">
<view style="width: 1rpx;">
</view>
<view class="txt">
历史走势<view class="iconfont icon-xiangyou1"></view>
</view>
</view>
</view>
<view class="echarts">
<uni-ec-canvas class="uni-ec-canvas" id="uni-ec-canvas" ref="canvas3" canvas-id="uni-ec-canvas"
:ec="ec">
</uni-ec-canvas>
</view>
</view>
<view class="echarts_box" v-if="io" @click="btnec(4)">
<view class="echarts_top">
<view class="top_left">
进出量
<image style="width: 33rpx;height: 33rpx;"
src="https://api.ccttiot.com/smartmeter/img/static/uhsU6Y1K35jxA4aRauzy" mode=""></image>
</view>
<view class="top_cont" v-if="obj.onlineStatus == 1">
当前 {{obj.ioCountDay == undefined ? '--' : obj.ioCountDay}}只
</view>
<view class="top_cont" v-else>
当前 {{ver_data.out_day == undefined ? '--' : ver_data.out_day}}只
</view>
<view class="top_right">
<view style="width: 1rpx;">
</view>
<view class="txt">
历史走势<view class="iconfont icon-xiangyou1"></view>
</view>
</view>
</view>
<view class="echarts">
<uni-ec-canvas class="uni-ec-canvas" id="uni-ec-canvas" ref="canvas4" canvas-id="uni-ec-canvas"
:ec="ec">
</uni-ec-canvas>
</view>
</view>
<view class="echarts_box" v-if="sypl" @click="btnec(5)">
<view class="echarts_top">
<view class="top_left">
频率
<image style="width: 38rpx;height: 32rpx;"
src="https://api.ccttiot.com/smartmeter/img/static/up9IaGzSg1RKhIZz3V7a" mode=""></image>
</view>
<view class="top_cont" v-if="obj.onlineStatus == 1">
当前 {{obj.volume / 1000 == 0 ? obj.volume : (obj.volume / 1000).toFixed(1)}}khz
</view>
<view class="top_cont" v-else>
当前 {{(ver_data.MIC !== undefined && !isNaN(ver_data.MIC) && ver_data.MIC / 1000 === 0) ? ver_data.MIC : ((ver_data.MIC !== undefined && !isNaN(ver_data.MIC)) ? (ver_data.MIC / 1000).toFixed(1) : '--')}}khz
</view>
<view class="top_right">
<view style="width: 1rpx;">
</view>
<view class="txt">
历史走势<view class="iconfont icon-xiangyou1"></view>
</view>
</view>
</view>
<view class="echarts">
<uni-ec-canvas class="uni-ec-canvas" id="uni-ec-canvas" ref="canvas5" canvas-id="uni-ec-canvas"
:ec="ec">
</uni-ec-canvas>
</view>
</view>
<view class="echarts_box" v-if="eyht" @click="btnec(6)">
<view class="echarts_top">
<view class="top_left">
二氧化碳
<image style="width: 36rpx;height: 38rpx;"
src="https://api.ccttiot.com/smartmeter/img/static/uAw3ZCXnMbekNML7CTSu" mode=""></image>
</view>
<view class="top_cont" v-if="obj.onlineStatus == 1">
当前 {{obj.innerCo2}}ppm
</view>
<view class="top_cont" v-else>
当前 {{ver_data.CO2 == undefined ? '--' : ver_data.CO2}}ppm
</view>
<view class="top_right">
<view style="width: 1rpx;">
</view>
<view class="txt">
历史走势<view class="iconfont icon-xiangyou1"></view>
</view>
</view>
</view>
<view class="echarts">
<uni-ec-canvas class="uni-ec-canvas" id="uni-ec-canvas" ref="canvas6" canvas-id="uni-ec-canvas"
:ec="ec">
</uni-ec-canvas>
</view>
</view>
<view class="weather_info" v-show="showtq">
<view class="top">
<view class="weather_info_tit">
未来7日天气预知
</view>
<image src="https://api.ccttiot.com/smartmeter/img/static/uQK4q99a1Qb7LFD6O3Hw" mode=""
@click="showtq = false"></image>
</view>
<view class="top" style="margin-top: 14rpx;">
<view class="weather_add">
蜂场位置:<span style="color: #42A5F5;">{{obj.apiaryCounty == undefined ? '--' : obj.apiaryCounty}}</span>
</view>
<view class="up_time">
{{daytime}}更新
</view>
</view>
<view class="weather_cont">
<view class="weather_li" v-for="(item,index) in daily" :key="index">
<view class="data">
{{item.fxDate.slice(5)}}
</view>
<view class="week">
{{item.textDay}}
</view>
<view class="week_weather" >
{{item.windDirDay}}
</view>
</view>
</view>
<view class="echarts_box">
<uni-ec-canvas class="uni-ec-canvas" id="uni-ec-canvas" ref="canvas7" canvas-id="uni-ec-canvas"
:ec="ec">
</uni-ec-canvas>
</view>
</view>
<view class="bottom_box">
<view class="type_li" @click="btndow(1)">
去皮
</view>
<view class="type_li" @click="btndow(2)" v-if="beep">
蜂鸣寻箱
</view>
<view class="type_li" :id="fskx == '关' ? 'active' : ''" @click="btndow(3)">
风扇{{fskx}}
</view>
<view class="type_li" :id="jrkg == '关' ? 'active' : ''" @click="btndow(4)">
加热{{jrkg}}
</view>
</view>
<view class="mask" v-if="showtq"></view>
</view>
</template>
<script>
var xBlufi = require("@/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 {
menuflag: false,
ec: {
lazyLoad: true
},
bgc: {
backgroundColor: " #FAFDFD",
},
title: "蜂箱详情",
latitude: '7',
longitude: '',
isMap: false,
zoomSize: 15,
markers: [{
id: 1,
latitude: 39.90469,
longitude: 116.40717,
title: 'Marker1'
}, {
id: 2,
latitude: 39.90969,
longitude: 116.41217,
title: 'Marker2'
}],
chartday: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
chartData: [120, 200, 150, 80, 70, 110, 130],
showtq: false,
beehiveId: '',
obj: {},
daily: [],
fskx: '关',
jrkg: '关',
chartData1: [],
chartData2: [],
chartData3: [],
chartData4: [],
chartData5: [],
chartData6: [],
chartData7: [],
chartData8: [],
yeartime: {
year: '',
month: '',
day: ''
},
yeartimes: {
year: '',
month: '',
day: ''
},
daytime: '',
covers: [],
dtflag: false,
modelTags: [],
height: false,
io: false,
xnwd: false,
xnsd: false,
sypl: false,
eyht: false,
beep: false,
timer: null,
mac:'',
devicesList:[],
ver_data:{},
zcljflag:false,
ljcgflag:false,
wljflag:false,
tbszflag:false,
shezhiobj:{},
scdeviceflag:true,
point:''
}
},
onLoad(option) {
this.beehiveId = option.beehiveId
},
onShow() {
this.zcljflag = false
this.wljflag = false
this.ljcgflag = false
this.tbszflag = false
setTimeout(() => {
this.$refs.canvas1.init(this.initChart)
this.$refs.canvas2.init(this.initChart2)
this.$refs.canvas3.init(this.initChart3)
this.$refs.canvas4.init(this.initChart4)
this.$refs.canvas5.init(this.initChart5)
this.$refs.canvas6.init(this.initChart6)
this.$refs.canvas7.init(this.initChart7)
}, 1000)
this.getobj()
let now = new Date();
let previousDay = new Date(now)
this.yeartime.year = now.getFullYear()
this.yeartime.month = String(previousDay.getMonth() + 1).padStart(2, '0')
this.yeartime.day = String(now.getDate()).padStart(2, '0')
previousDay.setDate(now.getDate() - 7)
this.yeartimes.year = previousDay.getFullYear()
this.yeartimes.month = String(previousDay.getMonth() + 1).padStart(2, '0')
this.yeartimes.day = String(previousDay.getDate()).padStart(2, '0')
this.getchartData1()
this.getchartData2()
this.getchartData3()
this.getchartData4()
this.getchartData5()
this.getchartData6()
},
onUnload() {
// 页面即将销毁时销毁定时器
this.clearTimer()
},
methods: {
// 获取设置数据值
getinfo() {
this.$u.get(`farm/userSetting/my`).then(res => {
if (res.code == 200) {
this.shezhiobj = res.data
// miteInterval: '', //除螨间隔时间(天)
// minPower: '', //电量保护最低电量%
// minHeat: '', //加热板开始工作的最低箱外温度℃
// maxHeat: '', //加热板停止工作的箱内外温差℃
// maxFan: '', //风扇开始工作的最高箱内温度℃
// minFan: '', //风扇停止工作的最低箱内温度℃
// minCo2: '', //风扇停止工作的最低二氧化碳浓度℃
// maxCo2: '', //风扇开始工作的最高二氧化碳浓度℃
}
})
},
// 连接蓝牙成功 点击同步设置
btntbsz(){
// xBlufi.notifySendCustomData({
//       customData: ""
// })
},
// 根据蜂箱id获取设备信息
getobj() {
this.$u.get(`/app/beehive/${this.beehiveId}`).then(res => {
if (res.code == 200) {
if(res.data.onlineStatus == 0){ //判断蜂箱离线时
this.mac = res.data.mac
this.Binddevice() //执行连接蓝牙方法
this.getinfo() //获取设置数值
}else{
// 每次进入执行定时器
this.startTimer()
}
this.obj = res.data
if(res.data.lat == null || res.data.lng == null){
this.latitude = 27.100845
this.longitude = 120.25469
}else{
this.latitude = res.data.lat
this.longitude = res.data.lng
}
this.modelTags = res.data.modelTags
this.modelTags.forEach(item => {
if (item == 1) {
this.height = true
} else if (item == 2) {
this.io = true
} else if (item == 3) {
this.xnwd = true
this.xnsd = true
} else if (item == 10) {
this.sypl = true
} else if (item == 9) {
this.eyht = true
} else if (item == 13) {
this.beep = true
}
})
if (res.data.enableFan == false) {
this.fskx = '关'
} else {
this.fskx = '开'
}
if (res.data.enableHeat == false) {
this.jrkg = '关'
} else {
this.jrkg = '开'
}
this.dtflag = false
this.covers.push({
id: parseFloat(res.data.beehiveId),
latitude: this.latitude,
longitude: this.longitude,
width: 30,
height: 33,
iconPath: 'https://api.ccttiot.com/smartmeter/img/static/ukbyhyrDcp3VzgyeJo2G',
})
this.gettq()
} else if(res.code == 401){
uni.showModal({
title: '温馨提示',
content: '您还未登录,是否先去登录',
showCancel: true ,
success: function(res) {
if (res.confirm) {
uni.reLaunch({
url:'/pages/login/login'
})
}
}
})
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
},
// 蓝牙连接
Binddevice() {
this.zcljflag = true
this.wljflag = false
this.ljcgflag = false
xBlufi.initXBlufi(1);
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': true
})
// 两秒后停止蓝牙搜索
setTimeout(() => {
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
setTimeout(() => {
if (this.devicesList.length == 0) {
this.zcljflag = false
this.wljflag = true
this.ljcgflag = false
// let that = this
// uni.showModal({
// title: '温馨提示',
// content: '暂未发现蜂箱设备,是否重新搜索连接',
// showCancel: true ,//是否显示取消按钮
// success:function(res) {
// that.Binddevice()
// }
// })
} else {
let uniqueDevicesList = Array.from(new Set(this.devicesList))
this.devicesList = uniqueDevicesList
console.log(this.devicesList,'列表');
// 初始化一个标志变量,用于跟踪是否有匹配
let isMatched = false
// 遍历设备列表
this.devicesList.forEach(device => {
// 从设备名称中提取MAC地址假设MAC地址是设备名称的最后12个字符
let macFromName = device.name.substring(device.name.length - 12)
console.log(macFromName,this.mac)
// 检查MAC地址是否匹配
if (macFromName == this.mac) {
this.createBLEConnection(device)
console.log('对比正确')
isMatched = true // 设置标志为true表示有匹配
} else {
console.log('对比错误')
}
})
// 循环结束后检查是否有匹配
if (!isMatched) {
this.zcljflag = false
this.wljflag = true
this.ljcgflag = false
let that = this
uni.showModal({
title: '温馨提示',
content: '暂未发现蜂箱设备,是否重新搜索连接',
showCancel: true ,
success: function(res) {
if (res.confirm) {
that.Binddevice()
}
}
})
}else{
this.zcljflag = false
this.wljflag = false
this.ljcgflag = true
}
}
}, 200)
}, 3000)
},
// 收取蓝牙信息
createBLEConnection(e) {
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
console.log(e, '蓝牙信息')
const deviceId = e.deviceId
let name = e.name;
xBlufi.notifyConnectBle({
isStart: true,
deviceId: e.deviceId,
name
})
},
// 处理蓝牙函数
funListenDeviceMsgEvent: function(options) {
let that = this;
switch (options.type) {
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
if (options.result) {
let devicesarr = options.data
devicesarr.forEach(device => {
this.devicesList.push(device);
let uniqueDevicesList = Array.from(new Set(this.devicesList));
// 将去重后的数组重新赋值给 this.devicesList
this.devicesList = uniqueDevicesList
})
}
break
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
console.log("连接回调:" + JSON.stringify(options))
uni.showToast({
title: '连接成功',
icon: 'success',
duration:2000
})
this.zcljflag = false
this.wljflag = false
this.ljcgflag = true
this.tbszflag = true
{
xBlufi.notifyInitBleEsp32({
deviceId: options.data.deviceId
})
}
break
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_MY_DATA:
this.loadPercent = options.data;
this.loadText = '文件读取中'
console.log("文件读取中", options.data);
break
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
let dataString = options.data
// 移除字符串开头和结尾的花括号
dataString = dataString.slice(1, -1);
// 使用正则表达式和 split 方法将字符串分割成键值对
let pairs = dataString.match(/([^,]+)/g);
let obj = {};
// 遍历键值对数组,并将它们添加到对象中
pairs.forEach(pair => {
let [key, value] = pair.split(':');
obj[key] = !isNaN(value) ? parseFloat(value) : value;
})
this.ver_data = obj
if(this.ver_data.bat != '' || this.ver_data.bat != undefined){ //判断是否接受到设备数据
this.point = (1 - (this.obj.modelMaxV - this.ver_data.bat) / (this.obj.modelMaxV -this.obj.modelMinV)) * 100
if(this.scdeviceflag == true){ //判断是否已经上传过
let data = {
beehiveId:this.beehiveId,
sys:this.ver_data
}
this.$u.put(`app/beehive/btUpload`,data).then(res => {
if(res.code == 200){
this.scdeviceflag = false //一次性只上传一次
}else{
this.scdeviceflag = false //一次性只上传一次
}
})
}
}
console.log('收取到的蓝牙数据',this.ver_data,options.data)
break
case xBlufi.XBLUFI_TYPE.TYPE_INIT_ESP32_RESULT:
if (options.result) {
console.log('初始化成功')
} else {
console.log('初始化失败')
this.zcljflag = false
this.wljflag = true
this.ljcgflag = false
break
}
break
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
if (!options.result) {
this.zcljflag = false
this.wljflag = true
this.ljcgflag = false
uni.showToast({
title: '蓝牙未开启',
icon: 'none',
duration: 3000
})
return
}
break
case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED: {
console.log('蓝牙异常断开', options.result)
}
break;
}
},
// 跳转天气
btntqxq(){
},
// 每30秒上报数据
startTimer() {
if (this.timer) {
clearInterval(this.timer); // 如果已存在,先清除
}
this.timer = setInterval(() => {
// 这里写你的定时任务
this.$u.put(`/app/beehive/iot/${this.beehiveId}/upload`).then(res => {
if (res.code == 200) {
setTimeout(() => {
this.$refs.canvas1.init(this.initChart)
this.$refs.canvas2.init(this.initChart2)
this.$refs.canvas3.init(this.initChart3)
this.$refs.canvas4.init(this.initChart4)
this.$refs.canvas5.init(this.initChart5)
this.$refs.canvas6.init(this.initChart6)
this.$refs.canvas7.init(this.initChart7)
}, 1000)
this.getobj()
let now = new Date();
let previousDay = new Date(now)
this.yeartime.year = now.getFullYear()
this.yeartime.month = String(previousDay.getMonth() + 1).padStart(2, '0')
this.yeartime.day = String(now.getDate()).padStart(2, '0')
previousDay.setDate(now.getDate() - 7)
this.yeartimes.year = previousDay.getFullYear()
this.yeartimes.month = String(previousDay.getMonth() + 1).padStart(2, '0')
this.yeartimes.day = String(previousDay.getDate()).padStart(2, '0')
this.getchartData1()
this.getchartData2()
this.getchartData3()
this.getchartData4()
this.getchartData5()
this.getchartData6()
}
})
}, 30000); // 30秒
},
clearTimer() {
// 清除定时器
if (this.timer) {
clearInterval(this.timer);
this.timer = null; // 清除引用,避免内存泄漏
}
},
// 跳转图标详情
btnec(num) {
uni.navigateTo({
url: '/page_Beehive/Beehive_ec?num=' + num + '&beehiveId=' + this.beehiveId
})
},
// 点击跳转到操作详情
btnvideo() {
const user = uni.getStorageSync('user')
if(this.obj.userId == user.userId){
if(this.obj.apiaryId == '' || this.obj.apiaryId == null){
let that = this
uni.showModal({
title: "提示",
content: '请将该设备绑定蜂场在进行此操作',
success: function(res) {
if (res.confirm) {
uni.navigateTo({
url:'/page_Beehive/add_Beehive?tit=' + '修改蜂箱' + '&beehiveId=' + that.beehiveId
})
}
}
})
}else{
uni.navigateTo({
url: '/page_Beehive/Beehive_log?apiaryId=' + this.obj.apiaryId + ' &name=' + this.obj.apiaryName
})
}
}else{
uni.showToast({
title: '您没有权限操作',
icon: 'none',
duration: 2000
})
}
},
// 点击展开天气
btngd() {
// this.gettq()
setTimeout(() => {
this.$refs.canvas7.init(this.initChart7)
}, 200);
this.showtq = true
},
// 点击跳转预警
btnyj() {
const user = uni.getStorageSync('user')
if(this.obj.userId == user.userId){
uni.navigateTo({
url: '/page_Beehive/Beehive_woring?apiaryId=' + this.beehiveId + '&tit=' + '蜂箱预警记录'
})
}else{
uni.showToast({
title: '您没有权限操作',
icon: 'none',
duration: 2000
})
}
},
// 点击编辑
btnedit() {
const user = uni.getStorageSync('user')
if(this.obj.userId == user.userId){
this.menuflag = false
uni.navigateTo({
url: '/page_Beehive/add_Beehive?tit=' + '修改蜂箱' + '&beehiveId=' + this.beehiveId
})
}else{
uni.showToast({
title: '您没有权限操作',
icon: 'none',
duration: 2000
})
}
},
btnfx() {
this.menuflag = false
uni.navigateTo({
url: '/page_Beehive/share_Beehive'
})
},
btnmenu() {
if (this.menuflag == true) {
this.menuflag = false
} else {
this.menuflag = true
}
},
// 温度图表
getchartData1() {
let time = this.yeartime.year + '-' + this.yeartime.month + '-' + this.yeartime.day
let times = this.yeartimes.year + '-' + this.yeartimes.month + '-' + this.yeartimes.day
this.$u.get(`/farmer/report/tempN?dateRange=${times},${time}&beehiveId=${this.beehiveId}`).then(res => {
if (res.code == 200) {
this.chartData1 = res.data.map(item => item.value)
}
})
},
// 湿度图表
getchartData2() {
let time = this.yeartime.year + '-' + this.yeartime.month + '-' + this.yeartime.day
let times = this.yeartimes.year + '-' + this.yeartimes.month + '-' + this.yeartimes.day
this.$u.get(`/farmer/report/hpN?dateRange=${times},${time}&beehiveId=${this.beehiveId}`).then(res => {
if (res.code == 200) {
this.chartData2 = res.data.map(item => item.value)
}
})
},
// 重量图表
getchartData3() {
let time = this.yeartime.year + '-' + this.yeartime.month + '-' + this.yeartime.day
let times = this.yeartimes.year + '-' + this.yeartimes.month + '-' + this.yeartimes.day
this.$u.get(`/farmer/report/weightDay?dateRange=${times},${time}&beehiveId=${this.beehiveId}`).then(
res => {
if (res.code == 200) {
this.chartData3 = res.data.map(item => item.value)
}
})
},
// 进出量图表
getchartData4() {
let time = this.yeartime.year + '-' + this.yeartime.month + '-' + this.yeartime.day
let times = this.yeartimes.year + '-' + this.yeartimes.month + '-' + this.yeartimes.day
this.$u.get(`/farmer/report/ioCount?dateRange=${times},${time}&beehiveId=${this.beehiveId}`).then(res => {
if (res.code == 200) {
this.chartData4 = res.data.map(item => item.value)
}
})
},
// 频率图表
getchartData5() {
let time = this.yeartime.year + '-' + this.yeartime.month + '-' + this.yeartime.day
let times = this.yeartimes.year + '-' + this.yeartimes.month + '-' + this.yeartimes.day
this.$u.get(`/farmer/report/mic?dateRange=${times},${time}&beehiveId=${this.beehiveId}`).then(res => {
if (res.code == 200) {
this.chartData5 = res.data.map(item => item.value)
}
})
},
// 二氧化碳图表
getchartData6() {
let time = this.yeartime.year + '-' + this.yeartime.month + '-' + this.yeartime.day
let times = this.yeartimes.year + '-' + this.yeartimes.month + '-' + this.yeartimes.day
this.$u.get(`/farmer/report/co2?dateRange=${times},${time}&beehiveId=${this.beehiveId}`).then(res => {
if (res.code == 200) {
this.chartData6 = res.data.map(item => item.value)
}
})
},
// 点击进行蜂箱操作
btndow(num) {
const user = uni.getStorageSync('user')
if(this.obj.userId == user.userId){
if (num == 1) {
if(this.obj.onlineStatus == 0){
xBlufi.notifySendCustomData({
      customData: "11clear_weight@"
 })
uni.showToast({
title: '去皮成功',
icon: 'success',
duration: 2000
})
}else{
this.$u.put(`farm/beehive/iot/${this.beehiveId}/clearWeight`).then(res => {
if (res.code == 200) {
uni.showToast({
title: '去皮成功',
icon: 'success',
duration: 2000
})
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
}
} else if (num == 2) {
if(this.obj.onlineStatus == 0){
xBlufi.notifySendCustomData({
      customData: "11beep11@" + 10
 })
uni.showToast({
title: '响铃成功',
icon: 'success',
duration: 2000
})
}else{
this.$u.put(`farm/beehive/iot/${this.beehiveId}/buzzer`).then(res => {
if (res.code == 200) {
uni.showToast({
title: '响铃成功',
icon: 'success',
duration: 2000
})
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
}
} else if (num == 3) {
if (this.fskx == '关') {
if(this.obj.onlineStatus == 0){
xBlufi.notifySendCustomData({
    customData: '11fan100@'
})
this.fskx = '开'
uni.showToast({
title: '风扇开启成功',
icon: 'success',
duration: 2000
})
}else{
this.$u.put(`farm/beehive/iot/${this.beehiveId}/fan?open=true`).then(res => {
if (res.code == 200) {
if (this.fskx == '关') {
this.fskx = '开'
} else {
this.fskx = '关'
}
uni.showToast({
title: '风扇开启成功',
icon: 'success',
duration: 2000
})
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
}
} else {
if(this.obj.onlineStatus == 0){
xBlufi.notifySendCustomData({
    customData: "11fan0@"
})
this.fskx = '关'
uni.showToast({
title: '风扇关闭成功',
icon: 'success',
duration: 2000
})
}else{
this.$u.put(`farm/beehive/iot/${this.beehiveId}/fan?open=false`).then(res => {
if (res.code == 200) {
if (this.fskx == '关') {
this.fskx = '开'
} else {
this.fskx = '关'
}
uni.showToast({
title: '风扇关闭成功',
icon: 'success',
duration: 2000
})
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
}
}
} else if (num == 4) {
if (this.jrkg == '关') {
if(this.obj.onlineStatus == 0){
xBlufi.notifySendCustomData({
    customData: "11hot100@"
})
this.jrkg = '开'
uni.showToast({
title: '加热开启成功',
icon: 'success',
duration: 2000
})
}else{
this.$u.put(`farm/beehive/iot/${this.beehiveId}/heat?open=true`).then(res => {
if (res.code == 200) {
if (this.jrkg == '关') {
this.jrkg = '开'
} else {
this.jrkg = '关'
}
uni.showToast({
title: '加热开启成功',
icon: 'success',
duration: 2000
})
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
}
} else {
if(this.obj.onlineStatus == 0){
xBlufi.notifySendCustomData({
    customData: "11hot0@"
})
this.jrkg = '关'
uni.showToast({
title: '加热关闭成功',
icon: 'success',
duration: 2000
})
}else{
this.$u.put(`farm/beehive/iot/${this.beehiveId}/heat?open=false`).then(res => {
if (res.code == 200) {
if (this.jrkg == '关') {
this.jrkg = '开'
} else {
this.jrkg = '关'
}
uni.showToast({
title: '加热关闭成功',
icon: 'success',
duration: 2000
})
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
}
}
}
}else{
uni.showToast({
title: '您没有权限操作',
icon: 'none',
duration: 2000
})
}
},
// 请求天气
gettq() {
this.$u.get(`weather/7d?location=${this.longitude},${this.latitude}`).then(res => {
if (res.code == 200) {
this.daily = res.data.daily
this.chartData7 = res.data.daily.map(item => item.tempMin)
this.chartData8 = res.data.daily.map(item => item.tempMax)
this.daytime = res.data.updateTime
let date = new Date(this.daytime);
let formattedDate = this.formatDate(date)
this.daytime = formattedDate
}
})
},
// 进行时间解析
formatDate(date) {
let year = date.getFullYear()
let month = String(date.getMonth() + 1).padStart(2, '0')
let day = String(date.getDate()).padStart(2, '0')
let hours = String(date.getHours()).padStart(2, '0')
let minutes = String(date.getMinutes()).padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}`
},
// 温度
initChart(canvas, width, height, canvasDpr) {
let that = this
const option = {
grid: {
left: '4%',
right: '4%',
bottom: '3%',
top: '4%',
containLabel: true
},
xAxis: {
show: true,
type: 'category',
boundaryGap: false,
axisLine: {
show: false // 隐藏X轴线
},
axisTick: {
show: false // 隐藏X轴刻度
},
axisLabel: {
show: false // 隐藏X轴标签
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
rotate: 0,
},
splitLine: {
show: false,
},
// data: that.chartday,
},
yAxis: {
show: true,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
formatter: function(value) {
// 保留两位小数没有小数时显示00
return value + '℃'
},
},
splitLine: {
show: true, // 显示X轴网格线
lineStyle: {
type: 'dashed', // 设置网格线为虚线
color: '#ccc', // 可以设置虚线的颜色
width: 1 // 可以设置虚线的宽度
}
}
},
visualMap: {
type: 'piecewise',
show: false,
dimension: 0,
seriesIndex: 0,
pieces: [{
gt: 1,
lt: 3,
color: 'RGBA(255, 241, 201, 1)',
},
{
gt: 5,
lt: 7,
color: 'RGBA(255, 241, 201, 1)',
},
],
},
series: [{
type: 'line',
smooth: 0.6,
symbol: 'none',
lineStyle: {
color: '#FFE28C',
width: 1,
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#FFF1C9'
}, ]),
},
},
data: that.chartData1,
}],
};
chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: canvasDpr
})
option.series[0].data = that.chartData1
canvas.setChart(chart)
chart.setOption(option)
return chart
},
// 湿度
initChart2(canvas, width, height, canvasDpr) {
let that = this
const option = {
grid: {
left: '4%',
right: '4%',
bottom: '3%',
top: '4%',
containLabel: true
},
xAxis: {
show: true,
type: 'category',
boundaryGap: false,
axisLine: {
show: false // 隐藏X轴线
},
axisTick: {
show: false // 隐藏X轴刻度
},
axisLabel: {
show: false // 隐藏X轴标签
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
rotate: 0,
},
splitLine: {
show: false,
},
// data: that.chartday,
},
yAxis: {
show: true,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
formatter: function(value) {
// 保留两位小数没有小数时显示00
return value + '%'
},
},
splitLine: {
show: true, // 显示X轴网格线
lineStyle: {
type: 'dashed', // 设置网格线为虚线
color: '#ccc', // 可以设置虚线的颜色
width: 1 // 可以设置虚线的宽度
}
}
},
visualMap: {
type: 'piecewise',
show: false,
dimension: 0,
seriesIndex: 0,
pieces: [{
gt: 1,
lt: 3,
color: 'RGBA(255, 241, 201, 1)',
},
{
gt: 5,
lt: 7,
color: 'RGBA(255, 241, 201, 1)',
},
],
},
series: [{
type: 'line',
smooth: 0.6,
symbol: 'none',
lineStyle: {
color: '#FFE28C',
width: 1,
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#FFF1C9'
}, ]),
},
},
data: that.chartData2,
}],
};
chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: canvasDpr
})
option.series[0].data = that.chartData2
canvas.setChart(chart)
chart.setOption(option)
return chart
},
//重量
initChart3(canvas, width, height, canvasDpr) {
let that = this
const option = {
grid: {
left: '4%',
right: '4%',
bottom: '3%',
top: '4%',
containLabel: true
},
xAxis: {
show: true,
type: 'category',
boundaryGap: false,
axisLine: {
show: false // 隐藏X轴线
},
axisTick: {
show: false // 隐藏X轴刻度
},
axisLabel: {
show: false // 隐藏X轴标签
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
rotate: 0,
},
splitLine: {
show: false,
},
// data: that.chartday,
},
yAxis: {
show: true,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
formatter: function(value) {
// 保留两位小数没有小数时显示00
return (value / 1000).toFixed(1) + 'Kg'
},
},
splitLine: {
show: true, // 显示X轴网格线
lineStyle: {
type: 'dashed', // 设置网格线为虚线
color: '#ccc', // 可以设置虚线的颜色
width: 1 // 可以设置虚线的宽度
}
}
},
visualMap: {
type: 'piecewise',
show: false,
dimension: 0,
seriesIndex: 0,
pieces: [{
gt: 1,
lt: 3,
color: 'RGBA(255, 241, 201, 1)',
},
{
gt: 5,
lt: 7,
color: 'RGBA(255, 241, 201, 1)',
},
],
},
series: [{
type: 'line',
smooth: 0.6,
symbol: 'none',
lineStyle: {
color: '#FFE28C',
width: 1,
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#FFF1C9'
}, ]),
},
},
data: that.chartData3,
}],
};
chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: canvasDpr
})
option.series[0].data = that.chartData3
canvas.setChart(chart)
chart.setOption(option)
return chart
},
// 进出量
initChart4(canvas, width, height, canvasDpr) {
let that = this
const option = {
grid: {
left: '4%',
right: '4%',
bottom: '3%',
top: '4%',
containLabel: true
},
xAxis: {
show: true,
type: 'category',
boundaryGap: false,
axisLine: {
show: false // 隐藏X轴线
},
axisTick: {
show: false // 隐藏X轴刻度
},
axisLabel: {
show: false // 隐藏X轴标签
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
rotate: 0,
},
splitLine: {
show: false,
},
// data: that.chartday,
},
yAxis: {
show: true,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
formatter: function(value) {
// 保留两位小数没有小数时显示00
return Math.ceil(value) + '只'
},
},
splitLine: {
show: true, // 显示X轴网格线
lineStyle: {
type: 'dashed', // 设置网格线为虚线
color: '#ccc', // 可以设置虚线的颜色
width: 1 // 可以设置虚线的宽度
}
}
},
visualMap: {
type: 'piecewise',
show: false,
dimension: 0,
seriesIndex: 0,
pieces: [{
gt: 1,
lt: 3,
color: 'RGBA(255, 241, 201, 1)',
},
{
gt: 5,
lt: 7,
color: 'RGBA(255, 241, 201, 1)',
},
],
},
series: [{
type: 'line',
smooth: 0.6,
symbol: 'none',
lineStyle: {
color: '#FFE28C',
width: 1,
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#FFF1C9'
}, ]),
},
},
data: that.chartData4,
}],
};
chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: canvasDpr
})
option.series[0].data = that.chartData4
canvas.setChart(chart)
chart.setOption(option)
return chart
},
// 频率
initChart5(canvas, width, height, canvasDpr) {
let that = this
const option = {
grid: {
left: '4%',
right: '4%',
bottom: '3%',
top: '4%',
containLabel: true
},
xAxis: {
show: true,
type: 'category',
boundaryGap: false,
axisLine: {
show: false // 隐藏X轴线
},
axisTick: {
show: false // 隐藏X轴刻度
},
axisLabel: {
show: false // 隐藏X轴标签
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
rotate: 0,
},
splitLine: {
show: false,
},
// data: that.chartday,
},
yAxis: {
show: true,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
formatter: function(value) {
// 保留两位小数没有小数时显示00
return value / 1000 + 'khz'
},
},
splitLine: {
show: true, // 显示X轴网格线
lineStyle: {
type: 'dashed', // 设置网格线为虚线
color: '#ccc', // 可以设置虚线的颜色
width: 1 // 可以设置虚线的宽度
}
}
},
visualMap: {
type: 'piecewise',
show: false,
dimension: 0,
seriesIndex: 0,
pieces: [{
gt: 1,
lt: 3,
color: 'RGBA(255, 241, 201, 1)',
},
{
gt: 5,
lt: 7,
color: 'RGBA(255, 241, 201, 1)',
},
],
},
series: [{
type: 'line',
smooth: 0.6,
symbol: 'none',
lineStyle: {
color: '#FFE28C',
width: 1,
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#FFF1C9'
}, ]),
},
},
data: that.chartData5,
}],
};
chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: canvasDpr
})
option.series[0].data = that.chartData5
canvas.setChart(chart)
chart.setOption(option)
return chart
},
// 二氧化碳
initChart6(canvas, width, height, canvasDpr) {
let that = this
const option = {
grid: {
left: '4%',
right: '4%',
bottom: '3%',
top: '4%',
containLabel: true
},
xAxis: {
show: true,
type: 'category',
boundaryGap: false,
axisLine: {
show: false // 隐藏X轴线
},
axisTick: {
show: false // 隐藏X轴刻度
},
axisLabel: {
show: false // 隐藏X轴标签
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
rotate: 0,
},
splitLine: {
show: false,
},
// data: that.chartday,
},
yAxis: {
show: true,
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
show: true,
color: '#ccc',
fontSize: 11,
formatter: function(value) {
// 保留两位小数没有小数时显示00
return value + '%'
},
},
splitLine: {
show: true, // 显示X轴网格线
lineStyle: {
type: 'dashed', // 设置网格线为虚线
color: '#ccc', // 可以设置虚线的颜色
width: 1 // 可以设置虚线的宽度
}
}
},
visualMap: {
type: 'piecewise',
show: false,
dimension: 0,
seriesIndex: 0,
pieces: [{
gt: 1,
lt: 3,
color: 'RGBA(255, 241, 201, 1)',
},
{
gt: 5,
lt: 7,
color: 'RGBA(255, 241, 201, 1)',
},
],
},
series: [{
type: 'line',
smooth: 0.6,
symbol: 'none',
lineStyle: {
color: '#FFE28C',
width: 1,
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#FFF1C9'
}, ]),
},
},
data: that.chartData6,
}],
};
chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: canvasDpr
})
option.series[0].data = that.chartData6
canvas.setChart(chart)
chart.setOption(option)
return chart
},
initChart7(canvas, width, height, canvasDpr) {
let that = this
const option = {
grid: {
left: '4%',
right: '4%',
bottom: '3%',
top: '0%',
containLabel: true
},
tooltip: {
trigger: 'axis'
},
xAxis: {
type: 'category',
boundaryGap: false,
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
axisLine: {
show: false // 隐藏X轴线
},
axisTick: {
show: false // 隐藏X轴刻度
},
axisLabel: {
show: false // 隐藏X轴标签
},
splitLine: {
show: true, // 显示X轴网格线
lineStyle: {
type: 'dashed', // 设置网格线为虚线
color: '#ccc', // 可以设置虚线的颜色
width: 1 // 可以设置虚线的宽度
}
}
},
yAxis: {
type: 'value',
max: 40, // 设置Y轴的最大值为40
axisLabel: {
show: false // 隐藏Y轴标签
},
axisLine: {
show: false // 隐藏Y轴线
},
axisTick: {
show: false // 隐藏Y轴刻度
},
splitLine: {
show: false // 隐藏Y轴背景网格线
}
},
dataZoom: [{
show: true,
type: 'inside',
filterMode: 'none',
xAxisIndex: [0],
startValue: -20,
endValue: 20
},
{
show: true,
type: 'inside',
filterMode: 'none',
yAxisIndex: [0],
startValue: -20,
endValue: 20
}
],
series: [{
name: '最高温度',
type: 'line',
data: this.chartData8,
smooth: true,
symbol: 'circle',
symbolSize: 8,
lineStyle: {
width: 3
},
itemStyle: {
color: '#42A5F5'
},
label: {
show: true,
position: 'top',
formatter: '{c}°',
color: '#42A5F5'
},
markLine: {
silent: true, // 不响应鼠标事件
symbol: ['none', 'none'], // 不显示标记
lineStyle: {
color: 'red', // 使虚线更明显
type: 'dashed'
},
// data: [
// { yAxis: 'min' },
// { yAxis: 'max' }
// ]
},
},
{
name: '最低温蒂',
type: 'line',
data: this.chartData7,
smooth: true,
symbol: 'circle',
symbolSize: 8,
lineStyle: {
width: 3
},
itemStyle: {
color: '#42A5F5'
},
label: {
show: true,
position: 'bottom',
formatter: '{c}°',
color: '#42A5F5'
},
}
]
}
chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: canvasDpr
})
// option.series[0].data = that.chartData7
canvas.setChart(chart)
chart.setOption(option)
return chart
},
}
}
</script>
<style lang="scss">
#active{
color: red !important;
}
.mask {
width: 100%;
height: 100vh;
position: fixed;
top: 0;
left: 0;
background-color: #3D3D3D;
opacity: .6;
}
page {
background-color: #FAFDFD;
}
.page {
padding: 38rpx;
padding-bottom: 200rpx;
width: 750rpx;
.weather_info {
position: fixed;
padding: 30rpx 50rpx;
bottom: 0;
right: 0;
width: 750rpx;
height: 820rpx;
background: #FFFFFF;
z-index: 999 !important;
border-radius: 20rpx 20rpx 0rpx 0rpx;
.echarts_box {
margin-top: 24rpx;
width: 646rpx;
height: 344rpx;
}
.weather_cont {
margin-top: 42rpx;
width: 100%;
display: flex;
flex-wrap: nowrap;
align-items: center;
justify-content: space-between;
.weather_li {
.data {
text-align: center;
width: 72rpx;
font-weight: 400;
font-size: 24rpx;
color: #50565A;
}
.week {
margin-top: 4rpx;
text-align: center;
width: 72rpx;
font-weight: 600;
font-size: 24rpx;
color: #50565A;
}
.week_weather {
margin-top: 14rpx;
text-align: center;
width: 82rpx;
font-weight: 500;
font-size: 28rpx;
color: #50565A;
}
.week_weather_img {
margin-top: 4rpx;
display: flex;
align-items: center;
justify-content: center;
width: 72rpx;
image {
width: 48rpx;
height: 48rpx;
}
}
}
}
.top {
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
align-items: center;
.weather_info_tit {
font-weight: 600;
font-size: 36rpx;
color: #3D3D3D;
}
image {
width: 42rpx;
height: 42rpx;
}
.weather_add {
font-weight: 600;
font-size: 32rpx;
color: #50565A;
}
.up_time {
font-weight: 400;
font-size: 32rpx;
color: #808080;
}
}
}
.echarts_box {
margin-top: 26rpx;
padding: 18rpx 24rpx;
width: 674rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
border-radius: 28rpx 28rpx 28rpx 28rpx;
.echarts {
margin-top: 24rpx;
width: 100%;
height: 330rpx;
}
.echarts_top {
display: flex;
align-items: center;
.top_left {
width: 33.33%;
display: flex;
align-items: center;
font-weight: 500;
font-size: 36rpx;
color: #3D3D3D;
image {
margin-left: 10rpx;
width: 25.03rpx;
height: 34rpx;
}
}
.top_cont {
width: 33.33%;
text-align: center;
font-weight: 600;
font-size: 36rpx;
color: #3D3D3D;
}
.top_right {
width: 33.33%;
display: flex;
align-items: center;
.txt {
display: flex;
align-items: center;
flex-wrap: nowrap;
margin-left: auto;
font-weight: 400;
font-size: 32rpx;
color: #4D4D4D;
.icon-xiangyou1 {
margin-top: 4rpx;
margin-left: 8rpx;
}
}
}
}
}
.bottom_box {
padding: 38rpx 20rpx;
position: fixed;
display: flex;
align-items: center;
justify-content: space-around;
width: 750rpx;
height: 142rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
border-radius: 0rpx 0rpx 0rpx 0rpx;
bottom: 0;
left: 0;
.type_li {
padding: 12rpx 26rpx;
background: #FFF5D6;
border-radius: 12rpx 12rpx 12rpx 12rpx;
border: 2rpx solid #FFC107;
font-weight: 600;
font-size: 32rpx;
color: #3D3D3D;
}
.act1 {
background: #FFC107;
border-radius: 12rpx 12rpx 12rpx 12rpx;
border: 2rpx solid #FFC107;
color: #FFFFFF;
}
}
.card_top {
margin-top: 28rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
.name {
font-weight: 600;
font-size: 36rpx;
color: #3D3D3D;
}
.time {
margin-left: 18rpx;
font-weight: 400;
font-size: 28rpx;
color: #808080;
}
.ele {
margin-left: auto;
display: flex;
align-items: center;
flex-wrap: nowrap;
font-weight: 400;
font-size: 28rpx;
color: #808080;
image {
margin-right: 12rpx;
width: 46rpx;
height: 46rpx;
}
}
}
.setbox {
margin: 0 auto;
margin-top: 34rpx;
width: 674rpx;
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
.setcard {
position: relative;
padding: 14rpx 22rpx;
width: 320rpx;
height: 132rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
border-radius: 20rpx 20rpx 20rpx 20rpx;
.top {
display: flex;
flex-wrap: nowrap;
align-items: center;
justify-content: space-between;
.left {
font-weight: 600;
font-size: 28rpx;
color: #3D3D3D;
}
.right {
font-size: 24rpx;
color: #808080;
}
}
.bot {
margin-top: 14rpx;
font-weight: 400;
font-size: 24rpx;
color: #808080;
}
.img {
position: absolute;
right: 24rpx;
bottom: 24rpx;
width: 82rpx;
height: 82rpx;
image {
width: 82rpx;
height: 82rpx;
}
}
}
}
.weather {
margin-top: 12rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
justify-content: space-between;
.weather_left {
display: flex;
flex-wrap: nowrap;
align-items: center;
.txt {
display: flex;
flex-wrap: nowrap;
align-items: center;
image {
width: 38rpx;
height: 38rpx;
margin-right: 8rpx;
}
font-weight: 400;
font-size: 28rpx;
color: #3D3D3D;
}
}
.weather_right {
display: flex;
flex-wrap: nowrap;
align-items: center;
font-weight: 400;
font-size: 28rpx;
color: #42A5F5;
.icon-xiangyou1 {}
}
}
.address {
display: flex;
align-items: center;
margin-top: 8rpx;
image {
margin-right: 8rpx;
width: 20rpx;
height: 24rpx;
}
font-weight: 400;
font-size: 28rpx;
color: #808080;
}
.tit {
display: flex;
flex-wrap: nowrap;
align-items: center;
justify-content: space-between;
margin-top: 24rpx;
font-weight: 600;
font-size: 32rpx;
color: #3D3D3D;
.sets {
position: relative;
display: flex;
align-items: center;
.tongbu{
width: 130rpx;
height: 40rpx;
border-radius: 4rpx;
text-align: center;
line-height: 40rpx;
font-size: 28rpx;
color: #fff;
background-color: #FFC107;
margin-right: 20rpx;
}
.menu {
padding: 20rpx;
position: absolute;
right: 20rpx;
width: 218rpx;
height: 234rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
border-radius: 20rpx 20rpx 20rpx 20rpx;
z-index: 10;
.menu_li:first-child {
margin-top: 10rpx;
}
.menu_li {
image {
margin-right: 14rpx;
width: 38rpx;
height: 38rpx;
}
font-weight: 400;
font-size: 32rpx;
color: #3D3D3D;
margin-top: 26rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
}
}
image {
width: 36rpx;
height: 36rpx;
}
}
}
.mapbox {
position: relative;
margin: 0 auto;
margin-top: 34rpx;
width: 674rpx;
height: 372rpx;
border-radius: 20rpx;
overflow: hidden;
.fxmask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #3D3D3D;
opacity: .5;
z-index: 99;
color: #fff;
padding-left: 10rpx;
font-size: 36rpx;
padding-top: 288rpx;
box-sizing: border-box;
font-weight: 600;
}
.num {
width: 180rpx;
position: absolute;
top: 24rpx;
left: 30rpx;
.txt {
width: 180rpx;
font-weight: 600;
font-size: 32rpx;
color: #FFC107;
}
}
.btn {
position: absolute;
right: 0rpx;
bottom: 0rpx;
image {
width: 90rpx;
height: 90rpx;
}
}
.map {
width: 672rpx;
height: 372rpx;
}
}
}
</style>