357 lines
9.2 KiB
Vue
357 lines
9.2 KiB
Vue
|
|
<template>
|
|||
|
|
<div class="map-content">
|
|||
|
|
<div class="map-box" id="mapContainer" @drop="handleMapDrop" @dragover.prevent></div>
|
|||
|
|
<div class="device-box">
|
|||
|
|
<div class="box-content">
|
|||
|
|
<div class="box-title">
|
|||
|
|
<span>场内布点</span>
|
|||
|
|
<el-button type="primary" @click="addPoint" size="medium">添加点位</el-button>
|
|||
|
|
</div>
|
|||
|
|
<!-- <vue-scroll :ops="{ scrollPanel: { overflowX: false } }">
|
|||
|
|
<div style="margin: 5px 0"></div>
|
|||
|
|
<div
|
|||
|
|
v-for="item in pointList"
|
|||
|
|
:key="item.devSn"
|
|||
|
|
class="point-item"
|
|||
|
|
draggable="true"
|
|||
|
|
@dragstart="handleDragStart(item)"
|
|||
|
|
@click="handleClick(item)"
|
|||
|
|
>
|
|||
|
|
<div class="point-name">{{ item.name }}</div>
|
|||
|
|
<div @click="deletePoint(item)" class="delete-point" v-if="item.lng && item.lat">
|
|||
|
|
<i class="el-icon-delete"></i>
|
|||
|
|
清除位置
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</vue-scroll> -->
|
|||
|
|
<el-table :data="pointList">
|
|||
|
|
<el-table-column label="点位名称" prop="name"></el-table-column>
|
|||
|
|
<el-table-column label="图标" prop="coverImage" width="50px">
|
|||
|
|
<template #default="scope">
|
|||
|
|
<img
|
|||
|
|
v-if="scope.row.coverImage"
|
|||
|
|
:src="$store.state.FILEURL + scope.row.coverImage"
|
|||
|
|
alt=""
|
|||
|
|
style="width: 20px; height: 20px"
|
|||
|
|
/>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column label="备注" prop="remark"></el-table-column>
|
|||
|
|
<el-table-column label="操作" prop="operation">
|
|||
|
|
<template #default="scope">
|
|||
|
|
<div class="operation-box">
|
|||
|
|
<i class="el-icon-edit" @click="editPoint(scope.row)"></i>
|
|||
|
|
<i class="el-icon-delete" @click="deletePoint(scope.row)"></i>
|
|||
|
|
<el-link v-if="scope.row.lat && scope.row.lng" type="danger" :underline="false" @click="clearPoint(scope.row)"
|
|||
|
|
>清除位置</el-link
|
|||
|
|
>
|
|||
|
|
<el-link v-else type="primary" :underline="false" @click="goPoint(scope.row)">去标点</el-link>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
</el-table>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<add-point-dialog :visible.sync="dialogVisible" :data-info="dialogDataInfo" @refresh="getPointList()"></add-point-dialog>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import addPointDialog from './components/addPointDialog.vue'
|
|||
|
|
import {
|
|||
|
|
getDevListApi,
|
|||
|
|
editDevicePositionApi,
|
|||
|
|
clearLocateApi,
|
|||
|
|
addDevicePositionApi,
|
|||
|
|
deleteDevicePositionApi
|
|||
|
|
} from '@/assets/js/api/smartSafeHat/smartSafeHat'
|
|||
|
|
|
|||
|
|
var mouseTool
|
|||
|
|
var map
|
|||
|
|
export default {
|
|||
|
|
components: {
|
|||
|
|
addPointDialog
|
|||
|
|
},
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
dialogVisible: false,
|
|||
|
|
dialogDataInfo: null,
|
|||
|
|
deviceType: 3, // 类别(1、视频监控;2、扬尘设备;3、场站;11、塔吊;12、架桥机;13、龙门吊;14、升降机;)
|
|||
|
|
addForm: {
|
|||
|
|
locationList: [
|
|||
|
|
{
|
|||
|
|
fenceId: 0,
|
|||
|
|
id: 0,
|
|||
|
|
latitude: '',
|
|||
|
|
longitude: '',
|
|||
|
|
sortNum: 0
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
projectSn: '',
|
|||
|
|
enterpriseId: ''
|
|||
|
|
},
|
|||
|
|
pointList: [],
|
|||
|
|
markers: {},
|
|||
|
|
curItem: {},
|
|||
|
|
selectPointStatus: false
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
mounted() {
|
|||
|
|
this.initMap()
|
|||
|
|
this.getPointList(true)
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
// 围栏定位地图
|
|||
|
|
initMap() {
|
|||
|
|
var that = this
|
|||
|
|
//地图加载
|
|||
|
|
map = new AMap.Map('mapContainer', {
|
|||
|
|
resizeEnable: true
|
|||
|
|
})
|
|||
|
|
map.on('click', e => {
|
|||
|
|
if (!this.selectPointStatus) {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
console.log('您在 [ ' + e.lnglat.getLng() + ',' + e.lnglat.getLat() + ' ] 的位置单击了地图!')
|
|||
|
|
this.curItem.lng = e.lnglat.getLng()
|
|||
|
|
this.curItem.lat = e.lnglat.getLat()
|
|||
|
|
this.addMarker(this.curItem)
|
|||
|
|
this.savePointPosition(this.curItem)
|
|||
|
|
console.log('当前位置列表', this.locationList)
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
addPoint() {
|
|||
|
|
this.dialogVisible = true
|
|||
|
|
this.dialogDataInfo = null
|
|||
|
|
},
|
|||
|
|
editPoint(data) {
|
|||
|
|
this.dialogDataInfo = data
|
|||
|
|
this.dialogVisible = true
|
|||
|
|
},
|
|||
|
|
handleClick(item) {
|
|||
|
|
if (item.lng && item.lat) {
|
|||
|
|
map.setCenter([item.lng, item.lat])
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
handleDragStart(item) {
|
|||
|
|
// 将拖拽数据存储在事件中
|
|||
|
|
event.dataTransfer.setData('text/plain', JSON.stringify(item))
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
handleMapDrop(event) {
|
|||
|
|
// 获取拖拽数据
|
|||
|
|
const item = JSON.parse(event.dataTransfer.getData('text/plain'))
|
|||
|
|
// 获取地图坐标
|
|||
|
|
const { lng, lat } = map.getCenter()
|
|||
|
|
|
|||
|
|
console.log('handleMapDrop', event, item)
|
|||
|
|
|
|||
|
|
// 检查是否已存在marker
|
|||
|
|
if (this.markers[item.devSn]) {
|
|||
|
|
this.$message.warning('设备已存在')
|
|||
|
|
} else {
|
|||
|
|
item.lng = lng
|
|||
|
|
item.lat = lat
|
|||
|
|
this.addMarker(item)
|
|||
|
|
// 保存位置信息
|
|||
|
|
this.savePointPosition(item)
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
async savePointPosition(item) {
|
|||
|
|
const api = item.monitorId ? editDevicePositionApi : addDevicePositionApi
|
|||
|
|
api({ ...item, projectSn: this.$store.state.projectSn }).then(res => {
|
|||
|
|
if (res.success) {
|
|||
|
|
this.$message.success(res.message)
|
|||
|
|
this.getPointList()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
deletePoint(item) {
|
|||
|
|
deleteDevicePositionApi({ monitorId: item.monitorId }).then(res => {
|
|||
|
|
if (res.success) {
|
|||
|
|
this.$message.success(res.message)
|
|||
|
|
if (this.markers[item.devSn]) {
|
|||
|
|
map.remove(this.markers[item.devSn])
|
|||
|
|
delete this.markers[item.devSn]
|
|||
|
|
}
|
|||
|
|
this.getPointList()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
clearPoint(item) {
|
|||
|
|
clearLocateApi({ monitorId: item.monitorId }).then(res => {
|
|||
|
|
if (res.success) {
|
|||
|
|
this.$message.success(res.message)
|
|||
|
|
map.remove(this.markers[item.devSn])
|
|||
|
|
delete this.markers[item.devSn]
|
|||
|
|
this.getPointList()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
goPoint(data) {
|
|||
|
|
this.curItem = data
|
|||
|
|
this.selectPointStatus = true
|
|||
|
|
},
|
|||
|
|
getPointList(loadMap = false) {
|
|||
|
|
let data = {
|
|||
|
|
category: this.deviceType,
|
|||
|
|
projectSn: this.$store.state.projectSn
|
|||
|
|
}
|
|||
|
|
getDevListApi(data).then(res => {
|
|||
|
|
if (res.success) {
|
|||
|
|
this.pointList = res.result
|
|||
|
|
console.log('围栏', this.pointList)
|
|||
|
|
if (loadMap) {
|
|||
|
|
this.markers = {}
|
|||
|
|
this.clearFn()
|
|||
|
|
this.initAllMarker()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
//清空地图
|
|||
|
|
clearFn() {
|
|||
|
|
map.clearMap()
|
|||
|
|
},
|
|||
|
|
//添加点标记
|
|||
|
|
addMarker(item) {
|
|||
|
|
// 创建新marker
|
|||
|
|
const marker = new AMap.Marker({
|
|||
|
|
position: [item.lng, item.lat],
|
|||
|
|
draggable: true
|
|||
|
|
})
|
|||
|
|
this.markers[item.devSn] = marker
|
|||
|
|
marker.setMap(map)
|
|||
|
|
marker.on('dragend', e => {
|
|||
|
|
console.log('拖拽结束', e)
|
|||
|
|
item.lng = e.lnglat.lng
|
|||
|
|
item.lat = e.lnglat.lat
|
|||
|
|
// 保存位置信息
|
|||
|
|
this.savePointPosition(item)
|
|||
|
|
})
|
|||
|
|
marker.setLabel({
|
|||
|
|
offset: new AMap.Pixel(0, -8), //设置文本标注偏移量
|
|||
|
|
content: item.name, //设置文本标注内容
|
|||
|
|
direction: 'top' //设置文本标注方位
|
|||
|
|
})
|
|||
|
|
this.selectPointStatus = false;
|
|||
|
|
},
|
|||
|
|
initAllMarker() {
|
|||
|
|
this.pointList.forEach(item => {
|
|||
|
|
if (item.lng && item.lat) {
|
|||
|
|
this.addMarker(item)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
map.setFitView()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.map-content {
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
position: relative;
|
|||
|
|
}
|
|||
|
|
#mapContainer {
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
}
|
|||
|
|
// 围栏弹窗
|
|||
|
|
.device-box {
|
|||
|
|
position: absolute;
|
|||
|
|
background: #fff;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
padding: 25px;
|
|||
|
|
left: 2%;
|
|||
|
|
top: 20px;
|
|||
|
|
width: 550px;
|
|||
|
|
height: 500px;
|
|||
|
|
z-index: 1;
|
|||
|
|
.fence-dialog-modal {
|
|||
|
|
position: absolute;
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
top: 0%;
|
|||
|
|
left: 0%;
|
|||
|
|
z-index: 3;
|
|||
|
|
background: rgba(39, 45, 69, 0.5);
|
|||
|
|
}
|
|||
|
|
.close-icon {
|
|||
|
|
position: absolute;
|
|||
|
|
top: 0px;
|
|||
|
|
right: 0px;
|
|||
|
|
cursor: pointer;
|
|||
|
|
}
|
|||
|
|
.box-title {
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: space-between;
|
|||
|
|
align-items: center;
|
|||
|
|
margin-bottom: 20px;
|
|||
|
|
span {
|
|||
|
|
border-left: 4px solid #5c81ee;
|
|||
|
|
font-size: 15px;
|
|||
|
|
color: #272d45;
|
|||
|
|
padding-left: 10px;
|
|||
|
|
font-weight: 600;
|
|||
|
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.box-content {
|
|||
|
|
position: relative;
|
|||
|
|
.fence-tool {
|
|||
|
|
display: flex;
|
|||
|
|
justify-content: space-around;
|
|||
|
|
padding: 0 25px;
|
|||
|
|
.tool {
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
width: 80px;
|
|||
|
|
height: 33px;
|
|||
|
|
font-size: 14px;
|
|||
|
|
cursor: pointer;
|
|||
|
|
background: #ffffff;
|
|||
|
|
color: #5181f6;
|
|||
|
|
border-radius: 2px 2px 2px 2px;
|
|||
|
|
border: 1px solid #5181f6;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.box-select {
|
|||
|
|
margin: 15px 0;
|
|||
|
|
}
|
|||
|
|
.box-list {
|
|||
|
|
height: 160px;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.point-item {
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: space-between;
|
|||
|
|
margin-bottom: 10px;
|
|||
|
|
cursor: move;
|
|||
|
|
.point-name {
|
|||
|
|
font-size: 14px;
|
|||
|
|
color: #272d45;
|
|||
|
|
flex: 1;
|
|||
|
|
}
|
|||
|
|
.delete-point {
|
|||
|
|
font-size: 14px;
|
|||
|
|
color: #ea3941;
|
|||
|
|
cursor: pointer;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
.operation-box {
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
gap: 10px;
|
|||
|
|
i {
|
|||
|
|
cursor: pointer;
|
|||
|
|
color: #5181f6;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|