smartmeter-app/pages/tj.vue
2024-05-13 02:34:58 +08:00

641 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

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 :is-back="false" title="统计" :border-bottom="false" :background="bgc" title-color='#2E4975'
title-size='44' height='44' id="navbar">
</u-navbar>
<view v-if="userType=='01'">
<!-- <view class="title">
统计
</view> -->
<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 + '月'}}
</view>
<view class="tit">
本月收入{{totalRecharge}}(元)
</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.recharge}}元
</view>
</view>
</view>
</view>
<view v-if="userType=='00'">
<view class="title">
统计
</view>
<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 + '月'}}
</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="canva" 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>
<tab-bar :indexs='1'></tab-bar>
</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
},
params: {
year: true,
month: true,
day: false,
hour: false,
minute: false,
second: false
},
bgc: {
backgroundColor: "#F7FAFE",
},
show: false,
yeartime: {
year: '',
month: ''
},
timelist: '',
quantity: 0, //电量
chartData: [],
chartday:[],
loging:true,
deviceId:'',
userType:'',
totalRecharge:0,
}
},
onLoad() {
// setTimeout(() => {
// this.initChart()
// }, 300);
// this.initChart()
// 首次加载页面给现在的时间
},
onShow() {
this.deviceId= uni.getStorageSync('deviceId')
this.userType = uni.getStorageSync('userType')
const now = new Date();
this.yeartime.year = now.getFullYear()
this.yeartime.month = now.getMonth() + 1
if( this.userType=='00'){
this.gettimes()
setTimeout(() => {
this.$refs.canva.init(this.initCharts)
}, 1000);
}else if ( this.userType=='01'){
this.gettime()
setTimeout(() => {
this.$refs.canvas.init(this.initChart)
}, 1000);
}
},
methods: {
// 点击获取时间
confirm(e) {
this.yeartime = e
this.gettime()
if( this.userType=='00'){
setTimeout(() => {
this.$refs.canva.init(this.initCharts)
}, 1000);
}else if ( this.userType=='01'){
setTimeout(() => {
this.$refs.canvas.init(this.initChart)
}, 1000);
}
},
// 进行获取用电量请求
gettime() {
let data = {
year: this.yeartime.year,
month: this.yeartime.month,
groupBy: 'create_day'
}
this.loging=false
this.$u.get('app/bill/landlordCount', data).then((res) => {
if (res.code == 200) {
this.timelist = res.data
this.totalRecharge=res.totalRecharge
this.chartData = this.timelist.map(item => item.recharge);
this.chartday = this.timelist.map(item => item.createDay + '日');
// console.log('用电', this.chartData, '时间', this.chartday);
this.loging=true
// this.$refs.canvas.init(this.initChart)
// 求用电总度数
// this.quantity = 0
// for (let i = 0; i < this.timelist.length; i++) {
// this.quantity += this.timelist[i].recharge / 0.5
// }
// return this.quantity
}
})
},
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.$refs.canva.init(this.initCharts)
// 求用电总度数
// this.quantity = 0
// for (let i = 0; i < this.timelist.length; i++) {
// this.quantity += this.timelist[i].recharge / 0.5
// }
// 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
},
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 + '.00' + '元'
},
},
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
})
option.series[0].data = that.chartData
canvas.setChart(chart)
chart.setOption(option)
return chart
},
initCharts(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
})
option.xAxis.data = that.chartday
canvas.setChart(chart)
chart.setOption(option)
return chart
},
async initChartss() {
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.charts.init(echarts)
console.log(option,'111');
// 给折线图赋值
// option.series[0].data = that.chartData
option.xAxis.data = that.chartday
chart.setOption(option)
return chart
},
}
}
</script>
<style lang="scss">
.btnxz {
padding: 0 20rpx;
box-sizing: border-box;
font-size: 28rpx;
font-family: Source Han Sans, Source Han Sans;
font-weight: 400;
color: #FFFFFF;
}
page {
background-color: #F7FAFE;
// padding-bottom: 240rpx;
// box-sizing: border-box;
}
.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>