From 8815d4805385f887b8e8118036a5ee7703dbb4de Mon Sep 17 00:00:00 2001 From: SHAOJIAHAO <55341701@qq.com> Date: Mon, 14 Feb 2022 16:11:18 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E5=A2=9E]=E4=BB=8A=E6=97=A5=E9=A2=84?= =?UTF-8?q?=E8=AD=A6=E5=AE=9E=E6=97=B6=E6=9B=B4=E6=96=B0;=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E5=AE=8C=E5=96=84;=E6=B2=B9=E7=AB=99=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=A1=AB=E5=86=99=E5=AE=8C=E5=96=84;=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=AF=81=E7=85=A7=E9=A2=84=E8=AD=A6=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=88=86=E6=9E=90=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../criminal-records-admin.component.html | 1 + .../criminal-records-admin.component.ts | 4 +- .../criminal-records.component.html | 1 + .../criminal-records.component.ts | 3 + .../pages/home-page/home-page.component.html | 16 +- .../pages/home-page/home-page.component.scss | 36 +- src/app/pages/home/home.component.html | 4 +- src/app/pages/home/home.component.ts | 10 +- .../oil-station-info.component.html | 188 ++--- .../oil-station-info.component.scss | 53 +- .../oil-station-info.component.ts | 187 ++--- .../oil-unloading-process-list.component.html | 1 + .../oil-unloading-process-list.component.ts | 20 +- .../oil-unloading-process.component.html | 4 - src/app/pages/pages-routing.module.ts | 9 +- src/app/pages/pages.module.ts | 3 +- .../today-warning-admin.component.html | 38 +- .../today-warning-admin.component.ts | 26 +- .../today-warning/today-warning.component.ts | 18 +- .../warning-statistics-list.component.html | 185 +++++ .../warning-statistics-list.component.scss | 615 +++++++++++++++ .../warning-statistics-list.component.ts | 704 ++++++++++++++++++ src/app/service/listRefresh.service.ts | 22 + src/assets/images/cameraNum.png | Bin 2009 -> 2134 bytes src/assets/images/fireNum.png | Bin 0 -> 1982 bytes src/assets/images/licenseNum.png | Bin 0 -> 1921 bytes src/assets/images/modelNum.png | Bin 2151 -> 2318 bytes src/assets/images/stationNum.png | Bin 1977 -> 2179 bytes 28 files changed, 1846 insertions(+), 302 deletions(-) create mode 100644 src/app/pages/warning-statistics-list/warning-statistics-list.component.html create mode 100644 src/app/pages/warning-statistics-list/warning-statistics-list.component.scss create mode 100644 src/app/pages/warning-statistics-list/warning-statistics-list.component.ts create mode 100644 src/app/service/listRefresh.service.ts create mode 100644 src/assets/images/fireNum.png create mode 100644 src/assets/images/licenseNum.png diff --git a/src/app/pages/criminal-records-admin/criminal-records-admin.component.html b/src/app/pages/criminal-records-admin/criminal-records-admin.component.html index 6fcb830..7bb32b7 100644 --- a/src/app/pages/criminal-records-admin/criminal-records-admin.component.html +++ b/src/app/pages/criminal-records-admin/criminal-records-admin.component.html @@ -9,6 +9,7 @@
预警类型统计 卸油统计 +
diff --git a/src/app/pages/criminal-records-admin/criminal-records-admin.component.ts b/src/app/pages/criminal-records-admin/criminal-records-admin.component.ts index ecf28a9..f1ecf8e 100644 --- a/src/app/pages/criminal-records-admin/criminal-records-admin.component.ts +++ b/src/app/pages/criminal-records-admin/criminal-records-admin.component.ts @@ -657,7 +657,9 @@ export class CriminalRecordsAdminComponent implements OnInit { goOilList() { this.router.navigate(['/records/oliunloadinglist']) } - + goWarningList(){ + this.router.navigate(['/records/warningstatisticslist']) + } dispose(item) { console.log(item) diff --git a/src/app/pages/criminal-records/criminal-records.component.html b/src/app/pages/criminal-records/criminal-records.component.html index fab3faa..02bf4d6 100644 --- a/src/app/pages/criminal-records/criminal-records.component.html +++ b/src/app/pages/criminal-records/criminal-records.component.html @@ -8,6 +8,7 @@
预警类型统计 卸油统计 +
diff --git a/src/app/pages/criminal-records/criminal-records.component.ts b/src/app/pages/criminal-records/criminal-records.component.ts index 046983f..5f9ec6d 100644 --- a/src/app/pages/criminal-records/criminal-records.component.ts +++ b/src/app/pages/criminal-records/criminal-records.component.ts @@ -564,6 +564,9 @@ export class CriminalRecordsComponent implements OnInit { goOilList() { this.router.navigate(['/records/petrolStation/oliunloadinglist']) } + goWarningList(){ + this.router.navigate(['/records/petrolStation/warningstatisticslist']) + } dispose(item) { console.log(item) const modal = this.modal.create({ diff --git a/src/app/pages/home-page/home-page.component.html b/src/app/pages/home-page/home-page.component.html index a8cdc9d..cf84eef 100644 --- a/src/app/pages/home-page/home-page.component.html +++ b/src/app/pages/home-page/home-page.component.html @@ -125,7 +125,7 @@ {{key + 1}} - {{item.companyName}} {{item.stationName}} + {{item.companyName}} {{item.stationName}}
@@ -195,6 +195,20 @@ 摄像头(个)
+
+ +
+ {{HomeAggregatioData.dev.cameraCount}} + 证照预警数量 +
+
+
+ +
+ {{HomeAggregatioData.dev.cameraCount}} + 消防设备预警数量 +
+
diff --git a/src/app/pages/home-page/home-page.component.scss b/src/app/pages/home-page/home-page.component.scss index 3908710..aa31ff3 100644 --- a/src/app/pages/home-page/home-page.component.scss +++ b/src/app/pages/home-page/home-page.component.scss @@ -331,7 +331,7 @@ border: 0; .warningnum { - width: 70px; + width: 170px; position: absolute; left: 50%; transform: translateX(-50%); @@ -400,13 +400,13 @@ padding: 12px 0; .numlistbox { - height: 64px; + height: 56px; width: 61%; display: flex; img { - width: 64px; - height: 64px; + width: 56px; + height: 56px; margin-right: 24px; } @@ -420,10 +420,10 @@ } .lightspan { - font-size: 36px; + font-size: 30px; font-weight: 600; - line-height: 36px; - margin-bottom: 8px; + line-height: 30px; + margin-bottom: 5px; } .lightspan1 { @@ -821,7 +821,7 @@ flex: .8; .warningnum { - width: 70px; + width: 170px; position: absolute; left: 50%; transform: translateX(-50%); @@ -872,22 +872,22 @@ padding: 12px 0; .numlistbox { - height: 64px; + height: 46px; width: 70%; display: flex; align-items: center; img { - width: 49px; - height: 49px; + width: 40px; + height: 40px; margin-right: 16px; } .content { .lightspan { - font-size: 23px; - line-height: 23px; - margin-bottom: 4px; + font-size: 20px; + line-height: 20px; + margin-bottom: 0px; } .lightspan1 { @@ -1163,7 +1163,7 @@ flex: .8; .warningnum { - width: 70px; + width: 170px; position: absolute; left: 50%; transform: translateX(-50%); @@ -1214,14 +1214,14 @@ padding: 8px 0; .numlistbox { - height: 60px; + height:40px; width: 80%; display: flex; align-items: center; img { - width: 36px; - height: 36px; + width: 30px; + height: 30px; margin-right: 12px; } diff --git a/src/app/pages/home/home.component.html b/src/app/pages/home/home.component.html index 0f8f6b9..2e0d2a0 100644 --- a/src/app/pages/home/home.component.html +++ b/src/app/pages/home/home.component.html @@ -13,7 +13,7 @@
  • 数字油站
  • -
  • +
  • 今日预警
  • @@ -24,7 +24,7 @@
  • 数字油站
  • -
  • +
  • 今日预警
  • diff --git a/src/app/pages/home/home.component.ts b/src/app/pages/home/home.component.ts index 9562364..53ec7fc 100644 --- a/src/app/pages/home/home.component.ts +++ b/src/app/pages/home/home.component.ts @@ -11,6 +11,7 @@ import { GetOutOfLineDetailsComponent } from '../today-warning/get-out-of-line-d import { NzModalService } from 'ng-zorro-antd/modal'; import { HttpClient } from '@angular/common/http'; import { ChangePasswordComponent } from '../change-password/change-password.component'; +import { listRefreshService } from '../../service/listRefresh.service'; declare var abp: any @Component({ @@ -20,7 +21,7 @@ declare var abp: any }) export class HomeComponent implements OnInit { @ViewChild('warning', { static: false }) template?: TemplateRef<{}>; - constructor(private http: HttpClient, private router: Router, private navChangeService: NavChangeService, public token: CacheTokenService, + constructor(private listRefreshService: listRefreshService, private http: HttpClient, private router: Router, private navChangeService: NavChangeService, public token: CacheTokenService, private cookieService: CookieService, private message: NzMessageService, private notificationService: NzNotificationService, private modal: NzModalService, private viewContainerRef: ViewContainerRef) { } isGasStationNav: boolean @@ -87,6 +88,9 @@ export class HomeComponent implements OnInit { reloadPage = (userNotification) => { console.log('abp.notifications.received收到通知', userNotification); + if (this.router.url.indexOf('todaywarning') != -1) { + this.listRefreshService.sendMessage(userNotification);//发布一条消息 + } this.receiptOfNotification(userNotification) }; @@ -106,14 +110,14 @@ export class HomeComponent implements OnInit { modalData look(item) { - console.log('推送信息',item) + console.log('推送信息', item) let params = { id: item.notification.entityId } this.http.get('/api/services/app/ViolateRecord/Get', { params: params }).subscribe((data: any) => { - console.log('推送信息后获取信息',data) + console.log('推送信息后获取信息', data) const modal = this.modal.create({ nzContent: GetOutOfLineDetailsComponent, nzWrapClassName: "vertical-center-modal", diff --git a/src/app/pages/oil-station-info/oil-station-info.component.html b/src/app/pages/oil-station-info/oil-station-info.component.html index d98e121..0abc44e 100644 --- a/src/app/pages/oil-station-info/oil-station-info.component.html +++ b/src/app/pages/oil-station-info/oil-station-info.component.html @@ -83,7 +83,8 @@ - + @@ -299,125 +300,92 @@ - - - +
    营业执照
    + + - - - - - - - +
    {{item.name}}
    - - - + + +
    -
    - - +
    + +
    -
    - - - - - - - *提前预警时间天数: - - - - - - - - +
    +
    + + + + + + + + + + +
    +
    + + + + + + + + + + +
    +
    + + + + + + + + + + + + + +
    + + +
    危险化学品
    经营许可证
    -
    -
    - - - -
    -
    - - -
    -
    - - - - - - - *提前预警时间天数: - - - - - - - - -
    - -
    -
    成品油零售
    经营许可证
    -
    -
    - - - -
    -
    - - -
    -
    - - - - - - - *提前预警时间天数: - - - - - - - - -
    -
    +
    + + + +
    diff --git a/src/app/pages/oil-station-info/oil-station-info.component.scss b/src/app/pages/oil-station-info/oil-station-info.component.scss index 7c42ccc..6fb5f0c 100644 --- a/src/app/pages/oil-station-info/oil-station-info.component.scss +++ b/src/app/pages/oil-station-info/oil-station-info.component.scss @@ -69,14 +69,17 @@ color: #23D9FF; text-align: right; padding: 0 16px; + max-width: 170px; } .text { width: 33%; } + .text2 { width: 83%; } + .organizations { text-align: left; color: #fff; @@ -89,10 +92,17 @@ tr, td { - height: 98px; + height: 138px; } .imgbox { + position: relative; + .deleteTr{ + position: absolute; + right: 5px; + top: 5px; + cursor: pointer; + } .uploadDivbox { width: 100%; height: 100%; @@ -102,15 +112,7 @@ align-items: center; position: relative; } - .timeDiv{ - position: absolute; - right: 10px; - top: 50%; - transform: translateY(-50%); - display: flex; - align-items: center; - justify-content: flex-end; - } + .uploadDiv { margin-left: 16px; width: 120px; @@ -142,6 +144,37 @@ color: #91CCFF; } } + + .timeDiv { + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-around; + + .timeDivflex { + width: 100%; + display: flex; + + nz-form-item { + width: 45%; + margin-right: 15px; + } + } + + .timeDivflex2 { + align-items: center; + + nz-form-item { + width: 36%; + margin-right: 9px; + } + } + } + } } } diff --git a/src/app/pages/oil-station-info/oil-station-info.component.ts b/src/app/pages/oil-station-info/oil-station-info.component.ts index 6c5eaa9..4c46d4f 100644 --- a/src/app/pages/oil-station-info/oil-station-info.component.ts +++ b/src/app/pages/oil-station-info/oil-station-info.component.ts @@ -27,7 +27,6 @@ export class OilStationInfoComponent implements OnInit { oilStationType: [null], laneNumber: [null], address: [null], - // validityTime: [null, [Validators.required]],//营业执照有效期 locationName: [null], companyName: [null], leaderName: [null], @@ -55,30 +54,24 @@ export class OilStationInfoComponent implements OnInit { distance: [null], contactInformation: [null] }), - validityTime: this.fb.group({ - businessLicensevalidityTime: [null], - businessLicensevalidityTimeDay: [null, [Validators.required]], - hazardousLicensevalidityTime: [null], - hazardousLicensevalidityTimeDay: [null, [Validators.required]], - oilLicensevalidityTime: [null], - oilLicensevalidityTimeDay: [null, [Validators.required]] - }) + // validityTime: this.fb.group({ + // businessLicensevalidityTime: [null], + // businessLicensevalidityTimeDay: [null, [Validators.required]], + // hazardousLicensevalidityTime: [null], + // hazardousLicensevalidityTimeDay: [null, [Validators.required]], + // oilLicensevalidityTime: [null], + // oilLicensevalidityTimeDay: [null, [Validators.required]] + // }) }); this.getInfo() - - } - validityTime: any = []//营业执照有效期 - businessLicensevalidityTime: any = []//营业执照有效期 - hazardousLicensevalidityTime: any = []//危化品有效期 - oilLicensevalidityTime: any = []//成品油有效期 + //获取油站信息 gallery - gasStationId getInfo() { this.http.get('/api/services/app/GasStation/Get', { params: { @@ -87,40 +80,26 @@ export class OilStationInfoComponent implements OnInit { }).subscribe((data: any) => { console.log('油站信息', data) this.httpBody = data.result - this.gasStationId = data.result.id - if (!data.result.govUnitDetail) { + if (!this.httpBody.govUnitDetail) { this.httpBody.govUnitDetail = { policeStation: {}, hospital: {}, fireBrigade: {} } } else { - this.httpBody.govUnitDetail = JSON.parse(data.result.govUnitDetail) - console.log('走这里了', data.result.govUnitDetail) this.policeStation = data.result.govUnitDetail.policeStation this.hospital = data.result.govUnitDetail.hospital this.fireBrigade = data.result.govUnitDetail.fireBrigade } - this.httpBody.stationType = String(this.httpBody.stationType) - this.businessLicensevalidityTime[0] = data.result.validityStartTime - this.businessLicensevalidityTime[1] = data.result.validityEndTime - this.businessLicensevalidityTime = [...this.businessLicensevalidityTime] - this.hazardousLicensevalidityTime[0] = data.result.dangerousStartTime - this.hazardousLicensevalidityTime[1] = data.result.dangerousEndTime - this.hazardousLicensevalidityTime = [...this.hazardousLicensevalidityTime] - this.oilLicensevalidityTime[0] = data.result.sellLicenseStartTime - this.oilLicensevalidityTime[1] = data.result.sellLicenseEndTime - this.oilLicensevalidityTime = [...this.oilLicensevalidityTime] - // if (this.httpBody.govUnitDetail) { - // // - - - - - // } else { - - // } + if (this.httpBody.licenses.length == 0) { + this.httpBody.licenses = [ + { name: '营业执照', startTime: '', endTime: '', firstWarnTime: '', secondWarnTime: '', imageUrl: '', annualInspectionTime: '', annualInspectionWarnTime: '', type: 1, hasAnnualInspection: true }, + { name: '危险化学品', startTime: '', endTime: '', firstWarnTime: '', secondWarnTime: '', imageUrl: '', annualInspectionTime: '', annualInspectionWarnTime: '', type: 3, hasAnnualInspection: false }, + { name: '成品油零售', startTime: '', endTime: '', firstWarnTime: '', secondWarnTime: '', imageUrl: '', annualInspectionTime: '', annualInspectionWarnTime: '', type: 2, hasAnnualInspection: true } + ] + } + this.httpBody.stationType ? this.httpBody.stationType = String(this.httpBody.stationType) : null setTimeout(() => { this.gallery = new Viewer(document.getElementById('images'), { show: () => { // 动态加载图片后,更新实例 @@ -138,7 +117,7 @@ export class OilStationInfoComponent implements OnInit { const httpOptions = { responseType: 'blob' as 'json' }; - this.http.get(`/api/services/app/GasStation/ExportExcelFile?gasStationId=${this.gasStationId}`, httpOptions).subscribe((data: any) => { + this.http.get(`/api/services/app/GasStation/ExportExcelFile?gasStationId=${this.httpBody.id}`, httpOptions).subscribe((data: any) => { // console.log('导出成功') // 文件名中有中文 则对文件名进行转码 const link = document.createElement('a'); @@ -177,15 +156,6 @@ export class OilStationInfoComponent implements OnInit { id: null, stationName: JSON.parse(sessionStorage.getItem('userdata')).organization.displayName, organizationUnitId: JSON.parse(sessionStorage.getItem('userdata')).organization.id, - validityStartTime: '', - validityEndTime: '', - dangerousStartTime: '', - dangerousEndTime: '', - sellLicenseStartTime: '', - sellLicenseEndTime: '', - validityTermDays: null, - dangerousTermDays: null, - sellLicenseTermDays: null, openTime: '', stationType: '', laneCount: '', @@ -205,27 +175,50 @@ export class OilStationInfoComponent implements OnInit { }, businessLicenseImage: '', dangerousChemicalLicenseImage: '', - gasSellLicenseImage: '' + gasSellLicenseImage: '', + licenses: [ + ] + } + onChange($event) { + + } + + addName = '' + isVisible = false; + showModal(): void { + console.log(this.addName) + this.addName = '' + this.isVisible = true; + } + + handleOk(): void { + this.isVisible = false; + if(this.addName){ + this.addTr() + } + } + + handleCancel(): void { + console.log('Button cancel clicked!'); + this.isVisible = false; + } + addTr() { + this.httpBody.licenses.push( + { name: this.addName, startTime: '', endTime: '', firstWarnTime: '', secondWarnTime: '', imageUrl: '', annualInspectionTime: '', annualInspectionWarnTime: '', type: -1, hasAnnualInspection: false }, + ) + } + deleteTrConfirm(key){ + console.log(key) + this.httpBody.licenses.splice(key, 1); } goback() { this.router.navigate(['/warning/petrolStation']) } submitForm() { - - // console.log(this.validateForm) - // console.log(this.httpBody) if (this.validateForm.valid) { this.isLoadingSave = true this.httpBody.openTime = moment(this.httpBody.openTime).format('YYYY-MM-MM')//开业时间格式化 - - this.httpBody.validityStartTime = moment(this.businessLicensevalidityTime[0]).format('YYYY-MM-MM')// - this.httpBody.validityEndTime = moment(this.businessLicensevalidityTime[1]).format('YYYY-MM-MM')// - this.httpBody.dangerousStartTime = moment(this.hazardousLicensevalidityTime[0]).format('YYYY-MM-MM')// - this.httpBody.dangerousEndTime = moment(this.hazardousLicensevalidityTime[1]).format('YYYY-MM-MM')// - this.httpBody.sellLicenseStartTime = moment(this.oilLicensevalidityTime[0]).format('YYYY-MM-MM')// - this.httpBody.sellLicenseEndTime = moment(this.oilLicensevalidityTime[1]).format('YYYY-MM-MM')// - this.httpBody.govUnitDetail.policeStation = this.validateForm.value.policeStation this.httpBody.govUnitDetail.hospital = this.validateForm.value.hospital this.httpBody.govUnitDetail.fireBrigade = this.validateForm.value.fireBrigade @@ -233,25 +226,15 @@ export class OilStationInfoComponent implements OnInit { let body = JSON.parse(JSON.stringify(this.httpBody)) body.stationType body.govUnitDetail = JSON.stringify(this.httpBody.govUnitDetail) - - if (this.httpBody.id) { - this.http.put('/api/services/app/GasStation/Update', body).subscribe((data: any) => { - this.isLoadingSave = false - this.message.create('success', '保存成功!'); - }, err => { - this.isLoadingSave = false - this.message.create('error', '保存失败!'); - }) - } else { - this.http.post('/api/services/app/GasStation/Create', body).subscribe((data: any) => { - this.httpBody.id = data.result.id - this.isLoadingSave = false - this.message.create('success', '保存成功!'); - }, err => { - this.isLoadingSave = false - this.message.create('error', '保存失败!'); - }) - } + console.log(body) + this.http.put('/api/services/app/GasStation/Update', body).subscribe((data: any) => { + this.isLoadingSave = false + this.message.create('success', '保存成功!'); + this.httpBody.licenses = data.result.licenses + }, err => { + this.isLoadingSave = false + this.message.create('error', '保存失败!'); + }) } else { this.message.create('warning', '请填写完整!'); return false @@ -259,23 +242,11 @@ export class OilStationInfoComponent implements OnInit { } - isLoadingOne: boolean = false - isLoadingTwo: boolean = false - isLoadingThree: boolean = false isLoadingSave: boolean = false - uploadType: string - filechange(e, type) { + uploadIndex: string + filechange(e, index) { let file = e.target.files[0] || null //获取上传的文件 - this.uploadType = type - if (this.uploadType == 'businessLicense') {//营业执照 - this.isLoadingOne = true - } - if (this.uploadType == 'dangerousChemical') {//危化品销售 - this.isLoadingTwo = true - } - if (this.uploadType == 'retailOfRefinedOil') {//成品油零售 - this.isLoadingThree = true - } + this.uploadIndex = index this.openFileSelect(file, `stationPhotos/${this.userdata.organization.id}/`) } //设置文件路径并上传 @@ -307,18 +278,7 @@ export class OilStationInfoComponent implements OnInit { this.objectsSrv.postFile(this.postFilePath, file).subscribe(data => { let dataObj = data as any; let filePath: string = ObjectsSimpleService.baseUrl + dataObj.objectName; - if (this.uploadType == 'businessLicense') {//营业执照 - this.httpBody.businessLicenseImage = filePath - this.isLoadingOne = false - } - if (this.uploadType == 'dangerousChemical') {//危化品 - this.httpBody.dangerousChemicalLicenseImage = filePath - this.isLoadingTwo = false - } - if (this.uploadType == 'retailOfRefinedOil') {//成品油 - this.httpBody.gasSellLicenseImage = filePath - this.isLoadingThree = false - } + this.httpBody.licenses[this.uploadIndex].imageUrl = filePath resolve('success') }); }) @@ -331,18 +291,7 @@ export class OilStationInfoComponent implements OnInit { postFileByMul(file: File) { this.objectsSrv.postFile_MultipartUpload(this.postFilePath, file).then((value) => { let dataObj = value as any; - if (this.uploadType == 'businessLicense') {//营业执照 - this.httpBody.businessLicenseImage = dataObj.filePath - this.isLoadingOne = false - } - if (this.uploadType == 'dangerousChemical') {//危化品 - this.httpBody.dangerousChemicalLicenseImage = dataObj.filePath - this.isLoadingTwo = false - } - if (this.uploadType == 'retailOfRefinedOil') {//成品油 - this.httpBody.gasSellLicenseImage = dataObj.filePath - this.isLoadingThree = false - } + this.httpBody.licenses[this.uploadIndex].imageUrl = dataObj.filePath }); } diff --git a/src/app/pages/oil-unloading-process-list/oil-unloading-process-list.component.html b/src/app/pages/oil-unloading-process-list/oil-unloading-process-list.component.html index c0ef09c..e2656dc 100644 --- a/src/app/pages/oil-unloading-process-list/oil-unloading-process-list.component.html +++ b/src/app/pages/oil-unloading-process-list/oil-unloading-process-list.component.html @@ -8,6 +8,7 @@
    预警类型统计 卸油统计 +
    diff --git a/src/app/pages/oil-unloading-process-list/oil-unloading-process-list.component.ts b/src/app/pages/oil-unloading-process-list/oil-unloading-process-list.component.ts index 9022167..f954c94 100644 --- a/src/app/pages/oil-unloading-process-list/oil-unloading-process-list.component.ts +++ b/src/app/pages/oil-unloading-process-list/oil-unloading-process-list.component.ts @@ -563,7 +563,7 @@ export class OilUnloadingProcessListComponent implements OnInit { }) } //获取统计信息 - chartsSpin:boolean = false + chartsSpin: boolean = false getAggregations() { this.chartsSpin = true let organizationUnitId @@ -590,7 +590,7 @@ export class OilUnloadingProcessListComponent implements OnInit { MaxResultCount: string = '50' list: any = [] totalCount: string - tableSpin:boolean = false + tableSpin: boolean = false getViolateRecordList() { this.tableSpin = true let organizationUnitId @@ -642,7 +642,7 @@ export class OilUnloadingProcessListComponent implements OnInit { 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, + organization: JSON.parse(sessionStorage.getItem('userdata')).organization.id, datePicker: [this.startdate, this.enddate] }); this.list = [] @@ -686,7 +686,17 @@ export class OilUnloadingProcessListComponent implements OnInit { } gorecordList() { - // this.router.navigate(['/records/records']) - history.go(-1) + if (this.router.url.indexOf('petrolStation') != -1) { + this.router.navigate(['/records/petrolStation']) + } else { + this.router.navigate(['/records']) + } + } + goWarningList() { + if (this.router.url.indexOf('petrolStation') != -1) { + this.router.navigate(['/records/petrolStation/warningstatisticslist']) + } else { + this.router.navigate(['/records/warningstatisticslist']) + } } } diff --git a/src/app/pages/oil-unloading-process/oil-unloading-process.component.html b/src/app/pages/oil-unloading-process/oil-unloading-process.component.html index becbebc..312fca8 100644 --- a/src/app/pages/oil-unloading-process/oil-unloading-process.component.html +++ b/src/app/pages/oil-unloading-process/oil-unloading-process.component.html @@ -134,10 +134,6 @@
    - 开始卸油
    diff --git a/src/app/pages/pages-routing.module.ts b/src/app/pages/pages-routing.module.ts index 952c157..903c72f 100644 --- a/src/app/pages/pages-routing.module.ts +++ b/src/app/pages/pages-routing.module.ts @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core'; import { PlanComponent } from './plan/plan.component'; import { TodayWarningComponent } from './today-warning/today-warning.component'; import { CriminalRecordsComponent } from './criminal-records/criminal-records.component'; -import {AuthGuard} from '../auth.guard' +import { AuthGuard } from '../auth.guard' import { TodayWarningAdminComponent } from './today-warning-admin/today-warning-admin.component'; import { CriminalRecordsAdminComponent } from './criminal-records-admin/criminal-records-admin.component'; import { OilStationInfoComponent } from './oil-station-info/oil-station-info.component'; @@ -12,17 +12,20 @@ import { PlanAdminComponent } from './plan-admin/plan-admin.component'; import { HomePageComponent } from './home-page/home-page.component'; import { OilUnloadingProcessListComponent } from './oil-unloading-process-list/oil-unloading-process-list.component'; import { init3DGuard } from './init3D.guard'; +import { WarningStatisticsListComponent } from './warning-statistics-list/warning-statistics-list.component'; const routes: Routes = [ { path: 'homepage', component: HomePageComponent }, { path: 'plan', component: PlanAdminComponent }, { path: 'plan/petrolStation', component: PlanComponent, canActivate: [init3DGuard], }, - { path: 'warning', component: TodayWarningAdminComponent }, - { path: 'warning/petrolStation', component: TodayWarningComponent }, + { path: 'todaywarning', component: TodayWarningAdminComponent }, + { path: 'todaywarning/petrolStation', component: TodayWarningComponent }, { path: 'records', component: CriminalRecordsAdminComponent }, { path: 'records/petrolStation', component: CriminalRecordsComponent }, { path: 'records/oliunloadinglist', component: OilUnloadingProcessListComponent }, { path: 'records/petrolStation/oliunloadinglist', component: OilUnloadingProcessListComponent }, + { path: 'records/warningstatisticslist', component: WarningStatisticsListComponent }, + { path: 'records/petrolStation/warningstatisticslist', component: WarningStatisticsListComponent }, { path: 'equipmentInfo', component: EquipmentInfoComponent }, { path: 'oliStationInfo', component: OilStationInfoComponent } ]; diff --git a/src/app/pages/pages.module.ts b/src/app/pages/pages.module.ts index dbf5a42..b6d67f7 100644 --- a/src/app/pages/pages.module.ts +++ b/src/app/pages/pages.module.ts @@ -55,11 +55,12 @@ import { HomePageComponent } from './home-page/home-page.component'; import { OilUnloadingProcessListComponent } from './oil-unloading-process-list/oil-unloading-process-list.component'; import { ChangePasswordComponent } from './change-password/change-password.component'; import { FacilitySortPipe } from './facility-sort.pipe'; +import { WarningStatisticsListComponent } from './warning-statistics-list/warning-statistics-list.component'; @NgModule({ declarations: [LoginComponent, RegisterComponent, HomeComponent, PlanComponent, TodayWarningComponent, CriminalRecordsComponent, TodayWarningAdminComponent, CriminalRecordsAdminComponent, LeftDomainComponent, EquipmentInfoComponent, OilStationInfoComponent, - AddequipmentComponent, EditequipmentComponent,PlanAdminComponent, GetOutOfLineDetailsComponent, DispositionComponent, OilUnloadingProcessComponent, HomePageComponent, OilUnloadingProcessListComponent, ChangePasswordComponent, FacilitySortPipe], + AddequipmentComponent, EditequipmentComponent,PlanAdminComponent, GetOutOfLineDetailsComponent, DispositionComponent, OilUnloadingProcessComponent, HomePageComponent, OilUnloadingProcessListComponent, ChangePasswordComponent, FacilitySortPipe, WarningStatisticsListComponent], imports: [ diff --git a/src/app/pages/today-warning-admin/today-warning-admin.component.html b/src/app/pages/today-warning-admin/today-warning-admin.component.html index 2ef8a00..638951d 100644 --- a/src/app/pages/today-warning-admin/today-warning-admin.component.html +++ b/src/app/pages/today-warning-admin/today-warning-admin.component.html @@ -22,15 +22,17 @@ - + - + - + @@ -77,13 +79,15 @@ - + - + @@ -102,7 +106,7 @@
    - +
    预警级别 @@ -110,13 +114,13 @@
    预警类型
    -
    +
    预警事件
    所属公司
    -
    +
    管理区域
    @@ -138,7 +142,7 @@ 操作
    - +
    @@ -167,25 +171,25 @@ Ⅳ级
    -
    +
    {{item.violation.violationType}}
    -
    +
    {{item.violation.eventSystemName}}
    -
    +
    {{item.gasStation.companyName}}
    -
    +
    {{item.gasStation.locationName}}
    -
    +
    {{item.gasStation.stationName}}
    -
    +
    {{item.violateArea}}
    -
    +
    {{item.cameraNo}}
    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 @@ +
    +
    +
    +
    + +
    +
    + 预警类型统计 + 卸油统计 + 证照预警统计 +
    +
    +
    + +
    + +
    +
    +
    + + + 证照预警统计 + +
    +
    {{num}}
    +
    总数
    +
    + 返回 +
    + +
    + +
    +
    + + + 近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 zcmV-{2Y&d8P)Et+A0mR? z-~&X^q%cbo9rwQ7#!oC$)F+ZFvME_cfDJ2!b z5`0b*(X}Ox#ivSeIg1h5B`YSCPQO+J=dPgDX)5tzqAa=! zhGLygs}X;fSWeO`pB>bM7_B#%`d_gxUQX@qLd$gD)1r*8ViicJYYSChcZd(F8a*w^KJsZgnSSF zW0f~z;DGoPANm6Xy>>bKnrcCN^b-im#<~L=rcLVl4Rl#x1*f^xqlr~JFfht*5k?g& z;@spGisOhAtN1VFxTM&$--~pbGq~JCmf?tDx zalRxSptA6_q84JN00zrgHE;!=a@-&p|;mJ}_6)rgeS04?!IS<#aMu=Snt3@c}njd7dA~ zo1ma7P5U(VLAi=H#a9jIfM6d8hK%lH_xi0A_f&8nm#PXH$g%JB-$wCdyuXd*kB61ItduIWZV-^%lc{| zUhP8^V|n-dYC#Ek&x;^z2lw*dj#bot-m*tJXxH!ZAt*t9!Kc!iks+6p3acvZ z#I>h-o&yoaR$)ds+Q6L@&w7!Q_xFOJp7Oc zbppxROh3itRBl>;6I0YU4~99}BUgXQavltPo>i-;Ge_i)7n{^J%W2$9U&JQL|W_=t_*IJSU_SSp3hnYh_MO1+M6LGSQPgMvZd zLvMm$gt68ir(TDGZ}ChDKRY=u-^3@c{A1KB)oLif8BM`A_;_dqWi0xH3&98j75EY0 zjFyvm9RvfvrEaJ{NgK{fsj%+^&S(n0#(zaou=o^hP#LmT72qsji%JCbJ=2cHK+qZf zn6SN1%CNu@NE;cV-r~h1Im$B$66ImIMcVruVaHj=Pp|MXOHL+iq}TrT^fLb`f7rIE z9vPVIEeQv8t0U`&X*VC8z}(&uc5ZiqJw%zL7x@ShL^OIa{b=R-<{`>(AWp$Qdz247KG1OwVVm=dTkLMaep3ppv@Ud7HdK6 z^ITAw=5Wc2u*r_r*h8HD7bsc(Ii)!jpW{Lr!SZ-Ll&^oQFl;)aKCqjT(&cKKTf-vv z43w-UW!HuM(aj3m%g8VrIcoK^Z}3ilIG779#eu|G=hKtw@p0xA_h za)E*s3cZ6$EmpE;3$0qn1q%f$=7LhiLYrDp@Q2B@_(4IMDxyL)Nk6r%CTXo{o4XsI zcXns9ncLmFO)eqlK)B4l`_8=2`!(;(EN4DV2oWhTww^N<6@o<=XN^pN0T1Yx;}_5E zzIs00bj;faxdt$OZ-}v@obv%M7$j;@8wD^hwgE)kPXV)rCRnBrVySs9K#Kt0$cZKv zVx0h2t1P5jN`F2Z=mo)sd5E>%!Fjh+@e=@E%Za$)0H>OAzbfhjQ0u}l&nS^?fLCET zxaARwDQOWET2(sryTx$IRP9kH0? zzupqvkbXUZQkg|18asJfiKg1<5c??q>83aZY>oei>{*okL#&VgfU;%QR3y_N2>*E%juqz<+v~qau|2*h;yec-I_Ytrj6cL3yYr{D4qWz=E-;3v|m<6Jj{_hH_XXS%KL*BKS7Mwj=mz*?Ttc2+^w(8L9>$LWpxdrt67fv( zWuIDT0#xl7#UGN5vWgm)-X&m9I^vLcJ_A5{carlLr;NiRups$5`K+?!FJZxF8GV(BfXxOx%z1aJJlUncxpMAD=q6MAS z)c-#O(AEh;1oNk!S;UP`0Z>}dMcJk1ccmX3s%#8CR|de32^bEw0D|0CDi>!espsps z0eLDLgC7E*pO%BrFi`fTy3!W(m^1Yv0D>kh7-U|*clif@SJr~9WdQ7iQuQneAyeQr zAWvm2cmM$H%E3z&`stefp6LUraEPTLq^w^2nw-iaU4#1KYuy$xZTwq(klR%x>Jyyd~il&c)IeWnycko8Sd3he&2+O5&A=Uw!^aPAc zG#jYB(0RFtCO>b#;!%sb6yR328v%f5a*0`Q5-@0b3tS+9v1_%viVW61PoR=Fha#NZ z(NRI6Ka75wg(m`Kd0D&4eWY7K?siwg-ywj(TJqJ!JWVWnuL^P>D#s#zLqH)J)TXKJ z4mZZUw7Z} zulK1PM{v4jY_pW2WWv1W_6Qd7x$77N-Ppdw+$__4==TJvk@-#lv=yOe8n=Fk#on+0 zD!w;Kvu3?%x(^zDPz17celANJKABbWGPomU%<=g~s7~FXDP^YxFo?Xo?GMX>rclMM ztzyHXBi>@hvhf|c(@Ts$g@Jp!1T30n4q(P55fLHQmRibN-Mq@6SiCLWHIBcG#v4VZ zjT%e2VUWiZU_qyxntXcd;I9LqrEyitnHI2WK_!qqs9>>O9sqUWUjwij0Hb{&@$b4* zR=j03Qp%VaZ&5I1!5iIiN!G4Ce)8G!s#iV}+2r)Kv6AZQfx!D4VL0J^LQen&B}y(Iu*Op3=geO&OB1W3HH5O=sC z{>_3n3R)EZ_XLu6%f)~eL>5h#0GJ>lh1@MnI4S5@UK(KH0+d4*bgYZu%3{ta#--gy zFbi%5KsA_hAKyM_v3(@~ZYCkkQ#9GE@do!T=aEt_O1#p76K$OZZ*((R5CDV7%U`}= z?dbJvhO^_l3Hwct zYTb*DgwO{qB|mYv?FP6bhH1y>v;{ItB-I?_W4-IEsbQ@LEjOlDh!+)8C$ec|LTTl~ zUy9D3CV+t!7E4$+C74I?y@-_v$nvVLj(f1C|AqERF(O zWh+MkJ$_eFCGYbm1_Wie2d5B+vzhfYf2?10BZk)d?B~3{uFxu#AT{kw%m>XM<&X5s zlujvJHm`h8rSv3^Vx7TewO@vwvWUtfRo;iS8f3+{_IHuNPm6RL2RN15y}-|Mde@1& z@hKMpe3+_*JiaNx&FW0V#tg*j2u=_hziY5Q#v_oc&xj@*H&CtT+4LhC{l(cr2ZrX8 z_c%VMRDwQqM#QmO=$ru!SL#N&c$@-j?Yr0IgIERf0ay~TMKNjK3sBQdGdueuNFeba zEz3ExevwPw_cLM=$MP_BOO;^k5;)%f<^JOP5#KWs0-6h>E-c8Ctq8ytS3LT{sjF*x o=%+F40K%y^jC&9_U`mYt05gHN{+Yc&U;qFB07*qoM6N<$f^u_F*Z=?k 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&IN$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