From fecf813a57d239935102d50b0f88de09893ff296 Mon Sep 17 00:00:00 2001 From: SHAOJIAHAO <55341701@qq.com> Date: Mon, 14 Dec 2020 17:20:16 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E5=A2=9E]=E5=BC=95=E5=85=A5gis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- angular.json | 5 +- proxy.config.json | 2 +- .../allaround/allaround.component.html | 172 +++ .../allaround/allaround.component.scss | 107 ++ .../allaround/allaround.component.spec.ts | 25 + .../allaround/allaround.component.ts | 91 ++ .../allaround/imgdetails.component.html | 18 + .../allaround/imgdetails.component.ts | 54 + .../basic-info/basic-info.component.html | 83 ++ .../basic-info/basic-info.component.scss | 97 ++ .../basic-info/basic-info.component.spec.ts | 25 + .../basic-info/basic-info.component.ts | 170 +++ .../cad-draw/cad-draw.component.html | 25 + .../cad-draw/cad-draw.component.scss | 51 + .../cad-draw/cad-draw.component.spec.ts | 25 + .../cad-draw/cad-draw.component.ts | 308 ++++ .../fire-facilities.component.html | 64 + .../fire-facilities.component.scss | 222 +++ .../fire-facilities.component.spec.ts | 25 + .../fire-facilities.component.ts | 529 +++++++ .../fire-facilities/imagesdata.component.html | 9 + .../fire-facilities/imagesdata.component.ts | 90 ++ .../fire-facilities/previewImg.html | 25 + .../realistic-picture.component.scss | 174 +++ .../function-partition.component.html | 64 + .../function-partition.component.scss | 81 ++ .../function-partition.component.spec.ts | 25 + .../function-partition.component.ts | 219 +++ .../gis-labeling/downloadFile.html | 21 + .../gis-labeling/downloadFile.scss | 12 + .../gis-labeling/gis-labeling.component.html | 203 ++- .../gis-labeling/gis-labeling.component.scss | 438 +++++- .../gis-labeling/gis-labeling.component.ts | 1278 ++++++++++++++++- .../gis-management/gis-labeling/lookPlan.html | 53 + .../gis-management/gis-labeling/lookPlan.scss | 123 ++ .../gis-management/gis-labeling/shareUrl.html | 32 + .../gis-management/gis-labeling/shareUrl.scss | 127 ++ .../gis-management-routing.module.ts | 3 + .../gis-management/gis-management.module.ts | 125 +- .../key-site-look/key-site.component.html | 97 ++ .../key-site-look/key-site.component.scss | 139 ++ .../key-site-look/key-site.component.ts | 195 +++ .../key-site-look/keysiteimgs.component.html | 18 + .../key-site-look/keysiteimgs.component.ts | 55 + .../left-working/left-working.component.html | 71 + .../left-working/left-working.component.scss | 31 + .../left-working.component.spec.ts} | 12 +- .../left-working/left-working.component.ts | 39 + .../plan-list/openPlanTool.html | 3 + .../plan-list/openPlanTool.scss | 0 .../plan-list/plan-list.component.html | 42 + .../plan-list/plan-list.component.scss | 42 + .../plan-list/plan-list.component.spec.ts | 25 + .../plan-list/plan-list.component.ts | 102 ++ .../realistic-picture-look/previewImg.html | 17 + .../realistic-picture.component.html | 32 + .../realistic-picture.component.scss | 229 +++ .../realistic-picture.component.ts | 417 ++++++ src/app/navigation/navigation.component.html | 4 + src/app/navigation/navigation.component.scss | 4 + .../plan-management/plan-management.module.ts | 3 +- .../addoriginalcopy.component.html | 1 + .../editoriginalcopy.component.html | 1 + src/assets/images/2D.jpg | Bin 0 -> 6575 bytes src/assets/images/3D.jpg | Bin 0 -> 7310 bytes src/assets/images/3dicon.png | Bin 0 -> 308 bytes src/assets/images/Chemicalindustry.png | Bin 0 -> 1161 bytes src/assets/images/Highbuilding.png | Bin 0 -> 569 bytes src/assets/images/areaicon.png | Bin 0 -> 306 bytes src/assets/images/basicinfoicon.png | Bin 0 -> 190 bytes src/assets/images/camera.png | Bin 0 -> 942 bytes src/assets/images/coverageicon.png | Bin 0 -> 508 bytes src/assets/images/distanceicon.png | Bin 0 -> 409 bytes src/assets/images/download.png | Bin 0 -> 233 bytes src/assets/images/fireHydrant.png | Bin 0 -> 4578 bytes src/assets/images/navicon.png | Bin 0 -> 315 bytes src/assets/images/panoramaicon.png | Bin 0 -> 402 bytes src/assets/images/planicon.png | Bin 0 -> 255 bytes src/assets/images/point.gif | Bin 0 -> 55 bytes src/assets/images/routdown.png | Bin 0 -> 143 bytes src/assets/images/routdown2.png | Bin 0 -> 191 bytes src/assets/images/routup.png | Bin 0 -> 144 bytes src/assets/images/routup2.png | Bin 0 -> 196 bytes src/assets/images/shareicon.png | Bin 0 -> 331 bytes src/assets/images/showhide.png | Bin 0 -> 596 bytes src/assets/images/uniticon.png | Bin 0 -> 284 bytes src/assets/images/watericon.png | Bin 0 -> 392 bytes src/assets/images/储罐类.png | Bin 0 -> 782 bytes src/assets/images/其他.png | Bin 0 -> 791 bytes src/assets/images/医院.png | Bin 0 -> 1158 bytes src/assets/images/危化品.png | Bin 0 -> 1885 bytes src/assets/images/厂房.png | Bin 0 -> 739 bytes src/assets/images/古建筑.png | Bin 0 -> 904 bytes src/assets/images/商场超市.png | Bin 0 -> 812 bytes src/assets/images/地下.png | Bin 0 -> 799 bytes src/assets/images/娱乐.png | Bin 0 -> 1271 bytes src/assets/images/学校.png | Bin 0 -> 754 bytes src/assets/images/展览建筑.png | Bin 0 -> 885 bytes src/assets/images/影剧院.png | Bin 0 -> 1040 bytes src/assets/images/轨道交通.png | Bin 0 -> 1161 bytes src/assets/images/隧道.png | Bin 0 -> 1029 bytes src/assets/images/餐饮.png | Bin 0 -> 828 bytes src/assets/qrcode/qrcode.min.js | 1 + src/index.html | 12 +- src/styles.scss | 55 +- 105 files changed, 6650 insertions(+), 197 deletions(-) create mode 100644 src/app/gis-management/allaround/allaround.component.html create mode 100644 src/app/gis-management/allaround/allaround.component.scss create mode 100644 src/app/gis-management/allaround/allaround.component.spec.ts create mode 100644 src/app/gis-management/allaround/allaround.component.ts create mode 100644 src/app/gis-management/allaround/imgdetails.component.html create mode 100644 src/app/gis-management/allaround/imgdetails.component.ts create mode 100644 src/app/gis-management/basic-info/basic-info.component.html create mode 100644 src/app/gis-management/basic-info/basic-info.component.scss create mode 100644 src/app/gis-management/basic-info/basic-info.component.spec.ts create mode 100644 src/app/gis-management/basic-info/basic-info.component.ts create mode 100644 src/app/gis-management/cad-draw/cad-draw.component.html create mode 100644 src/app/gis-management/cad-draw/cad-draw.component.scss create mode 100644 src/app/gis-management/cad-draw/cad-draw.component.spec.ts create mode 100644 src/app/gis-management/cad-draw/cad-draw.component.ts create mode 100644 src/app/gis-management/fire-facilities/fire-facilities.component.html create mode 100644 src/app/gis-management/fire-facilities/fire-facilities.component.scss create mode 100644 src/app/gis-management/fire-facilities/fire-facilities.component.spec.ts create mode 100644 src/app/gis-management/fire-facilities/fire-facilities.component.ts create mode 100644 src/app/gis-management/fire-facilities/imagesdata.component.html create mode 100644 src/app/gis-management/fire-facilities/imagesdata.component.ts create mode 100644 src/app/gis-management/fire-facilities/previewImg.html create mode 100644 src/app/gis-management/fire-facilities/realistic-picture.component.scss create mode 100644 src/app/gis-management/function-partition/function-partition.component.html create mode 100644 src/app/gis-management/function-partition/function-partition.component.scss create mode 100644 src/app/gis-management/function-partition/function-partition.component.spec.ts create mode 100644 src/app/gis-management/function-partition/function-partition.component.ts create mode 100644 src/app/gis-management/gis-labeling/downloadFile.html create mode 100644 src/app/gis-management/gis-labeling/downloadFile.scss create mode 100644 src/app/gis-management/gis-labeling/lookPlan.html create mode 100644 src/app/gis-management/gis-labeling/lookPlan.scss create mode 100644 src/app/gis-management/gis-labeling/shareUrl.html create mode 100644 src/app/gis-management/gis-labeling/shareUrl.scss create mode 100644 src/app/gis-management/key-site-look/key-site.component.html create mode 100644 src/app/gis-management/key-site-look/key-site.component.scss create mode 100644 src/app/gis-management/key-site-look/key-site.component.ts create mode 100644 src/app/gis-management/key-site-look/keysiteimgs.component.html create mode 100644 src/app/gis-management/key-site-look/keysiteimgs.component.ts create mode 100644 src/app/gis-management/left-working/left-working.component.html create mode 100644 src/app/gis-management/left-working/left-working.component.scss rename src/app/gis-management/{gis-labeling/gis-labeling.component.spec.ts => left-working/left-working.component.spec.ts} (54%) create mode 100644 src/app/gis-management/left-working/left-working.component.ts create mode 100644 src/app/gis-management/plan-list/openPlanTool.html create mode 100644 src/app/gis-management/plan-list/openPlanTool.scss create mode 100644 src/app/gis-management/plan-list/plan-list.component.html create mode 100644 src/app/gis-management/plan-list/plan-list.component.scss create mode 100644 src/app/gis-management/plan-list/plan-list.component.spec.ts create mode 100644 src/app/gis-management/plan-list/plan-list.component.ts create mode 100644 src/app/gis-management/realistic-picture-look/previewImg.html create mode 100644 src/app/gis-management/realistic-picture-look/realistic-picture.component.html create mode 100644 src/app/gis-management/realistic-picture-look/realistic-picture.component.scss create mode 100644 src/app/gis-management/realistic-picture-look/realistic-picture.component.ts create mode 100644 src/assets/images/2D.jpg create mode 100644 src/assets/images/3D.jpg create mode 100644 src/assets/images/3dicon.png create mode 100644 src/assets/images/Chemicalindustry.png create mode 100644 src/assets/images/Highbuilding.png create mode 100644 src/assets/images/areaicon.png create mode 100644 src/assets/images/basicinfoicon.png create mode 100644 src/assets/images/camera.png create mode 100644 src/assets/images/coverageicon.png create mode 100644 src/assets/images/distanceicon.png create mode 100644 src/assets/images/download.png create mode 100644 src/assets/images/fireHydrant.png create mode 100644 src/assets/images/navicon.png create mode 100644 src/assets/images/panoramaicon.png create mode 100644 src/assets/images/planicon.png create mode 100644 src/assets/images/point.gif create mode 100644 src/assets/images/routdown.png create mode 100644 src/assets/images/routdown2.png create mode 100644 src/assets/images/routup.png create mode 100644 src/assets/images/routup2.png create mode 100644 src/assets/images/shareicon.png create mode 100644 src/assets/images/showhide.png create mode 100644 src/assets/images/uniticon.png create mode 100644 src/assets/images/watericon.png create mode 100644 src/assets/images/储罐类.png create mode 100644 src/assets/images/其他.png create mode 100644 src/assets/images/医院.png create mode 100644 src/assets/images/危化品.png create mode 100644 src/assets/images/厂房.png create mode 100644 src/assets/images/古建筑.png create mode 100644 src/assets/images/商场超市.png create mode 100644 src/assets/images/地下.png create mode 100644 src/assets/images/娱乐.png create mode 100644 src/assets/images/学校.png create mode 100644 src/assets/images/展览建筑.png create mode 100644 src/assets/images/影剧院.png create mode 100644 src/assets/images/轨道交通.png create mode 100644 src/assets/images/隧道.png create mode 100644 src/assets/images/餐饮.png create mode 100644 src/assets/qrcode/qrcode.min.js diff --git a/angular.json b/angular.json index 5521fa1..454b388 100644 --- a/angular.json +++ b/angular.json @@ -36,12 +36,13 @@ "node_modules/echarts/dist/echarts.js", "src/assets/mTokenK1/mToken_K1.js", "./node_modules/swiper/js/swiper.min.js", - //"src/assets/echarts/echarts.common.min.js", + "src/assets/chartstheme/chongqing.js", "src/assets/chartstheme/westeros.js", "src/assets/chartstheme/walden.js", "src/assets/chartstheme/westeros.js", - "src/assets/chartstheme/echarts-skin.js" + "src/assets/chartstheme/echarts-skin.js", + "src/assets/qrcode/qrcode.min.js" ] }, "configurations": { diff --git a/proxy.config.json b/proxy.config.json index 1898eac..b28a11f 100644 --- a/proxy.config.json +++ b/proxy.config.json @@ -1,6 +1,6 @@ { "/api": { - "target": "http://39.106.78.171:8000", + "target": "http://121.37.20.190:8000", "secure": false, "changeOrigin": true } diff --git a/src/app/gis-management/allaround/allaround.component.html b/src/app/gis-management/allaround/allaround.component.html new file mode 100644 index 0000000..1ac2e1a --- /dev/null +++ b/src/app/gis-management/allaround/allaround.component.html @@ -0,0 +1,172 @@ + +
+ + +
+ + + + + 单位毗邻 + + + + +
+
+ +
+
+
+ 建筑名称:{{item.name}} +
+
+ 建筑方向: + + + 西 + + + 东南 + 西南 + 东北 + 西北 + +
+
+ 图片数量: + {{item.imageUrls.length}}张 + 0张 +
+
+
+ + +
+
+
+
+ + + + + {{item.name}} + + +
+
+ +
+
+
+ 建筑名称:{{items.name}} +
+
+ 建筑方向: + + + 西 + + + 东南 + 西南 + 东北 + 西北 + +
+
+ 图片数量: + {{items.imageUrls.length}}张 + 0张 +
+
+
+ + +
+
+
+ +
\ No newline at end of file diff --git a/src/app/gis-management/allaround/allaround.component.scss b/src/app/gis-management/allaround/allaround.component.scss new file mode 100644 index 0000000..1787bbb --- /dev/null +++ b/src/app/gis-management/allaround/allaround.component.scss @@ -0,0 +1,107 @@ +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + scrollbar-width: none; /* Firefox */ +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} +.content { + width: 100%; + height: 100%; + //padding: 10px; + overflow-y: auto; +} +.tableContent{ + width: 100%; + height: 100%; + .panelhead{ + //position: relative; + height: 44px; + background-color: #F2F9FF; + } + .colum{ + width: 100%; + margin-top: 3%; + margin-bottom: 3%; + display: flex; + flex-direction: row; + .left{ + width: 45%; + //height: 140px; + img{ + width: 140px; + height: 100px; + margin-left: 13%; + cursor:pointer; + } + } + .right{ + width: 40%; + margin-top: 4%; + display: flex; + flex-direction: column; + .rightone{ + width: 100%; + } + .righttwo{ + margin-top: 3%; + } + .righthree{ + margin-top: 3%; + } + } + } +} + +//图片外部div +.allImgs { + display: flex; + overflow-y: auto; + flex-direction: row; + flex-wrap: wrap; + .imgBox{ + width: 300px; + height: 250px; + margin: 25px 35px 35px 35px; + display: inline-block; + position: relative; + .fixedImg { + width: 100%; + height: 170px; + text-align: center; + margin-bottom: 3px; + img { + width: auto; + height: auto; + max-width: 100%; + height: 100%; + cursor:pointer;} + } + } +} + +//预览图片 +.previewImgBox { + width: 1500px; + height: 700px; + text-align: center; + img{ + width: auto; + height: auto; + max-width: 100%; + height: 100%;} +} +.previewImgBottom { + text-align: center; + height: 30px; + margin: 20px auto; +} +//预览图片旋转角度 +.rotateA {transform: rotate(90deg) scale(0.75);} +.rotateB {transform: rotate(180deg)} +.rotateC {transform: rotate(270deg) scale(0.75);} \ No newline at end of file diff --git a/src/app/gis-management/allaround/allaround.component.spec.ts b/src/app/gis-management/allaround/allaround.component.spec.ts new file mode 100644 index 0000000..7849804 --- /dev/null +++ b/src/app/gis-management/allaround/allaround.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AllaroundComponent } from './allaround.component'; + +describe('AllaroundComponent', () => { + let component: AllaroundComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AllaroundComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AllaroundComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/gis-management/allaround/allaround.component.ts b/src/app/gis-management/allaround/allaround.component.ts new file mode 100644 index 0000000..207c144 --- /dev/null +++ b/src/app/gis-management/allaround/allaround.component.ts @@ -0,0 +1,91 @@ +/* + * @Descripttion: + * @version: + * @Author: sueRimn + * @Date: 2020-11-26 17:10:54 + * @LastEditors: sueRimn + * @LastEditTime: 2020-11-27 16:12:22 + */ +import { Component, OnInit, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import { ImgDetails } from './imgdetails.component' +import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar'; +import { Router, ActivatedRoute } from '@angular/router'; + + + +@Component({ + selector: 'app-allaround', + templateUrl: './allaround.component.html', + styleUrls: ['./allaround.component.scss'] +}) +export class AllaroundComponent implements OnInit { + + constructor(private http: HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar,private route:ActivatedRoute,) { } + + ngOnInit(): void { + this.getAllCompany() + this.getAllBuilding() + } + + AllAdjoining:any = []; //所有单位毗邻 + AllBuilding:any = []; //所有建筑 + 建筑毗邻图片 + //单位相关数据 + unitId:string = sessionStorage.getItem('unitId') + //5ee19fe06f91049f5e23e937 + //5fb78554919f2b44e464017e + //获取所有单位毗邻图片 + getAllCompany () { + let id = {companyId:this.unitId} + this.http.get('/api/CompanyAdjoins',{params:id}).subscribe(data=>{ + this.AllAdjoining = data + this.AllAdjoining.forEach(element => {element.imgURL = element.imageUrls[0] +'?x-oss-process=image/resize,m_fill,h_170,w_299'}) + }) + } + + //获取所有建筑 + getAllBuilding () { + let id = {companyId:this.unitId} + this.http.get('/api/Buildings',{params:id}).subscribe((data:any)=>{ + if (data.length) { + this.AllBuilding = data + this.AllBuilding.forEach(element => { + element.allImgs = [] + }); + this.getAllArchitecture()} + }) + } + + //获取所有建筑毗邻图片 + getAllArchitecture () { + this.AllBuilding.forEach(element => { + let id = {buildingId:element.id} + this.http.get('/api/BuildingAdjoins',{params:id}).subscribe(data=>{ + element.allImgs = data + /* console.log(element) + console.log(element.allImgs) */ + element.allImgs.forEach(element => {element.imgURL = element.imageUrls[0] +'?x-oss-process=image/resize,m_fill,h_170,w_299'}); + }) + }); + } + + //预览图片 + imgdetails(e){ + if (e.length && e!=null) { + let data = e + const dialogRef = this.dialog.open(ImgDetails, {//调用open方法打开对话框并且携带参数过去 + width: '1600px', + height:'900px',data}); + dialogRef.afterClosed().subscribe(); + } else{ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); + } + } + + + +} diff --git a/src/app/gis-management/allaround/imgdetails.component.html b/src/app/gis-management/allaround/imgdetails.component.html new file mode 100644 index 0000000..b341979 --- /dev/null +++ b/src/app/gis-management/allaround/imgdetails.component.html @@ -0,0 +1,18 @@ +
图片详情
+
+
+
+ +
+
+
+ + +
+
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/gis-management/allaround/imgdetails.component.ts b/src/app/gis-management/allaround/imgdetails.component.ts new file mode 100644 index 0000000..0bc8d65 --- /dev/null +++ b/src/app/gis-management/allaround/imgdetails.component.ts @@ -0,0 +1,54 @@ +import { Component, OnInit, Inject, ɵConsole } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import Swiper from 'swiper'; + + + +@Component({ + selector: 'imgdetails', + templateUrl: './imgdetails.component.html', + styleUrls: ['./allaround.component.scss'] + }) + export class ImgDetails { + + constructor(private http:HttpClient,public dialog: MatDialog,public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data) { } + testSwiper: Swiper; + + ngOnInit(): void { + this.allImages = [] + this.data.forEach(element => { + element = `${element}?x-oss-process=image/auto-orient,1` + this.allImages.push(element) + }); + } + + ngAfterViewInit() { + this.testSwiper = new Swiper('.swiper-container', { + lazy: true, + direction: 'horizontal', + loop: false, + + // 如果需要前进后退按钮 + navigation: { + nextEl: '.swiper-button-next', + prevEl: '.swiper-button-prev', + } + }); + } + + allImages:any; //展示所有的图片 + rotationAngle:number=0; //旋转角度 + + //旋转图片 + rotate () { + this.rotationAngle = this.rotationAngle+90 + if (this.rotationAngle === 360) {this.rotationAngle = 0} + } + + + +} + \ No newline at end of file diff --git a/src/app/gis-management/basic-info/basic-info.component.html b/src/app/gis-management/basic-info/basic-info.component.html new file mode 100644 index 0000000..c17aa16 --- /dev/null +++ b/src/app/gis-management/basic-info/basic-info.component.html @@ -0,0 +1,83 @@ +
+
+

单位照片

+
+ +
+
+
+

单位信息

+ + + + + + + + + + + + + + + + + + + + + + + + + +
统一社会信用代码{{unitInfo.usci}}
单位类型{{unitInfo.buildingTypes ? unitInfo.buildingTypes[0].name : ''}}
联系人{{unitInfo.contacts}}
联系电话{{unitInfo.phone}}
辖区中队{{unitInfo.organizationName}}
单位地址{{unitInfo.address}}
+
+
+

建筑信息

+ + + + + {{item.name}} + + + +
+
+

{{key+1 + '.' +n.name}}

+ +
+ + + + + +
{{p.propertyName}}({{p.physicalUnit}}){{p.propertyValue}}
+
+ +
+ + + + + +
{{p.propertyName}}({{p.physicalUnit}}){{o.propertyValue}}
+
+ +
+

{{i.buildingBasicGroups.length + 1}}.自定义信息

+
+ + + + + +
{{c.name}}{{c.value}}
+
+
+
+
+
+
diff --git a/src/app/gis-management/basic-info/basic-info.component.scss b/src/app/gis-management/basic-info/basic-info.component.scss new file mode 100644 index 0000000..390b7eb --- /dev/null +++ b/src/app/gis-management/basic-info/basic-info.component.scss @@ -0,0 +1,97 @@ + +table,table tr th, table tr td { border: 1px solid #EEF1F5; } +table { text-align: center; border-collapse: collapse; padding:2px;} +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + scrollbar-width: none; /* Firefox */ +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} + +.box{ + width: 100%; + height: 100%; + overflow-y: auto; + font-family: Source Han Sans CN; + color: #333333; + padding: 10px; + box-sizing: border-box; + font-size: 14px; + font-weight: 400; +} +//头部单位照片 +.unitPhotographBox{ + width: 100%; + p{ + height: 14px; + font-size: 14px; + font-family: Source Han Sans CN; + font-weight: 400; + line-height: 14px; + color: #333333; + opacity: 1; + margin: 10px 0 ; + } + .imgbox{ + width: 180px; + height: 140px; + img{ + width: 100%; + height: 100%; + cursor: pointer; + } + } +} +//单位信息 +.unitInfoBox{ + width: 100%; + p{ + height: 14px; + font-size: 14px; + font-family: Source Han Sans CN; + font-weight: 400; + line-height: 14px; + color: #333333; + opacity: 1; + margin: 10px 0; + } + table{ + width: 100%; + tr{ + height: 35px; + td:nth-child(1){ + width: 40%; + } + } + tr:nth-child(odd){ + background: #F2F9FF; + } + } +} +//建筑信息 +.buildingsBox{ + p{ + margin: 10px 0; + } + table{ + width: 100%; + tr{ + height: 35px; + td:nth-child(1){ + width: 40%; + } + } + tr:nth-child(odd){ + background: #F2F9FF; + } + } +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} diff --git a/src/app/gis-management/basic-info/basic-info.component.spec.ts b/src/app/gis-management/basic-info/basic-info.component.spec.ts new file mode 100644 index 0000000..9cfa89c --- /dev/null +++ b/src/app/gis-management/basic-info/basic-info.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicInfoComponent } from './basic-info.component'; + +describe('BasicInfoComponent', () => { + let component: BasicInfoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicInfoComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicInfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/gis-management/basic-info/basic-info.component.ts b/src/app/gis-management/basic-info/basic-info.component.ts new file mode 100644 index 0000000..688b8a6 --- /dev/null +++ b/src/app/gis-management/basic-info/basic-info.component.ts @@ -0,0 +1,170 @@ +import { HttpClient } from '@angular/common/http'; +import { Component, OnInit } from '@angular/core'; +import Viewer from 'viewerjs'; +class unitInfo { + id: string; + name: string; //单位信息名字 + usci: string; //单位信用代码 + contacts: string; //联系人 + phone: string; //联系电话 + address: string; //单位地址 + imageUrl: string; //图片地址 + location: string; //单位地理位置 + modifiedTime: string; //信息修改时间 + organizationId: string; //所属组织机构 + organizationName: string; //组织机构名称 + buildingTypes: [ + { + id:string; + name:string; + } + ] +} + +@Component({ + selector: 'app-basic-info', + templateUrl: './basic-info.component.html', + styleUrls: ['./basic-info.component.scss'] +}) +export class BasicInfoComponent implements OnInit { + + constructor(private http: HttpClient) { } + + unitId:string;//单位相关数据 + + unitInfo:unitInfo = { + id: '', + name: '', //单位信息名字 + usci: '', //单位信用代码 + contacts: '', //联系人 + phone: '', //联系电话 + address: '', //单位地址 + imageUrl: '', //图片地址 + location: '', //单位地理位置 + modifiedTime: '', //信息修改时间 + organizationId: '', //所属组织机构 + organizationName: '', //组织机构名称 + buildingTypes: [ + { + id:'', + name:'' + } + ] + } + noImg:string = '../../../assets/images/noImg.png' + gallery:any //Viewer实例 + + ngOnInit(): void { + this.everyInin() + } + + //每次初始化 加载 组件调用方法 + everyInin () { + this.unitId = sessionStorage.getItem('unitId') + if (this.unitId) { + this.getUnitInfo().then(()=>{ + setTimeout(() => { + this.gallery = new Viewer(document.getElementById('viewerjs'),{ url: 'data-original' }); + },0); + }); + this.getAllBuildingsInfo() + } + } + + //获得单位信息 + async getUnitInfo(){ + let result = await new Promise((resolve, reject) => { + this.http.get(`/api/Companies/${this.unitId}`).subscribe((data:any)=>{ + resolve('获取单位信息成功') + this.unitInfo = data + }) + }) + } + + buildingsData:any + //获得所有建筑信息 + getAllBuildingsInfo(){ + this.http.get("/api/Buildings",{ + params:{ + companyId:this.unitId + } + }).subscribe(async (data:any)=>{ + this.buildingsData = data + for (let i = 0, length = data.length; i < length; i++){ + const result = await new Promise((resolve) =>{ + this.http.get("/api/BuildingBasicInfos",{ // 循环请求当前单位建筑每一个建筑的信息保存到数组中 + params:{ + companyId :this.unitId, + buildingId:data[i].id, + buildingType:data[i].buildingTypes[0].id + } + }).subscribe((buildingsData:any)=>{ + //获得当前建筑自定义信息并且添加到item自定义属性上 + let _data = buildingsData + _data[0].buildingCustomData = {} + _data[0].buildingCustomData.customProperties = [] + this.http.get("/api/BuildingCustomData",{params:{ + buildingId:data[i].id + }}).subscribe((data:any)=>{ + _data[0].buildingCustomData = data + if(data && data.customProperties.length != 0){ + _data[0].isCustomData = true + }else{ + _data[0].isCustomData = false + _data[0].buildingCustomData ={ + id: "", + customProperties: [ + { + name: "", + value: "" + } + ], + buildingId: _data[0].buildingId + } + } + }) + + //如果是表格类需要处理数据 + // console.log(i,buildingsData) + buildingsData[0].buildingBasicGroups.forEach(element => { + if(element.type == 1){ + + var map = {}, + dest:any = []; + for(var i = 0; i < element.propertyInfos.length; i++){ + var ai = element.propertyInfos[i]; + if(!map[ai.propertyName]){ + dest.push({ + propertyName: ai.propertyName, + data: [ai] + }); + map[ai.propertyName] = ai; + }else{ + for(var j = 0; j < dest.length; j++){ + var dj = dest[j]; + if(dj.propertyName == ai.propertyName){ + dj.data.push(ai); + break; + } + } + } + } + //根据行数确定在循环数组中的index + dest.forEach(item => { + item.data.sort(function(a,b){ + return Number(a.tag) - Number(b.tag) + }) + }) + + element.tabledata = dest + } + }); + this.buildingsData[i].details = buildingsData + resolve(i) + }) + }) + } + }) + } + +} diff --git a/src/app/gis-management/cad-draw/cad-draw.component.html b/src/app/gis-management/cad-draw/cad-draw.component.html new file mode 100644 index 0000000..bf42630 --- /dev/null +++ b/src/app/gis-management/cad-draw/cad-draw.component.html @@ -0,0 +1,25 @@ + +
+
+
+
+ {{item.name}} +
+
+ + 下载 +
+
+
+ 日期:{{item.creationTime|date:'yyyy-MM-dd'}} + 大小:{{item.fileLength}}M +
+
+
diff --git a/src/app/gis-management/cad-draw/cad-draw.component.scss b/src/app/gis-management/cad-draw/cad-draw.component.scss new file mode 100644 index 0000000..ddf1517 --- /dev/null +++ b/src/app/gis-management/cad-draw/cad-draw.component.scss @@ -0,0 +1,51 @@ +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + scrollbar-width: none; /* Firefox */ +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} +.content{ + width: 100%; + height: 100%; + overflow-y: auto; + overflow-x: hidden; + display: flex; + flex-direction: column; + font-size: 14px; + .center{ + width: 100%; + border: 1px solid #EEF1F5; + display: flex; + flex-direction: column; + .up{ + width: 100%; + display: flex; + margin-top: 2%; + span{ + color: #0080FF; + font-size: 14px; + } + .left{ + width: 70%; + span{ + margin-left: 7.5%; + margin-top: 5%; + } + } + .right{ + width: 30%; + text-align: center; + cursor: pointer; + } + } + .down{ + margin: 2% 0 3% 5%; + } + } +} \ No newline at end of file diff --git a/src/app/gis-management/cad-draw/cad-draw.component.spec.ts b/src/app/gis-management/cad-draw/cad-draw.component.spec.ts new file mode 100644 index 0000000..028f9f2 --- /dev/null +++ b/src/app/gis-management/cad-draw/cad-draw.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CadDrawComponent } from './cad-draw.component'; + +describe('CadDrawComponent', () => { + let component: CadDrawComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CadDrawComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CadDrawComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/gis-management/cad-draw/cad-draw.component.ts b/src/app/gis-management/cad-draw/cad-draw.component.ts new file mode 100644 index 0000000..2c7bcf5 --- /dev/null +++ b/src/app/gis-management/cad-draw/cad-draw.component.ts @@ -0,0 +1,308 @@ +import { Component, OnInit, Inject } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-cad-draw', + templateUrl: './cad-draw.component.html', + styleUrls: ['./cad-draw.component.scss'] +}) +export class CadDrawComponent implements OnInit { + + constructor(private http:HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar,private route:ActivatedRoute,) { } + + ngOnInit(): void { + this.companyId = this.unitId + this.getAllCAD() + } + unitId:any = sessionStorage.getItem('unitId') + + displayedColumns: string[] = ['checked', 'name', 'time', 'state','size']; + + companyId:any; //单位编号 + CADList:any=[]; //所有CAD图 + selectCAD:any = []; //选中的CAD图 + + //获取所有CAD图 + getAllCAD () { + let id = {companyId:this.unitId} + this.http.get('/api/CadData',{params:id}).subscribe(data=>{ + this.CADList = data + this.selectCAD = [] + this.CADList.forEach(element => { + element.loading = false + element.suffix = element.cadUrl.substring(element.cadUrl.lastIndexOf("."),element.cadUrl.length); //图名后缀 + element.fileLength = (element.fileLength/1024/1024).toFixed(2)}); + }) + } + + //change CAD图checked + checkedCAD (e,element) { + /* if (e.checked) { + this.selectCAD.push(element) + } else { + this.selectCAD.splice(this.selectCAD.findIndex(item => item.id === element.id), 1)} */ + this.selectCAD.splice(this.selectCAD.findIndex(item => item.id === element.id), 1) + this.selectCAD.push(element) + this.readFile() + } + + //打开上传文件窗口 + openReadFile() { + + } + + //打开编辑文件窗口 + editFile () { + + } + + //删除CAD图 + deleteCAD () { + if (this.selectCAD.length) { + let isDelete = confirm('您确定要删除吗') + let arr = [] + if (isDelete) { + this.selectCAD.forEach( async (element,index) => { + let result = await new Promise((result,reject)=>{ + this.http.delete(`/api/CadData/${element.id}`).subscribe(data=>{result(index)}) + this.http.delete(`/api/Objects/PlanPlatform/${element.cadUrl}`).subscribe(data=>{}) + }) + arr.push(result) + if (arr.length == this.selectCAD.length) { + this.getAllCAD() + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('删除CAD图纸成功','确定',config);} + }); + } + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择CAD图纸','确定',config); + } + } + + + + + + //上传文件↓ + file:any; //上传的文件 + fileName:any; //上传文件name + uploadisLoading:boolean = false; //进度条loading加载 + uploadProgress:number=0; //进度条进度 + objectName:any; //上传对象名 + uploadId:any; //上传分块上传事件编号 + + //上传文件 + startUploading () { + let file = this.file || null //获取上传的文件 + let fileSize = file.size || null //上传文件的总大小 + let shardSize = 5 * 1024 * 1024 //5MB一个分片 + + if (file && fileSize<=shardSize) { //上传文件<=5MB时 + let formData = new FormData() + formData.append("file",file) + this.http.post(`/api/Objects/PlanPlatform/${this.companyId}/CAD`,formData).subscribe((data:any)=>{ + this.objectName = data.objectName + this.addCADData() + }) + } else if (file && fileSize>shardSize) { //上传文件>5MB时,分块上传 + let data = {filename: file.name} + this.uploadisLoading = true + this.http.post(`/api/NewMultipartUpload/PlanPlatform/${this.companyId}/CAD`,{},{params:data}).subscribe((data:any)=>{ //初始化分段上传 + this.objectName = data.objectName + this.uploadId = data.uploadId + this.subsectionUploading() + }) + } + + } + + PartNumberETag:any=[]; //每次返回需要保存的信息 + //开始分段上传 + async subsectionUploading () { + let file = this.file || null //获取上传的文件 + let fileSize = file.size || null //上传文件的总大小 + let shardSize = 5 * 1024 * 1024 //5MB一个分片 + let allSlice = Math.ceil(fileSize / shardSize) //总文件/5MB===共分多少段 + + for (let i = 0;i < allSlice;i++) { //循环分段上传 + let start = i * shardSize //切割文件开始位置 + let end = Math.min(fileSize, start + shardSize); //切割文件结束位置 + let formData = new FormData() + formData.append("file",file.slice(start, end)) + + //同步写法实现异步调用 + let result = await new Promise((resolve, reject) => { + // await 需要后面返回一个 promise 对象 + this.http.post(`/api/MultipartUpload/PlanPlatform/${this.objectName}?uploadId=${this.uploadId}&partNumber=${i+1}`,formData).subscribe((data:any)=>{ + let msg = { + "partNumber":data.partNumber || null, + "eTag": data.eTag || null} + resolve(msg) // 调用 promise 内置方法处理成功 + }) + }); + this.PartNumberETag.push(result) + this.uploadProgress = Number((i/allSlice).toFixed(2))*100 + + if (this.PartNumberETag.length === allSlice) { + this.uploadProgress = 100 + this.endUploading()} + }//for循环 + + } + + //完成分块上传 + endUploading () { + let data = this.PartNumberETag + let paramsData = {uploadId:this.uploadId} + this.http.post(`/api/CompleteMultipartUpload/PlanPlatform/${this.objectName}`,data,{params:paramsData}).subscribe(data=>{ + this.addCADData() + this.uploadProgress = 0; + this.uploadisLoading = false + this.PartNumberETag =[] //清空保存返回的信息 + }) + } + + //取消分块上传 + cancel () { + this.http.delete(`/api/MultipartUpload/PlanPlatform/${this.objectName}?uploadId=${this.uploadId}`).subscribe(data=>{ + this.uploadProgress = 0; + this.uploadisLoading= false + this.PartNumberETag =[] //清空保存返回的信息 + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('取消上传成功!','确定',config); + }) + } + + //上传成功创建CAD + addCADData () { + let data = { + name: this.fileName, + cadUrl: this.objectName, + fileLength: this.file.size, + creationTime: new Date(), + companyId: this.companyId + } + this.http.post('/api/CadData',data).subscribe(data=>{ + this.getAllCAD() + }) + } + + + + + + //下载↓ + selectDownloadFile:any; //选择下载的文件 + download:any; //下载文件元数据 + downloadisLoading:boolean = false; //进度条loading加载 + downloadProgress:number=0; //进度条进度 + + //读取下载文件信息 + readFile () { + if (this.selectCAD.length===1) { + this.selectDownloadFile = this.selectCAD[0] + this.http.get('/api/ObjectMetadata/PlanPlatform/'+this.selectDownloadFile.cadUrl).subscribe(data=>{ + this.download = data + this.downloadFile() + }) + } else if (this.selectCAD.length>1) { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂时不支持批量下载','确定',config) + } else if (!this.selectCAD.length) { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择CAD图纸','确定',config); + } + } + + //初始化下载 + downloadFile () { + let file = this.download + let fileSize = file.fileLength//下载文件的总大小 + let shardSize = 10 * 1024 * 1024 //文件大小是否大于10MB + + if (file && fileSize<=shardSize) { //<=10MB时直接下载 + this.downloadisLoading = true + this.setFileLoading() + this.http.get(`/api/Objects/PlanPlatform/${file.objectName}`,{responseType: 'blob'},).subscribe(data=>{ + + let url = window.URL.createObjectURL(new Blob([data])); //createObjectURL创建一个下载Blob的url地址 + let link = document.createElement("a"); + link.style.display = "none"; + link.href = url; + link.setAttribute("download", this.selectDownloadFile.name+this.selectDownloadFile.suffix); + document.body.appendChild(link); + link.click(); + this.downloadisLoading = false + this.setFileLoading() + }) + } else if (file && fileSize>shardSize) { //>10MB时分块下载 + this.blockingDownload() //分段下载 + this.downloadisLoading = true + this.setFileLoading() + } + + } + + //分段下载并合并 + async blockingDownload () { + let file = this.download + let fileSize = file.fileLength //下载文件的总大小 + let shardSize = 3 * 1024 * 1024 //3MB一个分片 + let allSlice = Math.ceil(fileSize / shardSize) //总文件/3MB===共分多少段 + let allFile:any = [] //所有的file分段 + + for (let i=0;i{ + this.http.get(`/api/Objects/PlanPlatform/${file.objectName}`,{headers:{'range':`bytes= ${start}-${end}`},responseType:'blob'}).subscribe(data=>{ + result(data) }) + }) + allFile.push(result) + this.downloadProgress = Number((i/allSlice).toFixed(2))*100 + + if (allFile.length === allSlice) { //合并文件输出给浏览器 + let url = window.URL.createObjectURL(new Blob(allFile)); //createObjectURL创建一个下载Blob的url地址 + let link = document.createElement("a"); + link.style.display = "none"; + link.href = url; + link.setAttribute("download", this.selectDownloadFile.name+this.selectDownloadFile.suffix); + document.body.appendChild(link); + link.click(); + this.downloadProgress = 0 + this.downloadisLoading = false + this.setFileLoading() + } + + } //for循环 + + } + + //取消分块下载 + cancelDowload () { + + } + + //封装函数设置当前文件loading状态 + setFileLoading () { + let id = this.selectDownloadFile.id + this.CADList.forEach(element => { + if (element.id === id) { element.loading = !element.loading } + }); + } +} diff --git a/src/app/gis-management/fire-facilities/fire-facilities.component.html b/src/app/gis-management/fire-facilities/fire-facilities.component.html new file mode 100644 index 0000000..9623bec --- /dev/null +++ b/src/app/gis-management/fire-facilities/fire-facilities.component.html @@ -0,0 +1,64 @@ + +
+ +
+ + + + + {{item.name}} + + +
+
+
+ 项目:{{items.name}} +
+
+ {{items.total ? items.total : '总数: 0'}} +
+
+
+ 主要情况:{{items.details}} +
+
+ 查看图片 + + +
+
+
+ + + + + +
{{header}}{{body[header]? body[header] : '暂无数据'}}
+
+
+

楼层/区域名称: {{tableMsg.name? tableMsg.name: '暂无名称'}}

+ + + + + +
{{header}}{{body[header]? body[header] : '暂无数据'}}
+
+
+ +
+ + + +
+
+
+ +
diff --git a/src/app/gis-management/fire-facilities/fire-facilities.component.scss b/src/app/gis-management/fire-facilities/fire-facilities.component.scss new file mode 100644 index 0000000..0ec681a --- /dev/null +++ b/src/app/gis-management/fire-facilities/fire-facilities.component.scss @@ -0,0 +1,222 @@ +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + scrollbar-width: none; /* Firefox */ +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} +.content { + width: 100%; + height: 100%; + //box-sizing: border-box; + //padding: 10px; + overflow-y: auto; + .contentBox { + width: 100%; + height: 100%; + margin: 0 auto; + overflow-y: auto; + } + .tableContent{ + width: 100%; + height: 100%; + .panelhead{ + //height: 24px; + background-color: #F2F9FF; + } + .column{ + width: 100%; + display: flex; + flex-direction: column; + border-bottom: 8px solid #EEF1F5; + .up{ + width: 100%; + margin-top: 3%; + display: flex; + flex-direction: row; + .left{ + width: 40%; + } + .centernum{ + //width: 25%; + color: black; + text-align: center; + white-space: pre-line; + max-height: 48px; + overflow-y: auto; + } + } + .down{ + width: 100%; + /* display: flex; + justify-content: space-around; */ + span{ + display: inline-block; + } + } + .downtable{ + width: 100%; + } + .imgdown{ + margin-top: 3%; + span{ + color: #0080FF; + } + input{ + border:none; + outline: none; + text-align: right; + color: #0080FF; + } + img{ + height: 8px; + width: 10px; + } + } + } + } + } + .mat-icon { + color: black; + cursor:pointer; + } + + + + //可展开面板每一行css + .mat-expansion-panel-header { + padding: 3px 24px; + } + + .firstContent { + width: 3%; + } + .textContent { + width: 12%; + color: black; + text-align: center; + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; + } + .totalContent { + width: 25%; + color: black; + text-align: center; + white-space: pre-line; + max-height: 48px; + overflow-y: auto; + } + .lastTextContent { //textarea多行文本 + width: 45%; + color: black; + text-align: center; + } + input { + height: 22px; + line-height: 22px; + padding-left: 5px; + border-radius: 3px; + } + a { + color: #0000ff; + } + + + + //bottom用户输入框 + .InputField { + display: inline-block; + width: 40%; + text-align: right; + margin: 10px 25px; + input {width: 60%;} + label {margin-right: 10px;} + } + textarea { + vertical-align: middle; + border-radius: 5px; + padding: 5px; + width: 60%; + height: 36px; + resize: none; + } + + + + //表格样式 + .overflowTable { + width: 95%; + margin: 0 auto; + max-height: 300px; + overflow-y: auto; + } + .detailsTable { + margin: 10px 0; + table { + width: 100%; + text-align: center; + border-collapse:collapse; + word-break:break-all; + word-wrap:break-all; + table-layout:fixed; + th { + height: 35px; + //border: 1px solid #999; + } + td { + height: 35px; + //border: 1px solid #999; + } + tr:nth-child(odd){ + background: #F2F9FF; + } + } + } + + + + //滚动条样式 + ::-webkit-scrollbar{ + width: 5px; + background-color: white; + } + ::-webkit-scrollbar-thumb{ + background-color: #999; + } + + + + //img图片列表页面 + .imageList { + width: 100%; + height: 100%; + overflow-y: auto; + .imageListBox { + width: 100%; + height: 90%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + .imagesBox { + width: 300px; + height: 200px; + margin: 0 11px 0 11px; + display: inline-block; + img { + border: 1px solid #999; + width: auto; + height: auto; + max-width: 100%; + height: 170px; + cursor:pointer; + } + } + } + } + \ No newline at end of file diff --git a/src/app/gis-management/fire-facilities/fire-facilities.component.spec.ts b/src/app/gis-management/fire-facilities/fire-facilities.component.spec.ts new file mode 100644 index 0000000..60c9bef --- /dev/null +++ b/src/app/gis-management/fire-facilities/fire-facilities.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FireFacilitiesComponent } from './fire-facilities.component'; + +describe('FireFacilitiesComponent', () => { + let component: FireFacilitiesComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FireFacilitiesComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FireFacilitiesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/gis-management/fire-facilities/fire-facilities.component.ts b/src/app/gis-management/fire-facilities/fire-facilities.component.ts new file mode 100644 index 0000000..6fb00eb --- /dev/null +++ b/src/app/gis-management/fire-facilities/fire-facilities.component.ts @@ -0,0 +1,529 @@ +/* + * @Descripttion: + * @version: + * @Author: sueRimn + * @Date: 2020-11-23 09:28:54 + * @LastEditors: sueRimn + * @LastEditTime: 2020-11-27 16:25:30 + */ +import { Component, OnInit, ViewChild, Inject } from '@angular/core'; +import {HttpClient, HttpHeaders} from '@angular/common/http' +import { MatDialogRef, MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +//import { ImgsDataDetail2 } from './addGrouping.component' +import { MatSnackBarConfig, MatSnackBar } from '@angular/material/snack-bar'; +import { ImagesData2 } from './imagesdata.component' +import { Router,ActivatedRoute } from '@angular/router' +export interface Food { + value: string; + name: string; +} + +@Component({ + selector: 'app-fire-facilities', + templateUrl: './fire-facilities.component.html', + styleUrls: ['./fire-facilities.component.scss'] +}) +export class FireFacilitiesComponent implements OnInit { + + constructor(private router:Router,private route:ActivatedRoute,public http: HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar) { } + + ngOnInit(): void { + this.getCompanyInformation() + this.getAllBuilding() + + } + unitId:any = sessionStorage.getItem('unitId') + //定义属性数据 + singleElection:Food[]=[ + {value:'true', name: '有'}, + {value:'false', name: '无'}] + + companyBuiltInGrouping:any = []; //单位消防设施内置分组 + companyDetails:any = []; //单位详情 + companyEachDetails:any = [] //单位每层详情 + companyOptionalGrouping:any = []; //单位消防设施可选分组 + open="详情" + down="收起" + imgsrcopen="../../../assets/images/routdown2.png" + imgsrcdown="../../../assets/images/routup2.png" + tableshow=true + + //获得单位基本信息 + getCompanyInformation () { + //let companyId = this.route.snapshot.queryParams.id + let companyId = this.unitId + this.http.get(`/api/Companies/${companyId}`).subscribe((data:any)=>{ + if (data.buildingTypes.length) { + let newData = {buildingType: data.buildingTypes[0].id,companyId : companyId} + this.http.get('/api/CompanyFacilities',{params:newData}).subscribe((data:any)=>{ //获得单位的消防设施 + this.companyBuiltInGrouping = data[0].summary.companyFacilityGroups + this.companyOptionalGrouping = data[0].summary.companyOptionalGroups + this.companyDetails = data[0].details + this.companyEachDetails = data[0].eachDetails + this.companyBuiltInGrouping.forEach(element => { //循环单位内置分组项 + element.selectBuiltInGrouping = [] + element.facilityItems.forEach((elements,index) => { + elements.total = element.facilityCount[index] + elements.expanded = false}); + }); + if(sessionStorage.getItem("tabsindex") == "4"){ + this.companyBuiltInGrouping = [this.companyBuiltInGrouping[1]] + this.companyOptionalGrouping = [] + } + if(sessionStorage.getItem("tabsindex") == "5"){ + this.companyBuiltInGrouping.splice(1,1) + } + }) //http + } //if + + }) + } + + //创建单位消防设施内置分组项 + addCompanyGrouping (e) { + let data = e + let dialogRef = this.dialog.open(ImagesData2,{data}); + dialogRef.afterClosed().subscribe(data=>{ + if (data) { e.facilityItems.push(data) } }); + } + + //保存单位消防设施内置分组项 + editCompanyGrouping(e) { + let header = {groupId:e.id} + let data = [] + e.facilityItems.forEach((element,index) => { + let msg = { + isBuiltin: element.isBuiltin, + details: element.details, + name: element.name, + isEachFloor: element.isEachFloor, + order: element.order} + data.push(msg) + if (index==e.facilityItems.length-1) { + this.http.post('/api/CompanyFacilityItems/Batch',data,{params:header}).subscribe(data=>{ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据更新成功','确定',config); + }) } + }); //forEach + + } + + //checked单位消防设施内置分组项时 + checkedCompany (e,item,items) { + if (e.checked) { + item.selectBuiltInGrouping.push(items) + } else { + item.selectBuiltInGrouping.splice(item.selectBuiltInGrouping.findIndex(oldItem => oldItem == items), 1) + } + } + + //删除消防设施内置分组项 + deleteCompanyGrouping (e) { + if (e.selectBuiltInGrouping.length) { + let isDelete = confirm('您确定要删除吗') + if (isDelete) { + let msg:any = `?groupId=${e.id}` + e.selectBuiltInGrouping.forEach((element,index) => { + let data = `&name=${element.name}` + msg = msg + data + if (index === e.selectBuiltInGrouping.length-1) { + this.http.delete('/api/CompanyFacilityItems/Batch' + msg).subscribe(data=>{ + let deleteMsg = e.selectBuiltInGrouping + deleteMsg.forEach(deleteElement => { + e.facilityItems.splice(e.facilityItems.findIndex(item=>item.name==deleteElement.name),1) + }); + e.selectBuiltInGrouping = [] + + }) //http + } //if + }); //forEach + } + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择内置分组项','确定',config); + } + } + + //保存单位消防设施可选分组 + editCompanyOptional (e,item) { + e.stopPropagation() //阻止冒泡 + item.propertyInfos.forEach((element,index) => { + element.propertyValue = String(element.propertyValue) + if (index == item.propertyInfos.length-1 ) { + this.http.post('/api/CompanyOptionalGroups',item).subscribe(data=>{ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据更新成功','确定',config); + }) + } //if + }); + } + + //单位消防设施切换展开面板 + SwitchBoard (e) { + e.expanded = !e.expanded + if (e.expanded) { //展开面板展开时 + if (e.isEachFloor) { //逐层统计时 + let data = this.companyEachDetails[e.name] + if (data) { + e.loopTable = [] + data.forEach(item => { + let tableMsg = {name:item.name, header:[], body:[]} + item.assets[0].propertyInfos.forEach(element => { //表头 + if (element.propertyType!=3) { + let unit = element.physicalUnit? '('+ element.physicalUnit +')' : '' //单位 + tableMsg.header.push(element.propertyName+unit)} + }); + item.assets.forEach(element => { //表格内容 + let everyBody = {} + element.propertyInfos.forEach((elements,index) => { + if (elements.propertyType!=3 && elements.propertyName!='图片' && elements.propertyType!=6) { + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = elements.propertyValue } + if (elements.propertyType==6) { + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = elements.propertyValue=='1'?'是':'否' } + if (elements.propertyType!=3 && elements.propertyName=='图片') { + let imgLength = [] + element.propertyInfos.find(item=>{ if(item.propertyType==3){imgLength.push(item)} }) + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = String(imgLength.length) } + + }); //propertyInfos + tableMsg.body.push(everyBody) + }); //assets + e.loopTable.push(tableMsg) + }); + + } //data有数据时 + } else { //非逐层统计时 + let data = this.companyDetails[e.name] + if (data) { + e.header = [] + e.body = [] + data[0].propertyInfos.forEach(element => { //表头 + if (element.propertyType!=3) { + let unit = element.physicalUnit? '('+ element.physicalUnit +')' : '' //单位 + e.header.push(element.propertyName+unit)} + }); + data.forEach(element => { //表格内容 + let everyBody = {} + element.propertyInfos.forEach((elements,index) => { + if (elements.propertyType!=3 && elements.propertyName!='图片' && elements.propertyType!=6) { + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = elements.propertyValue } + if (elements.propertyType==6) { + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = elements.propertyValue=='1'?'是':'否' } + if (elements.propertyType!=3 && elements.propertyName=='图片') { + let imgLength = [] + element.propertyInfos.find(item=>{ if(item.propertyType==3){imgLength.push(item)} }) + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = String(imgLength.length) } + + }); + e.body.push(everyBody) + }); + + } + } //非逐层统计时 + + + } + } + + + + allBuildingGrouping:any; //所有建筑的消防设施 内置分组+可选分组 + //获取所有建筑 + getAllBuilding () { + let companyId = this.unitId + this.http.get('/api/Buildings',{params:{ + companyId:companyId + }}).subscribe((data:any)=>{ + this.allBuildingGrouping = data + if (this.allBuildingGrouping.length) { this.getAllBuildingFacilities() } + }) + } + + //获取所有建筑的消防设施 + getAllBuildingFacilities () { + let companyId = this.unitId + this.allBuildingGrouping.forEach(element => { + let header = {buildingId: element.id, buildingType: element.buildingTypes[0].id,companyId:companyId} + this.http.get('/api/BuildingFacilities',{params:header}).subscribe(data=>{ + element.buildingFacilityGroups = data[0].summary.buildingFacilityGroups + element.buildingOptionalGroups = data[0].summary.buildingOptionalGroups + element.buildingDetails = data[0].details + element.buildingEachDetails = data[0].eachDetails + element.buildingFacilityGroups.forEach((elements) => { //循环每个建筑内置分组项 + elements.selectBuiltInGrouping = [] + elements.facilityItems.forEach((newElement,index) => { + newElement.total = elements.facilityCount[index] + newElement.expanded = false }); + }); + + if(sessionStorage.getItem("tabsindex") == "4"){ + element.buildingFacilityGroups = [element.buildingFacilityGroups[1]] + element.buildingOptionalGroups = [] + } + if(sessionStorage.getItem("tabsindex") == "5"){ + element.buildingFacilityGroups.splice(1,1) + } + }) + + }); + + } + + + + //保存建筑消防设施内置分组项 + editBuildingGrouping (e,item) { + let companyId = this.unitId + let header = {companyId:companyId,buildingId:e.id, groupId:item.id} + let data = [] + item.facilityItems.forEach((element,index) => { + let msg = { + isBuiltin: element.isBuiltin, + details: element.details, + name: element.name, + isEachFloor: element.isEachFloor, + order: element.order} + data.push(msg) + if (index==item.facilityItems.length-1) { + this.http.post('/api/BuildingFacilityItems/Batch',data,{params:header}).subscribe(data=>{ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据更新成功','确定',config); + }) } + }); //forEach + + } + + + + //保存建筑消防设施可选分组 + editBuildingOptional (e,item) { + let companyId = this.unitId + e.stopPropagation() //阻止冒泡 + item.propertyInfos.forEach((element,index) => { + element.propertyValue = String(element.propertyValue) + if (index == item.propertyInfos.length-1 ) { + this.http.post('/api/BuildingOptionalGroups',item,{params:{ + companyId :companyId + }}).subscribe(data=>{ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据更新成功','确定',config); + }) + } //if + }); + } + + //建筑消防设施切换展开面板 + SwitchBuildingBoard (item,e) { + e.expanded = !e.expanded + if (e.expanded) { //展开面板展开时 + if (e.isEachFloor) { //逐层统计时 + let data = item.buildingEachDetails[e.name] + if (data) { + e.loopTable = [] + data.forEach(item => { + let tableMsg = {name:item.name, header:[], body:[]} + item.assets[0].propertyInfos.forEach(element => { //表头 + if (element.propertyType!=3) { + let unit = element.physicalUnit? '('+ element.physicalUnit +')' : '' //单位 + tableMsg.header.push(element.propertyName+unit)} + }); + item.assets.forEach(element => { //表格内容 + let everyBody = {} + element.propertyInfos.forEach((elements,index) => { + if (elements.propertyType!=3 && elements.propertyName!='图片' && elements.propertyType!=6) { + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = elements.propertyValue } + if (elements.propertyType==6) { + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = elements.propertyValue=='1'?'是':'否' } + if (elements.propertyType!=3 && elements.propertyName=='图片') { + let imgLength = [] + element.propertyInfos.find(item=>{ if(item.propertyType==3){imgLength.push(item)} }) + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = String(imgLength.length) } + + }); //propertyInfos + tableMsg.body.push(everyBody) + }); //assets + e.loopTable.push(tableMsg) + }); + + } //data有数据时 + } else { //非逐层统计时 + let data = item.buildingDetails[e.name] + if (data) { + e.header = [] + e.body = [] + data[0].propertyInfos.forEach(element => { //表头 + if (element.propertyType!=3) { + let unit = element.physicalUnit? '('+ element.physicalUnit +')' : '' //单位 + e.header.push(element.propertyName+unit)} + }); + data.forEach(element => { //表格内容 + let everyBody = {} + element.propertyInfos.forEach((elements,index) => { + if (elements.propertyType!=3 && elements.propertyName!='图片' && elements.propertyType!=6) { + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = elements.propertyValue } + if (elements.propertyType==6) { + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = elements.propertyValue=='1'?'是':'否' } + if (elements.propertyType!=3 && elements.propertyName=='图片') { + let imgLength = [] + element.propertyInfos.find(item=>{ if(item.propertyType==3){imgLength.push(item)} }) + let unit = elements.physicalUnit? '('+ elements.physicalUnit +')' : '' //单位 + everyBody[elements.propertyName+unit] = String(imgLength.length) } + + }); + e.body.push(everyBody) + }); + + } + } //非逐层统计时 + + + + } + } + + //单位消防设施预览图片 + previewImg (e) { + if (e.isEachFloor) { //逐层统计时 + let newData = this.companyEachDetails[e.name] + if (newData) { + let data = {name:e.name, images:[]} + let imgName + newData.forEach(item => { + item.assets.forEach(element => { + element.propertyInfos.forEach( elements => { + if (elements.propertyName.includes('名称')) {imgName = elements.propertyValue} + if (elements.propertyType===3) { + elements.propertyName = imgName + data.images.push(elements)} }); + }); + }); //newDate + + if (data.images.length) { + let dialogRef = this.dialog.open(ImagesData2,{width:'1350px',height:'700px',data}); //打开图片弹窗 + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); + } + + } else{ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); } + } else { //非逐层统计时 + let newData = this.companyDetails[e.name] + let imgName + if (newData) { + let data = {name:e.name, images:[]} + newData.forEach(element => { + element.propertyInfos.forEach(elements => { + if (elements.propertyName.includes('名称')) {imgName = elements.propertyValue} + if (elements.propertyType===3) { + elements.propertyName = imgName + data.images.push(elements)} }); + }); + if (data.images.length) { + let dialogRef = this.dialog.open(ImagesData2,{width:'1350px',height:'700px',data}); //打开图片弹窗 + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); + } + + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); } + } + + } + + //建筑消防设施预览图片 + previewBuildingImg (item,e) { + if (e.isEachFloor) { //逐层统计时 + let newData = item.buildingEachDetails[e.name] + if (newData) { + let data = {name:e.name, images:[]} + let imgName + newData.forEach(item => { + item.assets.forEach(element => { + element.propertyInfos.forEach( elements => { + if (elements.propertyName.includes('名称')) {imgName = elements.propertyValue} + if (elements.propertyType===3) { + elements.propertyName = imgName + data.images.push(elements)} }); + }); + }); //newDate + + if (data.images.length) { + let dialogRef = this.dialog.open(ImagesData2,{width:'1350px',height:'700px',data}); //打开图片弹窗 + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); + } + + } else{ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); } + } else { //非逐层统计时 + let newData = item.buildingDetails[e.name] + let imgName + if (newData) { + let data = {name:e.name, images:[]} + newData.forEach(element => { + element.propertyInfos.forEach(elements => { + if (elements.propertyName.includes('名称')) {imgName = elements.propertyValue} + if (elements.propertyType===3) { + elements.propertyName = imgName + data.images.push(elements)} + }); + }); + if (data.images.length) { + let dialogRef = this.dialog.open(ImagesData2,{width:'1350px',height:'700px',data}); //打开图片弹窗 + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); + } + + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); } + } + + } + + +} diff --git a/src/app/gis-management/fire-facilities/imagesdata.component.html b/src/app/gis-management/fire-facilities/imagesdata.component.html new file mode 100644 index 0000000..534df3e --- /dev/null +++ b/src/app/gis-management/fire-facilities/imagesdata.component.html @@ -0,0 +1,9 @@ +
+
{{data.name}}
+
+
+ + +
+
+
\ No newline at end of file diff --git a/src/app/gis-management/fire-facilities/imagesdata.component.ts b/src/app/gis-management/fire-facilities/imagesdata.component.ts new file mode 100644 index 0000000..d82be4e --- /dev/null +++ b/src/app/gis-management/fire-facilities/imagesdata.component.ts @@ -0,0 +1,90 @@ +/* + * @Descripttion: + * @version: + * @Author: sueRimn + * @Date: 2020-11-23 09:46:16 + * @LastEditors: sueRimn + * @LastEditTime: 2020-11-23 09:53:45 + */ +import { Component, OnInit, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import Swiper from 'swiper'; + + + +@Component({ + selector: 'imagesdata', + templateUrl: './imagesdata.component.html', + styleUrls: ['./fire-facilities.component.scss'] + }) +export class ImagesData2 { + + constructor(private http: HttpClient,public dialogRef: MatDialogRef,@Inject(MAT_DIALOG_DATA) public data,public dialog: MatDialog) {} + + ngOnInit(): void { + this.data.images.forEach(element => { + element.newImageUrl = `${element.propertyValue}?x-oss-process=image/resize,m_fill,h_170,w_299` + }); + } + + //查看大图 + seeImage (index) { + let data = { + allImages:this.data.images, + imgIndex: index} + let dialogRef = this.dialog.open(previewBigImg2, + {width: '1600px', + height:'900px',data}); + } + +} + + + +@Component({ + selector: 'previewBigImg', + templateUrl: './previewImg.html', + styleUrls: ['./realistic-picture.component.scss'] +}) +export class previewBigImg2 { + + constructor(private http:HttpClient,public dialog: MatDialog,public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data) { } + testSwiper: Swiper; + + ngOnInit(): void { + this.allImages = this.data.allImages + this.allImages.forEach(element => { + element.previewImageUrl = `${element.propertyValue}?x-oss-process=image/auto-orient,1` //处理图片URL地址 + }); + } + + ngAfterViewInit() { + this.testSwiper = new Swiper('.swiper-container', { + lazy: true, + initialSlide: this.data.imgIndex, + direction: 'horizontal', + loop: false, + + + + // 如果需要前进后退按钮 + navigation: { + nextEl: '.swiper-button-next', + prevEl: '.swiper-button-prev', + } + }); + } + + allImages:any; //展示所有的图片 + rotationAngle:number=0; //旋转角度 + + //旋转图片 + rotate () { + this.rotationAngle = this.rotationAngle+90 + if (this.rotationAngle === 360) {this.rotationAngle = 0} + } + +} + \ No newline at end of file diff --git a/src/app/gis-management/fire-facilities/previewImg.html b/src/app/gis-management/fire-facilities/previewImg.html new file mode 100644 index 0000000..109fba0 --- /dev/null +++ b/src/app/gis-management/fire-facilities/previewImg.html @@ -0,0 +1,25 @@ + +
图片详情
+
+
+
+ +
+
+
+ + +
+
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/gis-management/fire-facilities/realistic-picture.component.scss b/src/app/gis-management/fire-facilities/realistic-picture.component.scss new file mode 100644 index 0000000..075375c --- /dev/null +++ b/src/app/gis-management/fire-facilities/realistic-picture.component.scss @@ -0,0 +1,174 @@ +.content { + margin: 0 0 0 10px; + width: 100%; + height: 100%; + overflow-y: auto; + display: flex; + .leftBox { + flex: 15%; + padding-top: 10px; + .bank { + display: flex; + padding-left: 10px; + .mat-icon {margin-right: 15px;} + } + } + .rightBox { + border-left: 1px solid #999; + flex: 85%; + display: flex; + flex-direction: column; + .topBox { + flex: 5%; padding: 10px; + display: flex; + :first-child {flex: 85%;}; + :last-child {flex: 15%;} + } + .bottomBox { + flex: 95%; + padding: 5px 0 0 25px; + overflow: auto; + .imgsBoxflex { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + } + } +} + +//icon统一样式 +.mat-icon { + cursor:pointer; + width: 18px; + height: 18px; + vertical-align:top; + margin-right: 10px; +} +.title {margin-right: 30px;font-weight: 500; font-size: 18px;} + +.material { + cursor:pointer; + height: 30px; + font-size: 16px; + margin-top: 10px; + padding-left: 15px; + span { + max-width: 200px; + display: inline-block; + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; + } + .btn { + color: #FFC122; + } +} +.imgBox{ + width: 300px; + height: 200px; + margin: 0 35px 35px 0; + display: inline-block; + position: relative; + .fixedImg { + width: 100%; + height: 170px; + text-align: center; + margin-bottom: 3px; + img { + width: auto; + height: auto; + max-width: 100%; + height: 100%; + cursor:pointer; + } + } + input{ + font-size:12px; + width: 100px; + height:18px; + border-radius:3px; + border:1px solid #c8cccf; + outline:0; + text-align:left; + padding-left: 5px; + display:inline-block; + cursor: pointer;} + input::-webkit-input-placeholder{ + color: #986655; + font-size: 12px; + } + a {display: inline-block; + width: 45px; + height: 24px; + line-height: 24px; + text-align: center; + border-radius: 3px; + background-color: #2196F3; + font-size: 14px; + color: #fff;} +} +.uploadFileFixed { + position: relative; + .uploadFile { + opacity:0; + display: inline-block; + width: 88px; + height: 36px; + position: absolute; + top: 0px; + left: 0px; + } +} +//分页 +.mat-paginator { + background-color: rgba(255,255,255,0); + padding-right: 10%; +} +.isLoading{ + display: inline-block; + margin-left: 15px; + top: 8px; +} + +//左侧实景图文件样式 +.leftFile { + background-color: rgba(225,225,225,0.8); +} +//选中图片样式 +.selectImg { + -webkit-filter: drop-shadow(0px 0px 5px #000); + filter: drop-shadow(0px 0px 5px #000); + border: 1px solid red; +} +.checkedImg { + position: absolute; + top: 1px; + right: 1px; + color:#00FF00; + font-size: 30px; + z-index: 999; +} +//预览图片旋转角度 +.rotateA {transform: rotate(90deg) scale(0.75);} +.rotateB {transform: rotate(180deg)} +.rotateC {transform: rotate(270deg) scale(0.75);} + + + +//预览图片 +.previewImgBox { + width: 1500px; + height: 700px; + text-align: center; + img{ + width: auto; + height: auto; + max-width: 100%; + height: 100%;} +} +.previewImgBottom { + text-align: center; + height: 30px; + margin: 20px auto; +} diff --git a/src/app/gis-management/function-partition/function-partition.component.html b/src/app/gis-management/function-partition/function-partition.component.html new file mode 100644 index 0000000..ffe3698 --- /dev/null +++ b/src/app/gis-management/function-partition/function-partition.component.html @@ -0,0 +1,64 @@ + +
+ + +
+
+ + + + + 单位功能分区 + + + +
+
+ 区域:{{item.region}} +
+
+ 面积:{{item.area}} +
+
+ 基本情况:{{item.details}} +
+
+
+
+
+ +
+ + + + + {{item.name}} + + + +
+
+ 区域:{{item.region}} +
+
+ 面积:{{item.area}} +
+
+ 基本情况:{{item.details}} +
+
+
+
+
+ +
+ +
+ diff --git a/src/app/gis-management/function-partition/function-partition.component.scss b/src/app/gis-management/function-partition/function-partition.component.scss new file mode 100644 index 0000000..df4d0d5 --- /dev/null +++ b/src/app/gis-management/function-partition/function-partition.component.scss @@ -0,0 +1,81 @@ +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + scrollbar-width: none; /* Firefox */ +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} +.content { + width: 100%; + height: 100%; + overflow-y: auto; + //padding: 10px 0 0 10px; + display: flex; + .column{ + width: 100%; + display: flex; + flex-direction: column; + border-bottom: 1px solid #EEF1F5; + .up{ + width: 100%; + margin-top: 3%; + } + .areacenter{ + margin-top: 1%; + } + .down{ + margin-top: 1%; + margin-bottom: 2%; + } + span{ + margin-left: 8%; + //@at-root: 5%; + } + } +} +.center{ + width: 100%; + height: 100%; + display: flex; + flex-direction: column; +} +.tableContent { + //margin-left: 10px; + width: 100%; + height: 100%; + .panelhead{ + height: 44px; + background-color: #F2F9FF; + } + table { + border:1px solid #0094ff; + border-collapse:collapse; + td,th{ + border:1px solid #0094ff; + } + width: 90%; + text-align: center; + margin: 0 auto; + .cdk-header-cell { + text-align: center; + } + textarea { + border-radius: 5px; + padding: 5px; + width: 80%; + height: 36px; + resize: none; + scrollbar-base-color:#0080FF; + } + } +} + +//icon统一样式 +.mat-icon { + cursor:pointer; +} \ No newline at end of file diff --git a/src/app/gis-management/function-partition/function-partition.component.spec.ts b/src/app/gis-management/function-partition/function-partition.component.spec.ts new file mode 100644 index 0000000..9dd9485 --- /dev/null +++ b/src/app/gis-management/function-partition/function-partition.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FunctionPartitionComponent } from './function-partition.component'; + +describe('FunctionPartitionComponent', () => { + let component: FunctionPartitionComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FunctionPartitionComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FunctionPartitionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/gis-management/function-partition/function-partition.component.ts b/src/app/gis-management/function-partition/function-partition.component.ts new file mode 100644 index 0000000..ddea38b --- /dev/null +++ b/src/app/gis-management/function-partition/function-partition.component.ts @@ -0,0 +1,219 @@ +import { Component, OnInit, Inject } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar'; +import { Router,ActivatedRoute } from '@angular/router' + +@Component({ + selector: 'app-function-partition', + templateUrl: './function-partition.component.html', + styleUrls: ['./function-partition.component.scss'] +}) +export class FunctionPartitionComponent implements OnInit { + + constructor(private router:Router,private route:ActivatedRoute,private http:HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar) { } + + ngOnInit(): void { + this.companyId = this.unitId + this.getAllCompany() + this.getAllBuilding() + } + + displayedColumns: string[] = ['checked', 'region', 'measure', 'situation']; + unitId:any = sessionStorage.getItem('unitId') + + companyId:any; //单位编号 + companyFunctionalZoning:any=[]; //所有单位功能分区属性 + selectFunctionalZoning:any=[]; //选中的单位功能分区属性 + + //获得所有单位功能分区属性 + getAllCompany () { + let companyId = this.unitId + this.http.get('/api/CompanyFunctionalDivisions',{params:{ + companyId:companyId + }}).subscribe((data:any)=>{ + this.companyFunctionalZoning = data + this.selectFunctionalZoning = [] + }) + } + + //新建单位功能分区属性 + addCompany () { + let companyId = this.route.snapshot.queryParams.id + let data = {companyId:companyId, region:'', area:0, details:''} + this.companyFunctionalZoning.push(data) + this.preservation() + } + + //保存单位功能分区属性 + preservation () { + let companyId = this.unitId + if (this.companyFunctionalZoning.length) { + this.http.post('/api/CompanyFunctionalDivisions/Batch',this.companyFunctionalZoning,{params:{ + companyId:companyId + }}).subscribe(data=>{ + this.getAllCompany() + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据更新成功','确定',config); + }) + } + } + + //单位功能分区checked选择 + changeCompany (ele,e) { + if (e.checked) { + this.selectFunctionalZoning.push(ele.id) + } else { + this.selectFunctionalZoning.splice(this.selectFunctionalZoning.findIndex(item => item === ele.id), 1) + } + } + + //删除单位功能分区属性 + delete () { + let companyId = this.unitId + if (this.selectFunctionalZoning.length) { + let isDelete = confirm('您确定要删除吗') + if (isDelete) { + this.http.post('/api/CompanyFunctionalDivisions/Batch',this.companyFunctionalZoning,{params:{ + companyId:companyId + }}).subscribe(data=>{ + const options = { + headers: new HttpHeaders({'Content-Type': 'application/json',}), + body:this.selectFunctionalZoning} + this.http.delete(`/api/CompanyFunctionalDivisions/Batch`,options).subscribe(data=>{ + this.getAllCompany() + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据更新成功','确定',config); + }) + }) + } + } else if (!this.selectFunctionalZoning.length) { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择单位功能分区','确定',config); + } + } + + + + + + //建筑功能分区↓ + allBuilding:any = []; //所有建筑 + allBuildingFunctionalZoning:any = []; //所有建筑的功能分区 + selectBuildingFunctionalZoning:any = []; //选中的建筑的功能分区 + + //获得所有建筑 + getAllBuilding () { + let companyId = this.unitId + this.http.get(`/api/Buildings`,{params:{ + companyId:companyId + }}).subscribe((data:any)=>{ + if (data.length) { + this.allBuilding = data + this.allBuilding.forEach(element => { //为每个建筑添加一个 功能分区对象 + element.functionalZoning = null + }); + this.getAllBuildingFunctionalZoning() + } + }) + } + + //获得所有建筑的功能分区 + getAllBuildingFunctionalZoning () { + this.selectBuildingFunctionalZoning = [] + this.allBuildingFunctionalZoning = [] + this.allBuilding.forEach(element => { + let data={buildingId: element.id} + this.http.get(`/api/BuildingFunctionalDivisions`,{params:data}).subscribe((data:any)=>{ + if (data.length) { + element.functionalZoning = data + this.selectBuildingFunctionalZoning.push([]) //拥有建筑功能分区的提前push空数组 + this.allBuildingFunctionalZoning.push(element) } + }) + }); + } + + //封装函数刷新当前建筑功能分区 + updateCurrent (e,index) { + let data= {buildingId: e.id} + this.http.get(`/api/BuildingFunctionalDivisions`,{params:data}).subscribe((data:any)=>{ + this.selectBuildingFunctionalZoning[index] = [] + this.allBuildingFunctionalZoning[index].functionalZoning = data + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据更新成功','确定',config); + }) + } + + //创建建筑功能分区 + addPartition () { + } + + //创建建筑功能分区属性 + addBuilding (e,index) { + let data = {buildingId:e.id, region:'', area:0, details:''} + this.http.post('/api/BuildingFunctionalDivisions',data).subscribe(data=>{ + this.preservationBuilding(e,index) + }) + } + + //保存建筑功能分区属性 + preservationBuilding (e,index) { + let data ={buildingId:e.id} + this.http.post(`/api/BuildingFunctionalDivisions/Batch`,this.allBuildingFunctionalZoning[index].functionalZoning,{params:data}).subscribe(data=>{ + this.updateCurrent(e,index) + }) + } + + //建筑功能分区checked选择 + changeBuilding (ele,e,index) { + if (e.checked) { + this.selectBuildingFunctionalZoning[index].push(ele.id) + } else { + this.selectBuildingFunctionalZoning[index].splice(this.selectBuildingFunctionalZoning[index].findIndex(item => item === ele.id), 1) + } + } + + //删除建筑功能分区 + deleteBuilding (e,index) { + if (this.selectBuildingFunctionalZoning[index].length) { + let isDelete = confirm('您确定要删除吗') + if (isDelete) { + let data ={buildingId:e.id} + this.http.post(`/api/BuildingFunctionalDivisions/Batch`,this.allBuildingFunctionalZoning[index].functionalZoning,{params:data}).subscribe(data=>{ + const options = { + headers: new HttpHeaders({'Content-Type': 'application/json',}), + body:this.selectBuildingFunctionalZoning[index], + params:{buildingId:e.id}} + this.http.delete(`/api/BuildingFunctionalDivisions/Batch`,options).subscribe(data=>{ + this.selectBuildingFunctionalZoning[index].forEach((element,newIndex) => { + this.allBuildingFunctionalZoning[index].functionalZoning.splice(this.allBuildingFunctionalZoning[index].functionalZoning.findIndex(item=>item.id==element),1) + if (newIndex==this.selectBuildingFunctionalZoning[index].length-1) { + if (this.allBuildingFunctionalZoning[index].functionalZoning.length) { + this.updateCurrent(e,index) + } else { + this.selectBuildingFunctionalZoning.splice(index,1) + this.allBuildingFunctionalZoning.splice(index,1)} + } + }); + + + }) + }) + } + } else if (!this.selectBuildingFunctionalZoning[index].length) { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择建筑功能分区','确定',config); + } + } + +} diff --git a/src/app/gis-management/gis-labeling/downloadFile.html b/src/app/gis-management/gis-labeling/downloadFile.html new file mode 100644 index 0000000..ceffd2b --- /dev/null +++ b/src/app/gis-management/gis-labeling/downloadFile.html @@ -0,0 +1,21 @@ +
+ 选择要下载的文件: + + +
+ insert_drive_file + {{item.fileName ? item.fileName : name }} + 文件大小:{{ item.filePige }} M + check_circle +
+ + + +
+ + +
+ + + +
\ No newline at end of file diff --git a/src/app/gis-management/gis-labeling/downloadFile.scss b/src/app/gis-management/gis-labeling/downloadFile.scss new file mode 100644 index 0000000..238205b --- /dev/null +++ b/src/app/gis-management/gis-labeling/downloadFile.scss @@ -0,0 +1,12 @@ +.fileDiv{ + cursor: pointer; +} +.fileDiv:hover{ + background-color: #fafafa; +} +.btn{ + text-align: center; + button{ + margin: 0 3px; + } +} \ No newline at end of file diff --git a/src/app/gis-management/gis-labeling/gis-labeling.component.html b/src/app/gis-management/gis-labeling/gis-labeling.component.html index 14ea061..331be05 100644 --- a/src/app/gis-management/gis-labeling/gis-labeling.component.html +++ b/src/app/gis-management/gis-labeling/gis-labeling.component.html @@ -1,3 +1,204 @@ -
+
+
+
+ +
+
+ + + +
+
+
+

{{item.name?item.name : '暂无单位名称'}}

+

{{item.address?item.address : '暂无单位地址'}}

+
+
+
+ + + +
+
+ + + +
import_export
+
+
+ + + + + +
+
+ + + + + +
+
+
+
+
+ + +
+
+ + +
+
+ + {{item.road? item.road + '>' : null}} +
+
+

+
+
+

+

+

+

+

+

+

+

+ +
+
+

+
+
+
+ + + +
+ +
+ + + + + +
+ +
+
+ + {{item.name}} +
+
+ +
+
+ +
+
+ 全选 + clear +
+
+ + {{keyUnitList[i].name}} + +
+
+
+ 显示范围 : + + + +
+ + + +
+ +
+
+
+
+
+ 全选 + clear +
+
+ + {{waterList[i].name}} + +
+
+
+ 显示范围 : + + + +
+ + + +
+ +
+
+
+
+  距离测量 +  面积测量 +
+ +
+
+
+ 图层 +
+ 卫星图层 + 路网图层 + clear +
+
+
+
+ + 2D +
+
+ + 3D +
+
+ +
+
+
+
diff --git a/src/app/gis-management/gis-labeling/gis-labeling.component.scss b/src/app/gis-management/gis-labeling/gis-labeling.component.scss index feb03fd..c234832 100644 --- a/src/app/gis-management/gis-labeling/gis-labeling.component.scss +++ b/src/app/gis-management/gis-labeling/gis-labeling.component.scss @@ -1,84 +1,366 @@ -.mapbox{ - width: 100%; - height: 100%; +.content { + width: 100%; + height: 100%; + min-width: 1024px; + min-height: 768px; + box-sizing: border-box; + padding: 1px; + position: relative; + #map { width: 100%; height: 100%; } } +//左侧工作区 +.leftDiv { + width: 400px; + height: 100%; + background-color: #fff; + overflow: hidden; + position: absolute; + left: 0px; + top: 0px; + z-index: 10; + box-sizing: border-box; + padding: 3px; +} +//左侧工作区 显隐图标 +.publicButton { + display: block; + width: 30px; + height: 30px; + color: #fff; + position: absolute; + top: 50%; + margin-top: -15px; + z-index: 11; + cursor:pointer; +} +.leftHide { + left: 400px; +} +.leftShow { + left: 0px;; +} +.leftDivShow { + margin-left: 0px; + transition: margin-left 0.5s; +} +.leftDivHide { + margin-left: -500px; + transition: margin-left 0.5s; +} +//文本溢出 +.overflowText { + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; +} +.mat-icon, label, button, p, span {cursor:pointer;} +//左上搜索 +.searchInput { + width: 340px; + max-height: 500px; + overflow: hidden; + position: absolute; + left: 30px; + top: 15px; + z-index: 5; + display: flex; + flex-direction: column; + .clearIcon { + position: absolute; + color: rgb(73, 71, 71); + top: 0px; + right: 40px; + width: 36px; + height: 36px; + display: inline-block; + font-size: 24px; + text-align: center; + } + .searchDataDiv { + background-color: #fff; + flex: 1; + overflow-y: auto; + border-right: 1px solid rgb(228, 225, 225); + box-shadow: inset 0px 0px 3px #bdb8b8; + } + input { + width: 300px; + height: 36px; + outline: none; + border-radius: 8px 0 0 8px; + box-sizing: border-box; + padding-left: 5px; + border: 1px solid rgb(228, 225, 225); + } + button { + width: 40px; + height: 36px; + border-radius: 0px 8px 8px 0; + float: right; + border: none; + outline: none; + background-color: #0080FF; + .mat-icon { + font-size: 26px; + vertical-align: bottom; + color: #fff; + } + } + .searchCompany { + width: 100%; + height: 26px; + margin: 3px 0; + box-sizing: border-box; + display: flex; + align-items: center; + justify-self: center; + p { flex: 1; font-size: 14px; padding-left: 10px; } + :last-child { color: #999; font-size: 10px; } + } +} +.searchCompany:hover { background-color: rgb(228, 228, 228);cursor:pointer; } +//左侧导航路线 +.routeGIS { + width: 340px; + max-height: 700px; + overflow: hidden; + position: absolute; + border-radius: 10px; + background-color: #0080FF; + left: 30px; + top: 15px; + z-index: 6; + display: flex; + flex-direction: column; + .routeHeader { + width: 100%; + height: 130px; + min-height: 130px; + position: relative; + display: flex; + align-items: center; + justify-content: center; + .routeLeft { + width: 26px; + text-align: center; + margin: 0 5px; + box-sizing: border-box; + .mat-icon { font-size: 24px; color: #fff; } + } + .routeContent { + flex: 1; + //起点终点 input + .routeEveryRow { + position: relative; + height: 30px; + margin: 3px 0; + label { position: absolute; color: #fff; } + .routeText { + font-size: 14px; + top: 5.5px; + left: 5px; + } + .routeClear { + top: 0px; + right: 18px; + font-size: 20px; + } + input { + width: 80%; + padding-left: 25px; + height: 30px; + border-radius: 5px; + border: none; + outline: none; + color: #fff; + background-color: #0874DE; + } + } + } + } + //导航内容区 + .routeCenter::-webkit-scrollbar { + display: none; /* Chrome Safari */ + } + .routeCenter { + width: 100%; + overflow-y: auto; + scrollbar-width: none; /* Firefox */ + box-sizing: border-box; + background-color: #fff; + border-radius: 0 0 10px 10px; + border: 1px solid rgb(201, 197, 197); + >div { + width: 100%; + height: 30px; + line-height: 30px; + box-sizing: border-box; + margin: 5px 0; + font-size: 12px; + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; + } //div + >div:not(:first-child){ padding: 0 10px; box-sizing: border-box; } + .routeTypeExplain label { margin: 0 10px; } + .routeCenterTB { + p { display: inline-block; margin-right: 10px; width: 30px; height: 30px; border-radius: 50%; color: #fff; text-align: center; font-size: 14px; } + .orientation { color: #0080FF; } + } + } +} +.routeGISPublicIcon { position: absolute; color: #fff; font-size: 14px; } //导航 定位部分公共样式 +//选择路线 方案 button +.routeType { margin: 0 10px; outline: none; border: none; background-color: transparent; font-size: 14px; font-weight: 550; color: rgb(122, 116, 116); } +.selectRouteType { color: #0080FF; } +//右上角div +.rightTopBox{ + width: 480px; + position: absolute; + right: 30px; + top: 15px; + .topbox{ + width: 100%; + height: 40px; + display: flex; + justify-content: space-around; + background: #FFFFFF; + border-radius: 6px; + align-items: center; + .titleItem{ + cursor: pointer; + display: flex; + align-items: center; + color: #0080FF; + height: 100%; + img{ + margin-right: 5px; + } + span{ + font-size: 15px; + } + } + .selectedItem{ + border-bottom: 2px solid #0080FF; + } + } + .contantbox{ + width: 100%; + background: #fff; + margin-top: 3px; + border-radius: 6px; + .keyUnitBox,.waterBox,.coverageBox{ + box-sizing: border-box; + padding:8px 15px; + // cursor: default; + font-size: 14px; + color: #333333; + } + .inputList{ + .inputItem{ + margin-top: 8px; + display: flex; + flex-wrap: wrap; + mat-checkbox{ + margin-right: 15px; + } + } + .btnbox{ + display: flex; + align-items: center; + justify-content: space-between; + button{ + cursor: pointer; + } + .submit{ + width: 68px; + height: 30px; + text-align: center; + border: 0; + background: #0080FF; + opacity: 1; + border-radius: 4px; + color: #fff; + } + .cancel{ + width: 96px; + height: 30px; + background: #EEF1F5; + opacity: 1; + border-radius: 4px; + border: 0; + color: #333333; + } + } + } + .coverageBox{ + + .topbox{ + display: flex; + align-items: center; + justify-content: space-between; + } + .contantbox{ + display: flex; + align-items: center; + div{ + width: 140px; + height: 100px; + position: relative; + margin-right: 16px; + border: 2px solid #fff; + box-sizing: border-box; + img{ + width: 100%; + height: 100%; + cursor: pointer; + } + span{ + position: absolute; + right: 2px; + bottom: 2px; + display: inline-block; + background-color: #0080FF; + color: #fff; + padding: 0 2px; + } + } + .selectedPattern{ + border: 4px solid #0080FF; + } + } + } + } +} - - - - - -// .content-window-card { -// position: relative; -// box-shadow: none; -// bottom: 0; -// left: 0; -// width: auto; -// padding: 0; -// } - -// .content-window-card p { -// height: 20px; -// } - -// .custom-info { -// border: solid 1px silver; -// } -// div.info-top { -// position: relative; -// background: none repeat scroll 0 0 #F9F9F9; -// border-bottom: 1px solid #CCC; -// border-radius: 5px 5px 0 0; -// } - -// div.info-top div { -// display: inline-block; -// color: #333333; -// font-size: 14px; -// font-weight: bold; -// line-height: 31px; -// padding: 0 10px; -// } - -// div.info-top img { -// position: absolute; -// top: 10px; -// right: 10px; -// transition-duration: 0.25s; -// } - -// div.info-top img:hover { -// box-shadow: 0px 0px 5px #000; -// } - -// div.info-middle { -// font-size: 12px; -// padding: 10px 6px; -// line-height: 20px; -// } - -// div.info-bottom { -// height: 0px; -// width: 100%; -// clear: both; -// text-align: center; -// } - -// div.info-bottom img { -// position: relative; -// z-index: 104; -// } - -// span { -// margin-left: 5px; -// font-size: 11px; -// } - -// .info-middle img { -// float: left; -// margin-right: 6px; -// } +//测距离 +.distanceBox{ + box-sizing: border-box; + padding:8px 15px; + display: flex; + justify-content: center; + align-items: center; + div{ + display: flex; + align-items: center; + span{ + cursor: default; + } + } + .clearbutton{ + border: none; + border-radius: 4px; + background-color:#FF3636; + text-align: center; + padding: 8px 20px; + margin-left: 20px; + margin-top: 5px; + font-size: 14px; + color: #FFFFFF; + outline-color: #FFFFFF; + } +} diff --git a/src/app/gis-management/gis-labeling/gis-labeling.component.ts b/src/app/gis-management/gis-labeling/gis-labeling.component.ts index e6420cc..9c0b704 100644 --- a/src/app/gis-management/gis-labeling/gis-labeling.component.ts +++ b/src/app/gis-management/gis-labeling/gis-labeling.component.ts @@ -1,5 +1,11 @@ -import { Component, OnInit ,Renderer2,ElementRef } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Component, OnInit ,Renderer2,ElementRef, Inject, NgZone, ViewChild } from '@angular/core'; +import { FormBuilder,FormGroup, FormControl } from '@angular/forms'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar'; declare var AMap: any; +declare var QRCode: any; + @Component({ selector: 'app-gis-labeling', templateUrl: './gis-labeling.component.html', @@ -7,68 +13,1236 @@ declare var AMap: any; }) export class GisLabelingComponent implements OnInit { - constructor(private elementRef: ElementRef,public renderer2: Renderer2) { } - map:any //地图 + constructor(private elementRef: ElementRef,public renderer2: Renderer2,private http:HttpClient,public snackBar: MatSnackBar,public dialog: MatDialog,public _ngZone:NgZone,private fb: FormBuilder) { } + + //右上角div + selectedTitle:number + titleList = [ {name:'重点单位',iconImg:'/assets/images/uniticon.png'}, + {name:'水源',iconImg:'/assets/images/watericon.png'}, + {name:'测量工具',iconImg:'/assets/images/distanceicon.png'}, + /* {name:'测面积',iconImg:'/assets/images/areaicon.png'}, */ + {name:'图层选择',iconImg:'/assets/images/coverageicon.png'}] + keyUnitList:any = [] + waterList = [ + {id:'0',name:'消火栓',selected:false}, + {id:'1',name:'消防水池',selected:false}, + {id:'2',name:'天然水源',selected:false}, + // {id:'0',name:'单位地上消火栓',selected:false}, + // {id:'0',name:'单位地下消火栓',selected:false}, + // {id:'0',name:'市政地上消火栓',selected:false}, + // {id:'0',name:'消防水池',selected:false}, + // {id:'0',name:'方形储水池',selected:false}, + // {id:'0',name:'蓄水池',selected:false}, + // {id:'0',name:'原型水塔',selected:false}, + // {id:'0',name:'水库',selected:false}, + // {id:'0',name:'消防水箱',selected:false}, + // {id:'0',name:'码头',selected:false}, + // {id:'0',name:'海洋',selected:false}, + // {id:'0',name:'河流',selected:false}, + // {id:'0',name:'湖泊',selected:false}, + // {id:'0',name:'沟渠',selected:false} + ] + + keyUnitForm : FormGroup//gis右上角重点单位表单 + watertForm : FormGroup//gis右上角水源表单 + selectedUnitList:any = []//选择提交的单位 + selectedWaterList:any = []//选择提交的水源 + unitAreaDefault:any = '0'//默认单位范围 + waterAreaDefault:any = '0'//默认水源范围 + //获得单位循环出来的checkbox列表(formControl实例) + get units():any{ + return this.keyUnitForm.get('units') + } + get waters():any{ + return this.watertForm.get('waters') + } + async getAllBuildingType(){ + let result = await new Promise((result,reject)=>{ + this.http.get('/api/BuildingTypes/Simple').subscribe((data:any) => { + data.forEach(item => { + item.selected = false + }) + this.keyUnitList = data + result('获取单位类型') + }) + }) + } ngOnInit(): void { - - setTimeout(() => { - this.map = new AMap.Map('map'); - //给地图增加点击事件 - this.map.on('click', (ev)=>{ - // 触发事件的对象 - var target = ev.target; - - // 触发事件的地理坐标,AMap.LngLat 类型 - var lnglat = ev.lnglat; - - // 触发事件的像素坐标,AMap.Pixel 类型 - var pixel = ev.pixel; - - // 触发事件类型 - var type = ev.type; + window.setTimeout(()=>{ + this.mapInit() + },0) + let buildingType = this.getAllBuildingType()//获取建筑类型 + Promise.all([buildingType]).then(()=>{ + this.keyUnitForm = this.fb.group({ + units:this.buildUnits(), + allSelectedUnit:new FormControl(), + areaUnit:new FormControl() + }) + this.watertForm = this.fb.group({ + waters:this.waterUnits(), + allSelectedWater:new FormControl(), + areaWater:new FormControl() + }) + //将选中的push到数组 + this.units.valueChanges.subscribe(values => { + let selects:string[] = [] + values.forEach((selected:boolean,i:number) => { + selected === true && selects.push(this.keyUnitList[i].id) + }); + this.selectedUnitList = selects + }) + this.waters.valueChanges.subscribe(values => { + let selects:string[] = [] + values.forEach((selected:boolean,i:number) => { + selected === true && selects.push(this.waterList[i].id) + }); + this.selectedWaterList = selects + }) + this.unitSelected() + }) + } - let marker = new AMap.Marker({ - position:[lnglat.lng, lnglat.lat]//位置 + //构造重点单位checkbox控制器 + buildUnits() { + const arr = this.keyUnitList.map(item => { + return this.fb.control(item.selected); + }); + return this.fb.array(arr); + } + //构造水源checkbox控制器 + waterUnits() { + const arr = this.waterList.map(item => { + return this.fb.control(item.selected); + }); + return this.fb.array(arr); + } + //初始化获取勾选项 + unitSelected(){ + this.keyUnitList.forEach(item => { + if(item.selected){ + this.selectedUnitList.push(item.name) + } + }) + this.waterList.forEach(item => { + if(item.selected){ + this.selectedWaterList.push(item.name) + } + }) + } + //地图范围圆圈---重点单位 + circle = new AMap.Circle({ + center: null, + radius: 0, //半径 + strokeOpacity: 1, + fillOpacity: 0.4, + strokeStyle: 'dashed', + strokeDasharray: [10, 10], + // 线样式还支持 'dashed' + fillColor: '#1791fc', + zIndex: 50, + }) + //地图范围圆圈---水源 + circleofwater = new AMap.Circle({ + center: null, + radius: 0, //半径 + strokeOpacity: 1, + fillOpacity: 0.4, + strokeStyle: 'dashed', + strokeDasharray: [10, 10], + // 线样式还支持 'dashed' + fillColor: '#ee2200', + zIndex: 50, + }) + //重点单位提交 + ketUnitSubmit(value){ + if(this.markers.length == 0){ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请先选择一个单位','确定',config); + }else if(!this.mapPattern){ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请切换2D模式使用此功能','确定',config); + }else{ + console.log('提交',this.selectedUnit) + this.circle.setRadius(Number(this.unitAreaDefault)) + this.circle.setCenter(this.markers[0]._position) + this.circle.setMap(this.map) + let Distance + let lnglat = new AMap.LngLat(this.selectedUnit.location.x, this.selectedUnit.location.y) // lng, lat 替换成传入的坐标 + if(this.unitAreaDefault == '0'){ + this.circle.setRadius(this.Calculationofdistance(this.map.getBounds())/2) + Distance = Math.abs(lnglat.offset(0, this.Calculationofdistance(this.map.getBounds())/2).lat - this.selectedUnit.location.y) + }else{ + Distance = Math.abs(lnglat.offset(0, this.unitAreaDefault).lat - this.selectedUnit.location.y) + } + + let paramsdata:any = { + Lon : this.selectedUnit.location.x, + Lat : this.selectedUnit.location.y, + Distance : Distance, + BuildingTypeIdList : this.selectedUnitList.length != 0 ? this.selectedUnitList : ['123'] + } + console.log(666,paramsdata) + this.http.get("/api/Companies",{params:paramsdata}).subscribe((data:any) => { + data.items.forEach((i,index) => { + if(i.id == this.selectedUnit.id){ + data.items.splice(index,1) + } }) - // marker.content = '我是第' + (i + 1) + '个Marker'; - marker.setMap(this.map) - - AMap.event.addListener(marker, 'click', () => { - infoWindow.open(this.map, marker.getPosition()); - console.log(222,marker) - setTimeout(() => { - this.renderer2.listen(this.elementRef.nativeElement.querySelector('#lnglat2container'),'click',(event)=>{ - console.log(111) - }) - }, 0); - + this.createUnitMarker(data.items) + }) + } + } + //创建单位markers + unitMarkerList:any = [] + unitlabelsLayer:any + createUnitMarker(list){ + this.unitlabelsLayer ? this.map.remove(this.unitlabelsLayer) : null + this.unitMarkerList ? this.map.remove(this.unitMarkerList) : null + + let markerArr = [] + list.forEach((item) => { + let image + if(item.buildingTypes[0].name.indexOf('高层') != -1){ + image = '/assets/images/Highbuilding.png' + }else if(item.buildingTypes[0].name.indexOf('化工') != -1){ + image = '/assets/images/Chemicalindustry.png' + }else if(item.buildingTypes[0].name.indexOf('餐饮') != -1){ + image = '/assets/images/餐饮.png' + }else if(item.buildingTypes[0].name.indexOf('厂房') != -1){ + image = '/assets/images/厂房.png' + }else if(item.buildingTypes[0].name.indexOf('储罐') != -1){ + image = '/assets/images/储罐类.png' + }else if(item.buildingTypes[0].name.indexOf('地下') != -1){ + image = '/assets/images/地下.png' + }else if(item.buildingTypes[0].name.indexOf('古建筑') != -1){ + image = '/assets/images/古建筑.png' + }else if(item.buildingTypes[0].name.indexOf('轨道' || '地铁' || '交通') != -1){ + image = '/assets/images/轨道交通.png' + }else if(item.buildingTypes[0].name.indexOf('商场' || '超市') != -1){ + image = '/assets/images/商场超市.png' + }else if(item.buildingTypes[0].name.indexOf('隧道') != -1){ + image = '/assets/images/隧道.png' + }else if(item.buildingTypes[0].name.indexOf('危化品') != -1){ + image = '/assets/images/危化品.png' + }else if(item.buildingTypes[0].name.indexOf('学校' || '教育') != -1){ + image = '/assets/images/学校.png' + }else if(item.buildingTypes[0].name.indexOf('医院' || '医疗') != -1){ + image = '/assets/images/医院.png' + }else if(item.buildingTypes[0].name.indexOf('影' || '剧') != -1){ + image = '/assets/images/影剧院.png' + }else if(item.buildingTypes[0].name.indexOf('娱乐') != -1){ + image = '/assets/images/娱乐.png' + }else if(item.buildingTypes[0].name.indexOf('展览' || '景点' || '景区') != -1){ + image = '/assets/images/展览建筑.png' + }else{ + image = '/assets/images/其他.png' + } + var icon = { + // 图标类型,现阶段只支持 image 类型 + type: 'image', + // 图片 url + image: image, + // 图片尺寸 + size: [32, 32], + // 图片相对 position 的锚点,默认为 bottom-center + anchor: 'center', + }; + var text = { + // 要展示的文字内容 + content: item.name, + // 文字方向,有 icon 时为围绕文字的方向,没有 icon 时,则为相对 position 的位置 + direction: 'bottom', + // 在 direction 基础上的偏移量 + offset: [-3, -3], + // 文字样式 + style: { + // 字体大小 + fontSize: 12, + // 字体颜色 + fillColor: '#22886f', + // 描边颜色 + strokeColor: '#fff', + // 描边宽度 + strokeWidth: 2, + } + }; + var labelMarker = new AMap.LabelMarker({ + name: item.name, // 此属性非绘制文字内容,仅最为标识使用 + position: [item.location.x,item.location.y], + zIndex: 16, + // 将第一步创建的 icon 对象传给 icon 属性 + icon: icon, + // 将第二步创建的 text 对象传给 text 属性 + text: text, + }); + labelMarker.on('click', (e)=>{ + console.log(item) + let markerContent = + `
+
${item.name}
+
+
单位性质:
+
消防负责人:
+
+
+
防火级别:
+
消防管理人:
+
+
+
防火管辖:
+
防火监督员:
+
+
+
责任队站:
+
总建筑面积:
+
+
+
建筑信息分类:
+
总占地面积:
+
+
+
值班电话:
+
+
+
基本信息
+
导航
+
全景漫游
+
三维场景
+
查看预案
+
分享
+
+
` + // 创建一个自定义内容的 infowindow 实例 + this.infoWindow = new AMap.InfoWindow({ + position: [item.location.x,item.location.y], + offset: new AMap.Pixel(0, -30), + content: markerContent, }); + this.infoWindow.open(this.map); + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#baseInformation'),'click',(event)=>{ this.baseInformation(item) })//基本信息点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#route'),'click',(event)=>{ this.route(item) })//导航点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#fullViewNavigation'),'click',(event)=>{ this.fullViewNavigation(item) })//全景漫游点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#threeeScene'),'click',(event)=>{ this.threeeScene(item) })//三维场景点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#seePlan'),'click',(event)=>{ this.seePlan(item) })//查看预案点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#share'),'click',(event)=>{ this.share(item) })//分享点击事件 + }); + markerArr.push(labelMarker) + }) + this.unitlabelsLayer = new AMap.LabelsLayer({ + zooms: [3, 20], + zIndex: 1000, + // 该层内标注是否避让 + collision: false, + // 设置 allowCollision:true,可以让标注避让用户的标注 + // allowCollision: true, + }); + this.unitlabelsLayer.add(markerArr); + this.map.add(this.unitlabelsLayer);//增加图层 + this.unitMarkerList = markerArr + this.map.add(this.unitMarkerList);//将markers添加到图层上 + } + //取消单位markers + clearUnitMarker(){ + this.map.remove(this.unitlabelsLayer) + this.map.remove(this.unitMarkerList); + } + + //水源提交 + waterSubmit(value){ + if(this.markers.length == 0){ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请先选择一个单位','确定',config); + }else if(!this.mapPattern){ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请切换2D模式使用此功能','确定',config); + }else{ + this.createwaterMarker() + this.circleofwater.setRadius(Number(this.waterAreaDefault)) + this.circleofwater.setCenter(this.markers[0]._position) + this.circleofwater.setMap(this.map) + if(this.waterAreaDefault == '0'){ + this.circleofwater.setRadius(this.Calculationofdistance(this.map.getBounds())/2) + } + } + } + waterIconList = []; //展示的水源图标 + //循环渲染出所有水源markers + createwaterMarker(){ + this.waterIconList.forEach((element,index) => { this.map.remove(element) }); //先删除所有标点 + this.waterIconList = [] + let waterType = this.selectedWaterList //筛选出展示的 水源类型 + if (waterType.length) { + let x = JSON.parse( JSON.stringify(this.markers[0]._position[0]) ) //中心标注的 坐标 + let y = JSON.parse( JSON.stringify(this.markers[0]._position[1]) ) //中心标注的 坐标 + let positonList = [0.015, -0.035, 0.045, 0.061, -0.013, 0.029] + // 创建一个 Icon + let startIcon = new AMap.Icon({ + image: '../../../assets/images/fireHydrant.png', + imageSize: new AMap.Size(32, 32), }); + positonList.forEach((item,index)=>{ + let marker = new AMap.Marker({ + map: this.map, + position: index%2==0? JSON.parse( JSON.stringify([x+item,y-item]) ) : JSON.parse( JSON.stringify([x-item,y+item]) ), + icon: startIcon, + }); + this.waterIconList.push(marker) + }) + positonList.forEach((item,index)=>{ + let marker = new AMap.Marker({ + map: this.map, + position: index%2==0? JSON.parse( JSON.stringify([x+item,y+item]) ) : JSON.parse( JSON.stringify([x-item,y-item]) ), + icon: startIcon, + }); + this.waterIconList.push(marker) + }) + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择水源类型','确定',config); + } + } + + //计算两地距离 + Calculationofdistance(bounds){ + let p1 = [bounds.northEast.lng, bounds.northEast.lat]; + let p2 = [bounds.northEast.lng, bounds.southWest.lat]; + // 返回 p1 到 p2 间的地面距离,单位:米 + let dis = AMap.GeometryUtil.distance(p1, p2); + return dis + } + + //全选重点单位 + selectedAllUnit(event){ + if(event.checked){ + this.units.controls.forEach(item => {item.setValue(true)}) + }else{ + this.keyUnitForm.reset() + this.keyUnitForm.controls.areaUnit.setValue('0') + } + } + + //全选水源 + selectedAllWater(event){ + if(event.checked){ + this.waters.controls.forEach(item => {item.setValue(true)}) + }else{ + this.watertForm.reset() + this.watertForm.controls.areaWater.setValue('0') + } + } + + //取消显示单位 + resetUnit(){ + this.keyUnitForm.reset() + this.keyUnitForm.controls.areaUnit.setValue('0') + this.map.remove(this.circle) + this.clearUnitMarker()//取消显示单位markers + console.log('取消') + } + + //取消显示水源 + resetWater(){ + this.waterIconList.forEach((element,index) => { this.map.remove(element) }); //先删除所有标点 + this.waterIconList = [] + this.watertForm.reset() + this.watertForm.controls.areaWater.setValue('0') + this.map.remove(this.circleofwater) + console.log('取消') + } + + //右上角点击每一个title + clickTitle(index){ + this.selectedTitle = index + } + closertdiv(){ + this.selectedTitle = null + } + + //卫星图层 + satelliteLayer = new AMap.TileLayer.Satellite(); + satelliteModel:boolean = false + satelliteChange(e){ + e.checked ? this.map.add(this.satelliteLayer) : this.map.remove(this.satelliteLayer); + } - var infoWindowContent = - '
' + - '' + - '
' + - '
' + - '经纬度' + - '
' + - '' + - '
' + - '' + - '
'; - var infoWindow = new AMap.InfoWindow({ - content: infoWindowContent, - offset: new AMap.Pixel(0, -45) + //路网图层 + roadNetLayer = new AMap.TileLayer.RoadNet(); + loadModel:boolean = false + loadChange(e){ + e.checked ? this.map.add(this.roadNetLayer) : this.map.remove(this.roadNetLayer); + } + // floorLayer = new AMap.Buildings({ + // zooms: [16, 18], + // zIndex: 10, + // heightFactor: 2 //2倍于默认高度,3D下有效 + // }) + //楼层图层 + // floorChange(e){ + // e.checked ? this.map.add(this.floorLayer) : this.map.remove(this.floorLayer); + // } + + @ViewChild( 'appLeft',{static: false} ) appLeft:any //子组件 + leftDivState:boolean = false; //左侧工作区显示隐藏 + showLeftDiv:boolean = false//左侧工作区消失 + + //左侧工作区显示隐藏 + toggleLeft (e) { + this.leftDivState = e + } + + //左侧工作区关闭 + closeDiv(){ + this.leftDivState = false + this.showLeftDiv = false + } + + map:any //地图 + markers:any = []; //markers标注 + + //地图2D 3D切换 + mapPattern:boolean = true//默认是2D + mapPatternChange(type){ + if(type == '2D'){ + this.mapPattern = true + var layer = new AMap.createDefaultLayer({ + zooms:[3,20], //可见级别 + visible:true, //是否可见 + opacity:1, //透明度 + zIndex:0, //叠加层级 + resizeEnable: true //是否监控地图容器尺寸变化, + }) + this.map = new AMap.Map('map',{ + layers:[layer], //当只想显示标准图层时layers属性可缺省, }); + }else{ + this.mapPattern = false + this.map = new AMap.Map('map',{ + viewMode: '3D', + pitch: 60, + rotation: -35, + features: ['bg', 'road', 'point','building'], + mapStyle: 'amap://styles/light', + }); + } + this.satelliteModel = false + this.loadModel = false + } + + //地图初始化 + mapInit () { + let that = this + var layer = new AMap.createDefaultLayer({ + zooms:[3,20], //可见级别 + visible:true, //是否可见 + opacity:1, //透明度 + zIndex:0, //叠加层级 + resizeEnable: true //是否监控地图容器尺寸变化, + }) + that.map = new AMap.Map('map',{ + layers:[layer], //当只想显示标准图层时layers属性可缺省, + }); + + AMap.plugin(["AMap.RangingTool", "AMap.MouseTool"],function () { + that.mouseTool=new AMap.MouseTool(that.map); + /* that.measureDistance = new AMap.RangingTool(that.map, rulerOptions); //测距离 + that.measureArea = new AMap.MouseTool(that.map); //侧面积 */ + /* that.measureDistance.on('addnode',function(e){ //监听测距离 标点事件 + that.distanceList.push(e.marker) + }) + that.measureDistance.on('end',function(e){ //监听测距离 连线事件 + that.distanceList.push(e.polyline) + }) */ + /* that.mouseTool.on("rightclick",function(e){ + if(this.mouseTool.eventsList[1]==undefined){ + alert("000") + } + }) */ + }); + + } + + searchText:string; //搜索单位名称 + allCompany = []; //搜索到 匹配的单位 + + measureDistance; //测距离 + distanceList = []; //测距离 点和线 + measureArea; //测面积 + mouseTool;//二合一测距和侧面积 + checkRadio=false //判断测距和侧面积是否选中 + + //测距离 开始 + startDistance(){ + this.measureArea.close(false) + this.measureDistance.turnOn() + } + + //侧面积 开始 + startArea(){ + this.measureDistance.turnOff() + this.measureArea.measureArea({ + strokeColor:'#80d8ff', + fillColor:'#80d8ff', + fillOpacity:0.3 + //同 Polygon 的 Option 设置 + }); + } + + //清空距离测量 + clearDistance(){ + this.distanceList.forEach(item=>{ + if (item.className == 'AMap.Marker') { + let parent = item.dom.parentNode + let children = item.dom.nextElementSibling + parent && children? parent.removeChild(item.dom.nextElementSibling) : null + this.map.remove(item) + } else { + this.map.remove(item) + } + }) + this.distanceList = [] //清空数组 + } + + //清空面积测量 + clearArea(){ + this.measureArea.close(true) + } + //合并测距和侧面积 + measure(type){ + switch(type){ + case 'rule':{ + this.mouseTool.rule({ + startMarkerOptions : {//可缺省 + icon: new AMap.Icon({ + size: new AMap.Size(19, 31),//图标大小 + imageSize:new AMap.Size(19, 31), + image: "https://webapi.amap.com/theme/v1.3/markers/b/start.png" + }) + }, + endMarkerOptions : {//可缺省 + icon: new AMap.Icon({ + size: new AMap.Size(19, 31),//图标大小 + imageSize:new AMap.Size(19, 31), + image: "https://webapi.amap.com/theme/v1.3/markers/b/end.png" + }), + offset: new AMap.Pixel(-9, -31) + }, + midMarkerOptions : {//可缺省 + icon: new AMap.Icon({ + size: new AMap.Size(19, 31),//图标大小 + imageSize:new AMap.Size(19, 31), + image: "https://webapi.amap.com/theme/v1.3/markers/b/mid.png" + }), + offset: new AMap.Pixel(-9, -31) + }, + lineOptions : {//可缺省 + strokeStyle: "solid", + strokeColor: "#FF33FF", + strokeOpacity: 1, + strokeWeight: 2 + } + //同 RangingTool 的 自定义 设置,缺省为默认样式 + }); + break; + } + case 'measureArea':{ + this.mouseTool.measureArea({ + strokeColor:'#80d8ff', + fillColor:'#80d8ff', + fillOpacity:0.3 + //同 Polygon 的 Option 设置 + }); + break; + } + } + } + //合并清空 + clearnAll(){ + this.mouseTool.close(true) + this.checkRadio=false + } + + //搜索 + search () { + this.allCompany = [] + let paramsdata:any = {Name: this.searchText || ''} + this.http.get("/api/Companies",{params:paramsdata}).subscribe((data:any)=>{ + this.allCompany = data.items + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open(`搜索目标结果为${data.items.length}个`,'确定',config); + }) + } + + //清除 + clear () { + this.allCompany = [] + this.searchText = '' + } + + selectedUnit:any//当前打开的单位 + + //选择 单位 地图跳转 + //弹窗实例 + infoWindow:any + selectCompany (e) { + if (e.location && e.location.x && e.location.y) { + this.selectedUnit = e + this.markers.forEach((element,index) => { this.map.remove(element);}); //先删除所有标点 + this.markers = [] + + let marker = new AMap.Marker({ + map: this.map, + position: [e.location.x,e.location.y], // 基点位置, + }); + this.markers.push(marker) + + let markerContent = `
+
${e.name}
+
+
单位性质:
+
消防负责人:
+
+
+
防火级别:
+
消防管理人:
+
+
+
防火管辖:
+
防火监督员:
+
+
+
责任队站:
+
总建筑面积:
+
+
+
建筑信息分类:
+
总占地面积:
+
+
+
值班电话:
+
+
+
基本信息
+
导航
+
全景漫游
+
三维场景
+
查看预案
+
分享
+
+
` + // 创建一个自定义内容的 infowindow 实例 + this.infoWindow = new AMap.InfoWindow({ + position: [e.location.x,e.location.y], + offset: new AMap.Pixel(0, -30), + content: markerContent, + }); + this.infoWindow.open(this.map); + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#baseInformation'),'click',(event)=>{ this.baseInformation(e) })//基本信息点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#route'),'click',(event)=>{ this.route(e) })//导航点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#fullViewNavigation'),'click',(event)=>{ this.fullViewNavigation(e) })//全景漫游点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#threeeScene'),'click',(event)=>{ this.threeeScene(e) })//三维场景点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#seePlan'),'click',(event)=>{ this.seePlan(e) })//查看预案点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#share'),'click',(event)=>{ this.share(e) })//分享点击事件 + marker.on('click', (ev) => { //marker点击事件 + this.infoWindow = new AMap.InfoWindow({ + position: [e.location.x,e.location.y], + offset: new AMap.Pixel(0, -30), + content: markerContent, + }); + this.infoWindow.open(this.map); + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#baseInformation'),'click',(event)=>{ this.baseInformation(e) })//基本信息点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#route'),'click',(event)=>{ this.route(e) })//导航点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#fullViewNavigation'),'click',(event)=>{ this.fullViewNavigation(e) })//全景漫游点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#threeeScene'),'click',(event)=>{ this.threeeScene(e) })//三维场景点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#seePlan'),'click',(event)=>{ this.seePlan(e) })//查看预案点击事件 + this.renderer2.listen(this.elementRef.nativeElement.querySelector('#share'),'click',(event)=>{ this.share(e) })//分享点击事件 + }) + + this.map.setZoomAndCenter(13,marker._position); //设置地图中心点 + this.allCompany = [] + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请完善单位地理位置','确定',config); + } + } + + //基本信息 + baseInformation (e) { + this.leftDivState = true + this.showLeftDiv = true + this.appLeft.selectBaseInfo(e) //调用子组件方法 + } + + //导航 + route (e) { + this.leftDivState = false + this.showLeftDiv = false + this.isShowRouteGIS = true + } + + //全景漫游 + fullViewNavigation (e) { + console.log(e,'全景漫游') + } - // var xxx  =  this.el.nativeElement.querySelector('#lnglat2container') - let yyy = document.getElementById('lnglat2container'); + //三维场景 + threeeScene (e) { + window.open('http://121.37.20.190:8088/%5B%E7%BD%91%E9%A1%B5%E7%89%88%5D%E8%B4%B5%E6%B8%AF%E6%B2%B9%E5%BA%93%E4%B8%89%E7%BB%B4%E7%81%AD%E7%81%AB%E9%A2%84%E6%A1%88/') + } + + //查看预案 + seePlan (e) { + let data = e + let dialogRef = this.dialog.open(LookPlanDialog,{//调用open方法打开对话框并且携带参数过去 + width: '1400px', + height:'800px', + id:'lookPlanDialog', + data + }); + dialogRef.afterClosed().subscribe((data)=>{ + + }); + } + + //分享 + share (e) { + let data = { + url:'https://www.baidu.com/', + buildingType:e.buildingTypes[0].name, + address:e.address + } + let dialogRef = this.dialog.open(ShareUrlDialog,{//调用open方法打开对话框并且携带参数过去 + width: '540px', + height:'596px', + id:'shareDialog', + data}); + dialogRef.afterClosed().subscribe((data)=>{ + + }); + } - }, 0); + //导航路线 + isShowRouteGIS:boolean = false; //导航路线 显隐 + routeStart:any; //起点 + routeStartList:any = [] //起点 搜索结果 + routeEnd:any; //终点 + routeEndList:any = [] //终点 搜索结果 + timeout:any; //延时器 + routeGIS:any; //查询结果 规划路线 + selectType:boolean = true; //路线选择 推荐方案/躲避用拥堵 + + //关闭导航路线 + closeRouteGIS () { + this.isShowRouteGIS = false + } + + //输入框 输入事件 + routeChange (e) { + let that = this + window.clearTimeout(this.timeout) + this.timeout = window.setTimeout(()=>{ + + that.map.getCity( function(info){ //获取当前 city + AMap.plugin(['AMap.AutoComplete'], () =>{ + var autoOptions = {city: info.city} + let keywords + e == 0 ? keywords = that.routeStart : keywords = that.routeEnd + var autoComplete = new AMap.Autocomplete(autoOptions); + autoComplete.search(keywords, function(status, result) { + if (result && result.tips && result.tips.length) { //搜索到数据时 + + that._ngZone.run(()=>{ e == 0 ? that.routeStartList = result.tips : that.routeEndList = result.tips }); + + } + }) + }) + }); //获取当前 city + + },500) + } + + //清空导航输入框 + deleteSearchGIS (e) { + if (e==0) { + this.routeStart = null + this.routeStartList = [] + } else { + this.routeEnd = null + this.routeEndList = [] + } + } + + //清除路线 + clearGISRoute () { + this.routeStart = null + this.routeStartList = [] + this.routeEnd = null + this.routeEndList = [] + this.routeGIS? this.routeGIS.clear() : null + this.routes = { distance: 0, time: 0, steps: [], } + console.log(this.selectedUnit) + this.map.setZoomAndCenter(13,[this.selectedUnit.location.x,this.selectedUnit.location.y]); //设置地图中心点 } - getLngLat(){ - console.log(123) + //交换起始点 + exchangeGISRoute () { + let data = this.routeStart + this.routeStart = this.routeEnd + this.routeEnd = data + this.routeStartList = [] + this.routeEndList = [] + } + + routes:any = { distance: 0, time: 0, steps: [], };//导航查询结果 路线规划 + //导航查询 + queryGISRoute () { + //构造路线导航类 + let that = this + this.selectType = true + this.routeGIS? this.routeGIS.clear() : null + this.routeGIS = new AMap.Driving({ + map: this.map, + }); + // 根据起终点名称规划驾车导航路线 + this.routeGIS.search([{keyword: this.routeStart},{keyword: this.routeEnd}], + function(status, result) { + if (status === 'complete') { + that.routes = result.routes[0] + } else { alert('获取驾驶规划路线失败') } + } + ); + } + + //切换 导航模式 推荐方案/躲避拥堵 + toggleRoute (e) { + let that = this + if (this.selectType != e) { + this.selectType = e + this.routeGIS? this.routeGIS.clear() : null + this.routeGIS = new AMap.Driving({ + map: this.map, + policy: e==true? AMap.DrivingPolicy.LEAST_TIME : AMap.DrivingPolicy.REAL_TRAFFIC + }); + // 根据起终点名称规划驾车导航路线 + this.routeGIS.search([{keyword: this.routeStart},{keyword: this.routeEnd}], + function(status, result) { + if (status === 'complete') { + that.routes = result.routes[0] + } else { alert('获取驾驶规划路线失败') } + } + ); + } + } + + + +} + + + +//分享 +@Component({ + selector: 'shareUrl-dialog', + templateUrl: './shareUrl.html', + styleUrls: ['./shareUrl.scss'] +}) +export class ShareUrlDialog { + + constructor(public http: HttpClient,public snackBar: MatSnackBar, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data,private render2: Renderer2) {} + + selectetime:any = [{id:0,name:'今日有效'},{id:1,name:'本周有效'},{id:2,name:'本月有效'},{id:3,name:'仅一次有效'}] + selectedTimeIndex = 0 + ngOnInit() { + this.makeCode() + } + //生成二维码 + qrCode + makeCode () { + this.qrCode = new QRCode(document.getElementById("qrcode"),{ + text: this.data.url, + width: 200, + height: 200, + colorDark : "#000000", + colorLight : "#ffffff", + correctLevel : QRCode.CorrectLevel.H + }); + } + //下载二维码 + downloadFile () { + let canvas = this.qrCode._el.querySelector("canvas") + var base64Text = canvas.toDataURL("image/png"); + let url = base64Text //createObjectURL创建一个下载Blob的url地址 + let link = document.createElement("a"); + link.style.display = "none"; + link.href = url; + link.setAttribute("download", '二维码'); + document.body.appendChild(link); + link.click(); + } + //复制链接 + copyUrl(){ + var copyTest = this.data.url + var inputTest = document.createElement('input') + inputTest.value = copyTest + document.body.appendChild(inputTest) + inputTest.select() + document.execCommand('Copy') + inputTest.className = 'oInput' + inputTest.style.display = 'none' + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('复制链接成功','确定',config); + } + selectedTime(index){ + if(this.selectedTimeIndex != index){ + this.selectedTimeIndex = index + this.qrCode.clear(); + if(index == 0){//如果今日有效 + console.log("今日") + } + if(index == 1){//如果本周有效 + console.log("本周") + this.qrCode.makeCode("http://www.w3cschool.cc") + } + if(index == 2){//如果本月有效 + console.log("本月") + } + if(index == 3){//如果仅一次有效 + console.log("一次") + } + } + } + //关闭 + closeDiv(){ + this.dialogRef.close() } } + + + +//查看预案 +@Component({ + selector: 'lookPlan-dialog', + templateUrl: './lookPlan.html', + styleUrls: ['./lookPlan.scss'] +}) +export class LookPlanDialog { + + constructor(public http: HttpClient,public snackBar: MatSnackBar, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data,private render2: Renderer2,public dialog: MatDialog) {} + + + ngOnInit() { + console.log(this.data) + this.getAllPlans() + } + //关闭弹窗 + closeDiv(){ + this.dialogRef.close() + } + //查看单位详情 + lookUnitDetails(){ + window.open(`/keyUnit/viewunitinfo?id=${this.data.id}`) + } + //获得所有预案组件 + allPlanComponents:any//所有预案组件 + getAllPlans(){ + let paramsData:any = { + companyId:this.data.id, + pageNumber: 1, + pageSize: "100", + sort: "" + } + this.http.get("/api/PlanComponents",{params:paramsData}).subscribe((data:any)=>{ + this.allPlanComponents = data.items + console.log(this.allPlanComponents) + }) + } + //查看预案 + lookPlan(e){ + if(e.planMode == 0){ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('本地文件,请下载查看','确定',config); + } + if(e.planMode == 1){ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('查看导入word文件','确定',config); + } + if(e.planMode == 2){ //如果是在线编辑 + let id = e.id + sessionStorage.setItem("planId",id) + sessionStorage.setItem("companyId",this.data.id) + sessionStorage.setItem("buildingTypeId",this.data.buildingTypes[0].id) + sessionStorage.setItem("editable","0") + sessionStorage.setItem("planName",e.name) + let companyId = sessionStorage.getItem("companyId") + window.open(`/keyUnit/viewunitinfoplan?id=${companyId}`); + } + if(e.planMode == 3){ //如果是跳转网页 + sessionStorage.setItem("url",e.url) + window.open(`/planManagement/webLook`) + } + } + + //点击下载 + readFile(element){ + this.uploadFileLonging = element + let data =element + const dialogRef = this.dialog.open(DownloadFile, { + width:"435px", + data + }); + dialogRef.afterClosed().subscribe( + data=>{ + if(data){ + console.log(123,data) + this.downloadFileName = data.fileName + this.download = data + this.downloadFile() + } + } + ); + } + + //下载↓ + selectDownloadFile:any; //选择下载的文件 + download:any; //下载文件元数据 + downloadFileName:any //下载文件的文件名 + downloadisLoading:boolean = false; //进度条loading是否加载 + downloadProgress:number = 0; //进度条进度 + + uploadFileLonging:any + downloadFile(){ + this.downloadProgress = 0 + let file = this.download + let fileSize = file.fileLength//下载文件的总大小 + let shardSize = 10 * 1024 * 1024 //文件大小是否大于10MB + + if (file && fileSize<=shardSize) { //<=10MB时直接下载 + this.downloadisLoading = true + this.http.get(`/api/Objects/PlanPlatform/${file.objectName}`,{responseType: 'blob'},).subscribe(data=>{ + let url = window.URL.createObjectURL(new Blob([data])); //createObjectURL创建一个下载Blob的url地址 + let link = document.createElement("a"); + link.style.display = "none"; + link.href = url; + let suffix = file.objectName.substring(file.objectName.lastIndexOf(".")+1,file.objectName.length) ; + link.setAttribute("download", file.fileName ? file.fileName : this.data.name + "-" +this.uploadFileLonging.name + "." + suffix); + document.body.appendChild(link); + link.click(); + this.downloadisLoading = false + }) + } else if (file && fileSize > shardSize) { //>10MB时分块下载 + this.blockingDownload() //分段下载 + this.downloadisLoading = true + } + } + //分段下载并合并 + async blockingDownload () { + let file = this.download + let fileSize = file.fileLength //下载文件的总大小 + let shardSize = 3 * 1024 * 1024 //3MB一个分片 + let allSlice = Math.ceil(fileSize / shardSize) //总文件/3MB===共分多少段 + let allFile:any = [] //所有的file分段 + + for (let i=0;i{ + this.http.get(`/api/Objects/PlanPlatform/${file.objectName}`,{headers:{'range':`bytes= ${start}-${end}`},responseType:'blob'}).subscribe(data=>{ + result(data) }) + }) + allFile.push(result) + + + + if (allFile.length === allSlice) { //合并文件输出给浏览器 + let url = window.URL.createObjectURL(new Blob(allFile)); //createObjectURL创建一个下载Blob的url地址 + let link = document.createElement("a"); + link.style.display = "none"; + link.href = url; + let suffix = file.objectName.substring(file.objectName.lastIndexOf(".")+1,file.objectName.length) ; + link.setAttribute("download", file.fileName ? file.fileName : this.data.unitname + "-" +this.uploadFileLonging.name + "." + suffix); + document.body.appendChild(link); + link.click(); + this.downloadisLoading = false + } + + } //for循环 + + } + + //取消分块下载 + cancelDowload () { + } +} + + + +//下载文件弹出框 +@Component({ + selector: 'downloadfile', + templateUrl: './downloadFile.html', + styleUrls: ['./downloadFile.scss'] +}) +export class DownloadFile { + + constructor(private http: HttpClient,public dialogRef: MatDialogRef,@Inject(MAT_DIALOG_DATA) public data,public snackBar: MatSnackBar) {} + name:any //如果真实姓名为空时 + fileUrls:any //当前预案附件地址数组 + fileDatas:any = [] //用于循环的数组 + selectedFileIndex : any = 0 + selectedFileData : any + + ngOnInit(): void { + console.log(this.data) + this.name = this.data.name + this.fileUrls = this.data.attachmentUrls + this.fileUrls.forEach(item=>{ + this.http.get('/api/ObjectMetadata/PlanPlatform/'+item).subscribe((data:any)=>{ + data.filePige = (data.fileLength / (1024*1024)).toFixed(2) + this.fileDatas.push(data) + this.selectedFileData = data + }) + }) + + } + + //取消 + onNoClick(): void { + this.dialogRef.close(); + } + //确定 + confirm(){ + this.dialogRef.close(this.selectedFileData); + } + + //点击想要下载的文件 + addurl(item,key){ + console.log(item,key) + this.selectedFileIndex = key + this.selectedFileData = item + } +} \ No newline at end of file diff --git a/src/app/gis-management/gis-labeling/lookPlan.html b/src/app/gis-management/gis-labeling/lookPlan.html new file mode 100644 index 0000000..c9c0ad9 --- /dev/null +++ b/src/app/gis-management/gis-labeling/lookPlan.html @@ -0,0 +1,53 @@ +
+
+ {{data.name}}预案 + clear +
+
+
+
+ 单位名称: {{data.name}} + 辖区中队: {{data.organizationName}} + 单位类型: {{data.buildingTypes[0].name}} + 单位地址: {{data.address}} +
+
+ 查看详情 +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
预案名称添加人修改时间预案类型审核状态是否公开编制级别操作
{{item.name}}{{item.creatorName}}{{item.modifiedTime | date:'yyyy-MM-dd'}}{{item.planType | plantype}}{{item.auditStatus | auditsatus}}{{item.openRange}}{{item.planLevel | planlevel}} + 查看 + 下载 +
+
+
+
+ + + {{downloadFileName}} + 下载中... + +
+
\ No newline at end of file diff --git a/src/app/gis-management/gis-labeling/lookPlan.scss b/src/app/gis-management/gis-labeling/lookPlan.scss new file mode 100644 index 0000000..c9936e4 --- /dev/null +++ b/src/app/gis-management/gis-labeling/lookPlan.scss @@ -0,0 +1,123 @@ +// table,table tr th, table tr td { border: 1px solid #EEF1F5; } +table { text-align: center; border-collapse: collapse; padding:2px;} +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.box{ + position: relative; + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + cursor: default; + +} + +.title{ + width: 100%; + height: 48px; + line-height: 48px; + text-align: center; + background: #0080FF; + font-size: 18px; + color: #ffffff; + position: relative; + .closeicon{ + position: absolute; + right: 12px; + top: 4px; + cursor: pointer; + } +} +.contant{ + flex: 1; + box-sizing: border-box; + padding: 20px 50px; + border: 1px solid gray; + .topbox{ + display: flex; + margin-bottom: 20px; + .unitinfo{ + width: 92%; + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; + span{ + margin-right: 50px; + font-size: 15px; + } + } + .btnbox{ + width: 8%; + .btn{ + color: #0080FF; + font-size: 15px; + cursor: pointer; + } + + } + } + .tablebox{ + table{ + table-layout:fixed; + width: 100%; + font-size: 15px; + tr{ + display: flex; + justify-content: center; + align-items: center; + min-height: 36px; + td{ + flex: 1; + } + } + tr:nth-child(odd){ + background: #F2F9FF; + } + .btn{ + font-size: 15px; + color: #0080FF; + margin: 0 5px; + cursor: pointer; + } + .grey{ + color: grey; + pointer-events: none; + } + } + } +} +//进度条 +.progressBox{ + line-height: 49px; + height: 49px; + position: absolute; + bottom: 0; + left: 0; + display: inline-block; + width: 100%; + button{ + float: right; + } + .progress{ + display: inline-block; + position: absolute; + width: 500px; + top: 23px; + left: 220px; + } + .filename{ + display: inline-block; + width: 80px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + +} \ No newline at end of file diff --git a/src/app/gis-management/gis-labeling/shareUrl.html b/src/app/gis-management/gis-labeling/shareUrl.html new file mode 100644 index 0000000..2c9d6dc --- /dev/null +++ b/src/app/gis-management/gis-labeling/shareUrl.html @@ -0,0 +1,32 @@ +
+
+ 分享 + clear +
+
+
+
{{item.name}}
+
+
+
+

{{data.buildingType}}

+

{{data.address}}

+
+ +
+
+ 保存图片 +
+
+
+

+ 【安信科创】为您分享了{{data.buildingType}}的信息,您可复制下面的网址在浏览器中打开查看,该网址【今日有效】 +

+
+ {{data.url}} +
+
+ 复制链接 +
+
+
\ No newline at end of file diff --git a/src/app/gis-management/gis-labeling/shareUrl.scss b/src/app/gis-management/gis-labeling/shareUrl.scss new file mode 100644 index 0000000..bec775b --- /dev/null +++ b/src/app/gis-management/gis-labeling/shareUrl.scss @@ -0,0 +1,127 @@ +//头部title +.title{ + width: 100%; + height: 42px; + line-height: 42px; + background: #0080FF; + text-align: center; + position: relative; + .name{ + font-size: 20px; + font-family: Source Han Sans CN; + font-weight: 400; + color: #FFFFFF; + } + .close{ + position: absolute; + right: 12px; + top: 6px; + color: #fff; + cursor: pointer; + } +} +.mat-dialog-container{ + padding: 0; +} +//有效时间选择 +.selectTime{ + margin: 18px 0; + display: flex; + justify-content: center; + .divitembox{ + display: flex; + } + .divitem{ + width: 100px; + height: 36px; + line-height: 36px; + background: #EEF1F5; + font-size: 16px; + font-family: Source Han Sans CN; + font-weight: 400; + color: #333333; + opacity: 0.4; + text-align: center; + cursor: pointer; + } + .divitem:first-child{ + border-radius: 4px 0px 0px 4px; + } + .divitem:last-child{ + border-radius: 0px 4px 4px 0px; + } + .selectedtime{ + background: #0080FF; + opacity: 1; + color: #FFFFFF; + } +} +//二维码区域 +.qrcodebox{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + .p1{ + font-size: 16px; + color: #0080FF; + } + .p2{ + font-size: 14px; + color: #333333; + opacity: 0.4; + margin: 5px 0 18px 0; + } + .qrcodeimg{ + width: 200px; + height: 200px; + } + .saveqrcode{ + width: 96px; + height: 30px; + background: #0080FF; + line-height: 30px; + border-radius: 4px; + margin: 18px 0; + color: #FFFFFF; + text-align: center; + font-size: 14px; + cursor: pointer; + } + +} +//链接区域 +.urlbox{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + p{ + width: 500px; + font-size: 12px; + } + .urldiv{ + display: block; + font-size: 10px; + width: 500px; + background: #EEF1F5; + border-radius: 4px; + padding: 3px; + box-sizing: border-box; + margin: 15px 0; + word-wrap: break-word; + word-break: normal; + white-space:normal + } + .saveqrcode{ + width: 96px; + height: 30px; + background: #0080FF; + line-height: 30px; + border-radius: 4px; + color: #FFFFFF; + text-align: center; + font-size: 14px; + cursor: pointer; + } +} diff --git a/src/app/gis-management/gis-management-routing.module.ts b/src/app/gis-management/gis-management-routing.module.ts index 599381e..ec23f61 100644 --- a/src/app/gis-management/gis-management-routing.module.ts +++ b/src/app/gis-management/gis-management-routing.module.ts @@ -3,10 +3,13 @@ import { Routes, RouterModule } from '@angular/router'; import { GisLabelingComponent } from './gis-labeling/gis-labeling.component'; + const routes: Routes = [ { path: '', component: GisLabelingComponent }, ]; + + @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] diff --git a/src/app/gis-management/gis-management.module.ts b/src/app/gis-management/gis-management.module.ts index 11bbefe..18a5f5b 100644 --- a/src/app/gis-management/gis-management.module.ts +++ b/src/app/gis-management/gis-management.module.ts @@ -1,7 +1,6 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { GisLabelingComponent } from './gis-labeling/gis-labeling.component'; - +import { DownloadFile, GisLabelingComponent, LookPlanDialog, ShareUrlDialog } from './gis-labeling/gis-labeling.component'; import {A11yModule} from '@angular/cdk/a11y'; import {DragDropModule} from '@angular/cdk/drag-drop'; import {PortalModule} from '@angular/cdk/portal'; @@ -43,58 +42,80 @@ import {MatTabsModule} from '@angular/material/tabs'; import {MatToolbarModule} from '@angular/material/toolbar'; import {MatTooltipModule} from '@angular/material/tooltip'; import {MatTreeModule} from '@angular/material/tree'; -import { FormsModule } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { GisRoutingModule } from './gis-management-routing.module'; +import { LeftWorkingComponent } from './left-working/left-working.component'; +import { BasicInfoComponent } from './basic-info/basic-info.component'; +import { FunctionPartitionComponent } from './function-partition/function-partition.component'; +import { FireFacilitiesComponent } from './fire-facilities/fire-facilities.component'; +import {ImagesData2}from './fire-facilities/imagesdata.component' +import {AllaroundComponent} from './allaround/allaround.component' +import {ImgDetails}from './allaround/imgdetails.component'; +import {KeySiteLookComponent} from './key-site-look/key-site.component' +import {KeySiteImgs2}from './key-site-look/keysiteimgs.component' +import {RealisticPictureLookComponent} from './realistic-picture-look/realistic-picture.component' +import {previewImg3} from './realistic-picture-look/realistic-picture.component' +import { OpenPlanToolDialog, PlanListComponent } from './plan-list/plan-list.component'; +import { PlanManagementModule } from '../plan-management/plan-management.module'; +import { UiModule } from '../ui/ui.module'; +import { CadDrawComponent } from './cad-draw/cad-draw.component'; +import {previewBigImg2} from './fire-facilities/imagesdata.component' @NgModule({ - declarations: [GisLabelingComponent], - imports: [ - CommonModule, - CommonModule, - GisRoutingModule, - A11yModule, - CdkStepperModule, - CdkTableModule, - CdkTreeModule, - DragDropModule, - MatAutocompleteModule, - MatBadgeModule, - MatBottomSheetModule, - MatButtonModule, - MatButtonToggleModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatStepperModule, - MatDatepickerModule, - MatDialogModule, - MatDividerModule, - MatExpansionModule, - MatGridListModule, - MatIconModule, - MatInputModule, - MatListModule, - MatMenuModule, - MatNativeDateModule, - MatPaginatorModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatRadioModule, - MatRippleModule, - MatSelectModule, - MatSidenavModule, - MatSliderModule, - MatSlideToggleModule, - MatSnackBarModule, - MatSortModule, - MatTableModule, - MatTabsModule, - MatToolbarModule, - MatTooltipModule, - MatTreeModule, - PortalModule, - ScrollingModule, - FormsModule - ] + declarations: [GisLabelingComponent, LeftWorkingComponent, FunctionPartitionComponent, RealisticPictureLookComponent,previewImg3,previewBigImg2, + FireFacilitiesComponent,ImagesData2,AllaroundComponent,ImgDetails,KeySiteLookComponent,KeySiteImgs2,BasicInfoComponent,FunctionPartitionComponent,ShareUrlDialog, PlanListComponent,LookPlanDialog,DownloadFile,OpenPlanToolDialog, CadDrawComponent], + + imports: [ + CommonModule, + CommonModule, + GisRoutingModule, + A11yModule, + CdkStepperModule, + CdkTableModule, + CdkTreeModule, + DragDropModule, + MatAutocompleteModule, + MatBadgeModule, + MatBottomSheetModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatStepperModule, + MatDatepickerModule, + MatDialogModule, + MatDividerModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatNativeDateModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatRippleModule, + MatSelectModule, + MatSidenavModule, + MatSliderModule, + MatSlideToggleModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, + MatTreeModule, + PortalModule, + ScrollingModule, + FormsModule, + ReactiveFormsModule, + PlanManagementModule, + UiModule + ] + }) export class GISManagementModule { } diff --git a/src/app/gis-management/key-site-look/key-site.component.html b/src/app/gis-management/key-site-look/key-site.component.html new file mode 100644 index 0000000..8c3aa72 --- /dev/null +++ b/src/app/gis-management/key-site-look/key-site.component.html @@ -0,0 +1,97 @@ + +
+
+ + + + + 单位重点部位 + + +
+
+
+ +
+
+
+ {{element.name}} +
+
+ 所在地址:{{element.position}} +
+
+ 建筑结构:{{element.structure}} +
+
+ 使用性质:{{element.nature}} +
+
+ 主要危险:{{element.hazards}} +
+
+
+ +
+
+ +
+ + + +
+
+
+ +
+ + + + + {{item.name}} + + + +
+
+
+ +
+
+
+ {{element.name}} +
+
+ 所在地址:{{element.position}} +
+
+ 建筑结构:{{element.structure}} +
+
+ 使用性质:{{element.nature}} +
+
+ 主要危险:{{element.hazards}} +
+
+
+ +
+
+ +
+ + + +
+
+
+ +
\ No newline at end of file diff --git a/src/app/gis-management/key-site-look/key-site.component.scss b/src/app/gis-management/key-site-look/key-site.component.scss new file mode 100644 index 0000000..5186f22 --- /dev/null +++ b/src/app/gis-management/key-site-look/key-site.component.scss @@ -0,0 +1,139 @@ +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + scrollbar-width: none; /* Firefox */ +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} +.content { + width: 100%; + height: 100%; + //padding: 10px; + overflow-y: auto; + .contentBox{ + width: 100%; + height: 100%; + overflow-y: auto; + text-align: center; + margin: 0 auto; + } +} +.tableContent{ + width: 100%; + height: 100%; + .panelhead{ + //height: 44px; + background-color: #F2F9FF; + } + .colum{ + width: 100%; + display: flex; + flex-direction: column; + .up{ + width: 100%; + display: flex; + margin-top: 3%; + .left{ + width: 40%; + height: 120px; + + //margin-left: 4%; + img{ + float: right; + width: 140px; + height: 120px; + cursor: pointer; + //padding-left: 7%; + //margin-right: 3%; + } + } + .right{ + width: 60%; + //margin-top: 4%; + margin-left: 3%; + display: flex; + flex-direction: column; + .rightone{ + width: 100%; + } + .righttwo{ + margin-top: 1%; + } + .righthree{ + margin-top: 1%; + } + .rightfour{ + margin-top: 1%; + } + .rightfive{ + margin-top: 1%; + } + } + } + } + .down{ + width: 100%; + height: 150px; + margin-top: 5%; + textarea{ + width: 95%; + height: 80%; + margin: 3%; + border: none; + background-color: #EEF1F5; + scrollbar-base-color:#0080FF; + } + + } +} + +table { + width: 90%; + margin: 15px auto; + text-align: center; + .cdk-header-cell { + text-align: center; + } +} + +//重点提示 +.tips{ + width: 75%; + height: 150px; + border: 1px solid black; + border-radius: 5px; + margin: 15px auto; + text-align: center; + padding: 25px; + textarea { + resize: none; + width: 100%; + height: 100%; + } +} + +//预览图片旋转角度 +.rotateA {transform: rotate(90deg) scale(0.75);} +.rotateB {transform: rotate(180deg)} +.rotateC {transform: rotate(270deg) scale(0.75);} +//预览图片 +.previewImgBox { + width: 1500px; + height: 700px; + text-align: center; + img{ + width: auto; + height: auto; + max-width: 100%; + height: 100%;} +} +.previewImgBottom { + text-align: center; + height: 30px; + margin: 20px auto; +} diff --git a/src/app/gis-management/key-site-look/key-site.component.ts b/src/app/gis-management/key-site-look/key-site.component.ts new file mode 100644 index 0000000..6e77fb0 --- /dev/null +++ b/src/app/gis-management/key-site-look/key-site.component.ts @@ -0,0 +1,195 @@ +import { Component, OnInit, ViewChild, Inject } from '@angular/core'; +import {HttpClient} from '@angular/common/http' +import { MatDialogRef, MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar'; +import { KeySiteImgs2 } from './keysiteimgs.component' +import { ActivatedRoute } from '@angular/router'; + + + +@Component({ + selector: 'app-key-site-look', + templateUrl: './key-site.component.html', + styleUrls: ['./key-site.component.scss'] +}) +export class KeySiteLookComponent implements OnInit { + + constructor(public http: HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar,private route:ActivatedRoute,) { } + + displayedColumns: string[] = ['mainname', 'position', 'construction', 'nature', 'danger', 'img']; + + ngOnInit(): void { + this.getCompanyPostion() + this.getCompanyTips() + this.getAllBuilding() + } + unitId:any = sessionStorage.getItem('unitId') + + allCompanyPosition:any = []; //所有单位重点部位 + companyTips:any; //所有单位重点提示 + companyInput:any; //单位重点提示数据 + allBuilding:any = []; //所有建筑 + 建筑重点部位 + 建筑重点提示 + + //获取单位重点部位 + getCompanyPostion () { + let id = {companyId:this.unitId} + this.http.get('/api/CompanyImportantLocations',{params:id}).subscribe(data=>{ + this.allCompanyPosition = data + this.allCompanyPosition.forEach(element => { + if(element.imageUrls[0]!=undefined){ + element.imageUrls[0]+= '?x-oss-process=image/resize,m_fill,h_140,w_120' + } + + }); + }) + + } + + //获取单位重点提示 + getCompanyTips () { + let id = {companyId:this.unitId} + this.http.get('/api/CompanyImportantTips',{params:id}).subscribe((data:any)=>{ + if (data) { + this.companyTips = data + this.companyInput = data.details} + }) + } + + //获取所有建筑 + getAllBuilding () { + let id = {companyId:this.unitId} + this.http.get('/api/Buildings',{params:id}).subscribe((data:any)=>{ + if (data.length) { + this.allBuilding = data + this.allBuilding.forEach(element => { + element.position = [] //建筑重点部位 + element.tips = null //建筑重点提示 + element.companyInput = null }) //建筑重点提示数据 + this.getAllBuildingPositon() + this.getAllBuildingTips() + } + }) + } + + //获取所有建筑重点部位 + getAllBuildingPositon () { + this.allBuilding.forEach(element => { + let id = {buildingId:element.id} + this.http.get('/api/BuildingImportantLocations',{params:id}).subscribe(data=>{ + element.position = data + element.position.forEach(element => { + if(element.imageUrls[0]!=undefined){ + element.imageUrls[0]+= '?x-oss-process=image/resize,m_fill,h_140,w_120' + } + }); + }) + }); + } + + //获取所有建筑重点提示 + getAllBuildingTips () { + this.allBuilding.forEach(element => { + let id = {buildingId:element.id} + this.http.get('/api/BuildingImportantTips',{params:id}).subscribe((data:any)=>{ + if (data) { + element.tips = data + element.companyInput = data.details} + }) + }); + } + + //保存单位重点提示 + Preservation () { + if (this.companyTips) { //编辑单位重点提示 + let data = { + companyId: this.companyTips.companyId, + id: this.companyTips.id, + details: this.companyInput} + this.http.put(`/api/CompanyImportantTips/${this.companyTips.id}`,data).subscribe(data=>{ + this.getCompanyTips() + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据修改成功','确定',config); + }) + } else { //新增单位重点提示 + let data = { + companyId: this.unitId, + id : "", + details: this.companyInput || ""} + this.http.post('/api/CompanyImportantTips',data).subscribe(data=>{ + this.getCompanyTips() + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据修改成功','确定',config); + }) + } + } + + //保存建筑重点提示 + PreservationBuilding (e) { + if (e.tips) { //编辑建筑重点提示 + let data = { + buildingId: e.id, + id: e.tips.id, + details: e.companyInput} + this.http.put(`/api/BuildingImportantTips/${e.tips.id}`,data).subscribe(data=>{ + this.toUpdate(e) + }) + } else { //新增重点单位提示 + let data = { + buildingId: e.id, + details: e.companyInput || ""} + this.http.post('/api/BuildingImportantTips',data).subscribe(data=>{ + this.toUpdate(e) + }) + } + } + + //查看图片 + seeImg (e) { + if(e.length>0){ + var index=e[0].lastIndexOf("\?"); + if(index!=-1){ + e[0]=e[0].substring(0,index) + } + + } + if (e.length) { + let data = e + const dialogRef = this.dialog.open(KeySiteImgs2, {//调用open方法打开对话框并且携带参数过去 + width: '1600px', + height:'900px',data}); + dialogRef.afterClosed().subscribe(); + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('暂无图片数据','确定',config); + } + this.getCompanyPostion() + this.getAllBuildingPositon() + } + + //封装方法获取更新当前tab页重点提示 + toUpdate (e) { + let id = {buildingId:e.id} + this.http.get('/api/BuildingImportantTips',{params:id}).subscribe((data:any)=>{ + if (data) { + this.allBuilding.forEach(element => { + if (element.id === e.id) { + element.tips = data + element.companyInput = data.details} + }); + } // if + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('数据修改成功','确定',config); + }) + } + + + +} diff --git a/src/app/gis-management/key-site-look/keysiteimgs.component.html b/src/app/gis-management/key-site-look/keysiteimgs.component.html new file mode 100644 index 0000000..992faec --- /dev/null +++ b/src/app/gis-management/key-site-look/keysiteimgs.component.html @@ -0,0 +1,18 @@ +
图片详情
+
+
+
+ +
+
+
+ + +
+
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/gis-management/key-site-look/keysiteimgs.component.ts b/src/app/gis-management/key-site-look/keysiteimgs.component.ts new file mode 100644 index 0000000..fb90d71 --- /dev/null +++ b/src/app/gis-management/key-site-look/keysiteimgs.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, Inject ,ViewChild} from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import Swiper from 'swiper'; + + + +@Component({ + selector: 'keysiteimgs', + templateUrl: './keysiteimgs.component.html', + styleUrls: ['./key-site.component.scss'] + }) + +export class KeySiteImgs2 { + + constructor(private http:HttpClient,public dialog: MatDialog,public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data) { } + testSwiper: Swiper; + + ngOnInit(): void { + this.allImages = [] + this.data.forEach(element => { + element = `${element}?x-oss-process=image/auto-orient,1` + this.allImages.push(element) + }); + } + + ngAfterViewInit() { + + this.testSwiper = new Swiper('.swiper-container', { + direction: 'horizontal', + loop: false, + lazy: true, + // 如果需要前进后退按钮 + navigation: { + nextEl: '.swiper-button-next', + prevEl: '.swiper-button-prev', + } + }); + + } + + allImages:any; //展示所有的图片 + rotationAngle:number=0; //旋转角度 + + //旋转图片 + rotate () { + this.rotationAngle = this.rotationAngle+90 + if (this.rotationAngle === 360) {this.rotationAngle = 0} + } + + + +} + \ No newline at end of file diff --git a/src/app/gis-management/left-working/left-working.component.html b/src/app/gis-management/left-working/left-working.component.html new file mode 100644 index 0000000..67cb128 --- /dev/null +++ b/src/app/gis-management/left-working/left-working.component.html @@ -0,0 +1,71 @@ + +
+ +
+

{{selectCompany.name? selectCompany.name : '暂无单位名称'}}

+ 关闭 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/app/gis-management/left-working/left-working.component.scss b/src/app/gis-management/left-working/left-working.component.scss new file mode 100644 index 0000000..d3a857c --- /dev/null +++ b/src/app/gis-management/left-working/left-working.component.scss @@ -0,0 +1,31 @@ +.center { + width: 100%; + height: 100%; + overflow: hidden; + display: flex; + flex-direction: column; + .title{ + height: 28px; + line-height: 28px; + position: relative; + font-size: 16px; + font-weight: 400; + color: #0080FF; + opacity: 1; + p{ + text-align: center; + cursor: default;; + } + span{ + position: absolute; + right: 10px; + top: 0; + font-size: 14px; + cursor: pointer; + } + span:hover{ + text-decoration: underline; + } + } + +} diff --git a/src/app/gis-management/gis-labeling/gis-labeling.component.spec.ts b/src/app/gis-management/left-working/left-working.component.spec.ts similarity index 54% rename from src/app/gis-management/gis-labeling/gis-labeling.component.spec.ts rename to src/app/gis-management/left-working/left-working.component.spec.ts index 666c51f..8f94417 100644 --- a/src/app/gis-management/gis-labeling/gis-labeling.component.spec.ts +++ b/src/app/gis-management/left-working/left-working.component.spec.ts @@ -1,20 +1,20 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { GisLabelingComponent } from './gis-labeling.component'; +import { LeftWorkingComponent } from './left-working.component'; -describe('GisLabelingComponent', () => { - let component: GisLabelingComponent; - let fixture: ComponentFixture; +describe('LeftWorkingComponent', () => { + let component: LeftWorkingComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ GisLabelingComponent ] + declarations: [ LeftWorkingComponent ] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(GisLabelingComponent); + fixture = TestBed.createComponent(LeftWorkingComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/gis-management/left-working/left-working.component.ts b/src/app/gis-management/left-working/left-working.component.ts new file mode 100644 index 0000000..57a4f39 --- /dev/null +++ b/src/app/gis-management/left-working/left-working.component.ts @@ -0,0 +1,39 @@ +import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'; +import { FormControl } from '@angular/forms'; + +@Component({ + selector: 'app-left-working', + templateUrl: './left-working.component.html', + styleUrls: ['./left-working.component.scss'] +}) +export class LeftWorkingComponent implements OnInit { + + @Output() onCustomEvent: EventEmitter = new EventEmitter();//创建实例 + @ViewChild( 'baseInfo',{static: false} ) baseInfo:any //基本信息子组件 + constructor() { } + + ngOnInit(): void { + + } + + selected = new FormControl(0); //选项卡 实例 + selectCompany:any = { name: null, id: null } //选择单位 + + //父组件 点击基本信息时 + selectBaseInfo (e) { + if (this.selectCompany.id != e.id) { //选择单位 更改时 + this.selectCompany = e + sessionStorage.setItem('unitId',e.id || '') + sessionStorage.setItem('buildingTypeId',e.buildingTypes[0].id || '') + this.selected.value != 0 ? this.selected.setValue(0) : this.baseInfo.everyInin() //判断当前tab栏是否是 基本信息 + } + } + + //通知父组件关闭div + closeDiv(){ + this.onCustomEvent.emit('closeDiv'); + } + + + +} diff --git a/src/app/gis-management/plan-list/openPlanTool.html b/src/app/gis-management/plan-list/openPlanTool.html new file mode 100644 index 0000000..9c385b7 --- /dev/null +++ b/src/app/gis-management/plan-list/openPlanTool.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/app/gis-management/plan-list/openPlanTool.scss b/src/app/gis-management/plan-list/openPlanTool.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/gis-management/plan-list/plan-list.component.html b/src/app/gis-management/plan-list/plan-list.component.html new file mode 100644 index 0000000..55ea6a8 --- /dev/null +++ b/src/app/gis-management/plan-list/plan-list.component.html @@ -0,0 +1,42 @@ +
+
+ + + + + 总平面图 + + +
+
+
+ +
+

{{item.name}}

+
+
+
+
+
+
+ + + + + {{item.name}} + + + +
+
+
+ +
+

{{i.name}}

+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/app/gis-management/plan-list/plan-list.component.scss b/src/app/gis-management/plan-list/plan-list.component.scss new file mode 100644 index 0000000..a1939e9 --- /dev/null +++ b/src/app/gis-management/plan-list/plan-list.component.scss @@ -0,0 +1,42 @@ +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + scrollbar-width: none; /* Firefox */ +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} + +.planlist{ + width: 100%; + height: 100%; + overflow-y: auto; +} +.contant{ + box-sizing: border-box; + padding: 20px; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + .contantitem{ + div{ + width: 110px; + height: 110px; + img{ + width: 100%; + height: 100%; + cursor: pointer; + } + } + p{ + text-align: center; + font-size: 14px; + margin: 2px 0; + width: 110px; + } + } +} \ No newline at end of file diff --git a/src/app/gis-management/plan-list/plan-list.component.spec.ts b/src/app/gis-management/plan-list/plan-list.component.spec.ts new file mode 100644 index 0000000..9a93192 --- /dev/null +++ b/src/app/gis-management/plan-list/plan-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PlanListComponent } from './plan-list.component'; + +describe('PlanListComponent', () => { + let component: PlanListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PlanListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PlanListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/gis-management/plan-list/plan-list.component.ts b/src/app/gis-management/plan-list/plan-list.component.ts new file mode 100644 index 0000000..1b56d2f --- /dev/null +++ b/src/app/gis-management/plan-list/plan-list.component.ts @@ -0,0 +1,102 @@ +import { HttpClient } from '@angular/common/http'; +import { Component, Inject, OnInit, Renderer2, ViewChild } from '@angular/core'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatSnackBar } from '@angular/material/snack-bar'; + +@Component({ + selector: 'app-plan-list', + templateUrl: './plan-list.component.html', + styleUrls: ['./plan-list.component.scss'] +}) +export class PlanListComponent implements OnInit { + constructor(private http: HttpClient,public snackBar: MatSnackBar,public dialog: MatDialog) { } + + //单位相关数据 + unitId:any = sessionStorage.getItem('unitId') + + ngOnInit(): void { + this.getAllBuildings() + this.getSitePlan() + } + + //获得所有的建筑物 + allBuildings:any + getAllBuildings(){ + this.http.get("/api/Buildings",{ + params:{ + companyId : this.unitId + } + }).subscribe((data:any)=>{ + data.forEach((item,index) => { + let params = { buildingId: item.id } + item.plandata = [] + this.http.get('/api/BuildingAreas',{params}).subscribe(data=>{ + item.plandata = data + }) + }) + this.allBuildings = data + }) + } + //获取总平面图 + sitePlanItems:any + getSitePlan () { + let params = {companyId: this.unitId} + this.http.get('/api/SitePlans',{params:params}).subscribe(data=>{ + this.sitePlanItems = data + }) + } + //打开采集工具 + openPlan(item,index){ + sessionStorage.setItem("gisplan",'look') + sessionStorage.setItem("companyId",this.unitId) + let data = {select: item, key: index, allBuildings: this.allBuildings} + let dialogRef = this.dialog.open(OpenPlanToolDialog,{//调用open方法打开对话框并且携带参数过去 + width: '1500px', + height:'850px', + id:'openPlanToolDialog', + data + }); + dialogRef.afterClosed().subscribe( (data)=>{ } ); + } +} + + + +//查看预案 +@Component({ + selector: 'lookPlan-dialog', + templateUrl: './openPlanTool.html', + styleUrls: ['./openPlanTool.scss'] +}) +export class OpenPlanToolDialog { + + constructor(public http: HttpClient,public snackBar: MatSnackBar,public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data,private render2: Renderer2,public dialog: MatDialog) {} + + @ViewChild( 'plan',{static: false} ) plan:any //子组件 + + ngOnInit() { + } + + ngAfterViewInit(): void { + this.noticePlan() + } + + //通知 子组件 传递参数 + noticePlan () { + let parameter = { //查询 节点 对应 建筑/楼层 index,id + buildingIndex: this.data.key, //总平面图/建筑 index + storeyId: this.data.select.id + } + this.http.get("/api/Buildings",{params:{companyId : sessionStorage.getItem('unitId')} }).subscribe((data:any)=>{ + this.plan.allBuildings = data + this.plan.seekPanelPoint(parameter) + }) + } + + //关闭弹窗 + closeDiv(){ + this.dialogRef.close() + } + +} \ No newline at end of file diff --git a/src/app/gis-management/realistic-picture-look/previewImg.html b/src/app/gis-management/realistic-picture-look/previewImg.html new file mode 100644 index 0000000..1cde6b9 --- /dev/null +++ b/src/app/gis-management/realistic-picture-look/previewImg.html @@ -0,0 +1,17 @@ +
图片详情
+
+
+
+ +
+
+
+ + +
+
+
+ +
+ +
\ No newline at end of file diff --git a/src/app/gis-management/realistic-picture-look/realistic-picture.component.html b/src/app/gis-management/realistic-picture-look/realistic-picture.component.html new file mode 100644 index 0000000..e124cd2 --- /dev/null +++ b/src/app/gis-management/realistic-picture-look/realistic-picture.component.html @@ -0,0 +1,32 @@ + +
+ + + + + + {{item.name}} + + +
+
+
+ + +
+
+ 暂无数据 +
+
+ + +
+
+
diff --git a/src/app/gis-management/realistic-picture-look/realistic-picture.component.scss b/src/app/gis-management/realistic-picture-look/realistic-picture.component.scss new file mode 100644 index 0000000..05d59e7 --- /dev/null +++ b/src/app/gis-management/realistic-picture-look/realistic-picture.component.scss @@ -0,0 +1,229 @@ +*{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + scrollbar-width: none; /* Firefox */ +} +::-webkit-scrollbar { + display: none; /* Chrome Safari */ +} +.content { + //margin: 0 0 0 10px; + width: 100%; + height: 100%; + overflow-y: auto; + margin-top: 10px; + .leftBox { + flex: 15%; + padding-top: 10px; + .bank { + display: flex; + padding-left: 10px; + .mat-icon {margin-right: 15px;} + } + } + .rightBox { + border-left: 1px solid #999; + flex: 85%; + display: flex; + flex-direction: column; + .topBox { + flex: 5%; padding: 10px; + display: flex; + :first-child {flex: 85%;}; + :last-child {flex: 15%;} + } + .bottomBox { + flex: 95%; + padding: 5px 0 0 25px; + overflow: auto; + .imgsBoxflex { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + } + } +} +.tableContent{ + width: 100%; + height: 100%; + .panelhead{ + height: 44px; + background-color: #F2F9FF; + margin-top: 10px; + } + .colum{ + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + .zanwu{ + width: 100%; + height: 30px; + margin-top: 10px; + span{ + height: 40px; + margin-top: 15px; + margin-left: 5%; + font-size: 16px; + } + } + .imghe{ + width: 50%; + display: flex; + flex-direction: column; + cursor: pointer; + } + img{ + width: 170px; + height: 100px; + margin-left: 5%; + margin-top: 7%; + } + input{ + width: 80%; + border: none; + outline: none; + } + } +} + +//icon统一样式 +.mat-icon { + cursor:pointer; + width: 18px; + height: 18px; + vertical-align:top; + margin-right: 10px; +} +.title {margin-right: 30px;font-weight: 500; font-size: 18px;} + +.material { + cursor:pointer; + height: 30px; + font-size: 16px; + margin-top: 10px; + padding-left: 15px; + span { + max-width: 200px; + display: inline-block; + overflow: hidden; + text-overflow:ellipsis; + white-space: nowrap; + } + .btn { + color: #FFC122; + } +} +.imgBox{ + width: 300px; + height: 200px; + margin: 0 35px 35px 0; + display: inline-block; + position: relative; + .fixedImg { + width: 100%; + height: 170px; + text-align: center; + margin-bottom: 3px; + img { + width: auto; + height: auto; + max-width: 100%; + height: 100%; + cursor:pointer; + } + } + input{ + font-size:12px; + width: 100px; + height:18px; + border-radius:3px; + border:1px solid #c8cccf; + outline:0; + text-align:left; + padding-left: 5px; + display:inline-block; + cursor: pointer;} + input::-webkit-input-placeholder{ + color: #986655; + font-size: 12px; + } + a {display: inline-block; + width: 45px; + height: 24px; + line-height: 24px; + text-align: center; + border-radius: 3px; + background-color: #2196F3; + font-size: 14px; + color: #fff;} +} +.uploadFileFixed { + position: relative; + .uploadFile { + opacity:0; + display: inline-block; + width: 88px; + height: 36px; + position: absolute; + top: 0px; + left: 0px; + } +} +//分页 +.mat-paginator { + background-color: rgba(255,255,255,0); + padding-right: 10%; +} +.isLoading{ + display: inline-block; + margin-left: 15px; + top: 8px; +} + +//左侧实景图文件样式 +.leftFile { + background-color: rgba(225,225,225,0.8); +} +//选中图片样式 +.selectImg { + -webkit-filter: drop-shadow(0px 0px 5px #000); + filter: drop-shadow(0px 0px 5px #000); + border: 1px solid red; +} +.checkedImg { + position: absolute; + top: 1px; + right: 1px; + color:#00FF00; + font-size: 30px; + z-index: 999; +} +//预览图片旋转角度 +.rotateA {transform: rotate(90deg) scale(0.75);} +.rotateB {transform: rotate(180deg)} +.rotateC {transform: rotate(270deg) scale(0.75);} + + + +//预览图片 +.previewImgBox { + width: 1500px; + height: 700px; + text-align: center; + img{ + width: auto; + height: auto; + max-width: 100%; + height: 100%;} +} +.previewImgBottom { + text-align: center; + height: 30px; + margin: 20px auto; +} diff --git a/src/app/gis-management/realistic-picture-look/realistic-picture.component.ts b/src/app/gis-management/realistic-picture-look/realistic-picture.component.ts new file mode 100644 index 0000000..262d8c2 --- /dev/null +++ b/src/app/gis-management/realistic-picture-look/realistic-picture.component.ts @@ -0,0 +1,417 @@ +import { Component, OnInit, Inject, ViewChild } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { FileUploader } from 'ng2-file-upload'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar'; +import Swiper from 'swiper'; +import { Router,ActivatedRoute } from '@angular/router' + +@Component({ + selector: 'app-realistic-picture-look', + templateUrl: './realistic-picture.component.html', + styleUrls: ['./realistic-picture.component.scss'] +}) +export class RealisticPictureLookComponent implements OnInit { + uploader:FileUploader = new FileUploader({ //初始化上传文件 + url: `/api/Objects/PlanPlatform/${this.route.snapshot.queryParams.id}/RealImgs`, + method: "POST", + itemAlias: "uploadedfile", + autoUpload: false, + removeAfterUpload:true, + }); + + constructor(private router:Router,private route:ActivatedRoute,private http:HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar) { } + + ngOnInit(): void { + let companyId = this.unitId + this.http.get('/api/RealityImageGroups',{params:{ + companyId : companyId + }}).subscribe((data:any)=>{ + this.allRealPicture = data + this.selectReal = data[0] + this.getAllRealPicture() + }) + + } + + unitId:any = sessionStorage.getItem('unitId') + + companyId:any; //单位编号 + allRealPicture:any=[]; //所有实景图文件 + selectReal:any; //选中的实景图文件 + selectRealIndex:number=0; //选中的实景图文件下标 + allImages:any=[]; //实景图文件对应所有的实景图 + isDownload:boolean = false; //是否批量下载 + downloadList:any = []; //选中需要下载的图片 + + //分页 + @ViewChild(MatPaginator, {static: true}) + paginator: MatPaginator; + length:any; //共多少条数据 + pageSize:any = '12'; //每页条数 + pageSizeOptions: number[] = [12] //设置每页条数 + PageNumber:any; //第几页 + + //分页切换 + chagePage (e) { + this.PageNumber = e.pageIndex+1 + this.getAllRealPicture() + } + + //获取所有实景图分组 + getAllGrouping () { + let companyId = this.unitId + this.http.get('/api/RealityImageGroups',{params:{ + companyId : companyId + }}).subscribe((data:any)=>{ + this.allRealPicture = data + this.selectReal = data[this.selectRealIndex] + }) + } + + //获取实景图分组对应实景图 + getAllRealPicture () { + if (this.selectReal) { + let data ={ + groupId: this.selectReal.id, + PageNumber: this.PageNumber || 1, + pageSize: this.pageSize, + } + this.http.get('/api/RealityImages',{params:data}).subscribe((data:any)=>{ + this.allImages = data.items + // console.log(789,this.allImages) + this.length = data.totalCount + this.pageSize = data.pageSize + this.downloadList = [] + //console.log(this.allImages) + this.allImages.forEach(element => { //每张图片设置选中状态为false + element.newImageUrl = `/api/Objects/PlanPlatform/${element.imageUrl}?x-oss-process=image/resize,m_fill,h_170,w_299` //处理图片URL地址 + element.checked = false //图片是否选中布尔值 + element.nameStart = element.name.substring(0,element.name.lastIndexOf(".")); //图片名称前缀 + element.nameEnd = element.name.substring(element.name.lastIndexOf("."),element.name.length); //图片名称后缀 + }); + + }) + } + } + + //切换左侧实景图文件 + changeReal (e,index) { + //this.allImages=[] + if (this.selectRealIndex != index) { + this.selectReal = e + this.selectRealIndex = index + this.isDownload = false + this.downloadList = [] + this.getAllRealPicture() + } + + } + + //选择批量下载 + download () { + this.isDownload = !this.isDownload + if (!this.isDownload) { //取消批量下载时数组清空 + this.allImages.forEach(element => {element.checked = false}); + this.downloadList = [] + } + } + + // 预览图片---批量选择图片 + operation (e,index) { + if (this.isDownload) { //批量选择图片 + e.checked = !e.checked + if (e.checked==true) {this.downloadList.push(e)} + else {this.downloadList.splice(this.downloadList.findIndex(item => item.id === e.id), 1)} + } else { //预览图片 + let data = { + allImages:this.allImages, + imgIndex: index} + let dialogRef = this.dialog.open(previewImg3, + {width: '1600px', + height:'900px',data}); + dialogRef.afterClosed().subscribe(); + } + + } + + //新建实景图文件 + addReal () { + + } + + //编辑实景图文件 + editReal () { + + } + + //删除实景图文件 + delete () { + let companyId = this.unitId + if (this.selectReal) { + let isDelete = confirm('您确定要删除吗') + if (isDelete) { + this.http.delete(`/api/RealityImageGroups/${this.selectReal.id}`).subscribe(data=>{ + this.http.get('/api/RealityImageGroups',{params:{ + companyId : companyId + }}).subscribe((data:any)=>{ + this.allRealPicture = data + this.selectReal = data[this.selectRealIndex] + this.allImages = [] + this.getAllRealPicture() + }) + }) + } + } + } + + + + //实景图修改 + preservationImg (e) { + let data = { + id:e.id, + name:e.nameStart+e.nameEnd, + imageUrl:e.imageUrl, + realityImageGroupId:e.realityImageGroupId + } + this.http.put(`/api/RealityImages/${e.id}`,data).subscribe(data=>{ + this.getAllRealPicture() + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('图片修改成功','确定',config); + }) + } + + //实景图删除 + deleteImg (e) { + let isDelete = confirm('您确定要删除吗') + if (isDelete) { + this.http.delete(`/api/RealityImages/${e.id}`).subscribe(data=>{ + this.getAllRealPicture() + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('图片删除成功','确定',config); + }) + this.http.delete(`/api/Objects/PlanPlatform/${e.imageUrl}`).subscribe(data=>{}) + } + } + + + + + + isLoading:boolean = false; //loading加载 + //上传文件↓ + file:any; //上传的文件 + objectName:any; //上传对象名 + uploadId:any; //上传分块上传事件编号 + + //change选择文件 + uploadFile (e) { + if (this.selectReal) { + this.file = e.target.files[0] || null //上传的文件 + let URL = window.URL.createObjectURL(this.file) + var img = new Image() + img.src = URL + let that = this + img.onload = function () { + if(img.width>=4096 || img.height>=5000 ){ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + that.snackBar.open('请选择分辨率小于4096*5000的图片','确定',config); + that.uploader.clearQueue(); //清空input控件文件 + (document.getElementById('uploadFile')).value = null //清空input框缓存 + }else{ that.startUploading() } + } //onload + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择或创建实景图文件夹','确定',config); + this.uploader.clearQueue(); //清空input控件文件 + (document.getElementById('uploadFile')).value = null //清空input框缓存 + } + } + + //上传文件 + startUploading () { + let file = this.file || null //获取上传的文件 + let fileSize = file.size || null //上传文件的总大小 + let shardSize = 5 * 1024 * 1024 //5MB一个分片 + let maxdSize = 20 * 1024 * 1024 //限制20MB + + if (file && fileSize<=shardSize) { //上传文件<=5MB时 + this.uploader.queue[0].upload();//开始上传 + this.uploader.queue[0].onSuccess = (response, status, headers) => { + if (status == 201) { // 上传文件成功,上传文件后获取服务器返回的数据 + let tempRes = JSON.parse(response); + this.objectName = tempRes.objectName + this.addRealImg() + }else { // 上传文件后获取服务器返回的数据错误 + let tempRes = JSON.parse(response); + }}; + } else if (file && fileSize>shardSize && fileSize5MB时,分块上传 + let data = {filename: file.name} + this.isLoading = true + this.http.post(`/api/NewMultipartUpload/PlanPlatform/${this.companyId}/RealImgs`,{},{params:data}).subscribe((data:any)=>{ //初始化分段上传 + this.objectName = data.objectName + this.uploadId = data.uploadId + this.subsectionUploading() + }) + } + + } + + PartNumberETag:any=[]; //每次返回需要保存的信息 + //开始分段上传 + async subsectionUploading () { + let file = this.file || null //获取上传的文件 + let fileSize = file.size || null //上传文件的总大小 + let shardSize = 5 * 1024 * 1024 //5MB一个分片 + let allSlice = Math.ceil(fileSize / shardSize) //总文件/5MB===共分多少段 + + for (let i = 0;i < allSlice;i++) { //循环分段上传 + let start = i * shardSize //切割文件开始位置 + let end = Math.min(fileSize, start + shardSize); //切割文件结束位置 + let formData = new FormData() + formData.append("file",file.slice(start, end)) + + //同步写法实现异步调用 + let result = await new Promise((resolve, reject) => { + // await 需要后面返回一个 promise 对象 + this.http.post(`/api/MultipartUpload/PlanPlatform/${this.objectName}?uploadId=${this.uploadId}&partNumber=${i+1}`,formData).subscribe((data:any)=>{ + let msg = { + "partNumber":data.partNumber || null, + "eTag": data.eTag || null} + resolve(msg) // 调用 promise 内置方法处理成功 + }) + }); + this.PartNumberETag.push(result) + if (this.PartNumberETag.length === allSlice) {this.endUploading()} + }//for循环 + + } + + //完成分块上传 + endUploading () { + let data = this.PartNumberETag + let paramsData = {uploadId:this.uploadId} + this.http.post(`/api/CompleteMultipartUpload/PlanPlatform/${this.objectName}`,data,{params:paramsData}).subscribe(data=>{ + this.addRealImg() //上传完成后,发送请求创建实景图 + this.isLoading = false + this.uploader.clearQueue(); //清空input控件文件 + this.PartNumberETag =[] //清空保存返回的信息 + }) + } + + //上传图片成功后获取url地址发送请求创建实景图 + addRealImg () { + let data = { + name: this.file.name, + imageUrl:this.objectName, + realityImageGroupId: this.selectReal.id, + } + this.http.post('/api/RealityImages',data).subscribe(data=>{ + (document.getElementById('uploadFile')).value = null //清空input框缓存 + this.getAllRealPicture() + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('图片上传成功','确定',config); + }) + } + + + + //批量下载↓ + //开始下载 + async batchDownload () { + if (this.downloadList.length) { //开始批量循环下载 + this.isLoading = true + for (let i=0;i{ + this.http.get(`/api/Objects/PlanPlatform/${this.downloadList[i].imageUrl}`,{responseType: 'blob'},).subscribe(data=>{ + let url = window.URL.createObjectURL(new Blob([data])); //createObjectURL创建一个下载Blob的url地址 + let link = document.createElement("a"); + link.style.display = "none"; + link.href = url; + link.setAttribute("download", this.downloadList[i].name); + document.body.appendChild(link); + link.click(); + result('success')}) + }) + if(i == this.downloadList.length-1) { //判断是否下载完毕 + this.isLoading = false + this.isDownload = false + this.allImages.forEach(element => {element.checked = false}); + this.downloadList = []} + + } //for循环 + } else { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择图片','确定',config);} + } + + + + + +} + + + +//预览图片组件 +@Component({ + selector: 'app-previewImg', + templateUrl: './previewImg.html', + styleUrls: ['./realistic-picture.component.scss'] +}) +export class previewImg3 { + + constructor(private http:HttpClient,public dialog: MatDialog,public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data) { } + testSwiper: Swiper; + + ngOnInit(): void { + this.allImages = this.data.allImages + this.allImages.forEach(element => { + element.previewImageUrl = `/api/Objects/PlanPlatform/${element.imageUrl}?x-oss-process=image/auto-orient,1` //处理图片URL地址 + }); + } + + ngAfterViewInit() { + this.testSwiper = new Swiper('.swiper-container', { + lazy: true, + initialSlide: this.data.imgIndex, + direction: 'horizontal', + loop: false, + + + + // 如果需要前进后退按钮 + navigation: { + nextEl: '.swiper-button-next', + prevEl: '.swiper-button-prev', + } + }); + } + + allImages:any; //展示所有的图片 + rotationAngle:number=0; //旋转角度 + + //旋转图片 + rotate () { + this.rotationAngle = this.rotationAngle+90 + if (this.rotationAngle === 360) {this.rotationAngle = 0} + } + +} + + diff --git a/src/app/navigation/navigation.component.html b/src/app/navigation/navigation.component.html index 61e4648..113eca0 100644 --- a/src/app/navigation/navigation.component.html +++ b/src/app/navigation/navigation.component.html @@ -57,8 +57,12 @@
+
+
+
+
diff --git a/src/app/navigation/navigation.component.scss b/src/app/navigation/navigation.component.scss index eccfaa5..ac1347c 100644 --- a/src/app/navigation/navigation.component.scss +++ b/src/app/navigation/navigation.component.scss @@ -18,6 +18,8 @@ mat-sidenav{ width: 100%; li{ + outline: none; + border: none; line-height: 48px; cursor: pointer; background-color: #3c4252; @@ -122,6 +124,8 @@ mat-sidenav{ .example-sidenav-content{ height: 100%; overflow: hidden; + display: flex; + flex-direction: column;; } .disabledclass{ mat-panel-title{ diff --git a/src/app/plan-management/plan-management.module.ts b/src/app/plan-management/plan-management.module.ts index d874586..21a83f5 100644 --- a/src/app/plan-management/plan-management.module.ts +++ b/src/app/plan-management/plan-management.module.ts @@ -102,6 +102,7 @@ import { WebLookComponent } from './web-look/web-look.component'; MatToolbarModule, MatTooltipModule, MatTreeModule - ] + ], + exports:[PlanType, AuditSatus, PlanLevel] }) export class PlanManagementModule { } diff --git a/src/app/ui/material-bank/addoriginalcopy.component.html b/src/app/ui/material-bank/addoriginalcopy.component.html index eb0ac05..90fdbe0 100644 --- a/src/app/ui/material-bank/addoriginalcopy.component.html +++ b/src/app/ui/material-bank/addoriginalcopy.component.html @@ -14,6 +14,7 @@ 多点连线 多边形 + 矢量图
diff --git a/src/app/ui/material-bank/editoriginalcopy.component.html b/src/app/ui/material-bank/editoriginalcopy.component.html index e00e323..788a503 100644 --- a/src/app/ui/material-bank/editoriginalcopy.component.html +++ b/src/app/ui/material-bank/editoriginalcopy.component.html @@ -14,6 +14,7 @@ 多点连线 多边形 + 矢量图
diff --git a/src/assets/images/2D.jpg b/src/assets/images/2D.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8e3b438181974605201f3ea150ebc83934a1ef1 GIT binary patch literal 6575 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 IRG*gq2YMRA9RL6T literal 0 HcmV?d00001 diff --git a/src/assets/images/3dicon.png b/src/assets/images/3dicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9aae7a9244813baa59822d9b9f8ff8da859218f0 GIT binary patch literal 308 zcmV-40n7f0P)l+BVDyZ5@d;mdQbIl$1 zUGKd6&W_-=d+zx^&pGFwpm}1N6KqTNF%4Yu z=C>fG6GQP7vX;CO;S1}+4vl1_F^#c3coZxN^iCs?j} ztiY<$x=&T(@8BC2T2v=FzUNZsaauNJx+c&D4w2*C z-<69gkNFZ?1#W`*TMorA`1y|UC0{Qq_>38>;YbWm_0(_9iBA4KStNx30000-e-hfuB zS_$mwY;aKG*!dvN&Z_h$MON&Mot>SXo%yc`1ySGPIUksb8M6e0@jV=^yrB?|Lnwgb zEw0JoWyYn$-w`SsHM)SK+{ys&%RG7C!}H`0b8?fl9?csJ>=0w2*_?2`v`a^DgrN;^ zyvb$x)jmcee7a zYlKe+Jho~wYw0)|Co?iZp_ z4nyt~I8`W5HA>=K166nb-Nb-3)#$+162p&-4(-u$l zx^9*_i~y&8pX~v@UI6?P;c2hyqk3jKwq+W?({TTUl8+f!B+~$5r70+3JN9H6fLYH2 znkl$NvSR@0?9(MU-~oy;0OWuN5bpRCVCYQ&NmO*Fz^T%k8ZC_X*_6h*YJsK{7DJUp z8td4JHu{7)7Om2D8Nf(k)}`4Li8S`T{oJ_3neG_CdTDTr8)?kK9zmA}h()HXZU$tL z3``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBxpST_jv*C{Z)e}nJ!BxzUY~B{;J!fmLqw=T zs)!Zi6xLguUSTg-M5UJqP5m{4H-Y8e>}Ri*tV;Q%ueL++?A`Az6Q>s2&F6o2kfr@} zrJd<9owvu0=P6@Ts61lP-K2it-2s8+%dhep2=s9^ z6ofFeEM`)W5oLJj^1@;=tAAj^cczr{oVkKC{J16J_p9;Dn_4Lq`dBIX(HW66QLm2e z4SN=R7GQjA$zOa}di_b4&3_HuSfn;SeAzCb@ZYW0-VzdTWj7aQd7tlz^LbK_Af!;!{$mnDv!kgbw$JQ4OztG7?( zcw*_>^%wUag8At3+cb>>Qm-CWraP>Nv$1_->3c0e+&>%S)f)A(g_2pD+ICg^Uj?D7 zSis(2!NB1@Td`u%*#Q4QMu9#v=MOHk7tUJ*2^)|ktAm9W!y%v?pRd@_WygTe~DWM4f0I%RW literal 0 HcmV?d00001 diff --git a/src/assets/images/areaicon.png b/src/assets/images/areaicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a430fa56752fe2dccb65b6acb56eb7db7df9862a GIT binary patch literal 306 zcmV-20nPr2P)b<841nR^%&>J}V1QdN6p3S$4Q>DfyKg{_z*dIdfB~fTAPh(#!3Hx%FE2<@)Dpjn zwQ%78g=s9;G@hRO`J1u(6g z-wi!Og6V?l5EtY@YM~t}y+6K5wM1%4} zd?#gP3=leDYCO6>6xlI!ab6d`HO{9-7$Zg&pqC7`JN#O7PAFmT0RR9107*qoM6N<$ Eg8R&PumAu6 literal 0 HcmV?d00001 diff --git a/src/assets/images/basicinfoicon.png b/src/assets/images/basicinfoicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1d025871e657c1a1794e50efe1b26c1d7f892822 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!3HFy_x^nYq*^^)978mMr(W8~d&oe5^+LKP ztEwt1tFr-53C{t6n~gjN7^06l*lSX!|P@607Q8!LiPD>YNR;)lHh8O>>jkpVeFavSn#{ pY~pABknLZ7)q1tga9f=DPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D14BtfK~!i%)tN1D z>Od5Q5eNhVQBhHes6ZepD-cLT1p-llKvp7f6%`c~2n3=6fv7+rkq9ILfj}S;6$k_Z zf!H@^yOgj!g#8J;aAv+4=H_N|FWJ5OlZ5clYPAxtudgDP%ZWrH;l%y@y=((*`N%nu z#bP0YV8OY7wq~=LYTaJWi99|&(tv!(=ksE_-KrTaRyZmUHvza=jUhYcnzTN z$VB@6K6SVzWDe&nrI$kXsBAV%FJ2RBt;a9=fI;~7_9javRsjINVZ$|cPXth-6HiZ1 zVltV?!51bh4l9)kZNmd5t{0yMRP_UB>s@v^SKNIvn<)Vq`T?_kY=4S#*c2FN5AJoqPY77O7LtU8VnQs_4 zjX|LZ%Hwc@8be_LxO549eBdy_gC~+WLBy6+uTnd`zrP=}?Ep0zb1X0j|1v5X z2s>p*;;d~;sL>ew)0mB2g*gaqu(mCsMr*MCvia%+UypSagBqQ{-W`+Wv7I1g$Wl;arVh5}AX`hA3{x9MGR#)=6;z-AZneF#tU_ zGyfeF4(Rub6(%-R9p)TI@FsRiKnI`RP#STVhHvO`>~07i0~=%F@L*7ge^6buM4a3K~J2Ch`F zuv8EX#Nq@?MInvpECv6J%-gwSZ}m9ES1miUKW4t~dn>d$LGuW&P$puFFpKh&AQ!iN zA~#+J?Lc^oG6r;I>c7WAnD z-vAvgfacb+0}dKJw%TvtlpJL~$(B!Ou6+Ou*f79^U2?!l>?`R2S4>%tfp&m?C+{MZ z`7CP=Od???Wi`|K0*!z^|L&K8OcT?_G%~I1>?6!KCAm52&%Cc5Cxlv7qhSX=_r@g2 z$wcX-Z~Ka?X^p-D7ZjLfQvUi%gRap~M(_<_jv$-yeG+E7i+Nk^$nTW7QR5M1KFVP# z7LyLEn9cEdM!UI;8kr>KZVaS3WcoC&h~;C|UEFJ$sH8pal1X6N{&TY3rCle-e1u)a y6&kDFa%r=vd+=}MCeTKI?V?+C4p?dRW4i`d7oR+PT%%C{0000w1evThF!MarZ>s?w*$`A1qv!<+QImFB$Rt-fZ*>*b$U-1|ZdQ#k1HXho_&$Kj4Al9yx^SOa` zw6W1p%JJ6=Tw|k*7V}HI8PV6>VW<=5E#6_jT=b}BQ*Qd9t-Pq^FOJH;Z{iCE8e@@8 zv>5eRCDMhev09`b8jVea3`1QkPIEkD8&a`5$(wZxa!7Us14>~W00000NkvXXu0mjf DiEOVv literal 0 HcmV?d00001 diff --git a/src/assets/images/download.png b/src/assets/images/download.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7b603d26a915b5b415d3f0ee3f270fb5befc3e GIT binary patch literal 233 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/navicon.png b/src/assets/images/navicon.png new file mode 100644 index 0000000000000000000000000000000000000000..2f79c857b18ddbcd6dd6daa10f0bd0763497fb41 GIT binary patch literal 315 zcmV-B0mS}^P)A!9-FpWmGUzg!tcIIpvB)h-?k4#MEXsi7bz@|*u*ziTFOZC8vkbQk>Mr8G z`ab8Y@2bN&bvpH)=Xv{`_lTtB;(!?jSpimoH$}Y*ukgwOupIVeiGA)D%}40bWFUtZ zf#FEwLviADK4_sFo(C!k>8FJG3owxY7sw-~MkbyCo4{zIyoKpJywQa*9iq;KvpkHV z=NDD#?5Pu<>XGl`9REsjhiNIR#YOW5@X#mr*r2Ve|HLZr4%C9&Wr%Th)csq`Zq4t3 z*&tqHS}zjBqyC7ez;=L}m~KLzOR5*x!C`z$=n5063UV0 z)BDq5)xe5@A4X=3x(joHSvlR=wx?{q?6XZ$NQD&;S4c07*qoM6N<$f=oiK-~a#s literal 0 HcmV?d00001 diff --git a/src/assets/images/planicon.png b/src/assets/images/planicon.png new file mode 100644 index 0000000000000000000000000000000000000000..5d55f353ff7785019f36842b119e500dcdbc3cda GIT binary patch literal 255 zcmVIwX zZ=aWa1fvU}N&bp}1S7}iHNmJBAbV`#oRFBl?Cr)sa06Tjs56kQFPtFkfC_L$nfgMT z-62KUDuSo1zAn&v??oQ89qgc-2`HhgeV|1VMiPeFLYV>OBKSfht#V5veIVC&*qUl- zq#WdeW0Vyk`YV#Vt3n$k1{$vPifZ(jz{kk>4EgtC%RA)LQW7sL+1UU9002ovPDHLk FV1fxjX)*u+ literal 0 HcmV?d00001 diff --git a/src/assets/images/point.gif b/src/assets/images/point.gif new file mode 100644 index 0000000000000000000000000000000000000000..9074c395f4e3f6c3db275d9ca0298e0f3fc3f6b5 GIT binary patch literal 55 zcmZ?wbhEHbWMyDwn8?Jy!0;aefGowIEQ|~cObj|eHc*xo$mVbnSvGx7n*$?*H2|++ B4f6m1 literal 0 HcmV?d00001 diff --git a/src/assets/images/routdown.png b/src/assets/images/routdown.png new file mode 100644 index 0000000000000000000000000000000000000000..59ce9713045c67de733d6c89ccb87b29799086cf GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^96-#{?BM^bZld^ zt~hk!!VmlT5A6@LtohW#!`hS3+4lb}4-b!MMwgX@l!Ue-mqJ&Xv4O!7he~50-`FuH og;fVAe|jO8lBATx|Are3HV(q!H*XZ~1=_&i>FVdQ&MBb@08vOQYXATM literal 0 HcmV?d00001 diff --git a/src/assets/images/routdown2.png b/src/assets/images/routdown2.png new file mode 100644 index 0000000000000000000000000000000000000000..e714690339d639fde6a6d94a3247e19eb7b4516f GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~g!3HGv?z=Y!NVR#oIEH8h&%JO_u*pE6mIo_%&5x>SgB^{ZI$Gh{4m<&t;ucLK6T~a!E!2 literal 0 HcmV?d00001 diff --git a/src/assets/images/routup.png b/src/assets/images/routup.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8f2b12c6ccec9b461d5fc1e87aec707eaaf71a GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^96-#Z zcte0{fU51330jPt9-YmPpI!_In)GSn{@upYtuIzRi+*5qRCZa!>Q$%Cf2cc^?+|)P zNF`zWgm}Z!(~a+$J~PNj&1Uuan;ph=?co{GNs$S82QJuTNzO4?YRBLBQ_!NG^LbRi w<_rHHnu5*lN1h#jxl`^k|Fw1hPFmk%T+63co^-P!6X+}kPgg&ebxsLQ0Aox|VgLXD literal 0 HcmV?d00001 diff --git a/src/assets/images/shareicon.png b/src/assets/images/shareicon.png new file mode 100644 index 0000000000000000000000000000000000000000..942b042071499e99677819a7d525f727dc60c93a GIT binary patch literal 331 zcmV-R0kr;!P)KOWEEQ|l)8NY3WY|cRVWk+5)uW8jzS{B$|YOu1878{RFIHRDwGPv79wSVH(K7l9=JT=(aGcw|*mB@jTo*M8#;bB*XGzl9 dr5Rh8{Q#LLPGO7l2xkBQ002ovPDHLkV1i2VjJ5y( literal 0 HcmV?d00001 diff --git a/src/assets/images/showhide.png b/src/assets/images/showhide.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b5278d2d8901852f38a5cd851d201b46a23b2b GIT binary patch literal 596 zcmV-a0;~OrP))qnbYs z@0OvWUkhJnjshdN@3O7bvH5j~yn=h@p(xKgn1_?lIHC=-TnjEKfT?S#>HV+HxX* z61pzzYJgN2Cs(E;^Yx{4-Ag0000a~y z(UY}bzvmbl!1QS|su~E2%B`yjPIuh4Ns3>&`5fTN3 zlFB8nP{@tUe&p7=wYe#G-e=#L*>{Dk@^v+6d9vF{A{{wjt0;RxPguc|T3YuP^mQ7g z4)jFgZ-f~p!A%{b#SPGxa%fUuf(^NkpSMA${lFbCoU!%`FpiT(xItV_&w#ni zV}*@6PUhR7ud~r!Ib2|6`<@F_dJaY`P@=^< zZ~&AtU`tLhOpen9-~{+WSc{wuE_Z+zadMiBoWc9ih3z8`q{41a6`a_glgMi5Y-3k} mDPSaWvv6MkHJrS~6Z`;OGg*G;M)oKG0000vj!Ih9y5L`imkpJ5i1Xlo55O)B76U)J=fD%jxrUXR%BO+lZyKpAH zGyW3X?pV8z#Mc2Q_Px2eop%Sq6X9W+LhCk&K7x^%E!m@AB21xaj2d46^PklGJ%KRj zu@9JmXJGD|TLW9e1E@beNkXWH-sJP74c3>t8N7v#p!Y79`xU~y5nz5~*F1Dk6&gJ{ zoOR)ujRNFH=qsw{gj%yxc;t=%t8?ClJyKN96l(s#XHK}A1GMfq8oVXN;#D6WDMY~X z=xcoi*UZ#AI-XA9fl>tMPw+vazrYhk0hm6+2RpmWKA%zq@O$`xD1#?T5#TKOmC4`< zg}{jdAaJ4p2%IPY0w)T9z^UT}!Dnd$$`)+4W_f}s%NT=r{E!b>EQik%h9`_ObiX}k z9ck8GGoUT1MtzD|y;m-~#h(KC;78jH-lE#r*CXzyg?dMR4p<%e-BhV$_LKZA7`>te zSoxFKv00+peD=1neg(-`f3gacT038|1t3&q(5#&=*#dB70%SK&;!F^M69quvL;(;u zQ2+!^6aaw}1%MFv`x`GS({du9UK^I(8W+eBz;>S|3m2Vf1>^`|+iF2auA3<32(Ume zf7WrC55x#Shqhr-+os9XWj>H~8B}!}1(Q4*+eqQzVtv84rm zgT}zzJ4uFe)&_las6y7_=w!pT3>70s05v}-ui&~^tQ9m9+#B)mbq2@CnhIMH92Z4` zE`xlr6rold@wa_vP1|y2f~{Z8|1&`vx~d6eO@vz4Cs4YZzjRU=igSdhdEL7uLgk3G z#Fip}kKq8Zo}kGI12};AM{>3LFK~bmCMwv$Tg=#_Eso7aNGMGH0RVa0vTWzJyZ`_I M07*qoM6N<$f*prX9RL6T literal 0 HcmV?d00001 diff --git a/src/assets/images/其他.png b/src/assets/images/其他.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0bcbc6788b7486e3dee94f427b28128fa5d6f8 GIT binary patch literal 791 zcmV+y1L*vTP)u#yGqW?91#+ahtsgc&>iY;06TV}L9+wVs zLLmpnfj9p7`tk0P>cBJJ1vEeDE;ObM`%NQZ9Uk#2U`F^qXrTLfNv*;Y-UPUWxA>GG zE}*re>ssTDDYuf`XC%C>R{9;hQ<2EPu_{&GY0kb+bK3KZUwT0&w01q^RV zB_YvH@anc+DQI}2zEH(Z(jzwK5kTQh<(DV}8Y{cY>Xl1XCjq4jZ*i0`a|+POZRx@j z3SF1O*8d6^H}DMQWn-3vsZ(Ie$!%Ggdg6SnfH@0qIab0E0dpGOazw%*0dpSSa!A5o z0fB_KtQ!fNbTPRKh#o%|i6L;tUOR1s=mjQ9i0S2-`9w~I%S04_z=;A7I8gusCkjB| zEWjhRDsb-{uv`PqpBNS5#{uy5C$Kdbm2dm-hL^1{1%28u!B4x@fA<}DzL#A@A-2MI zO^?66;vSy3b9QtO-7Agg6j)mX9xNgiG+iED9DTmngBW5XfO;=&_(@2jOZm!pOrCQhpv;|+AN<0hL1>6=CkYp)! zgZxDeK1t4&u00d4HfWV0Y5I9kQQ!Rx)%17U&(r-Y@ V3g;l--@^a^002ovPDHLkV1kL9M9BaE literal 0 HcmV?d00001 diff --git a/src/assets/images/医院.png b/src/assets/images/医院.png new file mode 100644 index 0000000000000000000000000000000000000000..2da56bad9c7d152e7638da4d99e5c957888efcb4 GIT binary patch literal 1158 zcmV;11bO?3P)7-q z9^>vcfC;4BX0R-iCkQbIaK|J-VFchwdrs?U*AwdFKLp>})`|8s!5#l)JbSJyo%nzx zQ2eiS`m2M=2A7a>pi`s^Um?UJgc!78Zh8`U@xK8ugp{k|KPjh$+qBg^*~kmDTM9;oO#B$hLp)tX&Ms9_=U&)VKrWe>4ESOnfE$FxKK}KAexiF%l|u_ z_g6I!TdfPIX!`D%eWSnk)Z`JGX+li=OK*FmRTZ zclhF;3!6@;H~qu&{oo2SMiX3lniKzA*mOdXaOKg7;M5sI!m8%;WkFC`sVV;dSn~d+ zs1~b#CeDiaXdHr+_XW{3Mu>g2h}DF7Az&nK>aENz@xLg_T|3s0vg%PnxQtoq%5r~i zU%z#8j^IKnzD^(`$kh+yw$E5M#E<~}_Q#fNqr`Aqh-WzznMk{oep@;E`UbHiKzrUe zWj`|A0_rXPxs8)p^on`PI?)iR)()=tx8YgmeG|U)XW~#NB2iBQ#kQKD?-_c+sOH+l zM%N%N?DfLB*s_!0E^R+5YFqkM68sh6N5`d^L2Sa9z3-nHmFGM31k!=OH8$0W*&c&H zaop&FYmZRxyYXCiiR@`vA3hrwU48y1=TeozD1?NqvBn7a>gzh99zwWC7?#WHyxVa9 zDLPLAEaA{5OieNSf@X|Q8C~Zj$Vq}*Q_O3mF;u)4G4E7y}D zgoL4Pu+~4M8y7|`ur^wCVReGrmLPO)vdO+J!0oQ-bZ#`a|h&-@XXrKpxvjoPoyqb=Ml(W-=VMqToQbZ%$R#0 zbWC6BxAyQ}ws5mU$dMS|Te5AQtctc5Z}TSPR0_-P^mT&URo%Ns^!eDSD-Dn4*pRze znt8X+=z7$NlUU>?fg8_RkNf8&Va+~nNB6B;w@9P&YX=-jAatGt97!N_o&*F`jAMOR zs|f~yW7vP&5H<$uX8~LiMhSX)XAvh+Y)CQ20XiQJIFdl3Ea$hC$;HUIzs07*qoM6N<$f|#EucmMzZ literal 0 HcmV?d00001 diff --git a/src/assets/images/危化品.png b/src/assets/images/危化品.png new file mode 100644 index 0000000000000000000000000000000000000000..9d39ecf8537e168ad302a0c8796897e0fd65ff56 GIT binary patch literal 1885 zcmV-j2cr0iP)3SkacCqsB#}^^8@D6})TS5P2b6|OoWG#1 zkcf+f8V#!Ow^gazIKLpmrf(6TiD4@n3+71n)n^adpe=hkLUa2z=W>@WNUzP_{f29V4a|Q zj-NOb+pgOWhS+R3oG$>h#|0)TI-t^g?LK4R-+lROY@2RBLC^&OSeC3dUn4h_JhV=HkN0f; z9>2^D^iu&QYytRz_f^z&a!=b0p8WW461c)z{fOwXwL>W%Fh9ADS)gdAgWOmOWL_OS z1lv#iaIaDTbL%EgKPmK6U04|!1tv<-Am;q9U@~MZs*MK7ovfLDL=hBF&Irv<-r1;? zxt<54yRb5R928J?gaRq1L6eV{Ukg9_Sb0!HSpbXWp$aaaRZxT?y2D3$!Vf11Y6iDs zX<_Acb|R#KmMh$I(3_^^2MUmaYtSx0YL9d!_yy3wKw)GJGeq`vu0Eh}wh{dNeE)Ii z1MrYo81X3^?1Bb{N@Hq5P{+*V2_w-U4TJ`yx*eEQO--IKem>yB)V-XLK^{^d09kyx z<}eVhR7xPEtle0T`y@=lnnpSOR8%k}^W# zO6XbEEsiP+Ag(a#`@!6&Uz`lRGIW_GXb=RlXjyde9lZG~X2VI62MV-Ph;-W#RX=tGJvyjG9p!)pP|?)C0G zx6Me}v~@8P4jsr>)OiAG0mE7X3WoqR=X;$LUxCV4VoTw;e!c zT1P?E&KZV#f2{M}Y6_8+53oXoBb-DxW0l4NZ{yK39% z2d!J5r4}G5Sb;T1fSp6r7201MP-*e%&~j5-Heq+Pq7vD0GMyCrHzrs=q%|Y4AS#1k z6@ghET{JmV!rj{18Re$SSOUOu z*iv$5C*on~$oM|w8-ByH=vj;!DE$1T@(`;|z;cBt761k6Ka0yhdEy<9nmlo-JX|7A zP73uh7e0fX9AO1RGF-YmwLu;nPOOl`ORL{gKu78d)1$1Bb}YatfSB;$cphcfV*whJ za3XF&B_zj9dT^v4FfG0mrC@6Tl3aZ@PT;^kAW?tFG$uMO$Cx|J-Dg}dh=iVslwPED zp~<8EP%hP{krk$&usC3pcKwMqZJp7m4a(T$$kvvB8w}Fh>s6x;Xx7K!f(9BVL@4Lq z`fxILCTn*@p)`tSG>EY8`+Pot6e37_Mp$A*)RbQ_&G5CJ1UW0|P&8VZ?QL&aSJ?jo XamJ5a#Uiut00000NkvXXu0mjfDuiPh literal 0 HcmV?d00001 diff --git a/src/assets/images/厂房.png b/src/assets/images/厂房.png new file mode 100644 index 0000000000000000000000000000000000000000..11dd1d591b0b3718edffd426eedb2fdcc30cbbec GIT binary patch literal 739 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/学校.png b/src/assets/images/学校.png new file mode 100644 index 0000000000000000000000000000000000000000..e698b5dcc594d527c885db416a8c880370a0da6f GIT binary patch literal 754 zcmVn6~yMK&-E?MgO@#tKFu^0fz zX{n#e?=B+6HJwT@wn}+tfy=*%N7^*mACJy9MmqBTG6`_p0(dbNL#FXIu&)F<{)#h~ ze-jU!xdy8Qx=T6Z-9Ls)sacLv?#JO?NPuI&HIP==yrlZU_cFtUdja@Kv4J=m^@IhT z{V&^ZQY9n+js}`SSj|>kXEg`6VMp0*IllE++C5!@N|CzvCHfS7?`7sexces_DkVdfN z!s;hutLQM_+AIeYc7KzekY)#JbV8-66Qb`sAW8570Q_lb8EsT~P)em{L;0c&o`>@7j7?+K#qFGY5)vo3+HZui02xz6ZM2P6re=p`UY z@I)^GNrFc+m0nOi!38bX^iqjbH6$#l0kd6xuc9|&tD?%e|IpDIjmP1xCSU_~riQdi z#L(zK9c`*m<7FZ@C3y)!Rb&z+wi-kwG_8UfpSARCt{2o6T+8Fcg4air(w9F4YG00z|Vx)4PBs6I7X?=>%0K zr~_~SXM#G=0F^hWFFeN+xOmVLs>+f`krXMJ`hWn=k7)8UMZWi_T%ArQ@Cg^}7T-RJ z@{O-NR{5C=yhz}J z-2lL@ z7>1<9j09Amh*&lwR2Rm0h5~^4EG^!uN+`(c+&HLIq?9Doa)ddFI8c#CigKJl3ry@e zSyJT@Zv)lsa&VkLRpVbH4#1cs%CCmB5q!i5i-eNkCBPz~gHH)$DODuEKGY{FTi3=EoX`y$6)3AKkUFM-a(8QGfP>=^+Eq+M?zlQ5+drqPf| z@OhqKo6fQHN}xw(9;ZG!1@8KG3DwHd&_`{i!k%`9-fU8}p0G1H@brjM_4%#C{vD}G zUDf;6EzdUGQxywnQFc<;bt$1)`Nd}zp(f(K`Lqe$hQG(|n6uoWV_Fs+ulugCPViYI zED}nBmjH`|5@!;)V4KGGt41iBHH#t5YsNyBN~g60jMzfNxUa{A6;vL^Z!0^$k{1%@Vf)_ zNSI^BsLEMgp;ZE<&X-V3X>!+=kI1%2ynmF=_-6o~K~&rCKLFq_eg_+tC;sRr00000 LNkvXXu0mjfT5g(C literal 0 HcmV?d00001 diff --git a/src/assets/images/影剧院.png b/src/assets/images/影剧院.png new file mode 100644 index 0000000000000000000000000000000000000000..4e60bed49cc72aa06718f98e35bee48814323610 GIT binary patch literal 1040 zcmV+r1n>KaP))x^3Bfnx(Tq*P%eQZT0CjOV9Ozs~6PggwEs^>h zm&{lb(HnneIsNU@#Iul)CiIPno`~qP@RlWCpXK!4g*_)FAx)ImUmHAp84HjRR2e5D zAx)I$9|J74C8AkKRh)!`G*RBa54hx>b4iw~oZ*ejfQD5fO=upN0LF;JDoyAr#A2P2 zfE@7B(el^GFW#_*Lrn?e(#7$(awVuVQF6Tw_~2Ez%W`E?YgCeuCNx6{b3H(9=|UO& z+0AnwVUy*`QLS-A0%D9M_NC#1-?N;4n7>F9<((Vh{X13`R5phCn%FS)Ns=EVfPl4! ze3x0Sysy{#BfM{srYXTUE^IMcd7reqj zkpSbR(zW3!O_ZD`f@}B4JGFqsB^AKS_De{&wUkO2HCW48UG#N_SyzN zE^uQcX<|feuW$L2K$Bntm%%ZYA(WyivbhbC7%h*^l|Zl3ISDpncAW7|*&*>koE~) z)8r?_cikpOWo*MhTUmOC8YE%yf;N4Hhq*$iND{V&*C2KA@b%zoZ;x7HVQ2Y(&r{3} zoVP?twhpX>m4gKBskPxH*Y+51j=m%2+is;vA;}q5XcAmA|4oCgY-3E7JWKrcHPZ3F zyql>@7`zB$lfp;FN23#RZ4>(jW!4H^9i9XYkOYfzhlc@a8NyftdXF*4uCqBxPZ0Og zj9kVx%j>(lfSav5>^2A4WF@mtz@oP;6|r=+%Ghgo5RS%m_{9@yNCK#8dkrOUjvtpQ zn6P=1tt!dHQVZNDp1_f319D9W4N-}Z!5X2;$??g5rvYam3 zuGabC%m0ArNg#BL(E=0fI!Y2S1;1hxxQi|v;Qcpq7K%m*CGQ_03MEu|-$bvKVDr9- z-YUW6eG|P=0#3m-u9}>y_9+}%pGQXDG15Rnf#^w~frJ9llRyIr1)?W`1`-NHPXY}j z6o{S#8b~P6rvb`*Z)x1*y@=kBP=3?B$=8i~8xDBkdn$R8uGcw%Pp|R1z_abTC=#Pf z712}&n<}C!kyWaQvQH?hBI*NK{gt8UJ4PBvD8S)ht)aaK5&Z+)6)o0m3zFOb0000< KMNUMnLSTXz4BPks literal 0 HcmV?d00001 diff --git a/src/assets/images/轨道交通.png b/src/assets/images/轨道交通.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2483a4b4edd16a945d96b2ef342fcb6423b74f GIT binary patch literal 1161 zcmV;41a|w0P)JwQkh6NpSK40L288zUX)3KLQbODp&*pfueoww4hwv9Xnnm4OK)mTm|r zETvMD!5uozsome2vwMF0zK`!7y9NZTZMj`=@F;6c{UX4|3P9r$kofrr;Prce zgCDs=w|AbI4Pat{$=aq{&bxTeufG8AJ_4CHA5a(XSzmqWTEK)Y02sK79eQ*Og<>q+ z2PSL*jDZ$*?BW8DA+?Od&t)2x0PAg6a}JiUlAgCPL* z80wq?ycV$d{`XvA2oO=*hB&9uVGJn!?^(P6WTt> z6mEijYL8zyvIt}WoPpawBw|#6KZYuTW%vMD088vO&J!R&7LMTqbPq7ZM6hYGM@;qvx|ImC=bSAgl1|LzBlPVlXY zZvj*O{tv_pq855Ac3>6ye+Xf&C=c*q!*LgWLxsTl0BRlJ!v@3HH{QG+i?;$I+HV2A z9srp^K(e1V4tH71utBm446v8d$T_0~;D!x#!A2;+6%jjUTm>-0hDf6VxFRCwoGUQ&H3?E4KN_`lAIQ{l7q9* zFu;Js2qDJ@QU##C0iLF=*aAW^n^|v;Qw2Eg@E?DkNU;K>=gJC5(px|nfRx1qJy`)s zmH?svq%;Pwow16bB0wiBum6fzFNRnH?Rwn?(lJ-_RQ2=9PPk=HK z8)4#lAh`mZ%m7P?L$-h<04X_%0m+O2k^rRaBn2ch0@yRy|AC}{WcIy)A0%7>JiG^R z=N72)=}Z3uY6(eijwdR>zX6s6AOX!)U_fbi*_;kYCIrxW1FX3f4ruKzrvs8n0Sy1M z^Kmq{!hwkKwP_+#K47zcns0Eb104c%%16tlP9*~R+pwj>K0$ZR6BOD3fbXp)PumaTl#f|>OrYC@A08#-H z^wdH?(i4F5349t=FhNha=AHm)VF8CKm|%~=rmyb-iUCL^Ob|w&)?4iWq!K3Brx%b| z$s6EliZs9?{)P`oY`pwcv#lZxFre9DaT^@k#dEM12L-zz#NU|*a|qK`S~^t_-}wEV b=VtFekWSH5jJdf)@dZ#FN&I)D)!IKmh~Zci_33zbI+BC^evecLS$zed zk74bov!u`Z??&a>CPmkxiXde50l=7!5r8YlCbj?;0Pa|(HqAY?Tm0l1#Li4}k;$1n*Nfu6p8DmS5>@nA;7`yAw{aK@vsiDfVr>+xhEul!)Z&q{&H(G;H1R<+&&!d5fa1j7_r=vaL$`mp? zMWDp!6fZ{HjJw)1SwiQ@0n7n>2k=ql*+3rvJ_Gnc^#X2g=z%u!Hn9jw53i;g0M!$9 z7%nNa70mA@BYNX~g~<{|jGfQ|jBJV^D$h!~_KxxTt@qL@0@VsQ>w_axyskrHaXRJJ zG`h9Sb{ffxuI3tTc^si zf~v;s<^Nd2VHauIF3KcOED;KyN|Fg0Dl6`GV~DV<N16ts#a8Rx`oAP^pe9>O8~k z7*|vrHK85mtl>AdYni8Hm0c;h5-2VacB$7e zQ1oHBCYK0hs=WzyC<+Bn;Btr%D>1SqI2v&{#;I#!BxI#$w|+JJOGg){nJ*oUgsgM| z_08qHI-!=Zjj;*CgCO4!Dnc)o@=#Rrp12JWA#|dZo5D9_hKLX~J$9wG(#08H5#~Le zWAsX(e4;~eVnoAe5Yk3VyHB*<$!Ybik0qQWF|viCl~V%cD#ED~BU_?w`fyH+P5})! z>k8E1%fsW#mcHXv9K)lc=5GLxeHWm{djQu*-|1yP^@pfGPqbsSEl|7*Nlkk~)2^NA z+0Q_Md_wQn6h&tJyz_kl#Iy+p00000NkvXXu0mjfN8r(? literal 0 HcmV?d00001 diff --git a/src/assets/images/餐饮.png b/src/assets/images/餐饮.png new file mode 100644 index 0000000000000000000000000000000000000000..41174620c84de5e90274284cefe0d3549722fa04 GIT binary patch literal 828 zcmV-C1H=4@P)gbtR2?~to6Y$^z;Af$q&1gC;P z1q&CS;qLe1?ZD{(Dj-iDiFJ%5{7=HR{JX#ten$S78O@Buhs)&x*ZJtW02o9doEHIu z2*js{eRJr|0nBrwJNQv-dn)!g~jR7P8Mv_m@{8jbY1b%cfIXzpeLm+v`H*WId^g-Es;BW4l zQ5qi%W6KgwIT7T)Fj>q2z*A=Q4SqB=IX&~15PB1d73`!YPGdoC^y%ihhOv<+Or)cs zw=Q+PLCm@XnK$$4mzsC_$*m`8XlDOmMg&TT*pj$t_|E&(UHs_K|oW*$+0b)W$E=K%tMyIaEDuQJswLB6Ixl3(znN{Ll9 zOCa-)TO!ByT8NPvSP*KY$`_|ejw2$cQBEfzpfN{Hg_Krvv~0Rb4_G#Tj) zWnx0mvKVlWm!hjiF?XPwy_%h~5eoGq?pp%6ft5Cw0Y*jUUc?<%9f<=f7QC~qL@xrZ z26ZdIHlPiX_bkD9Ys(Tdoi*GOp;Xe*a+E))S_CSKyBrJhEVz5$ptFQpm03%XK9f!a zZA9(A2oyy6yF5xt_TklVrE~oj>J{;aD%>ya>2Cvqbv~D^NbNT(5&aCTUPYbo8Aou;y!*?%fT?Xcms!?sIL zP=hmn*0h)EYV8nb&n!4!J77qg3Fk$?AOhjM2pB{F0N@`*@!(#O9Z^jH000065536?(i[0]=240|(1835008&n)>>>18,i[1]=128|(258048&n)>>>12,i[2]=128|(4032&n)>>>6,i[3]=128|63&n):n>2048?(i[0]=224|(61440&n)>>>12,i[1]=128|(4032&n)>>>6,i[2]=128|63&n):n>128?(i[0]=192|(1984&n)>>>6,i[1]=128|63&n):i[0]=n,this.parsedData.push(i)}this.parsedData=Array.prototype.concat.apply([],this.parsedData),this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function e(t,e){this.typeNumber=t,this.errorCorrectLevel=e,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}t.prototype={getLength:function(t){return this.parsedData.length},write:function(t){for(var e=0,r=this.parsedData.length;e=7&&this.setupTypeNumber(t),null==this.dataCache&&(this.dataCache=e.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,r)},setupPositionProbePattern:function(t,e){for(var r=-1;r<=7;r++)if(!(t+r<=-1||this.moduleCount<=t+r))for(var o=-1;o<=7;o++)e+o<=-1||this.moduleCount<=e+o||(this.modules[t+r][e+o]=0<=r&&r<=6&&(0==o||6==o)||0<=o&&o<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=o&&o<=4)},getBestMaskPattern:function(){for(var t=0,e=0,r=0;r<8;r++){this.makeImpl(!0,r);var o=g.getLostPoint(this);(0==r||t>o)&&(t=o,e=r)}return e},createMovieClip:function(t,e,r){var o=t.createEmptyMovieClip(e,r);this.make();for(var i=0;i>r&1);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=o}for(r=0;r<18;r++){o=!t&&1==(e>>r&1);this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=o}},setupTypeInfo:function(t,e){for(var r=this.errorCorrectLevel<<3|e,o=g.getBCHTypeInfo(r),i=0;i<15;i++){var n=!t&&1==(o>>i&1);i<6?this.modules[i][8]=n:i<8?this.modules[i+1][8]=n:this.modules[this.moduleCount-15+i][8]=n}for(i=0;i<15;i++){n=!t&&1==(o>>i&1);i<8?this.modules[8][this.moduleCount-i-1]=n:i<9?this.modules[8][15-i-1+1]=n:this.modules[8][15-i-1]=n}this.modules[this.moduleCount-8][8]=!t},mapData:function(t,e){for(var r=-1,o=this.moduleCount-1,i=7,n=0,a=this.moduleCount-1;a>0;a-=2)for(6==a&&a--;;){for(var s=0;s<2;s++)if(null==this.modules[o][a-s]){var h=!1;n>>i&1)),g.getMask(e,o,a-s)&&(h=!h),this.modules[o][a-s]=h,-1==--i&&(n++,i=7)}if((o+=r)<0||this.moduleCount<=o){o-=r,r=-r;break}}}},e.PAD0=236,e.PAD1=17,e.createData=function(t,r,o){for(var i=m.getRSBlocks(t,r),n=new _,a=0;a8*h)throw new Error("code length overflow. ("+n.getLengthInBits()+">"+8*h+")");for(n.getLengthInBits()+4<=8*h&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(!1);for(;!(n.getLengthInBits()>=8*h||(n.put(e.PAD0,8),n.getLengthInBits()>=8*h));)n.put(e.PAD1,8);return e.createBytes(n,i)},e.createBytes=function(t,e){for(var r=0,o=0,i=0,n=new Array(e.length),a=new Array(e.length),s=0;s=0?d.get(c):0}}var m=0;for(u=0;u=0;)e^=g.G15<=0;)e^=g.G18<>>=1;return e},getPatternPosition:function(t){return g.PATTERN_POSITION_TABLE[t-1]},getMask:function(t,e,r){switch(t){case i:return(e+r)%2==0;case n:return e%2==0;case a:return r%3==0;case s:return(e+r)%3==0;case h:return(Math.floor(e/2)+Math.floor(r/3))%2==0;case l:return e*r%2+e*r%3==0;case u:return(e*r%2+e*r%3)%2==0;case f:return(e*r%3+(e+r)%2)%2==0;default:throw new Error("bad maskPattern:"+t)}},getErrorCorrectPolynomial:function(t){for(var e=new p([1],0),r=0;r5&&(r+=3+n-5)}for(o=0;o=256;)t-=255;return d.EXP_TABLE[t]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},c=0;c<8;c++)d.EXP_TABLE[c]=1<>>7-t%8&1)},put:function(t,e){for(var r=0;r>>e-r-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}};var v=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];function C(){var t=!1,e=navigator.userAgent;if(/android/i.test(e)){t=!0;var r=e.toString().match(/android ([0-9]\.[0-9])/i);r&&r[1]&&(t=parseFloat(r[1]))}return t}var w=function(){var t=function(t,e){this._el=t,this._htOption=e};return t.prototype.draw=function(t){var e=this._htOption,r=this._el,o=t.getModuleCount();Math.floor(e.width/o),Math.floor(e.height/o);function i(t,e){var r=document.createElementNS("http://www.w3.org/2000/svg",t);for(var o in e)e.hasOwnProperty(o)&&r.setAttribute(o,e[o]);return r}this.clear();var n=i("svg",{viewBox:"0 0 "+String(o)+" "+String(o),width:"100%",height:"100%",fill:e.colorLight});n.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),r.appendChild(n),n.appendChild(i("rect",{fill:e.colorLight,width:"100%",height:"100%"})),n.appendChild(i("rect",{fill:e.colorDark,width:"1",height:"1",id:"template"}));for(var a=0;a'],s=0;s");for(var h=0;h');a.push("")}a.push(""),r.innerHTML=a.join("");var l=r.childNodes[0],u=(e.width-l.offsetWidth)/2,f=(e.height-l.offsetHeight)/2;u>0&&f>0&&(l.style.margin=f+"px "+u+"px")},t.prototype.clear=function(){this._el.innerHTML=""},t}():function(){function t(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}if(this._android&&this._android<=2.1){var e=1/window.devicePixelRatio,r=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(t,o,i,n,a,s,h,l,u){if("nodeName"in t&&/img/i.test(t.nodeName))for(var f=arguments.length-1;f>=1;f--)arguments[f]=arguments[f]*e;else void 0===l&&(arguments[1]*=e,arguments[2]*=e,arguments[3]*=e,arguments[4]*=e);r.apply(this,arguments)}}var o=function(t,e){this._bIsPainted=!1,this._android=C(),this._htOption=e,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=e.width,this._elCanvas.height=e.height,t.appendChild(this._elCanvas),this._el=t,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.alt="Scan me!",this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return o.prototype.draw=function(t){var e=this._elImage,r=this._oContext,o=this._htOption,i=t.getModuleCount(),n=o.width/i,a=o.height/i,s=Math.round(n),h=Math.round(a);e.style.display="none",this.clear();for(var l=0;lv.length)throw new Error("Too long data");return r}(QRCode=function(t,e){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:o.H},"string"==typeof e&&(e={text:e}),e)for(var r in e)this._htOption[r]=e[r];"string"==typeof t&&(t=document.getElementById(t)),this._htOption.useSVG&&(D=w),this._android=C(),this._el=t,this._oQRCode=null,this._oDrawing=new D(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)}).prototype.makeCode=function(t){this._oQRCode=new e(A(t,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(t),this._oQRCode.make(),this._el.title=t,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=o}(),"undefined"!=typeof module&&(module.exports=QRCode); diff --git a/src/index.html b/src/index.html index 8ecc01d..3a0931f 100644 --- a/src/index.html +++ b/src/index.html @@ -1,3 +1,11 @@ + @@ -7,13 +15,11 @@ - - - + diff --git a/src/styles.scss b/src/styles.scss index e402cd7..54b0d04 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -84,4 +84,57 @@ table td.mat-footer-cell:last-of-type{ } .mat-tab-body-content{ overflow: hidden!important; -} \ No newline at end of file +} +.amap-logo{ + display: none; + opacity:0 !important; +} +.amap-copyright { + opacity:0; +} +//gis单位信息tabs样式 +#gis{ + .mat-tab-label{ + height: 38px; + line-height: 38px; + min-width: 80px; + padding: 0; + } +} +//可展开面板按钮颜色 +#gisbasicinfo,#planlist,#allaround,#firefacilities,#keysite,#functionpartition,#realisticpicture{ + .mat-expansion-indicator::after { + color: #333333; + } +} +//gis标点弹出框样式 +#gispopupbox{ + .btn{ + width: 92px; + height: 36px; + background: #FFFFFF; + border: 1px solid #EEF1F5; + opacity: 1; + border-radius: 4px; + margin: 0 5px; + font-size: 14px; + font-family: Source Han Sans CN; + font-weight: 400; + line-height: 36px; + color: #0080FF; + opacity: 1; + cursor: pointer; + display: table-cell; //主要是这个属性 + text-align: center; + img{ + vertical-align: middle; + margin-right: 3px; + padding-bottom: 2px; + } + } + +} +//弹出框样式取消padding +#shareDialog,#lookPlanDialog,#openPlanToolDialog{ + padding: 0; +}