546 lines
13 KiB
Vue
Raw Normal View History

<template>
<view class="fullHeight bgLightBlue">
<scroll-view scroll-y="true" class="pageContent">
<headers :showBack="parentSn">
<view class="headerName">
{{currentCompany.companyName}}
</view>
</headers>
<scroll-view v-if="userInfo.accountType!=5&&userInfo.accountType!=6" class="scroll-view_H" scroll-x="true">
<view class="scroll-view-item_H" :class="activeTabIndex==-1?'active':''" @click="changeLevel(-1)">
<text class="name">{{currentCompany.companyName=='集团'?currentCompany.companyName:'全部'}}</text>
</view>
<view class="scroll-view-item_H" :class="activeTabIndex==index?'active':''" v-for="(item,index) in mapData" :key="index"
@click="changeLevel(index)">
<text class="name">{{item.name}}</text>
</view>
</scroll-view>
<view class="blockBox">
<view class="blockContent">
<u-charts class="labourCanvas" :cWidth="355" :cHeight="120" canvas-id="labourCanvas" chartType="arcbar" :opts="personnelsChartData"
ref="labourCanvas" />
<uni-icons2 @click="forwardFn" v-show="activeTabIndex!=-1&&!mapData[activeTabIndex].projectSn" class="forwardImg" style="color: #007AFF;" type="arrowright" size="30"></uni-icons2>
<view class="dataBox">
<view class="dataItem">
<view class="text">
在场
</view>
<view class="num primaryText" style="color: #FFB512;">
{{listData.presencecount?listData.presencecount.totalPerson:0}}
</view>
</view>
<view class="dataItem">
<view class="text">
实名制
</view>
<view class="num primaryText" style="color: #0CCD90;">
{{listData.workercount?listData.workercount.totalPerson:0}}
</view>
</view>
<view class="dataItem">
<view class="text">
在职
</view>
<view class="num primaryText" style="color: #0F7FE7;">
{{listData.workercount?listData.workercount.totalPerson:0}}
</view>
</view>
</view>
</view>
</view>
<view class="blockBox">
<view class="blockTitle flex">
<view class="titleName">
现场人员分析
</view>
<uni-icons2 type="arrowright" color="#007aff" @click="goAnalyse" style="font-weight: 700;font-size: 40rpx;" />
</view>
<view class="blockContent">
<view class="dataBox">
<view class="dataItem">
<view class="num primaryText">
{{listData.presencecount?listData.presencecount.lwPersonTotal:0}}
</view>
<view class="text">
在场施工人员
</view>
</view>
<view class="dataItem">
<view class="num primaryText">
{{listData.presencecount?listData.presencecount.glPersonTotal:0}}
</view>
<view class="text">
在场管理人员
</view>
</view>
</view>
</view>
</view>
<view class="blockBox">
<view class="blockTitle flex">
<view class="titleName">
工种情况
</view>
<view style="font-size: 24rpx; color: #262D47; opacity: 0.8;">左右滑动查看更多</view>
</view>
<view class="blockContent">
<u-charts class="ucharts" :cWidth="355" :cHeight="160" canvas-id="chartPeopleWork" chartType="column" :opts="workTypeChartData"
ref="chartPeopleWork" />
</view>
</view>
<view class="blockBox">
<view class="blockTitle flex">
<view class="titleName">
工人年龄统计
</view>
<view style="font-size: 24rpx; opacity: 0.8;" class="flex">
<view style="width:20rpx;height:20rpx; background-color:#2A8BE7; margin-right: 10rpx;"></view>在场人数
<view style="width:20rpx;height:20rpx; background-color:#80D5FF; margin:0 10rpx 0 20rpx;"></view> 在职人数
</view>
</view>
<view class="blockContent">
<u-charts class="ucharts" :cWidth="355" :cHeight="160" canvas-id="chartProjectAge" chartType="column" :opts="ageChartData"
ref="chartProjectAge" />
</view>
<view class="flex" style="margin: 10rpx; font-size: 28rpx;">
<text>平均年龄</text>
<view>
<text style="margin-right: 26rpx;color: #2A8BE7;">在场{{listData.presencecount?listData.presencecount.avgage.toFixed(0):0}}</text>
<text style="color: #80D5FF">在职{{listData.workercount?listData.workercount.avgage.toFixed(0):0}}</text>
</view>
</view>
</view>
<view class="blockBox">
<view class="blockTitle">
<view class="titleName">
入场培训教育交底
</view>
</view>
<view class="blockContent">
<u-charts class="ucharts" :cWidth="355" :cHeight="130" canvas-id="integritySafety2" chartType="ring" :opts="infoSafetyChartData"
ref="integritySafety2" />
</view>
</view>
<view style="width: 100%; height: 1px;"></view>
</scroll-view>
<footers :activeTab="'personManage'"></footers>
</view>
</template>
<script>
import headers from '../../components/headers/headers.vue'
import footers from '../../components/footers/footers.vue'
import uCharts from '@/components/u-charts/component.vue';
import uniIcons from "@/components/uni-icons/uni-icons.vue"
export default {
components: {
headers,
footers,
uCharts,
uniIcons
},
data() {
return {
userInfo: null,
listData: {}, // 页面数据集
// showMapBack:false,
backArr: [],
searchsn: '',
mapData: [],
activeTabIndex: -1,
parentSn: '',
currentCompany: {
companyName: '集团',
},
//头部半环数据
personnelsChartData: {
series: [{
name: '劳务',
data: 0,
color: '#FFB512',
},
{
name: '',
data: 0,
color: '#0CCD90',
},
{
name: '',
data: 0,
color: '#0F7FE7',
},
]
},
workTypeChartData: {
categories: [],
series: []
},
ageChartData: {
categories: [
"18及以下",
"18-25岁",
"25-35岁",
"35-45岁",
"45-59岁",
"60及以上",
],
series: [{
data: [],
color: '#2A8BE7'
},
{
data: [],
color: '#80D5FF'
},
]
},
infoSafetyChartData: {
title: {
name: "",
color: '#7cb5ec',
fontSize: 25,
offsetY: 0,
},
series: [{
"data": 0,
color: '#1890FF'
},
{
"data": 0,
color: '#E7EDF3'
}
]
}
};
},
onLoad(options) {
this.userInfo = JSON.parse(uni.getStorageSync('userInfo'));
this.getAreaList(true);
},
onShow() {
// console.log('onShow')
let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
let curRoute = routes[routes.length - 1].route //获取当前页面路由
let curParam = routes[routes.length - 1].options; //获取路由参数
if (curParam.sn) {
this.parentSn = curParam.sn
this.searchsn = curParam.sn
}
this.activeTabIndex = -1;
if (this.parentSn) {
this.getAreaList(false);
this.loadStatictisData()
} else {
this.initData();
}
},
mounted() {
// console.log('mounted')
},
methods: {
//权限判断
initData(type) {
var that = this
switch (that.userInfo.accountType) {
case 2:
this.searchsn = that.userInfo.headquartersSn
break;
case 3:
this.searchsn = that.userInfo.sn
break;
case 4:
this.searchsn = that.userInfo.sn
break;
case 5:
this.searchsn = that.userInfo.sn
break;
case 6:
this.searchsn = that.userInfo.sn
break;
case 7:
this.searchsn = that.userInfo.sn
break;
}
if (that.userInfo.accountType == 5 || that.userInfo.accountType == 6 || that.userInfo.accountType == 10) {
// this.getProjectDetail()
} else {
this.getAreaList(type);
}
this.loadStatictisData()
},
//获取区域
getAreaList() {
let that = this;
this.sendRequest({
url: "xmgl/company/getComapnyStatisticsList",
method: 'POST',
data: {
sn: this.searchsn,
},
success(res) {
that.mapData = res.result.companyList ? res.result.companyList : res.result.projectList
if (res.result.companyInfo) {
that.currentCompany = res.result.companyInfo
}
}
})
},
//切换企业地区
changeLevel(index) {
this.activeTabIndex = index;
// console.log('changeLevel', index)
if (this.activeTabIndex != -1) {
this.searchsn = this.mapData[index].projectSn ? this.mapData[index].projectSn : this.mapData[index].companySn
// this.loadData(false);
this.loadStatictisData()
if (this.mapData[index].projectSn) {
// this.getProjectDetail()
}
} else {
if (this.parentSn) {
this.searchsn = this.parentSn
// this.loadData(false);
this.loadStatictisData()
} else {
this.initData(true)
}
}
},
//获取区域下的数据
loadStatictisData() {
let that = this;
this.sendRequest({
url: 'xmgl/workerInfo/selectWorkerManageStatistics',
data: {
sn: that.searchsn,
},
method: 'post',
success(res) {
let data = res.result;
that.listData = data;
//头部半圆数据
let count = (data.presencecount.totalPerson + data.workercount.totalPerson * 2) / 100;
that.personnelsChartData = {
series: [{
name: '劳务',
data: (data.presencecount.totalPerson / count) / 100,
color: '#FFB512',
},
{
name: '',
data: (data.workercount.totalPerson / count) / 100,
color: '#0CCD90',
},
{
name: '',
data: (data.workercount.totalPerson / count) / 100,
color: '#0F7FE7',
},
]
};
that.$refs.labourCanvas.changeData('labourCanvas', that.personnelsChartData);
//获取工种信息
let obj = {
data: [],
color: '#0F7FE7',
name:'',
};
let titleArr = [];
data.workerTypeList.forEach(item => {
titleArr.push(item.typeName);
obj.data.push(item.personNum)
})
that.workTypeChartData.categories = titleArr;
that.workTypeChartData.series = [obj];
that.$refs.chartPeopleWork.changeData('chartPeopleWork', that.workTypeChartData);
//获取工人年龄统计
that.ageChartData.series = [{
data: [data.presencecount.age18, data.presencecount.age18to25, data.presencecount.age25to35,
data.presencecount.age35to45, data.presencecount.age45to60, data.presencecount.age60
],
color: '#2A8BE7',
name:'在场人数',
},
{
data: [data.workercount.age18, data.workercount.age18to25, data.workercount.age25to35,
data.workercount.age35to45, data.workercount.age45to60, data.workercount.age60
],
color: '#80D5FF',
name:'在职人数',
},
];
that.$refs.chartProjectAge.changeData('chartProjectAge', that.ageChartData);
//获取培训数据
let trainingNum = (data.workercount.eduPersonTotal / data.workercount.totalPerson) * 100;
that.infoSafetyChartData.title = {
name: Number.isNaN(trainingNum) ? '0%' : Number(trainingNum.toFixed(2)) + "%",
color: '#7cb5ec',
fontSize: 25,
offsetY: 0,
};
that.infoSafetyChartData.series = [{
"data": Number.isNaN(trainingNum) ? 0 : Number(trainingNum.toFixed(2)),
color: '#1890FF'
},
{
"data": Number.isNaN(trainingNum) ? 0 : Number((100 - trainingNum).toFixed(2)),
color: '#E7EDF3'
}
];
that.$refs.integritySafety2.changeData('integritySafety2', that.infoSafetyChartData);
}
})
},
forwardFn() {
var type = 'area'
if (this.mapData[this.activeTabIndex].projectSn) {
type = 'project'
}
uni.navigateTo({
url: './personManage?sn=' + this.searchsn + '&type=' + type
})
},
//现场人员分析
goAnalyse() {
let title = this.activeTabIndex == -1 ? '集团' : this.mapData[this.activeTabIndex].name;
uni.navigateTo({
url: './peopleAnalyze?sn=' + this.searchsn + '&title=' + title,
})
},
}
}
</script>
<style lang="scss">
.flex {
display: flex;
align-items: center;
justify-content: space-between;
}
.blockBox {
box-sizing: border-box;
}
.blockBox .blockTitle .titleName::before {
height: 75%;
top: 16%;
}
.labourCanvas {
width: 100%;
height: 240rpx;
}
.blockContent {
position: relative;
}
.ucharts {
width: 100%;
height: 175px;
}
.forwardImg {
position: absolute;
right: 20rpx;
top: 50%;
margin-top: -30rpx;
opacity: 0.9;
}
.statusTips {
position: absolute;
right: 0px;
top: 4rpx;
display: flex;
align-items: center;
.kuai {
width: 24rpx;
height: 24rpx;
margin-left: 16rpx;
}
.text {
font-size: 24rpx;
color: $uni-text-color;
opacity: 0.9;
margin-left: 6rpx;
}
}
.kuai1 {
background-color: $uni-color-primary;
}
.kuai2 {
background-color: $--color-primary2;
}
.kuai3 {
background-color: $--color-primary6;
}
.kuai4 {
background-color: $--color-primary3;
}
.kuaiBox {
display: inline-flex;
align-items: center;
margin-bottom: 6rpx;
.kuai {
min-width: 40rpx;
height: 40rpx;
line-height: 40rpx;
color: white;
font-size: 24rpx;
}
}
.avgageBox {
font-size: 28rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 20rpx;
color: $uni-text-color;
.primaryText {
margin-right: 20rpx;
}
}
</style>