smartmeter-app/pages/index/index.vue
2024-03-25 19:46:07 +08:00

960 lines
21 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="tittxt" :border-bottom="false" :background="bgc" title-color='#2E4975'
title-size='36' height='36' id="navbar">
</u-navbar>
<view class="zhuhu" v-if="userType=='00'&&deviceInfo">
<view class="card1">
<view class="top">
<view class="left">
设备
</view>
<view class="right">
<image class="imgs" src="@/static/qiehuan.png" mode="" style="margin-right: 20rpx;" @click="switchs"></image>
<image class="img1" src="@/static/off.png" mode="" style="margin-right: 30rpx;"></image>
<image class="img1" src="@/static/share.png" mode="" @click="toewm()"></image>
</view>
</view>
<view class="mid">
<view class="mid_left">
<image src="../../static/db.png" mode=""></image>
</view>
<view class="mid_right">
<view class="mid_top">
{{ deviceInfo.deviceName }}
</view>
<view class="mid_bot">
<view class="txt" v-if="deviceInfo">电表号:{{ deviceInfo.deviceId }}</view>
<div class="tip" v-if="deviceInfo.onlineStatus==1">在线</div>
<div class="tip" v-if="deviceInfo.onlineStatus==0">离线</div>
</view>
</view>
</view>
<view class="bot">
<view class="bot_left">
<view class="echarts">
<!-- <mpvue-echarts id="main" ref="pieChart" :echarts="echarts" @onInit="initChart" /> -->
<l-echart ref="chart" @finished="initChart"></l-echart>
</view>
</view>
<view class="bot_right">
<view class="cont">
<view class="tit">
{{deviceInfo.totalElectriQuantity}}KWH
</view>
<view class="txt">
总用电量
</view>
</view>
<view class="cont" style="margin-left: 60rpx;">
<view class="tit">
{{deviceInfo.price}}元/度
</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}}KW</view>
<view class="bot">实时功率</view>
</view>
<view class="cont" style="width: 70rpx;">
<view class="top">{{deviceInfo.electricity}}A</view>
<view class="bot">电流</view>
</view>
<view class="cont">
<view class="top">{{deviceInfo.voltage}}V</view>
<view class="bot">电压</view>
</view>
</view>
</view>
<view class="card3">
<view class="tit">其他</view>
<view class="cont_box">
<!-- <view class="cont">
<view class="top">
<image src="@/static/sz.png" mode=""></image>
</view>
<view class="bot">其他设置</view>
</view> -->
<view class="cont" style="width: 58rpx;">
<view class="top">
<image src="@/static/yc.png" mode="" style="width: 58rpx;height: 60rpx;"></image>
</view>
<view class="bot">异常</view>
</view>
<view class="cont" @click="tochaobiao">
<view class="top">
<image src="@/static/cb.png" mode=""></image>
</view>
<view class="bot">抄表</view>
</view>
<!-- <view class="cont" @click="toydfx()">
<view class="top">
<image src="@/static/fx.png" mode=""></image>
</view>
<view class="bot">用电分析</view>
</view> -->
</view>
</view>
<view class="button">电费充值</view>
<view class="zhanwei" style="width: 100%;height: 300rpx;">
</view>
</view>
<!-- 房东 -->
<view class="fd" v-if="userType=='01' && sbflag">
<view class="fd_top">
<view class="fd_tit" v-for="(item,index) in titlist" :key="index" :class="index==curtitidx?'act1':''"
@click="changeidx(index)">
{{item}}
</view>
<view class="fd_set" @click="show = true">
+
</view>
</view>
<view class="warp_box">
<swiper class="swiper" style="height: 150vh;" :current='curtitidx' @change="swiperchange">
<swiper-item>
<view class="swiper-item ">
<view class="card_box" @click="todetail(item.deviceId)" v-for="(item,index) in deviceList"
:key="index">
<view class="card">
<view class="card_left">
<view class="card_left_tit">
{{item.deviceName}}电表
</view>
<view class="card_left_sta">
<image src="@/static/ele.png" mode=""></image>
<view class="sta_txt">
剩余电量{{item.surplusElectriQuantity}}
</view>
</view>
<view class="card_left_no">
电表号{{item.deviceId}}
</view>
</view>
<view class="card_right">
<image src="@/static/db.png" mode=""></image>
</view>
</view>
</view>
</view>
</swiper-item>
<swiper-item>
<view class="swiper-item ">B</view>
</swiper-item>
<swiper-item>
<view class="swiper-item ">C</view>
</swiper-item>
</swiper>
</view>
</view>
<view class="noDevice" v-if="addflag">
<view class="img_box">
<image src="@/static/device.png" mode=""></image>
<view class="tps">
暂无设备
</view>
</view>
<view class="addbutn" v-if="userType=='00'">
扫码添加
</view>
<view class="addbutn" v-if="userType=='01'" @click="show=true">
添加方式
</view>
<view class="tip">需要添加设备后方可使用</view>
</view>
<tab-bar :indexs='0'></tab-bar>
<u-popup v-model="show" mode="bottom" border-radius="14" width="750rpx" height="464rpx" closeable="true"
close-icon-pos="top-left">
<view class="popup-content">
<text class="add">添加方式</text>
<text class="saoma">扫码添加</text>
<text class="sousuo" @click="btnserch">搜索附近设备添加</text>
</view>
</u-popup>
</view>
</template>
<script>
import * as echarts from 'echarts'
import LEchart from '@/uni_modules/lime-echart/components/l-echart/l-echart.vue';
export default {
data() {
return {
bgc: {
backgroundColor: "#F7FAFE",
},
deviceInfo: {},
loadings: false,
info: '',
tittxt: "首页",
titlist: [
"全部",
"电表",
"水表",
],
curtitidx: 0,
background: ['color1', 'color2', 'color3'],
indicatorDots: true,
autoplay: true,
interval: 2000,
duration: 500,
deviceList: [],
userType: '',
addflag: false,
sbflag: true,
show: false
}
},
onLoad() {
this.logins()
},
methods: {
logins(){
if (uni.getStorageSync('userType')) {
this.userType = uni.getStorageSync('userType')
this.userType='01'
if (this.userType == '01') {
this.getDeviceList()
} else if (this.userType == '00') {
this.getdevice()
}
} else {
}
this.getuserinfo()
},
// 点击搜索附近设备进行跳转
btnserch() {
uni.navigateTo({
url: '/pages/device/index'
})
},
async initChart() {
let value = 100;
let value2 = this.deviceInfo.surplusElectriQuantity
const option = {
// backgroundColor:"#061740",
title: {
show: false,
text: `历史请求满意度`, // 图表标题
x: 'center',
y: '20',
textStyle: {
color: '#333', //'#fff',
fontSize: 20,
},
},
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}}\n\n{b|剩余电量}`, // 标签内容格式
rich: {
a: {
fontSize: 15,
fontWeight: '700',
color: '#333',
},
b: {
fontSize: 11,
color: '#888',
},
},
},
},
},
{
value: 100 - value,
name: '',
label: {
normal: {
show: false,
},
},
itemStyle: {
normal: {
color: '#173164',
},
},
},
],
},
{
type: 'gauge', // 仪表盘类型
radius: '130%', // 仪表盘半径,占图表容器的百分比
center: ['50%', '50%'], // 仪表盘中心位置
startAngle: 359,
endAngle: 359.9,
splitNumber: 2, // 刻度分割段数
hoverAnimation: true,
axisTick: {
show: true, // 是否显示刻度线
length: 10, // 刻度线长度
lineStyle: {
color: 'auto',
width: 1,
},
},
splitLine: {
length: 0, // 刻度线分隔线长度
lineStyle: {
width: 1,
color: '#061740',
},
},
axisLabel: {
show: false, // 是否显示刻度标签
},
pointer: {
show: false, // 是否显示指针
},
axisLine: {
lineStyle: {
opacity: 0,
},
},
detail: {
show: false, // 是否显示仪表盘详情
},
data: [{
value: 0,
name: '',
}, ],
},
],
};
// console.log( this.$refs.chartRef,'1111');
const chart = await this.$refs.chart.init(echarts);
console.log(option);
chart.setOption(option)
// chart.resize({
// width: uni.upx2px(210), // Convert 210rpx to pixels
// height: uni.upx2px(190.14) // Convert 190.14rpx to pixels
// });
return chart
},
// 获取设备详情
getDevice() {
this.$u.get("app/device/1").then((res) => {
// this.$forceUpdate()
if (res.code == 200) {
this.deviceInfo = res.data
console.log(this.deviceInfo, 1111);
this.loadings = true
}
});
},
getuserinfo() {
this.$u.get("/app/user/userInfo").then((res) => {
// this.$forceUpdate()
if (res.code == 200) {
uni.setStorageSync('userType', res.data.userType)
this.userType = res.data.userType
if (this.userType == '01') {
this.getDeviceList()
} else if (this.userType == '00') {
this.getdevice()
}
}else{
this.jmlogin()
}
});
},
jmlogin(){
let taht =this
wx.login({
success(res) {
if (res.code) {
console.log('登录!', res);
let data = {
wxOpenId: res.code,
};
taht.$u.post('/app/auth/wxLogin',data).then(res=>{
if (res.code == 10003) {
uni.navigateTo({
url:'/pages/login/login'
})
} else if (res.code == 200) {
// console.log("老用户登录",res.data)
uni.setStorageSync('token', res.token);
taht.logins()
}
});
}
},
});
},
getDeviceList() {
this.$u.get("/app/device/list").then((res) => {
// this.$forceUpdate()
if (res.code == 200) {
this.deviceList = res.rows
console.log(this.deviceList, '10101010');
if (this.deviceList == '') {
this.addflag = true
this.sbflag = false
} else {
this.addflag = false
this.sbflag = true
}
// this.addflag = false
// this.sbflag = true
}
});
},
swiperchange(e) {
this.curtitidx = e.detail.current
console.log(e, 'aaaa');
},
getdevice() {
this.$u.get("/app/device/tenant").then((res) => {
this.deviceInfo = res.rows[0]
this.initChart()
});
},
changeidx(index) {
this.curtitidx = index
},
toewm() {
uni.navigateTo({
url: "/pages/shebei/ewm"
})
},
toydfx() {
uni.navigateTo({
url: "/pages/shebei/eletj"
})
},
todetail(id) {
uni.navigateTo({
url: "/pages/shebei/sbdetail?id=" + id
})
},
// 跳转到抄表
tochaobiao(){
uni.navigateTo({
url:'/pages/userpage/cbRecord'
})
},
// 点击切换设备
switchs(){
uni.navigateTo({
url:'/pages/userpage/switchs'
})
}
}
}
</script>
<style lang="scss">
page {
background-color: #F7FAFE;
}
.page {
.noDevice {
margin-top: 432rpx;
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
.img_box {
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
image {
width: 252rpx;
height: 252rpx;
}
.tps {
margin-top: 4rpx;
width: 100%;
text-align: center;
font-weight: 700;
font-size: 32rpx;
color: #BDBCBC;
}
}
.addbutn {
margin-top: 32rpx;
display: flex;
align-items: center;
justify-content: center;
width: 266rpx;
height: 96rpx;
background: #8883F0;
border-radius: 16rpx;
font-weight: 500;
font-size: 36rpx;
color: #FFFFFF;
}
.tip {
margin-top: 30rpx;
width: 100%;
text-align: center;
font-weight: 400;
font-size: 40rpx;
color: #BDBCBC;
}
}
.zhuhu {
margin-top: 20rpx;
padding: 0 40rpx;
.card1 {
padding: 34rpx 0 0 40rpx;
width: 670rpx;
height: 583rpx;
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;
.imgs{
width: 94rpx;
height: 94rpx;
vertical-align: bottom;
}
.img1 {
width: 76rpx;
height: 76rpx;
}
}
}
.mid {
margin-top: 54rpx;
display: flex;
flex-wrap: nowrap;
align-content: flex-start;
.mid_left {
image {
width: 37rpx;
height: 98rpx;
}
}
.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;
background: rgba(204, 204, 204, 0);
opacity: 1;
border: 2rpx solid #8883F0;
border-radius: 40rpx;
font-size: 14rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #8883F0;
}
}
}
}
.bot {
margin-top: 83rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
.bot_left {
width: 210rpx;
height: 190.14rpx;
margin-right: 34rpx;
.echarts {
width: 210rpx;
height: 190.14rpx;
}
}
.bot_right {
// margin-top: 50rpx;
display: flex;
flex-wrap: nowrap;
.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;
text-align: center;
.cont {
width: 110rpx;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
.top {
font-size: 32rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
color: #262B37;
width: 110rpx;
}
.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;
.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;
padding-left: 96rpx;
box-sizing: border-box;
.cont {
width: 100rpx;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
margin-right: 92rpx;
.top {
image {
width: 56rpx;
height: 56rpx;
}
}
.bot {
margin-top: 28rpx;
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;
}
}
.fd {
margin-top: 20rpx;
padding: 0 40rpx;
padding-bottom: 200rpx;
height: 100%;
.fd_top {
display: flex;
flex-wrap: nowrap;
// justify-content: space-between;
align-items: center;
.fd_tit {
// width: 40%;
margin-right: 20rpx;
font-size: 36rpx;
font-weight: 400;
color: #95989D;
}
.act1 {
color: #000000;
}
.fd_set {
margin-left: auto;
font-size: 60rpx;
}
}
.swiper {
.swiper-item {
height: 100%;
.card_box {
margin-top: 34rpx;
display: flex;
flex-wrap: wrap;
.card {
display: flex;
// align-items: center;
margin-top: 20rpx;
width: 658rpx;
height: 282rpx;
background: #fff;
box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(255, 255, 255, 0);
border-radius: 24rpx 24rpx 24rpx 24rpx;
.card_left {
width: 310rpx;
margin-top: 46rpx;
margin-left: 50rpx;
.card_left_tit {
font-size: 44rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
color: #8883F0;
}
.card_left_sta {
margin-top: 15rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
image {
width: 23.32rpx;
height: 36.47rpx;
}
.sta_txt {
margin-left: 15rpx;
color: #262B37;
font-size: 24rpx;
font-family: HarmonyOS Sans SC, HarmonyOS Sans SC;
font-weight: 400;
}
}
.card_left_no {
margin-top: 15rpx;
font-size: 24rpx;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
color: #95989D;
}
}
.card_right {
margin-top: 60rpx;
margin-left: auto;
margin-right: 94rpx;
image {
width: 63.04rpx;
height: 167.48rpx;
}
}
}
}
}
}
}
}
.popup-content {
text-align: center;
text {
display: block;
}
.add {
margin-top: 10rpx;
font-size: 36rpx;
color: #000000;
line-height: 80rpx;
}
.saoma {
margin-top: 68rpx;
font-size: 40rpx;
color: #000000;
line-height: 54rpx;
border: 1px solid #ccc;
padding: 30rpx 0;
box-sizing: border-box;
}
.sousuo {
margin-top: 46rpx;
font-size: 40rpx;
color: #000000;
line-height: 54rpx;
border: 1px solid #ccc;
padding: 30rpx 0;
box-sizing: border-box;
}
}
</style>