gy-app-shop/pages/oneselfUser/home.vue

441 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.

<style lang="scss" scoped>
.home-ctn{
width: 100%;
height: 100%;
background-color: #F9F9F9;
padding: 30rpx;
:not(not) {
box-sizing: border-box;
}
.home-nav{
background-color: #fff;
border-radius: 16rpx;
box-shadow: $box-shadow;
// height: 400rpx;
display: flex;
flex-wrap: wrap;
padding: 30rpx;
&-box{
width: 25%;
text-align: center;
margin-bottom: 20rpx;
&-icon{
width: 100rpx;
height: 100rpx;
// padding: 16rpx;
// background: linear-gradient(-55deg, #52AA52, #76D296);
// box-shadow: 0px 9px 15px 0px rgba(87, 175, 91, 0.3);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
margin: 0 auto;
margin-bottom: 20rpx;
}
}
}
.home-statistical{
border-radius: 16rpx;
width: 100%;
background-color: #fff;
margin-top: 30rpx;
box-shadow: $box-shadow;
padding: 20rpx 0rpx;
display: flex;
justify-content: center;
&-box{
width: 24%;
text-align: center;
&-title{
padding-bottom: 10rpx;
}
&-line{
height: 40rpx;
width: 2rpx;
background-color: #ddd;
margin-top: 20rpx;
}
&-value{
color: #1492FF;
font-size: 36rpx;
}
}
}
.home-new-alrm{
margin-top: 20rpx;
}
.home-progress-bar{
// margin-top: 40rpx;
width: 100%;
&-box{
display: flex;
width: 100%;
margin-top: 20rpx;
&-title{
width: 120rpx;
}
&-progress{
width: calc(100% - 120rpx) ;
}
}
}
.canvas-processed{
width: 100%;
height: 260rpx;
margin: 10rpx 0;
}
}
.pwd-style {
width: 100%;
padding: 20upx 30upx;
}
</style>
<template>
<view class="">
<headerBg></headerBg>
<view class="home-ctn">
<view class="home-nav">
<view class="home-nav-box" v-for="(item,index) in navListArr" :key="index" @click="goFuctionUrlFn(item)">
<!-- <image src="../../static/images/car.png" mode=""></image> -->
<!-- #ifdef MP-WEIXIN -->
<view class="home-nav-box-icon" :style="{background:item.background,boxShadow:item.boxShadow}">
<!-- #endif -->
<!-- #ifndef MP-WEIXIN -->
<view class="home-nav-box-icon" :style="{backgroundColor:item.background}">
<!-- #endif -->
<!-- <view class="home-nav-box-icon" :style="{background:item.background,boxShadow:item.boxShadow}"> -->
<tui-icon :name="item.icon" size="50" color="#fff"></tui-icon>
</view>
<view class="home-nav-box-text">{{item.name}}</view>
</view>
</view>
<view class="home-statistical" v-if="pageIndexData">
<view class="home-statistical-box">
<view class="home-statistical-box-title">项目总数</view>
<view class="home-statistical-box-value">{{(pageIndexData && pageIndexData.projectTotal) || "-" }}</view>
</view>
<view class="home-statistical-box-line"></view>
<view class="home-statistical-box">
<view class="home-statistical-box-title">设备总数</view>
<view class="home-statistical-box-value" style="color: #8CDEAF;">{{(pageIndexData && pageIndexData.deviceTotal + '') || "-"}}</view>
</view>
<view class="home-statistical-box-line"></view>
<view class="home-statistical-box">
<view class="home-statistical-box-title">在线设备</view>
<view class="home-statistical-box-value" style="color: #8CDEAF;">{{(pageIndexData && pageIndexData.onlineTotal + '') || "-"}}</view>
</view>
<view class="home-statistical-box-line"></view>
<view class="home-statistical-box">
<view class="home-statistical-box-title">今日报警数</view>
<view class="home-statistical-box-value" style="color: #FF7976;">{{(pageIndexData && pageIndexData.todayAlarmTotal + '') || "-"}}</view>
</view>
</view>
<view class="home-new-alrm">
<!-- <u-tag size="mini" class="mr20" style="width:140rpx;" text="最新报警" type="error" mode="plain" /> -->
<u-notice-bar mode="horizontal" type="error" :list="alrmNotice" :is-circular="playState" :play-state="playState?'play':'paused'"></u-notice-bar>
<!-- <text>A公司 福州鼓楼区洪山镇 照明于2020-11-17 8:46:55 发生异常分闸,请及时处理</text> -->
</view>
<image v-if="canvasImg" :src="canvasImg" class="canvas-processed"></image>
<canvas v-else canvas-id="dealWithChartsId" class="canvas-processed" id="canvasArcbarID"></canvas>
<view class="home-progress-bar" >
<view class="home-progress-bar-box">
<view class="home-progress-bar-box-title ">报警总数</view>
<u-line-progress class="home-progress-bar-box-progress ml20" active-color="#F88F30" :striped="true" :striped-active="true" :textValue="pageIndexData.alarmTotal || '0'" :percent="lineProgressData.alarmTotalPercent || '0'"></u-line-progress>
</view>
<view class="home-progress-bar-box">
<view class="home-progress-bar-box-title ">已修理</view>
<u-line-progress class="home-progress-bar-box-progress ml20" active-color="#2979ff" :striped="true" :striped-active="true" :textValue="pageIndexData.processed" :percent="lineProgressData.processedPercent"></u-line-progress>
</view>
<view class="home-progress-bar-box">
<view class="home-progress-bar-box-title ">未处理</view>
<u-line-progress class="home-progress-bar-box-progress ml20" active-color="#D41E00" :striped="true" :striped-active="true" :textValue="pageIndexData.unProcessed" :percent="lineProgressData.unProcessedPercent"></u-line-progress>
</view>
<view class="home-progress-bar-box" v-for="(item,index) in pageIndexData.alarmModelList" :key="index">
<view class="home-progress-bar-box-title ">{{item.modelName || "-"}}</view>
<u-line-progress class="home-progress-bar-box-progress ml20" active-color="#2979ff" :striped="true" :striped-active="true" :textValue="item.modelTotal" :percent="(item.modelTotal / (pageIndexData.unProcessed + pageIndexData.processed))*100"></u-line-progress>
</view>
<!-- <view class="home-progress-bar-box">
<view class="home-progress-bar-box-title ">电气火灾</view>
<u-line-progress class="home-progress-bar-box-progress pl20" active-color="#2979ff" :striped="true" :striped-active="true" :percent="60"></u-line-progress>
</view>
<view class="home-progress-bar-box">
<view class="home-progress-bar-box-title ">水位水压</view>
<u-line-progress class="home-progress-bar-box-progress pl20" active-color="#D41E00" :striped="true" :striped-active="true" :percent="89"></u-line-progress>
</view>
<view class="home-progress-bar-box">
<view class="home-progress-bar-box-title ">烟雾</view>
<u-line-progress class="home-progress-bar-box-progress pl20" active-color="#D41E00" :striped="true" :striped-active="true" :percent="180"></u-line-progress>
</view> -->
</view>
</view>
<u-modal v-model="show" show-cancel-button @confirm="addDevice">
<view class="slot-content pwd-style">
<u-input v-model="password" type="password" placeholder="请输入设备密码" />
</view>
</u-modal>
</view>
</template>
<script>
import uCharts from '@/components/u-charts/u-charts.js';
import headerBg from "@/components/headerBg/headerBg.vue";
var _self;
var canvaColumn = null;
var canvaLineA = null;
var canvaArcbar1 = null;
export default {
data() {
return {
alrmNotice: [],
cWidth:'',
cHeight:'',
pixelRatio:1,
pageIndexData:null, // 首页数据
arcbarWidth:'',//圆弧进度图,进度条宽度,此设置可使各端宽度一致
navListArr:[],
playState:false, // 滚动状态
lineProgressData:null,
tabbar:[
{
"pagePath": "/pages/tabBar/home",
"text": "首页",
"iconPath": "/static/images/toolbar/home.png",
"selectedIconPath": "/static/images/toolbar/act-home.png"
},{
"pagePath": "/pages/tabBar/project",
"text": "项目",
"iconPath": "/static/images/toolbar/project.png",
"selectedIconPath": "/static/images/toolbar/act-project.png"
},{
"pagePath": "/pages/tabBar/alarm",
"text": "报警",
"iconPath": "/static/images/toolbar/alarm.png",
"selectedIconPath": "/static/images/toolbar/act-alarm.png"
},{
"pagePath": "/pages/tabBar/my",
"text": "我的",
"iconPath": "/static/images/toolbar/my.png",
"selectedIconPath": "/static/images/toolbar/act-my.png"
}],
show: false,
password: '',
deviceKey: '',
canvasImg: null
}
},
components:{
headerBg
},
onPullDownRefresh(e){
this.getPowerIndexDataFn();
},
created() {
_self = this;
this.navListArr = [
{
name:"智慧用电",
icon:"tubiaoshangchuanmoban",
url:"../home/wisdomElectricity/index",
// #ifdef MP-WEIXIN
background:"linear-gradient(-55deg, #52AA52, #76D296);",
// #endif
// #ifndef MP-WEIXIN
background:"#76D296",
// #endif
boxShadow: "0px 9px 15px 0px rgba(87, 175, 91, 0.3);"
},
{
name:"扫码",
icon:"saoma",
url:"none",
method: "scanCode",
// #ifdef MP-WEIXIN
background:"linear-gradient(-55deg, #0292F6, #5FB8FD);",
// #endif
// #ifndef MP-WEIXIN
background:"#5FB8FD",
// #endif
boxShadow: "0px 9px 15px 0px rgba(3, 183, 250, 0.3);"
}
];
console.log('this.navListArr: ', this.navListArr)
// uni.upx2px(750) 这是uni-app自带的自适应以750的尺寸为基准。动态变化
this.cWidth=uni.upx2px(750);
this.cHeight=uni.upx2px(260);
this.arcbarWidth=uni.upx2px(20);
this.getPowerIndexDataFn();
},
methods: {
// 获取首页数据
getPowerIndexDataFn(){
/****** 模拟数据 ***********/
// this.pageIndexData = {
// projectTotal:10,
// deviceTotal:20,
// onlineDeviceTotal:30,
// todayAlarmTotal:40,
// alarmTotal:100
// }
// this.alrmNotice = ["福建福州中德润德润物联中空开于2021年2月1日14:13:30发生报警"];
// this.playState = true;
// this.drawChartsFn(parseFloat(30) / 100);
// this.lineProgressData = {
// alarmTotalPercent:100,
// processedPercent:(70 / 100) * 100,
// unProcessedPercent:(30 / 100) * 100,
// }
// return;
/****** 模拟数据---end ***********/
this.$get('/app/index').then((res)=>{
console.log(res,"rdddd");
if(res.code != 200) return;
this.pageIndexData = res.data;
let {tenantAlarmRecordVo,processedRate,alarmTotal,processed,unProcessed} = this.pageIndexData;
// 最新报警
if(!!tenantAlarmRecordVo){
let {projectName,spaceName,projectAddress,deviceName,alarmTime,typeName} = tenantAlarmRecordVo;
let alarmStr = `${projectAddress || "-"} ${(projectName + spaceName) || "-"}${deviceName || "-"}${alarmTime || "-"}发生${typeName || "-"}`
this.alrmNotice.push(alarmStr);
this.playState = true;
} else{
this.alrmNotice.push("暂无警报");
}
// 处理率
this.drawChartsFn(parseFloat(processedRate) / 100);
// 百分比数据
this.lineProgressData = {
alarmTotalPercent:alarmTotal!=0?100:0,
processedPercent:(processed / alarmTotal) * 100,
unProcessedPercent:(unProcessed / alarmTotal) * 100,
// zhyd:(zhyd / alarmTotal) * 100,
// dqhz:(dqhz / alarmTotal) * 100,
// swsy:(processed / alarmTotal) * 100,
// yw:(yw / alarmTotal) * 100
};
}).catch((err)=>{
console.log(err,"errr");
}).finally(()=>{
uni.stopPullDownRefresh();
})
},
drawChartsFn(value){
console.log(value,"value");
let obj = {
color: "#1890ff",
data: value,
index: 0,
legendShape: "circle",
name: "已处理率",
pointShape: "circle",
show: true,
type: "arcbar"
}
let Arcbar3 = {
series:[obj]
}
// 找到id为dealWithChartsId的块
_self.showArcbar("dealWithChartsId", Arcbar3);
},
goFuctionUrlFn(item){
if (item.url !== 'none') {
uni.navigateTo({
url:item.url
})
} else {
uni[item.method]({
success(res) {
if (res.errMsg === 'scanCode:ok') {
_self.show = true;
_self.deviceKey = res.result;
}
}
})
}
},
addDevice () {
let data = {
deviceKey: this.deviceKey,
devicePassword: this.password
};
this.$post('/app/device/binding-device', data).then((res) => {
console.log(res)
if (res.code === 200) {
this.$u.toast('添加成功', 3000);
} else {
this.$u.toast(res.msg, 3000);
}
}).catch((err) => {
console.log(err);
})
},
toJSON () {},
// 展示图标的函数 接收参数一个块的id,一个数据
showArcbar(canvasId, chartData) {
canvaLineA = new uCharts({
$this:_self,
canvasId: canvasId,
type: 'arcbar',
fontSize:11,
legend:false,
title: {
name: Math.round(chartData.series[0].data*100)+'%',
color: chartData.series[0].color,
fontSize: 25*_self.pixelRatio
},
subtitle: {
name: chartData.series[0].name,
color: '#666666',
fontSize: 15*_self.pixelRatio
},
extra: {
arcbar:{
type:'circle',//整圆类型进度条图
width: _self.arcbarWidth*_self.pixelRatio,//圆弧的宽度
startAngle:0.5//整圆类型只需配置起始角度即可
}
},
background:'#FFFFFF',
pixelRatio:_self.pixelRatio,
series: chartData.series,
animation: true,
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
dataLabel: true,
});
canvaLineA.addEventListener('renderComplete', () => {//监控图表渲染完成
setTimeout(() => {
uni.canvasToTempFilePath({
width: 345,
height: 130,
x: 0,
y: 0,
canvasId: 'dealWithChartsId',
success: function(res) {
// 在H5平台下tempFilePath 为 base64
console.log(res.tempFilePath)
_self.canvasImg = res.tempFilePath;
},
fail: function(err) {
console.log(err)
}
}, _self);
}, 100);
});
},
// 点击图表显示的内容
touchLineA(e) {
// 使用声明的变量canvaLineA
canvaArcbar1.showToolTip(e, {
format: function(item, category) {
return category + ' ' + item.name + ':' + item.data
}
});
}
}
}
</script>