gy-app-shop/pages/project/index.vue

748 lines
21 KiB
Vue

<template>
<view class="project-detail">
<view class="project-detail-content">
<view class="project-detail-header-box">
<view class="project-detail-header" v-if="projectInfoData">
<view class="project-detail-header-info">
<view class="project-detail-header-info-company">{{projectInfoData && projectInfoData.projectName}}</view>
<view class="project-detail-header-info-address"><span class="diconfont dicon-icon_shijian"></span> 建设时间:{{projectInfoData && projectInfoData.createTime}}</view>
</view>
<view class="btn-box">
<span v-if="projectInfoData.projectRole == 'root'" class="diconfont dicon-icon_xiugai" @click="showEdit"></span>
<!-- <span class="diconfont dicon-icon_saoma" @click="scanCodeFn"></span> -->
</view>
</view>
<view class="equipment-status" @click="goEquipmentStatusFn">
<view class="equipment-status-info" v-if="projectOverviewData">
<view class="equipment-status-info-box">
<view class="equipment-status-info-box-value text-red pb10">{{projectOverviewData && projectOverviewData.deviceTotal}}</view>
<view class="equipment-status-info-box-lable">设备总数</view>
</view>
<view class="equipment-status-info-box">
<view class="equipment-status-info-box-value text-green pb10">{{projectOverviewData && projectOverviewData.onlineTotal}}</view>
<view class="equipment-status-info-box-lable">在线设备</view>
</view>
<view class="equipment-status-info-box">
<view class="equipment-status-info-box-value pb10">{{projectOverviewData && projectOverviewData.onlineRate}}%</view>
<view class="equipment-status-info-box-lable">在线率</view>
</view>
</view>
</view>
</view>
<view class="manage-banner">
<view class="manage-banner-electric">
<!-- <u-image src="@/"></u-image> -->
<u-image width="100%" height="100%" @click="goElectricSafeFn" :src="cdnImgUrl + '/project/detail/btndq.png'"></u-image>
</view>
<view class="manage-banner-energy">
<u-image width="100%" height="100%" @click="goSmartEnergyFn" :src="cdnImgUrl + '/project/detail/btndy.png'"></u-image>
</view>
</view>
<view class="home-title">
<view class="home-title-txt">
报警预警分布
</view>
<view class="home-title-remark"></view>
</view>
<view class="home-status-box menu-box">
<view class="home-status-item menu-item">
<view class="home-status-item-name">
报警总数
</view>
<view class="home-status-item-value">
{{projectAlarmData.alarmTotal||0}}
</view>
<view class="home-menu-item-bg diconfont dicon-icon_jiance" :style="{backgroundImage:'linear-gradient(0deg, #45AAFF, #2568FF)'}"></view>
<view class="home-menu-item-bg-two diconfont dicon-icon_jiance" :style="{color:'rgba(69, 170, 255, 0.1)'}"></view>
</view>
<view class="home-status-item menu-item">
<view class="home-status-item-name">
已处理率
</view>
<view class="home-status-item-value">{{projectAlarmData.processed||0}}</view>
<view class="item-content-progress-box">
<qiun-data-charts
canvas2d="true"
style="width: 162rpx;height:162rpx;"
type="arcbar"
:opts="projectAlarmData.opts"
:chartData="projectAlarmData.chartData"
/>
</view>
</view>
<view class="home-status-item menu-item">
<view class="home-status-item-name">
维保记录
</view>
<view class="home-status-item-value">{{activeProject.tenantIndexVo.maintenanceRecordTotal||0}}</view>
<view class="home-menu-item-bg diconfont dicon-icon_weibaojilu" :style="{backgroundImage:'linear-gradient(0deg, #33F3FF, #00BCD2)'}"></view>
<view class="home-menu-item-bg-two diconfont dicon-icon_weibaojilu" :style="{color:'rgba(49, 234, 246, 0.1)'}"></view>
</view>
<view class="home-status-item menu-item">
<view class="home-status-item-name">
今日报警
</view>
<view class="home-status-item-value" :style="{color:activeProject.todayAlarmTotal?'#FB3534':'#000'}">
{{(activeProject && activeProject.todayAlarmTotal) || "0"}}</view>
<view class="home-menu-item-bg diconfont dicon-icon_jinribaojing" :style="{backgroundImage:'linear-gradient(0deg, #FFEF65, #FFBA00)'}"></view>
<view class="home-menu-item-bg-two diconfont dicon-icon_jinribaojing" :style="{color:'rgba(254, 185, 0, 0.1)'}"></view>
</view>
</view>
<view class="alarm-overview-info-box alarm-item">
<view class="pt10 pb10 pl20 pr20" v-if="warningAnalysisStatisticsData && alarmAnalysisStatisticsData">
<projectCmp :hide="editMenuShow" :warningAnalysisStatisticsData="warningAnalysisStatisticsData" :alarmAnalysisStatisticsData="alarmAnalysisStatisticsData"></projectCmp>
</view>
</view>
<view class="alarm-overview-info">
<swiper style="height: 100%;" :indicator-dots="true">
<swiper-item>
<view class="alarm-overview-info-box">
<view class="alarm-overview-info-box-title">报警预警分布</view>
<view class="">
<view class="alrmAnalysis-content" v-if="projectWarningAnalysis && projectWarningAnalysis.alarmCategoriesList && projectWarningAnalysis.alarmCategoriesList.length>0">
<view class="alrmAnalysis-title">报警</view>
<view class="alrmAnalysis-info" >
<view class="alrm-row" v-for="(item,index) in projectWarningAnalysis.alarmCategoriesList" :key="index">
<view class="alrm-row-circle" :style="{backgroundColor:item.color}"></view>
<view class="alrm-row-text pl10">
<text class="pr10">{{item.typeName}}</text>
<text class="text--base--grey">|</text>
<text class="pl10">{{item.ratio}}%</text>
<text class="pl10" style="color: #999;">{{item.alarmTotal}}</text>
</view>
</view>
</view>
</view>
<view v-else style="margin-top: 80rpx;">
<u-empty text=" " mode="data" icon-size="350" :src="cdnImgUrl + '/project/detail/empty.png'"></u-empty>
</view>
</view>
</view>
</swiper-item>
<swiper-item>
<view class="alarm-overview-info-box">
<view class="alarm-overview-info-box-title">报警预警趋势</view>
<view class="" v-if="projectWarningAnalysis">
<alarmTrend :hide="editMenuShow" :trendData="projectWarningAnalysis.alarmChartDataVo"></alarmTrend>
</view>
</view>
</swiper-item>
</swiper>
</view>
<view class="project-map-ctn" @click="readMapLocalFn">
<view class="project-map-title" v-if="projectInfoData">
<tuiIcon name="weizhi" color="#FF6600" size="50"></tuiIcon>
<text class="project-map-title-text">{{projectInfoData && projectInfoData.projectAddress}}</text>
</view>
<map v-if="mapLongitude" class="project-map" :latitude="mapLatitude" :longitude="mapLongitude" :markers="mapMarkers"></map>
</view>
</view>
<u-action-sheet :list="editMenuList" @click="selectMenu" v-model="editMenuShow"></u-action-sheet>
<u-modal v-model="editProjectModalShow" title="修改项目名称" :show-cancel-button="true"
@confirm="$throttle(editProjectNameFn, 500)">
<view class="slot-content">
<u-input v-model="editProjectName" :focus="true" border type="text" placeholder="请输入项目名称" ></u-input>
</view>
</u-modal>
<u-toast ref="uToast" />
</view>
</template>
<script>
import projectCmp from "./projectCmp.vue";
import alarmTrend from "./alarmTrend.vue"
var QQMapWX = require('@/utils/qqmap-wx-jssdk.min');
// 实例化API核心类
var qqmapsdk = new QQMapWX({
key: 'XQTBZ-HP5CG-FRFQN-QCFTJ-LTG76-LSF6G'
});
export default {
data() {
return {
projectId: "",
projectInfoData:null, // 项目信息
projectOverviewData:null, // 项目概况
projectAlarmData:null, // 项目报警概况
projectWarningAnalysis:null, // 项目报警预警信息
alarmAnalysisStatisticsData:null,
warningAnalysisStatisticsData:null,
alarmColorList: ["#C93548", "#5E5490", "#52B249", "#F7A23E", "#EA9B87", "#A94791", "#F1DF31", "#DE5654", "#2DAEE5"],
mapLatitude:"",
mapLongitude:"",
mapMarkers: [],
editMenuList:[
{
text: '成员管理',
},
{
text: '修改项目名称',
},
{
text: '修改项目地址',
},
{
text: '项目空间管理',
},
{
text: '设备分组管理',
}
],
editMenuShow:false,
editProjectModalShow:'',
editProjectName:'',
opts: {
color: ["#2897ff"],
padding: undefined,
title: {
name: "80%",
fontSize: 12,
color: "#2897ff"
},
subtitle: {
name: "已处理率",
fontSize: 10,
color: "#666666"
},
extra: {
arcbar: {
type: "default",
width: 6,
backgroundColor: "#f3f4f5",
startAngle: 0.75,
endAngle: 0.25,
gap: 2,
linearType: "none"
}
}
},
// alarmCategoriesList: [{
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }, {
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }, {
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }, {
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }, {
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }, {
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }, {
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }, {
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }, {
// alarmTotal: 2,
// ratio: "100.00",
// typeCode: "a00001",
// typeName: "短路报警"
// }]
cdnImgUrl: 'http://static.drgyen.com/app/hc-app-power/images'
};
},
components: {
projectCmp,
alarmTrend
},
onLoad(e) {
this.cdnImgUrl = this.$config.cdnImgUrl;
this.projectId = e.projectId;
this.getProjectInfoFn();
this.getWarningAnalysisFn();
this.getPowerIndexFn();
},
methods:{
// 修改项目名称
editProjectNameFn(){
let obj = {
...this.projectInfoData,
projectName:this.editProjectName
}
this.$put("/iot/project",obj).then((res)=>{
if(res.code == 200){
this.$u.toast(res.msg, 3000);
this.getProjectInfoFn();
}else{
this.$u.toast(res.msg, 3000);
}
})
},
showEdit(){
this.editMenuShow = true;
},
selectMenu(e){
console.log("点击菜单",this.editMenuList[e].text)
if(this.editMenuList[e].text == '成员管理'){
uni.navigateTo({
url:'./projectUser?projectId=' + this.projectId
})
}else if(this.editMenuList[e].text == '修改项目名称'){
this.editProjectName = this.projectInfoData.projectName;
this.editProjectModalShow = true;
}else if(this.editMenuList[e].text == '项目空间管理'){
uni.navigateTo({
url:'./space/index?projectId=' + this.projectId + '&projectRole=' + this.projectInfoData.projectRole + '&typeName=空间'
})
}else if(this.editMenuList[e].text == '设备分组管理'){
uni.navigateTo({
url:'./deviceGroup/index?projectId=' + this.projectId
})
}else if(this.editMenuList[e].text == '修改项目地址'){
uni.chooseLocation({
latitude:this.projectInfoData.projectLat,
longitude:this.projectInfoData.projectLng,
success: (res) => {
qqmapsdk.reverseGeocoder({
location:{
latitude: res.latitude,
longitude: res.longitude
},
success: (res1) =>{
this.$put("/iot/project",{
...this.projectInfoData,
projectLat:res.latitude,
projectLng:res.longitude,
projectAddress:res.address+res.name,
regionalismCode:res1.result.ad_info.adcode
}).then(editres=>{
console.log("editres",editres)
if(editres.code == 200){
this.getProjectInfoFn();
}else{
this.$refs.uToast.show({
title: editres.msg,
type: 'error',
})
}
}).catch(err=>{
this.$refs.uToast.show({
title: err.msg,
type: 'error',
})
})
},
fail: (err) => {
console.log(res);
}
})
}
});
}
},
goSmartEnergyFn(){
uni.navigateTo({
url:`./smartEnergy/index?projectId=${this.projectInfoData.projectId}`
})
},
goElectricSafeFn(){
uni.navigateTo({
url:`/pages/project/electricalSafeMange/index?projectId=${this.projectInfoData.projectId}`
})
},
goEquipmentStatusFn(){
uni.navigateTo({
url:`./equipmentStatus/status?projectId=${this.projectInfoData.projectId}`
})
},
readMapLocalFn(){
uni.openLocation({
longitude: this.projectInfoData.projectLng,
latitude: this.projectInfoData.projectLat ,
name: this.projectInfoData.projectName,
address:this.projectInfoData.address,
success:(suc)=>{
console.log(suc);
},
fail: (err) => {
console.log(err,'err');
}
})
},
getProjectInfoFn(){
// this.$get("/app/project/info",{projectId:this.projectId}).then((res)=>{
this.$get("/app/project/" + this.projectId).then((res)=>{
console.log(res,"Resss");
this.projectInfoData = res.data;
this.projectOverviewData = res.data.tenantIndexVo;
this.mapLatitude = this.projectInfoData.projectLat;
this.mapLongitude = this.projectInfoData.projectLng;
this.mapMarkers.push({
latitude: this.projectInfoData.projectLat,
longitude: this.projectInfoData.projectLng,
iconPath: 'http://static.drgyen.com/app/hc-app-power/images/project/location.png',
width:20,
height:22
})
})
},
// 警告分析接口
getWarningAnalysisFn(){
this.$get("/app/index/warning-analysis",{projectId:this.projectId}).then((res)=>{
this.projectWarningAnalysis = res.data;
this.alarmAnalysisStatisticsData = res.data.warningAnalysisStatisticsVo.find((item) => {
return item.alarmDivide === "ALARM";
})
this.warningAnalysisStatisticsData = res.data.warningAnalysisStatisticsVo.find((item) => {
return item.alarmDivide === "WARNING";
})
if(!this.projectWarningAnalysis.alarmCategoriesList){
this.projectWarningAnalysis.alarmCategoriesList = [];
}else{
this.projectWarningAnalysis.alarmCategoriesList = this.projectWarningAnalysis.alarmCategoriesList.map((item, index, arr) => {
item.color = this.alarmColorList[index];
if (index + 1 > this.alarmColorList.length) {
item.color = this.alarmColorList[index - this.alarmColorList.length];
}
return item;
});
}
})
},
// 首页数据接口
getPowerIndexFn(){
this.$get("/app/index",{projectId:this.projectId}).then((res)=>{
this.projectAlarmData = res.data;
let processedRateValue = res.data.processedRate/100;
let data = {
series: [
{
data: processedRateValue || 0
}
]
};
let opts = JSON.parse(JSON.stringify(this.opts));
this.opts.title.name = res.data.processedRate + '%'
this.projectAlarmData.chartData = JSON.parse(JSON.stringify(data));
this.projectAlarmData.opts = JSON.parse(JSON.stringify(this.opts));
})
},
// 扫码
scanCodeFn() {
uni.scanCode({
scanType: ['qrCode'],
success: (res) => {
// console.log('条码内容:' + res.result);
const val = res.result;
if(val) {
this.$get(`/app/device/key/${val}`).then(resp => {
console.log(resp)
if(resp.code == 200){
uni.navigateTo({
url: `/pages/home/wisdomElectricity/electricityDetail?deviceId=${resp.data.deviceId}`
})
} else {
this.$u.toast(resp.msg, 3000);
}
})
} else {
this.$u.toast('无效二维码', 3000);
}
},
fail: (err) => {
console.log(err)
if(err.errMsg == "scanCode:fail cancel") {
this.$u.toast('扫码取消', 3000);
} else {
this.$u.toast(err.errMsg, 3000);
}
}
});
}
}
}
</script>
<style lang="scss" scoped>
.project-detail {
font-family: Source Han Sans CN;
position: relative;
width: 100%;
// background-color: #F8F8F8;
.project-detail-content {
padding: $paddingTB 45rpx;
}
.project-detail-header-box{
background: #FFFFFF;
border-radius: 20rpx;
.project-detail-header {
padding: 20rpx;
padding-bottom: 0;
display: flex;
justify-content: space-between;
align-items: center;
&-info {
&-company {
padding-bottom: 15rpx;
font-weight: 550;
font-size: 36rpx;
color: #000000;
}
&-address {
font-weight: 400;
font-size: 20rpx;
color: #666666;
.diconfont{
font-size: 17rpx;
margin-right: 5rpx;
}
}
}
.btn-box{
display: flex;
align-items: center;
.diconfont{
font-size: 38rpx;
color: #000000;
padding: 10rpx;
}
}
}
.equipment-status {
background-color: #fff;
border-radius: $uni-border-radius-lg;
// height: 150rpx;
padding: 20rpx;
&-info {
display: flex;
&-box {
flex: 1;
text-align: center;
.equipment-status-info-box-value{
font-weight: bold;
font-size: 32rpx;
color: #666666;
}
.equipment-status-info-box-lable{
font-weight: 400;
font-size: 24rpx;
color: #333333;
}
}
}
}
}
.manage-banner {
display: flex;
justify-content: space-between;
padding-top: 30rpx;
&-electric,
&-energy {
width: 320rpx;
height: 115rpx;
}
}
.home-title {
display: flex;
align-items: center;
padding: 20rpx 15rpx;
.home-title-txt {
font-weight: 600;
font-size: 36rpx;
}
.home-title-remark {
margin-left: 20rpx;
font-size: 20rpx;
color: #999999;
}
}
// 菜单
.menu-box{
display: flex;
align-items: center;
flex-wrap: wrap;
.menu-item{
width: 320rpx;
height: 200rpx;
background: #FFFFFF;
border-radius: 20rpx;
padding: 30rpx 20rpx 15rpx 30rpx;
margin-bottom: 20rpx;
position: relative;
&:nth-child(2n-1) {
margin-right: 20rpx;
}
.home-status-item-name {
font-weight: 550;
font-size: 28rpx;
}
.home-status-item-value{
font-weight: bold;
font-size: 30rpx;
}
.home-menu-item-bg {
position: absolute;
right: 37rpx;
bottom: 26rpx;
font-size: 75rpx;
z-index: 99;
color: transparent;
display: inline-block;
-webkit-background-clip: text;
}
.home-menu-item-bg-two{
position: absolute;
right: 44rpx;
bottom: 26rpx;
font-size: 75rpx;
z-index: 98;
}
.item-content-progress-box{
position: absolute;
right: 10rpx;
bottom: 0rpx;
width: 180rpx;
display: flex;
justify-content: center;
align-items: center;
}
}
.border-box{
height:1px;
background: #E0E3E5;
}
}
.alarm-overview-info {
width: 100%;
height: 500rpx;
border-radius: 20rpx;
background-color: #fff;
// box-shadow: $box-shadow;
margin-top: 20rpx;
&-box {
&.alarm-item{
padding: 20rpx;
background: #FFFFFF;
border-radius: 20rpx;
}
}
&-box-title {
padding: 20rpx 30rpx;
// border-bottom: 1px solid #eee;
font-weight: 500;
font-size: 30rpx;
}
}
.alarm-overview-info-box-content {
padding: $paddingTB $paddingLR;
height: 420rpx;
}
.alrmAnalysis-content {
display: flex;
width: 100%;
padding: 40rpx 0;
padding-bottom: 20rpx;
.alrmAnalysis-title {
width: 100rpx;
display: flex;
align-items: center;
justify-content: center;
}
.alrmAnalysis-info {
width: calc(100% - 100rpx);
font-size: 22rpx;
display: grid;
grid-template-columns: repeat(2, 50%);
grid-auto-columns: repeat(2, 50%);
}
}
.alrm-row {
display: flex;
align-items: center;
padding-bottom: 20rpx;
&-circle {
width: 22rpx;
height: 22rpx;
border-radius: $uni-border-radius-circle;
/* background-color: #C93548; */
margin-top: 2rpx;
}
}
.project-map-ctn {
width: 100%;
height: 400rpx;
margin-top: 30rpx;
margin-bottom: 20rpx;
background-color: #fff;
border-radius: 20rpx;
.project-map-title{
width: 100%;
padding: $paddingTB;
display: flex;
align-items: center;
height: 120rpx;
&-text{
padding-left: 20rpx;
font-size: 30rpx;
font-weight: bold;
}
}
.project-map {
width: 100%;
height: calc(100% - 120rpx);
}
}
}
.slot-content{
padding: 20rpx 30rpx;
}
.text-red{
color: #FE5277 !important;
}
.text-green{
color: #16D2AF !important;
}
</style>