634 lines
19 KiB
Vue
Raw Normal View History

2024-05-14 18:16:51 +08:00
<template>
2025-05-13 15:42:47 +08:00
<view class="specialOperations">
<headers class="fixedheader" :themeType="true" :showBack="true">
<view class="headerName"> 特种作业 </view>
</headers>
<view class="sp-menu-wrapper" style="padding-top: 44px">
<view class="menu-title"> 作业中心 </view>
<view class="sp-menu">
<view class="menu-item" @click="handleNavigateTo(20)">
<view class="item-icon">
<image src="@/static/specialOperations/fireWork.png"></image>
</view>
<view class="item-text">
<text>新动火作业</text>
</view>
</view>
<view class="menu-item" @click="handleNavigateTo(1)">
<view class="item-icon">
<image src="@/static/specialOperations/fireWork.png"></image>
</view>
<view class="item-text">
<text>动火作业</text>
</view>
</view>
<view class="menu-item" @click="handleNavigateTo(2)">
<view class="item-icon">
<image src="@/static/specialOperations/limitSpaceWork.png"></image>
</view>
<view class="item-text">
<text>受限空间</text>
</view>
</view>
<view class="menu-item" @click="handleNavigateTo(3)">
<view class="item-icon">
<image src="@/static/specialOperations/bindPlatePlug.png"></image>
</view>
<view class="item-text">
<text>盲板抽堵</text>
</view>
</view>
<view class="menu-item" @click="handleNavigateTo(4)">
<view class="item-icon">
<image src="@/static/specialOperations/highJob.png"></image>
</view>
<view class="item-text">
<text>高处作业</text>
</view>
</view>
<view class="menu-item" @click="handleNavigateTo(5)">
<view class="item-icon">
<image src="@/static/specialOperations/hoistSafe.png"></image>
</view>
<view class="item-text">
<text>吊装安全</text>
</view>
</view>
<view class="menu-item" @click="handleNavigateTo(6)">
<view class="item-icon">
<image src="@/static/specialOperations/tempElectricity.png"></image>
</view>
<view class="item-text">
<text>临时用电</text>
</view>
</view>
<view class="menu-item" @click="handleNavigateTo(7)">
<view class="item-icon">
<image src="@/static/specialOperations/groundSafe.png"></image>
</view>
<view class="item-text">
<text>动土作业</text>
</view>
</view>
<view class="menu-item" @click="handleNavigateTo(8)">
<view class="item-icon">
<image src="@/static/specialOperations/openCircuit.png"></image>
</view>
<view class="item-text">
<text>断路作业</text>
</view>
</view>
</view>
</view>
<view class="sp-menu-wrapper">
<view class="menu-title"> 统计分析 </view>
<view class="search-btn-wrapper">
<view class="search-btn" :class="{ active: searchType === 1 }" @click="handleSearchType(1)"> 最近7天 </view>
<view class="search-btn" :class="{ active: searchType === 2 }" @click="handleSearchType(2)"> 最近30天 </view>
<view class="search-btn" :class="{ active: searchType === 3 }" @click="handleSearchType(3)"> 自定义 </view>
</view>
</view>
<view class="sp-menu-wrapper">
<view class="menu-title"> 特殊作业数量趋势 </view>
<view class="chart-wrapper">
<u-charts
class="ucharts"
:cWidth="355"
:cHeight="300"
canvas-id="lineChart"
chartType="line"
:opts="chartOptions"
ref="lineChart"
/>
</view>
</view>
<!-- 筛选条件弹框 -->
<uni-popup class="screenDialog" ref="screenShow" :maskClick="true" @change="closeMenu" :show="popupShow">
<view class="screenContent">
<scroll-view style="height: 100%" scroll-y>
<view class="closeIcon" @click="closeBtn"> × </view>
<view class="screenTitle"> 筛选条件 </view>
<view class="titleItem">自定义时间</view>
<view class="screenItem">
<view class="screenI" style="width: 140px; position: relative">
<dateTimePicker
v-if="startTime === ''"
placeholder="开始时间"
fields="day"
@change="pickerChange($event, 'startTime')"
class="dateTimePicker"
>
</dateTimePicker>
<view v-else>{{ startTime }}</view>
<view v-if="startTime != ''" @click="showTimePicker(1)" style="position: absolute; top: -1vh; left: 34vw; font-size: 16px"
>×</view
>
</view>
<span style="color: gray; margin: 6% 5px"></span>
<view class="screenI" style="width: 140px; position: relative">
<dateTimePicker
v-if="endTime === ''"
placeholder="结束时间"
fields="day"
@change="pickerChange($event, 'endTime')"
class="dateTimePicker"
>
</dateTimePicker>
<view v-else>{{ endTime }}</view>
<view v-if="endTime != ''" @click="showTimePicker(2)" style="position: absolute; top: -1vh; left: 34vw; font-size: 16px"
>×</view
>
</view>
</view>
<view class="line"></view>
<view class="footerBtn">
<view class="foterLeft" @click="resettingBtn"> 重置 </view>
<view class="foterRight" @click="closeRed"> 确定 </view>
</view>
</scroll-view>
</view>
</uni-popup>
<levitatedsphere :x="100" :y="80"></levitatedsphere>
</view>
2024-05-14 18:16:51 +08:00
</template>
<script>
2025-05-13 15:42:47 +08:00
import { GetDateStr } from '../../../static/js/util.js'
import uCharts from '@/components/u-charts/component.vue'
import dateTimePicker from '@/components/dateTimePicker/index.vue'
import levitatedsphere from '@/components/levitatedsphere/levitatedsphere.vue'
import headers from '../../../components/headers/headers.vue'
export default {
navigationBarTitleText: '页面标题',
components: {
uCharts,
dateTimePicker
},
data() {
return {
userInfo: {},
moduleList: [],
menuList: [],
searchType: 1, // 1:最近7天 2:最近30天 3:自定义
startTime: '',
endTime: '',
popupShow: false,
chartOptions: {
legends: true,
legend: {
show: true,
position: 'top',
lineHeight: 18
},
categories: [],
series: []
}
}
},
onReady() {},
created() {},
mounted() {},
onLoad() {
this.searchType = 1
this.startTime = GetDateStr(-7, '-')
this.endTime = GetDateStr(0, '-')
this.getChartData()
// uni.showLoading({
// title: "加载中...",
// })
// setTimeout(() =>{
// this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
// this.moduleList = this.userInfo.menuAuthority.moduleList
// this.moduleList.map(item => {
// if(item.plugin === "specialOperations") this.menuList = item.menuList
// })
// if(this.menuList.length > 0){
// this.menuList.map(item => {
// if(item.path === "/project/specialWork/fireWork") item.iconImg = 'fireWork.png'
// if(item.path === "/project/specialWork/confinedSpaceWork") item.iconImg = 'limitSpaceWork.png'
// if(item.path === "/project/specialWork/blindPlugWork") item.iconImg = 'bindPlatePlug.png'
// if(item.path === "/project/specialWork/towerOverWork") item.iconImg = 'highJob.png'
// if(item.path === "/project/specialWork/riggingOutWork") item.iconImg = 'hoistSafe.png'
// if(item.path === "/project/specialWork/temporaryPowerWork") item.iconImg = 'tempElectricity.png'
// if(item.path === "/project/specialWork/startBuildingWork") item.iconImg = 'groundSafe.png'
// if(item.path === "/project/specialWork/disconnectionWork") item.iconImg = 'openCircuit.png'
// })
// }
// console.log("userInfo=======================",this.userInfo);
// console.log("moduleList=======================",this.moduleList);
// },500)
// uni.hideLoading()
},
methods: {
handleSearchType(val) {
if (val === this.searchType) return
this.searchType = val
if (val === 1) {
this.startTime = GetDateStr(-7, '-')
this.endTime = GetDateStr(0, '-')
this.getChartData()
}
if (val === 2) {
this.startTime = GetDateStr(-30, '-')
this.endTime = GetDateStr(0, '-')
this.getChartData()
}
if (val === 3) {
this.startTime = ''
this.endTime = ''
this.$refs.screenShow.open()
this.popupShow = true
}
},
handleNavigateTo(val) {
// if(val === "/project/specialWork/fireWork") uni.navigateTo({ url: "./fireWork/work" })
// if(val === "/project/specialWork/confinedSpaceWork") uni.navigateTo({ url: "./limitSpaceWork/work" })
// if(val === "/project/specialWork/blindPlugWork") uni.navigateTo({ url: "./bindPlatePlug/work" })
// if(val === "/project/specialWork/towerOverWork") uni.navigateTo({ url: "./highJob/work" })
// if(val === "/project/specialWork/riggingOutWork") uni.navigateTo({ url: "./hoistSafe/work" })
// if(val === "/project/specialWork/temporaryPowerWork") uni.navigateTo({ url: "./tempElectricity/work" })
// if(val === "/project/specialWork/startBuildingWork") uni.navigateTo({ url: "./groundSafe/work" })
// if(val === "/project/specialWork/disconnectionWork") uni.navigateTo({ url: "./openCircuit/work" })
if (val === 20) uni.navigateTo({ url: './fireWork/newWork' })
if (val === 1) uni.navigateTo({ url: './fireWork/work' })
if (val === 2) uni.navigateTo({ url: './limitSpaceWork/work' })
if (val === 3) uni.navigateTo({ url: './bindPlatePlug/work' })
if (val === 4) uni.navigateTo({ url: './highJob/work' })
if (val === 5) uni.navigateTo({ url: './hoistSafe/work' })
if (val === 6) uni.navigateTo({ url: './tempElectricity/work' })
if (val === 7) uni.navigateTo({ url: './groundSafe/work' })
if (val === 8) uni.navigateTo({ url: './openCircuit/work' })
},
//点击重新选择时间
showTimePicker(type) {
if (type == 1) {
this.startTime = ''
} else {
this.endTime = ''
}
},
pickerChange(e, type) {
console.log(e, '======')
if (type === 'startTime') {
this.startTime = e.f1
} else {
this.endTime = e.f1
}
},
closeMenu(e) {
console.log('关闭!!!!', e)
if (e.show == false) {
this.popupShow = false
if (!this.startTime || !this.endTime) {
this.searchType = 1
this.startTime = GetDateStr(-7, '-')
this.endTime = GetDateStr(0, '-')
this.getChartData()
}
}
},
resettingBtn() {
this.$refs.screenShow.close()
this.popupShow = false
this.searchType = 1
this.startTime = GetDateStr(-7, '-')
this.endTime = GetDateStr(0, '-')
this.getChartData()
},
closeRed() {
this.$refs.screenShow.close()
this.popupShow = false
this.getChartData()
},
//关闭筛选
closeBtn() {
this.$refs.screenShow.close()
this.popupShow = false
},
getChartData() {
this.sendRequest({
url: 'xmgl/xzSpecial/countSpecialByData',
method: 'post',
data: {
projectSn: JSON.parse(uni.getStorageSync('userInfo')).sn,
startTime: this.startTime,
endTime: this.endTime
},
success: res => {
if (res.code == 200) {
console.log('getChartData======================', res)
let list = res.result || []
let categories = []
let series = []
let data1 = {
name: '新动火',
data: []
}
let data2 = {
name: '受限空间',
data: []
}
let data3 = {
name: '盲板抽堵',
data: []
}
let data4 = {
name: '高处作业',
data: []
}
let data5 = {
name: '吊装安全',
data: []
}
let data6 = {
name: '临时用电',
data: []
}
let data7 = {
name: '动土作业',
data: []
}
let data8 = {
name: '断路作业',
data: []
}
list.forEach(item => {
categories.push(item.date)
data1.data.push(item.xzSpecialOperationFireSafetyNum)
data2.data.push(item.xzLimitSpaceSafeNum)
data3.data.push(item.xzBlindPlatePlugSafeNum)
data4.data.push(item.xzHighJobSafeNum)
data5.data.push(item.xzHoistSafetyWorkNum)
data6.data.push(item.xzTemporaryElectricitySafeNum)
data7.data.push(item.xzGroundSafetNum)
data8.data.push(item.xzOpenCircuitSafeNum)
})
series = [data1, data2, data3, data4, data5, data6, data7, data8]
this.chartOptions.series = series
this.chartOptions.categories = categories
}
}
})
}
}
}
2024-05-14 18:16:51 +08:00
</script>
<style lang="scss">
2025-05-13 15:42:47 +08:00
.specialOperations {
background-color: #f1f3f5;
height: 100vh;
.fixedheader {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 2;
}
.sp-menu-wrapper {
width: 100%;
// padding-top: 200rpx;
background-color: #fff;
margin-bottom: 24rpx;
.menu-title {
height: 80rpx;
font-size: 32rpx;
line-height: 40rpx;
font-weight: bold;
padding: 0 38rpx;
margin-bottom: 20rpx;
color: #333333;
display: flex;
align-items: center;
border-bottom: 2rpx solid rgba(187, 187, 187, 0.1);
}
.sp-menu {
margin: 0 38rpx;
// height: 1200rpx;
// height: 1000rpx;
// background-color: darkred;
display: grid;
grid-gap: 24rpx;
grid-template-columns: repeat(4, 1fr);
// grid-template-columns: repeat(auto-fill, 220rpx);
// place-items: center;
// justify-content: center;
.menu-item {
// width: 220rpx;
height: 160rpx;
// background-color: darkblue;
// box-shadow: 0px 8rpx 15rpx 0px rgba(219,229,255,0.6);
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
.item-icon {
// width: 220rpx;
// height: 220rpx;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 14rpx;
image {
width: 66rpx;
height: 86rpx;
}
}
.item-text {
align-items: center;
// width: 220rpx;
height: 54rpx;
display: flex;
justify-content: center;
align-items: center;
text {
text-align: center;
display: flex;
justify-content: center;
white-space: nowrap;
font-size: 28rpx;
}
}
}
}
.search-btn-wrapper {
display: flex;
justify-content: center;
height: 80rpx;
gap: 60rpx;
.search-btn {
width: 160rpx;
height: 60rpx;
display: flex;
justify-content: center;
align-items: center;
background-color: rgba(182, 182, 182, 0.15);
color: rgba(14, 32, 76, 1);
border-radius: 30rpx;
border: 1px solid rgba(128, 128, 128, 0.13);
font-size: 24rpx;
&.active {
background-color: rgba(61, 150, 253, 1);
color: #fff;
}
}
}
}
}
.screenDialog {
position: absolute;
// top: 11%;
height: 95%;
/* background: pink; */
background: white;
width: 100%;
border-radius: 20px;
margin-left: -4%;
background-color: white;
/* 设置为半透明的灰色 */
z-index: 9;
/* 设置一个较大的 z-index 值,保证遮罩层在最上层 */
.closeIcon {
float: right;
font-size: 25px;
color: gray;
margin-right: 3%;
}
.screenTitle {
text-align: center;
margin-top: 4%;
font-size: 18px;
font-weight: 500;
}
.uni-popup__wrapper-box {
height: 70vh;
overflow: scroll;
position: fixed;
bottom: 0;
}
.screenContent {
width: 100vw;
height: 40%;
// width: 90%;
// margin: -65% 0%;
overflow: scroll;
// position: relative;
// margin-top: 180%;
border-radius: 20px 20px 0 0;
// margin-left: -4%;
background-color: white;
padding-left: 10%;
position: fixed;
left: 0;
bottom: 0;
.titleItem {
font-size: 14px;
.regionText {
display: inline-block;
margin-left: 16%;
width: 190px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
}
}
.screenItem {
display: flex;
flex-wrap: wrap;
.screenI {
width: 100px;
font-size: 12px;
height: 30px;
background: #f7f8fa;
border-radius: 15px;
text-align: center;
line-height: 30px;
color: gray;
margin: 5% 0;
}
.screenText {
width: 90px;
font-size: 12px;
height: 30px;
background: #f7f8fa;
border-radius: 15px;
text-align: center;
line-height: 30px;
color: #000;
margin: 5% 5% 5% 0%;
}
.active {
width: 90px;
font-size: 12px;
height: 30px;
background: #edf2fe;
border-radius: 15px;
text-align: center;
line-height: 30px;
color: #000;
margin: 5% 5% 5% 0%;
border: 1px solid #5181f6;
}
.screenTextClose {
width: 90px;
font-size: 12px;
height: 30px;
text-align: center;
line-height: 30px;
color: #000;
margin: 5% 5% 5% 0%;
}
}
.footerBtn {
display: flex;
text-align: center;
line-height: 40px;
margin-top: 2%;
// margin-left: 6%;
position: absolute;
width: 100%;
bottom: 20px;
.foterLeft {
width: 43%;
background: #f6f7f8;
height: 40px;
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
color: #5181f6;
}
.foterRight {
width: 43%;
background: #5181f6;
height: 40px;
border-top-right-radius: 20px;
border-bottom-right-radius: 20px;
color: #fff;
}
}
::v-deep .placeholder {
padding-left: 40px;
}
2024-05-14 18:16:51 +08:00
}
</style>