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

774 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="project-box">
<view class="card-item project-info" @click.stop="enterDetailFn(activeProject)">
<view class="project-info-header">
<view class="project-info-left">
<view class="project-info-name">
{{activeProject.projectName}}
</view>
<view class="project-info-item">
<view class="diconfont dicon-icon_shijian"></view>
{{activeProject.createTime}}
</view>
<view class="project-info-item">
<view class="diconfont dicon-icon_weizhi"></view>
{{activeProject.projectAddress}}
</view>
</view>
<view class="diconfont dicon-mti-qiehuan" @click.stop="openSelectProject"></view>
</view>
<view class="alarm-box">
<view class="alarm-item">
<view class="item-value" style="color: #FE5277;">
{{activeProject.tenantIndexVo.alarmTotal||0}}
</view>
<view class="item-label">
报警总数
</view>
</view>
<view class="alarm-item">
<view class="item-value" style="color: #16D2AF;">
{{activeProject.tenantIndexVo.processed||0}}
</view>
<view class="item-label">
已处理
</view>
</view>
<view class="alarm-item">
<view class="item-value" style="color: #FAB64D;">
{{activeProject.tenantIndexVo.unProcessed||0}}
</view>
<view class="item-label">
未处理
</view>
</view>
<view class="alarm-item">
<view class="item-value" style="color: #666666;">
{{activeProject.tenantIndexVo.processedRate||0.00}}%
</view>
<view class="item-label">
已处理率
</view>
</view>
</view>
</view>
<view class="banner-menu-box">
<view class="banner-menu-item" @click.stop="enterDetailFn(activeProject)">
<image :src="cdnImgUrl + '/project/bannerbtn1.png'" mode=""></image>
</view>
<view class="banner-menu-item" @click.stop="goDeviceList(activeProject)">
<image :src="cdnImgUrl + '/project/bannerbtn2.png'" mode=""></image>
</view>
</view>
<!-- 默认密码修改提示框 -->
<view class="password-edit-box" v-if="passwordStatus">
<div class="password-edit-txt">您的初始密码为<text style="color: red;font-weight: bold;">888888</text>如需修改请前往 <text
style="color: #0066cc;font-weight: bold;"> 我的-密码修改 </text> 菜单进行修改</div>
<div class="password-edit-btn-box">
<u-button shape="square" type="primary" size="mini" @click="goPassword">去修改</u-button>
</div>
</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" @click.stop="goDeviceList(activeProject)">
<view class="home-status-item-name">
设备总数
</view>
<view class="home-status-item-value">
{{activeProject.tenantIndexVo.deviceTotal||0}}
</view>
<view class="home-menu-item-bg diconfont dicon-icon_zongliang"
:style="{backgroundImage:'linear-gradient(0deg, #45AAFF, #2568FF)'}"></view>
<view class="home-menu-item-bg-two diconfont dicon-icon_zongliang" :style="{color:'rgba(69, 170, 255, 0.1)'}">
</view>
</view>
<view class="home-status-item menu-item" @click.stop="goDeviceList(activeProject,'ONLINE')">
<view class="home-status-item-name">
在线设备
</view>
<view class="home-status-item-value">{{activeProject.tenantIndexVo.onlineTotal||0}}</view>
<view class="item-content-progress-box">
<qiun-data-charts canvas2d="true" style="width: 162rpx;height:162rpx;" type="arcbar"
:opts="activeProject.opts" :chartData="activeProject.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 class="home-status-item menu-item">
<view class="home-status-item-name">
电量费用()
</view>
<view class="home-status-item-value">
{{(activeProject && activeProject.projectPowerRate) || "0"}}
</view>
<view class="home-menu-item-bg diconfont dicon-icon_dianliang"
:style="{backgroundImage:'linear-gradient(0deg, #F9BA98, #7E442E)'}"></view>
<view class="home-menu-item-bg-two diconfont dicon-icon_dianliang" :style="{color:'rgba(246, 184, 150, 0.1)'}">
</view>
</view>
<view class="home-status-item menu-item">
<view class="home-status-item-name">
电流负载(A)
</view>
<view class="home-status-item-value">
{{(activeProject && activeProject.projectCurrent) || "0"}}
</view>
<view class="home-menu-item-bg diconfont dicon-icon_dianliu"
:style="{backgroundImage:'linear-gradient(0deg, #D5D5D5, #828282)'}"></view>
<view class="home-menu-item-bg-two diconfont dicon-icon_dianliu" :style="{color:'rgba(205, 205, 205, 0.1)'}">
</view>
</view>
<view class="home-status-item menu-item">
<view class="home-status-item-name">
温度(°C)
</view>
<view class="home-status-item-value">
{{(activeProject && activeProject.projectTemperature) || "0"}}
</view>
<view class="home-menu-item-bg diconfont dicon-icon_dianliu"
:style="{backgroundImage:'linear-gradient(0deg, #FFE1EE, #FF5757)'}"></view>
<view class="home-menu-item-bg-two diconfont dicon-icon_dianliu" :style="{color:'rgba(255, 87, 87, 0.1)'}">
</view>
</view>
<view class="home-status-item menu-item">
<view class="home-status-item-name">
电压(V)
</view>
<view class="home-status-item-value">
{{(activeProject && activeProject.projectVoltage) || "0"}}
</view>
<view class="home-menu-item-bg diconfont dicon-icon_dianliu"
:style="{backgroundImage:'linear-gradient(0deg, #D5D5D5, #828282)'}"></view>
<view class="home-menu-item-bg-two diconfont dicon-icon_dianliu" :style="{color:'rgba(205, 205, 205, 0.1)'}">
</view>
</view>
</view>
<u-modal v-model="addressShow" confirm-text="去设置" @confirm="setProjectAddress">
<view class="slot-content">
项目:{{activeProject.projectName}}未设置地址,请前往设置
</view>
</u-modal>
<u-modal v-model="selectProjectShow" class="select-model" title="" :mask-close-able="true"
:show-confirm-button="false" @confirm="setProjectAddress">
<view class="slot-content">
<view class="select-project-box">
<view class="select-project-title">
项目列表
</view>
<scroll-view scroll-y="true" class="select-project-scroll">
<view class="project-item" :class="activeIndex==index?'active':''" v-for="(item,index) in projectList"
:key="item.projectId" @click="changProject(index)">
{{item.projectName}}
</view>
</scroll-view>
</view>
</view>
</u-modal>
<u-toast ref="uToast" />
</view>
</template>
<script>
import {
getLenPx
} from "@/utils/mapCalculate.js"
var QQMapWX = require('@/utils/qqmap-wx-jssdk.min');
// 实例化API核心类
var qqmapsdk = new QQMapWX({
key: 'XQTBZ-HP5CG-FRFQN-QCFTJ-LTG76-LSF6G'
});
export default {
data() {
return {
addressShow: false,
passwordStatus: false,
selectProjectShow: false,
projectList: null,
activeProject: {
"createTime": null,
"updateTime": null,
"projectId": null,
"projectCode": null,
"projectName": null,
"contractId": null,
"industry": null,
"regionalismCode": 350121,
"projectAddress": null,
"projectLng": null,
"projectLat": null,
"projectStatus": null,
"projectPowerRate": null,
"tenantIndexVo": {
"deviceTotal": 0,
"onlineTotal": 0,
"offlineTotal": 0,
"onlineRate": "100.00",
"alarmTotal": 0,
"processed": 0,
"unProcessed": 0,
"processedRate": "0.00",
"maintenanceRecordTotal": 0,
"todayAlarmTotal": 0,
"psTotal": 0,
"pwTotal": 0.0,
"userTotal": 0,
"alarmModelList": [],
"projectTotal": 1,
"tenantAlarmRecordVo": null
},
"deviceAlarmSimpleVoList": [{
"deviceId": "a56e1408fa354b9dbd48d6805aa688f3",
"deviceName": "办公室测试网关",
"unProcessAlarmTotal": 48
}],
"adminFlag": true,
"projectRole": "root",
"deviceCount": 0
},
activeIndex: 0,
// 默认仪表盘配置
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"
}
}
},
cdnImgUrl: 'http://static.drgyen.com/app/hc-app-power/images',
defaultProjectId: '',
}
},
onLoad() {
try {
const defaultProjectId = uni.getStorageSync('defaultProjectId');
if (defaultProjectId) {
this.defaultProjectId = defaultProjectId;
}
} catch (e) {
// error
}
this.cdnImgUrl = this.$config.cdnImgUrl;
this.getUserInfo()
},
onShow() {
if (this.passwordStatus == true) {
this.getUserInfo()
}
this.getProjectList();
},
methods: {
getUserInfo() {
this.$get("/system/user/profile").then((res) => {
console.log(res, "res");
if (!res.data) return;
if (res.data.updateTime == undefined) {
this.passwordStatus = true;
} else {
this.passwordStatus = false;
}
uni.setStorageSync("tenantInfo", res.data.tenant)
uni.setStorageSync("userInfo", res.data)
})
},
goPassword() {
uni.navigateTo({
url: '/pages/tabBar/my/passwordModify'
})
},
getOnlineRate(item) {
let deviceTotal = item.tenantIndexVo.deviceTotal || 0;
let onlineTotal = item.tenantIndexVo.onlineTotal || 0;
let onlineRate = (onlineTotal / deviceTotal);
return onlineRate;
},
getOnlineRateTxt(item) {
let deviceTotal = item.tenantIndexVo.deviceTotal || 0;
let onlineTotal = item.tenantIndexVo.onlineTotal || 0;
if (deviceTotal === 0 && onlineTotal === 0) {
return '';
} else {
let onlineRateTxt = ((onlineTotal / deviceTotal) * 100).toFixed(1) + '%';
return onlineRateTxt;
}
},
setProjectAddress() {
this.addressShow = false;
uni.chooseLocation({
success: (res) => {
qqmapsdk.reverseGeocoder({
location: {
latitude: res.latitude,
longitude: res.longitude
},
success: (res1) => {
console.log("res1", res1.result);
this.$put("/iot/project", {
...this.activeProject,
projectLat: res.latitude,
projectLng: res.longitude,
projectAddress: res.address + res.name,
regionalismCode: res1.result.ad_info.adcode
}).then(editres => {
this.addressShow = false;
if (editres.code == 200) {
this.mescroll.resetUpScroll();
} 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);
}
})
}
});
},
getProjectList() {
let obj = {
pageSize: 100,
pageNum: 1,
}
if (this.searchValue) obj.projectName = this.searchValue;
this.$get("/app/project/table", obj).then((res) => {
if (res.rows && res.rows.length > 0) {
// 接口返回的当前页数据列表 (数组)
let curPageData = res.rows || [];
// 接口返回的当前页数据长度 (如列表有26个数据,当前页返回8个,则curPageLen=8)
let curPageLen = curPageData.length;
curPageData.forEach((item, index) => {
let res = {
series: [{
name: "正确率",
data: this.getOnlineRate(item)
}]
};
if (this.defaultProjectId == item.projectId) {
this.activeIndex = index;
}
let opts = JSON.parse(JSON.stringify(this.opts));
this.opts.title.name = this.getOnlineRateTxt(item)
curPageData[index].chartData = JSON.parse(JSON.stringify(res));
curPageData[index].opts = JSON.parse(JSON.stringify(this.opts));
})
//设置列表数据
this.projectList = curPageData;
// this.projectList = [...curPageData,...curPageData,...curPageData,...curPageData,...curPageData,...curPageData];
if (this.activeIndex >= curPageLen) {
this.activeProject = curPageData[0];
this.activeIndex = 0;
} else {
this.activeProject = curPageData[this.activeIndex];
}
curPageData.forEach((item, index) => {
if(!item.projectAddress && index!=0){
this.activeProject = item;
this.activeIndex = index;
}
})
this.defaultProjectId = this.activeProject.projectId;
uni.setStorage({
key: 'defaultProjectId',
data: this.activeProject.projectId,
})
if (res.total >= 1) {
console.log("this.activeProject",this.activeProject)
if (this.activeProject.projectAddress=="") {
this.addressShow = true;
} else {
this.addressShow = false;
}
}
} else {
this.projectList = [];
}
}).catch(() => {
//联网失败, 结束加载
}).finally(() => {})
},
enterDetailFn(item) {
uni.navigateTo({
url: `../project/index?projectId=${item.projectId}&projectCode=${item.projectCode}`
})
},
goDeviceList(item,deviceState=false) {
console.log("deviceState",deviceState)
if(deviceState){
uni.navigateTo({
url: `../project/equipmentStatus/status?projectId=${item.projectId}&adminFlag=${item.adminFlag}&projectRole=${item.projectRole}&deviceState=${deviceState}`
})
}else{
uni.navigateTo({
url: `../project/equipmentStatus/status?projectId=${item.projectId}&adminFlag=${item.adminFlag}&projectRole=${item.projectRole}`
})
}
},
changProject(index) {
this.activeIndex = index;
this.activeProject = this.projectList[index];
this.selectProjectShow = false;
this.defaultProjectId = this.projectList[index].projectId;
uni.setStorage({
key: 'defaultProjectId',
data: this.projectList[index].projectId,
})
},
openSelectProject() {
this.selectProjectShow = true;
}
}
}
</script>
<style lang="scss" scoped>
.project-box {
font-family: Source Han Sans CN;
padding: 45rpx;
.project-info {
width: 660rpx;
height: 290rpx;
background: #FFFFFF;
border-radius: 20rpx;
margin-bottom: 30rpx;
.project-info-header {
display: flex;
justify-content: space-between;
padding: 30rpx 20rpx 5rpx;
.project-info-left {
.project-info-name {
font-weight: 550;
font-size: 36rpx;
}
.project-info-item {
margin-top: 10rpx;
display: flex;
align-items: center;
font-size: 20rpx;
color: #8e8e8e;
.diconfont {
font-size: 20rpx;
color: #8e8e8e;
margin-right: 10rpx;
}
}
}
.dicon-mti-qiehuan {
font-size: 38rpx;
// font-weight: 600;
}
}
.alarm-box {
display: flex;
justify-content: space-between;
align-items: center;
padding: 5rpx 30rpx;
.alarm-item {
text-align: center;
font-family: Source Han Sans CN;
.item-value {
font-weight: bold;
font-size: 32rpx;
}
.item-label {
margin-top: 10rpx;
font-weight: 400;
font-size: 24rpx;
color: #333333;
}
}
}
}
.banner-menu-box {
display: flex;
justify-content: space-between;
.banner-menu-item {
width: 320rpx;
height: 115rpx;
border-radius: 20rpx;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
}
.password-edit-box {
border-radius: 20rpx;
background-color: #fff;
margin-top: 30rpx;
box-shadow: $box-shadow;
padding: 25rpx;
.password-edit-txt {}
.password-edit-btn-box {
text-align: end;
}
}
.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;
}
}
}
::v-deep .u-btn--primary--plain {
background-color: #fff !important;
}
.slot-content {
padding: 30rpx;
font-weight: bold;
font-size: 26rpx;
overflow: visible
}
.select-model ::v-deep .u-model {
background: linear-gradient(180deg, #45AAFF 0, #FFFFFF 268rpx);
position: relative;
overflow: visible !important;
border-radius: 16rpx;
}
.select-model ::v-deep .uni-scroll-view,
.select-model ::v-deep .uni-scroll-view,
.select-model ::v-deep .u-mode-center-box,
.select-model ::v-deep .u-drawer-content {
overflow: visible !important;
}
.select-model ::v-deep .u-mode-center-box {
&::before {
position: absolute;
left: 45rpx;
top: -82rpx;
content: '';
width: 511rpx;
height: 268rpx;
background: url("http://static.drgyen.com/app/hc-app-power/images/project/model-top1.png") no-repeat;
background-size: 100% 100%;
z-index: 1076;
}
}
.select-project-box {
height: 557rpx;
padding-top: 170rpx;
// &::before{
// position: absolute;
// left: 45rpx;
// top: -82rpx;
// content: '';
// width: 511rpx;
// height: 268rpx;
// background: url("http://static.drgyen.com/app/hc-app-power/images/project/model-top1.png") no-repeat;
// background-size: 100% 100%;
// z-index: 1076;
// }
.select-project-title {
width: 538rpx;
height: 71rpx;
position: absolute;
left: 31rpx;
top: 204rpx;
background: url("http://static.drgyen.com/app/hc-app-power/images/project/model-top2.png") no-repeat;
background-size: 100% 100%;
z-index: 1076;
font-weight: 450;
font-size: 34rpx;
color: #333333;
display: flex;
justify-content: center;
align-items: center;
}
.select-project-scroll {
height: 354rpx;
.project-item {
font-size: 30rpx;
font-weight: 500;
line-height: 60rpx;
text-indent: 50rpx;
position: relative;
&::before {
position: absolute;
left: 0;
top: 10rpx;
content: '';
width: 40rpx;
height: 40rpx;
background: url("http://static.drgyen.com/app/hc-app-power/images/project/model-right.png") no-repeat;
background-size: 100% 100%;
z-index: 1076;
}
&.active {
&::after {
position: absolute;
right: 20rpx;
top: 7rpx;
content: '';
width: 26rpx;
height: 26rpx;
background: url("http://static.drgyen.com/app/hc-app-power/images/project/model-hook.png") no-repeat;
background-size: 100% 100%;
z-index: 1076;
}
}
}
}
}
</style>