shenzhen-dev #2

Merged
admin merged 614 commits from shenzhen-dev into master 2025-06-03 18:28:43 +08:00
31 changed files with 2109 additions and 128 deletions
Showing only changes of commit 72487bbe04 - Show all commits

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

View File

@ -1,12 +1,12 @@
<template>
<Card title="历史告警趋势">
<div class="topLeftBox">
<div class="ai-top-left">
<div class="history-content">
<div class="selectRight">
<div class="rightHeader">
<div class="day Selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">24</div>
<div class="week Selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month Selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
<div>
<div class="select-right">
<div class="day selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">24</div>
<div class="week selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
</div>
</div>
<div id="AIHistoryTrend" ref="AIHistoryTrend" style="width: 100%; height: 100%"></div>
@ -250,7 +250,7 @@ onBeforeUnmount(async () => {
</script>
<style lang="scss" scoped>
.topLeftBox {
.ai-top-left {
width: 100%;
height: 100%;
.title {
@ -271,7 +271,7 @@ onBeforeUnmount(async () => {
// background: url("@/assets/images/cardImg.png") no-repeat;
// background-size: 100% 100%;
position: relative;
.rightHeader {
.select-right {
width: 20%;
display: flex;
position: absolute;
@ -282,7 +282,7 @@ onBeforeUnmount(async () => {
line-height: 20px;
right: -1%;
top: 5%;
.Selected {
.selected {
height: 5%;
background: url("@/assets/images/dustNoise/rightImg2.png") no-repeat;
background-size: 100% 100%;

View File

@ -1,8 +1,8 @@
<template>
<Card title="今日告警">
<div class="bottomBox">
<div class="ai-bottom-right">
<div class="list-content">
<div class="tabList">
<div class="tab-list">
<div>序号</div>
<div>抓拍照片</div>
<div style="margin-right: 1%">设备名称</div>
@ -11,8 +11,8 @@
<div>操作</div>
</div>
<div class="listBox">
<div v-for="(item, index) in list" class="listStyle" :key="item.id">
<div class="list-box">
<div v-for="(item, index) in list" class="list-style" :key="item.id">
<div>{{ index + 1 }}</div>
<div class="list-img">
<img src="@/assets/images/vehicleManagement/car.png" alt="" />
@ -23,7 +23,7 @@
<div>{{ item.warnTime }}</div>
<div style="color: #65d7f9; cursor: pointer" @click="showDialog = !showDialog">查看详情</div>
</div>
<div class="notoDta" v-if="list.length == 0">
<div class="not-data" v-if="list.length == 0">
<img src="@/assets/images/noData.png" alt="" />
<p>暂无数据</p>
</div>
@ -266,7 +266,7 @@ onMounted(async () => {});
}
}
}
.bottomBox {
.ai-bottom-right {
width: 100%;
height: 100%;
.title {
@ -288,7 +288,7 @@ onMounted(async () => {});
margin-top: 10px;
// background: url("@/assets/images/cardImg.png") no-repeat;
// background-size: 100% 100%;
.tabList {
.tab-list {
display: flex;
width: 100%;
height: 10%;
@ -305,10 +305,10 @@ onMounted(async () => {});
width: 16%;
}
}
.listBox {
.list-box {
height: 95%;
overflow: scroll;
.listStyle {
.list-style {
display: flex;
align-items: center;
color: #fff;
@ -330,13 +330,13 @@ onMounted(async () => {});
white-space: nowrap;
}
}
.listStyle:hover {
.list-style:hover {
background: #091f3f;
}
}
}
}
.notoDta {
.not-data {
top: 73%;
width: 12%;
left: 44%;

View File

@ -1,6 +1,6 @@
<template>
<Card title="实时监测">
<div class="centerBottom">
<div class="ai-center-bottom">
<div class="today-warn"><i>今日告警:94</i></div>
<div class="icon"></div>
<div class="week-warn">
@ -20,7 +20,7 @@ import Card from "@/components/card.vue";
</script>
<style scoped lang="scss">
.centerBottom {
.ai-center-bottom {
width: 100%;
height: 100%;
position: relative;

View File

@ -1,6 +1,6 @@
<template>
<Card title="今日告警趋势">
<div class="topLeftBox">
<div class="top-left-box">
<div class="today-content">
<!-- <div class="selectRight">
<el-select v-model="value" class="m-2" placeholder="Select" size="small" @change="selectChange">
@ -248,7 +248,7 @@ onBeforeUnmount(async () => {
</script>
<style lang="scss" scoped>
.topLeftBox {
.top-left-box {
width: 100%;
height: 100%;
.title {

View File

@ -1,11 +1,11 @@
<template>
<Card title="告警统计">
<div class="box">
<div class="selectRight">
<div class="rightHeader">
<div class="day Selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">24</div>
<div class="week Selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month Selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
<div class="ai-top-right">
<div>
<div class="select-right">
<div class="day selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">24</div>
<div class="week selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
</div>
</div>
<div id="AIWarnTotal" ref="AIWarnTotal" style="width: 100%; height: 100%"></div>
@ -203,12 +203,12 @@ onMounted(async () => {
</script>
<style lang="scss" scoped>
.box {
.ai-top-right {
width: 100%;
height: 100%;
position: relative;
}
.rightHeader {
.select-right {
width: 25%;
display: flex;
position: absolute;
@ -219,7 +219,7 @@ onMounted(async () => {
line-height: 20px;
right: -1%;
top: 5%;
.Selected {
.selected {
height: 5%;
background: url("@/assets/images/dustNoise/rightImg2.png") no-repeat;
background-size: 100% 100%;

View File

@ -1,8 +1,8 @@
<template>
<Card title="过磅记录">
<div class="bottom-box">
<div class="content">
<div class="tabList">
<div class="loadometer-bottom-center">
<div class="loadometer-content">
<div class="tab-list">
<div>序号</div>
<div>流水号</div>
<div>车牌号</div>
@ -11,8 +11,8 @@
<div style="width: 20%">皮重时间</div>
<div style="width: 23%">毛重时间</div>
</div>
<div class="listBox">
<div v-for="(item, index) in list" class="listStyle" :key="item.id">
<div class="list-box">
<div v-for="(item, index) in list" class="list-style" :key="item.id">
<div>{{ index + 1 }}</div>
<div>{{ item.waterNum }}</div>
<div>{{ item.carNum }}</div>
@ -21,7 +21,7 @@
<div style="width: 20%">{{ item.tareTime }}</div>
<div style="width: 18%; text-align: right">{{ item.grossTime }}</div>
</div>
<div class="notoDta" v-if="list.length == 0">
<div class="not-data" v-if="list.length == 0">
<img src="@/assets/images/noData.png" alt="" />
<p>暂无数据</p>
</div>
@ -153,7 +153,7 @@ onMounted(async () => {});
</script>
<style lang="scss" scoped>
.bottom-box {
.loadometer-bottom-center {
width: 100%;
height: 100%;
.title {
@ -169,13 +169,13 @@ onMounted(async () => {});
font-family: OPPOSansH;
}
}
.content {
.loadometer-content {
height: 100%;
width: 100%;
margin-top: 10px;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
.tabList {
.tab-list {
display: flex;
width: 100%;
height: 10%;
@ -194,10 +194,10 @@ onMounted(async () => {});
width: 11.5%;
}
}
.listBox {
.list-box {
height: 90%;
overflow: scroll;
.listStyle {
.list-style {
display: flex;
align-items: center;
color: #fff;
@ -209,13 +209,13 @@ onMounted(async () => {});
width: 11.5%;
}
}
.listStyle:hover {
.list-style:hover {
background: #091f3f;
}
}
}
}
.notoDta {
.not-data {
top: 73%;
width: 12%;
left: 44%;

View File

@ -1,12 +1,12 @@
<template>
<Card title="预约趋势">
<div class="topLeftBox">
<div class="content">
<div class="selectRight">
<div class="rightHeader">
<div class="day Selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">今日</div>
<div class="week Selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month Selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
<div class="loadometer-top-left">
<div class="loadometer-content">
<div>
<div class="right-header">
<div class="day selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">今日</div>
<div class="week selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
</div>
</div>
<div id="appointmentTrend" ref="appointmentTrend" style="width: 100%; height: 100%"></div>
@ -250,15 +250,15 @@ onBeforeUnmount(async () => {
</script>
<style lang="scss" scoped>
.topLeftBox {
.loadometer-top-left {
width: 100%;
height: 100%;
.content {
.loadometer-content {
height: 100%;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
position: relative;
.rightHeader {
.right-header {
width: 30%;
display: flex;
position: absolute;
@ -269,7 +269,7 @@ onBeforeUnmount(async () => {
line-height: 20px;
right: 1%;
top: 6%;
.Selected {
.selected {
height: 5%;
background: url("@/assets/images/dustNoise/rightImg2.png") no-repeat;
background-size: 100% 100%;

View File

@ -1,12 +1,12 @@
<template>
<Card title="过磅统计">
<div class="topLeftBox">
<div class="content">
<div class="selectRight">
<div class="rightHeader">
<div class="day Selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">今日</div>
<div class="week Selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month Selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
<div class="loadometer-top-left">
<div class="loadometer-content">
<div>
<div class="right-header">
<div class="day selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">今日</div>
<div class="week selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
</div>
</div>
<div id="weighStatist" ref="weighStatist" style="width: 100%; height: 100%"></div>
@ -250,15 +250,15 @@ onBeforeUnmount(async () => {
</script>
<style lang="scss" scoped>
.topLeftBox {
.loadometer-top-left {
width: 100%;
height: 100%;
.content {
.loadometer-content {
height: 100%;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
position: relative;
.rightHeader {
.right-header {
width: 30%;
display: flex;
position: absolute;
@ -269,7 +269,7 @@ onBeforeUnmount(async () => {
line-height: 20px;
right: 1%;
top: 5%;
.Selected {
.selected {
height: 5%;
background: url("@/assets/images/dustNoise/rightImg2.png") no-repeat;
background-size: 100% 100%;

View File

@ -1,6 +1,6 @@
<template>
<Card title="实时过磅">
<div class="center-bottom">
<div class="load-top-center">
<div class="realtime-data">
<div class="realtime-box" v-for="item in list" :key="item.id">
<div class="text">今日过磅</div>
@ -55,7 +55,7 @@ const list = reactive([
</script>
<style scoped lang="scss">
.center-bottom {
.load-top-center {
width: 100%;
height: 100%;
.realtime-data {

View File

@ -1,6 +1,6 @@
<template>
<Card title="供应商排名">
<div class="box">
<div class="load-top-left">
<div id="supplierRank" ref="supplierRank" style="width: 100%; height: 100%"></div>
</div>
</Card>
@ -284,7 +284,7 @@ onMounted(async () => {
</script>
<style lang="scss" scoped>
.box {
.load-top-left {
width: 100%;
height: 100%;
padding-left: 3%;

View File

@ -1,11 +1,11 @@
<template>
<Card title="物料统计">
<div class="leftBottomBox">
<div class="selectRight">
<div class="rightHeader">
<div class="day Selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">今日</div>
<div class="week Selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month Selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
<div class="load-top-right">
<div>
<div class="select-right">
<div class="day selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">今日</div>
<div class="week selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">7</div>
<div class="month selected" @click="getMonthData(3)" :class="checked == 3 ? 'active' : ''">30</div>
</div>
</div>
<div id="materialStatistics" style="width: 100%; height: 100%"></div>
@ -350,7 +350,7 @@ function drawEchart() {
</script>
<style lang="scss" scoped>
.leftBottomBox {
.load-top-right {
width: 100%;
height: 100%;
position: relative;
@ -375,7 +375,7 @@ function drawEchart() {
// background: url("@/assets/images/dustNoise/motionEffect.webp") no-repeat;
// background-size: cover;
// }
.rightHeader {
.select-right {
width: 35%;
display: flex;
position: absolute;
@ -386,7 +386,7 @@ function drawEchart() {
line-height: 20px;
right: -1%;
top: 5%;
.Selected {
.selected {
height: 5%;
background: url("@/assets/images/dustNoise/rightImg2.png") no-repeat;
background-size: 100% 100%;

View File

@ -2,21 +2,21 @@
<Card title="今日告警">
<div class="bottom-left">
<div class="left-content">
<div class="tabList">
<div class="tab-list">
<div>序号</div>
<div>报警设备</div>
<div>报警时间</div>
<div>报警类型</div>
</div>
<div class="listBox">
<div v-for="(item, index) in list" class="listStyle" :key="item.id">
<div class="list-box">
<div v-for="(item, index) in list" class="list-style" :key="item.id">
<div>{{ index + 1 }}</div>
<!-- <div>{{ item.dev }}</div> -->
<div>{{ item.devName }}</div>
<div style="margin-right: 0.5%">{{ item.warnTime }}</div>
<div>{{ item.warnType }}</div>
</div>
<div class="notoDta" v-if="list.length == 0">
<div class="not-data" v-if="list.length == 0">
<img src="@/assets/images/noData.png" alt="" />
<p>暂无数据</p>
</div>
@ -148,7 +148,7 @@ onMounted(async () => {});
width: 100%;
// background: url("@/assets/images/cardImg.png") no-repeat;
// background-size: 100% 100%;
.tabList {
.tab-list {
display: flex;
align-items: center;
width: 100%;
@ -166,10 +166,10 @@ onMounted(async () => {});
width: 24%;
}
}
.listBox {
.list-box {
height: 90%;
overflow: scroll;
.listStyle {
.list-style {
display: flex;
align-items: center;
color: #fff;
@ -190,13 +190,13 @@ onMounted(async () => {});
white-space: nowrap;
}
}
.listStyle:hover {
.list-style:hover {
background: #091f3f;
}
}
}
}
.notoDta {
.not-data {
top: 73%;
width: 12%;
left: 44%;

View File

@ -1,11 +1,11 @@
<template>
<Card title="监测记录">
<div class="topLeftBox">
<div class="bottom-right-box">
<div class="history-content">
<div class="selectRight">
<div class="rightHeader">
<div class="day Selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">温度</div>
<div class="week Selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">湿度</div>
<div>
<div class="select-right">
<div class="day selected" @click="getNowData(1)" :class="checked == 1 ? 'active' : ''">温度</div>
<div class="week selected" @click="getWeekData(2)" :class="checked == 2 ? 'active' : ''">湿度</div>
</div>
</div>
<div id="monitorRecord" ref="monitorRecord" style="width: 100%; height: 100%"></div>
@ -273,7 +273,7 @@ onBeforeUnmount(async () => {
</script>
<style lang="scss" scoped>
.topLeftBox {
.bottom-right-box {
width: 100%;
height: 100%;
.title {
@ -294,7 +294,7 @@ onBeforeUnmount(async () => {
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
position: relative;
.rightHeader {
.select-right {
width: 20%;
display: flex;
position: absolute;
@ -305,7 +305,7 @@ onBeforeUnmount(async () => {
line-height: 20px;
right: -5%;
top: 5%;
.Selected {
.selected {
height: 5%;
background: url("@/assets/images/dustNoise/rightImg2.png") no-repeat;
background-size: 100% 100%;

View File

@ -1,23 +1,66 @@
<template>
<Card title="今日报警">
<div class="centerBottom">
<div class="top-center">
<div class="today-warn">
<div class="warn-num">24</div>
<div class="warn-text">今日报警次数</div>
</div>
<div class="select-right">
<el-select v-model="selectDay" style="width: 85%" size="small">
<el-option v-for="(item, index) in dayList" :key="index" :label="item.dayType" :value="item.value" />
</el-select>
</div>
</div>
</Card>
</template>
<script setup lang="ts">
import Card from "@/components/card.vue";
import { ref } from "vue";
//
let selectDay = ref(1);
let dayList = ref([
{
value: 1,
dayType: "标养室1"
},
{
value: 2,
dayType: "标养室2"
},
{
value: 3,
dayType: "标养室3"
},
{
value: 4,
dayType: "标养室4"
}
]);
</script>
<style scoped lang="scss">
.centerBottom {
:deep(.el-input__wrapper) {
background: #112d59;
padding-left: 10%;
}
:deep(.el-input__inner) {
color: #fff;
}
:deep(.el-select .el-input .el-select__caret) {
color: #fff;
}
.top-center {
width: 100%;
height: 100%;
position: relative;
.select-right {
position: absolute;
right: -2%;
width: 15%;
top: -9%;
z-index: 9;
}
.today-warn {
font-size: calc(100vw * 20 / 1920);
font-family: OPPOSansH;

View File

@ -1,6 +1,6 @@
<template>
<Card title="实时温度监测">
<div class="box">
<div class="top-left-box">
<div class="humidity-pic">
<img src="@/assets/images/standardCureRoom/yuanZhu.png" alt="" />
</div>
@ -442,7 +442,7 @@ onMounted(async () => {
</script>
<style lang="scss" scoped>
.box {
.top-left-box {
width: 100%;
height: 100%;
position: relative;

View File

@ -1,6 +1,6 @@
<template>
<Card title="实时湿度监测">
<div class="box">
<div class="top-right-box">
<div class="humidity-pic">
<img src="@/assets/images/standardCureRoom/yuanZhu.png" alt="" />
</div>
@ -442,7 +442,7 @@ onMounted(async () => {
</script>
<style lang="scss" scoped>
.box {
.top-right-box {
width: 100%;
height: 100%;
position: relative;

View File

@ -140,13 +140,13 @@ let menuList = ref([
menuName: "安全管理",
companyPath: "/securityManagement"
},
{
menuName: "有毒气体监测",
companyPath: "/toxicGasMonitor"
},
{
menuName: "临边防护",
companyPath: "/edgeProtection"
},
{
menuName: "有毒气体监测",
companyPath: "/toxicGasMonitor"
}
]
},

View File

@ -1,8 +1,8 @@
<template>
<Card title="实时数据">
<div class="bottom-box">
<div class="edge-bottom-left">
<div class="list-content">
<div class="tabList">
<div class="tab-list">
<div>序号</div>
<div style="width: 25%">上报时间</div>
<div>设备名称</div>
@ -11,8 +11,8 @@
<div>防翻越</div>
<div>人员靠近</div>
</div>
<div class="listBox">
<div v-for="(item, index) in list" class="listStyle" :key="item.id">
<div class="list-box">
<div v-for="(item, index) in list" class="list-style" :key="item.id">
<div>{{ index + 1 }}</div>
<div style="width: 25%">{{ item.reportTime }}</div>
<div>{{ item.devName }}</div>
@ -25,7 +25,7 @@
{{ item.personApproachType == 0 ? "正常" : "报警" }}
</div>
</div>
<div class="notoDta" v-if="list.length == 0">
<div class="not-data" v-if="list.length == 0">
<img src="@/assets/images/noData.png" alt="" />
<p>暂无数据</p>
</div>
@ -172,7 +172,7 @@ onMounted(async () => {});
color: #ccc;
font-size: 10px;
}
.bottom-box {
.edge-bottom-left {
width: 100%;
height: 100%;
position: relative;
@ -199,7 +199,7 @@ onMounted(async () => {});
width: 100%;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
.tabList {
.tab-list {
display: flex;
align-items: center;
width: 100%;
@ -219,10 +219,10 @@ onMounted(async () => {});
width: 11.5%;
}
}
.listBox {
.list-box {
height: 90%;
overflow: scroll;
.listStyle {
.list-style {
display: flex;
align-items: center;
color: #fff;
@ -234,13 +234,13 @@ onMounted(async () => {});
width: 11.5%;
}
}
.listStyle:hover {
.list-style:hover {
background: #091f3f;
}
}
}
}
.notoDta {
.not-data {
top: 73%;
width: 12%;
left: 44%;

View File

@ -1,6 +1,6 @@
<template>
<Card title="报警数据">
<div class="bottom-box">
<div class="edge-bottom-right">
<div class="time-range">
<el-date-picker
v-model="rangeTime"
@ -32,7 +32,7 @@
<div>{{ item.warnType }}</div>
<div>{{ item.warnTime }}</div>
</div>
<div class="notoDta" v-if="list.length == 0">
<div class="not-data" v-if="list.length == 0">
<img src="@/assets/images/noData.png" alt="" />
<p>暂无数据</p>
</div>
@ -179,7 +179,7 @@ onMounted(async () => {});
color: #ccc;
font-size: 10px;
}
.bottom-box {
.edge-bottom-right {
width: 100%;
height: 100%;
padding-top: 4%;
@ -249,7 +249,7 @@ onMounted(async () => {});
}
}
}
.notoDta {
.not-data {
top: 73%;
width: 12%;
left: 44%;

View File

@ -1,6 +1,6 @@
<template>
<Card title="报警统计(次)">
<div class="top-left">
<div class="edge-top-left">
<div class="warn-box">
<div class="warn-icon" style="margin-top: 5%">
<img src="@/assets/images/edgeProtection/warn1.png" alt="" />
@ -46,7 +46,7 @@ import Card from "@/components/card.vue";
</script>
<style scoped lang="scss">
.top-left {
.edge-top-left {
width: 100%;
height: 100%;
margin-left: 3%;

View File

@ -1,6 +1,6 @@
<template>
<Card title="近7日趋势(次)">
<div class="top-right-box">
<div class="edge-top-right">
<div class="history-content">
<div id="edgeWeekTrend" ref="edgeWeekTrend" style="width: 100%; height: 100%"></div>
</div>
@ -173,7 +173,7 @@ function initOption() {
showAllSymbol: true,
symbol: `image://${symbolIcon}`,
// symbol: "circle",
smooth: 0.8,
smooth: 0.3,
symbolSize: 30,
label: {
show: false,
@ -267,7 +267,7 @@ onBeforeUnmount(async () => {
</script>
<style lang="scss" scoped>
.top-right-box {
.edge-top-right {
width: 100%;
height: 100%;
.title {

View File

@ -0,0 +1,305 @@
<template>
<Card title="甲烷含量监测">
<div class="gas-bottom-center">
<div class="methane-content">
<div class="select-right">
<el-select v-model="selectDay" style="width: 85%" size="small">
<el-option v-for="(item, index) in dayList" :key="index" :label="item.dayType" :value="item.value" />
</el-select>
</div>
<div id="methaneMonitoring" ref="methaneMonitoring" style="width: 100%; height: 100%"></div>
</div>
</div>
</Card>
</template>
<script lang="ts" setup>
import Card from "@/components/card.vue";
import symbolIcon from "@/assets/images/toxicGasMonitor/lineIcon.png";
import symbolIcon2 from "@/assets/images/toxicGasMonitor/lineIcon2.png";
import { onMounted, reactive, ref, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
// import { getSelectDataListApi } from "@/api/modules/distribution";
// import Card from "@/components/card.vue";
import { GlobalStore } from "@/stores";
import mitts from "@/utils/bus"; //
const store = GlobalStore();
// x
let twenty_four_time = ref([
"00:00",
"02:00",
"04:00",
"06:00",
"08:00",
"10:00",
"12:00",
"14:00",
"16:00",
"18:00",
"20:00",
"22:00",
"24:00"
] as any);
// Y
let unit = ref("%LEL" as any);
// Y
let yData1 = ref([0.22, 0.22, 0.191, 0.234, 0.34, 0.33, 0.31, 0.22, 0.182, 0.191, 0.234, 0.29, 0.251] as any);
let yData2 = ref([0.12, 0.132, 0.101, 0.134, 0.2, 0.23, 0.21, 0.12, 0.132, 0.101, 0.134, 0.21, 0.17] as any);
//
let option = ref(null as any);
//
let selectDay = ref(1);
//
// let nowType = ref("");
let dayList = ref([
{
value: 1,
dayType: "全部"
},
{
value: 2,
dayType: "本周"
},
{
value: 3,
dayType: "本月"
},
{
value: 4,
dayType: "本年"
}
]);
function initOption() {
option.value = {
// backgroundColor: '#071c3a',
title: {
// text: '',
textStyle: {
align: "center",
color: "#fff",
fontSize: 20
},
top: "2%",
left: "center"
},
tooltip: {
trigger: "axis",
backgroundColor: "rgba(0, 0, 0, 0.9)",
borderColor: "#010306",
textStyle: {
color: "#FFFFFF"
},
axisPointer: {
lineStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgba(0, 255, 233,0)"
},
{
offset: 0.5,
color: "rgba(255, 255, 255,1)"
},
{
offset: 1,
color: "rgba(0, 255, 233,0)"
}
],
global: false
}
}
}
// formatter: function (params) {
// // console.log("tooltip", params);
// return (
// params[0].name +
// "<br/>" +
// params[0].marker +
// " " +
// params[0].seriesName +
// ": " +
// params[0].value +
// "<br/>" +
// params[1].marker +
// " " +
// params[1].seriesName +
// ": " +
// params[1].value
// );
// }
},
grid: {
top: "20%",
left: "10%",
right: "8%",
bottom: "12%"
// containLabel: true
},
xAxis: [
{
type: "category",
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
splitArea: {
// show: true,
color: "#f00",
lineStyle: {
color: "#f00"
}
},
axisLabel: {
color: "#fff"
},
splitLine: {
show: false
},
boundaryGap: false,
data: twenty_four_time.value
}
],
yAxis: [
{
name: unit.value,
nameGap: 30,
nameTextStyle: {
align: "right", // Y
verticalAlign: "middle", // Y
padding: [0, 15, 0, 0], //
color: "#fff",
nameLocation: "start"
},
type: "value",
min: 0,
// max: 140,
splitNumber: 3,
splitLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLabel: {
show: true,
margin: 20,
textStyle: {
color: "#fff"
}
},
axisTick: {
show: true
}
}
],
series: [
{
showAllSymbol: true,
symbol: `image://${symbolIcon2}`,
// symbol: "circle",
symbolSize: 8,
smooth: true, //
name: "青岛滨海新区海底隧道左洞-甲烷含量监测",
type: "line",
color: "#4AC0F3",
data: yData1.value
},
{
showAllSymbol: true,
symbol: `image://${symbolIcon}`,
// symbol: "circle",
symbolSize: 8,
smooth: true, //
name: "青岛滨海新区海底隧道左洞-甲烷含量监测01",
type: "line",
color: "#81F279",
data: yData2.value
}
]
};
}
function drawChart() {
initOption();
// console.log("", yData.value);
let methaneMonitoring = echarts.init(document.getElementById("methaneMonitoring"));
methaneMonitoring.setOption(option.value);
}
//-24
// function generateTimes() {
// let timeArrays = new Array(24).fill("");
// timeArrays.forEach((item, index) => (timeArrays[index] = (index < 10 ? "0" + index : index) + ":00"));
// return timeArrays;
// }
onMounted(async () => {
drawChart();
});
// 线miits.on 7.14 by CJP
onBeforeUnmount(async () => {
mitts.off("devSn");
});
</script>
<style lang="scss" scoped>
.gas-bottom-center {
width: 100%;
height: 100%;
.title {
height: 10%;
line-height: 33px;
text-align: left;
font-size: calc(100vw * 18 / 1920);
color: #ffffff;
background: url("@/assets/images/titleBig.webp") no-repeat;
background-size: 100% 100%;
i {
font-family: OPPOSansH;
margin-left: 6%;
}
}
.methane-content {
height: 100%;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
position: relative;
.select-right {
position: absolute;
right: 0%;
width: 20%;
top: 5%;
z-index: 9;
}
}
}
:deep(.el-input__wrapper) {
background: #112d59;
padding-left: 10%;
}
:deep(.el-input__inner) {
color: #fff;
}
:deep(.el-select .el-input .el-select__caret) {
color: #fff;
}
</style>

View File

@ -0,0 +1,467 @@
<template>
<Card title="气体含量报警统计">
<div class="gas-bottom-left">
<div class="select-right">
<el-select v-model="gasName" style="width: 38%; margin-right: 14%" size="small">
<el-option v-for="(item, index) in noiseList" :key="index" :label="item.gasType" :value="item.value" />
</el-select>
<el-select v-model="selectDay" style="width: 38%" size="small">
<el-option v-for="(item, index) in dayList" :key="index" :label="item.dayType" :value="item.value" />
</el-select>
</div>
<div id="gasBottomLeft" style="width: 100%; height: 100%"></div>
</div>
</Card>
</template>
<script lang="ts" setup>
import { onMounted, ref } from "vue";
import * as echarts from "echarts";
import Card from "@/components/card.vue";
import { GlobalStore } from "@/stores";
const store = GlobalStore();
const airType = ref(1);
let gasName = ref(1 as any);
let selectDay = ref(1 as any);
let noiseList = ref([
{
value: 1,
gasType: "全部气体"
},
{
value: 2,
gasType: "氨气"
},
{
value: 3,
gasType: "甲烷"
},
{
value: 4,
gasType: "硫化氢"
}
]);
let dayList = ref([
{
value: 1,
dayType: "今天"
},
{
value: 2,
dayType: "本周"
},
{
value: 3,
dayType: "本月"
},
{
value: 4,
dayType: "本年"
}
]);
let dataList = ref([
{
value: 37,
show: true,
name: "氨气",
itemStyle: {
normal: {
color: "#82FBEA",
borderWidth: 20
}
}
},
{
value: 46,
show: true,
name: "甲烷",
itemStyle: {
normal: {
color: "#EEA959",
borderWidth: 20
}
}
},
{
value: 30,
show: true,
name: "硫化氢",
itemStyle: {
normal: {
color: "#4CC4F8"
}
}
},
{
value: 30,
show: true,
name: "氢气",
itemStyle: {
normal: {
color: "#E0D838"
}
}
},
{
value: 8,
show: true,
name: "氧气",
itemStyle: {
normal: {
color: "#EC6266"
}
}
},
{
value: 32,
show: true,
name: "一氧化碳",
itemStyle: {
normal: {
color: "#6375C7"
}
}
},
{
value: 15,
show: true,
name: "二氧化碳",
itemStyle: {
normal: {
color: "#81F279"
}
}
},
{
value: 20,
show: true,
name: "PM10",
itemStyle: {
normal: {
color: "#94A2B6"
}
}
},
{
value: 7,
show: true,
name: "二氧化硫",
itemStyle: {
normal: {
color: "#E17CD1"
}
}
}
]);
function Pie() {
let dataArr = [];
for (let i = 0; i < 150; i++) {
if (i % 2 === 0) {
dataArr.push({
name: (i + 1).toString(),
value: 10,
itemStyle: {
normal: {
color: "#7cf4f1",
borderWidth: 0,
borderColor: "#7f6546"
}
}
});
} else {
dataArr.push({
name: (i + 1).toString(),
value: 10,
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
});
}
}
return dataArr;
}
onMounted(() => {
drawEchart();
});
function drawEchart() {
let max = 0;
dataList.value.map(item => {
max = max + item.value;
});
let echartsTest = echarts.init(document.getElementById("gasBottomLeft"));
let option = {
tooltip: {
trigger: "item",
backgroundColor: "#000000",
borderColor: "#000000",
formatter: function (params) {
// console.log(params.seriesName, "");
let result = " " + params.marker + params.name + " : " + params.value;
if (params.seriesName == "数据主体") {
return result;
}
},
textStyle: {
color: "#FFFFFF"
}
},
title: {
text: max,
subtext: "预警总数",
x: "20%",
y: "center",
textStyle: {
color: "#fff",
fontSize: 22,
fontWeight: "normal",
align: "center",
fontFamily: "sadigitalNumber",
lineHeight: 30
},
subtextStyle: {
color: "#ccc",
fontSize: 14,
fontWeight: "normal",
align: "center"
}
},
legend: {
selectedMode: false, //
icon: "rect",
type: "plain",
orient: "vertical",
left: "55%",
top: "20%",
align: "left",
itemGap: 16,
itemWidth: 8, //
itemHeight: 7, //
symbolKeepAspect: false,
textStyle: {
color: "#000",
rich: {
name: {
width: 130,
verticalAlign: "right",
fontSize: 14,
color: "#FFFFFF",
padding: [0, 0, 0, 10]
},
value: {
align: "left",
fontSize: 14,
color: "#FFFFFF"
}
}
},
data: dataList.value.map(item => {
if (item.show) {
return item.name;
}
}),
formatter: function (data) {
if (dataList.value && dataList.value.length) {
for (let i = 0; i < dataList.value.length; i++) {
if (data === dataList.value[i].name) {
let value = dataList.value[i].value;
return "{name|" + data + "}" + "{value|" + value + "}";
}
}
}
}
},
series: [
// 线
{
name: "",
type: "gauge",
center: ["25%", "55%"],
radius: "60%",
startAngle: 235,
endAngle: -50,
min: 0,
max: 100,
axisLine: {
show: true,
lineStyle: {
width: 2,
color: [
[
100 / 100,
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{
offset: 0,
color: "#526277"
},
{
offset: 0.25,
color: "rgba(4, 14, 54,0.4)"
},
{
offset: 0.7,
color: "rgba(4, 14, 54,0.4)"
},
{
offset: 1,
color: "#526277"
}
])
],
[1, "rgba(255,255,255,0)"]
]
}
},
axisTick: {
show: 0
},
splitLine: {
show: 0
},
axisLabel: {
show: 0
},
pointer: {
show: 0
},
detail: {
show: 0
}
},
{
name: "",
type: "gauge",
center: ["25%", "55%"],
radius: "52%",
startAngle: 245,
endAngle: -115,
min: 0,
max: 100,
axisLine: {
show: true,
lineStyle: {
width: 2,
color: [
[
200 / 100,
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{
offset: 1,
color: "#52bef0"
},
{
offset: 0,
color: "#13356b"
}
])
],
[1, "rgba(255,255,255,0)"]
]
}
},
axisTick: {
show: 0
},
splitLine: {
show: 0
},
axisLabel: {
show: 0
},
pointer: {
show: 0
},
detail: {
show: 0
}
},
{
name: "数据主体",
type: "pie",
radius: ["41%", "44%"],
center: ["25%", "55%"],
hoverAnimation: true,
itemStyle: {
borderRadius: 10,
borderWidth: 10
},
label: {
show: false,
position: "center"
},
emphasis: {
label: {
show: false
}
},
labelLine: {
show: false
},
data: dataList.value
},
{
name: "最内圆",
type: "pie",
radius: ["34%", "36%"],
center: ["25%", "55%"],
label: {
show: false
},
data: Pie()
}
]
};
echartsTest.setOption(option, true);
}
</script>
<style lang="scss" scoped>
.gas-bottom-left {
width: 100%;
height: 100%;
position: relative;
.select-right {
position: absolute;
display: flex;
right: 1%;
width: 44%;
top: 5%;
z-index: 9;
}
}
.num {
width: 66px;
text-align: center;
font-family: sadigitalNumber;
font-size: calc(100vw * 24 / 1920);
color: #fff;
position: absolute;
top: 45%;
left: 18%;
z-index: 9;
}
:deep(.el-input__wrapper) {
background: #112d59;
}
:deep(.el-input__inner) {
color: #fff;
font-size: 12px;
padding: 5%;
}
:deep(.el-select .el-input .el-select__caret) {
color: #fff;
}
</style>

View File

@ -0,0 +1,292 @@
<template>
<Card title="一氧化碳含量监测">
<div class="gas-bottom-right">
<div class="carbon-content">
<div class="select-right">
<el-select v-model="selectDay" style="width: 85%" size="small">
<el-option v-for="(item, index) in dayList" :key="index" :label="item.dayType" :value="item.value" />
</el-select>
</div>
<div id="carbonMonoxide" ref="carbonMonoxide" style="width: 100%; height: 100%"></div>
</div>
</div>
</Card>
</template>
<script lang="ts" setup>
import Card from "@/components/card.vue";
import symbolIcon2 from "@/assets/images/toxicGasMonitor/lineIcon2.png";
import { onMounted, reactive, ref, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
// import { getSelectDataListApi } from "@/api/modules/distribution";
// import Card from "@/components/card.vue";
import { GlobalStore } from "@/stores";
import mitts from "@/utils/bus"; //
const store = GlobalStore();
// x
let twenty_four_time = ref([
"00:00",
"02:00",
"04:00",
"06:00",
"08:00",
"10:00",
"12:00",
"14:00",
"16:00",
"18:00",
"20:00",
"22:00",
"24:00"
] as any);
// Y
let unit = ref("Ppm" as any);
// Y
let yData1 = ref([3, 3, 5, 4, 2, 4.5, 5, 2, 4.5, 5, 3.8, 2.9, 2.5] as any);
//
let option = ref(null as any);
//
let selectDay = ref(1);
//
// let nowType = ref("");
let dayList = ref([
{
value: 1,
dayType: "全部"
},
{
value: 2,
dayType: "本周"
},
{
value: 3,
dayType: "本月"
},
{
value: 4,
dayType: "本年"
}
]);
function initOption() {
option.value = {
// backgroundColor: '#071c3a',
title: {
// text: '',
textStyle: {
align: "center",
color: "#fff",
fontSize: 20
},
top: "2%",
left: "center"
},
tooltip: {
trigger: "axis",
backgroundColor: "rgba(0, 0, 0, 0.9)",
borderColor: "#010306",
textStyle: {
color: "#FFFFFF"
},
axisPointer: {
lineStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgba(0, 255, 233,0)"
},
{
offset: 0.5,
color: "rgba(255, 255, 255,1)"
},
{
offset: 1,
color: "rgba(0, 255, 233,0)"
}
],
global: false
}
}
}
// formatter: function (params) {
// // console.log("tooltip", params);
// return (
// params[0].name +
// "<br/>" +
// params[0].marker +
// " " +
// params[0].seriesName +
// ": " +
// params[0].value +
// "<br/>" +
// params[1].marker +
// " " +
// params[1].seriesName +
// ": " +
// params[1].value
// );
// }
},
grid: {
top: "20%",
left: "10%",
right: "8%",
bottom: "12%"
// containLabel: true
},
xAxis: [
{
type: "category",
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
splitArea: {
// show: true,
color: "#f00",
lineStyle: {
color: "#f00"
}
},
axisLabel: {
color: "#fff"
},
splitLine: {
show: false
},
boundaryGap: false,
data: twenty_four_time.value
}
],
yAxis: [
{
name: unit.value,
nameGap: 30,
nameTextStyle: {
align: "right", // Y
verticalAlign: "middle", // Y
padding: [0, 15, 0, 0], //
color: "#fff",
nameLocation: "start"
},
type: "value",
min: 0,
// max: 140,
splitNumber: 3,
splitLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLabel: {
show: true,
margin: 20,
textStyle: {
color: "#fff"
}
},
axisTick: {
show: true
}
}
],
series: [
{
showAllSymbol: true,
symbol: `image://${symbolIcon2}`,
// symbol: "circle",
symbolSize: 8,
smooth: true, //
name: "青岛滨海新区海底隧道左洞-一氧化碳含量监测",
type: "line",
color: "#4AC0F3",
data: yData1.value
}
]
};
}
function drawChart() {
initOption();
// console.log("", yData.value);
let carbonMonoxide = echarts.init(document.getElementById("carbonMonoxide"));
carbonMonoxide.setOption(option.value);
}
//-24
// function generateTimes() {
// let timeArrays = new Array(24).fill("");
// timeArrays.forEach((item, index) => (timeArrays[index] = (index < 10 ? "0" + index : index) + ":00"));
// return timeArrays;
// }
onMounted(async () => {
drawChart();
});
// 线miits.on 7.14 by CJP
onBeforeUnmount(async () => {
mitts.off("devSn");
});
</script>
<style lang="scss" scoped>
.gas-bottom-right {
width: 100%;
height: 100%;
.title {
height: 10%;
line-height: 33px;
text-align: left;
font-size: calc(100vw * 18 / 1920);
color: #ffffff;
background: url("@/assets/images/titleBig.webp") no-repeat;
background-size: 100% 100%;
i {
font-family: OPPOSansH;
margin-left: 6%;
}
}
.carbon-content {
height: 100%;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
position: relative;
.select-right {
position: absolute;
right: 0%;
width: 20%;
top: 5%;
z-index: 9;
}
}
}
:deep(.el-input__wrapper) {
background: #112d59;
padding-left: 10%;
}
:deep(.el-input__inner) {
color: #fff;
}
:deep(.el-select .el-input .el-select__caret) {
color: #fff;
}
</style>

View File

@ -0,0 +1,77 @@
<template>
<div class="distributionBox">
<div class="top">
<div class="topLeft">
<TopLeft></TopLeft>
</div>
<div class="topCenter">
<TopCenter></TopCenter>
</div>
<div class="topRight">
<TopRight></TopRight>
</div>
</div>
<div class="bottom">
<div class="bottomLeft">
<BottomLeft></BottomLeft>
</div>
<div class="bottomCenter">
<BottomCenter></BottomCenter>
</div>
<div class="bottomRight">
<BottomRight></BottomRight>
</div>
</div>
</div>
</template>
<script>
import TopLeft from "@/views/sevenLargeScreen/safetyManagement/toxicGasMonitor/topLeft.vue";
import TopCenter from "@/views/sevenLargeScreen/safetyManagement/toxicGasMonitor/topCenter.vue";
import TopRight from "@/views/sevenLargeScreen/safetyManagement/toxicGasMonitor/topRight.vue";
import BottomLeft from "@/views/sevenLargeScreen/safetyManagement/toxicGasMonitor/bottomLeft.vue";
import BottomCenter from "@/views/sevenLargeScreen/safetyManagement/toxicGasMonitor/bottomCenter.vue";
import BottomRight from "@/views/sevenLargeScreen/safetyManagement/toxicGasMonitor/bottomRight.vue";
export default {
components: { TopLeft, TopCenter, TopRight, BottomLeft, BottomRight, BottomCenter }
};
</script>
<style lang="scss" scoped>
.distributionBox {
width: 100%;
height: 100%;
.top {
width: 100%;
height: 49%;
display: flex;
margin-bottom: 1%;
.topLeft {
width: 33%;
// background-color: orchid;
}
.topCenter {
margin: 0% 1%;
width: 33%;
}
.topRight {
width: 33%;
}
}
.bottom {
width: 100%;
height: 48%;
display: flex;
.bottomLeft {
width: 33%;
}
.bottomCenter {
margin: 0% 1%;
width: 33%;
}
.bottomRight {
width: 33%;
}
}
}
</style>

View File

@ -0,0 +1,305 @@
<template>
<Card title="氧气含量监测">
<div class="gas-top-center">
<div class="oxygen-content">
<div class="select-right">
<el-select v-model="selectDay" style="width: 85%" size="small">
<el-option v-for="(item, index) in dayList" :key="index" :label="item.dayType" :value="item.value" />
</el-select>
</div>
<div id="oxygenMonitoring" ref="oxygenMonitoring" style="width: 100%; height: 100%"></div>
</div>
</div>
</Card>
</template>
<script lang="ts" setup>
import Card from "@/components/card.vue";
import symbolIcon from "@/assets/images/toxicGasMonitor/lineIcon.png";
import symbolIcon2 from "@/assets/images/toxicGasMonitor/lineIcon2.png";
import { onMounted, reactive, ref, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
// import { getSelectDataListApi } from "@/api/modules/distribution";
// import Card from "@/components/card.vue";
import { GlobalStore } from "@/stores";
import mitts from "@/utils/bus"; //
const store = GlobalStore();
// x
let twenty_four_time = ref([
"00:00",
"02:00",
"04:00",
"06:00",
"08:00",
"10:00",
"12:00",
"14:00",
"16:00",
"18:00",
"20:00",
"22:00",
"24:00"
] as any);
// Y
let unit = ref("%" as any);
// Y
let yData1 = ref([22, 22, 19, 23, 34, 33, 31, 22, 18, 19, 24, 29, 25] as any);
let yData2 = ref([12, 12, 10, 13, 20, 23, 21, 12, 13, 10, 13, 21, 17] as any);
//
let option = ref(null as any);
//
let selectDay = ref(1);
//
// let nowType = ref("");
let dayList = ref([
{
value: 1,
dayType: "全部"
},
{
value: 2,
dayType: "本周"
},
{
value: 3,
dayType: "本月"
},
{
value: 4,
dayType: "本年"
}
]);
function initOption() {
option.value = {
// backgroundColor: '#071c3a',
title: {
// text: '',
textStyle: {
align: "center",
color: "#fff",
fontSize: 20
},
top: "2%",
left: "center"
},
tooltip: {
trigger: "axis",
backgroundColor: "rgba(0, 0, 0, 0.9)",
borderColor: "#010306",
textStyle: {
color: "#FFFFFF"
},
axisPointer: {
lineStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgba(0, 255, 233,0)"
},
{
offset: 0.5,
color: "rgba(255, 255, 255,1)"
},
{
offset: 1,
color: "rgba(0, 255, 233,0)"
}
],
global: false
}
}
}
// formatter: function (params) {
// // console.log("tooltip", params);
// return (
// params[0].name +
// "<br/>" +
// params[0].marker +
// " " +
// params[0].seriesName +
// ": " +
// params[0].value +
// "<br/>" +
// params[1].marker +
// " " +
// params[1].seriesName +
// ": " +
// params[1].value
// );
// }
},
grid: {
top: "20%",
left: "10%",
right: "8%",
bottom: "12%"
// containLabel: true
},
xAxis: [
{
type: "category",
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
splitArea: {
// show: true,
color: "#f00",
lineStyle: {
color: "#f00"
}
},
axisLabel: {
color: "#fff"
},
splitLine: {
show: false
},
boundaryGap: false,
data: twenty_four_time.value
}
],
yAxis: [
{
name: unit.value,
nameGap: 30,
nameTextStyle: {
align: "right", // Y
verticalAlign: "middle", // Y
padding: [0, 15, 0, 0], //
color: "#fff",
nameLocation: "start"
},
type: "value",
min: 0,
// max: 140,
splitNumber: 3,
splitLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLabel: {
show: true,
margin: 20,
textStyle: {
color: "#fff"
}
},
axisTick: {
show: true
}
}
],
series: [
{
showAllSymbol: true,
symbol: `image://${symbolIcon2}`,
// symbol: "circle",
symbolSize: 8,
smooth: true, //
name: "青岛滨海新区海底隧道左洞-氧气含量监测",
type: "line",
color: "#4AC0F3",
data: yData1.value
},
{
showAllSymbol: true,
symbol: `image://${symbolIcon}`,
// symbol: "circle",
symbolSize: 8,
smooth: true, //
name: "青岛滨海新区海底隧道左洞-氧气含量监测01",
type: "line",
color: "#81F279",
data: yData2.value
}
]
};
}
function drawChart() {
initOption();
// console.log("", yData.value);
let oxygenMonitoring = echarts.init(document.getElementById("oxygenMonitoring"));
oxygenMonitoring.setOption(option.value);
}
//-24
// function generateTimes() {
// let timeArrays = new Array(24).fill("");
// timeArrays.forEach((item, index) => (timeArrays[index] = (index < 10 ? "0" + index : index) + ":00"));
// return timeArrays;
// }
onMounted(async () => {
drawChart();
});
// 线miits.on 7.14 by CJP
onBeforeUnmount(async () => {
mitts.off("devSn");
});
</script>
<style lang="scss" scoped>
.gas-top-center {
width: 100%;
height: 100%;
.title {
height: 10%;
line-height: 33px;
text-align: left;
font-size: calc(100vw * 18 / 1920);
color: #ffffff;
background: url("@/assets/images/titleBig.webp") no-repeat;
background-size: 100% 100%;
i {
font-family: OPPOSansH;
margin-left: 6%;
}
}
.oxygen-content {
height: 100%;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
position: relative;
.select-right {
position: absolute;
right: 0%;
width: 20%;
top: 5%;
z-index: 9;
}
}
}
:deep(.el-input__wrapper) {
background: #112d59;
padding-left: 10%;
}
:deep(.el-input__inner) {
color: #fff;
}
:deep(.el-select .el-input .el-select__caret) {
color: #fff;
}
</style>

View File

@ -0,0 +1,200 @@
<template>
<Card title="气体含量异常通知">
<div class="gas-top-left">
<div class="notice-list">
<div class="notice-box">
<!-- <el-scrollbar style="height: 100%"> -->
<div class="notice-item" v-for="item in list" :key="item.id">
<div class="notice-type-big" v-if="item.noticeType === 0" @click="openDialog(item)">
<div style="background: #ec6266"></div>
</div>
<div class="notice-type-small" v-if="item.noticeType === 1" @click="openDialog(item)">
<div style="background: #eea959"></div>
</div>
<div class="notice-text" :title="item.text" @click="openDialog(item)">{{ item.text }}</div>
<div class="notice-time" @click="openDialog(item)">{{ item.time }}</div>
<div class="item-dialog" v-if="item.id === currentIndex && showDialog" @click="closeDialog">
<div class="triangle"></div>
<div class="dialog-title">气体含量异常通知</div>
<div class="dialog-time">{{ item.time }}</div>
<div class="dialog-text">{{ item.text }}</div>
</div>
</div>
<!-- </el-scrollbar> -->
</div>
</div>
</div>
</Card>
</template>
<script setup lang="ts">
import Card from "@/components/card.vue";
import { reactive, ref, onMounted } from "vue";
let currentIndex = ref(1 as any);
let showDialog = ref(false as any);
const list = reactive([
{
id: 1,
time: "2023-09-05",
text: "青岛滨海新区海底隧道左洞-氨气含量监测:氨气含量高于报警值,请注意!",
noticeType: 0
},
{
id: 2,
time: "2023-09-04",
text: "青岛滨海新区海底隧道左洞-甲烷含量监测-甲烷含量偏高,请注意!",
noticeType: 1
},
{
id: 3,
time: "2023-09-03",
text: "青岛滨海新区海底隧道左洞-硫化氢含量监测-硫化氢含量高于报警,请注意!",
noticeType: 1
},
{
id: 4,
time: "2023-09-02",
text: "青岛滨海新区海底隧道左洞-氢气含量监测-氢气含量偏高,请注意!",
noticeType: 0
},
{
id: 5,
time: "2023-09-01",
text: "青岛滨海新区海底隧道左洞-氢气含量监测-氢气含量偏高,请注意!",
noticeType: 0
},
{
id: 6,
time: "2023-08-29",
text: "青岛滨海新区海底隧道左洞-氢气含量监测-氢气含量偏高,请注意!",
noticeType: 0
},
{
id: 7,
time: "2023-08-28",
text: "青岛滨海新区海底隧道左洞-氢气含量监测-氢气含量偏高,请注意!",
noticeType: 0
},
{
id: 8,
time: "2023-08-27",
text: "青岛滨海新区海底隧道左洞-氢气含量监测-氢气含量偏高,请注意!",
noticeType: 0
}
]);
function openDialog(item: any) {
currentIndex.value = item.id;
showDialog.value = true;
}
function closeDialog() {
showDialog.value = false;
console.log("点击");
}
</script>
<style scoped lang="scss">
.item-dialog {
width: 50%;
height: 270%;
padding: 2%;
right: -45%;
top: 7%;
z-index: 10;
font-size: 12px;
opacity: 0.8;
background-color: #000000;
position: absolute;
.dialog-title {
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
padding-bottom: 2%;
}
.dialog-time {
margin-top: 4%;
width: 100%;
text-align: right;
}
.dialog-text {
margin-top: 5%;
letter-spacing: 0.5px;
}
.triangle {
position: absolute;
width: 0;
height: 0;
left: -4%;
top: 5%;
border-top: 8px solid transparent;
border-bottom: 8px solid transparent;
border-right: 12px solid #000000;
}
}
.gas-top-left {
width: 100%;
height: 100%;
position: relative;
.notice-list {
width: 100%;
height: 100%;
.notice-box {
width: 100%;
height: 98%;
padding-top: 1%;
.notice-item {
position: relative;
width: 90%;
height: 10%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 3%;
margin-top: 1%;
margin-left: 3%;
font-size: 14px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
color: #ffffff;
background: url("@/assets/images/toxicGasMonitor/gasBg.png") no-repeat;
background-size: 100% 100%;
.notice-type-big {
width: 3%;
height: 40%;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid rgba(236, 98, 102, 0.4);
div {
width: 47%;
height: 50%;
box-sizing: border-box;
padding: 10%;
}
}
.notice-type-small {
width: 3%;
height: 40%;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid rgba(238, 169, 89, 0.4);
div {
width: 47%;
height: 50%;
box-sizing: border-box;
padding: 10%;
}
}
.notice-text {
width: 75%;
cursor: pointer;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; //
}
.notice-time {
cursor: pointer;
}
}
}
}
}
</style>

View File

@ -0,0 +1,292 @@
<template>
<Card title="硫化氢含量监测">
<div class="gas-top-right">
<div class="hydrogen-content">
<div class="select-right">
<el-select v-model="selectDay" style="width: 85%" size="small">
<el-option v-for="(item, index) in dayList" :key="index" :label="item.dayType" :value="item.value" />
</el-select>
</div>
<div id="hydrogenSulfide" ref="hydrogenSulfide" style="width: 100%; height: 100%"></div>
</div>
</div>
</Card>
</template>
<script lang="ts" setup>
import Card from "@/components/card.vue";
import symbolIcon2 from "@/assets/images/toxicGasMonitor/lineIcon2.png";
import { onMounted, reactive, ref, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
// import { getSelectDataListApi } from "@/api/modules/distribution";
// import Card from "@/components/card.vue";
import { GlobalStore } from "@/stores";
import mitts from "@/utils/bus"; //
const store = GlobalStore();
// x
let twenty_four_time = ref([
"00:00",
"02:00",
"04:00",
"06:00",
"08:00",
"10:00",
"12:00",
"14:00",
"16:00",
"18:00",
"20:00",
"22:00",
"24:00"
] as any);
// Y
let unit = ref("Ppm" as any);
// Y
let yData1 = ref([3, 3, 5, 4, 2, 4.5, 5, 2, 4.5, 5, 3.8, 2.9, 2.5] as any);
//
let option = ref(null as any);
//
let selectDay = ref(1);
//
// let nowType = ref("");
let dayList = ref([
{
value: 1,
dayType: "全部"
},
{
value: 2,
dayType: "本周"
},
{
value: 3,
dayType: "本月"
},
{
value: 4,
dayType: "本年"
}
]);
function initOption() {
option.value = {
// backgroundColor: '#071c3a',
title: {
// text: '',
textStyle: {
align: "center",
color: "#fff",
fontSize: 20
},
top: "2%",
left: "center"
},
tooltip: {
trigger: "axis",
backgroundColor: "rgba(0, 0, 0, 0.9)",
borderColor: "#010306",
textStyle: {
color: "#FFFFFF"
},
axisPointer: {
lineStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: "rgba(0, 255, 233,0)"
},
{
offset: 0.5,
color: "rgba(255, 255, 255,1)"
},
{
offset: 1,
color: "rgba(0, 255, 233,0)"
}
],
global: false
}
}
}
// formatter: function (params) {
// // console.log("tooltip", params);
// return (
// params[0].name +
// "<br/>" +
// params[0].marker +
// " " +
// params[0].seriesName +
// ": " +
// params[0].value +
// "<br/>" +
// params[1].marker +
// " " +
// params[1].seriesName +
// ": " +
// params[1].value
// );
// }
},
grid: {
top: "20%",
left: "10%",
right: "8%",
bottom: "12%"
// containLabel: true
},
xAxis: [
{
type: "category",
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
splitArea: {
// show: true,
color: "#f00",
lineStyle: {
color: "#f00"
}
},
axisLabel: {
color: "#fff"
},
splitLine: {
show: false
},
boundaryGap: false,
data: twenty_four_time.value
}
],
yAxis: [
{
name: unit.value,
nameGap: 30,
nameTextStyle: {
align: "right", // Y
verticalAlign: "middle", // Y
padding: [0, 15, 0, 0], //
color: "#fff",
nameLocation: "start"
},
type: "value",
min: 0,
// max: 140,
splitNumber: 3,
splitLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLabel: {
show: true,
margin: 20,
textStyle: {
color: "#fff"
}
},
axisTick: {
show: true
}
}
],
series: [
{
showAllSymbol: true,
symbol: `image://${symbolIcon2}`,
// symbol: "circle",
symbolSize: 8,
smooth: true, //
name: "青岛滨海新区海底隧道左洞-硫化氢含量监测",
type: "line",
color: "#4AC0F3",
data: yData1.value
}
]
};
}
function drawChart() {
initOption();
// console.log("", yData.value);
let hydrogenSulfide = echarts.init(document.getElementById("hydrogenSulfide"));
hydrogenSulfide.setOption(option.value);
}
//-24
// function generateTimes() {
// let timeArrays = new Array(24).fill("");
// timeArrays.forEach((item, index) => (timeArrays[index] = (index < 10 ? "0" + index : index) + ":00"));
// return timeArrays;
// }
onMounted(async () => {
drawChart();
});
// 线miits.on 7.14 by CJP
onBeforeUnmount(async () => {
mitts.off("devSn");
});
</script>
<style lang="scss" scoped>
.gas-top-right {
width: 100%;
height: 100%;
.title {
height: 10%;
line-height: 33px;
text-align: left;
font-size: calc(100vw * 18 / 1920);
color: #ffffff;
background: url("@/assets/images/titleBig.webp") no-repeat;
background-size: 100% 100%;
i {
font-family: OPPOSansH;
margin-left: 6%;
}
}
.hydrogen-content {
height: 100%;
background: url("@/assets/images/cardImg.png") no-repeat;
background-size: 100% 100%;
position: relative;
.select-right {
position: absolute;
right: 0%;
width: 20%;
top: 5%;
z-index: 9;
}
}
}
:deep(.el-input__wrapper) {
background: #112d59;
padding-left: 10%;
}
:deep(.el-input__inner) {
color: #fff;
}
:deep(.el-select .el-input .el-select__caret) {
color: #fff;
}
</style>