rt-sim-training-client/src/views/newMap/mapDraftPicture/index.vue

595 lines
21 KiB
Vue
Raw Normal View History

2022-07-05 09:08:12 +08:00
<template>
<transition name="el-zoom-in-center">
<div class="mapPaint">
<div v-show="maskOpen" class="mask" />
<div class="map-view">
2022-07-13 16:40:49 +08:00
<!-- <div class="operation_box" :class="{'rightShow': draftShow}">-->
<!-- <el-button-group>-->
<!-- <el-button size="small" :disabled="!stepData.length" @click="revocation">撤销</el-button>-->
<!-- <el-button size="small" :disabled="!recoverStepData.length" @click="recover">恢复</el-button>-->
<!-- </el-button-group>-->
<!-- </div>-->
2022-07-05 09:08:12 +08:00
<div class="operation_box back_box">
<el-button size="small" @click="backRoute">返回</el-button>
<el-button size="small" style="margin-left: 5px;" @click="updateObjAxis">更新坐标</el-button>
</div>
<jlmap-visual ref="jlmapVisual" :draft-show="draftShow" @onSelect="clickEvent" @onMenu="onContextmenu" />
</div>
<div class="map-draft" :class="{'hide': draftShow}">
<div class="btn_left_box" @click="clickRightBtn"><i :class="draftShow?'el-icon-arrow-right':'el-icon-arrow-left'" /></div>
<div class="box">
<map-operate
ref="mapOperate"
:map-info="mapInfo"
:selected="selected"
:map-saveing="mapSaveing"
@saveMapEvent="saveMapEvent"
2022-07-07 16:08:04 +08:00
@createPicture="createPicture"
@changePicture="changePicture"
2022-07-13 16:40:49 +08:00
@deletePicture="deletePicture"
2022-07-05 09:08:12 +08:00
@setCenter="setCenter"
/>
</div>
</div>
<pop-menu ref="popMenu" :menu="menu" />
2022-07-07 16:08:04 +08:00
<create-picture ref="createPicture" />
<change-picture ref="changePicture" @pictureChanged="pictureChanged" />
2022-07-05 09:08:12 +08:00
</div>
</transition>
</template>
<script>
2022-07-07 16:08:04 +08:00
import { saveMap, getMapDetail, postBuildMapImport } from '@/api/jmap/mapdraft';
2022-07-05 09:08:12 +08:00
import { ViewMode, TrainingMode, getDeviceMenuByDeviceType, DeviceMenu } from '@/scripts/ConstDic';
import JlmapVisual from '@/views/newMap/jlmapNew/index';
import MapOperate from './mapoperate/index';
import { EventBus } from '@/scripts/event-bus';
import { mapGetters } from 'vuex';
import PopMenu from '@/components/PopMenu';
2022-07-07 16:08:04 +08:00
import CreatePicture from './createPicture';
import ChangePicture from './changePicture';
2022-07-05 09:08:12 +08:00
export default {
name: 'MapView',
components: {
JlmapVisual,
MapOperate,
2022-07-07 16:08:04 +08:00
PopMenu,
CreatePicture,
ChangePicture
2022-07-05 09:08:12 +08:00
},
data() {
return {
viewSelect: ViewMode.MIX,
mapSaveing: false,
ViewMode: ViewMode,
viewDraft: 'draft',
autoSaveTask: null,
selected: null,
mapInfo: { name: this.$t('map.pleaseSelectMap') },
oldDevice: null,
draftShow: false,
2022-07-13 16:40:49 +08:00
pictureName: '',
2022-07-05 09:08:12 +08:00
size: {
width: document.documentElement.clientWidth - 521,
height: document.documentElement.clientHeight - 90
},
updtModel: {
code: '',
scaling: '',
origin: {
x: '',
y: ''
}
},
menu: [],
menuNormal: []
};
},
computed: {
...mapGetters('map', [
'stepData',
'recoverStepData',
'stationList'
]),
maskOpen() {
return this.$store.state.config.maskOpen;
}
},
watch: {
'$store.state.map.mapDataLoadedCount': function () {
this.initAutoSaveTask();
},
'$store.state.app.windowSizeCount': function() {
this.setWindowSize();
},
$route() {
this.clearAutoSave();
this.$nextTick(() => {
this.loadInitPage();
});
},
'$store.state.menuOperation.menuCount': function () {
if (this.$store.getters['menuOperation/checkDialogIsOpen'](DeviceMenu.Cancel)) {
this.popDoShow(this.$store.state.menuOperation.menuPosition);
} else {
this.popDoClose();
}
}
},
mounted() {
this.setWindowSize();
this.loadInitPage();
EventBus.$on('SELECTON', () => {
this.selected = null;
});
},
beforeDestroy() {
EventBus.$off('SELECTON');
this.clearAutoSave();
2022-07-13 14:19:02 +08:00
this.$store.dispatch('map/setPictureDeviceMap', {});
2022-07-05 09:08:12 +08:00
this.$store.dispatch('map/mapClear');
},
methods: {
clickRightBtn() {
this.draftShow = !this.draftShow;
},
getMapOrigin() {
const dataZoom = this.$store.state.map.dataZoom;
if (dataZoom && dataZoom.offsetX) {
this.updtModel.origin.x = Number.parseInt(dataZoom.offsetX);
this.updtModel.origin.y = Number.parseInt(dataZoom.offsetY);
this.updtModel.scaling = dataZoom.scaleRate;
}
},
// 设置地图定位
mapLocation(item) {
if (item) {
this.$store.dispatch('training/updateOffsetStationCode', { offsetStationCode: item.code });
this.popDoClose();
}
},
initMenu() {
this.menuNormal = [];
this.stationList.forEach(station => {
if (station.chargeStationCodeList && station.chargeStationCodeList.length) {
const node = {
label: station.name,
children: []
};
station.chargeStationCodeList.forEach(item => {
const next = this.$store.getters['map/getDeviceByCode'](item);
node.children.push({
code: next.code,
label: next.name,
handler: this.mapLocation
});
});
this.menuNormal.push(node);
}
});
this.menu = [...this.menuNormal];
},
popDoShow(point) {
this.popClickEvent();
this.initMenu();
if (this.$refs && this.$refs.popMenu && this.menu && this.menu.length) {
this.$refs.popMenu.resetShowPosition(point);
}
},
popClickEvent() {
const self = this;
window.onclick = function () {
self.popDoClose();
};
},
popDoClose() {
if (this.$refs && this.$refs.popMenu) {
this.$refs.popMenu.close();
}
},
updateObjAxis() {
2022-07-13 16:40:49 +08:00
if (!this.pictureName) {
this.$message.error('请先切换画面!');
return;
}
2022-07-05 09:08:12 +08:00
this.getMapOrigin();
2022-07-13 16:40:49 +08:00
const pictureModel = this.$store.state.map.map.pictureList.find(elem => elem.name == this.pictureName);
2022-07-05 09:08:12 +08:00
this.$confirm('您确认按当前绘图位置更新坐标及缩放比例?', this.$t('tip.hint'), {
confirmButtonText: this.$t('tip.confirm'),
cancelButtonText: this.$t('tip.cancel'),
type: 'warning'
}).then(() => {
const map = this.$store.state.map.map;
this.$store.dispatch('map/saveMapDeviceDefaultRelations').then(() => {
2022-07-13 16:40:49 +08:00
pictureModel.origin = {
x: this.updtModel.origin.x || map.origin.x || 0,
y: this.updtModel.origin.y || map.origin.y || 0
};
pictureModel.scaling = this.updtModel.scaling || map.scaling || '1';
2022-07-05 09:08:12 +08:00
const param = {
2022-07-13 16:40:49 +08:00
mapId: this.$route.params.mapId
2022-07-05 09:08:12 +08:00
};
saveMap(Object.assign(map, param)).then(() => {
this.$message.success(this.$t('map.updateSuccessfully'));
}).catch(() => {
this.$messageBox(this.$t('map.updateFailed'));
});
});
}).catch(() => { });
},
setWindowSize() {
this.$nextTick(() => {
const width = this.$store.state.app.width;
const height = this.$store.state.app.height - 90;
this.$store.dispatch('config/resize', { width, height });
});
},
endViewLoading(isSuccess) {
if (!isSuccess) {
this.$store.dispatch('map/mapClear');
}
this.$nextTick(() => {
EventBus.$emit('viewLoading', false);
});
},
loadInitPage() {
this.$store.dispatch('training/changeMode', { mode: TrainingMode.MAP_EDIT });
this.$store.commit('map/clearStepData'); // 清空步骤
this.mapInfo = { name: this.$t('map.pleaseSelectMap'), id: this.$route.params.mapId };
if (parseInt(this.mapInfo.id)) {
this.mapInfo.name = this.$route.query.name;
getMapDetail(this.$route.params.mapId).then(response => {
this.$store.dispatch('map/setMapData', response.data).then(() => {
this.$store.dispatch('training/setMapDefaultState');
});
this.initAutoSaveTask();
}).catch((error) => {
console.log(error, '加载地图错误提示');
this.$message.error(this.$t('tip.failedLoadMap'));
this.endViewLoading();
});
} else {
this.endViewLoading();
}
},
initAutoSaveTask() {
const timeout = 1000 * 60 * 3;
this.clearAutoSave(this.autoSaveTask);
if (this.viewDraft === 'draft') {
this.autoSaveTask = setInterval(this.saveMapEvent, timeout);
}
},
clearAutoSave() {
if (this.autoSaveTask) {
clearInterval(this.autoSaveTask);
this.autoSaveTask = null;
}
},
handleSelectControlPage (model) {
if (this.$refs.mapOperate) {
this.$refs.mapOperate.handleSelectControlPage(model);
this.$store.dispatch('menuOperation/setMapDrawSelectCount');
}
},
handleSelectPhysicalView(handle) {
if (this.$refs.jlmapVisual) {
this.$refs.jlmapVisual.setLevelVisible(handle);
}
},
clickEvent(em) {
const device = this.getDeviceByEm(em);
this.deviceHighLight(this.oldDevice, false);
this.deviceHighLight(device, true);
this.oldDevice = device;
this.onSelect(device);
},
// 获取设备数据
getDeviceByEm(em) {
var device = this.$store.getters['map/getDeviceByCode'](em.deviceCode) || null;
if (device) {
device._viewVal = em.val;
}
return device;
},
onSelect(device) {
this.selected = device || null;
this.selected && this.handleSelectControlPage(device);
},
onContextmenu(em) {
this.point = {
x: em.clientX,
y: em.clientY
};
if (!em.deviceType) {
var menu = getDeviceMenuByDeviceType('Cancel');
this.$store.dispatch('menuOperation/setPopMenu', { position: this.point, menu: menu });
}
},
verifySectionPoint(map) { // 校验区段坐标不为空
let flag = true;
map.sectionList.forEach(elem => {
if (elem.points.length > 0) {
for (let index = 0; index < elem.points.length; index++) {
if (String(elem.points[index].x) === 'undefined' || String(elem.points[index].y) === 'undefined') {
this.$message(`${elem.name}${this.$t('tip.sectionPointsDeficiency')}`);
flag = false;
}
}
} else {
this.$message(this.$t('tip.sectionPointsDeficiency'));
flag = false;
}
});
return flag;
},
checkCorrelation(section1, section2) { // 校验后者是否与前者有关联关系
return section1.leftSectionCode === section2.code || section1.rightSectionCode === section2.code;
},
saveMapEvent() { // 保存地图
const map = this.$store.state.map.map;
if (this.$refs.jlmapVisual && map && parseInt(this.$route.params.mapId)) {
this.mapSaveing = true;
this.$store.dispatch('map/saveMapDeviceDefaultRelations').then(() => { // 草稿地图关系处理
saveMap(Object.assign(map, { mapId: this.$route.params.mapId })).then(() => {
this.$message.success(this.$t('tip.saveSuccessfully'));
this.mapSaveing = false;
this.initAutoSaveTask();
}).catch(error => {
console.log(error);
this.$messageBox(this.$t('tip.saveFailed'));
this.mapSaveing = false;
if (error.code === 40004 || error.code === 40005 || error.code === 40003) {
this.clearAutoSave();
} else {
this.initAutoSaveTask();
}
});
}).catch(error => {
console.log(error, '错误提示');
this.mapSaveing = false;
this.$message(this.$t('tip.saveFailed'));
});
}
},
tableToExcel(data) {
const filterVal = ['index'];
const arr = [];
data.forEach(item => {
arr.push({ index: item });
});
const dataList = this.formatJson(filterVal, arr);
import('@/utils/Export2Excel').then(excel => { excel.export_json_to_excel([this.$t('tip.dataQuestion')], dataList, this.$t('tip.dataList')); });
},
formatJson(filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => v[j]));
},
backRoute() {
this.$router.push({ path: `/design/usermap/home` });
},
2022-07-07 16:08:04 +08:00
createPicture() { // 创建 跟新元素
this.$refs.createPicture.doShow();
},
changePicture() {
this.$refs.changePicture.doShow();
2022-07-05 09:08:12 +08:00
},
// 撤销
revocation() {
this.$store.dispatch('map/setRevocation');
},
// 恢复
recover() {
this.$store.dispatch('map/setRecover');
},
// 设置显示中心
setCenter(code) {
this.$refs.jlmapVisual.setCenter(code);
const device = this.$store.getters['map/getDeviceByCode'](code);
this.deviceHighLight(this.oldDevice, false);
this.deviceHighLight(device, true);
this.oldDevice = device;
},
createMap() {
this.$refs.mapCreate.show();
},
importf() { // 导入地图jsons数据
const loading = this.$loading({
lock: true,
text: '正在导入中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
setTimeout(() => {
const obj = this.$refs.files;
if (!obj.files) return;
const f = obj.files[0];
const reader = new FileReader();
const that = this;
reader.readAsText(f, 'utf-8');
reader.onload = function(e) {
const data = e.target.result;
postBuildMapImport(JSON.parse(data)).then(() => {
loading.close();
that.$message.success('导入成功!');
that.refresh();
loading.close();
}).catch(error => {
loading.close();
that.$message.error('导入失败' + error.message);
});
obj.value = '';
};
});
},
// 高亮设备
deviceHighLight(device, flag) {
if (device && device.instance && typeof device.instance.drawSelected === 'function' ) {
if (device._type === 'Section' && device.type === '04') {
device.relevanceSectionList.forEach(item => {
const sectionModel = this.$store.getters['map/getDeviceByCode'](item);
sectionModel && sectionModel.instance.drawSelected(flag);
});
} else if (device._type === 'Section' && device.type === '01' && device.logicSectionCodeList && device.logicSectionCodeList.length) {
device.logicSectionCodeList.forEach(item => {
const sectionModel = this.$store.getters['map/getDeviceByCode'](item);
sectionModel && sectionModel.instance.drawSelected(flag);
});
} else {
device.instance.drawSelected(flag);
}
}
2022-07-07 16:08:04 +08:00
},
2022-07-13 14:19:02 +08:00
pictureChanged(pictureName) {
2022-07-13 16:40:49 +08:00
this.pictureName = pictureName;
2022-07-13 14:19:02 +08:00
this.$refs.mapOperate.pictureChanged(pictureName);
const pictureModel = this.$store.state.map.map.pictureList.find(elem => elem.name == pictureName);
const deviceMap = pictureModel ? pictureModel.deviceMap : {};
this.$store.dispatch('map/setPictureDeviceMap', deviceMap);
const deviceList = [];
2022-07-13 16:40:49 +08:00
const mapDevice = this.$store.state.map.mapDevice;
for (const deviceCode in mapDevice) {
2022-07-13 14:19:02 +08:00
deviceList.push(deviceCode);
}
this.$jlmap.updatePicture(deviceList);
2022-07-13 17:31:10 +08:00
this.$jlmap.updateTransform(pictureModel.scaling || '1', pictureModel.origin);
2022-07-13 16:40:49 +08:00
},
deletePicture() {
if (!this.pictureName) {
this.$message.error('请先切换画面!');
return;
}
this.$confirm('您确定删除当前画面?', this.$t('tip.hint'), {
confirmButtonText: this.$t('tip.confirm'),
cancelButtonText: this.$t('tip.cancel'),
type: 'warning'
}).then(() => {
const map = this.$store.state.map.map;
this.$store.dispatch('map/saveMapDeviceDefaultRelations').then(() => {
const pictureIndex = this.$store.state.map.map.pictureList.findIndex(picture => picture.name === this.pictureName);
this.$store.state.map.map.pictureList.splice(pictureIndex, 1);
const param = {
mapId: this.$route.params.mapId
};
saveMap(Object.assign(map, param)).then(() => {
this.pictureName = '';
this.$store.dispatch('map/setPictureDeviceMap', {});
const mapDevice = this.$store.state.map.mapDevice;
const map = this.$store.state.map.map;
const deviceList = [];
for (const deviceCode in mapDevice) {
deviceList.push(deviceCode);
}
this.$jlmap.updatePicture(deviceList);
this.$jlmap.updateTransform(map.scaling || '1', map.origin);
this.$message.success('删除画面成功!');
}).catch(() => {
this.$messageBox('删除画面失败!');
});
});
}).catch(() => { });
2022-07-05 09:08:12 +08:00
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
@import "src/styles/mixin.scss";
/deep/ {
.menu-item{
background: #f1ecec;
.pop-menu {
background: #5F9EA0;
}
}
}
.mask{
opacity: 0;
background: #000;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 9;
}
.operation_box{
position: absolute;
right: 20px;
top: 15px;
z-index: 9;
&.rightShow{
right: 540px;
}
}
.back_box{
left: 10px;
display: inline-block;
width: 180px;
}
.btn_left_box{
position: absolute;
left: 0;
top: 50%;
padding: 8px 3px;
background: #fff;
z-index: 10;
transform: translateX(-22px);
cursor: pointer;
border-radius: 5px 0 0 5px;
}
.box{
height: 100%;
}
.mapPaint{
height: 100%;
overflow: hidden;
position: relative;
}
.map-view {
float: left;
width: 100%;
position: relative;
}
.map-draft {
width: 520px;
height: 100%;
position: absolute;
right: 0;
transform: translateX(520px);
transition: all 0.5s;
background: #fff;
z-index: 9;
/deep/{
.v-modal{
opacity: 0;
}
}
&.hide{
transform: translateX(0);
}
}
.uploadDemo {
position: relative;
overflow: hidden;
float: right;
padding: 3px 0;
margin-right: 3px;
cursor: pointer;
input {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
opacity: 0;
cursor: pointer;
}
}
</style>