Merge branch 'test_dispaly' of https://git.code.tencent.com/lian-cbtc/jl-client into test_dispaly

# Conflicts:
#	src/views/newMap/display/terminals/index.vue
#	src/views/newMap/display/terminals/terminalMenu.vue
This commit is contained in:
joylink_cuiweidong 2022-10-21 16:49:14 +08:00
commit 16beaf8f94
15 changed files with 933 additions and 1010 deletions

View File

@ -17,27 +17,27 @@
<div class="content-row"> <div class="content-row">
<div class="cell btn"> <div class="cell btn">
<div class="btn-text">所有滑动门/应急门关闭且锁紧指示灯</div> <div class="btn-text">所有滑动门/应急门关闭且锁紧指示灯</div>
<img :src="getIcon('top', indicators.qbgmLight ? 'on' : 'off')" /> <img :src="getIcon('top', indicators.qbgmLight ? 'on' : 'off')">
</div> </div>
</div> </div>
<div class="content-row"> <div class="content-row">
<div class="cell"> <div class="cell">
<div class="btn-text">PSL操作指示灯</div> <div class="btn-text">PSL操作指示灯</div>
<img :src="getIcon('red', indicators.pslczLight ? 'on' : 'off')" /> <img :src="getIcon('red', indicators.pslczLight ? 'on' : 'off')">
</div> </div>
<div class="cell"> <div class="cell">
<div class="btn-text">互锁解除指示灯</div> <div class="btn-text">互锁解除指示灯</div>
<img :src="getIcon('red', indicators.hsjcLight ? 'on' : 'off')" /> <img :src="getIcon('red', indicators.hsjcLight ? 'on' : 'off')">
</div> </div>
</div> </div>
<div class="content-row"> <div class="content-row">
<div class="cell"> <div class="cell">
<div class="btn-text">开门状态指示灯</div> <div class="btn-text">开门状态指示灯</div>
<img :src="getIcon('red', indicators.kmLight ? 'on' : 'off')" /> <img :src="getIcon('red', indicators.kmLight ? 'on' : 'off')">
</div> </div>
<div class="cell"> <div class="cell">
<div class="btn-text">关门状态指示灯</div> <div class="btn-text">关门状态指示灯</div>
<img :src="getIcon('green', indicators.gmLight ? 'on' : 'off')" /> <img :src="getIcon('green', indicators.gmLight ? 'on' : 'off')">
</div> </div>
</div> </div>
<div class="content-row"> <div class="content-row">
@ -47,7 +47,7 @@
:src="getIcon('key')" :src="getIcon('key')"
:class="['key', { 'key-on': indicators.yxjzKey }]" :class="['key', { 'key-on': indicators.yxjzKey }]"
@click="btnClickHandler('YXJZ')" @click="btnClickHandler('YXJZ')"
/> >
<div class="btn-text-opt">允许</div> <div class="btn-text-opt">允许</div>
</div> </div>
<div class="cell btn"> <div class="cell btn">
@ -56,18 +56,18 @@
:src="getIcon('key')" :src="getIcon('key')"
:class="['key', { 'key-on': indicators.hsjcKey }]" :class="['key', { 'key-on': indicators.hsjcKey }]"
@click="btnClickHandler('HSJC')" @click="btnClickHandler('HSJC')"
/> >
<div class="btn-text-opt">互锁解除</div> <div class="btn-text-opt">互锁解除</div>
</div> </div>
</div> </div>
<div class="content-row"> <div class="content-row">
<div class="cell btn"> <div class="cell btn">
<div class="btn-text">开门按钮</div> <div class="btn-text">开门按钮</div>
<img :src="getIcon('red', 'btn')" @click="btnClickHandler('KM')" /> <img :src="getIcon('red', 'btn')" @click="btnClickHandler('KM')">
</div> </div>
<div class="cell btn"> <div class="cell btn">
<div class="btn-text">关门按钮</div> <div class="btn-text">关门按钮</div>
<img :src="getIcon('green', 'btn')" @click="btnClickHandler('GM')" /> <img :src="getIcon('green', 'btn')" @click="btnClickHandler('GM')">
</div> </div>
</div> </div>
<div class="content-row"> <div class="content-row">
@ -78,19 +78,18 @@
:src="getIcon('green', 'btn')" :src="getIcon('green', 'btn')"
@mousedown.left="btnClickHandler('SD')" @mousedown.left="btnClickHandler('SD')"
@mouseup.left="btnClickHandler('SD')" @mouseup.left="btnClickHandler('SD')"
/> >
</div> </div>
</div> </div>
</div> </div>
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import icons from "@/assets/psl_images/psl_icons"; import icons from '@/assets/psl_images/psl_icons';
import { getPslStatus, pressPslButton } from "@/api/simulation"; import { getPslStatus, pressPslButton } from '@/api/simulation';
let standCode, group; let standCode, group;
export default { export default {
name: "PSL", name: 'PSL',
data() { data() {
return { return {
dialogShow: false, dialogShow: false,
@ -107,18 +106,25 @@ export default {
}, },
computed: { computed: {
title() { title() {
return "PSL"; return 'PSL';
}, },
show() { show() {
return this.dialogShow && !this.$store.state.menuOperation.break; return this.dialogShow && !this.$store.state.menuOperation.break;
} }
}, },
watch: {
'$store.state.socket.simulationPslStatus': function(val) {
if (val && val[standCode]) {
Object.assign(this.indicators, val[standCode]);
}
}
},
methods: { methods: {
doShow(selected) { doShow(selected) {
this.dialogShow = true; this.dialogShow = true;
this.$nextTick(function() { this.$nextTick(function() {
this.$store.dispatch("training/emitTipFresh"); this.$store.dispatch('training/emitTipFresh');
}); });
standCode = selected.code; standCode = selected.code;
group = this.$route.query.group; group = this.$route.query.group;
@ -138,7 +144,7 @@ export default {
doClose() { doClose() {
this.loading = false; this.loading = false;
this.dialogShow = false; this.dialogShow = false;
this.$store.dispatch("training/emitTipFresh"); this.$store.dispatch('training/emitTipFresh');
}, },
getIcon(type, status) { getIcon(type, status) {
return status !== undefined ? icons[`${type}_${status}`] : icons[type]; return status !== undefined ? icons[`${type}_${status}`] : icons[type];
@ -146,13 +152,6 @@ export default {
btnClickHandler(btnType) { btnClickHandler(btnType) {
pressPslButton(group, standCode, btnType); pressPslButton(group, standCode, btnType);
} }
},
watch: {
"$store.state.socket.simulationPslStatus": function(val) {
if (val && val[standCode]) {
Object.assign(this.indicators, val[standCode]);
}
}
} }
}; };
</script> </script>

View File

@ -0,0 +1,13 @@
<template>
<div />
</template>
<script>
export default {
name: 'DispatchWorkMenu'
};
</script>
<style scoped>
</style>

View File

@ -0,0 +1,189 @@
<template>
<div id="menuBarChengdu3">
<menu-bar ref="menuBar" :menu-normal="menuNormal" style="width:100%;"/>
<station-control-convert ref="stationControlConvert" />
<password-box ref="passwordBox" @setLoginResult="getLoginResult" />
<view-name ref="viewName" />
<train-add ref="trainAdd" />
<train-transtalet ref="trainTranstalet" />
<train-delete ref="trainDelete" />
<manage-user ref="manageUser" />
<help-about ref="helpAbout" />
<set-limit-speed ref="setLimitSpeed" />
<train-fixed-path-pane ref="trainFixedPathPane" />
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import MenuBar from '@/jmapNew/theme/components/menus/menuBarNew';
import { OperationEvent } from '@/scripts/cmdPlugin/OperationHandler';
import {menuOperate, commitOperate} from '@/jmapNew/theme/components/utils/menuOperate';
import StationControlConvert from './menuDialog/stationControlConvert';
import TrainAdd from './menuDialog/trainAdd';
import TrainTranstalet from './menuDialog/trainTranstalet';
import TrainDelete from './menuDialog/trainDelete';
import PasswordBox from './menuDialog/passwordBox';
import ViewName from './menuDialog/viewName';
import ManageUser from './menuDialog/manageUser';
import HelpAbout from './menuDialog/helpAbout';
import SetLimitSpeed from './menuDialog/setLimitSpeed';
import TrainFixedPathPane from './menuDialog/trainFixedPathPane';
import { EventBus } from '@/scripts/event-bus';
export default {
name: 'DispatchWorkMenuBar',
components: {
MenuBar,
StationControlConvert,
PasswordBox,
ViewName,
TrainAdd,
TrainTranstalet,
TrainDelete,
ManageUser,
HelpAbout,
SetLimitSpeed,
TrainFixedPathPane
},
props: {
dateString: {
type: String,
default: () => {
return '';
}
}
},
data() {
return {
menuNormal: [
{
title: '登录(L)',
operate: '',
children: []
},
{
title: '应用程序(T)',
operate: '',
children: []
}
]
};
},
computed: {
...mapGetters('map', [
'stationList'
])
},
created() {
},
methods: {
initStationList() {
const list = [];
this.stationList.forEach(station => {
if (station.visible) {
const node = {
title: station.name,
operate: station.code,
show: true,
click: this.mapLocation,
code: station.code
};
list.push(node);
}
});
return list;
},
//
mapLocation(code) {
if (code) {
this.$store.dispatch('training/updateOffsetStationCode', { offsetStationCode: code });
}
},
//
about(order) {
const operate = {
operation: order.operate
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.helpAbout.doShow(operate);
}
});
},
getLoginResult(operate) {
/** 密码校验*/
if (operate.operation == OperationEvent.StationControl.forcedStationControl.passwordConfirm.operation) {
if (operate.success) {
/** 校验成功*/
this.$refs.stationControlConvert.doShow({ operation: OperationEvent.StationControl.forcedStationControl.mbar.operation });
}
}
},
setLimitSpeed(order) {
const operate = {
operation: order.operate
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.setLimitSpeed.doShow(operate, true);
}
});
},
blankClickClose() {
this.$refs.menuBar.doClose();
},
cancleLimitSpeed(order) {
const operate = {
operation: order.operate
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.setLimitSpeed.doShow(operate, false);
}
});
},
updateTrainFixedPath() {
const stationCode = this.$store.state.training.roleDeviceCode;
commitOperate(menuOperate.CTC.updateTrainFixedPath2Station, { stationCode: stationCode }, 3).then(({valid, response}) => {
if (valid) {
this.$nextTick(function () {
this.$store.dispatch('training/emitTipFresh');
});
}
});
},
trainFixedPathPane() {
const stationCode = this.$store.state.training.roleDeviceCode;
this.$refs.trainFixedPathPane.doShow(stationCode);
},
bottomTableShowOrHidden() {
EventBus.$emit('bottomTableShowOrHidden');
},
undeveloped() {
this.$refs.menuBar.doClose();
this.$alert('实现中......', '提示', {
confirmButtonText: '确定',
callback: action => {
}
});
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss">
#menuBarChengdu3{
line-height:30px;
}
#menuBarChengdu3 #menuBar .menu-li-block .label{
padding: 0px 30px 0px 5px !important;
}
.img-box{
width: 20px;
height: 20px;
margin-top: 30px;
}
</style>

View File

@ -50,9 +50,6 @@
</div> </div>
</div> </div>
<div v-if="$store.state.training.prdType == '01'&& !isCtc" class="simulationDeviceInfo" /> <div v-if="$store.state.training.prdType == '01'&& !isCtc" class="simulationDeviceInfo" />
<!-- <div v-if="!isCtc && isDispStation" class="goDispatcherLoger">
<el-button size="small" @click="goDispatcherLoger">行车日志</el-button>
</div> -->
<menu-button v-if="!isCtc" ref="menuButton" :selected="selected" /> <menu-button v-if="!isCtc" ref="menuButton" :selected="selected" />
<menu-button-ctc v-if="isCtc" ref="menuButtonCtc" :selected="selected" /> <menu-button-ctc v-if="isCtc" ref="menuButtonCtc" :selected="selected" />
<menu-station-stand ref="menuStationStand" :selected="selected" /> <menu-station-stand ref="menuStationStand" :selected="selected" />
@ -92,7 +89,6 @@ import MenuButtonCtc from './menuButtonCtc';
import RunplanPane from './runplanPane'; import RunplanPane from './runplanPane';
import StageRunplan from './dialog/stageRunplan'; import StageRunplan from './dialog/stageRunplan';
import NoticeInfo from '@/jmapNew/theme/components/menus/childDialog/noticeInfo'; import NoticeInfo from '@/jmapNew/theme/components/menus/childDialog/noticeInfo';
// import DispatcherLoger from './dispatcherLoger';
import PassiveAlarm from './passiveDialog/alarm'; import PassiveAlarm from './passiveDialog/alarm';
import PassiveContorl from '@/jmapNew/theme/components/menus/passiveDialog/control'; import PassiveContorl from '@/jmapNew/theme/components/menus/passiveDialog/control';
import PassiveTimeout from './passiveDialog/timeout'; import PassiveTimeout from './passiveDialog/timeout';

View File

@ -1,355 +0,0 @@
<template>
<div class="menus" :style="{width: width + 'px'}">
<menu-bar ref="menuBar" :selected="selected" />
<menu-deplot-button ref="menuDeplotButton" />
<menu-station-stand ref="menuStationStand" :selected="selected" />
<menu-switch ref="menuSwitch" :selected="selected" />
<menu-signal ref="menuSignal" :selected="selected" />
<menu-section ref="menuSection" :selected="selected" />
<menu-train ref="menuTrain" :selected="selected" />
<menu-station ref="menuStation" :selected="selected" />
<passive-alarm ref="passiveAlarm" />
<passive-contorl ref="passiveControl" pop-class="fuzhou-01__systerm" />
<passive-Timeout ref="passiveTimeout" />
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import MenuDeplotButton from './menuDeplotButton';
import MenuSignal from './menuSignal';
import MenuStationStand from './menuStationStand';
import MenuSwitch from './menuSwitch';
import MenuSection from './menuSection';
import MenuTrain from './menuTrain';
import MenuStation from './menuStation';
import MenuBar from './menuBar';
import PassiveAlarm from './passiveDialog/alarm';
import PassiveContorl from '@/jmapNew/theme/components/menus/passiveDialog/control';
import PassiveTimeout from './passiveDialog/timeout';
export default {
name: 'Menus',
components: {
MenuBar,
MenuDeplotButton,
MenuSignal,
MenuSwitch,
MenuSection,
MenuStationStand,
MenuStation,
MenuTrain,
PassiveAlarm,
PassiveContorl,
PassiveTimeout
},
props: {
selected: {
type: Object,
default() {
return null;
}
}
},
computed: {
...mapGetters('config', [
'width'
])
},
watch: {},
mounted() {
this.$nextTick(() => {
this.$store.dispatch('config/updateMenuBar');
const _that = this;
window.onclick = function (e) {
if (!_that.$store.state.training.trainingStart) {
_that.$refs.menuBar && _that.$refs.menuBar.blankClickClose();
}
_that.$refs.menuStationStand.doClose();
_that.$refs.menuSwitch.doClose();
_that.$refs.menuSignal.doClose();
_that.$refs.menuSection.doClose();
_that.$refs.menuTrain.doClose();
_that.$refs.menuStation.doClose();
};
});
},
beforeDestroy() {
window.onclick = function (e) {};
}
};
</script>
<style>
.menus .pop-menu {
background: #F0F0F0;
}
.menus .pop-menu span {
color: #000;
}
.menus .pop-menu .is-disabled span {
color: #B4B3B8;
}
.fuzhou-01__systerm {
overflow: hidden !important;
}
.fuzhou-01__systerm .el-dialog {
background: rgba(100, 100, 100, 0.3);
border: 2px solid rgb(144, 144, 144, 0.8);
border-radius: 6px;
color: #000;
font-size: 14px;
}
.fuzhou-01__systerm .el-dialog .el-dialog__header {
padding: 5px;
height: 26px;
}
.fuzhou-01__systerm .el-dialog .el-dialog__footer {
background: #F0F0F0;
opacity: 1;
}
.fuzhou-01__systerm .el-dialog .el-dialog__body {
padding-top: 10px;
padding-bottom: 10px;
padding-left: 5px;
padding-right: 5px;
margin: 0px 5px 5px;
border: 2px solid rgba(120, 121, 123, 0.5);
box-shadow: 1px hsla(240, 0%, 100%, 0.5) inset;
background: #F0F0F0;
opacity: 1;
}
.fuzhou-01__systerm .el-dialog .el-dialog__title {
position: absolute;
top: 4px;
color: #000;
border-radius: 4px;
padding: 0px 2px;
height: 20px;
line-height: 20px
}
.fuzhou-01__systerm .el-dialog .el-dialog__title::before {
content: '';
position: absolute;
top: 0;
left: 0;
-webkit-filter: blur(10px);
filter: blur(10px);
height: 20px;
width: -webkit-fill-available;
background: rgba(128, 128, 128, 0.8);
z-index: -1;
}
.fuzhou-01__systerm .el-dialog .el-dialog__headerbtn {
background: linear-gradient(#CD98A0, #C27D6E, #B63022, #C68770);
border: 1px solid #fff;
border-radius: 4px;
top: 4px;
right: 5px;
line-height: 16px;
}
.fuzhou-01__systerm .el-dialog .el-dialog__headerbtn .el-icon-close:before {
font-size: 16px;
}
.fuzhou-01__systerm .el-dialog .el-dialog__headerbtn .el-dialog__close {
color: #fff;
}
.fuzhou-01__systerm .el-dialog .el-button {
height: 32px;
line-height: 32px;
padding: 0px;
width: 80px;
border: 2px outset #E2E2E2;
border-radius: 0px !important;
color: #000;
background: #F0F0F0;
}
.fuzhou-01__systerm .el-dialog .el-button:focus span {
border: 1px dashed gray;
}
.fuzhou-01__systerm .el-dialog .el-button:active {
border: 2px inset #E2E2E2;
}
.fuzhou-01__systerm .el-dialog .el-button:disabled {
border: 2px inset #E2E2E2;
}
.fuzhou-01__systerm .el-dialog .el-button:disabled span {
border: 0px;
}
.fuzhou-01__systerm .el-dialog .el-input {
border: 2px inset #E9E9E9;
}
.fuzhou-01__systerm .el-dialog .el-input .el-input__inner {
color: #000;
background: #fff !important;
border: 0px;
border-radius: 0px !important;
box-sizing: border-box;
}
.fuzhou-01__systerm .el-dialog .el-input.is-disabled .el-input__inner {
background: #F0F0F0 !important;
}
.fuzhou-01__systerm .el-dialog .el-textarea {
border: 2px inset #E9E9E9;
border-radius: 0px;
}
.fuzhou-01__systerm .el-dialog .el-textarea .el-textarea__inner {
color: #000;
background: #fff !important;
border: 0px;
border-radius: 0px !important;
box-sizing: border-box;
}
.fuzhou-01__systerm .el-dialog .el-textarea.is-disabled .el-textarea__inner {
background: #F0F0F0 !important;
}
.fuzhou-01__systerm .el-dialog .el-table {
border: 2px inset #E9E9E9;
color: #000 !important;
}
.fuzhou-01__systerm .el-dialog .el-table .cell {
line-height: unset !important;
}
.fuzhou-01__systerm .el-dialog .el-table th.is-leaf {
background: #F0F0F0 !important;
border-right: 1px solid #BDBDBD !important;
border-bottom: 1px solid #BDBDBD !important;
color: #000 !important;
height: 20px !important;
padding: 0px;
}
.fuzhou-01__systerm .el-dialog .el-table tr td {
height: 20px !important;
padding: 0px;
}
.fuzhou-01__systerm .el-dialog .el-table .el-table__empty-text {
top: 15px !important;
}
.fuzhou-01__systerm .el-dialog .current-row>td {
background: #3399FF !important;
color: #fff !important;
}
.fuzhou-01__systerm .el-dialog .el-checkbox__inner {
border: 1px inset #dcdfe6 !important;
}
.fuzhou-01__systerm .el-dialog .el-checkbox__label {
color: #000 !important;
}
.fuzhou-01__systerm .el-dialog .el-checkbox.is-disabled .el-checkbox__inner {
background: #E6E6E6 !important;
}
.fuzhou-01__systerm .el-dialog .el-checkbox.is-disabled .el-checkbox__label {
color: #C5C9CC !important;
}
.fuzhou-01__systerm .el-dialog .el-checkbox__input.is-checked .el-checkbox__inner {
background: #fff !important;
border: 1px inset #dcdfe6 !important;
}
.fuzhou-01__systerm .el-dialog .el-checkbox__input.is-checked .el-checkbox__inner::after {
position: absolute;
-webkit-box-sizing: content-box;
box-sizing: content-box;
content: "";
border: 1px solid #000;
border-left: 0;
border-top: 0;
height: 7px;
left: 4px;
top: 1px;
}
.fuzhou-01__systerm .el-dialog .el-radio__inner {
border: 1px inset #dcdfe6 !important;
}
.fuzhou-01__systerm .el-dialog .el-radio__label {
color: #000 !important;
}
.fuzhou-01__systerm .el-dialog .el-radio__input.is-checked .el-radio__inner {
background: #fff !important;
border: 1px inset #dcdfe6 !important;
}
.fuzhou-01__systerm .el-dialog .el-radio__input.is-checked .el-radio__inner::after {
width: 4px;
height: 4px;
border-radius: 100%;
background-color: #000 !important;
position: absolute;
left: 50%;
top: 50%;
}
.fuzhou-01__systerm .el-dialog .el-radio.is-disabled .el-radio__inner {
background: #E6E6E6 !important;
}
.fuzhou-01__systerm .el-dialog .el-radio.is-disabled .el-radio__label {
color: #C5C9CC !important;
}
.fuzhou-01__systerm .el-dialog .base-label {
background: rgb(240 240 240);
position: relative;
}
.fuzhou-01__systerm .el-dialog .el-form-item label {
font-weight: normal !important;
color: #000 !important;
}
.fuzhou-01__systerm .el-dialog .context {
height: 100px;
border: 2px inset #E2E2E2;
overflow-y: scroll;
}
.fuzhou-01__systerm .el-dialog .table {
margin-top: 10px;
}
.fuzhou-01__systerm .el-dialog .notice {
margin-left: 62px;
line-height: 30px;
}
.fuzhou-01__systerm .el-dialog .button-group {
margin-top: 10px;
}
</style>

View File

@ -1,496 +0,0 @@
<template>
<div id="menuBarFuzhou">
<menu-bar ref="menuBar" :menu-normal="menuNormal" style="width:100%" />
<station-control-convert ref="stationControlConvert" pop-class="fuzhou-01__systerm" />
<password-box ref="passwordBox" @setLoginResult="getLoginResult" />
<view-train-id ref="viewTrainId" />
<view-name ref="viewName" />
<view-device ref="viewDevice" />
<!-- <train-add ref="trainAdd" /> -->
<train-transtalet ref="trainTranstalet" />
<!-- <train-delete ref="trainDelete" /> -->
<add-runplan-line ref="addRunplanLine" />
<delete-runplan-line ref="deleteRunplanLine" />
<manage-user ref="manageUser" />
<help-about ref="helpAbout" />
</div>
</template>
<script>
// import { mapGetters } from 'vuex';
import { OperationEvent } from '@/scripts/cmdPlugin/OperationHandler.js';
import MenuBar from '@/jmapNew/theme/components/menus/menuBar';
import StationControlConvert from './menuDialog/stationControlConvert';
// import TrainAdd from './menuDialog/trainAdd';
import TrainTranstalet from './menuDialog/trainTranstalet';
// import TrainDelete from './menuDialog/trainDelete';
import AddRunplanLine from './menuDialog/addRunplanLine';
import DeleteRunplanLine from './menuDialog/deleteRunplanLine';
import PasswordBox from './menuDialog/passwordBox';
import ViewTrainId from './menuDialog/viewTrainId';
import ViewName from './menuDialog/viewName';
import ViewDevice from './menuDialog/viewDevice';
import ManageUser from './menuDialog/manageUser';
import HelpAbout from './menuDialog/helpAbout';
import { EventBus } from '@/scripts/event-bus';
export default {
name: 'MenuBarFuzhou',
components: {
MenuBar,
StationControlConvert,
PasswordBox,
ViewTrainId,
ViewName,
ViewDevice,
// TrainAdd,
TrainTranstalet,
// TrainDelete,
AddRunplanLine,
DeleteRunplanLine,
ManageUser,
HelpAbout
},
data() {
return {
menuNormal: {
Local: [
{
title: this.$t('menu.menuBar.system'),
operate: OperationEvent.Command.mBar.system,
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.view'),
operate: OperationEvent.Command.mBar.check,
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.refresh'),
operate: OperationEvent.Command.mBar.fresh,
click: this.refresh,
children: [
]
},
{
title: this.$t('menu.menuBar.display'),
operate: OperationEvent.Command.mBar.view,
children: [
{
title: this.$t('menu.menuBar.setTrainIdDisplay'),
click: this.setTrainIdDisplay,
operate: OperationEvent.Command.view.setTrainIdDisplay
},
{
title: this.$t('menu.menuBar.setNameDisplay'),
click: this.setNameDisplay,
operate: OperationEvent.Command.view.setNameDisplay
},
{
title: this.$t('menu.menuBar.setDeviceDisplay'),
click: this.setDeviceDisplay,
operate: OperationEvent.Command.view.setDeviceDisplay
}
]
},
{
title: this.$t('menu.menuBar.stationMapSwitch'),
operate: '',
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.controlModeSwitch'),
operate: OperationEvent.Command.mBar.remoteControl,
children: [
{
title: this.$t('menu.menuBar.toStationControl'),
click: this.turnToStationControl,
operate: OperationEvent.StationControl.requestStationControl.mbar
},
{
title: this.$t('menu.menuBar.forcedStationControl'),
click: this.mandatoryStationControl,
operate: OperationEvent.StationControl.forcedStationControl.password
},
{
title: this.$t('menu.menuBar.toCentralControl'),
click: this.conterStationControl,
operate: OperationEvent.StationControl.requestCentralControl.mbar,
force: true
}
]
},
{
title: this.$t('menu.menuBar.requestOperationArea'),
operate: OperationEvent.Command.mBar.requestZone,
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.historyQuery'),
operate: OperationEvent.Command.mBar.historyQuery,
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.userManage'),
operate: OperationEvent.Command.mBar.userManage,
children: [
{
title: this.$t('menu.menuBar.userManage'),
click: this.userManage,
operate: OperationEvent.Command.manage.userManage
}
]
},
{
title: this.$t('menu.menuBar.help'),
operate: OperationEvent.Command.mBar.help,
children: [
{
title: this.$t('menu.menuBar.about'),
click: this.about,
operate: OperationEvent.Command.help.about
}
]
}
],
Center: [
{
title: this.$t('menu.menuBar.system'),
operate: OperationEvent.Command.mBar.system,
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.view'),
operate: OperationEvent.Command.mBar.check,
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.refresh'),
operate: OperationEvent.Command.mBar.fresh,
click: this.refresh,
children: [
]
},
{
title: this.$t('menu.menuBar.display'),
operate: OperationEvent.Command.mBar.view,
children: [
{
title: this.$t('menu.menuBar.setTrainIdDisplay'),
click: this.setTrainIdDisplay,
operate: OperationEvent.Command.view.setTrainIdDisplay
},
{
title: this.$t('menu.menuBar.setNameDisplay'),
click: this.setNameDisplay,
operate: OperationEvent.Command.view.setNameDisplay
},
{
title: this.$t('menu.menuBar.setDeviceDisplay'),
click: this.setDeviceDisplay,
operate: OperationEvent.Command.view.setDeviceDisplay
}
]
},
{
title: this.$t('menu.menuBar.stationMapSwitch'),
operate: '',
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.planCarOperation'),
operate: OperationEvent.Command.mBar.planTrain,
children: [
{
title: this.$t('menu.menuBar.addPlanCar'),
click: this.addPlanTrain,
operate: OperationEvent.Command.planTrain.addPlanTrain
},
{
title: this.$t('menu.menuBar.panPlanCar'),
click: this.translatPlanTrain,
operate: OperationEvent.Command.planTrain.translatPlanTrain
},
{
title: this.$t('menu.menuBar.deletePlanCar'),
click: this.delPlanTrain,
operate: OperationEvent.Command.planTrain.delPlanTrain
}
]
},
{
title: this.$t('menu.menuBar.trainNumberMaintenance'),
operate: '',
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.controlModeSwitch'),
operate: OperationEvent.Command.mBar.remoteControl,
children: [
{
title: this.$t('menu.menuBar.toStationControl'),
click: this.turnToStationControl,
operate: OperationEvent.StationControl.requestStationControl.mbar,
force: true
},
{
title: this.$t('menu.menuBar.forcedStationControl'),
click: this.mandatoryStationControl,
operate: OperationEvent.StationControl.forcedStationControl.password,
force: true
},
{
title: this.$t('menu.menuBar.toCentralControl'),
click: this.conterStationControl,
operate: OperationEvent.StationControl.requestCentralControl.mbar
}
]
},
{
title: this.$t('menu.menuBar.requestOperationArea'),
operate: OperationEvent.Command.mBar.requestZone,
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.schedulingLog'),
operate: '',
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.systemAnalysis'),
operate: '',
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.userManage'),
operate: OperationEvent.Command.mBar.userManage,
children: [
{
title: this.$t('menu.menuBar.userManage'),
click: this.userManage,
operate: OperationEvent.Command.manage.userManage
}
]
},
{
title: this.$t('menu.menuBar.historyQuery'),
operate: OperationEvent.Command.mBar.historyQuery,
click: this.undeveloped,
children: [
]
},
{
title: this.$t('menu.menuBar.help'),
operate: OperationEvent.Command.mBar.help,
children: [
{
title: this.$t('menu.menuBar.about'),
click: this.about,
operate: OperationEvent.Command.help.about
}
]
}
]
}
};
},
// computed: {
// ...mapGetters('map', [
// 'stationList'
// ])
// },
methods: {
//
turnToStationControl(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.stationControlConvert.doShow(operate);
}
});
},
//
mandatoryStationControl(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.passwordBox.doShow(operate);
}
});
},
//
conterStationControl(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.stationControlConvert.doShow(operate);
}
});
},
//
setTrainIdDisplay(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.viewTrainId.doShow(operate);
}
});
},
//
setNameDisplay(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.viewName.doShow(operate);
}
});
},
//
setDeviceDisplay(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.viewDevice.doShow(operate);
}
});
},
//
addPlanTrain(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
// this.$refs.trainAdd.doShow(operate);
this.$refs.addRunplanLine.doShow(operate);
}
});
},
//
translatPlanTrain(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.trainTranstalet.doShow(operate);
}
});
},
//
delPlanTrain(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
// this.$refs.trainDelete.doShow(operate);
this.$refs.deleteRunplanLine.doShow(operate);
}
});
},
//
userManage(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.manageUser.doShow(operate);
}
});
},
//
about(order) {
const operate = {
operation: order.operation
};
this.$store.dispatch('training/nextNew', operate).then(({ valid }) => {
if (valid) {
this.$store.dispatch('menuOperation/handleBreakFlag', { break: true });
this.$refs.helpAbout.doShow(operate);
}
});
},
//
refresh() {
EventBus.$emit('refresh');
},
getLoginResult(operate) {
/** 密码校验*/
if (operate.operation == OperationEvent.StationControl.forcedStationControl.passwordConfirm.operation) {
if (operate.success) {
/** 校验成功*/
this.$refs.stationControlConvert.doShow({ operation: OperationEvent.StationControl.forcedStationControl.mbar.operation });
}
}
},
undeveloped() {
this.$refs.menuBar.doClose();
this.$alert(this.$t('menu.menuBar.implemented'), this.$t('global.tips'), {
confirmButtonText: this.$t('global.confirm'),
callback: action => {
}
});
},
blankClickClose() {
this.$refs.menuBar.doClose();
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss">
#menuBarFuzhou{
line-height:30px;
}
#menuBarChengdu3 #menuBar .menu-li-block .label{
padding: 0px 30px 0px 5px !important;
}
</style>

View File

@ -6,7 +6,7 @@ export default class Command {
this.isError = false; this.isError = false;
this.isOver = false; this.isOver = false;
} }
// 对比 参数列表
toFound(definition, wholeParam) { toFound(definition, wholeParam) {
this.id = definition.operate; this.id = definition.operate;
(definition.paramList || []).forEach(param => { (definition.paramList || []).forEach(param => {

View File

@ -154,6 +154,7 @@ class CommandHandle {
getCommand(cmdType, wholeParam) { getCommand(cmdType, wholeParam) {
if (cmdType) { if (cmdType) {
const command = new Command(); const command = new Command();
// 获取指令定义
const definition = this.getDefinition(cmdType); const definition = this.getDefinition(cmdType);
if (definition) { if (definition) {
command.toFound(definition, wholeParam); command.toFound(definition, wholeParam);

View File

@ -69,7 +69,7 @@ class Handler {
} }
}); });
} }
// 获取所有参数列表params
getWholeParam() { getWholeParam() {
const whole = {}; const whole = {};
(this.operations || {}).forEach(elem => { Object.assign(whole, elem.param || {}); }); (this.operations || {}).forEach(elem => { Object.assign(whole, elem.param || {}); });
@ -121,19 +121,19 @@ class Handler {
this.afterValid(operation, valid).then(()=>{ this.afterValid(operation, valid).then(()=>{
rtn.valid = valid; rtn.valid = valid;
if (operation.cmdType && valid) { if (operation.cmdType && valid) {
const command = this.getCommand(operation); // const command = this.getCommand(operation);
if (command) { // if (command) {
CommandHandler.execute(command.id, command.get()).then(response => { CommandHandler.execute(operation.cmdType.value, this.getWholeParam()).then(response => {
rtn.response = response; rtn.response = response;
resolve(rtn); resolve(rtn);
}).catch(error => { }).catch(error => {
console.error(error); console.error(error);
reject(error); reject(error);
}); });
} else { // } else {
rtn.response = '获取指令失败,暂无指令或参数传值不正确,请检查指令字典'; // rtn.response = '获取指令失败,暂无指令或参数传值不正确,请检查指令字典';
reject(rtn); // reject(rtn);
} // }
} else { } else {
resolve(rtn); resolve(rtn);
} }

View File

@ -3,8 +3,8 @@
<div :id="ibpId" v-loading="loading" :style="{ width: canvasWidth+'px', height: canvasHeight +'px',background:'#000' }" class="ibp-canvas" /> <div :id="ibpId" v-loading="loading" :style="{ width: canvasWidth+'px', height: canvasHeight +'px',background:'#000' }" class="ibp-canvas" />
<el-button-group class="ibp-button"> <el-button-group class="ibp-button">
<el-button v-if="moreScreen" type="primary" @click="switchOffset">切换</el-button> <el-button v-if="moreScreen" type="primary" @click="switchOffset">切换</el-button>
<el-button v-if="showBackButton" type="primary" @click="back">{{ $t('global.back') }}</el-button> <!-- <el-button v-if="showBackButton" type="primary" @click="back">{{ $t('global.back') }}</el-button>-->
<el-button v-if="$route.query.noPreLogout" type="primary" @click="quit">退出</el-button> <!-- <el-button v-if="$route.query.noPreLogout" type="primary" @click="quit">退出</el-button>-->
</el-button-group> </el-button-group>
<template v-for="alarm in alarmList"> <template v-for="alarm in alarmList">
@ -20,7 +20,6 @@ import Vue from 'vue';
import IbpPan from '@/ibp/ibpPan'; import IbpPan from '@/ibp/ibpPan';
import { parser } from '@/ibp/utils/parser'; import { parser } from '@/ibp/utils/parser';
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex';
import { exitFullscreen } from '@/utils/screen';
import { handleIbpPress, handleIbpRelease } from '@/api/simulation'; import { handleIbpPress, handleIbpRelease } from '@/api/simulation';
import { IbpOperation } from '@/scripts/ConstDic'; import { IbpOperation } from '@/scripts/ConstDic';
import { creatSubscribe, clearSubscribe, displayTopic} from '@/utils/stomp'; import { creatSubscribe, clearSubscribe, displayTopic} from '@/utils/stomp';
@ -293,22 +292,22 @@ export default {
const height = this.size ? this.size.height : this.$store.state.app.height; const height = this.size ? this.size.height : this.$store.state.app.height;
this.$store.dispatch('config/resize', { width: width, height: height }); this.$store.dispatch('config/resize', { width: width, height: height });
}, },
back() { // back() {
this.group = this.$route.query.group; // this.group = this.$route.query.group;
this.$store.dispatch('training/over').then(() => { // this.$store.dispatch('training/over').then(() => {
if (this.$route.query.projectDevice) { // if (this.$route.query.projectDevice) {
this.$store.dispatch('LogOut').then(() => { // this.$store.dispatch('LogOut').then(() => {
location.reload(); // location.reload();
}); // });
} else { // } else {
history.go(-1); // history.go(-1);
exitFullscreen(); // exitFullscreen();
} // }
}); // });
}, // },
quit() { // quit() {
window.close(); // window.close();
}, // },
ibpDestroy() { ibpDestroy() {
if (this.$ibp) { if (this.$ibp) {
this.$ibp.dispose(); this.$ibp.dispose();

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="main"> <div class="main">
<el-row style="height: 100%;"> <el-row style="height: 100%;" class="dispatcher-cmd">
<el-col :span="5" style="height: 100%;"> <el-col :span="5" style="height: 100%;">
<div class="left"> <div class="left">
<el-tabs v-model="activeTab" type="border-card" @tab-click="tabClick"> <el-tabs v-model="activeTab" type="border-card" @tab-click="tabClick">
@ -1098,8 +1098,9 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
// .dispatcher-cmd{ .dispatcher-cmd{
// } background: #ECE9D8;
}
.main { .main {
height: 100%; height: 100%;
.left { .left {
@ -1208,14 +1209,195 @@ export default {
} }
} }
</style> </style>
<style> <style lang="scss">
.dispatcher-cmd .el-dialog .el-dialog__body {
padding: 5px !important;
}
.dispatcher-cmd .el-dialog {
margin-top: 8vh !important;
}
.dispatcher-cmd .el-tabs--border-card>.el-tabs__content { .dispatcher-cmd .el-tabs--border-card>.el-tabs__content {
padding: 5px !important; padding: 5px !important;
} }
.dispatcher-cmd span {
font-size: 13px !important;
line-height: 22px;
}
.dispatcher-cmd span .el-icon-arrow-up{
line-height: 18px;
}
.dispatcher-cmd .el-button {
height: 24px;
line-height: 22px;
padding: 0px;
width: 80px;
border: 2px outset #E2E2E2;
border-radius: 4px !important;
color: #000;
background: #F0F0F0;
}
.dispatcher-cmd .expand {
width: 120px;
}
.dispatcher-cmd .el-button:focus span {
border: 1px dashed gray;
}
.dispatcher-cmd .el-button:active {
border: 2px inset #E2E2E2;
}
.dispatcher-cmd .el-button:disabled {
border: 2px inset #E2E2E2;
}
.dispatcher-cmd .el-button:disabled span {
border: 0px;
}
.dispatcher-cmd .el-input {
border: 2px inset #E9E9E9;
height: 22px !important;
line-height: 22px !important;
}
.dispatcher-cmd .el-input__inner {
color: #000;
background: #fff !important;
border: 0px;
border-radius: 0px !important;
box-sizing: border-box;
height: 22px !important;
line-height: 22px !important;
}
.dispatcher-cmd .el-input.is-disabled .el-input__inner {
background: #F0F0F0 !important;
}
.dispatcher-cmd .el-textarea {
border: 2px inset #E9E9E9;
border-radius: 0px;
}
.dispatcher-cmd .el-textarea .el-textarea__inner {
color: #000;
background: #fff !important;
border: 0px;
border-radius: 0px !important;
box-sizing: border-box;
}
.dispatcher-cmd .el-textarea.is-disabled .el-textarea__inner {
background: #F0F0F0 !important;
}
.dispatcher-cmd .el-table--border th.gutter {
background: #EBEADB !important;
}
.dispatcher-cmd .el-table {
border: 2px inset #E9E9E9;
color: #000 !important;
}
.dispatcher-cmd .el-table .cell {
height: 22px;
line-height: 22px;
}
.dispatcher-cmd .el-table th.is-leaf {
background: #F0F0F0 !important;
border-right: 1px solid #BDBDBD !important;
border-bottom: 1px solid #BDBDBD !important;
color: #000 !important;
height: 20px !important;
padding: 0px;
}
.dispatcher-cmd .el-table tr td {
height: 20px !important;
padding: 0px;
}
.dispatcher-cmd .el-table .el-table__empty-text {
top: 15px !important;
}
.dispatcher-cmd .current-row>td {
background: #3399FF !important;
color: #fff !important;
}
.dispatcher-cmd .el-checkbox__inner {
border: 1px inset #dcdfe6 !important;
}
.dispatcher-cmd .el-checkbox__label {
color: #000 !important;
}
.dispatcher-cmd .el-checkbox.is-disabled .el-checkbox__inner {
background: #E6E6E6 !important;
}
.dispatcher-cmd .el-checkbox.is-disabled .el-checkbox__label {
color: #C5C9CC !important;
}
.dispatcher-cmd .el-checkbox__input.is-checked .el-checkbox__inner {
background: #fff !important;
border: 1px inset #dcdfe6 !important;
}
.dispatcher-cmd .el-checkbox__input.is-checked .el-checkbox__inner::after {
position: absolute;
-webkit-box-sizing: content-box;
box-sizing: content-box;
content: "";
border: 1px solid #000;
border-left: 0;
border-top: 0;
height: 7px;
left: 4px;
top: 1px;
}
.dispatcher-cmd .el-radio__inner {
border: 1px inset #dcdfe6 !important;
}
.dispatcher-cmd .el-radio__label {
color: #000 !important;
}
.dispatcher-cmd .el-radio__input.is-checked .el-radio__inner {
background: #fff !important;
border: 1px inset #dcdfe6 !important;
}
.dispatcher-cmd .el-radio__input.is-checked .el-radio__inner::after {
width: 4px;
height: 4px;
border-radius: 100%;
background-color: #000 !important;
position: absolute;
left: 50%;
top: 50%;
}
.dispatcher-cmd .el-radio.is-disabled .el-radio__inner {
background: #E6E6E6 !important;
}
.dispatcher-cmd .el-radio.is-disabled .el-radio__label {
color: #C5C9CC !important;
}
.dispatcher-cmd .base-label {
background: rgba(0, 0, 0, 1);
position: relative;
left: -15px;
top: -18px;
}
.dispatcher-cmd .el-form-item label {
font-weight: normal !important;
color: #000 !important;
}
</style> </style>

View File

@ -0,0 +1,155 @@
<template>
<div class="dispatcher-station">
<div class="station-title">上海局CTC系统-行调台-控制工具条</div>
<div class="main">
<div class="menu-list">
<el-button v-for="(item, index) in menuList" :key="index" class="btn" type="text" @click="clickMenu(item.refPath)">{{ item.label }}</el-button>
</div>
<div class="btn-box">
<div v-for="(item, index) in buttonList" :key="index" class="btn-div" @click="doShow(item.refPath)">
<div class="img">
<el-image
style="width: 83px; height: 83px"
:src="item.imgUrl"
/>
</div>
<div class="text">{{ item.label }}</div>
</div>
</div>
</div>
</div>
</template>
<script>
import ZhanchangIcon from '@/assets/dispatcherStation/zhanchang.png';
import YunxingIcon from '@/assets/dispatcherStation/yunxing.png';
import CmdIcon from '@/assets/dispatcherStation/cmd.png';
export default {
name: 'DispatcherManage',
components: {
},
data() {
return {
stationCode:'',
groupModel: '',
hasUnsubscribe:false,
buttonList: [
{
label: '运行图',
refPath: 'schedulingPlan',
imgUrl: YunxingIcon
},
{
label: '调度命令',
refPath: 'dispatchingCommand',
imgUrl: CmdIcon
},
{
label: '站场图',
refPath: 'dispatchWork',
imgUrl: ZhanchangIcon
},
{
label: '数据更新',
refPath: '',
imgUrl: CmdIcon
},
{
label: '时间同步',
refPath: '',
imgUrl: CmdIcon
}
],
menuList: [
{
label: '登录(L)',
refPath: ''
},
{
label: '应用程序(T)',
refPath: ''
}
]
};
},
computed: {
group() {
return this.$route.query.group;
}
},
mounted() {
this.groupModel = this.$route.query.group;
},
methods: {
doShow(refPath) {
if (!refPath) {
this.$alert('实现中......', '提示', {
confirmButtonText: '确定',
callback: action => {
}
});
return;
} else {
this.$emit('loadingChange');
setTimeout(() => {
this.$emit('pictureChange', refPath);
}, 100);
}
},
clickMenu(refPath) {
this.$alert('实现中......', '提示', {
confirmButtonText: '确定',
callback: action => {
}
});
}
}
};
</script>
<style lang="scss" scoped>
.dispatcher-station{
height: 100%;
width: 100%;
overflow: hidden;
background: #E1EDF9;
.station-title {
height: 30px;
padding: 0 10px;
line-height: 30px;
width: 100%;
}
.main {
margin: 5px;
height: calc(100% - 40px);
border: 1px solid #000;
background: #C0C0C0;
.menu-list {
width: 100%;
padding-left: 50px;
background: #D9DFF0;
.el-button {
padding: 5px;
}
}
.btn-box {
height: 100%;
border-top: 2px solid #808080;
display: flex;
justify-content: space-around;
padding: 20px 10px;
.btn-div {
width: 120px;
height: 100px;
text-align: center;
.text {
font-weight: bold;
text-align: center;
}
&:hover {
cursor: pointer;
}
}
}
}
}
</style>

View File

@ -13,10 +13,19 @@
<dispatch-cmd v-else-if="picture === 'dispatchingCommand'" ref="dispatchCmd" /> <dispatch-cmd v-else-if="picture === 'dispatchingCommand'" ref="dispatchCmd" />
<dispatcher-loger v-else-if="picture === 'schedulingPlan'" ref="dispatcherLoger" /> <dispatcher-loger v-else-if="picture === 'schedulingPlan'" ref="dispatcherLoger" />
<!-- 大客流策略 --> <!-- 大客流策略 -->
<psl-terminal v-else-if="picture === 'psl'" ref="pslTerminal" />
<large-passenger-strategy v-else-if="picture === 'largePassengerStrategy'" ref="largePassengerStrategy" /> <large-passenger-strategy v-else-if="picture === 'largePassengerStrategy'" ref="largePassengerStrategy" />
<large-passenger-view v-else-if="picture === 'largePassengerView'" ref="largePassengerView" /> <large-passenger-view v-else-if="picture === 'largePassengerView'" ref="largePassengerView" />
<terminal-menu v-if="menuShow" ref="terminalMenu" @pictureChange="pictureChange" @popupTerminalShow="popupTerminalShow" @loadingChange="loadingChange" /> <terminal-menu v-if="menuShow" ref="terminalMenu" @pictureChange="pictureChange" @popupTerminalShow="popupTerminalShow" @loadingChange="loadingChange" />
<dispatcher-manage v-else-if="picture === 'dispatcherManage'" ref="dispatcherManage" @pictureChange="pictureChange" @loadingChange="loadingChange" />
<terminal-menu
v-if="menuShow"
ref="terminalMenu"
:picture="picture"
@pictureChange="pictureChange"
@loadingChange="loadingChange"
/>
</div> </div>
</template> </template>
@ -38,6 +47,8 @@ import IbpPlate from '@/views/ibp/ibpsystem/index';
import TrafficTerminalWork from './trafficTerminalWork'; import TrafficTerminalWork from './trafficTerminalWork';
import BigTrainRunplanManage from '@/views/bigTrainRunplanManage/index'; import BigTrainRunplanManage from '@/views/bigTrainRunplanManage/index';
import IscsSystem from '@/views/iscs/iscsSystemNew/index'; import IscsSystem from '@/views/iscs/iscsSystemNew/index';
import PslTerminal from './psl';
import DispatcherManage from './dispatcherManage';
import LargePassengerStrategy from './largePassengerStrategy'; import LargePassengerStrategy from './largePassengerStrategy';
import LargePassengerView from './largePassengerView'; import LargePassengerView from './largePassengerView';
@ -58,7 +69,9 @@ export default {
BigTrainRunplanManage, BigTrainRunplanManage,
IscsSystem, IscsSystem,
LargePassengerStrategy, LargePassengerStrategy,
LargePassengerView LargePassengerView,
PslTerminal,
DispatcherManage
}, },
data() { data() {
return { return {
@ -132,7 +145,7 @@ export default {
const header = {group: this.group || '', 'X-Token': getToken()}; const header = {group: this.group || '', 'X-Token': getToken()};
await creatSubscribe(`${displayTopic}\/${this.group}`, header, defaultCallback); await creatSubscribe(`${displayTopic}\/${this.group}`, header, defaultCallback);
await creatSubscribe(getTopic('STATE', this.group), header, stateCallback); await creatSubscribe(getTopic('STATE', this.group), header, stateCallback);
if (this.picture === 'ctc') { if (this.picture === 'trafficTerminal') {
await creatSubscribe(getTopic('CTC', this.group), header, defaultCallback); await creatSubscribe(getTopic('CTC', this.group), header, defaultCallback);
} }
await this.$store.dispatch('training/setHasSubscribed'); await this.$store.dispatch('training/setHasSubscribed');
@ -140,7 +153,7 @@ export default {
clearSubscribe() { clearSubscribe() {
clearSubscribe(`${displayTopic}\/${this.group}`); clearSubscribe(`${displayTopic}\/${this.group}`);
clearSubscribe(getTopic('STATE', this.group)); clearSubscribe(getTopic('STATE', this.group));
if (this.picture === 'ctc') { if (this.picture === 'trafficTerminal') {
clearSubscribe(getTopic('CTC', this.group)); clearSubscribe(getTopic('CTC', this.group));
} }
}, },

View File

@ -0,0 +1,218 @@
<template>
<div style="background: #939FAC;width: 100%;height: 100%">
<div style="width: 50%;position: relative;left: 25%;">
<div class="psl-title">
<div>PSL</div>
<el-select v-model="standCode" style="margin-left: 10px;">
<el-option
v-for="item in standList"
:key="item.code"
:label="item.name"
:value="item.code"
/>
</el-select>
</div>
<div class="psl-content">
<div class="content-row">
<div class="cell btn">
<div class="btn-text">所有滑动门/应急门关闭且锁紧指示灯</div>
<img :src="getIcon('top', indicators.qbgmLight ? 'on' : 'off')">
</div>
</div>
<div class="content-row">
<div class="cell">
<div class="btn-text">PSL操作指示灯</div>
<img :src="getIcon('red', indicators.pslczLight ? 'on' : 'off')">
</div>
<div class="cell">
<div class="btn-text">互锁解除指示灯</div>
<img :src="getIcon('red', indicators.hsjcLight ? 'on' : 'off')">
</div>
</div>
<div class="content-row">
<div class="cell">
<div class="btn-text">开门状态指示灯</div>
<img :src="getIcon('red', indicators.kmLight ? 'on' : 'off')">
</div>
<div class="cell">
<div class="btn-text">关门状态指示灯</div>
<img :src="getIcon('green', indicators.gmLight ? 'on' : 'off')">
</div>
</div>
<div class="content-row">
<div class="cell btn">
<div class="btn-text">禁止</div>
<img
:src="getIcon('key')"
:class="['key', { 'key-on': indicators.yxjzKey }]"
@click="btnClickHandler('YXJZ')"
>
<div class="btn-text-opt">允许</div>
</div>
<div class="cell btn">
<div class="btn-text">禁止</div>
<img
:src="getIcon('key')"
:class="['key', { 'key-on': indicators.hsjcKey }]"
@click="btnClickHandler('HSJC')"
>
<div class="btn-text-opt">互锁解除</div>
</div>
</div>
<div class="content-row">
<div class="cell btn">
<div class="btn-text">开门按钮</div>
<img :src="getIcon('red', 'btn')" @click="btnClickHandler('KM')">
</div>
<div class="cell btn">
<div class="btn-text">关门按钮</div>
<img :src="getIcon('green', 'btn')" @click="btnClickHandler('GM')">
</div>
</div>
<div class="content-row">
<div class="cell btn">
<div class="btn-text">试灯按钮</div>
<img
class="btn-sd btn-img"
:src="getIcon('green', 'btn')"
@mousedown.left="btnClickHandler('SD')"
@mouseup.left="btnClickHandler('SD')"
>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import icons from '@/assets/psl_images/psl_icons';
import { getPslStatus, pressPslButton } from '@/api/simulation';
import {mapGetters} from 'vuex';
export default {
name: 'PSL',
data() {
return {
indicators: {
qbgmLight: true,
pslczLight: false,
hsjcLight: false,
kmLight: false,
gmLight: false,
yxjzKey: false,
hsjcKey: false
},
standCode: '',
standList: []
};
},
computed: {
...mapGetters('map', [
'stationStandList'
]),
group() {
return this.$route.query.group;
}
},
watch: {
'$store.state.socket.simulationPslStatus': function(val) {
if (val && val[this.standCode]) {
Object.assign(this.indicators, val[this.standCode]);
}
}
},
mounted() {
const stationCode = this.$store.state.training.roleDeviceCode;
this.standCode = '';
this.standList = [];
this.stationStandList.forEach(stand => {
if (stand.stationCode === stationCode) {
let dir = '';
if (this.$store.state.map.mapConfig.upRight) {
dir = stand.right ? '上行' : '下行';
} else {
dir = stand.right ? '下行' : '上行';
}
this.standList.push({ code: stand.code, name: dir + '-' + stand.name });
}
});
this.standCode = this.standList[0].code;
},
methods: {
doShow(selected) {
this.dialogShow = true;
this.$nextTick(function() {
this.$store.dispatch('training/emitTipFresh');
});
this.standCode = selected.code;
this.initData(this.group, selected.code);
},
initData(group, standCode) {
getPslStatus(group, standCode)
.then(resp => {
if (resp.data) {
this.indicators = resp.data;
}
})
.catch(err => {});
},
doClose() {
this.loading = false;
this.dialogShow = false;
this.$store.dispatch('training/emitTipFresh');
},
getIcon(type, status) {
return status !== undefined ? icons[`${type}_${status}`] : icons[type];
},
btnClickHandler(btnType) {
pressPslButton(this.group, this.standCode, btnType);
}
}
};
</script>
<style lang="scss" scoped>
.psl-title {
display: flex;
justify-content: center;
color: #fff;
font-size: 50px;
padding: 50px;
align-items: center;
}
.btn-text {
color: #fff;
}
.psl-content {
.content-row {
display: flex;
justify-content: space-evenly;
.cell {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
width: 120px;
height: 100px;
.key {
transition: 0.1s;
}
.key-on {
transform: rotate(90deg);
}
.btn-text-opt {
position: absolute;
left: 80%;
top: 35%;
width: 100%;
color: #fff;
}
}
.btn {
cursor: pointer;
}
}
}
</style>

View File

@ -1,19 +1,24 @@
<template> <template>
<div> <div>
<div v-if="isShow" class="terminalList"> <div v-if="isShow" class="terminalList">
<div v-for="(eachTerminal,index) in terminalList" :key="index" :class="active==eachTerminal.code?'eachTerminal active':'eachTerminal'" @click="eachTerminal.click(eachTerminal.code)">{{ eachTerminal.name }}</div> <div v-for="(eachTerminal,index) in terminalList" :key="index" :class="picture==eachTerminal.code?'eachTerminal active':'eachTerminal'" @click="eachTerminal.click(eachTerminal.code)">{{ eachTerminal.name }}</div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
export default { export default {
name:'TerminalList', name:'TerminalList',
components: { props: {
picture: {
type: String,
default() {
return 'localWork';
}
}
}, },
data() { data() {
return { return {
terminalList:[], terminalList:[],
active:'localWork',
centralizedStationList: [], centralizedStationList: [],
centralizedStationMap: {}, centralizedStationMap: {},
commonTerminal: [ commonTerminal: [
@ -33,6 +38,12 @@ export default {
], ],
terminalMap:{ terminalMap:{
'datie': [ 'datie': [
{
name: '行调台',
code: 'dispatcherManage',
roleList: ['DISPATCHER'],
click: this.changePictureShow
},
{ {
name: '车务终端', name: '车务终端',
code: 'trafficTerminal', code: 'trafficTerminal',
@ -107,6 +118,12 @@ export default {
code: 'largePassengerView', code: 'largePassengerView',
roleList: ['DISPATCHER'], roleList: ['DISPATCHER'],
click: this.changePictureShow click: this.changePictureShow
},
{
name: 'PSL',
code: 'psl',
roleList: ['STATION_SUPERVISOR'],
click: this.changePictureShow
} }
] ]
} }
@ -153,14 +170,7 @@ export default {
}); });
}, },
noEvent(code) { noEvent(code) {
this.active = code; this.$emit('pictureChange', code);
},
schedulingPlan(code) {
this.active = code;
this.$emit('popupTerminalShow', 'dispatcherLoger');
},
close() {
this.active = 0;
}, },
initPictureShow() { initPictureShow() {
const localWorkRoleList = ['STATION_SUPERVISOR', 'STATION_ASSISTANT', 'STATION_MASTER', 'STATION_SIGNALER', 'STATION_PASSENGER', 'STATION_SWITCH_MAN', const localWorkRoleList = ['STATION_SUPERVISOR', 'STATION_ASSISTANT', 'STATION_MASTER', 'STATION_SIGNALER', 'STATION_PASSENGER', 'STATION_SWITCH_MAN',
@ -175,7 +185,6 @@ export default {
}, },
changePictureShow(code) { changePictureShow(code) {
this.active = code;
this.$emit('loadingChange'); this.$emit('loadingChange');
setTimeout(() => { setTimeout(() => {
this.$emit('pictureChange', code); this.$emit('pictureChange', code);