From 63287bed7b871c57fa7084657702bb65ee338dea Mon Sep 17 00:00:00 2001 From: SHAOJIAHAO <55341701@qq.com> Date: Mon, 6 Mar 2023 11:28:35 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=AE=8C=E5=96=84]=E9=BB=84=E6=B5=B7=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../host-config/host-config.component.html | 10 +- .../host-config/host-config.component.ts | 144 ++++++++++++- .../huang-hai-config.component.html | 5 + .../huang-hai-config.component.scss | 21 ++ .../huang-hai-config.component.spec.ts | 25 +++ .../huang-hai-config.component.ts | 16 ++ .../send-file/send-file.component.scss | 1 + .../send-file/send-file.component.ts | 19 +- .../image-label/image-label.component.html | 8 +- .../image-label/image-label.component.ts | 196 ++++++++++++------ .../system-management.module.ts | 2 + 11 files changed, 358 insertions(+), 89 deletions(-) create mode 100644 src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.html create mode 100644 src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.scss create mode 100644 src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.spec.ts create mode 100644 src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.ts diff --git a/src/app/system-management/host-config/host-config.component.html b/src/app/system-management/host-config/host-config.component.html index f97bc44..a0869ba 100644 --- a/src/app/system-management/host-config/host-config.component.html +++ b/src/app/system-management/host-config/host-config.component.html @@ -29,13 +29,13 @@ {{ item.uri }} {{ item.type | cameraType}} - - {{item.dimensionedPoints ? '已标注' : '未标注'}} + {{item.dimensionedPointsHuanghai ? '已标注' : '未标注'}} + + {{ item.isEnabled ? '已启用' : '已禁用'}} diff --git a/src/app/system-management/host-config/host-config.component.ts b/src/app/system-management/host-config/host-config.component.ts index c17f0f5..1868039 100644 --- a/src/app/system-management/host-config/host-config.component.ts +++ b/src/app/system-management/host-config/host-config.component.ts @@ -21,6 +21,7 @@ import { ConfigFormDataService } from 'src/app/service/configFormData.service'; import { SendFileComponent } from './send-file/send-file.component'; import { ImageLabel2Component } from '../image-label2/image-label2.component'; import { ImageLabelComponent } from '../image-label/image-label.component'; +import { HuangHaiConfigComponent } from './huang-hai-config/huang-hai-config.component'; interface Camera { name: string; user: string; @@ -29,6 +30,8 @@ interface Camera { type: number; order: number; dimensionedPoints: string; + dimensionedPointsHuanghai: string; + dimensionedPointsHuanghaiObj: any; isEnabled: boolean; } @@ -96,6 +99,9 @@ export class HostConfigComponent implements OnInit { this.http.get('/api/Cameras', { params: params }).subscribe((data: any) => { data.items.forEach((element) => { element.dimensionedPointsObj = JSON.parse(element.dimensionedPoints); + element.dimensionedPointsHuanghaiObj = JSON.parse( + element.dimensionedPointsHuanghai + ); }); this.listOfData = data.items; this.isLoading = false; @@ -240,6 +246,11 @@ export class HostConfigComponent implements OnInit { this.message.create('error', '请先下发source.yaml配置'); } } else if (this.hostType == '黄海') { + if (item.type === 1) { + this.message.info('加油区不需要标注'); + return; + } + const element = document.documentElement; if (element.requestFullscreen) { //进入全屏 @@ -1138,5 +1149,136 @@ rule_threshold: } //黄海配置文件 - config() {} + config() { + let data = this.configJson(); + const modal = this.modal.create({ + nzTitle: '下发黄海config.json配置', + nzContent: HuangHaiConfigComponent, + nzViewContainerRef: this.viewContainerRef, + nzWidth: 1000, + nzBodyStyle: { + 'border-radius': '0px', + padding: '7px', + }, + nzComponentParams: { + data: data, + }, + nzOnOk: () => { + new Promise((resolve, reject) => { + console.log('表单信息', instance.validateForm); + let body = { + configFiles: [{ name: 'config.json', content: instance.datacopy }], + }; + this.http.put(`/api/EdgeDevices/${this.hostId}`, body).subscribe({ + next: (data) => { + resolve(data); + this.message.success('文件保存成功'); + let params = { + edgeDeviceId: this.hostId, + fileName: 'source.yaml', + }; + this.http + .put('/api/EdgeDevices/Commands/PushFile', '', { + params: params, + }) + .subscribe({ + next: (data) => { + this.message.create('success', `发送文件名成功`); + }, + }); + }, + error: (err) => { + this.message.error('文件保存失败'); + reject(err); + }, + }); + }); + }, + }); + const instance = modal.getContentComponent(); + } + + configJson() { + let obj = { + sources: [], + freq: 5, + minPersonWidth: 40, + minPersonHeight: 70, + personAttMaxCount: [8, 8, 10, 10], + carStopMaxCount: 9000, + fireMaxCount: 5, + smokeMaxCount: 5, + saveVideoSize: [800, 640], + delayWarning: 0, + smoke_th: 0.8, + phone_th: 0.8, + bulkoil_th: 0.8, + fileUpload: + 'http://121.36.37.70:8906/api/Objects/sinochemtest/violations', + alarmUpload: 'http://121.36.37.70:8208/api/Data/ViolationRecordPush', + unloadingProUpload: + 'http://121.36.37.70:8208/api/Data/OilUnloadingProcessPush', + prefix: '/api/Objects/sinochemtest', + }; + this.listOfData.forEach((item: any) => { + if (item.type === 0) { + obj.sources.push({ + nickName: '进出口', + rtsp: item.uri, + carStopROI: pointsArrTransition( + item.dimensionedPointsHuanghaiObj.carStopROI + ), + }); + } + if (item.type === 1) { + obj.sources.push({ + nickName: '加油区', + rtsp: item.uri, + }); + } + if (item.type === 2) { + obj.sources.push({ + nickName: '卸油区', + rtsp: item.uri, + intrusionROI: pointsArrTransition( + item.dimensionedPointsHuanghaiObj.intrusionROI + ), + unloadingROI: + item.dimensionedPointsHuanghaiObj.unloadingROI.length !== 0 + ? [ + item.dimensionedPointsHuanghaiObj.unloadingROI[0].x, + item.dimensionedPointsHuanghaiObj.unloadingROI[0].y, + item.dimensionedPointsHuanghaiObj.unloadingROI[0].x + + item.dimensionedPointsHuanghaiObj.unloadingROI[0].width, + item.dimensionedPointsHuanghaiObj.unloadingROI[0].y + + item.dimensionedPointsHuanghaiObj.unloadingROI[0].height, + ] + : [], + carStopROI: pointsArrTransition( + item.dimensionedPointsHuanghaiObj.carStopROI + ), + }); + } + if (item.type === 3) { + obj.sources.push({ + nickName: '便利店', + rtsp: item.uri, + cashierROI: pointsArrTransition( + item.dimensionedPointsHuanghaiObj.cashierROI + ), + }); + } + }); + console.log(obj); + return JSON.stringify(obj); + + function pointsArrTransition(data) { + let arr = []; + data.forEach((item) => { + arr.push([item.x, item.y]); + }); + arr.push([data[0].x, data[0].y]); + return arr; + } + } } diff --git a/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.html b/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.html new file mode 100644 index 0000000..41d2a87 --- /dev/null +++ b/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.html @@ -0,0 +1,5 @@ +
+
+ +
+
\ No newline at end of file diff --git a/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.scss b/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.scss new file mode 100644 index 0000000..d167756 --- /dev/null +++ b/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.scss @@ -0,0 +1,21 @@ +.box { + width: 100%; + height: 100%; + background: #fff; + font-size: 15px; + color: black; + box-sizing: border-box; + display: flex; + flex-direction: column; + overflow-y: auto; +} + +.content { + flex: 1; + box-sizing: border-box; + + textarea { + width: 100%; + height: 400px; + } +} diff --git a/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.spec.ts b/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.spec.ts new file mode 100644 index 0000000..62e5553 --- /dev/null +++ b/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HuangHaiConfigComponent } from './huang-hai-config.component'; + +describe('HuangHaiConfigComponent', () => { + let component: HuangHaiConfigComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ HuangHaiConfigComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HuangHaiConfigComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.ts b/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.ts new file mode 100644 index 0000000..74752da --- /dev/null +++ b/src/app/system-management/host-config/huang-hai-config/huang-hai-config.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +@Component({ + selector: 'app-huang-hai-config', + templateUrl: './huang-hai-config.component.html', + styleUrls: ['./huang-hai-config.component.scss'], +}) +export class HuangHaiConfigComponent implements OnInit { + @Input() data: any; + validateForm!: FormGroup; + constructor() {} + datacopy; + ngOnInit(): void { + this.datacopy = JSON.parse(JSON.stringify(this.data)); + } +} diff --git a/src/app/system-management/host-config/send-file/send-file.component.scss b/src/app/system-management/host-config/send-file/send-file.component.scss index 3a25efc..d167756 100644 --- a/src/app/system-management/host-config/send-file/send-file.component.scss +++ b/src/app/system-management/host-config/send-file/send-file.component.scss @@ -13,6 +13,7 @@ .content { flex: 1; box-sizing: border-box; + textarea { width: 100%; height: 400px; diff --git a/src/app/system-management/host-config/send-file/send-file.component.ts b/src/app/system-management/host-config/send-file/send-file.component.ts index 96ed217..8218047 100644 --- a/src/app/system-management/host-config/send-file/send-file.component.ts +++ b/src/app/system-management/host-config/send-file/send-file.component.ts @@ -1,23 +1,16 @@ import { Component, OnInit, Input } from '@angular/core'; -import { NzModalRef } from 'ng-zorro-antd/modal'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { HttpClient } from '@angular/common/http'; +import { FormGroup } from '@angular/forms'; @Component({ selector: 'app-send-file', templateUrl: './send-file.component.html', - styleUrls: ['./send-file.component.scss'] + styleUrls: ['./send-file.component.scss'], }) export class SendFileComponent implements OnInit { - - @Input() data: any + @Input() data: any; validateForm!: FormGroup; - constructor(private modal: NzModalRef, private fb: FormBuilder, private http: HttpClient) { } - datacopy + constructor() {} + datacopy; ngOnInit(): void { - this.datacopy = JSON.parse(JSON.stringify(this.data)) - console.log(this.datacopy) - } - putConfig() { - + this.datacopy = JSON.parse(JSON.stringify(this.data)); } } diff --git a/src/app/system-management/image-label/image-label.component.html b/src/app/system-management/image-label/image-label.component.html index c0293d7..019f94c 100644 --- a/src/app/system-management/image-label/image-label.component.html +++ b/src/app/system-management/image-label/image-label.component.html @@ -11,23 +11,23 @@ diff --git a/src/app/system-management/image-label/image-label.component.ts b/src/app/system-management/image-label/image-label.component.ts index 61ffd3a..85a3d0d 100644 --- a/src/app/system-management/image-label/image-label.component.ts +++ b/src/app/system-management/image-label/image-label.component.ts @@ -33,12 +33,13 @@ export class ImageLabelComponent implements OnInit { //获取 摄像头图片/标注点位 getImgMarkData() { return new Promise((resolve, reject) => { - this.http.get(`/api/Cameras/${this.cameraId}`).subscribe((info: any) => { - info.dimensionedPoints - ? (info.dimensionedPoints = JSON.parse(info.dimensionedPoints)) - : null; - this.camerasData = info; - this.markType = info.type; + this.http.get(`/api/Cameras/${this.cameraId}`).subscribe((data: any) => { + console.log(456, data); + // data.dimensionedPointsHuanghai + // ? (data.dimensionedPointsHuanghai = JSON.parse(data.dimensionedPointsHuanghai)) + // : null; + this.camerasData = data; + this.markType = data.type; this.markType === 3 ? (this.selectedBtn = '收银区') @@ -91,7 +92,6 @@ export class ImageLabelComponent implements OnInit { } //初始化背景图 - canvas; ctx; @@ -133,39 +133,51 @@ export class ImageLabelComponent implements OnInit { //初始化标绘图形 initMark(canvas, context) { - this.camerasData.dimensionedPointsOfHH = sessionStorage.getItem('xxx'); - - if (!this.camerasData.dimensionedPointsOfHH) { + if (!this.camerasData.dimensionedPointsHuanghai) { return; } else { - this.camerasData.dimensionedPointsOfHH = JSON.parse( - this.camerasData.dimensionedPointsOfHH + this.camerasData.dimensionedPointsHuanghai = JSON.parse( + this.camerasData.dimensionedPointsHuanghai ); } - console.log('原始标点数据', this.camerasData.dimensionedPointsOfHH); - - return; - //绘制停车区多边形 - this.camerasData.dimensionedPointsOfHH.carStopROI.forEach((element) => { - this.carStopROIDrawPolygon(element.x, element.y, canvas, context); - }); + console.log('原始标点数据', this.camerasData.dimensionedPointsHuanghai); + //收银区 + if (this.camerasData.dimensionedPointsHuanghai.cashierROI.length !== 0) { + this.camerasData.dimensionedPointsHuanghai.cashierROI.forEach( + (element) => { + this.cashierROIDrawPolygon(element.x, element.y, canvas, context); + } + ); + } - //绘制收银区多边形 - this.camerasData.dimensionedPointsOfHH.cashierROI.forEach((element) => { - this.cashierROIDrawPolygon(element.x, element.y, canvas, context); - }); + //停车区 + if (this.camerasData.dimensionedPointsHuanghai.carStopROI.length !== 0) { + this.camerasData.dimensionedPointsHuanghai.carStopROI.forEach( + (element) => { + this.carStopROIDrawPolygon(element.x, element.y, canvas, context); + } + ); + } - //绘制闯入区多边形 - this.camerasData.dimensionedPointsOfHH.intrusionROI.forEach((element) => { - this.intrusionROIDrawPolygon(element.x, element.y, canvas, context); - }); + //闯入区 + if (this.camerasData.dimensionedPointsHuanghai.intrusionROI.length !== 0) { + this.camerasData.dimensionedPointsHuanghai.intrusionROI.forEach( + (element) => { + this.intrusionROIDrawPolygon(element.x, element.y, canvas, context); + } + ); + } //绘制卸油区矩形 - this.unloadingROIDrawOblong( - this.camerasData.dimensionedPointsOfHH.unloadingROI, - context - ); + if (this.camerasData.dimensionedPointsHuanghai.unloadingROI.length !== 0) { + this.unloadingROIOblongPoints = + this.camerasData.dimensionedPointsHuanghai.unloadingROI; + this.unloadingROIDrawOblong( + this.camerasData.dimensionedPointsHuanghai.unloadingROI, + context + ); + } } markType: number = 0; //0=进出口,1=加油区,2=卸油区,3=便利店, @@ -625,7 +637,19 @@ export class ImageLabelComponent implements OnInit { clearCanvas() { let canvas = document.getElementById('canvas') as any; let context = canvas.getContext('2d'); - + this.unloadingROIOblongPoints = []; //矩形的点的集合 + //停车区多边形 + this.carStopROIPoints = []; //线段的点的集合 + this.carStopROICircles = []; //可拖动圆圈的点的集合 + this.carStopROIAllpoints = []; //整体移动点位 + //闯入区多边形 + this.intrusionROIPoints = []; //线段的点的集合 + this.intrusionROICircles = []; //可拖动圆圈的点的集合 + this.intrusionROIAllpoints = []; //整体移动点位 + //收银区多边形 + this.cashierROIPoints = []; //线段的点的集合 + this.cashierROICircles = []; //可拖动圆圈的点的集合 + this.cashierROIAllpoints = []; //整体移动点位 context.clearRect(0, 0, canvas.width, canvas.height); this.copyCanvas ? context.putImageData(this.copyCanvas, 0, 0) : null; } @@ -639,21 +663,57 @@ export class ImageLabelComponent implements OnInit { nzOkType: 'primary', nzOkDanger: true, nzOnOk: () => { - // if (type == 'isAllMonitoring') { - // //全局的多边形 - // this.pointsOfmonitor = []; - // this.circlesOfmonitor = []; - // this.context.clearRect(0, 0, this.canvasWidth, this.canvasHeight); - // this.copyCanvas - // ? this.context.putImageData(this.copyCanvas, 0, 0) - // : null; - // } - // this.initMark2(this.canvas, this.ctx); //初始化标绘图形 + if (this.markType === 2) { + //卸油区 + this.context.clearRect(0, 0, this.canvasWidth, this.canvasHeight); + this.copyCanvas + ? this.context.putImageData(this.copyCanvas, 0, 0) + : null; + if (type === 'carStopROI') { + this.carStopROIPoints = []; + this.carStopROICircles = []; + this.carStopROIAllpoints = []; + //重绘闯入和卸油 + this.redrawAll(); + } + if (type === 'intrusionROI') { + this.intrusionROIPoints = []; + this.intrusionROICircles = []; + this.intrusionROIAllpoints = []; + this.redrawAll(); + } + if (type === 'unloadingROI') { + this.unloadingROIOblongPoints = []; + this.redrawAll(); + } + } else { + this.clearCanvas(); + } }, nzCancelText: '取消', }); } + redrawAll() { + this.redrawPolygon( + this.carStopROIPoints, + this.carStopROIAllpoints, + this.carStopROICircles, + this.context, + 'green' + ); + + this.redrawPolygon( + this.intrusionROIPoints, + this.intrusionROIAllpoints, + this.intrusionROICircles, + this.context, + 'red' + ); + + this.redrawRectangle(this.unloadingROIOblongPoints, this.context); + } + //根据已有数据重绘多边形 redrawPolygon(data, points, circles, context, color) { data.forEach((element) => { @@ -699,9 +759,9 @@ export class ImageLabelComponent implements OnInit { //保存 save() { - console.log(this.camerasData.dimensionedPointsOfHH); - if (!this.camerasData.dimensionedPointsOfHH) { - this.camerasData.dimensionedPointsOfHH = { + console.log(this.camerasData.dimensionedPointsHuanghai); + if (!this.camerasData.dimensionedPointsHuanghai) { + this.camerasData.dimensionedPointsHuanghai = { carStopROI: [], intrusionROI: [], cashierROI: [], @@ -714,7 +774,8 @@ export class ImageLabelComponent implements OnInit { this.message.create('warning', '绘制完整后可保存!'); return; } - this.camerasData.dimensionedPointsOfHH.carStopROI = this.carStopROIPoints; + this.camerasData.dimensionedPointsHuanghai.carStopROI = + this.carStopROIPoints; } //卸油区 if (this.markType === 2) { @@ -727,10 +788,11 @@ export class ImageLabelComponent implements OnInit { return; } - this.camerasData.dimensionedPointsOfHH.carStopROI = this.carStopROIPoints; - this.camerasData.dimensionedPointsOfHH.intrusionROI = + this.camerasData.dimensionedPointsHuanghai.carStopROI = + this.carStopROIPoints; + this.camerasData.dimensionedPointsHuanghai.intrusionROI = this.intrusionROIPoints; - this.camerasData.dimensionedPointsOfHH.unloadingROI = + this.camerasData.dimensionedPointsHuanghai.unloadingROI = this.unloadingROIOblongPoints; } //便利店 @@ -739,24 +801,26 @@ export class ImageLabelComponent implements OnInit { this.message.create('warning', '绘制完整后可保存!'); return; } - this.camerasData.dimensionedPointsOfHH.cashierROI = this.cashierROIPoints; + this.camerasData.dimensionedPointsHuanghai.cashierROI = + this.cashierROIPoints; } - // let paramsData = JSON.parse(JSON.stringify(this.camerasData)); - // paramsData.dimensionedPointsHH = JSON.stringify( - // paramsData.dimensionedPointsHH - // ); - console.log('标点结果', this.camerasData.dimensionedPointsOfHH); - // this.http - // .put(`/api/Cameras/${this.camerasData.id}/DimensionedPoints`, paramsData) - // .subscribe((data) => { - // this.message.create('success', '保存成功!'); - // const isFullScreen = document.fullscreenElement; - // if (document.exitFullscreen && isFullScreen) { - // //关闭全屏 - // document.exitFullscreen(); - // } - // this.modal.closeAll(); - // }); + let body = { + dimensionedPointsHuanghai: JSON.stringify( + this.camerasData.dimensionedPointsHuanghai + ), + }; + console.log('标点结果', this.camerasData.dimensionedPointsHuanghai); + this.http + .put(`/api/Cameras/${this.camerasData.id}/DimensionedPoints`, body) + .subscribe((data) => { + this.message.create('success', '保存成功!'); + const isFullScreen = document.fullscreenElement; + if (document.exitFullscreen && isFullScreen) { + //关闭全屏 + document.exitFullscreen(); + } + this.modal.closeAll(); + }); } } diff --git a/src/app/system-management/system-management.module.ts b/src/app/system-management/system-management.module.ts index 05e7342..acdb953 100644 --- a/src/app/system-management/system-management.module.ts +++ b/src/app/system-management/system-management.module.ts @@ -46,6 +46,7 @@ import { ScriptComponent } from './status-monitoring/script/script.component'; import { VideoStreamingComponent } from './video-streaming/video-streaming.component'; import { DetailsComponent } from './video-streaming/details/details.component'; import { NzRadioModule } from 'ng-zorro-antd/radio'; +import { HuangHaiConfigComponent } from './host-config/huang-hai-config/huang-hai-config.component'; @NgModule({ declarations: [ OrganizationComponent, @@ -73,6 +74,7 @@ import { NzRadioModule } from 'ng-zorro-antd/radio'; ScriptComponent, VideoStreamingComponent, DetailsComponent, + HuangHaiConfigComponent, ], imports: [ CommonModule,