730 lines
17 KiB
Vue
Raw Normal View History

<template>
<view class="fullHeight personContent">
<!-- <image src="/static/personManage/titleBG.png" class="titleBg"></image> -->
<headers :showBack="true" :themeType="'white'">
<view class="headerName">
人员管理
</view>
</headers>
<view class="topBox" :style="{ 'margin-top': (200-statusBarHeight-44 - 110) + 'px' }">
<!-- <image src="/static/personManage/left.png" class="topBoxBG" v-show="tabIndex==0"></image>
<image src="/static/personManage/right.png" class="topBoxBG" v-show="tabIndex==1"></image> -->
<view class="item item1" :class="tabIndex==0?'itemInner_active':'itemInner_active1'">
<view class="itemInner" @click="tabIndex=0">
<view class="">
<view class="txt" :class="tabIndex==0?'active':''">
现场施工人员
</view>
<view class="num">
{{statictisData.presencePerson.lwPersonTotal}}
</view>
</view>
</view>
<view class="itemInner" @click="tabIndex=1">
<view class="">
<view class="txt" :class="tabIndex==1?'active':''">
现场管理人员
</view>
<view class="num">
{{statictisData.presencePerson.glPersonTotal}}
</view>
</view>
</view>
</view>
<view class="safe_content">
<view>
<view></view>
<view class="el-statistic">
<view class="head">
出勤
</view>
<view class="con">
{{tabIndex==0?statictisData.attendancePerson.lwPersonTotal:statictisData.attendancePerson.glPersonTotal}}
</view>
</view>
</view>
<view>
<view></view>
<view class="el-statistic">
<view class="head">
在岗
</view>
<view class="con">
{{tabIndex==0?statictisData.toaltPerson.lwPersonTotal:statictisData.toaltPerson.glPersonTotal}}
</view>
</view>
</view>
<view>
<view></view>
<view class="el-statistic">
<view class="head">
昨日出勤率
</view>
<view class="con">
<view class="" v-if="statictisData.yesterdayAttendancePerson.totalPerson != 0">
<view class="num" v-show="tabIndex==0">
<text v-if="lwRadio(statictisData) === 999999999">
<text>-</text>
</text>
<text v-if="lwRadio(statictisData) > 0 && lwRadio(statictisData) !== 999999999">
<u-icon name="arrow-upward" color="#2979ff" size="40"></u-icon>
<text>{{Math.abs(lwRadio(statictisData))}}%</text>
</text>
<text v-if="lwRadio(statictisData) === 0">
<text>{{Math.abs(lwRadio(statictisData))}}%</text>
</text>
<text v-if="lwRadio(statictisData) < 0">
<u-icon name="arrow-downward" color="#FF0000" size="40"></u-icon>
<text>{{Math.abs(lwRadio(statictisData))}}%</text>
</text>
</view>
<view class="num" v-show="tabIndex==1">
<!-- {{((statictisData.yesterdayAttendancePerson.glPersonTotal/Number(statictisData.toaltPerson.glPersonTotal))*100).toFixed(2)}}% -->
<!-- {{(((statictisData.attendancePerson.glPersonTotal-statictisData.yesterdayAttendancePerson.glPersonTotal)/statictisData.yesterdayAttendancePerson.glPersonTotal)*100).toFixed(2)}}% -->
<text v-if="glRadio(statictisData) === 999999999">
<text>-</text>
</text>
<text v-if="glRadio(statictisData) > 0 && glRadio(statictisData) !== 999999999">
<u-icon name="arrow-upward" color="#2979ff" size="40"></u-icon>
<text>{{Math.abs(glRadio(statictisData))}}%</text>
</text>
<text v-if="glRadio(statictisData) === 0">
<text>{{Math.abs(glRadio(statictisData))}}%</text>
</text>
<text v-if="glRadio(statictisData) < 0">
<u-icon name="arrow-downward" color="#FF0000" size="40"></u-icon>
<text>{{Math.abs(glRadio(statictisData))}}%</text>
</text>
</view>
</view>
<view class="num" v-else>
0%
</view>
</view>
</view>
</view>
<view>
<view></view>
<!-- <view class="el-statistic">
<view class="head">
现场工种()
</view>
<view class="con">
{{statictisData.presencePerson.total_worker_type_num}}
</view>
</view> -->
<view class="el-statistic">
<view class="head">
{{tabIndex==0 ? '现场工种' : '现场岗位'}}()
</view>
<view class="con">
{{tabIndex==0 ? statictisData.presencePerson.lwTypeTotal : statictisData.presencePerson.glTypeTotal}}
</view>
</view>
</view>
</view>
</view>
<view class="container">
<view class="middleBox" v-if="COMPANY != 'longguang' && COMPANY != 'nanchang'">
<view class="box" @click="viewWorkerAnalysis">
<view class="box_1">
<image src="/static/bthgIcon/zggrfx.png" class="img" style="width: 60rpx;height: 60rpx;">
</image>
<text class="num">在岗工人分析</text>
</view>
<uni-icons2 class="arrowright" type="arrowright"></uni-icons2>
</view>
<view class="box" @click="viewTeamList">
<view class="box_1">
<image src="/static/bthgIcon/cdw.png" class="img" style="width: 64rpx;height: 64rpx;"></image>
<view class="">
<view class="num">
查队伍
</view>
<text class="num">{{statictisData.toaltPerson.total_team_num}}</text>
</view>
</view>
<uni-icons2 class="arrowright" type="arrowright"></uni-icons2>
</view>
</view>
<view class="box operateBox">
<!-- <view class="item" @click="viewSafeMange">
<view class="imgBox">
<image src="/static/personManage/aqjy.png" mode="" style="width: 29px;height: 40rpx;"></image>
</view>
<view class="txt">
安全教育
</view>
</view> -->
<!-- <view v-if="COMPANY != 'longguang'" class="item" @click="goClockIn" v-show="mobileAttendance==0">
<view class="imgBox">
<image src="/static/personManage/ydkq.png" mode="" style="width: 24rpx;height: 24rpx;"></image>
</view>
<view class="txt">
移动考勤
</view>
</view>
<view class="item" v-if="COMPANY == 'longguang'" @click="viewTeamList" v-show="mobileAttendance==0">
<view class="imgBox">
<image src="/static/personManage/cdw.png" mode="" style="width: 24rpx;height: 24rpx;"></image>
</view>
<view class="txt">
查队伍
</view>
</view> -->
<view class="item" @click="viewAttendence">
<view class="imgBox">
<image src="/static/bthgIcon/kqjl.png" mode=""></image>
</view>
<view class="txt">
考勤记录
</view>
</view>
<!-- <view class="item" @click="safeMeeting" v-if="COMPANY !='sccr'&& COMPANY != 'sanjiang'">
<view class="imgBox">
<image src="/static/personManage/kqjl.png" mode="" style="width: 23px;height: 40rpx;"></image>
</view>
<view class="txt">
班前喊话
</view>
</view> -->
<view class="item" @click="viewVideo"
v-if="COMPANY != 'nanchang'&& COMPANY != 'sccr'&& COMPANY != 'sanjiang'">
<view class="imgBox">
<image src="/static/bthgIcon/video.png" mode=""></image>
</view>
<view class="txt">
视频监控
</view>
</view>
<view class="item" @click="queryStaff">
<view class="imgBox">
<image src="/static/bthgIcon/cry.png" mode=""></image>
</view>
<view class="txt">
查人员
</view>
</view>
</view>
<!-- <view class="tabBarBox">
<view class="item active">
<image src="/static/personManage/index.png" class="img"></image>
<view class="txt">
首页
</view>
</view>
<view class="item" @click="queryStaff">
<image src="/static/personManage/search.png" class="img"></image>
<view class="txt">
查人员
</view>
</view>
<view class="item">
<image src="/static/personManage/location.png" class="img"></image>
<view class="txt">
定位
</view>
</view>
</view> -->
</view>
<levitatedsphere :x="100" :y="80"></levitatedsphere>
</view>
</template>
<script>
import levitatedsphere from "@/components/levitatedsphere/levitatedsphere.vue"
import headers from "../../../components/headers/headers.vue"
export default {
data() {
return {
projectDetail: null,
statictisData: {
attendancePerson: {
glPersonTotal: 0,
lsPersonTotal: 0,
lwPersonTotal: 0,
totalPerson: 0
},
presencePerson: {
glPersonTotal: 0,
lsPersonTotal: 0,
total_worker_type_num: 0,
lwPersonTotal: 0,
totalPerson: 0,
lwTypeTotal: 0
},
toaltPerson: {
glPersonTotal: 0,
total_team_num: 0,
lsPersonTotal: 0,
lwPersonTotal: 0,
totalPerson: 0
},
yesterdayAttendancePerson: {
glPersonTotal: 0,
lsPersonTotal: 0,
lwPersonTotal: 0,
totalPerson: 0,
}
},
statusBarHeight: 0,
tabIndex: 0,
mobileAttendance: 1, //是否能移动考勤0是1否
};
},
computed: {
},
onLoad() {
this.statusBarHeight = uni.getStorageSync('systemInfo').statusBarHeight
this.projectDetail = JSON.parse(uni.getStorageSync('projectDetail'))
this.mobileAttendance = JSON.parse(uni.getStorageSync('userInfo')).mobileAttendance
this.loadData()
},
methods: {
lwRadio(statictisData) {
let today = Number(statictisData.attendancePerson.lwPersonTotal)
let yesterday = Number(statictisData.yesterdayAttendancePerson.lwPersonTotal)
if (yesterday === 0) return 999999999
// yesterday = 5
// today = 5
if (today - yesterday === 0) return 0
let radio = (((today - yesterday) / yesterday) * 100).toFixed(2)
return radio
},
glRadio(statictisData) {
let today = statictisData.attendancePerson.glPersonTotal
let yesterday = statictisData.yesterdayAttendancePerson.glPersonTotal
if (yesterday === 0) return 999999999
// yesterday = 5
// today = 5
if (today - yesterday === 0) return 0
let radio = (((today - yesterday) / yesterday) * 100).toFixed(2)
return radio
},
loadData() {
var that = this
this.sendRequest({
url: 'xmgl/workerInfo/selectProjectSceneManageStatistics',
data: {
projectSn: this.projectDetail.projectSn
},
method: "POST",
success(res) {
that.statictisData = res.result
console.log('获取的数据', that.statictisData);
}
})
},
viewWorkerAnalysis() {
uni.navigateTo({
url: './workerAnalysis'
})
},
viewSafeMange() {
uni.navigateTo({
url: './safetyEducationManage/index'
})
},
viewTeamList() {
uni.navigateTo({
url: './searchTeam/teamList'
})
},
goClockIn() {
var userInfo = JSON.parse(uni.getStorageSync('userInfo'))
if (userInfo.accountType == 6) {
uni.navigateTo({
url: './clockIn?faceScore='
})
// uni.navigateTo({
// url:'./faceRecognition'
// })
} else {
uni.showModal({
title: '提示',
content: '只有项目子账号才能使用该功能!'
})
}
},
viewAttendence() {
uni.navigateTo({
url: 'attendanceManage'
})
},
safeMeeting() {
uni.navigateTo({
url: '../../videoManage/safeMeeting?sn=' + this.projectDetail.projectSn
})
},
viewVideo() {
uni.navigateTo({
url: '../../videoManage/videoList?sn=' + this.projectDetail.projectSn + '&pageType=backEnd'
})
},
//查询人员
queryStaff() {
uni.navigateTo({
url: './queryStaff'
})
},
}
}
</script>
<style lang="scss" scoped>
.personContent {
color: $uni-text-color2;
font-size: 30rpx;
background-image: url(@/static/bthgIcon/main_bg1.png);
background-repeat: no-repeat;
background-size: 100%;
background-color: #F3F5F7;
height: 100%;
:deep(.headerBox ){
background-color: transparent;
border-bottom: none;
}
}
.container {
// height: calc(100vh - 264rpx - 88rpx - 144rpx);
background-color: #F3F5F7;
}
.safe_content {
display: flex;
height: 140rpx;
// background-color: #E9F2FF;
background-color: #FFFFFF;
// border-radius: 16rpx;
padding: 0 24rpx;
>view:nth-child(1) {
width: 20%;
>view:first-child {
border: 6rpx solid #7caaf9;
}
}
>view:nth-child(2) {
width: 20%;
>view:first-child {
border: 6rpx solid #98e87a;
}
}
>view:nth-child(3) {
width: 30%;
>view:first-child {
border: 6rpx solid #f97c7c;
}
}
>view:nth-child(4) {
width: 30%;
>view:first-child {
border: 6rpx solid #98e87a;
}
}
>view {
display: flex;
// align-items: center;
>view:first-child {
width: 30rpx;
height: 30rpx;
background-color: white;
border-radius: 50%;
margin-left: 10rpx;
margin-top: 30rpx;
}
.el-statistic {
flex: 1;
text-align: left;
margin-left: 16rpx;
display: flex;
flex-direction: column;
justify-content: center;
.head {
color: #666666;
font-size: 26rpx;
}
.con {
color: #0056a8;
font-weight: bold;
justify-content: flex-start;
font-size: 36rpx;
margin-top: 10rpx;
}
}
}
}
.titleBg {
width: 100%;
position: absolute;
top: 0;
left: 0;
height: 200px;
}
.middleBox {
// display: flex;
// align-items: center;
margin: 0 30rpx 30rpx;
padding-top: 30rpx;
.box {
// flex: 1;
// display: inline-flex;
height: 100rpx;
background: #FFFFFF;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 36rpx;
padding: 0 40rpx 0 44rpx;
.box_1 {
display: flex;
align-items: center;
.img {
margin-right: 16rpx;
// margin-left: 40rpx;
}
>view {
display: flex;
}
.num {
color: #2D8EF3;
font-size: 30rpx;
margin-left: 36rpx;
}
}
.arrowright {
color: #2D8EF3 !important;
font-size: 40rpx !important;
}
}
}
.box {
// box-shadow: 0 4px 24px 0px rgba(212, 220, 236, 0.69);
// border-radius: 16rpx;
}
.operateBox {
display: flex;
align-items: center;
font-size: 24rpx;
// height: 120rpx;
margin: 0 30rpx;
flex-wrap: wrap;
justify-content: space-between;
// >.item:last-child {
// margin-left: 34rpx;
// }
.item {
width: 48%;
height: 120rpx;
display: flex;
align-items: center;
background-color: white;
border-radius: 8rpx;
padding: 0 16rpx;
.imgBox {
display: flex;
align-items: center;
justify-content: center;
// margin-bottom: 20rpx;
>image {
width: 88rpx;
height: 88rpx;
}
}
.txt {
font-size: 32rpx;
text-align: center;
margin-left: 44rpx;
}
}
.item:not(:nth-child(-n + 2)) {
margin-top: 32rpx;
}
}
.tabBarBox {
display: flex;
align-items: center;
font-size: 24rpx;
border-top: 1px solid rgba(151, 151, 151, 0.2);
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 64rpx;
.item {
flex: 1;
// display: inline-flex;
text-align: center;
color: rgba(148, 149, 173, 1);
.img {
width: 70rpx;
height: 70rpx;
}
&.active {
color: rgba(72, 141, 236, 1);
}
}
}
.topBox {
position: relative;
// height: 270px;
z-index: 4;
margin-top: 164rpx !important;
// background-color: #FFFFFF;
// border-radius: 40rpx 40rpx 0 0;
.topBoxBG {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
}
.item {
// margin: 0 20rpx;
display: flex;
.itemInner {
display: inline-flex;
flex: 1;
align-items: center;
justify-content: center;
&:first-child {
border-right: 1px solid rgba(55, 45, 102, 0.1);
}
}
.txt {
// color: rgba(55, 45, 102, 0.6);
color: #FFFFFF;
font-size: 30rpx;
text-align: center;
}
.active {
color: rgba(55, 45, 102, 1);
font-weight: bold;
}
.num {
font-size: 40rpx;
font-weight: bold;
text-align: center;
color: #4A8EEC;
}
}
.item1 {
height: 100rpx;
border-radius: 40rpx 40rpx 0 0;
// background-color: #97C6F9;
// padding-top: 20rpx;
background-repeat: no-repeat;
background-size: 100% 100%;
.itemInner {
>view {
display: flex;
align-items: center;
}
&:first-child {
border-right: none;
}
}
}
.itemInner_active {
// background-color: white;
// border-radius: 40rpx 120rpx 0 0;
background-image: url("@/static/bthgIcon/itemInner_active.png");
}
.itemInner_active1 {
background-image: url("@/static/bthgIcon/itemInner_active1.png");
// background-color: white;
// border-radius: 120rpx 40rpx 0 0;
}
.item2 {
height: 20%;
margin: 4% 20rpx;
// padding-bottom: 2%;
// .itemInner{
// padding-bottom: 20rpx;
// }
}
.item3 {
padding-top: 4%;
height: 20%;
position: relative;
&::after {
content: "";
position: absolute;
left: 5%;
width: 90%;
top: 0px;
border-top: 1px solid rgba(55, 45, 102, 0.1);
}
}
}
</style>