diff --git a/src/app/pages/today-warning-admin/today-warning-admin.component.ts b/src/app/pages/today-warning-admin/today-warning-admin.component.ts
index 5635a5a..2b72f1f 100644
--- a/src/app/pages/today-warning-admin/today-warning-admin.component.ts
+++ b/src/app/pages/today-warning-admin/today-warning-admin.component.ts
@@ -15,7 +15,7 @@ import { NavChangeService } from '../../service/navChange.service';
import 'linqjs';
import { DispositionComponent } from '../disposition/disposition.component';
import { NzMessageService } from 'ng-zorro-antd/message';
-
+import { listRefreshService } from '../../service/listRefresh.service';
@Component({
selector: 'app-today-warning-admin',
templateUrl: './today-warning-admin.component.html',
@@ -24,8 +24,8 @@ import { NzMessageService } from 'ng-zorro-antd/message';
export class TodayWarningAdminComponent implements OnInit {
validateForm!: FormGroup;
- constructor(private http: HttpClient, private fb: FormBuilder, private router: Router, private toTree: TreeService, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private navChangeService: NavChangeService, private message: NzMessageService) { }
- isSpin:boolean = false
+ constructor(private listRefreshService: listRefreshService, private http: HttpClient, private fb: FormBuilder, private router: Router, private toTree: TreeService, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private navChangeService: NavChangeService, private message: NzMessageService) { }
+ isSpin: boolean = false
ngOnInit(): void {
this.validateForm = this.fb.group({
level: [null],
@@ -40,11 +40,25 @@ export class TodayWarningAdminComponent implements OnInit {
this.warningType()
this.isSpin = true
this.getAllOrganization()
+
+ this.listRefreshService.getMessage().subscribe((message: any) => {
+ // console.log('需要更新列表了', message);//send a message
+ this.getEarlyWarningList()
+ // let params = {
+ // id: message.notification.entityId
+ // }
+ // this.http.get('/api/services/app/ViolateRecord/Get', {
+ // params: params
+ // }).subscribe((data: any) => {
+ // this.list.unshift(data.result)
+ // console.log('新获取一条', data.result)
+ // })
+ });
}
//预警类型接口
warningTypes: any //预警接口数据
- warningTypesDetailsMetadata:any
+ warningTypesDetailsMetadata: any
warningTypesDetails: any
warningType() {
this.http.get('/api/services/app/Violation/GetAllList').subscribe((data: any) => {
@@ -55,7 +69,7 @@ export class TodayWarningAdminComponent implements OnInit {
}
typeChange(e) {
// console.log(e)
- if(!e){
+ if (!e) {
this.warningTypesDetails = this.warningTypesDetailsMetadata
}
this.warningTypes.forEach(element => {
@@ -196,7 +210,7 @@ export class TodayWarningAdminComponent implements OnInit {
},
nzFooter: null,
nzOnOk: async () => {
- console.log(99999,instance.content)
+ console.log(99999, instance.content)
}
});
const instance = modal.getContentComponent();
diff --git a/src/app/pages/today-warning/today-warning.component.ts b/src/app/pages/today-warning/today-warning.component.ts
index 5f4e570..c5b086e 100644
--- a/src/app/pages/today-warning/today-warning.component.ts
+++ b/src/app/pages/today-warning/today-warning.component.ts
@@ -10,6 +10,7 @@ import { NavChangeService } from '../../service/navChange.service';
import * as moment from 'moment';
import { DispositionComponent } from '../disposition/disposition.component';
import { NzMessageService } from 'ng-zorro-antd/message';
+import { listRefreshService } from '../../service/listRefresh.service';
@Component({
selector: 'app-today-warning',
templateUrl: './today-warning.component.html',
@@ -17,7 +18,7 @@ import { NzMessageService } from 'ng-zorro-antd/message';
})
export class TodayWarningComponent implements OnInit {
validateForm!: FormGroup;
- constructor(private http: HttpClient, private fb: FormBuilder, private toTree: TreeService, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private navChangeService: NavChangeService, private message: NzMessageService) { }
+ constructor(private listRefreshService: listRefreshService, private http: HttpClient, private fb: FormBuilder, private toTree: TreeService, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private navChangeService: NavChangeService, private message: NzMessageService) { }
ngOnInit(): void {
this.validateForm = this.fb.group({
@@ -30,6 +31,19 @@ export class TodayWarningComponent implements OnInit {
});
this.warningType()
this.getEarlyWarningList()
+ this.listRefreshService.getMessage().subscribe((message: any) => {
+ // console.log('需要更新列表了', message);//send a message
+ this.getEarlyWarningList()
+ // let params = {
+ // id: message.notification.entityId
+ // }
+ // this.http.get('/api/services/app/ViolateRecord/Get', {
+ // params: params
+ // }).subscribe((data: any) => {
+ // this.list.unshift(data.result)
+ // console.log('新获取一条', data.result)
+ // })
+ });
}
//预警类型接口
@@ -54,7 +68,7 @@ export class TodayWarningComponent implements OnInit {
list: any = [
]
totalCount: string //预警总数
- isSpin:boolean = false
+ isSpin: boolean = false
getEarlyWarningList() {
let ViolationIds = []
if (this.validateForm.value.type) {
diff --git a/src/app/pages/warning-statistics-list/warning-statistics-list.component.html b/src/app/pages/warning-statistics-list/warning-statistics-list.component.html
new file mode 100644
index 0000000..9463535
--- /dev/null
+++ b/src/app/pages/warning-statistics-list/warning-statistics-list.component.html
@@ -0,0 +1,185 @@
+
+
+
+
+

+
+
+ 预警类型统计
+ 卸油统计
+ 证照预警统计
+
+
+
+

+
+
+
+
+
+
+
+ 证照预警统计
+
+
+
返回
+
+
+
+
+
+
+
+
+ 近30天证照预警走势
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 油站名称
+
+
+ 公司名称
+
+
+ 区域
+
+
+ 卸油开始时间
+
+
+ 卸油结束时间
+
+
+ 操作前准备预警节点数量
+
+
+ 操作中准备预警节点数量
+
+
+ 全流程准备预警节点数量
+
+
+ 状态
+
+
+ 操作
+
+
+
+
+
+
+ {{item.gasStation.stationName}}
+
+
+ {{item.gasStation.companyName}}
+
+
+ {{item.gasStation.locationName}}
+
+
+ {{item.startTime ? (item.startTime | date:"yyyy-MM-dd HH:mm:ss") : '/'}}
+
+
+ {{item.endTime ? (item.endTime | date:"yyyy-MM-dd HH:mm:ss") : '/'}}
+
+
+ {{item.proccessBeforeCount}}
+
+
+ {{item.proccessingCount}}
+
+
+ {{item.allProccessCount}}
+
+
+
+ 合规
+
+
+ 预警
+
+
+
+ 查看
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/app/pages/warning-statistics-list/warning-statistics-list.component.scss b/src/app/pages/warning-statistics-list/warning-statistics-list.component.scss
new file mode 100644
index 0000000..833bcf1
--- /dev/null
+++ b/src/app/pages/warning-statistics-list/warning-statistics-list.component.scss
@@ -0,0 +1,615 @@
+.recordsbox {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.search {
+ box-sizing: border-box;
+ padding: 0 36px;
+ width: 100%;
+ height: 32px;
+ margin-bottom: 16px;
+
+ form {
+ width: 100%;
+ height: 32px;
+ display: flex;
+ justify-content: flex-start;
+
+ .searchParams,
+ .btn {
+ margin: 0 3px;
+ }
+
+ .searchParams {
+ // flex: 10;
+ width: 150px;
+
+ }
+
+ .searchParamsLong {
+ width: 250px;
+ }
+
+ .searchParams2 {
+ width: 220px;
+ }
+
+ .btn {
+ // flex: 1;
+ }
+
+ nz-select {
+ color: rgba(145, 204, 255, 0.95);
+ }
+
+ nz-tree-select {
+ color: rgba(145, 204, 255, 0.95);
+ }
+
+ nz-range-picker {
+ background-color: rgba(0, 0, 0, 0);
+ width: 100%;
+ }
+
+ }
+
+
+}
+
+.content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .title {
+ margin: 13px 0;
+ width: 100%;
+ height: 64px;
+ box-sizing: border-box;
+ padding: 0 28px;
+ position: relative;
+
+ .titlebox {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+
+ img {
+ width: 65px;
+ height: 65px;
+ }
+
+ .content {
+ flex: 1;
+ height: 48px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ // background-image: linear-gradient(to right, #002147, #033565, #064e8e, #064e8e, #033565, #002147);
+ background: linear-gradient(270deg, rgba(35, 153, 255, 0) 0%, rgba(35, 153, 255, 0.32) 50%, rgba(35, 153, 255, 0) 100%);
+
+ .contentitem {
+ width: 100%;
+ height: 32px;
+ display: flex;
+ align-items: center;
+ // background-image: linear-gradient(to right, #002147, #0f5ca0, #1c88e6, #1c88e6, #0f5ca0, #002147);
+ background: linear-gradient(270deg, rgba(35, 153, 255, 0) 0%, rgba(35, 153, 255, 0.8) 50%, rgba(35, 153, 255, 0) 100%);
+
+ span {
+ margin-left: 10px;
+ color: #bce0ff;
+ font-size: 20px;
+ font-family: titlefont;
+ cursor: pointer;
+ }
+
+ span:nth-child(1) {
+ margin-left: 12px;
+ }
+
+ .grey {
+ color: #68829F;
+ }
+ }
+
+ }
+ }
+
+ .packup {
+ position: absolute;
+ right: 33px;
+ top: 16px;
+ cursor: pointer;
+ }
+ }
+
+ .chartsbox {
+ width: 100%;
+ display: flex;
+ justify-content: center;
+
+ .chartname {
+ position: absolute;
+ left: 20px;
+ top: 12px;
+ }
+
+ .chart {
+ width: 97%;
+ height: 350px;
+ box-sizing: border-box;
+ padding: 0 10px;
+ display: flex;
+
+ div {
+ display: flex;
+ flex-direction: column;
+
+ span {
+ font-family: titlefont;
+ display: flex;
+ align-items: center;
+ height: 28px;
+ color: #bee1ff;
+ font-size: 16px;
+ }
+
+ div {
+ flex: 1;
+ }
+ }
+
+ .leftbox {
+ width: 360px;
+ position: relative;
+ border: 0px;
+ box-shadow: 0 0 26px 0px #1a7fd7 inset;
+ margin-right: 16px;
+
+ .centerContent {
+ position: absolute;
+ top: 34%;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 170px;
+
+ div {
+ text-align: center;
+ }
+
+ .numname {
+ // font-family: titlefont;
+ color: #bee1ff;
+ }
+
+ .num {
+ color: #FFFFFF;
+ font-size: 38px;
+ text-shadow: 0px 0px 16px #3A9AFF;
+ font-weight: bold;
+ height: 46px;
+ line-height: 46px;
+ }
+ }
+
+ .goback {
+ position: absolute;
+ right: 20px;
+ top: 14px;
+ color: #C4E2FC;
+ font-family: synormal;
+ font-size: 14px;
+ z-index: 999;
+ cursor: pointer;
+ }
+ }
+
+ .rightbox {
+ flex: 1;
+ position: relative;
+ border: 0px;
+ box-shadow: 0 0 26px 0px #1a7fd7 inset;
+
+ .btnbox {
+ position: absolute;
+ right: 28px;
+ top: 12px;
+ display: flex;
+ flex-direction: row;
+ z-index: 999;
+
+ button {
+ border: 1px solid #91CCFF;
+ color: #91CCFF;
+ border-radius: 0px;
+ box-shadow: 0 0 5px 0 #2399FF inset;
+ background: none;
+ }
+
+ .rankingBtn {
+ margin-right: 16px;
+ }
+
+ .selectedbtn {
+ background: linear-gradient(180deg, #000D21 0%, #001331 27%, #2399FF 100%);
+ color: white;
+ }
+ }
+ }
+ }
+ }
+
+ .tablebox {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ overflow: hidden;
+
+ .table {
+ color: white;
+ flex: 1;
+ width: 96%;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .th {
+ height: 38px;
+ line-height: 38px;
+ background: rgba(35, 153, 255, 0.2);
+ border: 1px solid rgba(35, 217, 255, 0.4);
+ box-shadow: 0 0 3px 0 rgba(35, 217, 255, 0.4) inset;
+ color: #23D9FF;
+ }
+
+ .tbody {
+ flex: 1;
+ overflow-y: auto;
+
+ .tr {
+ height: 38px;
+ line-height: 38px;
+ border-bottom: 1px solid #0d3761;
+
+ div {
+
+ color: #91CCFF;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ .look {
+ color: #36A2FF;
+ cursor: pointer;
+ }
+ }
+ }
+ }
+ }
+
+ .pagination {
+ margin: 15px 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ ::-webkit-scrollbar {
+ width: 0px;
+ }
+
+ }
+}
+
+
+// 适配125%
+@media screen and (max-height: 750px) {
+ .search {
+ box-sizing: border-box;
+ padding: 0 30px;
+ height: 32px;
+ margin-bottom: 12px;
+
+ form {
+ width: 100%;
+ height: 32px;
+ }
+ }
+
+ .content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ .title {
+ height: 42px;
+ padding: 0 20px;
+ margin: 8px 0;
+
+ .titlebox {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+
+ img {
+ width: 46px;
+ height: 46px;
+ }
+
+ .content {
+ height: 36px;
+
+ .contentitem {
+ width: 100%;
+ height: 25px;
+
+ span {
+ margin-left: 6px;
+ font-size: 16px;
+ }
+
+ span:nth-child(1) {
+ margin-left: 8px;
+ }
+ }
+
+ }
+ }
+
+ .packup {
+ position: absolute;
+ right: 33px;
+ top: 4px;
+ cursor: pointer;
+ }
+ }
+
+ .chartsbox {
+ width: 100%;
+ height: 43%;
+
+ .chartname {
+ position: absolute;
+ left: 20px;
+ top: 12px;
+ }
+
+ .chart {
+ width: 97%;
+ height: 100%;
+
+ div {
+ span {
+ font-size: 14px;
+ }
+
+ div {
+ flex: 1;
+ }
+
+ }
+
+ .leftbox {
+ width: 300px;
+ box-shadow: 0 0 20px 0px #1a7fd7 inset;
+ margin-right: 12px;
+
+ .centerContent {
+ .num {
+ color: #FFFFFF;
+ font-size: 42px;
+ text-shadow: 0px 0px 16px #3A9AFF;
+ font-weight: bold;
+ height: 49px;
+ line-height: 50px;
+ }
+ }
+ }
+
+ .rightbox {
+ flex: 1;
+ position: relative;
+ border: 0px;
+ box-shadow: 0 0 26px 0px #1a7fd7 inset;
+
+ .btnbox {
+ position: absolute;
+ right: 28px;
+ top: 12px;
+ display: flex;
+ flex-direction: row;
+ z-index: 999;
+
+ .rankingBtn {
+ margin-right: 12px;
+ }
+ }
+ }
+ }
+ }
+
+ .tablebox {
+ .table {
+ .th {
+ height: 32px;
+ line-height: 32px;
+ font-size: 12px !important;
+ }
+
+ .tbody {
+
+ .tr {
+ height: 32px;
+ line-height: 32px;
+
+ div {
+ font-size: 12px !important;
+ }
+
+ img {
+ width: 32px;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+// 适配150%
+@media screen and (max-height: 600px) {
+ .search {
+ box-sizing: border-box;
+ padding: 0 22px;
+ height: 32px;
+ margin-bottom: 6px;
+
+ form {
+ width: 100%;
+ height: 32px;
+ }
+ }
+
+ .content {
+ .title {
+ height: 36px;
+ padding: 0 20px;
+ margin: 3px 0;
+
+ .titlebox {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+
+ img {
+ width: 36px;
+ height: 36px;
+ }
+
+ .content {
+ height: 30px;
+
+ .contentitem {
+ width: 100%;
+ height: 22px;
+
+ span {
+ margin-left: 6px;
+ font-size: 13px;
+ }
+
+ span:nth-child(1) {
+ margin-left: 12px;
+ }
+ }
+
+ }
+ }
+
+ .packup {
+ position: absolute;
+ right: 33px;
+ top: 2px;
+ cursor: pointer;
+ }
+ }
+
+ .chartsbox {
+ width: 100%;
+ height: 40%;
+
+ .chartname {
+ position: absolute;
+ left: 20px;
+ top: 12px;
+ }
+
+ .chart {
+ width: 97%;
+ height: 100%;
+
+ div {
+ span {
+ font-size: 14px;
+ }
+
+ div {
+ flex: 1;
+ }
+
+ }
+
+ .leftbox {
+ width: 260px;
+ box-shadow: 0 0 20px 0px #1a7fd7 inset;
+ margin-right: 8px;
+
+ .centerContent {
+ .num {
+ color: #FFFFFF;
+ font-size: 32px;
+ text-shadow: 0px 0px 12px #3A9AFF;
+ font-weight: bold;
+ height: 42px;
+ line-height: 42px;
+ }
+ }
+ }
+
+ .rightbox {
+ box-shadow: 0 0 22px 0px #1a7fd7 inset;
+
+ .btnbox {
+ position: absolute;
+ right: 28px;
+ top: 12px;
+ display: flex;
+ flex-direction: row;
+ z-index: 999;
+
+ .rankingBtn {
+ margin-right: 8px;
+ }
+ }
+ }
+ }
+ }
+
+ .tablebox {
+ .table {
+ .th {
+ height: 28px;
+ line-height: 28px;
+ font-size: 10px !important;
+ }
+
+ .tbody {
+
+ .tr {
+ height: 28px;
+ line-height: 28px;
+
+ div {
+ font-size: 10px !important;
+ }
+
+ img {
+ width: 30px;
+ }
+ }
+ }
+ }
+
+ }
+ }
+}
diff --git a/src/app/pages/warning-statistics-list/warning-statistics-list.component.ts b/src/app/pages/warning-statistics-list/warning-statistics-list.component.ts
new file mode 100644
index 0000000..289d99b
--- /dev/null
+++ b/src/app/pages/warning-statistics-list/warning-statistics-list.component.ts
@@ -0,0 +1,704 @@
+import { HttpClient } from '@angular/common/http';
+import { Component, OnInit, ViewContainerRef, ElementRef } from '@angular/core';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
+import * as echarts from 'echarts';
+import { NzModalService } from 'ng-zorro-antd/modal';
+import { GetOutOfLineDetailsComponent } from '../today-warning/get-out-of-line-details/get-out-of-line-details.component';
+import * as moment from 'moment';
+import { fromEvent } from 'rxjs';
+import { debounceTime } from 'rxjs/operators';
+import { Router } from '@angular/router';
+import { OilUnloadingProcessComponent } from '../oil-unloading-process/oil-unloading-process.component';
+import { TreeService } from 'src/app/service/tree.service';
+
+@Component({
+ selector: 'app-warning-statistics-list',
+ templateUrl: './warning-statistics-list.component.html',
+ styleUrls: ['./warning-statistics-list.component.scss']
+})
+export class WarningStatisticsListComponent implements OnInit {
+
+ validateForm!: FormGroup;
+ constructor(private toTree: TreeService, private http: HttpClient, private fb: FormBuilder, private router: Router, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private element: ElementRef) { }
+
+ myChart: any //左侧饼图
+ mybarChart: any //柱状图
+
+
+ getThirtyDays() {
+ //获取当前日期
+ let myDate = new Date();
+ var nowY = myDate.getFullYear();
+ var nowM = myDate.getMonth() + 1;
+ var nowD = myDate.getDate();
+ var enddateStr = nowY + "-" + (nowM < 10 ? "0" + nowM : nowM) + "-" + (nowD < 10 ? "0" + nowD : nowD);//当前日期
+ var enddate = new Date(enddateStr);
+
+
+ //获取三十天前日期
+ var lw = new Date(new Date().getTime() - 1000 * 60 * 60 * 24 * 30);//最后一个数字30可改,30天的意思
+ var lastY = lw.getFullYear();
+ var lastM = lw.getMonth() + 1;
+ var lastD = lw.getDate();
+ var startdateStr = lastY + "-" + (lastM < 10 ? "0" + lastM : lastM) + "-" + (lastD < 10 ? "0" + lastD : lastD);//三十天之前日期
+ var startDate = new Date(startdateStr);
+
+ const dateList = []
+ while (true) {
+ startDate.setDate(startDate.getDate() + 1)
+ if (startDate.getTime() <= enddate.getTime()) {
+ if (startDate.getDate() < 10) {
+ // startDate.getFullYear() 获取年,此处没加上年份
+ dateList.push((startDate.getMonth() + 1) + '.0' + startDate.getDate())
+ } else {
+ dateList.push((startDate.getMonth() + 1) + '.' + startDate.getDate())
+ }
+ } else {
+ break
+ }
+ }
+ return dateList;
+ }
+
+ isEcharts: boolean = true
+ isEchartsShow() {
+ this.isEcharts = !this.isEcharts
+ }
+ startdate
+ enddate
+
+ isOrShow: boolean
+ ngOnInit(): void {
+ //当前日期
+ let myDate: any = new Date();
+ let nowY = myDate.getFullYear();
+ let nowM = myDate.getMonth() + 1;
+ let nowD = myDate.getDate();
+ this.enddate = nowY + "-" + (nowM < 10 ? "0" + nowM : nowM) + "-" + (nowD < 10 ? "0" + nowD : nowD);//当前日期
+ //获取三十天前日期
+ let lw = new Date(myDate - 1000 * 60 * 60 * 24 * 30);//最后一个数字30可改,30天的意思
+ let lastY = lw.getFullYear();
+ let lastM = lw.getMonth() + 1;
+ let lastD = lw.getDate();
+ this.startdate = lastY + "-" + (lastM < 10 ? "0" + lastM : lastM) + "-" + (lastD < 10 ? "0" + lastD : lastD);//三十天之前日期
+ this.validateForm = this.fb.group({
+ // state: [null],
+ organization: [null],
+ datePicker: [[this.startdate, this.enddate]]
+ });
+ // 饼图
+ this.myChart = echarts.init(document.getElementById('piechart'));
+ //柱状折线图
+ this.mybarChart = echarts.init(document.getElementById('barchart'));
+ this.tableSpin = true
+ this.getAllOrganization()
+ this.getAggregations()
+ if (this.router.url.indexOf('petrolStation') != -1) {
+ this.isOrShow = false
+ } else {
+ this.isOrShow = true
+ }
+ }
+ //刷新饼图图表数据
+ num
+ echartsData: any
+ //一级饼图
+ oilchartpieOption = {
+ color: ['#FF4B65', '#36A2FF'],
+ tooltip: {
+ trigger: 'item'//触发类型
+ },
+ legend: {
+ bottom: '12%',
+ left: 'center',
+ itemGap: 40,
+ itemWidth: 8,
+ itemHeight: 8,
+ formatter: (name) => {
+ let data = this.oilchartpieOptionPieData1
+ let value
+ for (var i = 0, l = data.length; i < l; i++) {
+ if (data[i].name == name) {
+ value = data[i].value;
+ }
+ }
+ return '{a|' + name + '}' + '{b|' + value + '}';
+ },
+ textStyle: {
+ color: '#fff',
+ rich: {
+ a: {
+ width: 80
+ }
+ }
+ }
+ },
+ series: [
+ {
+ type: 'pie',
+ radius: ['50%', '60%'],
+ bottom: '10%',
+ avoidLabelOverlap: false,//防止标签重叠策略
+ label: {//每一个标签外网延伸的引导说明
+ show: false,
+ position: 'outside'
+ },
+ data: [],
+ tooltip: {//鼠标移入提示
+ position: 'right',
+ padding: [14, 19],
+ backgroundColor: 'rgba(28, 129, 218, 0.4)',
+ textStyle: {
+ color: '#fff',
+ fontSize: 12
+ }
+ }
+ }
+ ]
+ };
+ oilchartpieOptionPieData1: any
+ //一级柱状图
+ oilchartbarOption = {
+ xAxis: {
+ type: 'category',
+ data: [],
+ axisLine: {
+ show: false,
+ lineStyle: {
+ color: '#91CCFF'
+ }
+ },
+ axisTick: {//刻度线
+ show: false
+ },
+ inverse: true
+ },
+ yAxis: {
+ type: 'value',
+ nameTextStyle: {
+ color: '#C4E2FC'
+ },
+ splitLine: {//分割线
+ lineStyle: {
+ color: ['#0f4374'],
+ width: 2
+ }
+ },
+ axisTick: {//刻度线
+ show: false
+ },
+ axisLine: {//轴线
+ show: false,
+ lineStyle: {
+ color: '#C4E2FC'
+ }
+ }
+ },
+ tooltip: {
+ // trigger: 'axis'
+ },
+ series: [
+ {
+ name: '证照预警事件',
+ data: [],
+ type: 'bar',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [{
+ offset: 0, color: '#23F0FF' // 0% 处的颜色
+ }, {
+ offset: 1, color: 'rgba(35, 153, 255, 0.1)' // 100% 处的颜色
+ }],
+ global: false // 缺省为 false
+ }
+ },
+ barWidth: '25%'
+ },
+ {
+ name: '证照预警事件',
+ data: [],
+ type: 'line',
+ symbol: 'circle',
+ symbolSize: 8,
+ label: {
+ show: true
+ },
+ itemStyle: {
+ color: '#fff',
+ shadowColor: '#fff',
+ shadowBlur: 10
+ },
+ lineStyle: {
+ color: '#FFCC8A',
+ width: 1
+ }
+ }
+ ],
+ legend: {
+ data: ['证照预警事件'],
+ textStyle: {
+ color: '#fff'
+ },
+ right: 28,
+ top: 18,
+ itemWidth: 8,
+ itemHeight: 8,
+ },
+ grid: {
+ left: '42px',
+ right: '30px',
+ bottom: '38px',
+ top: '80px'
+ }
+ };
+
+ //二级饼图
+ oilchartpieOption2 = {
+ color: ['#36A2FF', '#FFBD4B', '#46DFFF'],
+ tooltip: {
+ trigger: 'item'//触发类型
+ },
+ legend: {
+ bottom: '8%',
+ left: 'center',
+ itemGap: 10,
+ itemWidth: 8,
+ itemHeight: 8,
+ formatter: (name) => {
+ let data = this.oilchartpieOptionPieData2
+ let value
+ for (var i = 0, l = data.length; i < l; i++) {
+ if (data[i].name == name) {
+ value = data[i].value;
+ }
+ }
+ return '{a|' + name + '}' + '{b|' + value + '}';
+ },
+ textStyle: {
+ color: '#fff',
+ rich: {
+ a: {
+ width: 60
+ }
+ }
+ }
+ },
+ series: [
+ {
+ type: 'pie',
+ radius: ['50%', '60%'],
+ bottom: '10%',
+ avoidLabelOverlap: false,//防止标签重叠策略
+ label: {//每二个标签外网延伸的引导说明
+ show: false,
+ position: 'outside'
+ },
+ data: [],
+ tooltip: {//鼠标移入提示
+ position: 'right',
+ padding: [14, 19],
+ backgroundColor: 'rgba(28, 129, 218, 0.4)',
+ textStyle: {
+ color: '#fff',
+ fontSize: 12
+ }
+ }
+ }
+ ]
+ };
+ oilchartpieOptionPieData2: any
+ //二级柱状图
+ oilchartbarOption2 = {
+ tooltip: {
+ // trigger: 'axis'
+ },
+ xAxis: {
+ type: 'category',
+ data: [],
+ axisLine: {
+ show: false,
+ lineStyle: {
+ color: '#91CCFF'
+ }
+ },
+ axisTick: {//刻度线
+ show: false
+ },
+ inverse: true
+
+ },
+ yAxis: {
+ type: 'value',
+ nameTextStyle: {
+ color: '#C4E2FC'
+ },
+ splitLine: {//分割线
+ lineStyle: {
+ color: ['#0f4374'],
+ width: 2
+ }
+ },
+ axisTick: {//刻度线
+ show: false
+ },
+ axisLine: {//轴线
+ show: false,
+ lineStyle: {
+ color: '#C4E2FC'
+ }
+ }
+ },
+ legend: {
+ data: ['事前准备', '事中操作', '全程监测'],
+ textStyle: {
+ color: '#fff'
+ },
+ right: 18,
+ top: 18,
+ itemWidth: 8,
+ itemHeight: 8,
+ },
+ series: [
+ {
+ name: '',
+ data: [],
+ type: 'bar',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [{
+ offset: 0, color: 'rgba(54, 162, 255, 1)' // 0% 处的颜色
+ }, {
+ offset: 1, color: 'rgba(54, 162, 255, 0.1)' // 100% 处的颜色
+ }],
+ global: false // 缺省为 false
+ }
+ },
+ barWidth: '25%'
+ },
+ {
+ name: '',
+ data: [],
+ type: 'bar',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [{
+ offset: 0, color: 'rgba(255, 189, 75, 1)' // 0% 处的颜色
+ }, {
+ offset: 1, color: 'rgba(255, 189, 75, 0.1)' // 100% 处的颜色
+ }],
+ global: false // 缺省为 false
+ }
+ },
+ barWidth: '25%'
+ },
+ {
+ name: '',
+ data: [],
+ type: 'bar',
+ itemStyle: {
+ color: {
+ type: 'linear',
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [{
+ offset: 0, color: 'rgba(70, 223, 255, 1)' // 0% 处的颜色
+ }, {
+ offset: 1, color: 'rgba(70, 223, 255, 0.1)' // 100% 处的颜色
+ }],
+ global: false // 缺省为 false
+ }
+ },
+ barWidth: '25%'
+ }
+ ],
+ grid: {
+ left: '42px',
+ right: '30px',
+ bottom: '38px',
+ top: '80px'
+ }
+ };
+ isgoback: boolean = false
+ refreshEchartsData1(data) {
+ this.num = data.totalCount
+ //饼图
+ this.oilchartpieOptionPieData1 = [
+ { name: '消防器材预警', value: data.notCorrectCount },
+ { name: '证照预警', value: data.correctCount },
+ ]
+ this.oilchartpieOption.series[0].data = this.oilchartpieOptionPieData1
+ this.myChart.setOption(this.oilchartpieOption);
+ this.myChart.off('legendselectchanged')
+ this.myChart.off('click')
+ this.myChart.on('legendselectchanged', (params) => {
+ this.myChart.setOption({
+ legend: { selected: { [params.name]: true } }
+ })
+ if (params.name == '预警事件') {
+ this.isgoback = true
+ this.refreshEchartsData2(this.echartsData)
+ this.validateForm.patchValue({
+ state: '0'
+ });
+ this.list = []
+ this.SkipCount = '0'
+ this.getViolateRecordList()
+ }
+ });
+ this.myChart.on('click', (params) => {
+ if (params.name == '预警事件') {
+ this.isgoback = true
+ this.refreshEchartsData2(this.echartsData)
+ this.validateForm.patchValue({
+ state: '0'
+ });
+ this.list = []
+ this.SkipCount = '0'
+ this.getViolateRecordList()
+ }
+ });
+
+ //柱状图
+ let monthArr = []
+ let valuedata = []
+ data.list.forEach(element => {
+ monthArr.push(moment(element.key).format('MM.DD'))
+ valuedata.push(element.totalCount)
+ });
+ this.oilchartbarOption.xAxis.data = monthArr
+ this.oilchartbarOption.series[0].data = valuedata
+ this.oilchartbarOption.series[1].data = valuedata
+ this.mybarChart.setOption(this.oilchartbarOption);
+ }
+ refreshEchartsData2(data) {
+ this.num = Number(data.proccessBeforeCount + data.proccessingCount + data.allProccessCount)
+ //饼图
+ this.oilchartpieOptionPieData2 = [
+ { name: '事前准备', value: data.proccessBeforeCount },
+ { name: '事中操作', value: data.proccessingCount },
+ { name: '全程检测', value: data.allProccessCount }
+ ]
+ this.oilchartpieOption2.series[0].data = this.oilchartpieOptionPieData2
+ this.myChart.setOption(this.oilchartpieOption2);
+
+ //柱状图
+ let monthArr = []
+ let valuedataBefore = []
+ let valuedataIng = []
+ let valuedataAll = []
+ data.list.forEach(element => {
+ monthArr.push(moment(element.key).format('MM.DD'))
+ valuedataBefore.push(element.proccessBeforeCount)
+ valuedataIng.push(element.proccessingCount)
+ valuedataAll.push(element.allProccessCount)
+ });
+ this.oilchartbarOption2.xAxis.data = monthArr
+ this.oilchartbarOption2.series[0].name = '事前准备'
+ this.oilchartbarOption2.series[0].data = valuedataBefore
+ this.oilchartbarOption2.series[1].name = '事中操作'
+ this.oilchartbarOption2.series[1].data = valuedataIng
+ this.oilchartbarOption2.series[2].name = '全程监测'
+ this.oilchartbarOption2.series[2].data = valuedataAll
+ this.mybarChart.setOption(this.oilchartbarOption2);
+ }
+ goback() {
+ this.isgoback = false
+ this.myChart.clear();
+ this.mybarChart.clear();
+ this.refreshEchartsData1(this.echartsData)
+ this.validateForm.patchValue({
+ state: null
+ });
+ this.list = []
+ this.SkipCount = '0'
+ this.getViolateRecordList()
+ }
+
+
+
+ defaultOrId: string
+ //获取所有组织机构
+ nodes: any = []
+ getAllOrganization() {
+ let OrganizationUnitId = sessionStorage.getItem('isGasStation') == 'true' ? JSON.parse(sessionStorage.getItem('userdataOfgasstation')).organization.id : JSON.parse(sessionStorage.getItem('userdata')).organization.id
+ let params = {
+ OrganizationUnitId: OrganizationUnitId,
+ IsContainsChildren: "true"
+ }
+ this.http.get('/api/services/app/Organization/GetAll', {
+ params: params
+ }).subscribe((data: any) => {
+ data.result.items.forEach(element => {
+ if (element.id == OrganizationUnitId) {
+ element.parentId = null
+ }
+ element.key = element.id
+ element.title = element.displayName
+ });
+ this.nodes = [...this.toTree.toTree(data.result.items)]
+ this.defaultOrId = JSON.parse(sessionStorage.getItem('userdata')).organization.id
+ this.validateForm.value.organization = JSON.parse(sessionStorage.getItem('userdata')).organization.id
+ this.validateForm.patchValue({
+ datePicker: [this.startdate, this.enddate]
+ });
+ this.list = []
+ this.SkipCount = '0'
+ this.getViolateRecordList()
+ })
+ }
+ //获取统计信息
+ chartsSpin: boolean = false
+ getAggregations() {
+ this.chartsSpin = true
+ let organizationUnitId
+ if (this.router.url.indexOf('petrolStation') != -1) {
+ organizationUnitId = JSON.parse(sessionStorage.getItem('userdataOfgasstation')).organization.id
+ } else {
+ organizationUnitId = JSON.parse(sessionStorage.getItem('userdata')).organization.id
+ }
+ let params: any = {
+ OrganizationUnitId: organizationUnitId,
+ IsContainsChildren: 'true'
+ }
+ this.http.get('/api/services/app/OilUnloadingProcess/GetAllCountByDays', { params: params }).subscribe((data: any) => {
+ console.log('统计信息', data)
+ this.chartsSpin = false
+ this.echartsData = data.result
+ this.refreshEchartsData1(this.echartsData)
+ // this.refreshBarLineData(this.echartsData)
+ })
+ }
+
+ //获得卸油记录列表
+ SkipCount: string = '0'
+ MaxResultCount: string = '50'
+ list: any = []
+ totalCount: string
+ tableSpin: boolean = false
+ getViolateRecordList() {
+ this.tableSpin = true
+ let organizationUnitId
+ if (this.router.url.indexOf('petrolStation') != -1) {
+ organizationUnitId = JSON.parse(sessionStorage.getItem('userdataOfgasstation')).organization.id
+ } else {
+ organizationUnitId = this.validateForm.value.organization
+ }
+ let IsCorrect = null
+ if (this.validateForm.value.state) {
+ this.validateForm.value.state == '0' ? IsCorrect = 'false' : IsCorrect = 'true'
+ }
+ let params = {
+ IsCorrect: IsCorrect,
+ StartTime: moment(this.validateForm.value.datePicker[0]).format('yyyy-MM-DD'),
+ EndTime: moment(this.validateForm.value.datePicker[1]).format('yyyy-MM-DD'),
+ IsContainsChildren: 'true',
+ OrganizationUnitId: organizationUnitId,
+ SkipCount: this.SkipCount,
+ MaxResultCount: this.MaxResultCount
+ }
+ this.http.get('/api/services/app/OilUnloadingProcess/GetAll', {
+ params: params
+ }).subscribe((data: any) => {
+ this.tableSpin = false
+ this.list = this.list.concat(data.result.items);
+ this.list = [...this.list]
+ this.totalCount = data.result.totalCount
+ console.log('获取卸油流程列表', data.result.items)
+ })
+ }
+ submitForm(): void {
+ for (const i in this.validateForm.controls) {
+ this.validateForm.controls[i].markAsDirty();
+ this.validateForm.controls[i].updateValueAndValidity();
+ }
+
+ this.list = []
+ this.SkipCount = '0'
+ this.getViolateRecordList()
+ }
+ resetForm(e: MouseEvent): void {
+ e.preventDefault();
+ this.validateForm.reset();
+ for (const key in this.validateForm.controls) {
+ this.validateForm.controls[key].markAsPristine();
+ this.validateForm.controls[key].updateValueAndValidity();
+ }
+ console.log(JSON.parse(sessionStorage.getItem('userdata')).organization.id)
+ // this.validateForm.value.organization = JSON.parse(sessionStorage.getItem('userdata')).organization.id
+ this.validateForm.patchValue({
+ organization: JSON.parse(sessionStorage.getItem('userdata')).organization.id,
+ datePicker: [this.startdate, this.enddate]
+ });
+ this.list = []
+ this.SkipCount = '0'
+ this.getViolateRecordList()
+ }
+ ngAfterViewInit(): void {
+ fromEvent(this.element.nativeElement.querySelector(`#tbody`) as HTMLCanvasElement, 'scroll').pipe(debounceTime(100)).subscribe((event: any) => { //监听 DOM 滚动事件
+ if (event.target.scrollHeight - (event.target.scrollTop + event.target.clientHeight) <= 10) {
+ if (this.totalCount > this.list.length) {
+ console.log('需要加载数据了', event)
+ this.SkipCount = String(Number(this.SkipCount) + 50)
+ this.getViolateRecordList()
+ }
+
+ }
+ });
+ }
+ look(item) {
+ const modal = this.modal.create({
+ nzContent: OilUnloadingProcessComponent,
+ nzViewContainerRef: this.viewContainerRef,
+ nzWidth: 1000,
+ nzBodyStyle: {
+ 'border': '1px solid #6d9cc7',
+ 'border-radius': '0px',
+ 'padding': '0px',
+ 'box-shadow': '0 0 8px 0 #fff',
+ 'background': '#000D21',
+ },
+ nzComponentParams: {
+ data: item
+ },
+ nzFooter: null,
+ nzOnOk: async () => {
+
+ }
+ });
+ const instance = modal.getContentComponent();
+
+ }
+ goOilList() {
+ if (this.router.url.indexOf('petrolStation') != -1) {
+ this.router.navigate(['/records/petrolStation/oliunloadinglist'])
+ } else {
+ this.router.navigate(['/records/oliunloadinglist'])
+ }
+
+ }
+ gorecordList() {
+ if (this.router.url.indexOf('petrolStation') != -1) {
+ this.router.navigate(['/records/petrolStation'])
+ } else {
+ this.router.navigate(['/records'])
+ }
+ }
+
+}
diff --git a/src/app/service/listRefresh.service.ts b/src/app/service/listRefresh.service.ts
new file mode 100644
index 0000000..62f2c46
--- /dev/null
+++ b/src/app/service/listRefresh.service.ts
@@ -0,0 +1,22 @@
+import { Injectable } from '@angular/core';
+import { Observable, ReplaySubject } from 'rxjs';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class listRefreshService {
+
+ constructor() { }
+ private _sendMessage: ReplaySubject
= new ReplaySubject(1);
+ /** * 向其他组件发送信息 **
+ * @param message 需要发送的信息 *
+ * @returns {Observavle} */
+
+ public sendMessage(message: any) {
+ this._sendMessage.next(message);
+ }
+
+ public getMessage(): Observable {
+ return this._sendMessage.asObservable();
+ }
+}
diff --git a/src/assets/images/cameraNum.png b/src/assets/images/cameraNum.png
index de5883cae83f1912e6059a792bbb4d68f5aa0e18..7a0531f3b326319108b85441295245bc41010e9f 100644
GIT binary patch
literal 2134
zcmV-c2&wmpP){b8&>hV@Tk
zrNcxt76e0zRyH(XYH2@iWGijJBD&WtlthOg&@zBLJKYM#y1-1+LtrMpW(Y9>x!b9(
zuFtvgE`U5Ul?Ckp=Tt+l+AZ>H!R=Jv*lmKe0P^(Tt%8(Z&8DooUK=y67yW&1qlRS~
zlNvytno0_#lm~N7i^#6#Bg%x}M2Z?4#|(gfbOYRO+bf#P)$m`HduZ7sS>ma2cuXqV
zYH8S*Q;8i~YdM};xUXoD=;y*!vhhT>q*%1~<92DNBF!^9JJ@y%~1y!n@x+1j{I{QGUzY|o7DCX=zQ#X;P*N0?vg3d$02#}xnr?WPLkw8+Xs9VzE3>Q3lu0@bk
zDaj^mGa+sB#p>DSHOT7Qi#I^~$WJ_aMt>+;9y^F9k^nKTIhbcRyOM3bb_Uf0*p#-Z
zs_nFDldIbtN7cAE&?IJ;Vm(8XLjEPbdODg7G8#FnH+5to6_CuY(AIqWs|QAq=hQFz&zR>4hsq+pXaz9=WxRYoJFW$Ftx*%
zLC!;9g6#-OYJt@|A3Dui+)V9su-V%rlt$TggKZL;SSlEMO{$_bFmDob9l+eJx=k7=
zLdZ*;|H@!6Yyk!a4S<~g8bH}_GGU+B3i*85CV1wr@_pj(K8%Xk`#$KS*2l+;^$X67R?<8{hc-qMm03!nz_#G$Ow3#r|Zp`v@RZBMre+XYYq
zdGuW{skIQGt~E7KEQ>5{f7{i_Dg&s2>^~%5kj>%i?izvEgVslmcI+AR%IgczvdjJh
zC^i$aE=%K+#10|jaZF+LLrp{WDE-3SFJL7J2IX3*k9O=U17=G3A5T_nJqFJ@j{pDw
M07*qoM6N<$g3Dw5WB>pF
literal 2009
zcmV;~2PXK5P)oFB
zedtToDz=bHC4@X_O094kyD6C57>}Lc5R=Xj0xl)NHX$L7J?E?T8G9}sJ9hS*iEsPK
z(wyUS)^C4%t+m%)hq#R)=@~dq3&;il0RX|)PidFed;>0ZdLL
zz-1%x%2XxvW8M1ZxztbwKsRp&p{WEwv&L7^&=}}%W^JwU7x_^Fz@7PtYw6Wz{EWRC
z!}_|$VkMLUxPCRcYGgm3c7=X!+#H(uIS)YB#t(or-hTBDshxFqA25cx0QA*p1F|%;
zzslDAJaZ|Gp-zot{a6mbmsdIf?p^&;Uu>Z|x#{a|IRIZ=9$hoDpZA9t?c7Rx8@}CAEbW)=uJph{4rUKAQeg1J0pvSv9r9fYl_4oB?bR-Np
zF@O&*KgjB*u3VDGFP4I@F3kG+l3kdtd~^UiOrm3{
z9WeFjg~|X>5#GDi7-BW_-wRRDr~yl&25Mxu0sxBez6Y$0&-;dvbOSK8Bx;~OId2I-
zhxyHIrcUVD&?m!DKzCFP)W_%S00@8Jw;nXk%+sNfp$25p0rHL{XVj(l>;M26)NKf{
zzVVh-S6e!|^j;Lg0kFEhf%@o-EdaBRjAPTLNYx;WrUSTo&Fod4u?4x%ebmLl3IG@e
zrr3xGzr8cQ(8Fwh*TsPr$XynmM+)l0RAm72u3T|Q5jKXZvn0~V0DL|ZDLhpJl}XwI
zkj4SV0fj+s$sJF@K&YM?(n(Xl@JtQVf8MnRK!(^Da_j86aJo=bmE!REs;dUc6E#p5
zPT2w&<9Bw|7q4rjlR-FH^I~S}n^VKqUDZ>=2d7#@vFASL3nf47(EAM~IRG&N_8t&@>
z>=GyHd|xF1dUHJjk}LOZKPr*CjOU*G%4~a|&snV))@^9_I#THT+tyVr>ixIu0GQbS
zz>hmzBPXu+gD_Dbj@pfLt0C){gk}qb3~GE4uhgLPZ?!=~qCVZf`295NYUG7|NPBz6DSQsEKg<A;4|bsc2AVd+Y#wFI)g{Hc?*i
zq+0pi<~c*4JA2pNl2}d+VhnZ8f@;X!MnTZq`h!O5+o>L7vlh_N%6jVJuz@-LXw*#=_i2{IuH`+j_AoorF
zmKkH+S-YAwaXJ8_iXBgu80h}~WwziOjFFrDc{OM#(SRu$D0eSS&0Q0k~1fQO%25P$}|!*G0wGB0HetWktJ_LQn2nFzo)QIt27-PsPO
zHdY32;HcRyTOIIH{oQr|f_rY=VrPuu4I};eJv9}Bv!PrK$?ov%!bBbE0T2{HI4+Zk%TWn!dccLSWMgCIQ#h199P+X2}1
z%L0Ithbsq=(|QK-Mfgam8fIj#(?|A0PIQsVT2z8Wos8Q7c%-EWK$piSzl_1}bL|BdCBdb>
zh-yw1_@3>c-Tw_mg_C*7Hs
ztmaeHOa1$=D^|W0qjB5h{`G?S2FNOpuJ{F(`X5NSP^R7&Oc~3%w!YMMSUq1DXVY&2
z(*Qb6ZGWwGi*~YU?{u?t;!wa%L#uH5YBf96zA1O6*}Vu3g?;28q9{*ks0nS38@3
zTlioi58=%}o78g|wzOK9IR7mv?*3iAHMsPfA+r>+H&^dcFw(E7b)`SUr~I?ISN{|Q
zot{+}6@+of7v@iYKmTWQ1%GfTfSWfAgw?SegcNG;3K!4(yb35@Iy(AC<0#D0(@M<|
z#!VHPPdztp8}GuE-NeBFZurfCgegI-6cFPO;<#%n%I1CcA5WK6VE=ir1@M^zis1C_
rZ@Day6wIe^ZUM#V;nVvT-Ielx=Ls{f>w7jW00000NkvXXu0mjfMt$11
diff --git a/src/assets/images/fireNum.png b/src/assets/images/fireNum.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6092191aa4f7f916028009c88af30a48690183e
GIT binary patch
literal 1982
zcmV;v2SNCWP)Gt-kZuSNLbTf-
zAPE|Zj|dtgMuX%Rudq`M-ZMY1#qB4D&3+uhv2}EznGv
zp(#sa!~WU>i>jwlqxL#AmIILgz7i850dOuwmC`)}1x4x3+jULq0QvIeh@fx>zLpho))M=@M{u@^%F8nbz(0GTQm!*t(K1grTe{75
z*w-iNuJRc1uh8BI?lQ>I6xwZWHd&Tf{WYo}{_T$jSn7IPbp=71sx7Jd&{E=`f0xcU
zv&4LCu;R86U-|{)LXHS!Nank4ajmbCDk^$(Pw46@6C*|;8lf>mJI{vB5NCdpwl|ce
z6CfI>;_i0mOStP&H2^k&*v1Xz%ZV@k*bmTRQRgh_gkMZOi#8F?0$4?6AOO&2L~ytX
zyoQ+9Wbq*0FZ)1$#1}Gv;GleiPWuDuV(&@xqJ1rmt;o^X^|Zu4bkzzCF{PlUi=2v^}c6|C=
z1Hi3Uk&pP)*0BnYQaD@1gO`u^^HcpSs$%Rc;xy^OU;rNbsuAo76ICJy
zeH4h(Cyhu(y|Xygj1LB2`lP8rb-9R-eCc3OpHqb#XbmJYd4eZEPN&O6_Es5dM(`lU
zGn5hGzBa0<@tj`xvlE5}2Rl{Siq4mx_|O-sEZPlW5?GCEr^yrB^QivNu_gEoz{$Pd
z1903(Qzka&wK;sO8skt6fHBlzqW52jKRK%AgMHa@iWbns!J{%u06=?)yG>Ccw7o*m
zOj9Qza>*~c=KDgIRosX8<8-bD-6@Ovy{>wiUgNzwzAp_8h_ubc#2?)M1#G446eTp7A!p)S)JrpY+ilicT)~
z1gI(>e{@hOlA&3TdIPlj)wDRxehehzp`AUS+H85)B%bj$zYh;2;G1=LrkmzWjd%`%s(ie2pSK1Fxz|ARrh5b2xevlqot~LpM4v_NRUj6vi{|(m
zzn6-^5L&!qKH_byh7aa#xY&_~v7B+edInoA
zn41UC9;&Ua@VQU~_K9$mGPH0`!Id}Owi^krnN29}g%EG~K+Om3;YYCj)VzWKi*X{}
zvJ3qLmCz6W{SUf)%fSY$tN9kck7$AH0W-&OQMEiNDpsIi@1Sdd5g#gK~)XYICXe8)%j>&)z}jD7G|;x${9
ze2`vT=ozZ{0p`_4Sw4PkbG`St*OOiol;q34QP+UVM2bH51X>by51WH*P<*@&)01=OAu1*_pMzc4jz7wy{VE%5$F|fT}z%23p1LuUc0Z5GG
QbN~PV07*qoM6N<$f>k}ZX8-^I
literal 0
HcmV?d00001
diff --git a/src/assets/images/licenseNum.png b/src/assets/images/licenseNum.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e1a1352f8364904881e6305f113c2355f9d02e8
GIT binary patch
literal 1921
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
literal 2151
zcmV-t2$=VYP){BDqX9Pruu|lN1;op<-3^M@j8UvY0h0S7WYinH
zCje$vuWn$5Xvdg%Tkx4N|A8Kicv-_104DPgikRslbN34;hX_WZMDxxEY5>*ur
zumLPFYik9}b!)V5buwgi;64lv66I_F7uPri;CQQoy1ak-$R3K>0Nz+-a~B7`dh?XK
zeJ@4n!WxfSjPqSSn}LR}5XR{5D>tP1SAeBy?tPvm;In}ccKJgLWaw}2@!WQ&yv)cG
zkW_9$601;)7IdQR55kfn(_i0X-sXu+TMG0$_fgjQ-q%)GQ!L2ZysfJdy}Eq>(&SS7
zwG|!~2zTzI*$NB+!P^Le{(LQD3t(g-g!rfXtD6u}a(x4nhKxLpbn7$Xk%n7PJMb(#yyP3h(3&@5p3t^txN5@wjy
zjcYg!MjX_F;`Z*LXEOIJA+R*<9@uZ9DF8OGiFNf+hUmLXPfw3S(uC2H>gMn{Np
zf6TM25}|C==!K8~fMMLTzqI3$_J?I2R@nCGW;sX3BIx%HR0HD+`S5nCG@TE}0st6C
z9RMmI&I$ZsY>N$XF5RV-CeD&rAydgk%A~4+#JR#xV~7P7qcRDFU+OQv5u#imNzn
z0r_M5Dfv5bfv^DlCKrwcNDTNwwCVzW{Qtbk>V|^TEWr{`D>8mycwbkJR2f_`+Nd;#^eP8G!H8=M8>mW0!aNY919Th9si&|7pOOe
zii~sbhUfyn3;_TGc@Sb>jnb4K-}f4WQ^qe$9tGP0bH5*Xt@NRvz1vX>$crEMDM*e-
z8=uKJ2k9{ed&hV(THP_8Gg&QIc5swm$3W0i|Lqun^jZY*35ViOo2)sNs5dj4V_;;c
z2QlX}ZW)s%t9=`YcPcZaC)xzSKw1)*3CC>xCQeP!vZGD#hO$x0>k-^Ns~26sHn~Q0Zm>BW&sSmMU2sj1J!M=3<~S^QM%V|Pxk!A
zL<0~4#+I>xb7gq7tQaZuZUw>Xawhy1wu@Fechh%dRyg9IkHLUd
z4UrKk*cUPyZGAmu1l5C#fB+IM02O6)lQk;1N?D8yD~Rikcp?3CN8ohA2qGh>9`xOJ
zf?2@#ZmzX}Ewg!CJW>V_R1bP^DVPO3da$ttQ~<;!aak?Z1Ibkn
zY*&Vq%^oWQ2&xBt^WVV${P>VR0N=P&eR25brLlEnjCl*;U!pUZ1@%o=0csnovI{~!%akh~qJRkso1T&_&7xC1=
z(jH%CO<68weAWOAUowCU_aL@K2H7=&K#h*K2S8>cOTa|xR`2T1eTy86FtVwSR+FLo
z7x_3@NNygJF>;bAK69ATURu~PEaaT;*dim4`T%|9Uu{`{^R=_ZUX1^$Ji}h&`SKzU
zk!72z9k|?0E-WB|@#hZLUT1aoYbK*r4)n#&0Vutjps)7h?35!wj+(6QSw@0N<*cTS
zf#li%47ZHEr32Q@`ocQ5cL;l{iu
z$-tOh*82QK&Jp=5XYGiY>%bu7s@_XSNVNfc?&1x3TQvQrBjwA|!wam!vLm;zqGkss
z;QES?lw5%}J6OIhFQfU)o8cWnUteuK-)_8eo8yCtN|#Ulv-3H@PE%gi{=a;THb3~R
z`DSQnfz_U(o!jq9SCA9ujR>^)!Ro>7me1yf-rymHAg4FG4MN^x4A0-*;Ip}kxr!z5
zIwV63bl$ep%pQ{R_F~vM^OZ3+{B-u?7wlq&oYZusHQ1Ld7|DO!QU9h&(~qaM1y=VK
zkYqqI#;yP%iW4xk+J|`7;qP9S*%W~Dq1!IlS5<~dKASJq_;-qnybdX<0P`TszIlhg
dt2v_E{{gj%-E@I(T5$jX002ovPDHLkV1j7A^Zoz;
diff --git a/src/assets/images/stationNum.png b/src/assets/images/stationNum.png
index a20a680e9c9082e2799b9a67f6cd4f9070356586..d8c2c34522f6ea4d23a1203920cf365bd0a08ca2 100644
GIT binary patch
literal 2179
zcmV-}2z>X6P)C
zzT98$!GZ&jBZR4UQc4HX!GH*<$7KL>$4L{e)bbk=U^oavSnIC=`ubh>$K0fOj04aV
zfLEfd8uGRPlxGw$m9?gT(MyoGuCRc%TPaHd_~$>2Gu9&1&51cXQ={-4g4d0`iTVwY
z34niGVbvH62z9jEOun5{Qgch8WKsaUc$pP};s~Qq%RFUHn3Jh_TwT56$It-*@VCF1
z9~T!oI*@dZW0a2rZR@RLX)PTDdo)V=Qyhvt6y)J~+)aw<`61Q-Mct5~*UrrK4*@d1
zjwA#z(nwDav35LNm0&R697-m6c@ofnkwvgUW`>f-A;RWpIP*R9#P3MRtn}N{D|_aW
zZ`Y6g%9sOktIJKc0cn$A;PzAGgHilbU`ZXaJx565akt)*2A+a1@RK-c!2IKKm2A)>
zzt|Xb$~BV>JX|t?R$9}ck^X=90;>j?fS#x~m)u5uk&Dbz7!{jWmDaJSgs8rsbq1ZP
z1c%Uo>Y{GyL^Bl{DLCV~z6m5%o@oR?w-bKhpFg)qMgfQAWsKy}n
zLGwlSwG?=
zr2Cv2gE309G96&|AoIaynpAgq`W^fUd32v=A)Hhgwuqt7!?#n-su__%RvBlcoipuN
zk7h_hXxCXa24Ndo*+SZCS4yKyhCw?&0^E4k#O2
z>^!Z;AXm|H9bo4f2~d^6^1DrdSU-fb1cRI*>vb!W-=1OIChJw!qaCNz7=(>zvvh!X
z)&~KU8JsEHhCDg|5JD$0XuWO)c%YwEx?Civq%q-sH3nl)QLR|2D4rDnRd$p!R8edK
z#2hIMTCdvy#t8|ktVe?<)fmL&34p;907%st)b23>?mwAogP5}zn>b(v$Nvw4L70RZ
zgZq9`W01v(Hv4|b;64se-3Etd-$y-$@K`^EK>%!?eJ|zOk#y`k4uDjV!M(@T801c7
zjt&qz>iIiLO6`JVI(MTv^wa}p9K`x&98C6#zIc?h&M7gO+yj6J{%Q>FKBmTCEJn1s
zC6d8h9J`N#L07UDwb~fsZ0PC9GA?p}$fVS4aMw{a26-IJCBRPs5V9wEQM;F%J6YQ7
zt|L-KmAq)+uo{D0MQdyf1|rPEkg{cB6cV1ob19A^a745!d3+m}&O6pTC;{SL;bfG&
z=#C%N801do*(u2?y5omo+8)xj!t)-=T!nnxC*mA$fK9SyHh4||)UT^C_)(u4gFFt-
zw*kZ)+~W-w55vz*8NSSFi{Q0E0g`T{WCl}sE&)(E4z?WvgDM?r#6dg24|*9dQq9Jd
z^L*j?Q&R!9K)nmyWZDZ;DKDbMf%*KHZ=qppcuoLp1H&Q?s>r*&Cj*0+R4+!&cLY$;
z1>R&8Kx+I4TV*LbzOCFT~w*a8X
zadkN`E&yU=&gl)XAZnzsta&Ln8`oYOj>%PDQc4tOwDGT>6*g0DP-c
zuLrYikcsCveWTVFjUkh1%ppLmFRKZtXnnZ^xT#aOLESv+XP5xdn~|A}-F(uV(+wTE
z7d09;2L0*IQPJlT;F|ylX)9pt;bk)X~(e!ChnM>+jUxJIEGASwU#>u*Mv!_g){exs>U!_=|Fr&2+VC0rDM%7-L_wSd^y01@LH?~u2}gE>ZoL%kRjx<
zrEk~hALDV5ivz40=~3WDutjv=Yqr){KBqJ?hZh5^7L2s0WD28=K`>YM-aLm7VhxbB
zpNLPI{Yc5w-i2R-xHgQ<4S~5@|1%jrX-pJ=}3hj(p_UM0Q{=co2vg_B8l
zJl}?INef6dKvv?OBK(bxjE9k4XxIR9V&2bbcLHW$`WGmmOLY-(L|Om<002ovPDHLk
FV1l(j0a^e6
literal 1977
zcmV;q2S)gbP)8+TBSXM$7!qN##CT1;5B#6~Zh>)yJ
zCf>CTv0$_}#ZcVajZQYvW)r1IZ@n$FyI(o?rN5Wnm*4N){baX2fBw#M&Uv2Cd7ktB
z6SznuYm-StChC(uwvhTCmT2+%yeQkwEX$O(X?|L;+B9z-r)s@KI2uS7VPH%tKV
z=f4alljzLEc&QB^H09M8;qxJU+S#(2_A;38K!Z;0^qm5
z7=s)%BfC4}oJte%V~>#PtoS&9U;bbt1nZsFQ`T}s({V>hqp~3dU~nG;G78oE`8EVvW@!1xS`4g$@R-jA5Sm)cy`1LD#*MC#N=qUoID({t&8OnpP_0@5C7Zlmv4Mv#P>
zt&Ta6?a7Xx^Z-;4RkKelz31)5Y#(I32sUNDcg;CL!daRAVfz302Q6{{y+L{h^#II0
zQHq`===9W%L57k@?L;%<6uNjQ>Z)fL`}*xaGm=cEK$Pqa^3{)e0M0wf01z8ukYkAH
z7z`pIhodTMU~G^f(g2X55I^r^WBsna#fItUzEnt*G&V@j4|)LRonip!*~<{brnDOx
zM0nn*qGBKU>LO5m;VIUwtdjry2ddRvHe}qinv#{z_UZwcf2tLL*=^lw;e!=GuDZ-J
z_WD2F!*&rpPmoXc=mEI+Gy}l4y*b?01qBg=7i2sjUtMMyd)1}1FWm!r02T%e0Nwqi
zhrq(BbO_|FiwI|BaksXAt
z9rEsOJphYm834BQGvFJAI#LU`82i#wydZw%Oi^q7RNAteA)jd>WUH@v@hn-Ls|{T{
zfR*?A!p_`WS&=ZqczIiH^E+
zCN6DNxi`LHqXtE{uxbEEC0G!rGpkwK|qHdfErna37jE$j1
zY^PQ#1eVS*061;e-k7|yLl3~RIk^G2s4u$AWI!w*zxG9($z~&emn0`!AEHy5#Hl{JN
z@a8zx*+P&+-STQ_S9veS7^E13qY8oL)doOaJES$H2Vh0DH?zQ|m}MapU12iPrfZ?R
zV(`cFWz&~>0B%0tI{-+g4_B0%-*Udu%Vu2*f<0IL>w2Y|+QIJ(LN
zz@}@VJjV=VVZ-zC6d)s}OkXBRv53Td
zaPL9`fLT`+0{QY>0eGZa55Ss*-T^R&z#0<(o37CUd5#!%;l|Yiqm#@Nl;^1n#Rb
zJiw-F$J!cWH>qofZ0OPhaKAbR^&maeX$^sOVFSR1PPP!Km+FZzpuRC|T$t+GArE%y
z0eB$n9f0u=AfgXk=4{8PYlp1=Ko3CE<=y~je4iouG8e5xylIj3Rydc_HFna^B!+by
zQr2yyI*%`Ygk`H;J)_^SNS@GXv{0FKTd8h(>&In?=4lmZGP}FEyfS|Oer&XqajsOa
ztbLDN_Twh!<;z=AO{KEtU8Ek)w<)uL
z7BXrq6u5(5X~)m1ro0fCW1oBq<2B)D`$`F6&Fm6Oe>@eBgSC?8+biKjB{ZQpQjC
zjke&H_NLcT17m}fsW*@q0nog8Y5rI3MfdcPHu?`6Lo52A
zq5#ao*T2Gu5b7vIU0nLb$wP?$!OcnZiXcHEuHFy5x-5O6>LmRK`J|J`tj{2Y00000
LNkvXXu0mjf>{qgv