<!-- 右侧菜单-- 事件面板 -->
<template>
<div class="eventBar-wrap com-pop-wrap">
<div class="com-drag-header drag-ing" v-drag>
<div class="close" @click="closePanel">×</div>
</div>
<span class="deg-1"></span>
<span class="deg-2"></span>
<span class="deg-3"></span>
<span class="deg-4"></span>
<div class="pop-outer">
<div class="pop-title">应急处置</div>
<el-scrollbar>
<div class="event-list" style="max-height: 650px;" v-if="this.eventList">
<div class="event-item" v-for="(item, index) in eventList" :key="index" :class="{'active': currIndex === index}">
<div class="event-tit of-1" @click="selectEvent(item, index)" :title="`${item.eventTypeName}-${item.eventTiltle}`">
<span class="event-status" :class="`status-${item.eventLevelcode}`"></span>
{{item.eventTypeName}}-{{item.eventTiltle}}
</div>
</div>
</div>
</el-scrollbar>
</div>
<div class="event-plan-wrap com-pop-wrap" :style="{'z-index': topIndex === 0 ? '999' : ''}" v-show="showPlanPanel">
<div class="com-drag-header drag-ing" v-drag>
<div class="close" @click="closePlanPanel">×</div>
</div>
<span class="deg-1"></span>
<span class="deg-2"></span>
<span class="deg-3"></span>
<span class="deg-4"></span>
<div class="pop-outer">
<div class="pop-title">推荐预案</div>
<div class="event-plan-list">
<div class="plan-item of-1" v-for="(item, index) in eventPlan" :key="index" @click="selectPlan(item.id)">{{item.planname}}</div>
</div>
<el-pagination v-show="eventPlan.length" class="custom-el-pagination" style="text-align: right;margin: 10px 10px 0 0;" @current-change="handlePageChange" :page-size="planConfig.pageSize" :current-page="planConfig.pageNum" :pager-count="5" layout="prev,pager,next" :total="planConfig.total" prev-text="上一页" next-text="下一页">
</el-pagination>
</div>
</div>
<div class="event-detail-wrap com-pop-wrap" v-show="showDetailPanel">
<div class="com-drag-header drag-ing" v-drag>
<div class="close" @click="closeDetailPanel">×</div>
</div>
<span class="deg-1"></span>
<span class="deg-2"></span>
<span class="deg-3"></span>
<span class="deg-4"></span>
<div class="event-detail" v-if="eventDetailObj">
<div class="com-flex-item single">
<div class="flex-item">
<div class="lb">事件名称</div>
<div class="rb of-1" :title="eventDetailObj.eventTiltle">{{eventDetailObj.eventTiltle}}</div>
</div>
<div class="flex-item">
<div class="lb">事件位置</div>
<div class="rb of-1" :title="eventDetailObj.eventAddress">{{eventDetailObj.eventAddress}}</div>
</div>
<div class="flex-item">
<div class="lb">事件时间</div>
<div class="rb of-1" :title="eventDetailObj.eventOccurtime">{{eventDetailObj.eventOccurtime}}</div>
</div>
<div class="flex-item">
<div class="lb">事件类型</div>
<div class="rb">{{eventDetailObj.eventTypeName}}</div>
</div>
<div class="flex-item">
<div class="lb">事件描述</div>
<div class="rb of-1" :title="eventDetailObj.eventDesc">{{eventDetailObj.eventDesc}}</div>
</div>
<div class="flex-item">
<div class="lb">处理预案</div>
<div class="rb of-1" @click="openLeftPanel(eventDetailObj.eventTypecode)" style="cursor: pointer;" :title="eventDetailObj.eventEppPlanName">{{eventDetailObj.eventEppPlanName}} <span class="icon-right-arrow"></span></div>
</div>
<div class="flex-item">
<div class="lb">响应类型</div>
<div class="rb">
<el-dropdown trigger="click" @visible-change="onDropRChanged" class="custom-el-select" placement="bottom-start">
<div class="current-select" :class="{'active': showDropR}">
{{eventDetailObj.responseTypeName || '未选择' }}
<span class="icon-arrow"></span>
</div>
<el-dropdown-menu slot="dropdown" class="custom-el-drop">
<el-dropdown-item style="text-align:left;" @click.native="selectResponseType(l.responseTypeCode)" v-for="(l, index) in responseTypes" :key="index">{{l.responseTypeName}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
<div class="flex-item">
<div class="lb">响应等级</div>
<div class="rb">
<el-dropdown trigger="click" @visible-change="onDropChanged" class="custom-el-select">
<div class="current-select" style="width: 132px;" :class="{'active': showDrop}">
{{eventDetailObj.eventResponseLevelName}}
<span class="icon-arrow"></span>
</div>
<el-dropdown-menu slot="dropdown" style="width: 132px;" class="custom-el-drop">
<el-dropdown-item @click.native="selectLevel(l.rsponseId)" v-for="(l, index) in levels" :key="index">{{l.rsponseName}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!-- 选择预案、类型、等级之后才能启动响应或完结响应 -->
<div class="response-button" @click="startResponse" v-if="!!eventDetailObj.eventEppPlanName && !!eventDetailObj.responseTypeName && !!eventDetailObj.eventResponseLevelName">启动响应</div>
<div class="response-button" @click="endResponse" v-if="!!eventDetailObj.eventEppPlanName && !!eventDetailObj.responseTypeName && !!eventDetailObj.eventResponseLevelName">完结</div>
</div>
</div>
</div>
<div class="event-block">
重点防护目标及应急资源 (<span style="color: #ff2a2a;">{{(radius / 1000).toFixed(2)}}</span>公里内)
<img class="icon-event-position" :src="require('@/assets/img/mapTool/event_leida.png')" @click="fullExentLayer">
</div>
<div class="event-filter-list">
<div class="filter-item" v-for="(item, index) in filterData" @click="checkPoint(item)" :key="index" :class="{'active': checkedPoint.indexOf(item.type) > -1}">
<div class="filter-inner">
<div class="icon" :class="`${item.cls}`"></div>
<div class="title">{{item.title}}</div>
<div class="num">({{item.num}})</div>
</div>
</div>
</div>
</div>
</div>
<!-- 物资装备 -->
<MaterialEquipment :style="{'z-index': topIndex === 1 ? '999' : ''}" :datas="equipmentData" v-if="checkedPoint.indexOf('yjwz') > -1" @close-panel="onCloseWzzb"></MaterialEquipment>
<!-- 物资专家 -->
<MaterialExpert :style="{'z-index': topIndex === 2 ? '999' : ''}" :datas="expertData" v-if="checkedPoint.indexOf('yjzj') > -1" @close-panel="onCloseWzzj"></MaterialExpert>
</div>
</template>
<script lang="ts">
import {
Component,
Vue,
Prop,
Watch,
Emit,
Inject
} from "vue-property-decorator";
import { baseServer, eventServer } from "@/api/installServer";
import ol from "../../../public/deps/gis-lib/ol/ol.js";
import MaterialEquipment from "@/components/feature/myPop/MaterialEquipment.vue";
import MaterialExpert from "@/components/feature/myPop/MaterialExpert.vue";
@Component({
name: "EventBar",
components: {
MaterialEquipment,
MaterialExpert
}
})
export default class EventBar extends Vue {
private radius: any = 10000; // 缓冲区范围,默认5公里
private map: any = this.$store.state.mapModule.map;
private showDrop: any = false; // 是否展示等级下拉框
private checkedPoint: any = []; // 选中的过滤点位
private eventList: any = [
// 事件列表数据
];
private eventPlan: any = []; // 预案列表
private currLevel: any = "一级"; // 当前选中的等级
private levels: any = []; // 等级列表
private responseTypes: any = []; // 响应类型列表
private showDropR: any = false; // 响应类型下拉
private currIndex: any = -1; // 当前选中的事件
private filterData: any = [
// 点位过滤查询
{
title: "危化企业",
type: "aqscc_whqy",
num: 0,
data: [],
cls: "whqy"
},
{
title: "医疗设施",
type: "ylws",
num: 0,
data: [],
cls: "ylss"
},
{
title: "应急物资",
type: "yjwz",
num: 0,
data: [],
cls: "yjwz"
},
{
title: "救援队伍",
type: "jydw",
num: 0,
data: [],
cls: "jydw"
},
{
title: "学校设施",
type: "fhmb_xx",
num: 0,
data: [],
cls: "xxss"
},
{
title: "避难场所",
type: "bhcs",
num: 0,
data: [],
cls: "bncs"
},
{
title: "应急专家",
type: "yjzj",
num: 0,
data: [],
cls: "yjzj"
},
{
title: "视频信息",
type: "spc",
num: 0,
data: [],
cls: "spxx"
}
];
private equipmentData: any = []; // 装备数据
private expertData: any = []; // 专家数据
private planConfig: any = {
// 预案分页配置
pageSize: 7,
total: 0,
pageNum: 1
};
private showPlanPanel: any = false; // 是否展示左侧预案
private showDetailPanel: any = false; // 是否展示右侧事件详情
private eventDetailObj: any = null; // 事件详情对象
private topIndex: any = 0; // 0 预案 1 物资装备 2 物资专家
private closePanel() {
this.$store.commit("baseModule/setMapToolIndex", -1);
// 清除地图
this.$store.commit("eventModule/setEventItem", null);
this.clearRes();
this.clearBuffer();
this.clearPnt();
}
// 关闭预案面板
private closePlanPanel() {
this.showPlanPanel = false;
}
// 关闭详情面板
private closeDetailPanel() {
this.showDetailPanel = false; // 隐藏详情面板
this.showPlanPanel = false; // 隐藏预案面板
this.currIndex = -1; // 取消列表选中
// 清除地图
this.$store.commit("eventModule/setEventItem", null);
this.clearRes();
this.clearBuffer();
this.clearPnt();
}
private selectEvent(obj: any, index) {
if (this.currIndex === index) {
this.currIndex = -1;
return;
}
this.currIndex = index;
this.checkedPoint = []; // 清空选中的类型
this.showPlanPanel = false;
this.eventDetailObj = obj;
this.showDetailPanel = true;
this.$store.commit("eventModule/setEventItem", obj); // 将选中的事件对象存入 vuex
console.log(this.$store.state.eventModule.eventItemForMap);
this.handlerEvent(obj);
}
// 切换事件
private handlerEvent(event: any) {
// 清空结果
this.clearRes();
// 绘制缓冲区
this.gBufferDraw(event);
// 事件点
this.addPnt(event);
// 周边查询
this.getBaseData(event);
// 地图视角
this.extentTo();
}
// 设置地图视角
private extentTo() {
const event = this.$store.state.eventModule.eventItemForMap;
const opts = {
x: event.lon,
y: event.lat,
zoom: 13
};
const center = new (g2 as any).sfs.Point({
x: event.lon * 1,
y: event.lat * 1
});
this.$store.state.mapModule.mapObj.getInstance().zoomTo(12.5);
this.$store.state.mapModule.mapObj.getInstance().setCenter(center);
}
private fullExentLayer() {
const layers = this.$store.state.mapModule.mapObj.getInstance().getLayers();
const bufferLayer = layers.find((item: any) => {
return item.getLayerId() === "buffer-layer";
});
if (bufferLayer) {
const extent = (G as any).utils.LayerUtil.getLayerExtent(bufferLayer);
this.$store.state.mapModule.mapObj.getInstance().pan(extent);
}
}
// 绘制缓冲区
private gBufferDraw(event: any) {
// 创建图层
// const layerType = 'buffer-layer'
this.clearBuffer();
const gMap = this.$store.state.mapModule.mapObj.getInstance();
// let bufferlayer = gMap.findLayer(layerType);
// if (!bufferlayer) {
// bufferlayer = new (g2 as any).carto.ElementLayer({
// map: gMap,
// id: layerType
// })
// gMap.addLayer(bufferlayer);
// }
// // 创建圆
// const cirEle = this.createCircle(event)
// bufferlayer.add(cirEle)
// 创建拖拽动作
const param = {
id: "drag",
name: "drag",
data: {
type: "wkt",
geom: `POINT(${event.lon} ${event.lat})`
},
buffer: {
radius: this.radius,
callback: this.callbackBufferDraw,
drag: {
visible: true,
style: {
type: "PictureMarkerSymbol",
options: {
source:
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzdCRTQ5OTYzRkFFMTFFNDk1NTE5ODREMUQwMDhDMzMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzdCRTQ5OTczRkFFMTFFNDk1NTE5ODREMUQwMDhDMzMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDN0JFNDk5NDNGQUUxMUU0OTU1MTk4NEQxRDAwOEMzMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDN0JFNDk5NTNGQUUxMUU0OTU1MTk4NEQxRDAwOEMzMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpA7b9wAAAPDSURBVHjarFZbTxNREJ7d7ba7lbaAgqBUMETEW9OggCYiYIyKJhp+gA/6B4wPhGhMjET9CaivXggxXogkaqLxQXxofCCKFRSjQohRgZa2WLbXXWfWs02tB2ONk3xJe2Z25pvvzDm7Ql9fH3BMQEigaeWQTu8Cw9iB/0sQ1fA3ZhgGCMIs/gojXiGeg8czzwu1cQrbIJWqhETiOOj6YX9LS+X6hga3Q1Gk0rIyB/ylLcZiqaV4PPN5evr7i5GROYhEhpDUFSQS/qVgngJUXIFkcgsWP9dx4IC/pa2t2m63S8bPrqBoEwQzKT5pvHj27Mvj4eGXuHYKSUwWKkBxKmQyjVj8Uld397amnTurdF2HbDYL/8GE5ra2NStcLnloYKAfotFjSOJLPgHZ3F9NO7m3q2uzv7W1KpPJwH81bGaTz1eRTCS2PLx79yKunKBlkaEU9313jdfb3NrevjaLxal7Hvb1BE0U6yNkUE2cqaqtTU17UIUOi4AdUYkE9qCznDon2XkJ9veO5zX0u98yiuOSwLyU37d9+0qcqSMWAdUkoOt1NXV1nmw6bQYW4uDpt7kCDy5s4MbQumUUz4shdau9XjeGNFsEFEQZMnKqTqecpcErwKGz73OJh/vqgRdjgfyW0XOFftoGUZJErFWC2+CysQFUkIAoCoJAAcYfjpxe5KngxRtIRLbbRS2RUMTcMRTFBF4caYPtVT7unfXmHj56foorrQXyW0bPFfpZfiMWiWjgdoeIAFFMIoHw/Oxs3MDLgyft7TNrc4m7L8xwY2jdMornxZC2USouCNMkhmgWx5sTZHn6XTC4INtswFOBcKu36hdpC2EZxfH8lNeG+SffvAkhgadEgGZgCTEHDsfE2Oior76hwbOmtnYVXhjcWRjsqcwdw2J8OF5gk2UIzc1FR548mQRFGbJOASnwDfEVVDVwb2DgYyQcjuKQmHItd6kUA2qEiqeSyaWbV6++B0m6jA2HiIDU2dlJdTLmIEqSDanqrwMBtaa21rGyosJpsARFg3UtoeSKqkIkFIpc6+9/h1t9HUpK7rDGc++CBGLGvBUd+MYVxfjQ4GB8q9+/rtHnK3N7PKq7tFQ1ONIu+/YRRdDi8eRiNKqNjo8vjAYCnzD3DVT5Ptt2I5+Abg4iwAdEClnGaCiDExMbg2Nj61FHD8L9D6/jRWwmhJM3Bi7XI/xN+SPs5P32QUKLMUZiAbEaGU8h3Oy2lIq5f5iq1FTInK+fX0dLzLfsF5HOgpLsASfCweKEIghYc5VCaAzcK/SHAAMA4XIlf6DGCVoAAAAASUVORK5CYII=",
width: 32,
height: 20,
opacity: 1,
rotation: 0
}
}
},
fill: {
visible: true,
style: {
type: "SimpleFillSymbol",
options: {
fillColor: {
a: 80,
r: 181,
g: 181,
b: 10
}
}
}
}
}
};
const bufferDraw = new (G as any).interact.Buffer({
map: gMap,
id: "buffer-layer"
});
bufferDraw.load();
bufferDraw.buffer(param);
// this.$store.state.mapModule.mapObj.setCenter(opts);
}
// 缓冲区拖动回调函数
private callbackBufferDraw(bufferGeom, radius) {
this.radius = radius;
this.getBaseData(this.$store.state.eventModule.eventItemForMap);
}
// 周边重点防护目标及应急资源
private getBaseData(event: any) {
this.filterData.forEach((layer) => {
if (layer.type === "yjwz" || layer.type === "yjzj") {
baseServer.getBDataByType({ type: layer.type }).then((res: any) => {
layer.num = res.data.length;
if (layer.type === "yjwz") {
this.equipmentData = res.data;
} else {
this.expertData = res.data;
}
});
} else {
baseServer.getDataByType({ type: layer.type }).then((res: any) => {
if (res.data && res.data.length > 0) {
const opts = {
x: event.lon,
y: event.lat,
radius: this.radius,
data: res.data
};
if (layer.type === "fhmb_xx" || layer.type === "aqscc_whqy") {
const bufferRes: any = this.getComBufferQuery(opts);
layer.num = bufferRes.length;
layer.data = bufferRes;
} else {
let bufferRes = this.getBufferQuery(opts);
layer.num = bufferRes.len;
layer.data = bufferRes.data;
}
// 更新地图缓冲区查询结果
if (this.checkedPoint.indexOf(layer.type) > -1) {
let data = layer.data;
if (layer.type === "fhmb_xx" || layer.type === "aqscc_whqy") {
data = [
{
type: layer.type,
data: layer.data
}
];
this.$store.state.mapModule.mapObj.clearLayers([
"buffer_" + layer.type
]);
} else {
let layers: any = [];
if (layer.data && layer.data.length > 0) {
layer.data.forEach((d)=> {
if (d.type) {
layers.push("buffer_" + d.type);
}
});
this.$store.state.mapModule.mapObj.clearLayers(layers);
}
}
// 防止缓冲区图层冲突
let res: any = [];
data.forEach((ele) => {
res.push({
type: "buffer_" + ele.type,
name: ele.name,
data: ele.data
});
});
this.$store.state.mapModule.mapObj.loadLayers(res);
}
}
});
}
});
console.log("周边重点防护目标及应急资源", this.filterData);
}
// 缓冲区查询
private getBufferQuery(opts: any) {
let res = {
data: [],
len: 0
};
let len = 0;
let allRest: any = [];
if (opts.data.length > 0) {
const center = new (g2 as any).geom.Point({
x: opts.x * 1,
y: opts.y * 1
});
const jstsGeom = (G as any).utils.GeometryUtil.toJstsGeometry(
center
).toString();
const bufferWkt = (G as any).utils.SpatialOPUtil.getBuffer({
geometry: jstsGeom,
radius: opts.radius - 900,
spatialReference: this.$store.state.mapModule.mapObj.getInstance()
.spatialReference
});
const geom = (G as any).utils.GeometryUtil.toJstsGeometry(bufferWkt);
if (opts.data && opts.data.length > 0) {
opts.data.forEach((layer) => {
let rest: any = [];
const item = {
type: layer.type,
name: layer.name,
data: []
};
layer.data.forEach((pnt) => {
const ptGeoJson = {
type: "Point",
coordinates: [pnt.lon * 1, pnt.lat * 1]
};
const ptGeom = (G as any).utils.GeometryUtil.toJstsGeometry(
ptGeoJson
);
if (geom.contains(ptGeom)) {
rest.push(pnt);
len++;
}
});
item.data = rest;
allRest.push(item);
});
// opts.data.forEach((layer) => {
// if(layer.data && layer.data.length > 0) {
// len += layer.data.length;
// for(let i = 0; i < layer.data.length; i++) {
// const pnt = layer.data[i];
// const ptGeoJson = { type: 'Point', coordinates: [pnt.lon*1, pnt.lat*1] };
// const ptGeom = (G as any).utils.GeometryUtil.toJstsGeometry(ptGeoJson);
// if (!geom.contains(ptGeom)) {
// layer.data.splice(i, 1)
// len = len -1;
// }
// }
// }
// })
}
}
// res.data = opts.data;
res.data = allRest;
res.len = len;
return res;
}
// 缓冲区查询
private getComBufferQuery(opts: any) {
let res: any = [];
const center = new (g2 as any).geom.Point({ x: opts.x * 1, y: opts.y * 1 });
const jstsGeom = (G as any).utils.GeometryUtil.toJstsGeometry(
center
).toString();
const bufferWkt = (G as any).utils.SpatialOPUtil.getBuffer({
geometry: jstsGeom,
radius: opts.radius - 900,
spatialReference: this.$store.state.mapModule.mapObj.getInstance()
.spatialReference
});
const geom = (G as any).utils.GeometryUtil.toJstsGeometry(bufferWkt);
if (opts.data && opts.data.length > 0) {
opts.data.forEach((pnt) => {
const ptGeoJson = {
type: "Point",
coordinates: [pnt.lon * 1, pnt.lat * 1]
};
const ptGeom = (G as any).utils.GeometryUtil.toJstsGeometry(ptGeoJson);
if (geom.contains(ptGeom)) {
res.push(pnt);
}
});
}
return res;
}
// emap渲染器画事件点,地图缩放会偏移,先用原生openlayers
private addPnt(event: any) {
// 移除
this.clearPnt();
const opts = {
layerType: "event",
featureName: "突发事件",
idField: "id",
iconKey: "event",
width: 32,
height: 32
};
this.$store.state.mapModule.mapObj.addPointLayer(opts, [event]);
return;
let layerType = "event";
const saoguan = new ol.Feature({
geometry: new ol.geom.Point(ol.proj.fromLonLat([event.lon, event.lat]))
});
saoguan.setStyle(
new ol.style.Style({
image: new ol.style.Circle({
radius: 50,
fill: new ol.style.Fill({
color: "#FF0000"
})
})
})
);
const source1 = new ol.source.Vector({
features: [saoguan]
});
const layer = new ol.layer.Vector({
source: source1
});
const pot = new ol.Feature(new ol.geom.Point([event.lon, event.lat]));
pot.setStyle(
new ol.style.Style({
image: new ol.style.Circle({
radius: 5,
fill: new ol.style.Fill({
color: "#FF0000"
})
})
})
);
const source = new ol.source.Vector({
features: [pot]
});
const clusterL = new ol.layer.Vector({
source
});
clusterL.set("id", layerType);
this.$store.state.mapModule.mapObj.getInstance().map.addLayer(clusterL);
}
// 创建元素
private createCircle(args: any) {
// const gsLineSymbol = new (g2 as any).sfs.SimpleLineSymbol(
// { opacity: 1, color: new (g2 as any).syms.Color({ r: 255, g: 97, b: 0 }) })
const gsLineSymbol = new (g2 as any).sfs.SimpleFillSymbol({
color: new (g2 as any).syms.Color({ r: 255, g: 97, b: 0, a: 80 })
});
const radiusT = 0.0089932202929999989 * 10;
const centerT = new (g2 as any).geom.Point({
x: args.lon,
y: args.lat
});
const eleId = "bufferSearchCircle";
const circle = new (g2 as any).geom.Circle({
center: centerT,
radius: radiusT,
spatialReference: "4326"
});
const circleEle = new (g2 as any).sfs.Element({
id: eleId,
geometry: circle,
symbol: gsLineSymbol
});
return circleEle;
}
// 清除缓冲区
private clearBuffer() {
const layers = this.$store.state.mapModule.mapObj.getInstance().getLayers();
const bufferLayer = layers.find((item: any) => {
return item.getLayerId() === "buffer-layer";
});
if (bufferLayer) {
this.$store.state.mapModule.mapObj.getInstance().removeLayer(bufferLayer);
}
}
// 清除事件点
private clearPnt() {
this.$store.state.mapModule.mapObj.clearLayer("event");
return;
const layers = this.$store.state.mapModule.mapObj
.getInstance()
.map.getLayers()
.getArray();
const eventLayer = layers.find((item) => {
return item.get("id") === "event";
});
if (eventLayer) {
this.$store.state.mapModule.mapObj
.getInstance()
.map.removeLayer(eventLayer);
}
}
// 清除缓冲区查询结果
private clearRes() {
let layers: any = [];
this.filterData.forEach((item) => {
if (item.type === "fhmb_xx" || item.type === "aqscc_whqy") {
this.$store.state.mapModule.mapObj.clearLayers(["buffer_" + item.type]);
} else {
if (item.data && item.data.length > 0) {
item.data.forEach((d) => {
if (d.type) {
layers.push("buffer_" + d.type);
}
});
}
this.$store.state.mapModule.mapObj.clearLayers(layers);
}
});
// 清除路径
const allLayers = this.$store.state.mapModule.mapObj
.getInstance()
.getLayers();
const routeLayer = allLayers.find((item: any) => {
return item.getLayerId() === "route";
});
if (routeLayer) {
routeLayer.clear();
}
}
private checkPoint(p: any) {
if (this.checkedPoint.indexOf(p.type) > -1) {
this.checkedPoint.splice(this.checkedPoint.indexOf(p.type), 1);
// 物资,专家列表弹窗
// gis 清除
if (p.type === "fhmb_xx" || p.type === "aqscc_whqy") {
this.$store.state.mapModule.mapObj.clearLayers(["buffer_" + p.type]);
} else {
let layers: any = [];
if (p.data && p.data.length > 0) {
p.data.forEach((item) => {
layers.push("buffer_" + item.type);
});
}
this.$store.state.mapModule.mapObj.clearLayers(layers);
}
return;
}
this.checkedPoint.push(p.type);
// gis 上图
let data = p.data;
if (p.type === "fhmb_xx" || p.type === "aqscc_whqy") {
data = [
{
type: p.type,
data: p.data
}
];
}
// 防止缓冲区图层冲突
let res: any = [];
data.forEach((ele) => {
res.push({
type: "buffer_" + ele.type,
name: ele.name,
data: ele.data
});
});
this.$store.state.mapModule.mapObj.loadLayers(res);
this.topIndex = p.type === "yjwz" ? 1 : p.type === "yjzj" ? 2 : 0;
}
// 打开左侧预案列表数据
private openLeftPanel(id: any) {
this.showPlanPanel = true;
this.topIndex = 0;
this.handlePageChange();
}
private handlePageChange() {
let params = {
eventTypeCode: this.eventDetailObj.eventTypecode,
pageNum: this.planConfig.pageNum,
pageSize: this.planConfig.pageSize
};
eventServer.getEventPlan(params).then((res: any) => {
if (res && res.data) {
this.eventPlan = res.data.content;
this.planConfig.total = res.data.total;
}
});
}
get mapToolIndex() {
return this.$store.state.baseModule.mapToolIndex;
}
@Watch("mapToolIndex")
private onMapToolIndexChanged(n: any) {
if (n !== 2) {
this.closeDetailPanel();
} else {
this.getEventList();
}
}
// 默认的获取事件列表
private getEventList() {
eventServer
.getEventList({ pageSize: 10000, pageNum: 0 })
.then((res: any) => {
if (res.data && res.data.content) {
this.eventList = res.data.content;
if (this.showDetailPanel) {
let details = this.eventList.filter(
(res: any) => res.id === this.eventDetailObj.id
);
if (details.length) {
this.eventDetailObj = details[0];
this.showDetailPanel = true;
this.$store.commit(
"eventModule/setEventItem",
this.eventDetailObj
); // 将选中的事件对象存入 vuex
this.handlerEvent(this.eventDetailObj);
}
} else {
this.closeDetailPanel();
}
}
});
}
// 修改操作后的 回显查询
private getNEventList() {
eventServer
.getEventList({ pageSize: 10000, pageNum: 0 })
.then((res: any) => {
if (res.data && res.data.content) {
this.eventList = res.data.content;
if (this.showDetailPanel) {
let details = this.eventList.filter(
(res: any) => res.id === this.eventDetailObj.id
);
if (details.length) {
this.eventDetailObj = details[0];
this.showDetailPanel = true;
this.$store.commit(
"eventModule/setEventItem",
this.eventDetailObj
); // 将选中的事件对象存入 vuex
}
} else {
this.closeDetailPanel();
}
}
});
}
private onCloseWzzb() {
this.checkedPoint = this.checkedPoint.filter((d: any) => {
return d !== "yjwz";
});
}
private onCloseWzzj() {
this.checkedPoint = this.checkedPoint.filter((d: any) => {
return d !== "yjzj";
});
}
// 获取所有等级
private getLevels() {
eventServer.getEventLevels().then((res: any) => {
if (res.data) {
this.levels = res.data;
}
});
}
// 获取所有响应类型
private getResponseType() {
eventServer.getResponseType().then((res: any) => {
if (res.data) {
this.responseTypes = res.data;
}
});
}
private onDropChanged(e: any) {
this.showDrop = e;
}
private onDropRChanged(e: any) {
this.showDropR = e;
}
// 选择等级
private selectLevel(id: any) {
let params = {
eventId: this.eventDetailObj.id,
eventResponseLevel: id
};
eventServer.setEventLevels(params).then((res: any) => {
if (res.code === 200) {
this.getNEventList(); // 获取最新列表
this.$message({
message: "修改响应等级成功!",
type: "success"
});
}
});
}
// 选择响应类型
private selectResponseType(id: any) {
let params = {
eventId: this.eventDetailObj.id,
responseTypeCode: id
};
eventServer.setResponseType(params).then((res: any) => {
if (res.code === 200) {
this.getNEventList(); // 获取最新列表
this.$message({
message: "修改响应类型成功!",
type: "success"
});
}
});
}
// 修改预案
private selectPlan(id: any) {
let params = {
eventId: this.eventDetailObj.id,
eventEppPlanid: id
};
eventServer.setEventPlan(params).then((res: any) => {
if (res.code === 200) {
this.showPlanPanel = false;
this.getNEventList(); // 获取最新列表
this.$message({
message: "修改预案成功!",
type: "success"
});
}
});
}
private startResponse() {
let params = {
eventId: this.eventDetailObj.id,
eventStatus: "2"
};
eventServer.updateEventStatus(params).then((res: any) => {
if (res.code === 200) {
this.getNEventList(); // 获取最新列表
this.$message({
message: "启动响应成功!",
type: "success"
});
this.$store.commit(
"eventModule/setCurrentResponseLevel",
this.eventDetailObj
);
}
});
}
private endResponse() {
if (this.eventDetailObj.eventStatus === "0") {
this.$message({
message: "未启动响应无法完结",
type: "warning"
});
return;
}
let params = {
eventId: this.eventDetailObj.id,
eventStatus: "3"
};
eventServer.updateEventStatus(params).then((res: any) => {
if (res.code === 200) {
this.showDetailPanel = false;
this.getNEventList(); // 获取最新列表
this.$message({
message: "完结成功!",
type: "success"
});
this.$store.commit("eventModule/setCurrentResponseLevel", null);
}
});
}
private created() {
this.getLevels(); // 获取响应等级
this.getResponseType(); // 获取相应类型
}
}
</script>
<style lang="less" scoped>
.eventBar-wrap {
position: absolute;
left: 340px;
top: 160px;
width: 470px;
.pop-outer {
width: 100%;
height: 100%;
padding: 20px 0;
max-height: 830px;
overflow: hidden;
.pop-title {
font-size: 18px;
color: #00e3ff;
margin-bottom: 20px;
padding: 0 30px;
}
.event-list {
.event-item {
&:nth-child(odd) {
.event-tit {
background: rgba(0, 0, 0, 0.5);
}
}
&.active {
.event-tit {
background-color: rgba(2, 76, 85, 0.5);
&:after {
transform: rotate(180deg);
opacity: 1;
}
}
}
.event-tit {
padding: 0 55px;
position: relative;
line-height: 40px;
cursor: pointer;
&:hover {
background-color: rgba(2, 76, 85, 0.5);
}
&:after {
content: "";
position: absolute;
right: 0;
top: 0;
width: 55px;
height: 40px;
background: url("../../assets/img/home/icon_weather_up.png")
no-repeat center center;
transform: rotate(90deg);
opacity: 0.5;
transition: 0.5s all;
}
.event-status {
position: absolute;
left: 20px;
top: 50%;
margin-top: -7px;
width: 14px;
height: 14px;
border-radius: 50%;
&.status-1 {
background-color: #f0210b;
}
&.status-2 {
background-color: #e26e07;
}
&.status-3 {
background-color: #ffe16a;
}
&.status-4 {
background-color: #2a96f1;
}
}
}
}
}
}
.event-plan-wrap {
position: absolute;
top: 0;
left: calc(100% + 510px);
width: 600px;
height: 400px;
.event-plan-list {
.plan-item {
height: 36px;
line-height: 36px;
padding: 0 30px;
cursor: pointer;
&:nth-child(odd) {
background: rgba(0, 0, 0, 0.5);
}
&:hover {
color: #00e3ff;
}
}
}
}
.event-detail-wrap {
position: absolute;
top: 0;
left: calc(100% + 20px);
width: 470px;
height: auto;
.event-detail {
padding: 36px 0;
.com-flex-item {
.flex-item {
padding: 0 30px;
line-height: 36px;
font-size: 16px;
min-width: 0;
&:nth-child(odd) {
background: rgba(0, 0, 0, 0.5);
}
.lb {
width: 70px;
margin-right: 20px;
}
.rb {
flex: 1;
text-align: left;
}
}
}
.event-block {
padding: 0 30px;
line-height: 36px;
margin-bottom: 20px;
background: rgba(0, 0, 0, 0.5);
}
.event-filter-list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
padding: 0 30px;
.filter-item {
width: 90px;
height: 125px;
margin-bottom: 15px;
border: 2px solid #024c55;
background-color: rgba(2, 76, 85, 0.5);
text-align: center;
cursor: pointer;
.filter-inner {
width: 100%;
height: 100%;
.icon {
height: 58px;
background: no-repeat center center;
&.whqy {
background-image: url("../../assets/img/mapTool/event_whqy.png");
}
&.ylss {
background-image: url("../../assets/img/mapTool/event_ylss.png");
}
&.yjwz {
background-image: url("../../assets/img/mapTool/event_yjwz.png");
}
&.jydw {
background-image: url("../../assets/img/mapTool/event_jydw.png");
}
&.xxss {
background-image: url("../../assets/img/mapTool/event_xxss.png");
}
&.bncs {
background-image: url("../../assets/img/mapTool/event_bncs.png");
}
&.yjzj {
background-image: url("../../assets/img/mapTool/event_yjzj.png");
}
&.spxx {
background-image: url("../../assets/img/mapTool/event_spxh.png");
}
}
.title {
font-size: 16px;
color: #fff;
margin-bottom: 10px;
}
.num {
font-size: 16px;
color: #00e3ff;
}
}
&.active {
background-color: rgba(2, 76, 85, 1);
border-color: rgba(255, 255, 94, 0.8);
box-shadow: 0 0 15px rgba(255, 255, 94, 1);
}
}
}
}
}
.icon-right-arrow {
display: inline-block;
vertical-align: -12px;
width: 36px;
height: 36px;
background: url("../../assets/img/home/icon_weather_up.png") no-repeat
center center;
transform: rotate(90deg);
}
.icon-event-position,
.icon-event-list {
display: inline-block;
vertical-align: -6px;
margin-left: 10px;
cursor: pointer;
}
.response-button {
display: inline-block;
margin-left: 8px;
width: 80px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 14px;
color: #fff;
background: url("../../assets/img/mapPop/bg_btn_n.png") no-repeat center
center;
background-size: cover;
cursor: pointer;
&:hover,
&.active {
color: #ffff5e;
background-image: url("../../assets/img/mapPop/bg_btn_p.png");
}
}
}
</style>