2024-05-13 11:44:23 +08:00

562 lines
15 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>
<div class="political-outlook">
<div class="content">
<!-- v-show="topDangerList.length > 0" -->
<div class="top-statistics" v-show="topDangerList.length > 0">
<div class="statistics-item" v-for="(item,index) in topDangerList" :key="index">
<span class="title">{{item.alarmTypeName}}</span>
<span class="statistics-item-content">今日报警次数0</span>
<span class="statistics-item-content">本月报警次数0</span>
<span class="statistics-item-content">历史报警次数0</span>
</div>
<!-- <div class="statistics-item">
<span class="title">烟雾检测</span>
<span class="statistics-item-content">今日报警次数1</span>
<span class="statistics-item-content">本月报警次数1</span>
<span class="statistics-item-content">历史报警次数1</span>
</div>
<div class="statistics-item">
<span class="title">人员聚集</span>
<span class="statistics-item-content">今日报警次数1</span>
<span class="statistics-item-content">本月报警次数1</span>
<span class="statistics-item-content">历史报警次数1</span>
</div>
<div class="statistics-item">
<span class="title">违规吸烟</span>
<span class="statistics-item-content">今日报警次数1</span>
<span class="statistics-item-content">本月报警次数1</span>
<span class="statistics-item-content">历史报警次数1</span>
</div>
<div class="statistics-item">
<span class="title">安全帽检测</span>
<span class="statistics-item-content">今日报警次数1</span>
<span class="statistics-item-content">本月报警次数1</span>
<span class="statistics-item-content">历史报警次数1</span>
</div>
<div class="statistics-item">
<span class="title">工作服检测</span>
<span class="statistics-item-content">今日报警次数1</span>
<span class="statistics-item-content">本月报警次数1</span>
<span class="statistics-item-content">历史报警次数1</span>
</div>
<div class="statistics-item">
<span class="title">明烟明火预警</span>
<span class="statistics-item-content">今日报警次数1</span>
<span class="statistics-item-content">本月报警次数1</span>
<span class="statistics-item-content">历史报警次数1</span>
</div>
<div class="statistics-item">
<span class="title">明火预警检测</span>
<span class="statistics-item-content">今日报警次数1</span>
<span class="statistics-item-content">本月报警次数1</span>
<span class="statistics-item-content">历史报警次数1</span>
</div> -->
</div>
<div style="position: relative; height: 180px;">
<div class="notoDta" v-if="topDangerList.length == 0">
<img src="@/assets/images/noData.png" alt="" />
<p>暂无数据</p>
</div>
</div>
<div class="table-one">
<div class="tabList">
<div>序号</div>
<div>抓拍图片</div>
<div>设备名称</div>
<div>不安全行为类型</div>
<div>警告时间</div>
<div>操作</div>
</div>
<el-scrollbar class="listBox" ref="refScrollbar">
<div v-for="(item, index) in partyMemberList" class="listStyle" :key="item.id">
<div>{{index + 1}}</div>
<div class="list-img">
<el-image
fit="contain"
class="el-img"
:src="BASEURL + '/image/' + item.imageUrl"
:preview-src-list="[BASEURL + '/image/' + item.imageUrl]"
>
<template #error>
<el-image :src="noDataImage" :preview-src-list="[noDataImage]" fit="contain" class="el-no-img" alt="" />
</template>
</el-image>
<!-- <img :src="item.fieldAcquisitionUrl" alt="" srcset=""> -->
</div>
<div>{{item.hardwareName}}</div>
<div>{{item.alarmType == 1?'烟感报警':item.alarmType == 2?'明火报警':item.alarmType == 3?'人员到底报警':item.alarmType == 4?'未带安全帽报警':item.alarmType == 5?'区域入侵报警':item.alarmType == 6?'越界入侵报警':'人员聚集报警'}}</div>
<div>{{item.createTime}}</div>
<div style="color: #1FADC5;" @click="openDetailDialog(item)">查看详情</div>
</div>
<div class="notoDta" v-if="partyMemberList.length == 0">
<img src="@/assets/images/noData.png" alt="" />
<p>暂无数据</p>
</div>
</el-scrollbar>
</div>
</div>
<div class="list-detail" v-if="showDialog" @click="handleDetailClick">
<div class="dialog-content">
<div class="dialog-icon"><img src="@/assets/images/titleIcon.png" /></div>
<div class="dialog-title"><i>抓拍详情</i></div>
<div class="dialog-detail">
<div class="detail-text">
<div class="text-box">
<div class="type">告警类型</div>
<div class="text">{{ detailData.alarmType ? getWarnName(detailData.alarmType) : "" }}</div>
</div>
<div class="text-box" style="margin-top: 5%">
<div class="type">设备名称</div>
<div class="text">{{ detailData.hardwareName || "" }}</div>
</div>
<div class="text-box" style="margin-top: 5%">
<div class="type">记录时间</div>
<div class="text">{{ detailData.createTime }}</div>
</div>
</div>
</div>
<div class="big-pic">
<img :src="BASEURL + '/image/' + detailData.imageUrl" />
</div>
<div class="close-icon" @click="closeDialog">
<el-icon><Close /></el-icon>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from "vue";
import { GlobalStore } from "@/stores";
import { getCompanyDataList, getMemberInfoList } from "@/api/modules/labor";
import type { TabsPaneContext } from 'element-plus'
import { getAlarmTypeOption } from "@/api/modules/aIEarlyWarn";
import noDataImage from "@/assets/images/vehicleManagement/car.png";
import { getAlarmRecordApi, getAlarmTypeCountApi } from "@/api/modules/agjtCommandApi";
const store = GlobalStore();
const props = defineProps(["tip"]);
const BASEURL = import.meta.env.VITE_API_URL;
let showDialog = ref(false as any);
const enterpriseListData = ref([] as any);
const topDangerList = ref([] as any)
let pageNo = ref(1 as any);
let moreScroll = ref(true as any);
const refScrollbar = ref(null as any); // 绑定到滚动的盒子上
const detailData = ref({} as any);
const partyMemberList = ref({} as any);
let aiAlarmTypeEnum = ref([] as any);
// 获取顶部数据
const getQualityStatisticsNumDataFn = async () => {
let data = {
projectSn: store.sn,
isStatsByWeek: 1
};
const res: any = await getAlarmTypeCountApi(data);
if (res.code == 200) {
console.log("安全隐患顶部数据",res)
topDangerList.value = res.result.alarmList || []
}
};
//获取告警类型枚举
const getWarnTypeOption = async () => {
const res: any = await getAlarmTypeOption({ projectSn: store.sn });
// console.log("获取告警类型", res.result);
let warnType = res.result.map((item: any) => {
return {
id: Number(item.data),
value: item.name
};
});
aiAlarmTypeEnum.value = warnType;
console.log("获取告警类型**", aiAlarmTypeEnum.value);
};
// 返回对应的枚举名称
function getWarnName(warnType: any) {
let enumObj = aiAlarmTypeEnum.value.find((item: any) => item.id === warnType);
return enumObj ? enumObj.value : "";
}
// 打开详情弹窗
function openDetailDialog(item: any) {
// console.log(item, "当前行数据");
detailData.value = item;
showDialog.value = true;
}
// 关闭详情弹窗
function closeDialog() {
showDialog.value = false;
detailData.value = {};
}
function handleDetailClick(event: any) {
// console.log("点击", event.target.className);
if (event.target.className == "list-detail") {
closeDialog();
}
}
//获取企业列表
const getCompanyList = async () => {
let data = {
projectSn: store.sn,
enterpriseName: "",
userEnterpriseId: store.userInfo?.userEnterpriseId
};
const res: any = await getCompanyDataList(data);
if (res.code == 200) {
enterpriseListData.value = res.result;
}
};
//获取数据
const getMemberCountList = async (tip:any) => {
let requestData:any = {
projectSn: store.sn,
pageNo: tip == 'search'?1:pageNo.value,
pageSize: 100
}
const res: any = await getAlarmRecordApi(requestData);
console.log("获取人员信息列表", res);
if(tip == 'more'){
partyMemberList.value = partyMemberList.value.concat(res.result.records);
} else {
partyMemberList.value = res.result.records;
}
// 为图片拼接IP
// partyMemberList.value.map((item:any) => {
// item.fieldAcquisitionUrl = BASEURL + '/image/' + item.fieldAcquisitionUrl
// })
if (res.result.pages == pageNo.value) {
moreScroll.value = false;
} else {
pageNo.value = pageNo.value + 1;
}
};
onMounted(async () => {
await getCompanyList();
await getMemberCountList('search');
await getQualityStatisticsNumDataFn();
getWarnTypeOption();
refScrollbar.value.wrapRef.addEventListener("scroll", (e: any) => {
// console.log("滚动容器", e);
const scrollTop = e.target.scrollTop;
const scrollHeight = e.target.scrollHeight;
const clientHeight = e.target.clientHeight;
// console.log("滚动容器", scrollTop, scrollHeight, clientHeight);
// 向上加载更多
if (scrollTop >= scrollHeight - clientHeight - 1) {
// console.log("加载更多");
if (moreScroll.value) {
getMemberCountList("more");
}
}
});
});
</script>
<style lang="scss" scoped>
@mixin flex {
display: flex;
align-items: center;
}
.list-detail {
position: absolute;
width: 100%;
height: 100%;
top: 0%;
left: 0%;
background: rgba(7, 28, 49, 0.5);
z-index: 20;
.dialog-content {
position: absolute;
box-sizing: border-box;
padding: 1%;
left: 38%;
top: 30%;
width: 25%;
height: 45%;
background: url("@/assets/images/aIEarlyWarning/dialogBg.png") no-repeat;
background-size: 100% 100%;
z-index: 21;
.dialog-icon {
position: absolute;
left: 3%;
top: 3%;
width: 7%;
height: 7%;
img {
width: 100%;
height: 100%;
}
}
.pic-icon {
position: absolute;
left: 3%;
top: 40%;
width: 7%;
height: 7%;
img {
width: 100%;
height: 100%;
}
}
.close-icon {
position: absolute;
right: 3%;
top: 3%;
cursor: pointer;
color: #ffffff;
font-size: 18px;
}
.dialog-title {
color: #ffffff;
font-weight: bold;
margin-left: 8%;
font-size: 18px;
font-family: "OPPOSans-Bold";
}
.dialog-detail {
width: 100%;
height: 25%;
margin-top: 5%;
.detail-text {
width: 95%;
height: 100%;
.text-box {
height: 25%;
display: flex;
align-items: center;
background: url("@/assets/images/aIEarlyWarning/contentBg.png") no-repeat;
background-size: 100% 100%;
.type {
width: 20%;
margin-left: 3%;
color: #a1accb;
font-size: 12px;
}
.text {
font-size: 12px;
color: #ffffff;
}
}
}
}
.pic-title {
color: #ffffff;
font-weight: bold;
font-size: 18px;
font-family: "OPPOSans-Bold";
margin-top: 5%;
margin-left: 8%;
}
.big-pic {
width: 100%;
height: 50%;
margin-top: 10%;
img {
width: 100%;
height: 100%;
}
}
}
}
.political-outlook {
height: 97%;
margin: 0 60px;
.content {
height: 95%;
width: 100%;
margin-top: 10px;
// background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
padding: 20px 15px;
.top-statistics{
width: 90%;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 20px;
color: white;
margin: 0 auto;
.statistics-item{
width: 200px;
// height: 95px;
display: flex;
flex-direction: column;
position: relative;
.title{
position: absolute;
top: 4%;
left: 4%;
}
&-content{
display: inline-block;
width: 100%;
height: auto;
text-indent: 1.5em;
}
&-content:nth-child(2){
margin-top: 15%;
}
&-content:nth-child(3){
margin-top: 2%;
}
&-content:nth-child(4){
margin-top: 2%;
}
// &-content:nth-child(3){
// margin-top: 8%;
// }
}
.statistics-item:nth-child(1){
background: url("@/assets/images/commandScreen/bg6.png") no-repeat;
background-size: 100% 100%;
}
.statistics-item:nth-child(2){
background: url("@/assets/images/commandScreen/bg2.png") no-repeat;
background-size: 100% 100%;
}
.statistics-item:nth-child(3){
background: url("@/assets/images/commandScreen/bg7.png") no-repeat;
background-size: 100% 100%;
}
.statistics-item:nth-child(4){
background: url("@/assets/images/commandScreen/bg8.png") no-repeat;
background-size: 100% 100%;
}
.statistics-item:nth-child(5){
background: url("@/assets/images/commandScreen/bg1.png") no-repeat;
background-size: 100% 100%;
}
.statistics-item:nth-child(6){
background: url("@/assets/images/commandScreen/bg5.png") no-repeat;
background-size: 100% 100%;
}
.statistics-item:nth-child(7){
background: url("@/assets/images/commandScreen/bg4.png") no-repeat;
background-size: 100% 100%;
}
.statistics-item:nth-child(8){
background: url("@/assets/images/commandScreen/bg3.png") no-repeat;
background-size: 100% 100%;
}
}
.top-search {
@include flex;
justify-content: center;
margin-bottom: 15px;
margin-top: 20px;
.search-item {
@include flex;
margin-right: 20px;
span {
color: white;
margin-right: 10px;
}
}
}
.table-one{
height: 50%;
.tabList {
display: flex;
// width: 100%;
height: 10%;
background: url("@/assets/images/vehicleManagement/ListTitleImg.png") no-repeat;
background-size: 100% 100%;
// position: absolute;
left: 75.5%;
top: 75%;
color: #ccc;
font-size: calc(100vw * 14 / 1920);
line-height: 30px;
align-items: center;
margin-top: 2%;
div {
text-align: center;
width: 17%;
}
}
.listBox {
height: 90%;
.listStyle {
display: flex;
align-items: center;
text-align: center;
color: #fff;
font-size: 12px;
margin-bottom: 5px;
.list-img {
.el-img {
width: 30px;
height: 30px;
img {
display: flex;
align-items: center;
width: 100%;
height: 100%;
}
}
.el-no-img{
width: 30px;
height: 30px;
}
}
div {
width: 17%;
white-space: nowrap; //单行
overflow: hidden;
text-overflow: ellipsis;
}
}
.listStyle:hover {
background: #091f3f;
}
}
}
:deep(){
.el-tabs__item{
color: white;
}
.el-tabs__item.is-active{
color: var(--el-color-primary)
}
}
}
}
.notoDta {
top: 35%;
width: 20%;
left: 40%;
position: absolute;
text-align: center;
img {
width: 40%;
margin: 5% 30%;
}
p {
color: #fff;
font-size: calc(100vw * 14 / 1920);
margin: -6% 37%;
}
}
// element 组件样式
:deep() {
.el-date-editor .el-range-input,
.el-range-separator {
color: #fff;
}
.el-input__wrapper {
background: #112d59;
}
.el-input__inner {
color: #fff;
}
.el-button {
background-color: #2758c0;
color: white;
border-color: transparent;
}
}
// ::v-deep .el-select .el-input .el-select__caret {
// color: #fff;
// }
</style>