菜单调整

This commit is contained in:
fan 2022-11-28 17:59:12 +08:00
parent a69ef7590e
commit 9ffd70de63
15 changed files with 1138 additions and 230 deletions

View File

@ -296,7 +296,7 @@ export function modifySystemTime(data, group) {
/** 新版地图按计划行车 */ /** 新版地图按计划行车 */
export function ranAsPlan(data, group) { export function ranAsPlan(data, group) {
return request({ return request({
url: `/simulation/${group}/ranAsPlan`, url: `/simulation/new/${group}/runAsPlan`,
method: 'post', method: 'post',
data: data data: data
}); });

View File

@ -176,10 +176,7 @@ const runPlan = {
}, },
/** 设置stations数据 */ /** 设置stations数据 */
setStations: ({ commit }, mapModel) => { setStations: ({ commit }, mapModel) => {
return new Promise((resolve) => { commit('setStations', mapModel);
commit('setStations', mapModel);
resolve(mapModel);
});
}, },
/** 重置运行图数据更新池 */ /** 重置运行图数据更新池 */
resetRunPlanData:({ commit }) => { resetRunPlanData:({ commit }) => {
@ -218,10 +215,7 @@ const runPlan = {
}, },
/** 清空数据*/ /** 清空数据*/
clear: ({ commit }) => { clear: ({ commit }) => {
return new Promise((resolve) => { commit('clear');
commit('clear');
resolve();
});
}, },
draftClear: ({ commit }) => { draftClear: ({ commit }) => {
return new Promise(resolve => { return new Promise(resolve => {

View File

@ -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) { if (!store.state.runPlan.runPlanInfo || !store.state.runPlan.runPlanInfo.templateId) {
MessageBox.confirm('未获取到运行图信息!', '提示', { MessageBox.confirm('未获取到运行图信息!', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
@ -78,7 +78,7 @@ export function loadRunPlanData(group, dataError) {
resp.data.version = store.state.runPlan.runPlanInfo.version; resp.data.version = store.state.runPlan.runPlanInfo.version;
dbUpdateData('runPlan', resp.data); dbUpdateData('runPlan', resp.data);
}).catch(error => { }).catch(error => {
runPlanErrorHandle(error, dataError); runPlanErrorHandle(error);
}); });
} else { } else {
getEveryDayRunPlanNew(group).then(async (resp) => { getEveryDayRunPlanNew(group).then(async (resp) => {
@ -88,12 +88,12 @@ export function loadRunPlanData(group, dataError) {
resp.data.version = store.state.runPlan.runPlanInfo.version; resp.data.version = store.state.runPlan.runPlanInfo.version;
dbAddData('runPlan', resp.data); dbAddData('runPlan', resp.data);
}).catch(error => { }).catch(error => {
runPlanErrorHandle(error, dataError); runPlanErrorHandle(error);
}); });
} }
}); });
} }
export function runPlanErrorHandle(error, dataError) { export function runPlanErrorHandle(error) {
store.dispatch('runPlan/setPlanData', []); store.dispatch('runPlan/setPlanData', []);
if (error.code == 30001) { if (error.code == 30001) {
MessageBox.confirm('今日运行图未加载', '提示', { MessageBox.confirm('今日运行图未加载', '提示', {
@ -101,12 +101,6 @@ export function runPlanErrorHandle(error, dataError) {
showCancelButton: false, showCancelButton: false,
type: 'warning' type: 'warning'
}); });
} else if (!dataError) {
MessageBox.confirm('获取运行图数据失败', '提示', {
confirmButtonText: '确定',
showCancelButton: false,
type: 'warning'
});
} }
} }

View File

@ -5,29 +5,50 @@
</transition> </transition>
<simulation-control ref="simulationControl" /> <simulation-control ref="simulationControl" />
<simulation-menu ref="simulationMenu" :mode="mode" /> <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> </div>
</template> </template>
<script> <script>
import { getSessionStorage } from '@/utils/auth'; import { getSessionStorage } from '@/utils/auth';
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex';
import TerminalsPicture from './terminals/index'; import TerminalsPicture from './terminals/index';
import SimulationMenu from './simulationMenu'; import SimulationMenu from './simulationMenu/simulationMenu';
import { clearSimulation, getSimulationInfoNew} from '@/api/simulation'; import { clearSimulation, getSimulationInfoNew} from '@/api/simulation';
import { destroySimulation, getSimulationInfoByGroup } from '@/api/rtSimulation'; import { loadMapDataById, loadRunPlanData } from '@/utils/loaddata';
import { loadMapDataById } from '@/utils/loaddata'; import { getByGroupStationList } from '@/api/jmap/map';
import { EventBus } from '@/scripts/event-bus'; import { EventBus } from '@/scripts/event-bus';
import SimulationControl from './simulationControl.vue'; 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 { export default {
name: 'DisplayDraft', name: 'DisplayDraft',
components: { components: {
TerminalsPicture, TerminalsPicture,
SimulationMenu, SimulationMenu,
SimulationControl SimulationControl,
TrainingTip,
TrainingPositionTip,
TrainingMenu,
TrainingDesign,
VoiceChatBox,
DesignTrainingMenu
}, },
data() { data() {
return { return {
dataError: false, group: '',
group: '' offsetBottom: 35,
hasTraining: false,
hasVoice: false,
trainingDesign: false
}; };
}, },
computed:{ computed:{
@ -49,6 +70,9 @@ export default {
// //
project() { project() {
return getSessionStorage('project'); return getSessionStorage('project');
},
trainingDetail() {
return this.$store.state.trainingNew.trainingDetail;
} }
}, },
watch:{ watch:{
@ -56,7 +80,10 @@ export default {
this.setWindowSize(); this.setWindowSize();
}, },
'$store.state.training.domConfig': function(val) { '$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() { async mounted() {
@ -67,11 +94,11 @@ export default {
} }
}, },
beforeDestroy() { beforeDestroy() {
if (getSessionStorage('project') == 'wjls') { this.$store.dispatch('socket/clearTrainingOverCount');
destroySimulation(this.group); this.$store.dispatch('trainingNew/clearStepOverCount');
} else { this.$store.dispatch('trainingNew/trainingEnd');
clearSimulation(this.group); this.$store.dispatch('trainingNew/changeTeachMode', '');
} clearSimulation(this.group);
}, },
methods:{ methods:{
// //
@ -82,45 +109,32 @@ export default {
}, },
// //
initLoadData() { initLoadData() {
// this.$store.dispatch('training/reset'); getSimulationInfoNew(this.group).then(resp => {
this.loadSimulationInfo(); if (resp && resp.data && !resp.data.dataError) {
}, this.$store.dispatch('runPlan/setRunPlanInfo', resp.data.runPlan);
// 仿group仿 this.$store.dispatch('training/setDomConfig', resp.data.paramVO && resp.data.paramVO.domConfig ? resp.data.paramVO.domConfig : {});
async loadSimulationInfo() { loadMapDataById(this.mapId, 'simulation');
let resp; this.loadRunPlan();
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();
} else { } else {
this.endViewLoading();
this.$messageBox('此地图数据正在维护中,无法运行!'); this.$messageBox('此地图数据正在维护中,无法运行!');
} }
this.dataError = resp.data.dataError; }).catch(e => {
if (resp.data.paramVO && resp.data.paramVO.domConfig) { console.error(e);
this.$store.dispatch('training/setDomConfig', resp.data.paramVO.domConfig); this.$store.dispatch('app/animationsClose');
}
}
},
//
loadMapData() {
if (parseInt(this.mapId)) {
// this.$store.dispatch('training/changeOperateMode', { mode: OperateMode.NORMAL }); //
console.log('==========');
loadMapDataById(this.mapId, 'simulation');
} else {
this.endViewLoading(); 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) { endViewLoading() {
// if (!isSuccess) {
// this.$store.dispatch('map/mapClear');
// }
this.$nextTick(() => { this.$nextTick(() => {
EventBus.$emit('viewLoading', false); EventBus.$emit('viewLoading', false);
}); });

View File

@ -23,7 +23,6 @@
default-expand-all default-expand-all
style="margin: 10px;margin-bottom: 0;border: 1px solid #ccc;overflow-y: auto;height: calc(100% - 120px);" style="margin: 10px;margin-bottom: 0;border: 1px solid #ccc;overflow-y: auto;height: calc(100% - 120px);"
:filter-node-method="filterNode" :filter-node-method="filterNode"
@node-click="handleNodeClick"
> >
<span :id="data.id" slot-scope="{ data }" class="custom-tree-node"> <span :id="data.id" slot-scope="{ data }" class="custom-tree-node">
<span>{{ data.labelName }}</span> <span>{{ data.labelName }}</span>
@ -360,13 +359,6 @@ export default {
this.checkRoleChange(list); this.checkRoleChange(list);
} }
} }
// '$store.state.socket.simulationRoleList':function(val) {
// if (val && val.length) {
// this.handlerMemberOnOff(val);
// }
// }
},
mounted() {
}, },
methods: { methods: {
doShow() { doShow() {
@ -385,12 +377,6 @@ export default {
messageInfo(info) { messageInfo(info) {
this.$message({ showClose: true, ...info }); this.$message({ showClose: true, ...info });
}, },
jumpInSimulation() {
},
clearSubscribe() {
},
handleNodeClick() {
},
nodeMemberChange(val, nodeData) { nodeMemberChange(val, nodeData) {
let user = ''; let user = '';
this.simulationUserList.forEach(item => { this.simulationUserList.forEach(item => {
@ -428,21 +414,14 @@ export default {
const item = each.body; const item = each.body;
if (item.messageType === 'PLAY_CHANGE' && item.userId == this.userId) { if (item.messageType === 'PLAY_CHANGE' && item.userId == this.userId) {
const userRole = item.type || 'AUDIENCE'; const userRole = item.type || 'AUDIENCE';
// this.userRole = item.type || 'AUDIENCE';
this.$store.dispatch('training/setRoleDeviceCode', item.deviceCode); this.$store.dispatch('training/setRoleDeviceCode', item.deviceCode);
this.$store.dispatch('training/setMyMemberId', item.memberId); this.$store.dispatch('training/setMyMemberId', item.memberId);
this.$store.dispatch('training/setUserRole', userRole); this.$store.dispatch('training/setUserRole', userRole);
this.$store.dispatch('training/setRoles', 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 }); this.$store.dispatch('training/updateMemberAndUser', { simulationUserList: [item], userId: this.userId });
} }
}); });
} }
// handlerMemberOnOff(data) {
// this.$store.dispatch('training/updateMemberAndUser', { simulationUserList: data, userId: this.userId });
// }
} }
}; };
</script> </script>

View File

@ -65,10 +65,10 @@ import {getPublishTrainingDetail, loadPublishTraining} from '@/api/jmap/training
import { getPostByProjectCode } from '@/api/learn'; import { getPostByProjectCode } from '@/api/learn';
import { getSessionStorage } from '@/utils/auth'; import { getSessionStorage } from '@/utils/auth';
import { ProjectCode } from '@/scripts/ProjectConfig'; import { ProjectCode } from '@/scripts/ProjectConfig';
import ContectUs from './contectUs'; import ContectUs from './simulationMenu/contectUs';
import ModifyTime from './modifyTime'; import ModifyTime from './modifyTime';
import FlowData from './flowData'; import FlowData from './simulationMenu/flowData';
import SetTime from './setTime'; import SetTime from './simulationMenu/setTime';
import Jl3dDevice from '@/views/jlmap3d/device/jl3ddevice'; import Jl3dDevice from '@/views/jlmap3d/device/jl3ddevice';
import { clearSimulation, ranAsPlan, exitRunPlan } from '@/api/simulation'; import { clearSimulation, ranAsPlan, exitRunPlan } from '@/api/simulation';
import { getToken } from '@/utils/auth'; import { getToken } from '@/utils/auth';

View File

@ -10,11 +10,6 @@
<div class="eachInfo"><span class="el-icon-mobile-phone" style="font-size:15px;margin-right:7px;" />&nbsp;&nbsp;&nbsp;&nbsp;4000500081</div> <div class="eachInfo"><span class="el-icon-mobile-phone" style="font-size:15px;margin-right:7px;" />&nbsp;&nbsp;&nbsp;&nbsp;4000500081</div>
<div class="eachInfo"><span class="el-icon-message" style="font-size:15px;margin-right:7px;" />&nbsp;&nbsp;&nbsp;&nbsp;zhrc@richortech.com</div> <div class="eachInfo"><span class="el-icon-message" style="font-size:15px;margin-right:7px;" />&nbsp;&nbsp;&nbsp;&nbsp;zhrc@richortech.com</div>
<div class="eachInfo"><span class="el-icon-connection" style="font-size:15px;margin-right:7px;" />&nbsp;&nbsp;&nbsp;&nbsp;www.richortech.com</div> <div class="eachInfo"><span class="el-icon-connection" style="font-size:15px;margin-right:7px;" />&nbsp;&nbsp;&nbsp;&nbsp;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;">&nbsp;&nbsp;&nbsp;&nbsp;</span>
<img :src="wchatImg" width="80" height="80">
</div> -->
</div> </div>
<div v-else> <div v-else>
<div><span class="el-icon-user" style="font-size:15px;margin-right:8px;" />联系人许经理</div> <div><span class="el-icon-user" style="font-size:15px;margin-right:8px;" />联系人许经理</div>

View 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>

View 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>

View 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>

View File

@ -29,10 +29,8 @@
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
// clearSimulation, getSimulationInfoNew, ranAsPlan, exitRunPlan, ,
import { getPassengerFlowData, changePassengerFlowData } from '@/api/simulation'; import { getPassengerFlowData, changePassengerFlowData } from '@/api/simulation';
import { getToken } from '@/utils/auth'; import { getToken } from '@/utils/auth';
// displayTopic,
import { creatSubscribe, clearSubscribe, LPFTopic} from '@/utils/stomp'; import { creatSubscribe, clearSubscribe, LPFTopic} from '@/utils/stomp';
import { defaultCallback } from '@/utils/subscribeCallback'; import { defaultCallback } from '@/utils/subscribeCallback';
export default { export default {

View File

@ -4,138 +4,82 @@
<div class="simulationMenu" @click="showMenuList">菜单</div> <div class="simulationMenu" @click="showMenuList">菜单</div>
<div v-show="isShowMenuList" class="simulationMenuList"> <div v-show="isShowMenuList" class="simulationMenuList">
<div v-for="(each, index) in allMenuList" :key="index"> <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> </div>
</div> </div>
<contect-us ref="contectUs" /> <contect-us ref="contectUs" />
<jl3d-device v-if="deviceif" v-show="deviceShow" ref="Jl3dDevice" :panel-show="deviceShow" @closedevice3dview="jlmap3dmodel" /> <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" /> <set-time ref="setTime" @ConfirmSelectBeginTime="startSim" />
<flow-data ref="flowData" /> <flow-data ref="flowData" />
<member-manage ref="memberManage" /> <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" /> <select-exam ref="selectExam" @examStart="examStart" />
<exam-panel ref="examPanel" /> <exam-panel ref="examPanel" />
<training-tip ref="trainingTip" /> <device-manage ref="deviceManage" />
<training-position-tip ref="trainingPositionTip" /> <diagram-load ref="diagramLoad" :group="group" />
<training-menu v-if="hasTraining" ref="trainingMenu" :offset-bottom="offsetBottom" /> <diagram-preview ref="diagramPreview" />
<training-design v-if="trainingDesignShow" ref="trainingDesign" /> <qr-code ref="qrCode" />
<voice-chat-box v-if="hasVoice" :group="group" />
<design-training-menu v-if="trainingDesign && trainingDetail" ref="trainingMenu" :offset-bottom="offsetBottom" />
</div> </div>
</template> </template>
<script> <script>
import { getPostByProjectCode } from '@/api/learn'; import { clearSimulation, ranAsPlan } from '@/api/simulation';
import { getSessionStorage } from '@/utils/auth'; import { getSimulationQrcode } from '@/api/jointSimulation';
import { ProjectCode } from '@/scripts/ProjectConfig'; import { initSimulation } from '@/api/rtSimulation';
import ContectUs from './contectUs'; import ContectUs from './contectUs';
import ModifyTime from './modifyTime';
import FlowData from './flowData'; import FlowData from './flowData';
import SetTime from './setTime'; import SetTime from './setTime';
import Jl3dDevice from '@/views/jlmap3d/device/jl3ddevice'; import Jl3dDevice from '@/views/jlmap3d/device/jl3ddevice';
import { clearSimulation, ranAsPlan } from '@/api/simulation'; import MemberManage from '../memberManage/membersManage';
import { Notification } from 'element-ui'; import SelectExam from '../exam/selectExam';
import MemberManage from './memberManage/membersManage'; import ExamPanel from '../exam/examPanel';
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 getErrorTip from '@/scripts/errorTip'; import getErrorTip from '@/scripts/errorTip';
import DeviceManage from './deviceManage';
import QrCode from '@/components/QrCode';
import DiagramLoad from './diagramLoad';
import DiagramPreview from './diagramPreview';
export default { export default {
name: 'SimulationMenu', name: 'SimulationMenu',
components: { components: {
SetTime, SetTime,
ModifyTime,
FlowData, FlowData,
RegisterBook,
TrainTicket,
DrawSelect,
LineBoard,
TheoryExam,
TheoryExamSelect,
Scheduling,
SchedulingView,
RunPlanView,
SelectExam, SelectExam,
ExamPanel, ExamPanel,
ContectUs, ContectUs,
Jl3dDevice, Jl3dDevice,
MemberManage, MemberManage,
TrainingTip, DeviceManage,
TrainingPositionTip, QrCode,
TrainingMenu, DiagramPreview,
TrainingDesign, DiagramLoad
VoiceChatBox,
DesignTrainingMenu
}, },
data() { data() {
return { return {
isShowMenuList: false, isShowMenuList: false,
menuList: [], menuList: [],
active: -1, active: -1,
offsetBottom: 15,
deviceif: false, deviceif: false,
deviceShow: true, deviceShow: true,
hasVoice: false,
hasTraining: false,
trainingDesign: false,
allMenuList: [ allMenuList: [
{ label: '设备视图', name: 'jlmap3dmodel', click: this.jlmap3dmodel, isShow: () => { return true; } }, { label: '设备视图', name: 'jlmap3dmodel', click: this.jlmap3dmodel, isDisabled: () => { return false; }, isShow: () => { return true; } },
{ label: '修改系统时间', name: 'drivingPlan', click: this.drivingPlan, isShow: () => { return this.$route.query.simType === 'RAILWAY'; } }, { label: '设备管理', name: 'deviceManage', click: this.deviceManage, isDisabled: () => { return false; }, isShow: () => { return this.$store.state.training.domConfig.hasDeviceManage; } },
{ label: '按计划行车', name: 'modifySysTime', click: this.modifySysTime, isShow: () => { return this.$route.query.simType === 'METRO'; } }, { label: '联系方式', name: 'contectUs', click: this.contectUs, isDisabled: () => { return false; }, isShow: () => { return true; } },
{ label: '初始化', name: 'initialize', click: this.initializeSim, isShow: () => { return !this.$store.state.trainingNew.trainingSwitch; } }, { label: '生成二维码', name: 'generateQrCode', click: this.generateQrCode, isDisabled: () => { return false; }, isShow: () => { return this.$store.state.training.domConfig.isJoint; } },
{ label: '考试', name: 'exam', click: this.goExam, isShow: () => { return this.$store.state.training.domConfig.hasExam; } }, { label: '切换客流数据', name: 'changeFlowData', click: this.changeFlowData, isDisabled: () => { return false; }, isShow: () => { return this.$store.state.training.domConfig.hasLpf; } },
{ label: '联系方式', name: 'contectUs', click: this.contectUs, isShow: () => { return true; } }, { label: '运行图加载', name: 'diagramLoad', click: this.diagramLoad, isDisabled: () => { return false; }, isShow: ()=>{ return this.$route.query.simType === 'METRO'; } },
{ label: '成员管理', name: 'memberManage', click: this.memberManage, isShow: () => { return true; } }, { label: '运行图预览', name: 'diagramPreview', click: this.diagramPreview, isDisabled: () => { return false; }, isShow: ()=>{ return this.$route.query.simType === 'METRO'; } },
{ label: '切换客流数据', name: 'changeFlowData', click: this.changeFlowData, isShow: () => { return this.$store.state.training.domConfig.hasLpf; } }, { label: '成员管理', name: 'memberManage', click: this.memberManage, isDisabled: () => { return false; }, isShow: () => { return !this.$store.state.training.domConfig.singleMember; } },
{ label: '留言板', name: 'messageBoard', click: this.messageBoard, isShow: async () => { const resp = await getPostByProjectCode(ProjectCode[this.project]); return resp.data; } }, { label: '考试', name: 'exam', click: this.goExam, isDisabled: () => { return false; }, isShow: () => { return this.$store.state.training.domConfig.hasExam; } },
{ label: '退出', name: 'quit', click: this.exitSim, isShow: () => { return this.$route.query.projectDevice; } }, { label: '按计划行车', name: 'drivingPlan', click: this.drivingPlan, isDisabled: () => { return this.$store.state.trainingNew.trainingSwitch; }, isShow: () => { return true; } },
{ label: '返回', name: 'back', click: this.backSim, isShow: () => { return !this.$route.query.projectDevice; } } { 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: { computed: {
//
project() {
return getSessionStorage('project');
},
isLocal() {
//
return process.env.VUE_APP_PRO === 'local';
},
// 线
lineCode() {
return this.$route.query.lineCode;
},
// 仿group
group() { group() {
return this.$route.query.group; return this.$route.query.group;
}, },
//
projectDevice() { projectDevice() {
return this.$route.query.projectDevice; return this.$route.query.projectDevice;
}, },
@ -144,15 +88,46 @@ export default {
}, },
mapId() { mapId() {
return this.$route.query.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: { 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) { showMenuList(event) {
event.stopPropagation(); event.stopPropagation();
this.isShowMenuList = !this.isShowMenuList; this.isShowMenuList = !this.isShowMenuList;
@ -167,10 +142,6 @@ export default {
this.isShowMenuList = false; this.isShowMenuList = false;
this.active = -1; this.active = -1;
}, },
//
startTheoryExam(mode) {
this.$refs.theoryExam.doShow(mode);
},
startSim(model) { startSim(model) {
// 仿 // 仿
this.hideMenuList(); this.hideMenuList();
@ -186,16 +157,11 @@ export default {
this.$refs.examPanel.init(data); this.$refs.examPanel.init(data);
}, },
jlmap3dmodel() { jlmap3dmodel() {
this.hideMenuList();
if (this.deviceif == false) { if (this.deviceif == false) {
this.hideMenuList();
this.deviceif = true; this.deviceif = true;
} else { } else {
if (this.deviceShow == false) { this.deviceShow = !this.deviceShow;
this.hideMenuList();
this.deviceShow = true;
} else {
this.deviceShow = false;
}
} }
}, },
// //
@ -206,22 +172,6 @@ export default {
}, },
// 退 // 退
exitSim() { 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.hideMenuList();
this.$confirm('是否退出仿真?', '提 示', { this.$confirm('是否退出仿真?', '提 示', {
confirmButtonText: '确 定', confirmButtonText: '确 定',
@ -229,14 +179,13 @@ export default {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
if (this.projectDevice && this.$route.query.type === 'IM') { if (this.projectDevice && this.$route.query.type === 'IM') {
clearSimulation(this.group).then(res => { clearSimulation(this.group).then(() => {
this.logout(); this.logout();
}); });
} else if (this.projectDevice) { } else if (this.projectDevice) {
this.logout(); this.logout();
} else { } else {
history.go(-1); this.$router.go(-1);
Notification.closeAll();
} }
}); });
}, },
@ -279,22 +228,75 @@ export default {
this.hideMenuList(); this.hideMenuList();
this.$refs.flowData.doShow(); this.$refs.flowData.doShow();
}, },
messageBoard() { handleMenuShow() {
this.hideMenuList(); this.allMenuList.forEach(item => {
const routeData = this.$router.resolve({ item.show = item.isShow();
path: '/messageBoard', item.disabled = item.isDisabled();
query: {
project: this.project,
noPreLogout: true
}
}); });
window.open(routeData.href, '_blank');
} }
} }
}; };
</script> </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> </style>

View File

@ -193,6 +193,7 @@ export default {
let series = []; let series = [];
const stations = this.$store.state.runPlan.stations; const stations = this.$store.state.runPlan.stations;
const planData = this.$store.state.runPlan.planData; const planData = this.$store.state.runPlan.planData;
console.log(stations, planData, '-----------');
this.kmRangeMap = this.PlanParser.convertStationsToMap(stations); this.kmRangeMap = this.PlanParser.convertStationsToMap(stations);
if (this.$route.query.lineCode === '07') { if (this.$route.query.lineCode === '07') {
series = this.pushModels(series, [this.PlanParser.initializeAxisX(stations)]); series = this.pushModels(series, [this.PlanParser.initializeAxisX(stations)]);

View File

@ -150,13 +150,16 @@ export default {
lpfDataList: [], lpfDataList: [],
frontTableData: [ frontTableData: [
{ key: 'singleMember', label: '是否单角色', value: false, type: 'checkbox' }, { key: 'singleMember', label: '是否单角色', value: false, type: 'checkbox' },
{ key: 'singleRoleType', label: '是否单类型角色', value: false, type: 'checkbox' },
{ key: 'singleClient', label: '是否单客户端', value: false, type: 'checkbox' }, { key: 'singleClient', label: '是否单客户端', value: false, type: 'checkbox' },
{ key: 'client', label: '初始客户端', value: '', type: 'select', optionList: clientList}, { key: 'client', label: '初始客户端', value: '', type: 'select', optionList: clientList},
{ key: 'hasTraining', label: '是否有实训', value: false, type: 'checkbox'}, { key: 'hasTraining', label: '是否有实训', value: false, type: 'checkbox'},
{ key: 'hasExam', label: '是否有考试', value: false, type: 'checkbox' }, { key: 'hasExam', label: '是否有考试', value: false, type: 'checkbox' },
{ key: 'trainingDesign', label: '是否实训设计', value: false, type: 'checkbox' }, { key: 'trainingDesign', label: '是否实训设计', value: false, type: 'checkbox' },
{ key: 'hasLpf', 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: [ endTableData: [
{ key: 'DEFAULT_MEMBER', label: '默认仿真成员', value: '', type: 'select', optionList: [] }, { key: 'DEFAULT_MEMBER', label: '默认仿真成员', value: '', type: 'select', optionList: [] },