菜单调整
This commit is contained in:
parent
a69ef7590e
commit
9ffd70de63
@ -296,7 +296,7 @@ export function modifySystemTime(data, group) {
|
||||
/** 新版地图按计划行车 */
|
||||
export function ranAsPlan(data, group) {
|
||||
return request({
|
||||
url: `/simulation/${group}/ranAsPlan`,
|
||||
url: `/simulation/new/${group}/runAsPlan`,
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
|
@ -176,10 +176,7 @@ const runPlan = {
|
||||
},
|
||||
/** 设置stations数据 */
|
||||
setStations: ({ commit }, mapModel) => {
|
||||
return new Promise((resolve) => {
|
||||
commit('setStations', mapModel);
|
||||
resolve(mapModel);
|
||||
});
|
||||
commit('setStations', mapModel);
|
||||
},
|
||||
/** 重置运行图数据更新池 */
|
||||
resetRunPlanData:({ commit }) => {
|
||||
@ -218,10 +215,7 @@ const runPlan = {
|
||||
},
|
||||
/** 清空数据*/
|
||||
clear: ({ commit }) => {
|
||||
return new Promise((resolve) => {
|
||||
commit('clear');
|
||||
resolve();
|
||||
});
|
||||
commit('clear');
|
||||
},
|
||||
draftClear: ({ commit }) => {
|
||||
return new Promise(resolve => {
|
||||
|
@ -57,7 +57,7 @@ export function handleMapData(mapData, type) {
|
||||
});
|
||||
}
|
||||
}
|
||||
export function loadRunPlanData(group, dataError) {
|
||||
export function loadRunPlanData(group) {
|
||||
if (!store.state.runPlan.runPlanInfo || !store.state.runPlan.runPlanInfo.templateId) {
|
||||
MessageBox.confirm('未获取到运行图信息!', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
@ -78,7 +78,7 @@ export function loadRunPlanData(group, dataError) {
|
||||
resp.data.version = store.state.runPlan.runPlanInfo.version;
|
||||
dbUpdateData('runPlan', resp.data);
|
||||
}).catch(error => {
|
||||
runPlanErrorHandle(error, dataError);
|
||||
runPlanErrorHandle(error);
|
||||
});
|
||||
} else {
|
||||
getEveryDayRunPlanNew(group).then(async (resp) => {
|
||||
@ -88,12 +88,12 @@ export function loadRunPlanData(group, dataError) {
|
||||
resp.data.version = store.state.runPlan.runPlanInfo.version;
|
||||
dbAddData('runPlan', resp.data);
|
||||
}).catch(error => {
|
||||
runPlanErrorHandle(error, dataError);
|
||||
runPlanErrorHandle(error);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
export function runPlanErrorHandle(error, dataError) {
|
||||
export function runPlanErrorHandle(error) {
|
||||
store.dispatch('runPlan/setPlanData', []);
|
||||
if (error.code == 30001) {
|
||||
MessageBox.confirm('今日运行图未加载', '提示', {
|
||||
@ -101,12 +101,6 @@ export function runPlanErrorHandle(error, dataError) {
|
||||
showCancelButton: false,
|
||||
type: 'warning'
|
||||
});
|
||||
} else if (!dataError) {
|
||||
MessageBox.confirm('获取运行图数据失败', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
showCancelButton: false,
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -5,29 +5,50 @@
|
||||
</transition>
|
||||
<simulation-control ref="simulationControl" />
|
||||
<simulation-menu ref="simulationMenu" :mode="mode" />
|
||||
<training-tip ref="trainingTip" />
|
||||
<training-position-tip ref="trainingPositionTip" />
|
||||
<training-menu v-if="hasTraining" ref="trainingMenu" :offset-bottom="offsetBottom" />
|
||||
<training-design v-if="trainingDesign" ref="trainingDesign" />
|
||||
<voice-chat-box v-if="hasVoice" :group="group" />
|
||||
<design-training-menu v-if="trainingDesign && trainingDetail" ref="trainingMenu" :offset-bottom="offsetBottom" />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { getSessionStorage } from '@/utils/auth';
|
||||
import { mapGetters } from 'vuex';
|
||||
import TerminalsPicture from './terminals/index';
|
||||
import SimulationMenu from './simulationMenu';
|
||||
import SimulationMenu from './simulationMenu/simulationMenu';
|
||||
import { clearSimulation, getSimulationInfoNew} from '@/api/simulation';
|
||||
import { destroySimulation, getSimulationInfoByGroup } from '@/api/rtSimulation';
|
||||
import { loadMapDataById } from '@/utils/loaddata';
|
||||
import { loadMapDataById, loadRunPlanData } from '@/utils/loaddata';
|
||||
import { getByGroupStationList } from '@/api/jmap/map';
|
||||
import { EventBus } from '@/scripts/event-bus';
|
||||
import SimulationControl from './simulationControl.vue';
|
||||
import TrainingTip from './trainingList/trainingTip';
|
||||
import TrainingPositionTip from './trainingList/trainingPositionTip.vue';
|
||||
import TrainingMenu from './trainingList/trainingMenu';
|
||||
import TrainingDesign from './trainingDesign/designPane.vue';
|
||||
import VoiceChatBox from './voiceChatBox';
|
||||
import DesignTrainingMenu from './trainingList/designTrainingMenu';
|
||||
export default {
|
||||
name: 'DisplayDraft',
|
||||
components: {
|
||||
TerminalsPicture,
|
||||
SimulationMenu,
|
||||
SimulationControl
|
||||
SimulationControl,
|
||||
TrainingTip,
|
||||
TrainingPositionTip,
|
||||
TrainingMenu,
|
||||
TrainingDesign,
|
||||
VoiceChatBox,
|
||||
DesignTrainingMenu
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
dataError: false,
|
||||
group: ''
|
||||
group: '',
|
||||
offsetBottom: 35,
|
||||
hasTraining: false,
|
||||
hasVoice: false,
|
||||
trainingDesign: false
|
||||
};
|
||||
},
|
||||
computed:{
|
||||
@ -49,6 +70,9 @@ export default {
|
||||
// 当前的所属项目
|
||||
project() {
|
||||
return getSessionStorage('project');
|
||||
},
|
||||
trainingDetail() {
|
||||
return this.$store.state.trainingNew.trainingDetail;
|
||||
}
|
||||
},
|
||||
watch:{
|
||||
@ -56,7 +80,10 @@ export default {
|
||||
this.setWindowSize();
|
||||
},
|
||||
'$store.state.training.domConfig': function(val) {
|
||||
this.$refs.simulationMenu.handleMenuShow(val);
|
||||
this.hasVoice = val.hasVoice;
|
||||
this.hasTraining = val.hasTraining;
|
||||
this.trainingDesign = val.trainingDesign;
|
||||
this.$refs.simulationMenu.handleMenuShow();
|
||||
}
|
||||
},
|
||||
async mounted() {
|
||||
@ -67,11 +94,11 @@ export default {
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
if (getSessionStorage('project') == 'wjls') {
|
||||
destroySimulation(this.group);
|
||||
} else {
|
||||
clearSimulation(this.group);
|
||||
}
|
||||
this.$store.dispatch('socket/clearTrainingOverCount');
|
||||
this.$store.dispatch('trainingNew/clearStepOverCount');
|
||||
this.$store.dispatch('trainingNew/trainingEnd');
|
||||
this.$store.dispatch('trainingNew/changeTeachMode', '');
|
||||
clearSimulation(this.group);
|
||||
},
|
||||
methods:{
|
||||
// 缩放设置
|
||||
@ -82,45 +109,32 @@ export default {
|
||||
},
|
||||
// 初始化
|
||||
initLoadData() {
|
||||
// this.$store.dispatch('training/reset');
|
||||
this.loadSimulationInfo();
|
||||
},
|
||||
// 新版地图根据仿真group获取仿真基础信息
|
||||
async loadSimulationInfo() {
|
||||
let resp;
|
||||
if (this.project == 'wjls') {
|
||||
resp = await getSimulationInfoByGroup(this.group);
|
||||
} else {
|
||||
resp = await getSimulationInfoNew(this.group);
|
||||
}
|
||||
|
||||
if (resp && resp.code == 200 && resp.data) {
|
||||
if (!resp.data.dataError) {
|
||||
this.loadMapData();
|
||||
getSimulationInfoNew(this.group).then(resp => {
|
||||
if (resp && resp.data && !resp.data.dataError) {
|
||||
this.$store.dispatch('runPlan/setRunPlanInfo', resp.data.runPlan);
|
||||
this.$store.dispatch('training/setDomConfig', resp.data.paramVO && resp.data.paramVO.domConfig ? resp.data.paramVO.domConfig : {});
|
||||
loadMapDataById(this.mapId, 'simulation');
|
||||
this.loadRunPlan();
|
||||
} else {
|
||||
this.endViewLoading();
|
||||
this.$messageBox('此地图数据正在维护中,无法运行!');
|
||||
}
|
||||
this.dataError = resp.data.dataError;
|
||||
if (resp.data.paramVO && resp.data.paramVO.domConfig) {
|
||||
this.$store.dispatch('training/setDomConfig', resp.data.paramVO.domConfig);
|
||||
}
|
||||
}
|
||||
},
|
||||
// 加载地图数据
|
||||
loadMapData() {
|
||||
if (parseInt(this.mapId)) {
|
||||
// this.$store.dispatch('training/changeOperateMode', { mode: OperateMode.NORMAL }); // 默认为正常模式
|
||||
console.log('==========');
|
||||
loadMapDataById(this.mapId, 'simulation');
|
||||
} else {
|
||||
}).catch(e => {
|
||||
console.error(e);
|
||||
this.$store.dispatch('app/animationsClose');
|
||||
this.endViewLoading();
|
||||
}
|
||||
this.$message.error('获取仿真信息失败!');
|
||||
});
|
||||
},
|
||||
loadRunPlan() {
|
||||
this.$store.dispatch('runPlan/clear');
|
||||
getByGroupStationList(this.group).then(resp => {
|
||||
this.$store.dispatch('runPlan/setStations', resp.data);
|
||||
loadRunPlanData(this.group);
|
||||
});
|
||||
},
|
||||
// 结束加载状态
|
||||
endViewLoading(isSuccess) {
|
||||
// if (!isSuccess) {
|
||||
// this.$store.dispatch('map/mapClear');
|
||||
// }
|
||||
endViewLoading() {
|
||||
this.$nextTick(() => {
|
||||
EventBus.$emit('viewLoading', false);
|
||||
});
|
||||
|
@ -23,7 +23,6 @@
|
||||
default-expand-all
|
||||
style="margin: 10px;margin-bottom: 0;border: 1px solid #ccc;overflow-y: auto;height: calc(100% - 120px);"
|
||||
:filter-node-method="filterNode"
|
||||
@node-click="handleNodeClick"
|
||||
>
|
||||
<span :id="data.id" slot-scope="{ data }" class="custom-tree-node">
|
||||
<span>{{ data.labelName }}</span>
|
||||
@ -360,13 +359,6 @@ export default {
|
||||
this.checkRoleChange(list);
|
||||
}
|
||||
}
|
||||
// '$store.state.socket.simulationRoleList':function(val) {
|
||||
// if (val && val.length) {
|
||||
// this.handlerMemberOnOff(val);
|
||||
// }
|
||||
// }
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
methods: {
|
||||
doShow() {
|
||||
@ -385,12 +377,6 @@ export default {
|
||||
messageInfo(info) {
|
||||
this.$message({ showClose: true, ...info });
|
||||
},
|
||||
jumpInSimulation() {
|
||||
},
|
||||
clearSubscribe() {
|
||||
},
|
||||
handleNodeClick() {
|
||||
},
|
||||
nodeMemberChange(val, nodeData) {
|
||||
let user = '';
|
||||
this.simulationUserList.forEach(item => {
|
||||
@ -428,21 +414,14 @@ export default {
|
||||
const item = each.body;
|
||||
if (item.messageType === 'PLAY_CHANGE' && item.userId == this.userId) {
|
||||
const userRole = item.type || 'AUDIENCE';
|
||||
// this.userRole = item.type || 'AUDIENCE';
|
||||
this.$store.dispatch('training/setRoleDeviceCode', item.deviceCode);
|
||||
this.$store.dispatch('training/setMyMemberId', item.memberId);
|
||||
this.$store.dispatch('training/setUserRole', userRole);
|
||||
this.$store.dispatch('training/setRoles', userRole);
|
||||
// this.deviceCode = item.deviceCode;
|
||||
// this.setSimulationPrdType(this.centralizedStationMap[item.deviceCode]);
|
||||
this.$store.dispatch('training/updateMemberAndUser', { simulationUserList: [item], userId: this.userId });
|
||||
}
|
||||
});
|
||||
}
|
||||
// handlerMemberOnOff(data) {
|
||||
// this.$store.dispatch('training/updateMemberAndUser', { simulationUserList: data, userId: this.userId });
|
||||
// }
|
||||
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
@ -65,10 +65,10 @@ import {getPublishTrainingDetail, loadPublishTraining} from '@/api/jmap/training
|
||||
import { getPostByProjectCode } from '@/api/learn';
|
||||
import { getSessionStorage } from '@/utils/auth';
|
||||
import { ProjectCode } from '@/scripts/ProjectConfig';
|
||||
import ContectUs from './contectUs';
|
||||
import ContectUs from './simulationMenu/contectUs';
|
||||
import ModifyTime from './modifyTime';
|
||||
import FlowData from './flowData';
|
||||
import SetTime from './setTime';
|
||||
import FlowData from './simulationMenu/flowData';
|
||||
import SetTime from './simulationMenu/setTime';
|
||||
import Jl3dDevice from '@/views/jlmap3d/device/jl3ddevice';
|
||||
import { clearSimulation, ranAsPlan, exitRunPlan } from '@/api/simulation';
|
||||
import { getToken } from '@/utils/auth';
|
||||
|
@ -10,11 +10,6 @@
|
||||
<div class="eachInfo"><span class="el-icon-mobile-phone" style="font-size:15px;margin-right:7px;" />电 话:4000500081</div>
|
||||
<div class="eachInfo"><span class="el-icon-message" style="font-size:15px;margin-right:7px;" />邮 箱:zhrc@richortech.com</div>
|
||||
<div class="eachInfo"><span class="el-icon-connection" style="font-size:15px;margin-right:7px;" />网 址:www.richortech.com</div>
|
||||
<!-- <div class="eachInfo">
|
||||
<span class="el-icon-chat-round" style="font-size:15px;margin-right:3px;vertical-align:top;" />
|
||||
<span style="vertical-align: top;">微 信:</span>
|
||||
<img :src="wchatImg" width="80" height="80">
|
||||
</div> -->
|
||||
</div>
|
||||
<div v-else>
|
||||
<div><span class="el-icon-user" style="font-size:15px;margin-right:8px;" />联系人:许经理</div>
|
198
src/views/newMap/display/simulationMenu/deviceManage.vue
Normal file
198
src/views/newMap/display/simulationMenu/deviceManage.vue
Normal file
@ -0,0 +1,198 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-drawer
|
||||
title="设备管理"
|
||||
:visible.sync="show"
|
||||
direction="ltr"
|
||||
:before-close="doClose"
|
||||
custom-class="dialog_box"
|
||||
size="43%"
|
||||
>
|
||||
<div style="margin-bottom: 3px; overflow: hidden; padding: 0 10px;">
|
||||
<div class="plc_box">名称: {{ plcInfo.name }}</div>
|
||||
<div class="plc_box">状态: <span :style="{'color': plcInfo.status ? 'green' : 'red'}">{{ plcInfo.status ? '在线' : '不在线' }}</span></div>
|
||||
<el-button type="text" size="small" class="freshen_box" @click="getList">刷新</el-button>
|
||||
</div>
|
||||
<el-table :data="tableData" border style="width: 100%; max-height: calc(100% - 24px); overflow: auto;">
|
||||
<el-table-column prop="code" label="设备编号" width="180" />
|
||||
<el-table-column prop="typeName" label="设备类型" width="180" />
|
||||
<el-table-column prop="vrDeviceCode" label="连接设备编码">
|
||||
<template slot-scope="scope">
|
||||
<div v-if="scope.row.vrDeviceCode" class="flex_box">{{ scope.row.vrDeviceName }}</div>
|
||||
<div v-if="!scope.row.vrDeviceCode" class="flex_box">(空)</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<template slot-scope="scope">
|
||||
<el-button :type="scope.row.buttonShowType ? 'danger' : 'primary'" size="small" @click="handleClick(scope.row, scope.$index)">连接</el-button>
|
||||
<el-button size="small" @click="cancel(scope.row, scope.$index)">断开</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-drawer>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getAllSimulationList, postSimulationConnectById, putSimulationDisconnectById } from '@/api/simulation.js';
|
||||
import ConstConfig from '@/scripts/ConstConfig';
|
||||
import { EventBus } from '@/scripts/event-bus';
|
||||
import { getSessionStorage } from '@/utils/auth';
|
||||
|
||||
export default {
|
||||
name: 'DeviceManage',
|
||||
data() {
|
||||
return {
|
||||
show: false,
|
||||
group: '',
|
||||
tableData: [],
|
||||
typeList: ConstConfig.ConstSelect.projectDeviceTypeList,
|
||||
plcInfo: {
|
||||
name: '',
|
||||
status: ''
|
||||
},
|
||||
index: 0,
|
||||
selected: {},
|
||||
typeObj: {
|
||||
Section: '区段',
|
||||
Signal: '信号机',
|
||||
Switch: '道岔',
|
||||
Psd: '屏蔽门',
|
||||
StationStand: '站台'
|
||||
}
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
project() {
|
||||
return getSessionStorage('project');
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
EventBus.$on('selectDevice', (data) => {
|
||||
this.selected = data;
|
||||
this.tableData[this.index]['buttonShowType'] = false;
|
||||
this.tableData.splice(this.index, 1, this.tableData[this.index]);
|
||||
this.$store.dispatch('map/selectDeviceCode', {flag: false, type: ''});
|
||||
this.connect(this.tableData[this.index]);
|
||||
});
|
||||
},
|
||||
beforeDestroy() {
|
||||
EventBus.$off('selectDevice');
|
||||
},
|
||||
methods: {
|
||||
doShow() {
|
||||
this.show = true;
|
||||
this.group = this.$route.query.group;
|
||||
this.getList();
|
||||
},
|
||||
async getList() {
|
||||
try {
|
||||
const res = await getAllSimulationList(this.group);
|
||||
this.tableData = [];
|
||||
res.data.forEach((item, index) => {
|
||||
if (item.type == 'PLC_GATEWAY') {
|
||||
this.plcInfo = {
|
||||
name: 'PLC网关',
|
||||
status: item.online
|
||||
};
|
||||
} else {
|
||||
item.buttonShowType = false;
|
||||
item.typeName = this.typeList.find(el => el.value == item.type).label;
|
||||
if (item.vrDeviceCode && this.$store.getters['map/getDeviceByCode'](item.vrDeviceCode)) {
|
||||
item.vrDeviceName = this.$store.getters['map/getDeviceByCode'](item.vrDeviceCode).name;
|
||||
} else {
|
||||
item.vrDeviceName = item.vrDeviceCode;
|
||||
}
|
||||
if (this.project == 'heb' || this.project == 'designheb') {
|
||||
if (item.type == 'SWITCH') {
|
||||
this.tableData.push(item);
|
||||
}
|
||||
} else {
|
||||
this.tableData.push(item);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
},
|
||||
doClose() {
|
||||
this.show = false;
|
||||
},
|
||||
handleClick(row, index) {
|
||||
row.buttonShowType = !row.buttonShowType;
|
||||
this.index = index;
|
||||
this.tableData.splice(index, 1, row);
|
||||
this.$store.dispatch('map/selectDeviceCode', {flag: row.buttonShowType, type: row.type});
|
||||
},
|
||||
connect(row) {
|
||||
this.$confirm(`您确定连接${this.typeObj[this.selected._type] || '设备'}: ${this.selected.name}, 是否继续?`, '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
try {
|
||||
const res = await postSimulationConnectById(this.group, row.id, this.selected.code);
|
||||
if (res && res.code == 200) {
|
||||
this.$message.success('连接成功!');
|
||||
this.tableData[this.index]['vrDeviceCode'] = this.selected.code;
|
||||
this.tableData[this.index]['vrDeviceName'] = this.selected.name;
|
||||
this.tableData.splice(this.index, 1, this.tableData[this.index]);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
});
|
||||
},
|
||||
cancel(row, index) {
|
||||
this.$confirm('您确定将次设备断开, 是否继续?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
if (row.vrDeviceCode) {
|
||||
row.vrDeviceCode = '';
|
||||
row.vrDeviceName = '';
|
||||
this.tableData.splice(index, 1, row);
|
||||
try {
|
||||
const res = await putSimulationDisconnectById(this.group, row.id);
|
||||
if (res && res.code == 200) {
|
||||
this.$message.success('断开成功!');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style rel="stylesheet/scss" lang="scss" scoped>
|
||||
.plc_box{
|
||||
float: left;
|
||||
margin-right: 40px;
|
||||
padding: 9px;
|
||||
}
|
||||
.freshen_box{
|
||||
float: right;
|
||||
}
|
||||
.flex_box{
|
||||
float: left;
|
||||
margin-right: 5px;
|
||||
line-height: 30px;
|
||||
}
|
||||
/deep/ {
|
||||
.el-dialog__wrapper{
|
||||
width: 800px;
|
||||
}
|
||||
.dialog_box{
|
||||
height: 100%;
|
||||
}
|
||||
.el-dialog__body{
|
||||
padding-top: 6px;
|
||||
height: calc(100% - 54px);
|
||||
}
|
||||
}
|
||||
</style>
|
79
src/views/newMap/display/simulationMenu/diagramLoad.vue
Normal file
79
src/views/newMap/display/simulationMenu/diagramLoad.vue
Normal file
@ -0,0 +1,79 @@
|
||||
<template>
|
||||
<div v-show="show" class="run-plan-dialog" :style="{width: width + 'px',height:height + 'px'}">
|
||||
<plan-schedule ref="planSchedule" :group="group" @back="doClose" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import PlanSchedule from '@/views/planSchedule/index';
|
||||
import { getSimulationInfoNew } from '@/api/simulation';
|
||||
import { loadRunPlanData } from '@/utils/loaddata';
|
||||
// 运行图加载
|
||||
export default {
|
||||
name: 'DiagramLoad',
|
||||
components: {
|
||||
PlanSchedule
|
||||
},
|
||||
props: {
|
||||
group: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
menus: null,
|
||||
show: false
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
title() {
|
||||
return this.$t('display.runPlan.runDiagramPlanTool');
|
||||
},
|
||||
width() {
|
||||
return this.$store.state.app.width > 1920 ? 1920 : this.$store.state.app.width;
|
||||
},
|
||||
height() {
|
||||
return this.$store.state.app.height > 1080 ? 1080 : this.$store.state.app.height;
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'$store.state.socket.runPlanReloadCount': function (val) {
|
||||
getSimulationInfoNew(this.group).then(res => {
|
||||
this.$store.dispatch('runPlan/setRunPlanInfo', res.data.runPlan);
|
||||
loadRunPlanData(this.group);
|
||||
});
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.$store.dispatch('runPlan/setPlanData', []);
|
||||
},
|
||||
mounted() {
|
||||
// this.menus = this.$theme.loadPlanComponent(this.$route.query.lineCode);
|
||||
},
|
||||
methods: {
|
||||
doShow() {
|
||||
this.show = true;
|
||||
this.$refs.planSchedule.setPosition();
|
||||
},
|
||||
doClose() {
|
||||
this.show = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style rel="stylesheet/scss" lang="scss" scoped>
|
||||
@import "src/styles/mixin.scss";
|
||||
|
||||
.run-plan-dialog {
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
position: absolute;
|
||||
z-index: 38;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
background: white;
|
||||
}
|
||||
</style>
|
651
src/views/newMap/display/simulationMenu/diagramPreview.vue
Normal file
651
src/views/newMap/display/simulationMenu/diagramPreview.vue
Normal file
@ -0,0 +1,651 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
v-dialogLoading="dialogLoading"
|
||||
:title="title"
|
||||
:width="maxWidth + 'px'"
|
||||
top="0"
|
||||
:style="{left:$store.state.app.width> 1920? '50%': '0'}"
|
||||
:visible.sync="dialogShow"
|
||||
:before-close="doClose"
|
||||
:close-on-click-modal="false"
|
||||
:modal="false"
|
||||
>
|
||||
<div id="PlanSchedule" :style="{top: top+'px', height: height+'px'}">
|
||||
<div class="left">
|
||||
<div :id="runPlanId" />
|
||||
</div>
|
||||
<div class="right">
|
||||
<data-table
|
||||
ref="serviceTable1"
|
||||
:height="height/2"
|
||||
:config="serviceNumberConfig"
|
||||
:style="{top: top-height/2+'px'}"
|
||||
@touch="scheduleTouch"
|
||||
/>
|
||||
<data-table
|
||||
ref="tripTable1"
|
||||
:height="height/2"
|
||||
:config="tripNumberConfig"
|
||||
:style="{top: top-height/2+'px'}"
|
||||
@touch="trainNumTouch"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapGetters } from 'vuex';
|
||||
import { timeFormat } from '@/utils/date';
|
||||
import DataTable from '@/views/planSchedule/menusPlan/components/dataTable';
|
||||
import echarts from 'echarts';
|
||||
import {toTimeStamp, formatDuring} from '@/utils/date';
|
||||
import { deepAssign } from '@/utils/index';
|
||||
import { EventBus } from '@/scripts/event-bus';
|
||||
let myChart = null;
|
||||
export default {
|
||||
name: 'DiagramPreview',
|
||||
components: {
|
||||
DataTable
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
top: 0,
|
||||
height: 0,
|
||||
inter:null,
|
||||
runPlanId: 'run-plan-view',
|
||||
// myChart: null,
|
||||
PlanParser: {},
|
||||
serviceNumberConfig: {
|
||||
data: [],
|
||||
highlightCurrentRow: true,
|
||||
handleChange: this.serviceNumberChange,
|
||||
showClose: false,
|
||||
columns: [
|
||||
{
|
||||
prop: 'serviceNumber',
|
||||
label: '表号'
|
||||
},
|
||||
{
|
||||
width: 40
|
||||
}
|
||||
]
|
||||
},
|
||||
tripNumberConfig: {
|
||||
data: [],
|
||||
highlightCurrentRow: true,
|
||||
handleChange: this.tripNumberChange,
|
||||
showClose: false,
|
||||
columns: [
|
||||
{
|
||||
prop: 'tripNumber',
|
||||
label: '车次号'
|
||||
},
|
||||
{
|
||||
width: 40
|
||||
}
|
||||
]
|
||||
},
|
||||
realData: {},
|
||||
kmRangeMap: {},
|
||||
absoluteTime: 2 * 3600,
|
||||
indexKmRangeMap: {},
|
||||
dialogLoading: false,
|
||||
dialogShow: false,
|
||||
seriesMap: {},
|
||||
staticSeries: [],
|
||||
runSeries: [],
|
||||
selectSeries: [],
|
||||
runPlanData: {}
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapGetters('runPlan', [
|
||||
'stations'
|
||||
]),
|
||||
maxWidth() {
|
||||
return this.$store.state.app.width > 1920 ? 1920 : this.$store.state.app.width;
|
||||
},
|
||||
maxHeight() {
|
||||
return this.$store.state.app.height > 1080 ? 1080 : this.$store.state.app.height;
|
||||
},
|
||||
title() {
|
||||
return this.$t('display.runPlan.previewRunDiagram');
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
maxWidth() {
|
||||
this.setPosition();
|
||||
},
|
||||
maxHeight() {
|
||||
this.setPosition();
|
||||
},
|
||||
'$store.state.runPlan.planLoadedCount': async function () {
|
||||
try {
|
||||
await this.loadChartPage();
|
||||
this.selectSeries = []; this.runSeries = []; this.runPlanData = {};
|
||||
if (this.dialogShow) {
|
||||
await this.loadInitData();
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
'$store.state.socket.simulationReset': function (val) {
|
||||
this.selectSeries = []; this.runSeries = []; this.runPlanData = {};
|
||||
if (this.dialogShow) {
|
||||
this.loadInitData();
|
||||
}
|
||||
},
|
||||
'$store.state.runPlan.planSizeCount': function () {
|
||||
this.reSize({ width: this.$store.state.runPlan.width, height: this.$store.state.runPlan.height });
|
||||
},
|
||||
'$store.state.socket.trainStationList': function (val) {
|
||||
if (val.length) {
|
||||
this.updateRunPlanData(val);
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.staticSeries = []; this.selectSeries = []; this.runSeries = []; this.runPlanData = {};
|
||||
this.PlanParser = this.$theme.loadPlanParser(this.$route.query.lineCode);
|
||||
// this.loadChartPage();
|
||||
EventBus.$on('clearRunSeries', () => {
|
||||
this.runSeries = [];
|
||||
});
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.$store.dispatch('runPlan/setSelected', null);
|
||||
this.destroy();
|
||||
},
|
||||
methods: {
|
||||
doShow() {
|
||||
try {
|
||||
this.dialogLoading = true;
|
||||
this.dialogShow = true;
|
||||
this.setPosition();
|
||||
this.loadInitData();
|
||||
this.inter && clearInterval(this.inter);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
} finally {
|
||||
this.dialogLoading = false;
|
||||
}
|
||||
},
|
||||
async doClose() {
|
||||
this.dialogShow = false;
|
||||
this.inter && clearInterval(this.inter);
|
||||
},
|
||||
serviceNumberChange(row) {
|
||||
if (row) {
|
||||
this.$store.dispatch('runPlan/setSelected', { serviceNumber: row.serviceNumber, tripNumber: null });
|
||||
this.renderTripNumber({ serviceNumber: row.serviceNumber, tripNumber: null });
|
||||
const serviceObj = this.$store.state.runPlan.editData[row.serviceNumber];
|
||||
if (serviceObj) {
|
||||
this.analyticalTripNumber(serviceObj.trainMap);
|
||||
}
|
||||
}
|
||||
},
|
||||
tripNumberChange(row) {
|
||||
if (row) {
|
||||
this.$store.dispatch('runPlan/setSelected', { serviceNumber: this.$store.state.runPlan.selected.serviceNumber, tripNumber: row.tripNumber });
|
||||
this.renderTripNumber({ serviceNumber: this.$store.state.runPlan.selected.serviceNumber, tripNumber: row.tripNumber });
|
||||
}
|
||||
},
|
||||
async analyticalServiceNumber(data) {
|
||||
this.serviceNumberConfig.data = Object.keys(data || {})
|
||||
.sort((a, b) => { return parseInt(data[a].serviceNumber) - parseInt(data[b].serviceNumber); })
|
||||
.map(serviceNumber => { return { serviceNumber }; });
|
||||
},
|
||||
async analyticalTripNumber(data) {
|
||||
this.tripNumberConfig.data = Object.keys(data || {})
|
||||
.sort((a, b) => { return data[a].tripNumber - data[b].tripNumber; })
|
||||
.map(tripNumber => { return { tripNumber }; });
|
||||
},
|
||||
async setPosition() {
|
||||
this.$nextTick(() => {
|
||||
const top = 54;
|
||||
const width = this.maxWidth * 0.85;
|
||||
let height = this.maxHeight;
|
||||
|
||||
height = height - top;
|
||||
this.$store.dispatch('runPlan/resize', { width, height });
|
||||
|
||||
if (this.top != top) {
|
||||
this.top = top;
|
||||
}
|
||||
|
||||
if (this.height != height) {
|
||||
this.height = height - top;
|
||||
}
|
||||
});
|
||||
},
|
||||
updateRunPlanData(data) {
|
||||
const stations = this.$store.state.runPlan.stations;
|
||||
data.forEach(item => {
|
||||
item.secondTime = item.second;
|
||||
});
|
||||
this.kmRangeMap = this.PlanParser.convertStationsToMap(stations);
|
||||
this.runSeries = this.PlanParser.updateDataToModels(data, stations, this.kmRangeMap,
|
||||
this.runPlanData, this.runSeries, { color: '#FF00DE', width: 2 }
|
||||
);
|
||||
const series = [...this.staticSeries, ...this.runSeries, ... this.selectSeries];
|
||||
myChart && myChart.setOption({series: series});
|
||||
},
|
||||
async loadChartPage() {
|
||||
try {
|
||||
this.seriesMap = {};
|
||||
this.staticSeries = [];
|
||||
const stations = this.$store.state.runPlan.stations;
|
||||
const planData = this.$store.state.runPlan.planData;
|
||||
this.kmRangeMap = this.PlanParser.convertStationsToMap(stations);
|
||||
if (this.$route.query.lineCode === '07') {
|
||||
this.pushModels(this.staticSeries, [this.PlanParser.initializeAxisX(stations)]);
|
||||
} else {
|
||||
this.pushModels(this.staticSeries, [this.PlanParser.initializeAxisY(stations)]);
|
||||
}
|
||||
this.staticSeries = this.pushModels(this.staticSeries, this.PlanParser.convertDataToModels(planData, stations, this.kmRangeMap, { color: '#000', width: 0.5 }));
|
||||
this.staticSeries.forEach(item => {
|
||||
this.seriesMap[item.name] = item;
|
||||
});
|
||||
await this.analyticalServiceNumber(this.$store.state.runPlan.editData);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
this.$messageBox(`加载运行图数据失败`);
|
||||
}
|
||||
},
|
||||
|
||||
async loadInitData() {
|
||||
myChart && myChart.showLoading();
|
||||
const option = {
|
||||
tooltip: {
|
||||
axisPointer: {
|
||||
trigger: 'item',
|
||||
type: 'cross'
|
||||
},
|
||||
formatter: this.axisTooltip,
|
||||
borderWidth: 1
|
||||
},
|
||||
grid: {
|
||||
right: '40px',
|
||||
left: '120px',
|
||||
height: '85%'
|
||||
},
|
||||
xAxis: [
|
||||
{
|
||||
type: 'category',
|
||||
data: [],
|
||||
axisLine: {
|
||||
onZero: false,
|
||||
lineStyle: {
|
||||
width: 2,
|
||||
color: '#d14a61'
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
formatter: this.xAxisLableFormat,
|
||||
textStyle: {
|
||||
color: '#333'
|
||||
}
|
||||
},
|
||||
axisPointer: {
|
||||
snap: true,
|
||||
label: {
|
||||
formatter: this.xAxisPointFormat,
|
||||
backgroundColor: 'rgb(255,0,0,0.5)',
|
||||
color: 'white'
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
yAxis: [
|
||||
{
|
||||
type: 'value',
|
||||
yAxisIndex: 0,
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLine: {
|
||||
onZero: false,
|
||||
lineStyle: {
|
||||
width: 2,
|
||||
color: '#d14a61'
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
interval: 'auto',
|
||||
formatter: this.yAxisLableFormat
|
||||
},
|
||||
axisPointer: {
|
||||
xAxisIndex: 'all',
|
||||
label: {
|
||||
formatter: this.yAxisPointFormat,
|
||||
backgroundColor: 'rgb(0,100,0,0.5)',
|
||||
color: 'white'
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
dataZoom: [{
|
||||
type: 'inside'
|
||||
},
|
||||
{
|
||||
fiterMode: 'filter',
|
||||
handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
|
||||
handleSize: '80%',
|
||||
handleStyle: {
|
||||
color: '#fff',
|
||||
shadowBlur: 3,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.6)',
|
||||
shadowOffsetX: 2,
|
||||
shadowOffsetY: 2
|
||||
},
|
||||
bottom: '20px'
|
||||
}],
|
||||
series: [
|
||||
|
||||
]
|
||||
};
|
||||
const hebXAxis = {
|
||||
type: 'value',
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLine: {
|
||||
onZero: false,
|
||||
lineStyle: {
|
||||
width: 2,
|
||||
color: '#d14a61'
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
interval: 'auto',
|
||||
formatter: this.yAxisLableFormat
|
||||
},
|
||||
axisPointer: {
|
||||
xAxisIndex: 'all',
|
||||
label: {
|
||||
formatter: this.yAxisPointFormat,
|
||||
backgroundColor: 'rgb(0,100,0,0.5)',
|
||||
color: 'white'
|
||||
}
|
||||
},
|
||||
min: 0,
|
||||
max: 0
|
||||
};
|
||||
const hebYAxis = [
|
||||
{
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: [],
|
||||
axisLine: {
|
||||
onZero: false,
|
||||
lineStyle: {
|
||||
width: 2,
|
||||
color: '#d14a61'
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
formatter: this.xAxisLableFormat,
|
||||
textStyle: {
|
||||
color: '#333'
|
||||
}
|
||||
},
|
||||
axisPointer: {
|
||||
snap: true,
|
||||
label: {
|
||||
formatter: this.xAxisPointFormat,
|
||||
backgroundColor: 'rgb(255,0,0,0.5)',
|
||||
color: 'white'
|
||||
}
|
||||
}
|
||||
}
|
||||
];
|
||||
const hebDataZoom = [
|
||||
{
|
||||
type: 'inside',
|
||||
yAxisIndex: 0
|
||||
},
|
||||
{
|
||||
fiterMode: 'filter',
|
||||
handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
|
||||
handleSize: '80%',
|
||||
yAxisIndex: 0,
|
||||
handleStyle: {
|
||||
color: '#fff',
|
||||
shadowBlur: 3,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.6)',
|
||||
shadowOffsetX: 2,
|
||||
shadowOffsetY: 2
|
||||
},
|
||||
left: '20px'
|
||||
}
|
||||
];
|
||||
if (this.$route.query.lineCode === '07') {
|
||||
option.xAxis = hebXAxis;
|
||||
option.yAxis = hebYAxis;
|
||||
option.dataZoom = hebDataZoom;
|
||||
}
|
||||
await this.xAxisInit(option);
|
||||
await this.yAxisInit(option);
|
||||
await this.loadInitChart(option);
|
||||
myChart && myChart.hideLoading();
|
||||
},
|
||||
pushModels(series, models) {
|
||||
if (models && models.length) {
|
||||
models.forEach(elem => {
|
||||
if (elem) {
|
||||
series.push(elem);
|
||||
}
|
||||
});
|
||||
}
|
||||
return series;
|
||||
},
|
||||
loadInitChart(option) {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
this.destroy();
|
||||
let startValue = 3600 + this.PlanParser.getTranslation();
|
||||
const offsetTime = 3600;
|
||||
const initTime = toTimeStamp(formatDuring(this.$store.state.training.initTime));
|
||||
startValue = initTime - this.PlanParser.getTranslation();
|
||||
option.dataZoom[0].startValue = option.dataZoom[1].startValue = startValue - offsetTime;
|
||||
option.dataZoom[0].endValue = option.dataZoom[1].endValue = startValue + offsetTime;
|
||||
option.series = [...this.staticSeries, ...this.runSeries, ...this.selectSeries];
|
||||
myChart = echarts.init(document.getElementById(this.runPlanId));
|
||||
if (myChart) {
|
||||
myChart.setOption(option);
|
||||
this.reSize({ width: this.$store.state.runPlan.width, height: this.$store.state.runPlan.height });
|
||||
myChart.on('click', this.mouseClick);
|
||||
}
|
||||
resolve(true);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
},
|
||||
xAxisPointFormat(params) {
|
||||
return timeFormat(params.value);
|
||||
},
|
||||
yAxisPointFormat(params) {
|
||||
return this.PlanParser.computedFormatAxisY(this.stations, params);
|
||||
},
|
||||
xAxisLableFormat(value, index) {
|
||||
return timeFormat(value);
|
||||
},
|
||||
yAxisLableFormat(value, index) {
|
||||
return '';
|
||||
},
|
||||
xAxisInit(option) {
|
||||
const list = [];
|
||||
for (var time = 0 + this.PlanParser.getTranslation(); time < 3600 * 24 + this.PlanParser.getTranslation(); time++) {
|
||||
list.push(time);
|
||||
}
|
||||
const startValue = 3600 * 6;
|
||||
const offsetTime = 3600 * 1;
|
||||
|
||||
if (this.$route.query.lineCode === '07') {
|
||||
option.yAxis[0].data = list;
|
||||
} else {
|
||||
option.xAxis[0].data = list;
|
||||
}
|
||||
if (!option.dataZoom[0].startValue) {
|
||||
option.dataZoom[0].startValue = option.dataZoom[1].startValue = startValue - offsetTime;
|
||||
}
|
||||
|
||||
if (!option.dataZoom[0].endValue) {
|
||||
option.dataZoom[0].endValue = option.dataZoom[1].endValue = startValue + offsetTime;
|
||||
}
|
||||
},
|
||||
yAxisInit(option) {
|
||||
if (Object.keys(this.PlanParser).length && this.$route.query.lineCode !== '07') {
|
||||
option.yAxis.min = this.PlanParser.computedAxisYMinValue(this.stations);
|
||||
option.yAxis.max = this.PlanParser.computedAxisYMaxValue(this.stations);
|
||||
} else if (Object.keys(this.PlanParser).length && this.$route.query.lineCode === '07') {
|
||||
option.xAxis.min = this.PlanParser.computedAxisXMinValue(this.stations);
|
||||
option.xAxis.max = this.PlanParser.computedAxisXMaxValue(this.stations);
|
||||
}
|
||||
},
|
||||
axisTooltip(param) {
|
||||
const station = (this.$store.getters['map/getDeviceByCode'](param.data[2])) || { name: '', kmRange: '' };
|
||||
if (this.$route.query.lineCode !== '07') {
|
||||
if (station.name) {
|
||||
return [
|
||||
`Point Data <hr size=1 style=" margin: 3px 0">`,
|
||||
`车站名称: ${station.name}<br>`,
|
||||
`车站公里标: ${station.kmRange} km <br>`,
|
||||
`到站时间: ${timeFormat(param.data[0] + this.PlanParser.getTranslation())} (${param.data[0]})<br>`
|
||||
].join('');
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
} else {
|
||||
|
||||
return [
|
||||
`Point Data <hr size=1 style=" margin: 3px 0">`,
|
||||
`车站名称: ${station.name}<br>`,
|
||||
`车站公里标: ${station.kmRange} km <br>`,
|
||||
`到站时间: ${timeFormat(param.data[1] + this.PlanParser.getTranslation())} (${param.data[1]})<br>`
|
||||
].join('');
|
||||
}
|
||||
|
||||
},
|
||||
renderTripNumber(params) {
|
||||
const tripNumber = params.tripNumber; // 车次号
|
||||
const serviceNumber = params.serviceNumber; // 服务号
|
||||
let data, markPoint;
|
||||
if (tripNumber && this.seriesMap[serviceNumber]) {
|
||||
const temp = this.seriesMap[serviceNumber].data.filter(elem => elem[3] == tripNumber);
|
||||
if (temp.length) {
|
||||
data = temp;
|
||||
this.seriesMap[serviceNumber].markPoint.data.forEach(each=> {
|
||||
if (each.name == temp[0][4]) {
|
||||
markPoint = deepAssign({}, {data:[each]});
|
||||
markPoint.symbol = 'roundRect';
|
||||
markPoint.symbolSize = 1;
|
||||
markPoint.data[0].label.color = '#f00';
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (this.seriesMap[serviceNumber]) {
|
||||
markPoint = deepAssign({}, this.seriesMap[serviceNumber].markPoint);
|
||||
markPoint.data.forEach((each, index) => {
|
||||
if (each.symbol == 'circle') {
|
||||
markPoint.data.splice(index, 1);
|
||||
} else {
|
||||
each.label.color = '#f00';
|
||||
}
|
||||
});
|
||||
data = this.seriesMap[serviceNumber].data;
|
||||
}
|
||||
this.selectSeries = [{
|
||||
name: 'trainLabel',
|
||||
lineStyle: {
|
||||
color: '#f00',
|
||||
width: 2,
|
||||
type: 'solid'
|
||||
},
|
||||
z: 10,
|
||||
type: 'line',
|
||||
markPoint:markPoint,
|
||||
animation: false,
|
||||
data: data
|
||||
}];
|
||||
const series = [...this.staticSeries, ...this.runSeries, ...this.selectSeries];
|
||||
myChart && myChart.setOption({series: series});
|
||||
},
|
||||
mouseClick(params) {
|
||||
const model = {
|
||||
serviceNumber: params.seriesName
|
||||
};
|
||||
this.$store.dispatch('runPlan/setSelected', model);
|
||||
},
|
||||
reSize(opt) {
|
||||
if (myChart) {
|
||||
myChart.resize({
|
||||
width: opt.width,
|
||||
height: opt.height,
|
||||
silent: false
|
||||
});
|
||||
}
|
||||
},
|
||||
destroy() {
|
||||
if (myChart && myChart.isDisposed) {
|
||||
myChart.dispose();
|
||||
myChart = null;
|
||||
}
|
||||
},
|
||||
scheduleTouch() {
|
||||
|
||||
},
|
||||
trainNumTouch() {
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style scoped rel="stylesheet/scss" lang="scss">
|
||||
@import "src/styles/mixin.scss";
|
||||
|
||||
#PlanSchedule {
|
||||
z-index: 5;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
|
||||
.left {
|
||||
height: 100%;
|
||||
width: 85%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.right {
|
||||
height: 100%;
|
||||
width: 15%;
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
/deep/ {
|
||||
.el-dialog {
|
||||
height: 100%;
|
||||
max-height: 1080px;
|
||||
}
|
||||
.el-dialog__body {
|
||||
padding: 0px !important;
|
||||
background-color: floralwhite !important;
|
||||
}
|
||||
.el-dialog__headerbtn .el-dialog__close {
|
||||
font-size: 18px;
|
||||
border: 1px solid #909399;
|
||||
border-radius: 5px;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -29,10 +29,8 @@
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script>
|
||||
// clearSimulation, getSimulationInfoNew, ranAsPlan, exitRunPlan, ,
|
||||
import { getPassengerFlowData, changePassengerFlowData } from '@/api/simulation';
|
||||
import { getToken } from '@/utils/auth';
|
||||
// displayTopic,
|
||||
import { creatSubscribe, clearSubscribe, LPFTopic} from '@/utils/stomp';
|
||||
import { defaultCallback } from '@/utils/subscribeCallback';
|
||||
export default {
|
@ -4,138 +4,82 @@
|
||||
<div class="simulationMenu" @click="showMenuList">菜单</div>
|
||||
<div v-show="isShowMenuList" class="simulationMenuList">
|
||||
<div v-for="(each, index) in allMenuList" :key="index">
|
||||
<div v-if="each.show" class="eachSimulationMenu" @click="each.click">{{ each.label }}</div>
|
||||
<div v-if="each.show" class="eachSimulationMenu" :class="{'menuDisabled' :each.disabled}" @click="() => { each.disabled? '' : each.click(); }">{{ each.label }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<contect-us ref="contectUs" />
|
||||
<jl3d-device v-if="deviceif" v-show="deviceShow" ref="Jl3dDevice" :panel-show="deviceShow" @closedevice3dview="jlmap3dmodel" />
|
||||
<modify-time v-if="simType === 'RAILWAY'" ref="modifySysTime" />
|
||||
<set-time ref="setTime" @ConfirmSelectBeginTime="startSim" />
|
||||
<flow-data ref="flowData" />
|
||||
<member-manage ref="memberManage" />
|
||||
<register-book ref="registerBook" />
|
||||
<train-ticket ref="trainTicket" />
|
||||
<draw-select ref="drawSelect" />
|
||||
<line-board ref="lineBoard" />
|
||||
<theory-exam-select ref="theoryExamSelect" @startTheoryExam="startTheoryExam" />
|
||||
<theory-exam ref="theoryExam" />
|
||||
<scheduling ref="scheduling" :group="group" />
|
||||
<scheduling-view ref="schedulingView" :group="group" />
|
||||
<run-plan-view ref="runPlanView" :group="group" />
|
||||
<select-exam ref="selectExam" @examStart="examStart" />
|
||||
<exam-panel ref="examPanel" />
|
||||
<training-tip ref="trainingTip" />
|
||||
<training-position-tip ref="trainingPositionTip" />
|
||||
<training-menu v-if="hasTraining" ref="trainingMenu" :offset-bottom="offsetBottom" />
|
||||
<training-design v-if="trainingDesignShow" ref="trainingDesign" />
|
||||
<voice-chat-box v-if="hasVoice" :group="group" />
|
||||
<design-training-menu v-if="trainingDesign && trainingDetail" ref="trainingMenu" :offset-bottom="offsetBottom" />
|
||||
<device-manage ref="deviceManage" />
|
||||
<diagram-load ref="diagramLoad" :group="group" />
|
||||
<diagram-preview ref="diagramPreview" />
|
||||
<qr-code ref="qrCode" />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { getPostByProjectCode } from '@/api/learn';
|
||||
import { getSessionStorage } from '@/utils/auth';
|
||||
import { ProjectCode } from '@/scripts/ProjectConfig';
|
||||
import { clearSimulation, ranAsPlan } from '@/api/simulation';
|
||||
import { getSimulationQrcode } from '@/api/jointSimulation';
|
||||
import { initSimulation } from '@/api/rtSimulation';
|
||||
import ContectUs from './contectUs';
|
||||
import ModifyTime from './modifyTime';
|
||||
import FlowData from './flowData';
|
||||
import SetTime from './setTime';
|
||||
import Jl3dDevice from '@/views/jlmap3d/device/jl3ddevice';
|
||||
import { clearSimulation, ranAsPlan } from '@/api/simulation';
|
||||
import { Notification } from 'element-ui';
|
||||
import MemberManage from './memberManage/membersManage';
|
||||
import RegisterBook from '../registerBook/index';
|
||||
import TrainTicket from '../trainTicket/index';
|
||||
import DrawSelect from '@/jmapNew/theme/datie_01/menus/dialog/drawSelect';
|
||||
import LineBoard from '../displayCity/lineBoard';
|
||||
import TheoryExamSelect from './theoryExamSelect';
|
||||
import TheoryExam from './theoryExam';
|
||||
import { initSimulation } from '@/api/rtSimulation';
|
||||
import Scheduling from './scheduling';
|
||||
import SchedulingView from './schedulingView';
|
||||
import RunPlanView from './runPlanView';
|
||||
import SelectExam from './exam/selectExam';
|
||||
import ExamPanel from './exam/examPanel';
|
||||
import TrainingTip from './trainingList/trainingTip.vue';
|
||||
import TrainingPositionTip from './trainingList/trainingPositionTip.vue';
|
||||
import TrainingMenu from './trainingList/trainingMenu';
|
||||
import TrainingDesign from './trainingDesign/designPane.vue';
|
||||
import VoiceChatBox from './voiceChatBox/index';
|
||||
import DesignTrainingMenu from './trainingList/designTrainingMenu';
|
||||
import MemberManage from '../memberManage/membersManage';
|
||||
import SelectExam from '../exam/selectExam';
|
||||
import ExamPanel from '../exam/examPanel';
|
||||
import getErrorTip from '@/scripts/errorTip';
|
||||
import DeviceManage from './deviceManage';
|
||||
import QrCode from '@/components/QrCode';
|
||||
import DiagramLoad from './diagramLoad';
|
||||
import DiagramPreview from './diagramPreview';
|
||||
|
||||
export default {
|
||||
name: 'SimulationMenu',
|
||||
components: {
|
||||
SetTime,
|
||||
ModifyTime,
|
||||
FlowData,
|
||||
RegisterBook,
|
||||
TrainTicket,
|
||||
DrawSelect,
|
||||
LineBoard,
|
||||
TheoryExam,
|
||||
TheoryExamSelect,
|
||||
Scheduling,
|
||||
SchedulingView,
|
||||
RunPlanView,
|
||||
SelectExam,
|
||||
ExamPanel,
|
||||
ContectUs,
|
||||
Jl3dDevice,
|
||||
MemberManage,
|
||||
TrainingTip,
|
||||
TrainingPositionTip,
|
||||
TrainingMenu,
|
||||
TrainingDesign,
|
||||
VoiceChatBox,
|
||||
DesignTrainingMenu
|
||||
DeviceManage,
|
||||
QrCode,
|
||||
DiagramPreview,
|
||||
DiagramLoad
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isShowMenuList: false,
|
||||
menuList: [],
|
||||
active: -1,
|
||||
offsetBottom: 15,
|
||||
deviceif: false,
|
||||
deviceShow: true,
|
||||
hasVoice: false,
|
||||
hasTraining: false,
|
||||
trainingDesign: false,
|
||||
allMenuList: [
|
||||
{ label: '设备视图', name: 'jlmap3dmodel', click: this.jlmap3dmodel, isShow: () => { return true; } },
|
||||
{ label: '修改系统时间', name: 'drivingPlan', click: this.drivingPlan, isShow: () => { return this.$route.query.simType === 'RAILWAY'; } },
|
||||
{ label: '按计划行车', name: 'modifySysTime', click: this.modifySysTime, isShow: () => { return this.$route.query.simType === 'METRO'; } },
|
||||
{ label: '初始化', name: 'initialize', click: this.initializeSim, isShow: () => { return !this.$store.state.trainingNew.trainingSwitch; } },
|
||||
{ label: '考试', name: 'exam', click: this.goExam, isShow: () => { return this.$store.state.training.domConfig.hasExam; } },
|
||||
{ label: '联系方式', name: 'contectUs', click: this.contectUs, isShow: () => { return true; } },
|
||||
{ label: '成员管理', name: 'memberManage', click: this.memberManage, isShow: () => { return true; } },
|
||||
{ label: '切换客流数据', name: 'changeFlowData', click: this.changeFlowData, isShow: () => { return this.$store.state.training.domConfig.hasLpf; } },
|
||||
{ label: '留言板', name: 'messageBoard', click: this.messageBoard, isShow: async () => { const resp = await getPostByProjectCode(ProjectCode[this.project]); return resp.data; } },
|
||||
{ label: '退出', name: 'quit', click: this.exitSim, isShow: () => { return this.$route.query.projectDevice; } },
|
||||
{ label: '返回', name: 'back', click: this.backSim, isShow: () => { return !this.$route.query.projectDevice; } }
|
||||
{ label: '设备视图', name: 'jlmap3dmodel', click: this.jlmap3dmodel, isDisabled: () => { return false; }, isShow: () => { return true; } },
|
||||
{ label: '设备管理', name: 'deviceManage', click: this.deviceManage, isDisabled: () => { return false; }, isShow: () => { return this.$store.state.training.domConfig.hasDeviceManage; } },
|
||||
{ label: '联系方式', name: 'contectUs', click: this.contectUs, isDisabled: () => { return false; }, isShow: () => { return true; } },
|
||||
{ label: '生成二维码', name: 'generateQrCode', click: this.generateQrCode, isDisabled: () => { return false; }, isShow: () => { return this.$store.state.training.domConfig.isJoint; } },
|
||||
{ label: '切换客流数据', name: 'changeFlowData', click: this.changeFlowData, isDisabled: () => { return false; }, isShow: () => { return this.$store.state.training.domConfig.hasLpf; } },
|
||||
{ label: '运行图加载', name: 'diagramLoad', click: this.diagramLoad, isDisabled: () => { return false; }, isShow: ()=>{ return this.$route.query.simType === 'METRO'; } },
|
||||
{ label: '运行图预览', name: 'diagramPreview', click: this.diagramPreview, isDisabled: () => { return false; }, isShow: ()=>{ return this.$route.query.simType === 'METRO'; } },
|
||||
{ label: '成员管理', name: 'memberManage', click: this.memberManage, isDisabled: () => { return false; }, isShow: () => { return !this.$store.state.training.domConfig.singleMember; } },
|
||||
{ label: '考试', name: 'exam', click: this.goExam, isDisabled: () => { return false; }, isShow: () => { return this.$store.state.training.domConfig.hasExam; } },
|
||||
{ label: '按计划行车', name: 'drivingPlan', click: this.drivingPlan, isDisabled: () => { return this.$store.state.trainingNew.trainingSwitch; }, isShow: () => { return true; } },
|
||||
{ label: '初始化', name: 'initialize', click: this.initializeSim, isDisabled: () => { return this.$store.state.trainingNew.trainingSwitch; }, isShow: () => { return true; } },
|
||||
{ label: '退出', name: 'quit', click: this.exitSim, isDisabled: () => { return false; }, isShow: () => { return true; } }
|
||||
]
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
// 当前的所属项目
|
||||
project() {
|
||||
return getSessionStorage('project');
|
||||
},
|
||||
isLocal() {
|
||||
// 是否为本地项目
|
||||
return process.env.VUE_APP_PRO === 'local';
|
||||
},
|
||||
// 线路类型
|
||||
lineCode() {
|
||||
return this.$route.query.lineCode;
|
||||
},
|
||||
// 仿真group
|
||||
group() {
|
||||
return this.$route.query.group;
|
||||
},
|
||||
// 设备数据
|
||||
projectDevice() {
|
||||
return this.$route.query.projectDevice;
|
||||
},
|
||||
@ -144,15 +88,46 @@ export default {
|
||||
},
|
||||
mapId() {
|
||||
return this.$route.query.mapId;
|
||||
},
|
||||
trainingDetail() {
|
||||
return this.$store.state.trainingNew.trainingDetail;
|
||||
},
|
||||
trainingDesignShow() {
|
||||
return this.$store.state.training.domConfig.trainingDesign || false;
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
window.addEventListener('click', this.close, false);
|
||||
},
|
||||
beforeDestroy() {
|
||||
window.removeEventListener('click', this.close);
|
||||
this.$store.dispatch('socket/clearTrainingOverCount');
|
||||
this.$store.dispatch('trainingNew/clearStepOverCount');
|
||||
this.$store.dispatch('trainingNew/trainingEnd');
|
||||
this.$store.dispatch('trainingNew/changeTeachMode', '');
|
||||
},
|
||||
methods: {
|
||||
diagramLoad() {
|
||||
this.hideMenuList();
|
||||
this.$refs.diagramLoad.doShow();
|
||||
},
|
||||
diagramPreview() {
|
||||
this.hideMenuList();
|
||||
this.$refs.diagramPreview.doShow();
|
||||
},
|
||||
generateQrCode() {
|
||||
this.hideMenuList();
|
||||
getSimulationQrcode(this.$route.query.group).then(resp => {
|
||||
const param = {
|
||||
url: resp.data,
|
||||
title: this.$t('综合演练二维码'),
|
||||
group: this.$route.query.group
|
||||
};
|
||||
if (this.$refs) {
|
||||
this.$refs.qrCode.doShow(param);
|
||||
}
|
||||
}).catch(() => {
|
||||
this.$messageBox('仿真生成二维码失败!');
|
||||
});
|
||||
},
|
||||
deviceManage() {
|
||||
this.hideMenuList();
|
||||
this.$refs.deviceManage.doShow();
|
||||
},
|
||||
showMenuList(event) {
|
||||
event.stopPropagation();
|
||||
this.isShowMenuList = !this.isShowMenuList;
|
||||
@ -167,10 +142,6 @@ export default {
|
||||
this.isShowMenuList = false;
|
||||
this.active = -1;
|
||||
},
|
||||
// 开始理论考试
|
||||
startTheoryExam(mode) {
|
||||
this.$refs.theoryExam.doShow(mode);
|
||||
},
|
||||
startSim(model) {
|
||||
// 开始仿真
|
||||
this.hideMenuList();
|
||||
@ -186,16 +157,11 @@ export default {
|
||||
this.$refs.examPanel.init(data);
|
||||
},
|
||||
jlmap3dmodel() {
|
||||
this.hideMenuList();
|
||||
if (this.deviceif == false) {
|
||||
this.hideMenuList();
|
||||
this.deviceif = true;
|
||||
} else {
|
||||
if (this.deviceShow == false) {
|
||||
this.hideMenuList();
|
||||
this.deviceShow = true;
|
||||
} else {
|
||||
this.deviceShow = false;
|
||||
}
|
||||
this.deviceShow = !this.deviceShow;
|
||||
}
|
||||
},
|
||||
// 登出
|
||||
@ -206,22 +172,6 @@ export default {
|
||||
},
|
||||
// 返回或者退出
|
||||
exitSim() {
|
||||
this.hideMenuList();
|
||||
this.$confirm('是否退出仿真?', '提 示', {
|
||||
confirmButtonText: '确 定',
|
||||
cancelButtonText: '取 消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
if (this.$route.query.type === 'IM') {
|
||||
clearSimulation(this.group).then(() => {
|
||||
this.logout();
|
||||
});
|
||||
} else {
|
||||
this.logout();
|
||||
}
|
||||
});
|
||||
},
|
||||
backSim() {
|
||||
this.hideMenuList();
|
||||
this.$confirm('是否退出仿真?', '提 示', {
|
||||
confirmButtonText: '确 定',
|
||||
@ -229,14 +179,13 @@ export default {
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
if (this.projectDevice && this.$route.query.type === 'IM') {
|
||||
clearSimulation(this.group).then(res => {
|
||||
clearSimulation(this.group).then(() => {
|
||||
this.logout();
|
||||
});
|
||||
} else if (this.projectDevice) {
|
||||
this.logout();
|
||||
} else {
|
||||
history.go(-1);
|
||||
Notification.closeAll();
|
||||
this.$router.go(-1);
|
||||
}
|
||||
});
|
||||
},
|
||||
@ -279,22 +228,75 @@ export default {
|
||||
this.hideMenuList();
|
||||
this.$refs.flowData.doShow();
|
||||
},
|
||||
messageBoard() {
|
||||
this.hideMenuList();
|
||||
const routeData = this.$router.resolve({
|
||||
path: '/messageBoard',
|
||||
query: {
|
||||
project: this.project,
|
||||
noPreLogout: true
|
||||
}
|
||||
handleMenuShow() {
|
||||
this.allMenuList.forEach(item => {
|
||||
item.show = item.isShow();
|
||||
item.disabled = item.isDisabled();
|
||||
});
|
||||
window.open(routeData.href, '_blank');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.allSimulationMenu {
|
||||
position: absolute;
|
||||
// width: 200px;
|
||||
height: 200px;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 2009;
|
||||
}
|
||||
.simulationMenu {
|
||||
position: absolute;
|
||||
width: 60px;
|
||||
right: 10px;
|
||||
padding: 9px 0;
|
||||
background: #fff;
|
||||
text-align: center;
|
||||
bottom: 10px;
|
||||
border-radius: 2px;
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.simulationMenuList {
|
||||
position: absolute;
|
||||
right: 71px;
|
||||
width: 95px;
|
||||
bottom: 10px;
|
||||
background: #fff;
|
||||
// min-height: 100px;
|
||||
border-radius: 2px;
|
||||
font-size: 14px;
|
||||
}
|
||||
.eachSimulationMenu {
|
||||
padding: 9px 0;
|
||||
// border-bottom:1px #dedede solid;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
white-space: nowrap;
|
||||
-moz-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.eachSimulationMenu:hover {
|
||||
background: #dedede;
|
||||
}
|
||||
.menuDisabled {
|
||||
background: #ccc !important;
|
||||
color: #5B6163;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.simulationMenuGroup {
|
||||
position: absolute;
|
||||
right: 96px;
|
||||
top: 0px;
|
||||
background: #fff;
|
||||
display: inline-block;
|
||||
border-radius: 4px;
|
||||
width: 95px;
|
||||
border-right: 1px #000 solid;
|
||||
}
|
||||
</style>
|
@ -193,6 +193,7 @@ export default {
|
||||
let series = [];
|
||||
const stations = this.$store.state.runPlan.stations;
|
||||
const planData = this.$store.state.runPlan.planData;
|
||||
console.log(stations, planData, '-----------');
|
||||
this.kmRangeMap = this.PlanParser.convertStationsToMap(stations);
|
||||
if (this.$route.query.lineCode === '07') {
|
||||
series = this.pushModels(series, [this.PlanParser.initializeAxisX(stations)]);
|
||||
|
@ -150,13 +150,16 @@ export default {
|
||||
lpfDataList: [],
|
||||
frontTableData: [
|
||||
{ key: 'singleMember', label: '是否单角色', value: false, type: 'checkbox' },
|
||||
{ key: 'singleRoleType', label: '是否单类型角色', value: false, type: 'checkbox' },
|
||||
{ key: 'singleClient', label: '是否单客户端', value: false, type: 'checkbox' },
|
||||
{ key: 'client', label: '初始客户端', value: '', type: 'select', optionList: clientList},
|
||||
{ key: 'hasTraining', label: '是否有实训', value: false, type: 'checkbox'},
|
||||
{ key: 'hasExam', label: '是否有考试', value: false, type: 'checkbox' },
|
||||
{ key: 'trainingDesign', label: '是否实训设计', value: false, type: 'checkbox' },
|
||||
{ key: 'hasLpf', label: '是否有大客流', value: false, type: 'checkbox' },
|
||||
{ key: 'hasVoice', label: '是否有语音指令', value: false, type: 'checkbox' }
|
||||
{ key: 'hasVoice', label: '是否有语音指令', value: false, type: 'checkbox' },
|
||||
{ key: 'isJoint', label: '是否综合演练', value: false, type: 'checkbox' },
|
||||
{ key: 'hasDeviceManage', label: '是否有设备管理', value: false, type: 'checkbox' }
|
||||
],
|
||||
endTableData: [
|
||||
{ key: 'DEFAULT_MEMBER', label: '默认仿真成员', value: '', type: 'select', optionList: [] },
|
||||
|
Loading…
Reference in New Issue
Block a user