qa-prevention-gwj-vue/src/views/firefighting/points/components/edit.vue

709 lines
25 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container">
<div class="level-title">
<h1>{{ this.$parent.firePointId === '' ? "新增" : "修改" }}</h1>
</div>
<div>
<el-form ref="form" :model="form" :rules="rules" label-width="180px">
<el-row>
<el-col :span="12">
<el-form-item label="消防区域名称:" prop="fireRegionId">
<el-select v-model="form.fireRegionId" placeholder="请选择" class="filter-item" style="width: 100%;">
<el-option
v-for="item in varRegionList"
:key="item.fireRegionId"
:label="item.fireRegionName"
:value="item.fireRegionId"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="负责部门:" prop="departmentId">
<el-select v-model="form.departmentId" placeholder="请选择负责部门" style="width: 100%;">
<el-option
v-for="item in departmentList"
:key="item.departmentId"
:label="item.departmentName"
:value="item.departmentId"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="负责人:" prop="USER_ID">
<el-select v-model="form.userId" placeholder="请选择人员" class="filter-item" style="width: 100%;">
<el-option v-for="item in varList" :key="item.USER_ID" :label="item.NAME" :value="item.USER_ID"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="消防点位名称:" prop="firePointName">
<el-input v-model="form.firePointName" placeholder="请输入内容"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="消防点位编码:" prop="firePointCode">
<el-input v-model="form.firePointCode" placeholder="请输入内容"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="经纬度:" prop="longitudeAndLatitude">
<el-input v-model="form.longitudeAndLatitude" style="width:206px" placeholder="请选择" disabled/>
<el-button style="margin-left: 10px" type="primary" @click="handleMap">点击定位</el-button>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="消防点位图片 ">
<div class="disContent">
<el-upload
:auto-upload="false"
:file-list="firefightingImgs"
:on-change="handleEditChange"
:on-exceed="overFlow"
:limit="5"
action="#"
multiple
accept=".jpg,.png"
list-type="picture-card">
<i slot="default" class="el-icon-plus"/>
<div slot="file" slot-scope="{file}">
<img
v-if="file.filePath"
:src="config.fileUrl + file.filePath"
class="el-upload-list__item-thumbnail"
alt=""
>
<img
v-else
:src="file.url"
class="el-upload-list__item-thumbnail"
alt=""
>
<span class="el-upload-list__item-actions">
<span
class="el-upload-list__item-preview"
@click="handlePictureCardPreview(file)"
>
<i class="el-icon-zoom-in"/>
</span>
<span
class="el-upload-list__item-delete"
@click="handleRemove(file)"
>
<i class="el-icon-delete"/>
</span>
</span>
</div>
</el-upload>
</div>
<el-dialog :visible.sync="dialogVisible" append-to-body>
<img :src="dialogImageUrl" width="100%" alt="">
</el-dialog>
<div style="margin-top: 10px">
限制上传数量:{{ firefightingImgs.length +'/'+'5' }}
</div>
<div>
只能上传jpg/png文件单张且不超过5mb
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<el-dialog :visible.sync="dialogFormMap" title="定位" width="1050px" class="dy-dialog">
<div id="cesiumContainer"/>
<div slot="footer" class="dialog-footer">
<span>经度:</span>
<el-input v-model="longitude" style="width: 200px" placeholder="请输入内容" disabled/>
<span>纬度:</span>
<el-input v-model="latitude" style="width: 200px" placeholder="请输入内容" disabled/>
<el-button @click="dialogFormMap = false">取 消</el-button>
<el-button type="primary" @click="setPosition">确 定</el-button>
</div>
</el-dialog>
<div class="ui-foot">
<el-button type="success" @click="confirm">保 存</el-button>
<el-button plain type="info" @click="goBack"> </el-button>
</div>
</div>
</template>
<script>
import Pagination from '@/components/Pagination'
import { requestFN } from '@/utils/request'
import { upload } from '@/utils/upload'
import SelectTree from '@/components/SelectTree'
import waves from '@/directive/waves'
import TiandiMap from '@/components/TianMap/TiandiMap.vue'
import RyDragEntity from '../../../map/js/ry_dragentity'
import DragEntity from '../../../map/js/dragentity'
let viewer = null
let drag = null
// eslint-disable-next-line no-unused-vars
let ry_drag = null
var tiandituTk = 'e8a16137fd226a62a23cc7ba5c9c78ce'
var subdomains = ['0', '1', '2', '3', '4', '5', '6', '7']
const Cesium = window.Cesium
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkOWQ0MGYwMy0yODUwLTQ1YzktOGM4OC02MTMwY2UyZjNlMzQiLCJpZCI6MTY0NTUwLCJpYXQiOjE2OTM4OTU1Mjd9.1cC0sSzyj79LZv0ILNCcl0Mabw6hl8TNngFNFr7H8f4'
export default {
components: { Pagination, SelectTree, TiandiMap },
directives: { waves },
data() {
return {
config: config,
firefightingImgs: [],
waitForDeleteImgs: [],
dialogVisible: false,
dialogImageUrl: '',
dialogFormMap: false,
map: null,
longitude: '',
latitude: '',
SORTINDEX: '',
departmentList: [],
form: {
firePointId: '',
firePointName: '',
firePointCode: '',
longitudeAndLatitude: '',
longitude: '',
latitude: '',
POST_ID: '',
fireRegionId: '',
departmentId: '',
userId: ''
},
rules: {
fireRegionId: [{ required: true, message: '消防区域不为空', trigger: 'blur' }],
firePointName: [{ required: true, message: '消防点位不为空', trigger: 'blur' }],
firePointCode: [{ required: true, message: '消防点位编码不为空', trigger: 'blur' }],
departmentId: [{ required: true, message: '请选责任部门', trigger: 'blur' }],
longitudeAndLatitude: [{ required: false, message: '请选经纬度', trigger: 'blur' }],
userId: [{ required: true, message: '请选责任人', trigger: 'blur' }]
},
varList: [],
varRegionList: [],
deForm: {
departmentId: '',
departmentName: ''
},
corpInfo: {
CORP_INFO_ID: '',
longitude: '',
latitude: ''
},
center: { longitude: 119.6486945226887, latitude: 39.93555616569192, height: 900000 },
poinEntity: {},
dichitype: 0
}
},
watch: {
'form.fireRegionId': {
handler(newVal, oldVal) {
if (oldVal) this.form.userId = ''
this.form.departmentId = ''
this.varList = []
this.getFireRegionInfo(newVal)
},
immediate: false
}
},
async created() {
this.FIRE_POINT_ID = this.$parent.firePointId
await this.getFireRegion()
if (this.FIRE_POINT_ID) {
this.getDicListByPID()
}
},
mounted() {
this.initCorpInfo()
},
methods: {
initCorpInfo() {
requestFN(
'/map/getCorpInfo', {}
).then((data) => {
this.corpInfo.CORP_INFO_ID = data.info.CORP_INFO_ID
this.corpInfo.latitude = data.info.latitude
this.corpInfo.longitude = data.info.longitude
this.initMap2()
}).catch((e) => {
console.log(e)
})
},
initMap2() {
console.info(viewer)
if (this.dichitype === 2) {
return
}
viewer = new Cesium.Viewer('cesiumContainer', {
animation: false, // 动画
homeButton: true, // home键
geocoder: true, // 地址编码
baseLayerPicker: false, // 图层选择控件
timeline: false, // 时间轴
fullscreenButton: true, // 全屏显示
infoBox: true, // 点击要素之后浮窗
sceneModePicker: true, // 投影方式 三维/二维
navigationInstructionsInitiallyVisible: false, // 导航指令
navigationHelpButton: false, // 帮助信息
selectionIndicator: false, // 选择
imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
// 影像底图
url: 'http://t{s}.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + tiandituTk,
subdomains: subdomains,
layer: 'tdtImgLayer',
style: 'default',
format: 'image/jpeg',
tileMatrixSetID: 'GoogleMapsCompatible', // 使用谷歌的瓦片切片方式
show: true
})
})
viewer._cesiumWidget._creditContainer.style.display = 'none' // 隐藏cesium ion
viewer.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({
// 影像注记
url: 'http://t{s}.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg&tk=' + tiandituTk,
subdomains: subdomains,
layer: 'tdtCiaLayer',
style: 'default',
format: 'image/jpeg',
tileMatrixSetID: 'GoogleMapsCompatible',
show: true
}))
drag = new DragEntity({
viewer
})
// 根据不同的公司将信息加载到地图上
this.initInfo()
this.leftDownAction()
console.log(this.latitude)
if (this.latitude) {
console.log('latitude')
this.dfdfd(this.longitude, this.latitude)
}
this.loadTilesetHandler()
ry_drag = new RyDragEntity({
viewer
})
this.dichitype = 2
},
leftDownAction() {
// 去掉entity的点击事件 start
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
// 去掉entity的点击事件 end
this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
this.handler.setInputAction(movement => {
// eslint-disable-next-line no-unused-vars
var cartesian = this.getCatesian3FromPX(movement.position)
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
},
getCatesian3FromPX: function(px) {
if (viewer && px) {
var picks = viewer.scene.drillPick(px)
var cartesian = null
// eslint-disable-next-line one-var
var isOn3dtiles = false,
isOnTerrain = false
// drillPick
for (const i in picks) {
const pick = picks[i]
if (
(pick && pick.primitive instanceof Cesium.Cesium3DTileFeature) ||
(pick && pick.primitive instanceof Cesium.Cesium3DTileset) ||
(pick && pick.primitive instanceof Cesium.Model)
) {
// 模型上拾取
isOn3dtiles = true
}
// 3dtilset
if (isOn3dtiles) {
viewer.scene.pick(px) // pick
cartesian = viewer.scene.pickPosition(px)
if (cartesian) {
const cartographic = Cesium.Cartographic.fromCartesian(cartesian)
if (cartographic.height < 0) cartographic.height = 0
// eslint-disable-next-line prefer-const,one-var
let lon = Cesium.Math.toDegrees(cartographic.longitude),
// eslint-disable-next-line prefer-const
lat = Cesium.Math.toDegrees(cartographic.latitude),
// eslint-disable-next-line prefer-const
height = cartographic.height
cartesian = this.transformWGS84ToCartesian({
lng: lon,
lat: lat,
alt: height
})
}
}
}
// 地形
const boolTerrain =
viewer.terrainProvider instanceof
Cesium.EllipsoidTerrainProvider
// Terrain
if (!isOn3dtiles && !boolTerrain) {
var ray = viewer.scene.camera.getPickRay(px)
if (!ray) return null
cartesian = viewer.scene.globe.pick(ray, viewer.scene)
isOnTerrain = true
}
// 地球
if (!isOn3dtiles && !isOnTerrain && boolTerrain) {
cartesian = viewer.scene.camera.pickEllipsoid(
px,
viewer.scene.globe.ellipsoid
)
}
const cartesian1 = new Cesium.Cartesian3(cartesian.x, cartesian.y, cartesian.z) // 替换为实际的 Cartesian3 坐标值
// 将 Cartesian3 坐标转换为 Cartographic 坐标
const cartographic = Cesium.Cartographic.fromCartesian(cartesian1)
// 将 Cartographic 坐标转换为 CGCS2000 计算经纬度
const lng = Cesium.Math.toDegrees(cartographic.longitude)
const lat = Cesium.Math.toDegrees(cartographic.latitude)
const height = cartographic.height // 高度
this.longitude = lng
this.latitude = lat
this.dfdfd(lng, lat)
return `CGCS2000 坐标: 经度 ${lng}, 纬度 ${lat}, 高度 ${height}`
}
},
transformWGS84ToCartesian: function(position, alt) {
// eslint-disable-next-line no-return-assign
return position ? Cesium.Cartesian3.fromDegrees(
position.lng || position.lon,
position.lat,
position.alt = alt || position.alt,
Cesium.Ellipsoid.WGS84
)
: Cesium.Cartesian3.ZERO
},
dfdfd(LONGITUDE, latitude) {
let dianweiName = '消防点位'
if (this.form.firePointName) {
dianweiName = this.form.firePointName
}
var initPoint = [
{
'id': '00002',
'data_id': '00002',
'MAP_POINT_NAME': dianweiName,
'name': '',
'point_type': '港口',
'type': '',
'descr': '',
'position': {
'x': LONGITUDE,
'y': latitude
},
CORP_INFO_ID: 'f8da1790b1034058ae2efefd69af3284'
}
]
this.dragAreaEntity(initPoint)
ry_drag = new RyDragEntity({
viewer
})
},
// 加载点
dragAreaEntity(pointArr) {
this.poinEntity = {}
const collection = new Cesium.CustomDataSource('clickEntityCollection')
pointArr.forEach(item => {
if (!this.poinEntity.hasOwnProperty(item.id)) {
const entity = drag.addEntity(item)
this.poinEntity[item.id] = entity
collection.entities.add(entity)
}
})
viewer.dataSources.removeAll()
viewer.dataSources.add(collection)
},
initInfo() {
this.bottomOptionsIndex = ''
this.clickPort({
id: '00003',
CORP_INFO_ID: this.corpInfo.CORP_INFO_ID,
longitude: this.corpInfo.longitude,
latitude: this.corpInfo.latitude,
height: '2000'
})
},
clickPort({ id, longitude, latitude, height, CORP_INFO_ID }) {
console.log('clickPort', id, longitude, latitude, height, CORP_INFO_ID)
this.gangkouActive = id
this.CORP_INFO_ID = CORP_INFO_ID
this.componentKey = Math.random()
this.bottomOptionsKey = Math.random()
this.bottomOptionsAnimationComplex = false
this.toCenter({ longitude, latitude, height })
drag.addPolygon(id)
viewer.dataSources.removeAll()
},
toCenter(center = this.center) {
console.log('toCenter', center)
if (this.FIRE_POINT_ID && this.longitude && this.latitude && this.longitude.trim() !== '' && this.latitude.trim() !== '') {
this.center.longitude = this.longitude
this.center.latitude = this.latitude
} else {
this.center.longitude = center.longitude
this.center.latitude = center.latitude
}
this.center.height = center.height
viewer.camera.flyTo({
// 设置中心点,x,y,缩放等级
destination: Cesium.Cartesian3.fromDegrees(this.center.longitude, this.center.latitude, this.center.height)
})
},
loadTilesetHandler() {
Cesium.ExperimentalFeatures.enableModelExperimental = true
var cfdd = new Cesium.Cesium3DTileset({
url: '/mapapi/ware/upload/%E6%9B%B9%E5%A6%83%E7%94%B8%E6%B8%AF%E4%B8%9C/%E6%9B%B9%E5%A6%83%E7%94%B8%E6%B8%AF%E4%B8%9C/merge_tile.json'
})
viewer.scene.primitives.add(cfdd)
var cfdx = new Cesium.Cesium3DTileset({
url: '/mapapi/ware/upload/%E6%9B%B9%E5%A6%83%E7%94%B8%E6%B8%AF%E8%A5%BF/%E6%9B%B9%E5%A6%83%E7%94%B8%E6%B8%AF%E8%A5%BF/merge_tile.json'
})
viewer.scene.primitives.add(cfdx)
var qhdxys = new Cesium.Cesium3DTileset({
url: '/mapapi/ware/upload/qhdxys/merge_tile.json'
})
viewer.scene.primitives.add(qhdxys)
var qhdgysh = new Cesium.Cesium3DTileset({
url: '/mapapi/ware/upload/qhdgysh/merge_tile.json'
})
viewer.scene.primitives.add(qhdgysh)
},
handleRemove(file) {
if (file.imgfilesId) {
// 已经上传过的 现在删除 记录这个id
this.waitForDeleteImgs.push(file.imgfilesId)
this.firefightingImgs = this.firefightingImgs.filter(x => x.imgfilesId !== file.imgfilesId)
} else {
this.firefightingImgs = this.firefightingImgs.filter(x => x.MATERIALS_ID !== file.MATERIALS_ID)
}
},
handlePictureCardPreview(file) {
if (file.url) {
this.dialogImageUrl = file.url
}
if (file.filePath) {
this.dialogImageUrl = config.fileUrl + file.filePath
}
this.dialogVisible = true
},
overFlow(files, fileList) {
this.$message.warning('最多上传5张图片')
},
handleEditChange(file, fileList) {
file.MATERIALS_ID = Math.random()
const is5M = file.size / 1024 / 1024 < 5
if (is5M) this.firefightingImgs.push(file)
},
getFireRegion() {
requestFN(
'/fire/region/v2/list',
{}
).then((data) => {
this.varRegionList = data.varList
}).catch((e) => {
})
},
setPosition() {
this.form.longitudeAndLatitude = this.latitude + '--' + this.longitude
this.dialogFormMap = false
},
initTDT() {
},
/**
* 初始化地图
* @param {*} lng 经度
* @param {*} lat 纬度
* @param {*} zoom 缩放比例(1~18)
*/
initMap(lng, lat, zoom) {
this.initTDT().then((T) => {
// const imageURL = 'http://t0.tianditu.gov.cn/img_w/wmts?' + 'SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles' + '&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=e8a16137fd226a62a23cc7ba5c9c78ce'
const imageURL = 'http://t{s}.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + tiandituTk
// 创建自定义图层对象
this.lay = new window.T.TileLayer(imageURL, { minZoom: 1, maxZoom: 18 })
// 初始化地图对象
this.map = new window.T.Map('map')
this.initCenter(lng, lat, zoom)
})
},
initCenter(lng, lat, zoom) {
// 设置显示地图的中心点和级别
if (!this.longitude && !this.latitude) {
this.map.centerAndZoom(new window.T.LngLat(119.58273, 39.91724), zoom)
} else {
this.map.centerAndZoom(new window.T.LngLat(lng, lat), zoom)
this.marker && this.map.removeOverLay(this.marker)
this.longitude = lng
this.latitude = lat
this.marker = new window.T.Marker(new window.T.LngLat(lng, lat))
// 向地图上添加标注
this.map.addOverLay(this.marker)
}
// 创建卫星和路网的混合视图
this.map.setMapType(window.TMAP_HYBRID_MAP)
// 允许鼠标滚轮缩放地图
this.map.enableScrollWheelZoom()
// 允许鼠标移动地图
this.map.enableInertia()
// 向地图上添加标注
this.map.addEventListener('click', this.MapClick)
},
MapClick(event) {
this.marker && this.map.removeOverLay(this.marker)
this.longitude = event.lnglat.getLng()
this.latitude = event.lnglat.getLat()
this.marker = new window.T.Marker(new window.T.LngLat(event.lnglat.getLng(), event.lnglat.getLat()))
// 向地图上添加标注
this.map.addOverLay(this.marker)
},
handleMap() {
this.dialogFormMap = true
this.$nextTick(() => {
if (!this.map) {
this.initCorpInfo()
} else {
this.initCenter(this.longitude, this.latitude, 16)
}
})
},
confirm() {
this.$refs.form.validate(valid => {
if (valid) {
const formData = new FormData()
if (this.form.longitudeAndLatitude) {
const [latitude, longitude] = this.form.longitudeAndLatitude.split('--')
this.form.longitude = longitude
this.form.latitude = latitude
}
Object.keys(this.form).map(key => {
formData.append(key, this.form[key])
})
if (this.firefightingImgs.length > 0) {
for (let i = 0; i < this.firefightingImgs.length; i++) {
formData.append('files', this.firefightingImgs[i].raw)
}
}
formData.append('waitForDeleteImgs', this.waitForDeleteImgs.join(','))
if (this.$parent.FIRE_POINT_ID === '') {
this.handleAdd(formData)
} else {
if (valid) {
this.listLoading = true
upload(
'/fire/point/v2/update',
formData
).then((data) => {
this.waitForDeleteImgs = []
this.listLoading = false
this.dialogFormEdit = false
this.$parent.activeName = 'List'
this.$parent.$refs.list.getList()
}).catch((e) => {
this.listLoading = false
})
}
}
}
})
},
number() {
this.form.SORTINDEX = this.form.SORTINDEX.replace(/[^\.\d]/g, '')
this.form.SORTINDEX = this.form.SORTINDEX.replace('.', '')
},
handleAdd(formData) {
upload(
'/fire/point/v2/save',
formData
).then((data) => {
this.waitForDeleteImgs = []
this.$parent.activeName = 'List'
}).catch((e) => {})
},
getDicListByPID() {
requestFN(
'/fire/point/v2/info',
{ id: this.$parent.firePointId }
).then((data) => {
this.form = Object.assign(this.form, data.res)
this.longitude = this.form.longitude
this.latitude = this.form.latitude
this.firefightingImgs = data.imgList
}).catch((e) => {
})
},
// 用户
getUserList() {
requestFN(
'/user/listAll',
{
DEPARTMENT_ID: this.form.departmentId,
POST_ID: this.form.POST_ID
}
).then((data) => {
this.varList = data.userList
}).catch((e) => {
})
},
getFireRegionInfo(FIRE_REGION_ID) {
this.listLoading = true
this.departmentList = []
requestFN(
'/fire/region/v2/info',
{
fireRegionId: FIRE_REGION_ID
}
).then((data) => {
this.listLoading = false
this.deForm.departmentId = data.res.departmentId
this.deForm.departmentName = data.res.departmentName
this.departmentList.push(this.deForm)
this.form.departmentId = data.res.departmentId
this.$nextTick(() => {
this.getUserList()
})
}).catch((e) => {
this.listLoading = false
})
},
// 返回列表
goBack() {
this.$parent.activeName = 'List'
this.$parent.firePointId = ''
}
}
}
</script>
<style>
#cesiumContainer {
width: 1000px;
height: 500px;
}
</style>