<template> <view class="page"> <u-navbar title="用电分析" :border-bottom="false" :background="bgc" back-icon-color="#fff" title-color='#fff' title-size='36' height='58' id="navbar"></u-navbar> <view class="card"> <view class="xzsj"> <u-picker mode="time" v-model="show" :params="params" @confirm="confirm"></u-picker> </view> <view class="month" @click="show = true"> {{yeartime.year + '年' + yeartime.month + '月'}} <u-icon style="margin-left: 10rpx;" name="arrow-down-fill"></u-icon> </view> <view class="tit"> 本月用电量(度) </view> <div class="txt"> {{quantity}} </div> <view class="echarts" v-if="loging"> <!-- <mpvue-echarts id="main" ref="pieChart" :echarts="echarts" @onInit="initChart" /> --> <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="list" style="padding-bottom: 120rpx;"> <view class="card_list" v-for="(item,index) in timelist" :key="index"> <view class="left"> {{yeartime.year + '年' + yeartime.month + '月' + item.createDay + '日'}} </view> <view class="right"> {{item.usedElectriQuantity}}度 </view> </view> </view> </view> </template> <script> 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 { ec: { lazyLoad: true }, bgc: { backgroundColor: "#8883f0", }, params: { year: true, month: true, day: false, hour: false, minute: false, second: false }, show: false, yeartime: { year: '', month: '' }, timelist: '', quantity: 0, //电量 chartData: [], chartday: [], loging: true, deviceId: '', userType: '' } }, onLoad(e) { // setTimeout(() => { // this.initChart() // }, 300); // this.initChart() setTimeout(() => { // console.log(this.$refs) this.$refs.canvas.init(this.initChart) }, 1000) this.deviceId = e.id const now = new Date(); this.yeartime.year = now.getFullYear() this.yeartime.month = now.getMonth() + 1 this.gettimes() }, methods: { confirm(e) { setTimeout(() => { // console.log(this.$refs) this.$refs.canvas.init(this.initChart) }, 1000) this.yeartime = e this.gettimes() }, // 进行获取用电量请求 gettimes() { let data = { deviceId:this.deviceId, year: this.yeartime.year, month: this.yeartime.month, groupBy: 'create_date' } this.loging=false this.$u.get('/app/device/electric/count', data).then((res) => { if (res.code == 200) { this.timelist = res.data this.chartData = this.timelist.map(item => item.usedElectriQuantity); this.chartday = this.timelist.map(item => item.createDay + '日'); // console.log('用电', this.chartData, '时间', this.chartday); this.loging=true // 求用电总度数 this.quantity = 0 for (let i = 0; i < this.timelist.length; i++) { this.quantity += this.timelist[i].usedElectriQuantity } return this.quantity } }) }, generateWaveData(length) { const data = []; for (let i = 0; i < length; i++) { const y = Math.sin((i / (length - 1)) * Math.PI * 2); // 正弦函数生成波浪形状的y值 data.push((y + 1) * 50); // 映射到0-100的范围 } return data; }, // async initChart() { // console.log('111111'); // let that =this // // let _this = this // const option = { // grid: { // left: 60, // right: 10, // top: 10, // bottom: 30, // }, // xAxis: { // type: 'category', // boundaryGap: false, // axisLine: { // show: false, // }, // axisTick: { // show: false, // }, // axisLabel: { // show: true, // color: '#fff', // fontSize: 11, // rotate: 0, // }, // splitLine: { // show: false, // }, // data:that.chartday, // }, // yAxis: { // show: true, // axisLine: { // show: false, // }, // axisTick: { // show: false, // }, // axisLabel: { // show: true, // color: '#fff', // fontSize: 11, // formatter: function(value) { // // 保留两位小数,没有小数时显示00 // return value + '度' // }, // }, // splitLine: { // show: false, // }, // }, // visualMap: { // type: 'piecewise', // show: false, // dimension: 0, // seriesIndex: 0, // pieces: [{ // gt: 1, // lt: 3, // color: 'rgba(0, 0, 180, 0.4)', // }, // { // gt: 5, // lt: 7, // color: 'rgba(0, 0, 180, 0.4)', // }, // ], // }, // series: [{ // type: 'line', // smooth: 0.6, // symbol: 'none', // lineStyle: { // color: '#E0DBFF', // width: 4, // }, // areaStyle: { // normal: { // color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ // offset: 0, // color: '#B4B0F7' // }, ]), // }, // }, // data:that.chartData, // }], // }; // const chart = await that.$refs.chart.init(echarts) // console.log(option,'111'); // // 给折线图赋值 // // option.series[0].data = that.chartData // option.xAxis.data = that.chartday // chart.setOption(option) // return chart // }, // }, initChart(canvas, width, height, canvasDpr) { let that = this console.log(canvas, width, height, canvasDpr) const option = { grid: { left: 60, right: 10, top: 10, bottom: 30, }, xAxis: { type: 'category', boundaryGap: false, axisLine: { show: false, }, axisTick: { show: false, }, axisLabel: { show: true, color: '#fff', fontSize: 11, rotate: 0, }, splitLine: { show: false, }, data:that.chartday, }, yAxis: { show: true, axisLine: { show: false, }, axisTick: { show: false, }, axisLabel: { show: true, color: '#fff', fontSize: 11, formatter: function(value) { // 保留两位小数,没有小数时显示00 return value + '度' }, }, splitLine: { show: false, }, }, visualMap: { type: 'piecewise', show: false, dimension: 0, seriesIndex: 0, pieces: [{ gt: 1, lt: 3, color: 'rgba(0, 0, 180, 0.4)', }, { gt: 5, lt: 7, color: 'rgba(0, 0, 180, 0.4)', }, ], }, series: [{ type: 'line', smooth: 0.6, symbol: 'none', lineStyle: { color: '#E0DBFF', width: 4, }, areaStyle: { normal: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#B4B0F7' }, ]), }, }, data:that.chartData, }], }; chart = echarts.init(canvas, null, { width: width, height: height, devicePixelRatio: canvasDpr }) console.log(chart); option.xAxis.data = that.chartday canvas.setChart(chart) chart.setOption(option) return chart }, } } </script> <style lang="scss"> page { background-color: #F7FAFE; } .uni-ec-canvas { width: 100%; height: 320rpx; display: block; margin-top: 30rpx; } .page { padding: 0 59rpx; .title { margin-top: 120rpx; font-size: 48rpx; font-weight: 400; letter-spacing: 0rpx; color: rgba(38, 43, 55, 1); } .card { padding-top: 32rpx; margin-top: 46rpx; width: 632rpx; height: 586rpx; background: #8883F0; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); opacity: 1; // filter: blur(0px); border-radius: 40rpx; .month { margin-left: 22rpx; font-size: 28rpx; font-family: Source Han Sans, Source Han Sans; font-weight: 400; color: #FFFFFF; } .tit { margin-top: 18rpx; margin-left: 22rpx; font-size: 20rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #FFFFFF; } .txt { margin-top: 2rpx; margin-left: 22rpx; font-size: 36rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 700; color: #FFFFFF; } .echarts { margin-left: 22rpx; margin-top: 60rpx; // width: 100%; // height: 80%; width: 588rpx; height: 320rpx; } } .list { margin-top: 16rpx; // height:280rpx; // overflow-y: scroll; .card_list { width: 632rpx; height: 88rpx; background: #FFFFFF; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); opacity: 1; border-radius: 30rpx; display: flex; flex-wrap: nowrap; justify-content: space-between; margin-top: 16rpx; align-items: center; .left { margin-left: 52rpx; font-size: 28rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #808080; } .right { margin-right: 20rpx; font-size: 28rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #808080; } } } } </style>