BarracksDataTwo/src/views/home/index.vue

1822 lines
50 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>
<NAV />
<!-- 侧边栏显隐-->
<div class="aside">
<ul class="aside-ul">
<li
class="aside-li"
:key="index"
v-for="(item, index) in asideList"
@click="toggleDevice(item, index)"
>
<img
:src="deviceIndex === index ? item.select : item.default"
alt=""
srcset=""
/>
<img
class="aside-li-msg"
v-if="deviceIndex === index"
:src="item.rightImg"
alt=""
srcset=""
/>
</li>
</ul>
</div>
<div id="three3D">
<Three
ref="three"
@openRealPlayer="openRealPlayer"
@openWebPlayer="openWebPlayer"
:threeAream="threeAream"
/>
</div>
<div class="container">
<div class="container-left">
<div class="container-left-box">
<!-- 排班表 -->
<div class="box3">
<div class="public-title">
<span class="font">排班表</span>
<span class="more" @click="goSchedule"> </span>
</div>
<div class="schedule">
<div class="schedule-date">
<p>
<i class="drop"></i>
日期:
<span
>{{
schedule.length != 0
? getTime("日期", schedule[scheduleIndex].ScheduTime)
: "无数据"
}}
</span>
</p>
<p style="margin-left: 2.37rem">
<i class="drop"></i>
时间:
<span>{{
schedule.length != 0
? getTime("时间", schedule[scheduleIndex].ScheduTime)
: "无数据"
}}</span>
</p>
<p>
<i class="drop"></i>
星期:
<span>{{
schedule.length != 0
? getTime("星期", schedule[scheduleIndex].ScheduTime)
: "无数据"
}}</span>
</p>
</div>
<div class="schedule-person">
<div class="pre" @click="preClick"></div>
<div class="next" @click="nextClick"></div>
<div class="schedule-person-box">
<div
:style="'transform:translateX(' + xVal + ')'"
class="schedule-person-swiper"
>
<section
v-for="(item, index) in schedule"
:key="index"
class="schedule-person-item"
>
<img :src="previewUrl + item.Pic" alt="" />
<div>{{ item.Name }}</div>
</section>
</div>
</div>
</div>
</div>
</div>
<!-- 钥匙柜数据 -->
<div class="box2">
<div class="public-title">
<span class="font">钥匙柜状态总览</span>
<span class="record-icon" @click="openRecord"> </span>
</div>
<div class="keyword">
<ul class="keyword-state">
<li v-for="(item, index) in keywordState">
<i :class="'keyword-state-icon' + index"></i>
<span>{{ item }}</span>
</li>
</ul>
<div class="keyword-box">
<section
v-for="item in keywordList"
class="keyword-item"
:key="item.key_name"
:class="'keyword-item-state' + item.key_status"
>
<span>{{ item.key_name }}号锁位</span>
<span class="position" v-if="item.key_status == 2">被取走</span>
</section>
</div>
</div>
</div>
<!-- 门禁进入实况-->
<div class="box5">
<div class="public-title">
<span class="font">门禁进入实况</span>
</div>
<div class="access-control">
<el-collapse
v-model="activeNames"
accordion
@change="getDoorHandle"
>
<el-collapse-item
:title="item.doorName"
:name="item.doorName"
v-for="(item, index) in doorNames"
:key="index"
>
<el-timeline>
<el-timeline-item
v-for="(activity, index) in item.data"
:key="index"
>
<p>{{ activity.no }}</p>
<p
v-if="!activity.no"
class="personMsg"
style="display: flex; justify-content: space-between"
>
<span
v-if="activity.inAndOutType"
style="margin-left: 0.5rem"
>
{{ activity.personName }}
<span
style="
margin-left: 0.5rem;
color: rgba(233, 244, 255, 0.6);
"
>{{
activity.inAndOutType == -1
? "出库房"
: activity.inAndOutType == 1
? "进入库房"
: "未知"
}}</span
>
</span>
<span
style="color: rgba(0, 221, 255, 1); font-size: 0.75rem"
>{{ activity.eventTime }}</span
>
</p>
<div class="enterImg" v-if="activity.picUri">
<img
:src="'https://192.168.17.3:6113' + activity.picUri"
alt=""
/>
</div>
</el-timeline-item>
</el-timeline>
</el-collapse-item>
</el-collapse>
</div>
</div>
</div>
</div>
<div class="container-right">
<div class="container-right-box">
<!-- 报警列表 -->
<div class="box1">
<div class="public-title">
<span class="font">报警列表</span>
</div>
<div class="alarmList">
<!-- 区域入侵报警 -->
<el-carousel indicator-position="none" :autoplay="false">
<el-carousel-item
v-for="(item, index) in alarmList.regional"
:key="index"
>
<section class="regional" @click="openBackPlayer(item)">
<div class="alarmList-type">区域入侵</div>
<div class="alarmList-regional">
<div
@click.stop="openImg(item)"
style="
width: 6.75rem;
height: 2.75rem;
display: flex;
align-items: center;
"
>
<el-image
style="width: 6.75rem; height: 2.75rem"
:src="item.imageUrl"
fit="cover"
/>
</div>
<div class="alarmList-regional-msg">
<div>
<i class="drop"></i>
<span>位置:</span>
<span>{{ item.address }}</span>
</div>
<div>
<i class="drop"></i>
<span>时间:</span>
<span>{{ item.date }}</span>
</div>
</div>
</div>
</section>
</el-carousel-item>
</el-carousel>
<!-- 温湿度报警 -->
<el-carousel indicator-position="none" :autoplay="false">
<el-carousel-item
v-for="(item, index) in alarmList.temperatureAlarm"
:key="index"
>
<section class="humidity">
<div class="alarmList-type" v-if="item.sensorType == 'temp'">
温度告警
</div>
<div
class="alarmList-type"
v-else-if="item.sensorType == 'humidity'"
>
湿度告警
</div>
<div class="alarmList-content">
<div>
<i class="drop"></i>
<span v-if="item.sensorType == 'temp'">当前温度:</span>
<span v-else-if="item.sensorType == 'humidity'"
>当前湿度:</span
>
<span
v-if="item.sensorType == 'temp'"
class="unit"
:style="
item.latestValue >= item.alarmHigh
? 'color:red'
: 'color:green'
"
>{{ item.latestValue }}℃</span
>
<span
v-else-if="item.sensorType == 'humidity'"
class="unit"
:style="
item.latestValue >= item.alarmHigh
? 'color:red'
: 'color:green'
"
>{{ item.latestValue }}%</span
>
</div>
<div>
<i class="drop"></i>
<span v-if="item.sensorType == 'temp'">报警温度:</span>
<span v-else-if="item.sensorType == 'humidity'"
>报警湿度:</span
>
<span v-if="item.sensorType == 'temp'" class="unit"
>{{ item.alarmHigh }}℃</span
>
<span
v-else-if="item.sensorType == 'humidity'"
class="unit"
>{{ item.alarmHigh }}%</span
>
</div>
<div>
<i class="drop"></i>
<span>位置:</span>
<span>{{ item.name }}</span>
</div>
<div>
<i class="drop"></i>
<span>时间:</span>
<span>{{ item.latestTime }}</span>
</div>
</div>
</section>
</el-carousel-item>
</el-carousel>
<!-- 紧急告警 -->
<el-carousel indicator-position="none" :autoplay="false">
<el-carousel-item
v-for="(item, index) in alarmList.urgent"
:key="index"
>
<section class="urgent">
<div class="alarmList-type">紧急告警</div>
<div class="alarmList-content">
<div>
<i class="drop"></i>
<span>报警IP</span>
<span>{{ item.AlarmAddress }}</span>
</div>
<div>
<i class="drop"></i>
<span>报警状态:</span>
<span style="color: red">{{ item.AlarmContent }}</span>
</div>
<div class="ellipsis">
<i class="drop"></i>
<span>位置:</span>
<el-tooltip
class="item"
effect="dark"
:content="item.AlarmName"
placement="top-start"
>
<span>{{ item.AlarmName }}</span>
</el-tooltip>
<!-- <span>{{ item.AlarmName }}</span> -->
</div>
<div>
<i class="drop"></i>
<span>时间:</span>
<span>{{ item.AlarmTime }}</span>
</div>
</div>
</section>
</el-carousel-item>
</el-carousel>
<!-- 烟感报警 -->
<el-carousel indicator-position="none" :autoplay="false">
<el-carousel-item
v-for="(item, index) in smokeDevice"
:key="index"
>
<section class="urgent">
<div class="alarmList-type">烟感告警</div>
<div class="alarmList-content">
<div>
<i class="drop"></i>
<span>{{ item.name }}</span>
</div>
<div>
<i class="drop"></i>
<span
:style="item.state == 1 ? 'color:red' : 'color:green'"
>{{ item.state == 1 ? "报警" : "正常" }}</span
>
</div>
</div>
</section>
</el-carousel-item>
</el-carousel>
</div>
</div>
<!-- 巡更线监控 -->
<div class="box4">
<div class="public-title">
<span class="font">巡更线监控</span>
</div>
<div class="patrol-line">
<el-table
:data="tableData"
style="width: 100%"
stripe
:row-class-name="getRowColor"
>
<el-table-column
prop="position"
min-width="25%"
label="巡更点"
show-overflow-tooltip
/>
<el-table-column prop="state" min-width="25%" label="巡更状态">
<template #default="scope">
<div>
<p>
<i
class="qiu-icon"
:style="'background-color:' + getColor(scope.row.state)"
></i
>{{ fontState[parseInt(scope.row.state)] }}
</p>
</div>
</template>
</el-table-column>
<el-table-column
prop="history"
min-width="55%"
label="打卡记录"
show-overflow-tooltip
/>
</el-table>
</div>
</div>
<!-- 监控画面 -->
<!-- <div class="box4">
<div class="public-title">
<span class="font">监控画面</span>
</div>
<div class="camera">
<div class="camera-box">
<iframe
id="webPlayer"
src="player/webPlayer.html"
frameborder="0"
></iframe>
</div>
</div>
</div> -->
</div>
</div>
</div>
<!-- 底部-->
<div class="footer">
<ul class="footer-ul">
<li
class="footer-ul-li"
v-for="(item, index) in footerList"
:key="index"
@click="toggleOpen(item, index)"
>
<img :src="footerIndex !== index ? item.default : item.select" alt="" />
</li>
</ul>
</div>
<!-- 底部点击弹框 -->
<Dialog @close="closeHandle" :title="dialogName" v-if="dialogShow" />
<!-- 播放器弹窗 -->
<Player
@close="closePlayer"
:title="playerName"
:videoList="videoList"
:img="alarmImg"
v-if="playerShow"
/>
<!-- 运维状况 -->
<!-- <div class="iframeBox">
<iframe
ref="iframeChart"
id="iframeChart"
src='https://192.168.17.3:443/xauthplus-plugin/thirdLogin?type=third&service=https://192.168.17.3:443/nms/views/home'
frameborder="0"
></iframe>
</div> -->
<!-- 陌生人报警 -->
<Linkage v-if="linkageShow" @open="openLinkage" @close="closeLinkage" />
<!-- 取还记录 -->
<Record v-if="recordShow" @close="closeRecord" />
</template>
<script setup>
import { v4 as uuidv4 } from "uuid";
import getPath from "@/utils/getPath.js";
import Three from "@/components/Three.vue";
import { ref, onMounted, reactive, nextTick, watch, onUnmounted } from "vue";
import cameraUrl from "@/assets/images/camera.png";
import NAV from "@/components/nav.vue";
import Dialog from "@/components/dialog.vue";
import Player from "@/components/player.vue";
import Linkage from "@/components/linkage.vue";
import moment from "moment";
import {
getHikvision,
getScheduleList,
getToken,
getEmergencyApi,
getKeywordMsg,
} from "@/api/index";
import { getTime } from "@/utils/tool.js";
import Record from "@/components/record.vue";
import { useRouter } from "vue-router";
const uuid = uuidv4();
const router = useRouter();
// 侧边栏
const asideList = ref([
{
default: getPath.store,
select: getPath.storeSelect,
rightImg: getPath.storePrompt,
title: "仓库",
},
{
default: getPath.monitorPoint,
select: getPath.monitorPointSelect,
rightImg: getPath.monitorPointPrompt,
title: "监控点",
},
{
default: getPath.alarmHost,
select: getPath.alarmHostSelect,
rightImg: getPath.alarmHostPrompt,
title: "报警主机",
},
// {
// default: getPath.water,
// select: getPath.waterSelect,
// rightImg: getPath.waterPrompt,
// title: "水浸探测器",
// },
{
default: getPath.smoke,
select: getPath.smokeSelect,
rightImg: getPath.smokePrompt,
title: "烟感探测器",
},
{
default: getPath.humidity,
select: getPath.humiditySelect,
rightImg: getPath.humidityPrompt,
title: "温湿度探测器",
},
{
default: getPath.accessControl,
select: getPath.accessControlSelect,
rightImg: getPath.accessControlPrompt,
title: "人脸门禁一体机",
},
]);
// 底部栏
const footerIndex = ref(-1);
const footerList = ref([
{
title: "温湿度记录",
default: getPath.record,
select: getPath.recordSelect,
},
{ title: "枪支离位报警", default: getPath.guns, select: getPath.gunsSelect },
{
title: "视频监控",
default: getPath.monitor,
select: getPath.monitorSelect,
},
{
title: "运维状况",
default: getPath.operation,
select: getPath.operationSelect,
},
{
default: getPath.shipin,
select: getPath.shipinSelect,
title: "视频回放",
},
]);
const dialogName = ref("");
// 运维状况控制隐藏
const iframeShow = ref(false);
const iframeChart = ref(null);
async function toggleOpen(item, index) {
dialogName.value = item.title;
playerName.value = item.title;
footerIndex.value = index;
// const token = await getToken();
const token = sessionStorage.getItem("token");
if (item.title === "枪支离位报警") {
window.location.assign("qiangzhi://");
} else if (item.title === "运维状况") {
location.href =
"https://192.168.17.3:443/xauthplus-plugin/thirdLogin?type=third&service=https://192.168.17.3:443/nms/views/home&token=" +
token;
} else if (item.title === "温湿度记录") {
location.href =
"https://192.168.17.3:443/xauthplus-plugin/thirdLogin?type=third&service=https://192.168.17.3:443/pems/environment-monitor&token=" +
token;
} else {
dialogShow.value = true;
}
}
// 报警列表
const alarmList = ref({
regional: [],
temperatureAlarm: [],
humidity: [],
urgent: [],
});
// 3d模型区域入侵报警数据
const threeAream = reactive({});
// 钥匙柜
const keywordState = ref(["在位", "不在位"]);
// 钥匙柜
const keywordList = ref([
{
keyCapturing: "1",
keyState: "1",
},
{
keyCapturing: "2",
keyState: "1",
},
{
keyCapturing: "3",
keyState: "1",
},
{
keyCapturing: "4",
keyState: "1",
},
{
keyCapturing: "5",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "6",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "7",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "8",
keyState: "1",
},
{
keyCapturing: "9",
keyState: "1",
},
{
keyCapturing: "10",
keyState: "1",
},
{
keyCapturing: "11",
keyState: "1",
},
{
keyCapturing: "12",
keyState: "1",
},
{
keyCapturing: "13",
keyState: "1",
},
{
keyCapturing: "14",
keyState: "1",
},
{
keyCapturing: "15",
keyState: "1",
},
{
keyCapturing: "16",
keyState: "1",
},
{
keyCapturing: "17",
keyState: "1",
},
{
keyCapturing: "18",
keyState: "1",
},
{
keyCapturing: "19",
keyState: "1",
},
{
keyCapturing: "20",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "21",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "22",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "23",
keyState: "1",
},
{
keyCapturing: "24",
keyState: "1",
},
{
keyCapturing: "25",
keyState: "1",
},
{
keyCapturing: "26",
keyState: "1",
},
{
keyCapturing: "27",
keyState: "1",
},
{
keyCapturing: "28",
keyState: "1",
},
{
keyCapturing: "29",
keyState: "1",
},
{
keyCapturing: "30",
keyState: "1",
},
]);
const recordShow = ref(false);
function openRecord() {
// hidePlay();
recordShow.value = true;
}
function closeRecord(bool) {
// openPlay();
recordShow.value = bool;
}
// 门禁进入实况
const activeNames = ref([]);
const doorNames = ref([]);
// 排班表
const schedule = ref([{}, {}, {}]);
const scheduleIndex = ref(0);
const xVal = ref(0);
const previewUrl = ref(import.meta.env.VITE_PREVIEW_URL);
// 获取排班表
function getScheduleData() {
if (handleTimer.timer4) {
clearTimeout(handleTimer.timer4);
}
var getScheduleTime = {
StartTime: moment(new Date().setHours(0, 0, 0, 0)).format(
"yyyy-MM-DD HH:mm:ss"
),
EndTime: moment(
new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 2
).format("yyyy-MM-DD HH:mm:ss"),
};
// 获取排班表数据
getScheduleList(getScheduleTime).then((res) => {
if (res.state == "Success") {
// let date = moment(new Date()).format("YYYY-MM-DD");
// let arr = res.data.ds.filter((ele) => {
// return moment(ele.ScheduTime).format("YYYY-MM-DD") == date;
// });
schedule.value = res.data.ds.sort((a, b) => {
return moment(a.ScheduTime).unix() - moment(b.ScheduTime).unix();
});
}
handleTimer.timer4 = setTimeout(() => {
getScheduleData();
}, 7000);
});
}
const keywordTimer = ref(null);
// 获取钥匙状态
function getKeywordData() {
if (keywordTimer.value) {
clearTimeout(keywordTimer);
}
let data = {
id: "112323",
};
getKeywordMsg(data).then((res) => {
keywordList.value = res.data.list;
keywordTimer.value = setTimeout(() => {
getKeywordData();
}, 10000);
});
}
// 上一页
function preClick() {
scheduleIndex.value--;
if (scheduleIndex.value < 0) {
// scheduleIndex.value = schedule.value.length - 1;
return;
}
xVal.value = -(100 / 3) * scheduleIndex.value + "%";
}
// 下一页
function nextClick() {
scheduleIndex.value++;
if (scheduleIndex.value === schedule.value.length) {
return;
}
xVal.value = -(100 / 3) * scheduleIndex.value + "%";
}
// 定时器
const handleTimer = reactive({
timer1: null,
timer2: null,
timer3: null,
timer4: null,
timer5: null,
});
onUnmounted(() => {
// 清除定时器
clearTimeout(handleTimer.timer1);
clearTimeout(handleTimer.timer2);
clearTimeout(handleTimer.timer3);
clearTimeout(handleTimer.timer4);
clearTimeout(handleTimer.timer5);
if (keywordTimer.value) {
clearTimeout(keywordTimer);
}
if (patrolTimer.value) {
clearTimeout(patrolTimer.value);
}
if (smokeTimer.value) {
clearTimeout(smokeTimer.value);
}
});
// 获取区域入侵数据
function getRegionData() {
if (handleTimer.timer1) {
clearTimeout(handleTimer.timer1);
}
const historyDay = reactive({
startStamp: moment(
new Date().setHours(0, 0, 0, 0) - 24 * 60 * 60 * 1000 * 30
).format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
endStamp: moment(
new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1
).format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
});
getHikvision({
path: "/artemis/api/els/v1/events/search",
data: {
ability: "event_vss",
pageSize: 500,
pageNo: 1,
startTime: historyDay.startStamp,
endTime: historyDay.endStamp,
},
}).then((res) => {
if (res.code == 0) {
// 3d模型区域入侵报警数据
threeAream.address = res.result.data.list[0].eventLogSrcList[0].resName;
threeAream.date = res.result.data.list[0].startTime;
alarmList.value.regional = res.result.data.list.map((ele) => {
return {
title: ele.eventTypeName,
address: ele.eventLogSrcList[0].resName,
date: ele.startTime,
imageUrl: JSON.parse(ele.eventLogSrcList[0].data).fielddetection
? JSON.parse(ele.eventLogSrcList[0].data).fielddetection[0].imageUrl
: JSON.parse(ele.eventLogSrcList[0].data).smokeDetection
? JSON.parse(ele.eventLogSrcList[0].data).smokeDetection[0].imageUrl
: null,
cameraIndex: JSON.parse(ele.eventLogSrcList[0].data).fielddetection
? JSON.parse(ele.eventLogSrcList[0].data).fielddetection[0]
.targetAttrs.cameraIndexCode
: JSON.parse(ele.eventLogSrcList[0].data).smokeDetection
? JSON.parse(ele.eventLogSrcList[0].data).smokeDetection[0]
.targetAttrs.cameraIndexCode
: null,
startTime: ele.startTime,
endTime: ele.endTime,
handleStatus: ele.handleStatus,
};
});
}
handleTimer.timer1 = setTimeout(() => {
getRegionData();
}, 10000);
});
}
// 获取动环数据
function getRotatingData() {
if (handleTimer.timer2) {
clearTimeout(handleTimer.timer2);
}
// 分页查询动环传感器
getHikvision({
path: "/artemis/api/pems/v1/monitor/search",
data: {
pageNo: 1,
pageSize: 1000,
isIncludeSonRegion: true,
},
}).then((res) => {
if (res.code == 0) {
// console.log(res, "分页查询");
var AlarmNames = [];
// temperatureAlarm.value = [];
if (alarmList.value.temperatureAlarm.length > 0) {
AlarmNames = alarmList.value.temperatureAlarm.map((item) => {
return item.name;
});
}
for (let i = 0; i < res.result.data.list.length; i++) {
getHikvision({
path: "/artemis/api/pems/v1/sensor/search",
data: {
pageNo: 1,
pageSize: 1000,
parentIndexCode: res.result.data.list[i].indexCode,
},
}).then((data) => {
if ((data.code = 200)) {
for (let j = 0; j < data.result.data.list.length; j++) {
if (
data.result.data.list[j].sensorType == "humidity" ||
data.result.data.list[j].sensorType == "temp"
) {
if (AlarmNames.indexOf(data.result.data.list[j].name) == -1) {
alarmList.value.temperatureAlarm.push(
data.result.data.list[j]
);
} else {
// temperatureAlarm.value.replace()
}
}
}
handleTimer.timer2 = setTimeout(() => {
getRotatingData();
}, 10000);
}
});
}
}
});
}
// 获取紧急报警数据
function getEmergencyData() {
if (handleTimer.timer3) {
clearTimeout(handleTimer.timer3);
}
var emergencyTime = {
StartTime: moment(
new Date().setHours(0, 0, 0, 0) - 24 * 60 * 60 * 1000 * 30
).format("yyyy-MM-DD HH:mm:ss"),
EndTime: moment(
new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1
).format("yyyy-MM-DD HH:mm:ss"),
};
getEmergencyApi(emergencyTime).then((res) => {
if (res.code == 0) {
alarmList.value.urgent = res.data.sort((a, b) => {
return moment(b.AlarmTime).unix() - moment(a.AlarmTime).unix();
});
// console.log(alarmList.value.urgent,'报警数据xxxx');
handleTimer.timer3 = setTimeout(() => {
getEmergencyData();
}, 10000);
}
});
}
// 获取门禁列表
function getDoorList() {
let doorData = {
path: "/artemis/api/resource/v1/acsDoor/acsDoorList",
data: {
pageNo: 1,
pageSize: 1000,
},
};
getHikvision(doorData).then((res) => {
if (res.code == 0) {
res.result.data.list.forEach((ele) => {
doorNames.value.push({ doorName: ele.doorName, data: [] });
});
}
});
}
// 获取门禁事件
// 将标准实践格式转化为ios8601
const steamp = reactive({
startStamp: moment(new Date().setHours(0, 0, 0, 0)).format(
"YYYY-MM-DDTHH:mm:ss.SSSZ"
),
endStamp: moment(
new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1
).format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
});
// 实时更新
setInterval(() => {
(steamp.startStamp = moment(new Date().setHours(0, 0, 0, 0)).format(
"YYYY-MM-DDTHH:mm:ss.SSSZ"
)),
(steamp.endStamp = moment(
new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1
).format("YYYY-MM-DDTHH:mm:ss.SSSZ"));
}, 1000);
// 获取门禁事件数据
function getDoorHandle(event) {
let doorParams = {
path: "/artemis/api/acs/v2/door/events",
data: {
pageNo: 1,
pageSize: 1000,
startTime: steamp.startStamp,
endTime: steamp.endStamp,
receiveStartTime: steamp.startStamp,
receiveEndTime: steamp.endStamp,
doorName: "",
order: "desc",
},
};
// 默认清除
doorParams.data.doorName = event;
getHikvision(doorParams).then((res) => {
if (res.code == 0) {
doorNames.value.forEach((el) => {
if (el.doorName === event) {
if (!res.result.data.list.length) {
el.data.push({ no: "无数据" });
} else {
el.data = res.result.data.list;
}
} else {
el.data = [];
}
});
}
});
}
// dom挂载后
onMounted(() => {
getDoorList();
getScheduleData();
// 获取入侵数据
getRegionData();
// 动环数据
getRotatingData();
// 紧急报警数据
getEmergencyData();
// 巡更
getPatrolData();
// 烟感
getSomkeData();
// 钥匙柜数据
getKeywordData();
let token = sessionStorage.getItem("token");
if (!token) {
alert("登录过期,请重新登录");
router.push("/login");
}
});
// 巡更线
const tableData = ref([
// {
// position: "巡更点1",
// state: "1",
// history: "刘七七 2020/06/08 14:27:11",
// },
]);
// 状态文字
const fontState = ref(["准时", "早巡", "晚巡", "补漏巡", "漏巡"]);
// 获取状态颜色
function getColor(state) {
if (state == 1 || state == 2) {
return "#f05657";
} else if (state == 4 || state == 3) {
return "#FFBF00";
} else if (state == 0) {
return "#52e76f";
}
}
// 弹窗的显影
const dialogShow = ref(false);
function closeHandle(e) {
// openPlay();
footerIndex.value = -1;
dialogShow.value = false;
}
const deviceIndex = ref(0);
const three = ref(null);
// 侧边栏点击事件控制three中设备显隐
function toggleDevice(item, index) {
deviceIndex.value = index;
if (three.value) {
three.value.clearLabelObj(item.title);
}
}
// 跳转排班表后台
function goSchedule() {
location.href =
import.meta.env.VITE_PREVIEW_URL + "/Management/Home.aspx?Id=1";
}
// 关闭播放器弹窗
const playerShow = ref(false);
function closePlayer() {
// openPlay();
playerShow.value = false;
}
const videoList = ref("");
const playerName = ref("实时视频");
// 打开播放器弹窗
function openRealPlayer(event, cameraIndexCode) {
// hidePlay();
playerShow.value = event;
videoList.value = { indexCode: cameraIndexCode };
playerName.value = "实时视频";
}
const alarmImg = ref("");
function openImg(item) {
playerName.value = "图片预览";
playerShow.value = true;
alarmImg.value = item.imageUrl;
videoList.value = false;
}
// 打开回放播放器
function openBackPlayer(item) {
playerShow.value = true;
videoList.value = `${item.cameraIndex},${new Date(
item.startTime.replace("-", "/").replace("-", "/")
).getTime()},${new Date(
item.endTime.replace("-", "/").replace("-", "/")
).getTime()}`;
playerName.value = "回放视频";
}
// 获取登录凭证
async function getTokenData(service, name) {
const res = await getToken({
language: "zh_CN",
service: service,
userCode: name,
});
// iframeShow.value = true;
nextTick(() => {
// iframeChart.value.src = `https://192.168.17.3/bic/ssoService/v1/tokenLogin?token=${res.result.data.token}&service=${service}`
// console.log(iframeChart.contentWindow);
// iframeChart.outerHTML = iframeChart.outerHTML;
// console.log(iframeChart.value,'xxxxxxxxxxxxx');
location.href = `https://192.168.17.3/bic/ssoService/v1/tokenLogin?token=${res.result.data.token}&service=${service}`;
});
}
const linkageShow = ref(true);
// 关闭陌生人弹窗
function closeLinkage(event) {
// openPlay();
linkageShow.value = event;
}
// 打开陌生人弹窗
function openLinage(event) {
// hidePlay();
linkageShow.value = event;
}
const webIndex = ref(0);
const webTimer = ref(null);
// 打开监控画面
function openWebPlayer(data) {
nextTick(() => {
let webPlayer = document.querySelector("#webPlayer");
if (webPlayer.contentWindow.oWebControl) {
webPlayer.contentWindow.startPlay(data[webIndex.value].cameraIndexCode);
}
if (webTimer.value) {
clearInterval(webTimer.value);
}
if (webIndex.value === 0) {
setTimeout(() => {
webPlayer.contentWindow.startPlay(data[webIndex.value].cameraIndexCode);
}, 4000);
}
webTimer.value = setInterval(() => {
if (data.length == webIndex.value) {
winIndex.value = 0;
}
webPlayer.contentWindow.startPlay(data[webIndex.value].cameraIndexCode);
webIndex.value++;
}, 10000);
});
}
// function hidePlay() {
// let webPlayer = document.querySelector("#webPlayer");
// if (webPlayer.contentWindow.oWebControl) {
// webPlayer.contentWindow.oWebControl.JS_HideWnd();
// }
// }
// function openPlay() {
// let webPlayer = document.querySelector("#webPlayer");
// if (webPlayer.contentWindow.oWebControl) {
// webPlayer.contentWindow.oWebControl.JS_ShowWnd();
// }
// }
const patrolTimer = ref(null);
// 获取巡更信息
function getPatrolData() {
if (patrolTimer.value) {
clearTimeout(patrolTimer.value);
}
// 巡更数据接口请求
getHikvision({
path: "/artemis/api/gtps/v1/patrolHistory/records",
data: {
pageNo: 1,
pageSize: 1000,
beginTime: moment(
new Date().setHours(0, 0, 0, 0) - 24 * 60 * 60 * 1000
).format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
endTime: moment(
new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1
).format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
},
}).then((res) => {
var scheduleIdList = [];
for (let i = 0; i < res.result.data.rows.length; i++) {
scheduleIdList.push(res.result.data.rows[i].scheduleId);
}
getHikvision({
path: "/artemis/api/gtps/v1/historyDetailInfo/records",
data: {
scheduleIdList: scheduleIdList,
},
}).then((data) => {
tableData.value = data.result.data.map((ele) => {
return {
position: ele.pointDetailHistoryList[0].pointName,
history:
ele.routeInfo.personName +
" " +
ele.pointDetailHistoryList[0].pointBeginTimeISO,
state: ele.routeInfo.routeResult,
};
});
setTimeout(() => {
getPatrolData();
}, 10000);
});
});
}
const smokeDevice = ref([]);
const smokeTimer = ref(null);
// 获取烟感传感器数据
function getSomkeData() {
if (smokeTimer.value) {
clearTimeout(smokeTimer.value);
}
// 烟感的报警输入
getHikvision({
path: "/artemis/api/pems/v1/alarm_in/search",
data: {
pageNo: 1,
pageSize: 1000,
isIncludeSonRegion: true,
},
}).then((res) => {
smokeDevice.value = res.result.data.list;
setTimeout(() => {
getSomkeData();
}, 10000);
});
}
</script>
<style lang="scss" scoped>
//门禁进入实况
.access-control {
padding: vh(16) vw(16);
box-sizing: border-box;
height: vh(256);
overflow-y: scroll;
}
.access-control::-webkit-scrollbar {
display: none;
}
.ellipsis {
white-space: nowrap; /* 确保文本在一行内显示 */
overflow: hidden; /* 隐藏超出容器的文本 */
text-overflow: ellipsis; /* 使用省略符号表示文本被截断 */
}
.personMsg {
background-image: url("@/assets/images/personMsg.png");
background-size: 100% 100%;
height: vh(26);
}
// 视频画面
.camera {
box-sizing: border-box;
padding: vh(16) vw(16);
margin-bottom: vh(20);
}
.camera-box {
width: vw(380);
height: vh(238);
position: relative;
background-size: 100% 100%;
background-image: url("@/assets/images/camera-box.png");
iframe {
width: 100%;
height: 100%;
}
// margin: vh(16) 0 vh(20) 0;
}
.iframeBox {
// width: 100%;
// height: 100%;
position: fixed;
top: 0;
left: 0;
z-index: 99999;
iframe {
width: 100%;
height: 100%;
}
}
.enterImg img {
width: vw(64);
height: vh(64);
}
.aside {
//height: vh(380);
width: vw(44);
position: fixed;
bottom: vh(125);
left: vw(486);
z-index: 99;
&-li {
width: 100%;
position: relative;
margin-bottom: 0.6rem;
&-msg {
position: absolute;
left: 107%;
top: 0;
}
}
}
.container {
width: 100%;
height: 100%;
display: flex;
justify-content: space-between;
&-left,
&-right {
padding-top: vw(60);
width: vw(412);
z-index: 999;
height: 100%;
position: relative;
&-box {
width: 100%;
height: 100%;
}
}
//标题
.public-title,
.access-title {
height: vh(40);
width: 100%;
position: relative;
display: flex;
justify-content: space-between;
padding-left: 3.5rem;
padding-right: 1rem;
align-items: center;
box-sizing: border-box;
background-image: url("@/assets/images/title-box.png");
span:nth-child(1) {
font-family: pangmen;
font-size: 1.625rem;
}
.more,
.record-icon {
background-image: url("@/assets/images/checkMore.png");
cursor: pointer;
background-size: 100% 100%;
width: 4.25rem;
height: 1.5rem;
}
.record-icon {
background-image: url("@/assets/images/record-icon.png");
}
}
.access-title {
margin-top: 0.5rem;
background-image: url("@/assets/images/door-title.png");
}
&-left {
background-image: url("@/assets/images/left-mask.png");
padding-left: 3.5rem;
background-size: 100% 100%;
.schedule {
padding: vh(16) vw(16);
box-sizing: border-box;
margin-bottom: vh(20);
}
.schedule-date {
display: flex;
flex-wrap: wrap;
align-content: space-between;
padding: 0.6rem 0.8rem;
box-sizing: border-box;
background-image: url("@/assets/images/schedule-date.png");
width: 100%;
height: vh(80);
margin-bottom: vh(16);
}
.schedule-person {
position: relative;
width: 100%;
box-sizing: border-box;
padding: 0 vw(18);
&-box {
position: relative;
width: 100%;
height: vh(160);
overflow: hidden;
}
&-swiper {
transition: all 0.8s ease-in-out;
display: flex;
}
// margin-bottom: vh(15);
// box-sizing: border-box;
&-item {
padding-top: vh(6);
box-sizing: border-box;
width: vw(108);
height: 100%;
background-image: url("@/assets/images/schedule-person.png");
background-size: 100% 100%;
text-align: center;
margin-right: vw(9);
}
&-item:nth-child(3n) {
// margin-right:0 !important;
}
// justify-content: space-between;
img {
width: vw(108);
height: vh(116);
}
}
// &-item:nth-child(3n) {
// margin-right: 0;
// }
.pre,
.next {
position: absolute;
top: 40%;
background-size: 100% 100%;
cursor: pointer;
width: vw(20);
height: vh(20);
}
.pre {
left: vw(-10);
background-image: url("@/assets/images/pre.png");
}
.next {
right: vw(-10);
background-image: url("@/assets/images/next.png");
}
.keyword::-webkit-scrollbar {
display: none;
}
// 钥匙柜
.keyword {
width: 100%;
padding: 0 vw(16);
box-sizing: border-box;
&-state {
display: flex;
justify-content: flex-end;
font-size: 0.75rem;
margin: 1rem 0;
&-icon0,
&-icon1 {
width: 0.875rem;
height: 0.875rem;
background-size: 100% 100%;
display: inline-block;
vertical-align: middle;
margin-right: 0.5rem;
}
&-icon0 {
background-image: url("@/assets/images/has.png");
}
&-icon0 + span {
color: rgba(0, 220, 183, 1);
}
&-icon1 + span {
color: rgba(255, 255, 255, 1);
}
&-icon1 {
margin-left: 2rem;
background-image: url("@/assets/images/noHas.png");
}
}
&-box {
height: vh(180);
overflow: scroll;
}
&-box::-webkit-scrollbar {
display: none;
}
&-item {
float: left;
width: vw(88);
font-size: 0.75rem;
height: vh(52);
display: flex;
align-items: center;
padding: 0.5rem;
box-sizing: border-box;
justify-content: flex-end;
margin-bottom: 0.5rem;
background-image: url("@/assets/images/has-bg.png");
background-size: 100% 100%;
margin-right: vw(9);
position: relative;
.position {
top: 0;
position: absolute;
left: 50%;
white-space: nowrap;
font-size: 0.625rem;
transform: translate(-50%);
}
&-state1 {
background-image: url("@/assets/images/has-bg.png");
color: rgba(0, 237, 197, 1);
}
&-state2 {
color: rgba(255, 255, 255, 1);
background-image: url("@/assets/images/noHas-bg.png");
}
}
&-item:nth-of-type(4n) {
margin-right: 0;
}
}
}
&-right {
background-image: url("@/assets/images/right-mask.png");
padding-right: 3.5rem;
background-size: 100% 100%;
.alarmList::-webkit-scrollbar {
display: none;
}
//报警列表
.alarmList {
width: 100%;
height: vh(500);
padding: vh(16) vw(16);
box-sizing: border-box;
overflow: scroll;
flex-wrap: wrap;
align-content: space-evenly;
&-type {
padding-top: 0.75rem;
padding-left: 1.3rem;
box-sizing: border-box;
color: rgba(255, 255, 255, 1);
}
//温湿度告警、紧急告警
&-content {
display: flex;
flex-wrap: wrap;
padding-left: 0.7rem;
align-items: center;
box-sizing: border-box;
align-content: space-evenly;
font-size: 0.875rem;
height: 70%;
color: rgba(189, 220, 248, 1);
.unit {
color: green;
}
}
&-content > div:nth-child(2n-1) {
width: 40%;
}
&-content > div > span:nth-of-type(1) {
color: rgba(88, 174, 247, 1);
}
:deep(.el-carousel__arrow--left) {
left: vw(-10);
}
:deep(.el-carousel__arrow--right) {
right: vw(-10);
}
:deep(.el-carousel) {
width: 100%;
height: vh(108);
margin-bottom: vh(13);
}
:deep(.el-carousel:last-child) {
margin-bottom: 0 !important;
}
:deep(.el-carousel__container) {
height: vh(108);
}
section {
width: 100%;
background-size: 100% 100%;
height: vh(108);
background-image: url("@/assets/images/alarm-item.png");
}
// 区域入侵
&-regional {
align-items: center;
display: flex;
font-size: 0.875rem;
color: rgba(189, 220, 248, 1);
padding-left: 0.7rem;
height: 70%;
&-msg {
height: 100%;
margin-left: 0.75rem;
display: flex;
flex-wrap: wrap;
align-content: space-evenly;
}
}
}
}
}
.footer {
width: 100%;
height: vh(26);
position: absolute;
bottom: 0;
background-image: url("@/assets/images/bottom.png");
justify-content: center;
&-ul {
width: vw(800);
// width: vw(960);
display: flex;
position: absolute;
top: -100%;
left: 50%;
transform: translate(-50%);
&-li {
margin-left: -1.25rem;
cursor: pointer;
img {
width: vw(176);
height: vh(36);
}
}
&-li:nth-child(1) {
margin-left: 0;
}
}
}
//巡更线列表
.patrol-line {
height: vh(356);
width: 100%;
// margin-top: 1rem;
padding: vh(16);
box-sizing: border-box;
.qiu-icon {
display: inline-block;
width: 0.5rem;
height: 0.5rem;
margin-right: 0.3rem;
border-radius: 50%;
}
}
:deep(.state2) {
color: #ffbf00;
}
:deep(.state1) {
color: #f05657;
}
:deep(.state3) {
color: #52e76f;
}
:deep(.el-table__row--striped) {
background-image: none !important;
}
:deep(tr.el-table__row td.el-table__cell) {
background-color: transparent !important;
}
:deep(.el-table__inner-wrapper::before) {
background-color: transparent !important;
}
:deep(.el-table .el-table__cell) {
padding: 0;
}
:deep(.el-table .cell) {
height: 100%;
line-height: 2.4rem;
}
:deep(.el-table tr),
:deep(.el-table),
:deep(.el-table th),
:deep(.el-table td) {
background-color: transparent;
}
:deep(.el-table__row) {
height: 2.4rem;
}
:deep(.el-table) {
color: rgba(233, 244, 255, 1);
font-size: 0.8rem;
height: 100%;
}
:deep(.el-table thead) {
color: rgba(255, 255, 255, 1);
font-size: 0.8rem;
background-image: url("@/assets/images/table-header.png");
height: 2rem;
line-height: 2rem;
font-weight: normal;
}
:deep(.el-table th.el-table__cell.is-leaf),
:deep(.el-table td.el-table__cell) {
border-color: transparent;
}
//门禁
:deep(.el-collapse-item__header) {
height: 1.75rem;
padding-left: 0.625rem;
margin-bottom: vh(10);
font-size: 0.95rem;
box-sizing: border-box;
border: none;
background-color: transparent;
color: rgba(233, 244, 255, 1);
background-image: url("@/assets/images/door-device.png");
}
:deep(.el-collapse-item__content) {
background-color: transparent;
border: none !important;
font-size: 1rem;
padding-bottom: 0;
}
:deep(.el-collapse-item__wrap) {
background-color: transparent;
border: none;
}
:deep(.el-collapse) {
border: none;
//border-color: unset;
}
:deep(.el-timeline-item__wrapper) {
padding-left: 0.8rem;
}
:deep(.el-timeline) {
padding-left: 0.3rem;
box-sizing: border-box;
padding-top: 0.5rem;
}
:deep(.el-timeline-item) {
padding-bottom: 0.4rem;
}
:deep(.el-timeline-item__content) {
color: rgba(233, 244, 255, 1);
font-size: 0.875rem;
padding: 0 1rem;
//background-image: url('@/assets/images/timeline.png');
//background-size: 100% 100%;
box-sizing: border-box;
}
:deep(.el-timeline-item__node--normal) {
width: 0.75rem;
height: 0.75rem;
left: 1px;
top: 0.3rem;
// background-color: transparent;
background-image: url("@/assets/images/round-icon.png");
}
:deep(.el-timeline-item__tail) {
//border-color: #0a6594;
border: 1px dashed #fff;
height: 87%;
top: 1.1rem;
left: 6px;
}
</style>