<template>
|
<a-card :bordered="false" style="margin-top:24px">
|
<div class="tableList">
|
<div class="tableListForm">
|
<a-form-model layout="horizontal">
|
<a-row :gutter="15">
|
<a-col :span="5">
|
<a-button
|
icon="plus"
|
type="primary"
|
@click="() => this.handleModalVisible(true)"
|
style="margin-left: 25px;"
|
>新建</a-button
|
>
|
</a-col>
|
<a-col :span="5" style="margin-left: 37%">
|
<a-form-model-item :wrapperCol="wrapperCol">
|
<a-select
|
placeholder="选择组织"
|
style="width: 240px;margin-top:4px"
|
@change="handleChange"
|
allow-clear
|
show-search
|
>
|
<a-select-option
|
v-for="(item, index) in orgData"
|
:key="index"
|
:value="item.id"
|
>
|
{{ item.name }}
|
</a-select-option>
|
</a-select>
|
</a-form-model-item>
|
</a-col>
|
<a-col :span="5">
|
<a-form-model-item :wrapperCol="wrapperCol">
|
<a-input
|
v-model="searchName"
|
placeholder="请输入名称查询"
|
allow-clear
|
/>
|
</a-form-model-item>
|
</a-col>
|
</a-row>
|
</a-form-model>
|
</div>
|
<av-standard-table
|
:dataSource="dataSource"
|
:columns="columns"
|
:loading="tableLoading"
|
:paginationProps="pagination"
|
@tableChange="handlerTableChange"
|
></av-standard-table>
|
</div>
|
<a-modal
|
title="区域扩散图添加"
|
destroyOnClose
|
:visible="addShowOrHiddenFlag"
|
@ok="addOK"
|
@cancel="addCancel"
|
okText="保存"
|
>
|
<a-form-model
|
style="margin-top: 8px"
|
:model="addForm"
|
:rules="rules"
|
ref="addRulesForm"
|
>
|
<a-form-model-item
|
has-feedback
|
:labelCol="{ span: 5 }"
|
:wrapperCol="{ span: 15 }"
|
label="名称"
|
prop="name"
|
>
|
<a-input
|
placeholder="设备名称"
|
type="string"
|
v-model="addForm.name"
|
/>
|
</a-form-model-item>
|
<a-form-model-item
|
:labelCol="{ span: 5 }"
|
:wrapperCol="{ span: 15 }"
|
label="组织"
|
has-feedback
|
prop="orgId"
|
>
|
<a-select
|
placeholder="请选择组织"
|
type="string"
|
allow-clear
|
show-search
|
v-model="addForm.orgId"
|
>
|
<a-select-option
|
v-for="(item, index) in orgData"
|
:key="index"
|
:value="item.id"
|
>
|
{{ item.name }}
|
</a-select-option>
|
</a-select>
|
</a-form-model-item>
|
</a-form-model>
|
</a-modal>
|
<a-modal
|
title="区域扩散图编辑"
|
destroyOnClose
|
:visible="editShowOrHiddenFlag"
|
@ok="editSave"
|
@cancel="editCancel"
|
okText="保存"
|
>
|
<a-form-model
|
style="margin-top: 8px"
|
:model="editForm"
|
:rules="rules"
|
ref="editRulesForm"
|
>
|
<a-form-model-item
|
has-feedback
|
:labelCol="{ span: 5 }"
|
:wrapperCol="{ span: 15 }"
|
label="名称"
|
prop="name"
|
>
|
<a-input placeholder="名称" type="string" v-model="editForm.name" />
|
</a-form-model-item>
|
<a-form-model-item
|
:labelCol="{ span: 5 }"
|
:wrapperCol="{ span: 15 }"
|
label="组织"
|
has-feedback
|
>
|
<a-input
|
placeholder="名称"
|
type="string"
|
disabled="disabled"
|
v-model="editForm.orgName"
|
/>
|
</a-form-model-item>
|
</a-form-model>
|
</a-modal>
|
<a-modal
|
title="坐标选择"
|
width="70%"
|
destroyOnClose
|
:visible="areaPointConfigurationFlag"
|
@ok="editAreaPoint"
|
@cancel="editCancelMap"
|
okText="确定"
|
class="areaStyle"
|
>
|
<div>
|
<a-layout>
|
<a-layout>
|
<a-layout-sider>
|
<a-tree
|
v-model="checkedKeys"
|
checkable
|
@select="onSelect"
|
:tree-data="treeData"
|
@check="onCheck"
|
/>
|
</a-layout-sider>
|
|
<a-layout-content>
|
<div style="position: relative">
|
<baidu-map
|
@ready="handler"
|
:center="map.center"
|
:zoom="map.zoom"
|
:scroll-wheel-zoom="true"
|
@click="mapClick"
|
style="height: 600px;width: 100%; z-index: 9"
|
>
|
<bm-control>
|
<a-button
|
type="primary"
|
style="margin-top: 20px; margin-left: 10px; border: none"
|
@click="toggle"
|
>{{
|
polyline.editing ? "停止绘制" : "开始绘制"
|
}}</a-button
|
>
|
<a-button
|
type="primary"
|
style="margin-top: 20px; margin-left: 10px; border: none"
|
@click="chooseCenter"
|
>{{
|
!map.chooseCenter.flag ? "选择中心点" : "确认选择"
|
}}</a-button
|
>
|
<p
|
style="position: absolute;top: 20px;left: 240px;z-index: 10; width: 400px"
|
>
|
<a-input
|
disabled="disabled"
|
placeholder="中心点经度"
|
v-model="map.chooseCenter.point.lng"
|
style="display: inline; width: 160px;height: 32px"
|
/>
|
<a-input
|
disabled="disabled"
|
placeholder="中心点纬度"
|
v-model="map.chooseCenter.point.lat"
|
style="display: inline; width: 160px;height: 32px;margin-left: 10px"
|
/>
|
</p>
|
</bm-control>
|
<!-- <bm-local-search :keyword="keyword" :auto-viewport="true" style="display: none" ></bm-local-search>-->
|
<bm-marker
|
v-for="item in map.points"
|
:position="item.point"
|
></bm-marker>
|
<bm-circle
|
v-for="item in map.points"
|
:center="item.point"
|
:radius="2000"
|
stroke-color="red"
|
:stroke-opacity="0.5"
|
:stroke-weight="1"
|
:editing="false"
|
></bm-circle>
|
<bm-polygon
|
:path="polyline.points"
|
stroke-color="blue"
|
:stroke-opacity="0.5"
|
:stroke-weight="2"
|
:editing="polyline.editing"
|
@lineupdate="updatePolygonPath"
|
/>
|
<bm-marker
|
v-if="
|
map.chooseCenter.flag || map.chooseCenter.point.lat !== ''
|
"
|
:position="map.chooseCenter.point"
|
color="blue"
|
:dragging="true"
|
animation="BMAP_ANIMATION_BOUNCE"
|
></bm-marker>
|
</baidu-map>
|
</div>
|
</a-layout-content>
|
</a-layout>
|
</a-layout>
|
</div>
|
</a-modal>
|
</a-card>
|
</template>
|
|
<script lang="tsx">
|
import { Component, Vue, Watch } from "vue-property-decorator";
|
import org from "@/util/org";
|
import { get, post } from "@/util/request";
|
import axios from "axios";
|
|
@Component({
|
components: {},
|
})
|
export default class areaConfiguration extends Vue {
|
// 定义样式
|
private wrapperCol: any = {
|
sm: { span: 16 }, //控制文本框的长度
|
};
|
private orgData: any = [];
|
// 列头
|
private columns: any[] = [
|
{
|
title: "序号",
|
dataIndex: "key",
|
key: "key",
|
align: "center",
|
customRender: (text: any, record: any, index: any) => `${index + 1}`,
|
width: 60,
|
},
|
{
|
title: "名称",
|
dataIndex: "name",
|
},
|
{
|
title: "所属组织",
|
dataIndex: "organization_name",
|
},
|
{
|
title: "中心点经度",
|
dataIndex: "centerLongitude",
|
},
|
{
|
title: "中心点纬度",
|
dataIndex: "centerLatitude",
|
},
|
|
{
|
title: "创建时间",
|
dataIndex: "createTime",
|
},
|
{
|
title: "操作",
|
customRender: this.opRender,
|
},
|
];
|
// 用于查询站点模糊查询
|
private searchName: string = "";
|
// 用于检验是否有数据
|
private tableLoading: boolean = false;
|
// 数据
|
private dataSource: any[] = [];
|
// 查询的组织id
|
private queryId: any = undefined;
|
// 显示新增隐藏标识
|
private addShowOrHiddenFlag: boolean = false;
|
// 显示编辑隐藏标识
|
private editShowOrHiddenFlag: boolean = false;
|
// 区域点显示隐藏flag
|
private areaPointConfigurationFlag: boolean = false;
|
// 树数据
|
private treeData: any = [];
|
// 树结构初始选择
|
private checkedKeys: any = [];
|
// 存放数据信息,用在地图
|
private mapRecord: any = {};
|
// 绘制框
|
private polyline: any = {
|
editing: false,
|
points: [],
|
};
|
// 指定新增和编辑规则
|
private rules: any = {
|
name: [
|
{ required: true, message: "名称不能为空", trigger: ["change", "blur"] },
|
],
|
|
orgId: [
|
{ required: true, message: "请选择组织", trigger: ["change", "blur"] },
|
],
|
};
|
// 存放编辑前的数据record
|
private editBeforeRecord: any = null;
|
// 新增表单数据
|
private addForm: any = {
|
name: "",
|
orgId: undefined,
|
};
|
private handleChange(val: any) {
|
this.pagination.current = 1;
|
this.queryId = val;
|
this.getDataByCondition();
|
}
|
// 编辑表单数据
|
private editForm: any = {
|
name: "",
|
orgId: undefined,
|
orgName: "",
|
};
|
// 分页数据
|
private pagination: any = {
|
total: 0,
|
current: 1,
|
pageSize: 10,
|
showSizeChanger: true,
|
showQuickJumper: true,
|
pageSizeOptions: ["10", "30", "60", "100"],
|
showTotal: (total: number) => `共有 ${this.pagination.total} 条数据`, //分页中显示总的数据
|
};
|
// 站点信息
|
private monitorPoints: any = [];
|
// 选中的设备id
|
private deviceIds: any = [];
|
// 地图数据
|
private map: any = {
|
center: { lng: 116.404, lat: 39.915 },
|
zoom: 14,
|
points: [],
|
chooseCenter: {
|
point: { lng: "", lat: "" },
|
flag: false,
|
},
|
};
|
// 监听站点名称变化
|
@Watch("searchName", {
|
deep: true,
|
immediate: true,
|
})
|
private watchName() {
|
this.pagination.current = 1;
|
this.getDataByCondition();
|
}
|
// 生命周期函数
|
private created() {
|
this.getAllOrg();
|
this.getDataByCondition();
|
}
|
// 监听分页数据下标变化
|
private handlerTableChange(pagination: any, filter: any, sorter: any): void {
|
this.pagination.current = pagination.current;
|
this.pagination.pageSize = pagination.pageSize;
|
this.pagination.total = pagination.total;
|
this.getDataByCondition();
|
}
|
|
// 获得所有组织
|
private getAllOrg() {
|
get("organization/queryNames", {}).then((res) => {
|
this.orgData = res.data.data.organizationVOs.reverse();
|
});
|
}
|
// 查询所有区域范围数据
|
private getDataByCondition() {
|
let params = {};
|
if (this.queryId === undefined) {
|
params = {
|
name: this.searchName,
|
current: this.pagination.current,
|
size: this.pagination.pageSize,
|
};
|
} else {
|
params = {
|
orgId: this.queryId,
|
name: this.searchName,
|
current: this.pagination.current,
|
size: this.pagination.pageSize,
|
};
|
}
|
get("servicesScope/getDataByCondition", params).then((res: any) => {
|
if (res.data.code === 0) {
|
this.dataSource = res.data.data.servicesScopes;
|
this.pagination.total = res.data.data.totalNumber;
|
} else {
|
console.log("所有数据列表获取失败!");
|
}
|
});
|
}
|
// 新增成功
|
private addOK() {
|
post("servicesScope/insert", {
|
name: this.addForm.name,
|
organizationId: this.addForm.orgId,
|
})
|
.then((res: any) => {
|
if (res.data.code === 0) {
|
this.getDataByCondition();
|
this.addShowOrHiddenFlag = false;
|
this.addForm.name = "";
|
this.addForm.orgId = undefined;
|
this.$message.success(res.data.message);
|
} else {
|
this.$message.warning(res.data.message);
|
}
|
})
|
.catch((err: any) => {
|
this.$message.error("新增失败!");
|
});
|
}
|
// 新增显示
|
private handleModalVisible(flag: boolean) {
|
this.addShowOrHiddenFlag = flag;
|
}
|
// 新增取消
|
private addCancel() {
|
this.addForm.name = "";
|
this.addForm.orgId = undefined;
|
this.addShowOrHiddenFlag = false;
|
}
|
// 编辑显示
|
private editShow(flag: boolean, record: any) {
|
this.editBeforeRecord = record;
|
this.editShowOrHiddenFlag = flag;
|
this.editForm.name = record.name;
|
this.editForm.orgId = record.organizationId;
|
this.editForm.orgName = record.organization_name;
|
this.editBeforeRecord = record;
|
}
|
// 确认编辑
|
private editSave() {
|
this.$refs.editRulesForm.validate((valid: any) => {
|
if (valid) {
|
const name =
|
this.editForm.name === this.editBeforeRecord.name
|
? null
|
: this.editForm.name;
|
const organizationId =
|
this.editForm.orgId === this.editBeforeRecord.organizationId
|
? null
|
: this.editForm.orgId;
|
if (name === null && organizationId === null) {
|
this.$message.warning("未修改");
|
} else {
|
post("servicesScope/update", {
|
id: this.editBeforeRecord.id,
|
name: name,
|
organizationId: organizationId,
|
}).then((res: any) => {
|
if (res.data.code === 0) {
|
this.getDataByCondition();
|
this.editShowOrHiddenFlag = false;
|
this.editBeforeRecord = null;
|
this.$message.success(res.data.message);
|
} else {
|
this.$message.warning(res.data.message);
|
}
|
});
|
}
|
}
|
});
|
}
|
// 取消编辑
|
private editCancel() {
|
this.editShowOrHiddenFlag = false;
|
}
|
|
// 显示区域点弹窗
|
private areaPointConfiguration(flag: boolean, record: any) {
|
this.areaPointConfigurationFlag = flag;
|
this.mapRecord = record;
|
get("device/selectMonitorPiontAndDeviceByOrgId", {
|
organization_id: record.organizationId,
|
}).then((res) => {
|
if (res.data.code === 0) {
|
this.monitorPoints = res.data.data;
|
if (this.monitorPoints.length > 0) {
|
this.map.center.lng = this.monitorPoints[0].longitude;
|
this.map.center.lat = this.monitorPoints[0].latitude;
|
}
|
this.treeData = this.monitorPoints.map((item: any) => {
|
let devices = [];
|
if (item.devices.length > 0) {
|
devices = item.devices.map((device: any) => {
|
const d = {
|
key: item.id + "-" + device.id,
|
title: device.name,
|
value: {
|
longitude: device.longitude,
|
latitude: device.latitude,
|
},
|
};
|
return d;
|
});
|
}
|
const obj = {
|
key: item.id,
|
title: item.name,
|
value: {
|
longitude: item.longitude,
|
latitude: item.latitude,
|
},
|
children: devices,
|
};
|
return obj;
|
});
|
if (this.treeData.length > 0) {
|
if (record.boundary !== null) {
|
const points = record.boundary.split(";").map((item) => {
|
const point = item.split(",");
|
const obj = { lng: point[0], lat: point[1] };
|
return obj;
|
});
|
this.polyline.points = points;
|
}
|
if (
|
!(
|
record.boundary === null &&
|
record.centerLatitude === null &&
|
record.centerLongitude === null
|
)
|
) {
|
this.map.chooseCenter.point.lat = record.centerLatitude;
|
this.map.chooseCenter.point.lng = record.centerLongitude;
|
get("servicesScopeDevice/getDevicesAndMonitorPoint", {
|
servicesScopeId: record.id,
|
}).then((res: any) => {
|
if (res.data.code === 0) {
|
const selectDevices = res.data.data;
|
this.map.center.lat = record.centerLatitude;
|
this.map.center.lng = record.centerLongitude;
|
const devicesExit = selectDevices.map((item: any) => {
|
if (item.devices.length > 0) {
|
const children = item.devices.map((device: any) => {
|
const treeDevice = {
|
key: item.id + "-" + device.id,
|
title: device.name,
|
value: {
|
longitude: device.longitude,
|
latitude: device.latitude,
|
},
|
};
|
return treeDevice;
|
});
|
const treeDevices = {
|
key: item.id,
|
title: item.name,
|
children: children,
|
};
|
return treeDevices;
|
}
|
});
|
if (devicesExit.length > 0) {
|
const points = new Array();
|
devicesExit.forEach((item: any) => {
|
item.children.forEach((child: any) => {
|
this.checkedKeys.push(child.key);
|
const point = {
|
lng: child.value.longitude,
|
lat: child.value.latitude,
|
};
|
const deviceId = child.key.substr(
|
child.key.indexOf("-") + 1,
|
child.key.length
|
);
|
const obj = {
|
point: point,
|
deviceId: deviceId,
|
};
|
points.push(obj);
|
});
|
});
|
this.map.points = points;
|
}
|
}
|
});
|
}
|
}
|
}
|
});
|
}
|
// 初始化地图
|
private handler({ BMap, map }) {
|
this.map.zoom = 14;
|
}
|
// 隐藏区域点弹窗
|
private editCancelMap() {
|
this.areaPointConfigurationFlag = false;
|
this.map.points = [];
|
this.polyline.points = [];
|
this.polyline.editing = false;
|
this.map.chooseCenter.point.lng = "";
|
this.map.chooseCenter.point.lat = "";
|
this.map.chooseCenter.flag = false;
|
this.checkedKeys = [];
|
}
|
// 保存区域点的修改
|
private editAreaPoint() {
|
let lnglat = this.polyline.points.map((point: any) => {
|
return point.lng + "," + point.lat;
|
});
|
const boundary = lnglat.join(";");
|
if (boundary === "") {
|
this.$message.warning("请进行区域绘制!");
|
return;
|
}
|
if (
|
(this.map.chooseCenter.point.lat === "" ||
|
this.map.chooseCenter.point.lat === null) &&
|
(this.map.chooseCenter.point.lng === "" ||
|
this.map.chooseCenter.point.lng === null)
|
) {
|
this.$message.warning("请选择中心点!");
|
return;
|
}
|
post("servicesScope/addBoundaryBindDevice", {
|
devices: this.deviceIds.join(","),
|
servicesScope: {
|
id: this.mapRecord.id,
|
name: null,
|
organizationId: null,
|
centerLongitude: this.map.chooseCenter.point.lng,
|
centerLatitude: this.map.chooseCenter.point.lat,
|
boundary: boundary,
|
},
|
}).then((res: any) => {
|
if (res.data.code === 0) {
|
this.getDataByCondition();
|
this.areaPointConfigurationFlag = false;
|
this.map.points = [];
|
this.polyline.points = [];
|
this.polyline.editing = false;
|
this.map.chooseCenter.point.lng = "";
|
this.map.chooseCenter.point.lat = "";
|
this.checkedKeys = [];
|
this.map.chooseCenter.flag = false;
|
this.$message.success(res.data.message);
|
} else {
|
this.$message.warning(res.data.message);
|
}
|
});
|
}
|
// 树结构文字选中
|
// private onSelect(selectedKeys: any, info: any) {
|
// console.log('onSelect', info);
|
// console.log('selectedKeys', selectedKeys);
|
// }
|
// 树结构选中框选中
|
private onCheck(checkedKeys: any, info: any) {
|
this.deviceIds = checkedKeys
|
.filter((item: any) => {
|
if (typeof item === "string") {
|
return item;
|
}
|
})
|
.map((item: any) => {
|
return item.substr(item.indexOf("-") + 1, item.length);
|
});
|
|
let infos = info.checkedNodes;
|
if (infos.length > 0) {
|
infos = infos.filter((item: any) => {
|
if (typeof item.key === "string") {
|
return item;
|
}
|
});
|
this.map.points = infos.map((item: any) => {
|
const point = {
|
lng: item.data.props.value.longitude,
|
lat: item.data.props.value.latitude,
|
};
|
const index = item.key.indexOf("-");
|
|
const pointObj = {
|
point: point,
|
deviceId: item.key.substring(index + 1, item.key.length),
|
};
|
return pointObj;
|
// const id = item.key.substr()
|
});
|
} else {
|
this.map.points = [];
|
}
|
}
|
// 显示隐藏绘制框
|
private toggle() {
|
if (this.map.points.length === 0) {
|
this.$message.warning("请选择设备点再进行区域绘制!");
|
return;
|
}
|
if (this.map.points.length === 1) {
|
this.$message.warning("至少选择两台设备!");
|
return;
|
}
|
this.polyline.editing = !this.polyline.editing;
|
if (this.polyline.editing) {
|
if (this.polyline.points.length === 0) {
|
const lngMaxOrMin = this.map.points.sort((item1: any, item2: any) => {
|
return item1.point.lng - item2.point.lng;
|
});
|
const lngMin = lngMaxOrMin[0];
|
const lngMax = lngMaxOrMin[lngMaxOrMin.length - 1];
|
const latMaxOrMin = this.map.points.sort((item1: any, item2: any) => {
|
return item1.point.lat - item2.point.lat;
|
});
|
const latMin = latMaxOrMin[0];
|
const latMax = latMaxOrMin[latMaxOrMin.length - 1];
|
const points = [
|
{ lng: lngMax.point.lng, lat: latMax.point.lat },
|
{ lng: lngMax.point.lng, lat: latMin.point.lat },
|
{ lng: lngMin.point.lng, lat: latMin.point.lat },
|
{ lng: lngMin.point.lng, lat: latMax.point.lat },
|
];
|
this.polyline.points = points;
|
}
|
}
|
}
|
// 多边形变化
|
private updatePolygonPath(e: any) {
|
this.polyline.points = e.target.getPath();
|
}
|
// 选择中心点
|
private chooseCenter() {
|
this.map.chooseCenter.flag = !this.map.chooseCenter.flag;
|
}
|
// 点击地图中心点显示
|
private mapClick(e: any) {
|
if (this.map.chooseCenter.flag) {
|
const { lng, lat } = e.point;
|
this.map.chooseCenter.point.lng = lng;
|
this.map.chooseCenter.point.lat = lat;
|
}
|
}
|
|
// 删除数据
|
private delete(record: any) {
|
post("servicesScope/delete", {
|
id: record.id,
|
}).then((res: any) => {
|
if (res.data.code === 0) {
|
this.pagination.current = 1;
|
this.getDataByCondition();
|
this.$message.success(res.data.message);
|
}
|
});
|
}
|
|
// 数据操作方法
|
private opRender(text: string, record: any, index: number) {
|
return (
|
<div>
|
<a onClick={() => this.editShow(true, record)}> 编辑 </a>
|
<a-divider type="vertical" />
|
<a onClick={() => this.areaPointConfiguration(true, record)}>
|
{" "}
|
经纬度区域点配置{" "}
|
</a>
|
<a-divider type="vertical" />
|
<a-popconfirm
|
title="确认删除吗?"
|
ok-text="确定"
|
cancel-text="取消"
|
onConfirm={() => this.delete(record)}
|
>
|
<a href="#">删除</a>
|
</a-popconfirm>
|
</div>
|
);
|
}
|
}
|
</script>
|
|
<style scoped>
|
/deep/.ant-modal-body {
|
padding: 10px;
|
}
|
/deep/.ant-layout-sider {
|
background: #fff;
|
line-height: 120px;
|
}
|
/deep/.ant-tree-node-content-wrapper {
|
width: 140px;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
}
|
/deep/.BMap_cpyCtrl {
|
display: none;
|
}
|
/deep/.anchorBL {
|
display: none;
|
}
|
</style>
|