This commit is contained in:
ival 2019-08-21 15:01:13 +08:00
commit 1993de8548
27 changed files with 238 additions and 122 deletions

View File

@ -0,0 +1,10 @@
export default {
simulationSystem: 'Urban rail transit simulation system',
simulationSystemDescription: 'Based on the subway signal system, the urban rail transit simulation system is reformed for the training part, aiming to build a set of professional simulation system for driving demonstration. The system has high flexibility for future expansion and upgrading. Meanwhile, the simulation system has two modes of normal operation and fault operation. Besides normal functional operation, it can also conduct fault simulation of equipment.',
simulationName: 'Simulation name:',
noSimulationProducts: 'No simulation products',
productDescription: 'Product description:',
startSimulation: 'Start the simulation',
createRoom: 'Create a room',
enterRoom: 'Enter the room'
};

View File

@ -56,6 +56,7 @@ export default {
createOperateRuleFailed: 'Failed to create operation definition', createOperateRuleFailed: 'Failed to create operation definition',
createOperateStepFailed: 'The create action step failed', createOperateStepFailed: 'The create action step failed',
updateOperateStepFailed: 'The update action step failed', updateOperateStepFailed: 'The update action step failed',
packagePermissionFailed: 'Packaging authority failed' packagePermissionFailed: 'Packaging authority failed',
acquisitionTimeFailed: 'Acquisition Time Failed',
getProductListFailed: 'Failed to get product list'
}; };

View File

@ -99,5 +99,9 @@ export default {
minute: 'minute', minute: 'minute',
totoal: 'Totoal', totoal: 'Totoal',
publishPermission: 'The public authority', publishPermission: 'The public authority',
specialPermission: 'Special permission' specialPermission: 'Special permission',
mapList: 'Map list',
updateTime: 'Update time:',
line: 'Line:',
permissionList: 'Permissions list:'
}; };

View File

@ -14,6 +14,8 @@ import publish from './publish';
import permission from './permission'; import permission from './permission';
import replay from './replay'; import replay from './replay';
import planMonitor from './planMonitor'; import planMonitor from './planMonitor';
import screenMonitor from './screenMonitor';
import demonstration from './demonstration';
export default { export default {
...enLocale, ...enLocale,
@ -31,5 +33,7 @@ export default {
publish, publish,
permission, permission,
replay, replay,
planMonitor planMonitor,
screenMonitor,
demonstration
}; };

View File

@ -1,10 +1,6 @@
export default { export default {
line: 'Line',
turnoverTime: 'Update time',
permissionList: 'Permissions list',
buy: 'Buy', buy: 'Buy',
offlineMappingSoftware: 'Offline mapping software', offlineMappingSoftware: 'Offline mapping software',
lianPlanSystem: 'Urban rail transit lian planning system', lianPlanSystem: 'Urban rail transit lian planning system',
lianPlanDescription: 'Lian plan is a map compiling test system, can be real simulation to achieve the simulation of running test of new operation diagram, the system can realize editing operation diagram, import operation diagram and according to the standard of operation diagram simulation real driving environment, solve the problem that can not be updated for operation diagram test. It can find out the unreasonable places in the new diagram in time and make real-time adjustment on the diagram, so as to avoid the problem of finding problems in the operation of the new diagram and requiring manual intervention of dispatchers, and minimize the impact of the fault on the normal operation of subway.', lianPlanDescription: 'Lian plan is a map compiling test system, can be real simulation to achieve the simulation of running test of new operation diagram, the system can realize editing operation diagram, import operation diagram and according to the standard of operation diagram simulation real driving environment, solve the problem that can not be updated for operation diagram test. It can find out the unreasonable places in the new diagram in time and make real-time adjustment on the diagram, so as to avoid the problem of finding problems in the operation of the new diagram and requiring manual intervention of dispatchers, and minimize the impact of the fault on the normal operation of subway.',
mapList: 'Map list'
}; };

View File

@ -0,0 +1,6 @@
export default {
screenSystem: 'Large screen system of urban rail transit',
screenSystemDescription: 'Based on the subway signal system and real subway line data, the big screen system of urban rail transit aims to build a professional simulation system of driving demonstration. The system has high flexibility to switch line data freely.',
productTrialDuration: 'product Trial Duration',
aTSScreenSimulation: 'ATS line tuning center screen simulation'
};

View File

@ -9,6 +9,7 @@ export default {
hint: 'Tips', hint: 'Tips',
cancelledDelete: 'Cancelled delete', cancelledDelete: 'Cancelled delete',
cancelGeneration: 'Batch generation has been cancelled', cancelGeneration: 'Batch generation has been cancelled',
refreshFailure: 'Refresh failure',
updateSuccessfully: 'The update is successful', updateSuccessfully: 'The update is successful',
saveSuccessfully: 'Save success', saveSuccessfully: 'Save success',
@ -62,12 +63,13 @@ export default {
deleteProductSuccessfully: 'Product deleted successfully', deleteProductSuccessfully: 'Product deleted successfully',
deleteProductFailed: 'Product deletion failed', deleteProductFailed: 'Product deletion failed',
cannotDeleteProduct: 'The product has been used and cannot be deleted', cannotDeleteProduct: 'The product has been used and cannot be deleted',
productCodeExists: 'The product Code already exists',
narrowScope: 'You cannot narrow down the training list you created last time',
pathCreationSuccessful: 'Create road successfully!', pathCreationSuccessful: 'Create road successfully!',
createRoutingFailed: 'Failed to create junction', createRoutingFailed: 'Failed to create junction',
pathUpdataSuccessful: 'Road update successful!', pathUpdataSuccessful: 'Road update successful!',
pathUpdataFailed: 'Update traffic failed', pathUpdataFailed: 'Update traffic failed',
productCodeExists: 'The product Code already exists',
narrowScope: 'You cannot narrow down the training list you created last time',
failedLoadMap: 'Failed to load map data', failedLoadMap: 'Failed to load map data',
sectionPointsDeficiency: 'Segment coordinates missing', sectionPointsDeficiency: 'Segment coordinates missing',
@ -99,6 +101,11 @@ export default {
failedCourse: 'Failed to obtain course information', failedCourse: 'Failed to obtain course information',
createSimulationFaild: 'Failed to create simulation', createSimulationFaild: 'Failed to create simulation',
accessCourseNo: 'No access to this course, please go and buy it!' accessCourseNo: 'No access to this course, please go and buy it!',
failedSubmitOrder: 'Failed to submit order',
permissionsNumber: 'Please enter the number of valid permissions',
purchaseMonth: 'Please enter a valid purchase month',
createRoomFailedHint: 'Each user can only create one comprehensive drill room. Do you want to enter the room?',
noPermissionHint: 'You do not have permission, please go to purchase products'
}; };

View File

@ -0,0 +1,10 @@
export default {
simulationSystem: '城市轨道交通仿真系统',
simulationSystemDescription: '城市轨道交通仿真系统以各地铁信号系统为基础,针对培训部分进行改造,旨在构建一套用于行车演示的专业仿真模拟系统。该系统具有高灵活性以便于将来的扩展升级,同时,仿真系统具备正常操作及故障操作两种模式,除了正常的功能操作以外还可以进行设备的故障模拟。',
simulationName: '仿真名称:',
noSimulationProducts: '无仿真产品',
productDescription: '产品说明:',
startSimulation: '开始仿真',
createRoom: '创建房间',
enterRoom: '进入房间'
};

View File

@ -56,6 +56,8 @@ export default {
createOperateRuleFailed: '创建操作定义失败', createOperateRuleFailed: '创建操作定义失败',
createOperateStepFailed: '创建操作步骤失败', createOperateStepFailed: '创建操作步骤失败',
updateOperateStepFailed: '更新操作步骤失败', updateOperateStepFailed: '更新操作步骤失败',
packagePermissionFailed: '打包权限失败' packagePermissionFailed: '打包权限失败',
}; acquisitionTimeFailed: '获取时间失败',
getProductListFailed: '获取产品列表失败'
};

View File

@ -124,5 +124,9 @@ export default {
minute: '分钟', minute: '分钟',
totoal: '总数', totoal: '总数',
publishPermission: '公用权限', publishPermission: '公用权限',
specialPermission: '专用权限' specialPermission: '专用权限',
mapList: '地图列表',
updateTime: '更新时间:',
line: '线路:',
permissionList: '权限列表:'
}; };

View File

@ -14,6 +14,8 @@ import publish from './publish';
import permission from './permission'; import permission from './permission';
import replay from './replay'; import replay from './replay';
import planMonitor from './planMonitor'; import planMonitor from './planMonitor';
import screenMonitor from './screenMonitor';
import demonstration from './demonstration';
export default { export default {
...cnLocale, ...cnLocale,
@ -31,5 +33,7 @@ export default {
publish, publish,
permission, permission,
replay, replay,
planMonitor planMonitor,
screenMonitor,
demonstration
}; };

View File

@ -1,10 +1,6 @@
export default { export default {
line: '线路:',
turnoverTime: '更新时间:',
permissionList: '权限列表:',
buy: '购买', buy: '购买',
offlineMappingSoftware: '离线编图软件', offlineMappingSoftware: '离线编图软件',
lianPlanSystem: '城市轨道交通琏计划系统', lianPlanSystem: '城市轨道交通琏计划系统',
lianPlanDescription: '琏计划是一款编图测试系统,能够真实模拟实现对新运行图的仿真运行测试,该系统能够实现编辑运行图、导入运行图并按照运行图标准模拟真实行车环境,解决了无法针对运行图更新进行测试的问题。能够及时找出新图中不合理的地方并且在图上实时作出调整,避免了新运行图在运营过程中发现问题需要调度员人工进行干预的情况,最大程度降低故障对地铁正常运营的影响。', lianPlanDescription: '琏计划是一款编图测试系统,能够真实模拟实现对新运行图的仿真运行测试,该系统能够实现编辑运行图、导入运行图并按照运行图标准模拟真实行车环境,解决了无法针对运行图更新进行测试的问题。能够及时找出新图中不合理的地方并且在图上实时作出调整,避免了新运行图在运营过程中发现问题需要调度员人工进行干预的情况,最大程度降低故障对地铁正常运营的影响。'
mapList: '地图列表'
}; };

View File

@ -0,0 +1,6 @@
export default {
screenSystem: '城市轨道交通大屏系统',
screenSystemDescription: '城市轨道交通大屏系统以各地铁信号系统及真实地铁线路数据为基础,旨在构建一套行车演示的专业模拟系统。 该系统具有高灵活性可自由切换线路数据。',
productTrialDuration: '产品试用时长:',
aTSScreenSimulation: 'ATS行调中心大屏仿真'
};

View File

@ -105,6 +105,7 @@ export default {
failedSubmitOrder: '提交订单失败', failedSubmitOrder: '提交订单失败',
permissionsNumber: '请输入有效的权限个数', permissionsNumber: '请输入有效的权限个数',
purchaseMonth: '请输入有效的购买月数' purchaseMonth: '请输入有效的购买月数',
createRoomFailedHint: '每个用户只能创建一个综合演练房间, 是否进入房间?',
noPermissionHint: '您没有权限,请前往购买产品'
}; };

View File

@ -6,8 +6,8 @@ const scriptRecord = {
state: { state: {
mapLocation: {}, // 地图定位, mapLocation: {}, // 地图定位,
simulationPause: true, simulationPause: true,
scriptId: '' scriptId: '',
bgSet: false
}, },
getters: { getters: {
mapLocation: (state)=>{ mapLocation: (state)=>{
@ -18,6 +18,9 @@ const scriptRecord = {
}, },
scriptId: (state)=>{ scriptId: (state)=>{
return state.scriptId; return state.scriptId;
},
bgSet: (state)=>{
return state.bgSet;
} }
}, },
mutations: { mutations: {
@ -29,6 +32,9 @@ const scriptRecord = {
}, },
setscriptId: (state, scriptId) => { setscriptId: (state, scriptId) => {
state.scriptId = scriptId; state.scriptId = scriptId;
},
setBgSet: (state, bgSet) => {
state.bgSet = bgSet;
} }
}, },
actions: { actions: {
@ -43,6 +49,9 @@ const scriptRecord = {
}, },
updateScriptId: ({ commit }, scriptId) => { updateScriptId: ({ commit }, scriptId) => {
commit('setscriptId', scriptId); commit('setscriptId', scriptId);
},
updateBgSet: ({ commit }, bgSet) => {
commit('setBgSet', bgSet);
} }
} }
}; };

View File

@ -1,8 +1,8 @@
<template> <template>
<el-card v-loading="loading"> <el-card v-loading="loading">
<div slot="header" style="text-align: center;"> <div slot="header" style="text-align: center;">
<span v-if="hasProduct"><b>仿真名称 {{ courseModel.name }}</b></span> <span v-if="hasProduct"><b>{{ $t('demonstration.simulationName') + courseModel.name }}</b></span>
<span v-else>无仿真产品</span> <span v-else>{{$t('demonstration.noSimulationProducts')}}</span>
</div> </div>
<el-tabs <el-tabs
type="border-card" type="border-card"
@ -20,22 +20,22 @@
> >
<el-scrollbar wrap-class="scrollbar-wrapper" :style="{ height: height-170 +'px' }"> <el-scrollbar wrap-class="scrollbar-wrapper" :style="{ height: height-170 +'px' }">
<p class="list-item"> <p class="list-item">
<span class="list-label">产品说明</span> <span class="list-label">{{$t('demonstration.productDescription')}}</span>
<span class="list-elem">{{ courseModel.remarks }}</span> <span class="list-elem">{{ courseModel.remarks }}</span>
</p> </p>
<p class="list-item"> <p class="list-item">
<span class="list-label">权限列表</span> <span class="list-label">{{$t('global.permissionList')}}</span>
</p> </p>
<limit-list :ref="`limit_${item.code}`" :course-model="courseModel" @initLoadPage="initLoadPage" /> <limit-list :ref="`limit_${item.code}`" :course-model="courseModel" @initLoadPage="initLoadPage" />
</el-scrollbar> </el-scrollbar>
</el-tab-pane> </el-tab-pane>
<div v-if="hasProduct" class="btn-buy"> <div v-if="hasProduct" class="btn-buy">
<el-button :loading="buttonLoading" type="success" @click="buy">购买</el-button> <el-button :loading="buttonLoading" type="success" @click="buy">{{$t('global.buy')}}</el-button>
<el-button v-if="hasPermssion" :loading="buttonLoading" type="primary" @click="distribute">权限分发</el-button> <el-button v-if="hasPermssion" :loading="buttonLoading" type="primary" @click="distribute">{{$t('global.distributePermission')}}</el-button>
<el-button v-if="hasPermssion" :loading="buttonLoading" type="primary" @click="transfer">权限转赠</el-button> <el-button v-if="hasPermssion" :loading="buttonLoading" type="primary" @click="transfer">{{$t('global.transferQRCode')}}</el-button>
<el-button v-show="isStartDemon" :loading="buttonLoading" type="primary" @click="start">开始仿真</el-button> <el-button v-show="isStartDemon" :loading="buttonLoading" type="primary" @click="start">{{$t('demonstration.startSimulation')}}</el-button>
<el-button v-show="isCreateRoom" :loading="buttonLoading" type="primary" @click="start">创建房间</el-button> <el-button v-show="isCreateRoom" :loading="buttonLoading" type="primary" @click="start">{{$t('demonstration.createRoom')}}</el-button>
<el-button v-show="isInRoom" :loading="buttonLoading" type="primary" @click="joinRoom">进入房间</el-button> <el-button v-show="isInRoom" :loading="buttonLoading" type="primary" @click="joinRoom">{{$t('demonstration.enterRoom')}}</el-button>
</div> </div>
</el-tabs> </el-tabs>
</el-card> </el-card>
@ -59,18 +59,6 @@ export default {
components: { components: {
LimitList LimitList
}, },
filters: {
setTime(val) {
if (val <= 1) {
return `0分钟`;
} else if (val > 1 && val <= 60) {
return '1分钟';
} else if (val > 60) {
const time = parseInt(val / 60);
return `${time}分钟`;
}
}
},
mixins: [ mixins: [
WindowResizeHandler WindowResizeHandler
], ],
@ -160,7 +148,7 @@ export default {
} }
this.loading = false; this.loading = false;
} catch (e) { } catch (e) {
this.$messageBox('获取产品列表失败'); this.$messageBox(this.$t('error.getProductListFailed'));
} }
}, },
resizeHandler: function () { resizeHandler: function () {
@ -227,7 +215,7 @@ export default {
} }
} catch (error) { } catch (error) {
this.loading = false; this.loading = false;
this.$messageBox('刷新失败'); this.$messageBox(this.$t('error.refreshFailed'));
} }
} else { } else {
this.loading = false; this.loading = false;
@ -254,9 +242,9 @@ export default {
} catch (error) { } catch (error) {
this.buttonLoading = false; this.buttonLoading = false;
if (error.code == 20001) { if (error.code == 20001) {
this.$confirm(`每个用户只能创建一个综合演练房间, 是否进入房间`, '提示', { this.$confirm(this.$t('tip.createRoomFailedHint'), this.$t('global.tips'), {
confirmButtonText: '确定', confirmButtonText: this.$t('global.confirm'),
cancelButtonText: '取消', cancelButtonText: this.$t('global.cancel'),
type: 'warning' type: 'warning'
}).then(() => {}).catch(() => {}); }).then(() => {}).catch(() => {});
} }
@ -269,13 +257,13 @@ export default {
this.jump(); this.jump();
} else { } else {
if (this.tryTime <= 1) { if (this.tryTime <= 1) {
this.$confirm('您没有权限,请前往购买产品', '提示', { this.$confirm(this.$t('tip.noPermissionHint'), this.$t('global.tips'), {
confirmButtonText: '确定', confirmButtonText: this.$t('global.confirm'),
cancelButtonText: '取消', cancelButtonText: this.$t('global.cancel'),
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
this.buy(); this.buy();
}).catch(() => {}); }).catch(() => { this.buttonLoading = false; });
} else { } else {
this.jump(); this.jump();
} }
@ -290,7 +278,8 @@ export default {
this.$router.push({ path: `${UrlConfig.display}/demon`, query: query }); this.$router.push({ path: `${UrlConfig.display}/demon`, query: query });
launchFullscreen(); launchFullscreen();
}).catch(error => { }).catch(error => {
this.$messageBox(`创建仿真失败: ${error.message}`); this.$messageBox(this.$t('error.createSimulationFailed') + error.message);
this.buttonLoading = false;
}); });
}, },
buy() { buy() {

View File

@ -3,7 +3,7 @@
<div class="home-box" :style="{height: height+'px'}"> <div class="home-box" :style="{height: height+'px'}">
<el-scrollbar wrap-class="scrollbar-wrapper"> <el-scrollbar wrap-class="scrollbar-wrapper">
<h1 class="title"> <h1 class="title">
城市轨道交通仿真系统 {{$t('demonstration.simulationSystem')}}
<img :src="logo" alt="" class="logo-img"> <img :src="logo" alt="" class="logo-img">
</h1> </h1>
<div class="card-box"> <div class="card-box">
@ -13,8 +13,7 @@
</el-carousel-item> </el-carousel-item>
</el-carousel> </el-carousel>
</div> </div>
<div class="brief-box">城市轨道交通仿真系统以各地铁信号系统为基础针对培训部分进行改造旨在构建一套用于行车演示的专业仿真模拟系统 <div class="brief-box">{{$t('demonstration.simulationSystemDescription')}}</div>
该系统具有高灵活性以便于将来的扩展升级同时仿真系统具备正常操作及故障操作两种模式除了正常的功能操作以外还可以进行设备的故障模拟</div>
</el-scrollbar> </el-scrollbar>
</div> </div>
</el-card> </el-card>

View File

@ -1,11 +1,11 @@
<template> <template>
<el-card v-loading="loading" class="map-list-main"> <el-card v-loading="loading" class="map-list-main">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>地图列表</span> <span>{{$t('global.mapList')}}</span>
<!-- <div v-if="role" class="back-home" @click="backHome">返回首页</div> --> <!-- <div v-if="role" class="back-home" @click="backHome">返回首页</div> -->
</div> </div>
<filter-city ref="filerCity" filter-empty :query-function="queryFunction" @filterSelectChange="refresh" @changeFilter="clearMapSelect" /> <filter-city ref="filerCity" filter-empty :query-function="queryFunction" @filterSelectChange="refresh" @changeFilter="clearMapSelect" />
<el-input v-model="filterText" placeholder="输入关键字进行过滤" clearable /> <el-input v-model="filterText" :placeholder="this.$t('global.filteringKeywords')" clearable />
<el-scrollbar wrap-class="scrollbar-wrapper" :style="{ height: (height-125) +'px' }"> <el-scrollbar wrap-class="scrollbar-wrapper" :style="{ height: (height-125) +'px' }">
<el-tree <el-tree
ref="tree" ref="tree"
@ -122,7 +122,7 @@ export default {
}); });
} catch (error) { } catch (error) {
this.loading = false; this.loading = false;
this.$messageBox('刷新失败'); this.$messageBox(this.$t('error.refreshFailed'));
} }
}, },
clearMapSelect() { clearMapSelect() {

View File

@ -1,15 +1,15 @@
<template> <template>
<el-card> <el-card>
<div slot="header" style="text-align: center;"> <div slot="header" style="text-align: center;">
<span class=" title">{{ $t('planMonitor.line')+courseModel.name }}</span> <span class=" title">{{ $t('global.line')+courseModel.name }}</span>
</div> </div>
<div style="margin:50px; overflow-x: auto;" :style="{ height: height - 150 +'px' }"> <div style="margin:50px; overflow-x: auto;" :style="{ height: height - 150 +'px' }">
<p class="list-item"> <p class="list-item">
<span class="list-label">{{ $t('planMonitor.turnoverTime') }}</span> <span class="list-label">{{ $t('global.updateTime') }}</span>
<span class="list-elem">{{ courseModel.updateTime }}</span> <span class="list-elem">{{ courseModel.updateTime }}</span>
</p> </p>
<p class="list-item"> <p class="list-item">
<span class="list-label">{{ $t('planMonitor.permissionList') }}</span> <span class="list-label">{{ $t('global.permissionList') }}</span>
</p> </p>
<limit-list ref="limitList" :course-model="courseModel" @initLoadPage="getScreenLists" /> <limit-list ref="limitList" :course-model="courseModel" @initLoadPage="getScreenLists" />
<p style="display: flex; justify-content: center;"> <p style="display: flex; justify-content: center;">
@ -40,16 +40,6 @@ export default {
LimitList LimitList
}, },
filters: { filters: {
setTime(val) {
if (val <= 1) {
return `0`+this.$t('global.minute');
} else if (val > 1 && val <= 60) {
return '1'+this.$t('global.minute');
} else if (val > 60) {
const time = parseInt(val / 60);
return time+this.$t('global.minutes');
}
}
}, },
mixins: [ mixins: [
WindowResizeHandler WindowResizeHandler

View File

@ -1,7 +1,7 @@
<template> <template>
<el-card v-loading="loading" class="map-list-main"> <el-card v-loading="loading" class="map-list-main">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>{{ $t('planMonitor.mapList') }}</span> <span>{{ $t('global.mapList') }}</span>
</div> </div>
<filter-city ref="filerCity" filter-empty :query-function="queryFunction" @filterSelectChange="refresh" /> <filter-city ref="filerCity" filter-empty :query-function="queryFunction" @filterSelectChange="refresh" />
<el-input v-model="filterText" :placeholder="this.$t('global.filteringKeywords')" clearable /> <el-input v-model="filterText" :placeholder="this.$t('global.filteringKeywords')" clearable />

View File

@ -1,27 +1,27 @@
<template> <template>
<el-card> <el-card>
<div slot="header" style="text-align: center;"> <div slot="header" style="text-align: center;">
<span class=" title">线路 {{ courseModel.name }}</span> <span class=" title">{{$t('global.line') + courseModel.name }}</span>
</div> </div>
<div style="margin:50px; overflow-x: auto;" :style="{ height: height - 150 +'px' }"> <div style="margin:50px; overflow-x: auto;" :style="{ height: height - 150 +'px' }">
<p class="list-item"> <p class="list-item">
<span class="list-label">更新时间</span> <span class="list-label">{{ $t('global.updateTime') }}</span>
<span class="list-elem">{{ courseModel.updateTime }}</span> <span class="list-elem">{{ courseModel.updateTime }}</span>
</p> </p>
<p class="list-item" v-if="!courseModel.pmsList.length"> <p class="list-item" v-if="!courseModel.pmsList.length">
<span class="list-label">产品试用时长</span> <span class="list-label">{{ $t('screenMonitor.productTrialDuration') }}</span>
<span class="list-elem">{{ tryTime | setTime }}</span> <span class="list-elem">{{ showTryTime }}</span>
</p> </p>
<p class="list-item"> <p class="list-item">
<span class="list-label">权限列表</span> <span class="list-label">{{ $t('global.permissionList') }}</span>
</p> </p>
<limit-list ref="limitList" :courseModel="courseModel" @initLoadPage="getScreenLists"></limit-list> <limit-list ref="limitList" :courseModel="courseModel" @initLoadPage="getScreenLists"></limit-list>
<p style="display: flex; justify-content: center;"> <p style="display: flex; justify-content: center;">
<span class="list-label"></span> <span class="list-label"></span>
<el-button type="success" @click="buy">购买</el-button> <el-button type="success" @click="buy">{{ $t('global.buy') }}</el-button>
<el-button type="primary" @click="distribute" v-if="hasPermssion">权限分发</el-button> <el-button type="primary" @click="distribute" v-if="hasPermssion">{{$t('global.distributePermission')}}</el-button>
<el-button type="primary" @click="transfer" v-if="hasPermssion">权限转赠</el-button> <el-button type="primary" @click="transfer" v-if="hasPermssion">{{$t('global.transferQRCode')}}</el-button>
<el-button type="primary" @click="start">ATS行调中心大屏仿真</el-button> <el-button type="primary" @click="start">{{$t('screenMonitor.aTSScreenSimulation')}}</el-button>
</p> </p>
</div> </div>
<set-time ref="setTime" @ConfirmSelectBeginTime="jump"></set-time> <set-time ref="setTime" @ConfirmSelectBeginTime="jump"></set-time>
@ -62,6 +62,7 @@
}, },
goodsId: '', goodsId: '',
tryTime: 0, tryTime: 0,
showTryTime: '0',
tryUser: 0, tryUser: 0,
EffectiveTypeList: [], EffectiveTypeList: [],
screenList: [], screenList: [],
@ -71,16 +72,6 @@
WindowResizeHandler WindowResizeHandler
], ],
filters: { filters: {
setTime(val) {
if (val <= 1) {
return `0分钟`;
} else if (1 < val && val <= 60) {
return '1分钟';
} else if (val > 60) {
let time = parseInt(val / 60);
return `${time}分钟`;
}
}
}, },
computed: { computed: {
hasPermssion() { hasPermssion() {
@ -143,16 +134,19 @@
let resp = await getGoodsTryUse(paras); let resp = await getGoodsTryUse(paras);
if (resp.data.tryTime <= 0) { if (resp.data.tryTime <= 0) {
this.tryTime = 0; this.tryTime = 0;
this.setTryTime(0)
} else { } else {
this.tryTime = resp.data.tryTime; this.tryTime = resp.data.tryTime;
this.setTryTime(resp.data.tryTime)
this.goodsId = resp.data.goodsId; this.goodsId = resp.data.goodsId;
} }
} catch (err) { } catch (err) {
this.$messageBox('获取时间失败') this.$messageBox(this.$t('error.acquisitionTimeFailed'))
} }
} }
} catch (error) { } catch (error) {
this.$messageBox('刷新失败') this.$messageBox(this.$t('error.refreshFailed'))
}; };
} }
}, },
@ -205,6 +199,16 @@
} }
} }
},
setTryTime(val) {
if (val <= 1) {
this.showTryTime = `0`+ this.$t('global.minute');
} else if (1 < val && val <= 60) {
this.showTryTime = '1'+ this.$t('global.minute');
} else if (val > 60) {
let time = parseInt(val / 60);
this.showTryTime = time+ this.$t('global.minutes');
}
} }
} }
} }
@ -253,4 +257,4 @@
.list-elem { .list-elem {
color: #808080 !important; color: #808080 !important;
} }
</style> </style>

View File

@ -3,7 +3,7 @@
<div class="home-box" :style="{height: height+'px'}"> <div class="home-box" :style="{height: height+'px'}">
<el-scrollbar wrapClass="scrollbar-wrapper" style="margin-top:5px;"> <el-scrollbar wrapClass="scrollbar-wrapper" style="margin-top:5px;">
<h1 class="title"> <h1 class="title">
城市轨道交通大屏系统 {{$t('screenMonitor.screenSystem')}}
<img :src="logo" alt="" class="logo-img"> <img :src="logo" alt="" class="logo-img">
</h1> </h1>
<div class="card-box"> <div class="card-box">
@ -13,7 +13,7 @@
</el-carousel-item> </el-carousel-item>
</el-carousel> </el-carousel>
</div> </div>
<div class="brief-box">城市轨道交通大屏系统以各地铁信号系统及真实地铁线路数据为基础旨在构建一套行车演示的专业模拟系统 该系统具有高灵活性可自由切换线路数据</div> <div class="brief-box">{{$t('screenMonitor.screenSystemDescription')}}</div>
</el-scrollbar> </el-scrollbar>
</div> </div>
</el-card> </el-card>
@ -98,4 +98,4 @@
font-family: unset; font-family: unset;
} }
} }
</style> </style>

View File

@ -1,11 +1,11 @@
<template> <template>
<el-card class="map-list-main" v-loading="loading"> <el-card class="map-list-main" v-loading="loading">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>地图列表</span> <span>{{$t('global.mapList')}}</span>
</div> </div>
<filter-city ref="filerCity" @filterSelectChange="refresh" filterEmpty :queryFunction="queryFunction"> <filter-city ref="filerCity" @filterSelectChange="refresh" filterEmpty :queryFunction="queryFunction">
</filter-city> </filter-city>
<el-input placeholder="输入关键字进行过滤" v-model="filterText" clearable> </el-input> <el-input :placeholder="this.$t('global.filteringKeywords')" v-model="filterText" clearable> </el-input>
<el-scrollbar wrapClass="scrollbar-wrapper" :style="{ height: (height-125) +'px' }"> <el-scrollbar wrapClass="scrollbar-wrapper" :style="{ height: (height-125) +'px' }">
<el-tree ref="tree" :data="treeList" node-key="id" highlight-current <el-tree ref="tree" :data="treeList" node-key="id" highlight-current
:default-expanded-keys="defaultShowKeys" :props="defaultProps" @node-click="clickEvent" :default-expanded-keys="defaultShowKeys" :props="defaultProps" @node-click="clickEvent"
@ -114,7 +114,7 @@
this.$nextTick(() => { this.loading = false; }) this.$nextTick(() => { this.loading = false; })
}).catch(error => { }).catch(error => {
this.loading = false; this.loading = false;
this.$messageBox('刷新失败') this.$messageBox(this.$t('error.refreshFailed'));
}); });
} }
} }
@ -128,4 +128,4 @@
.el-tree-node.is-current>.el-tree-node__content { .el-tree-node.is-current>.el-tree-node__content {
background-color: #e4e3e3 !important; background-color: #e4e3e3 !important;
} }
</style> </style>

View File

@ -9,7 +9,7 @@
<el-button type="primary" @click="executePlayScript" v-else :disabled="executeDisabled">恢复并执行</el-button> <el-button type="primary" @click="executePlayScript" v-else :disabled="executeDisabled">恢复并执行</el-button>
<!-- <el-button type="primary" @click="saveMaplocation">{{$t('scriptRecord.saveMaplocation')}}</el-button> --> <!-- <el-button type="primary" @click="saveMaplocation">{{$t('scriptRecord.saveMaplocation')}}</el-button> -->
<el-button type="danger" @click="dumpScenesData">重置剧本</el-button> <el-button type="danger" @click="dumpScenesData">重置剧本</el-button>
<el-button type="primary" @click="saveScenesStage">{{$t('scriptRecord.saveBackground')}}</el-button> <el-button type="primary" @click="saveScenesStage" :disabled="backDisabled">{{$t('scriptRecord.saveBackground')}}</el-button>
<el-button type="success" @click="saveScenesData" :loading="isSavingScript" >{{$t('scriptRecord.saveData')}}</el-button> <el-button type="success" @click="saveScenesData" :loading="isSavingScript" >{{$t('scriptRecord.saveData')}}</el-button>
<!-- 暂停 --> <!-- 暂停 -->
</el-button-group> </el-button-group>
@ -42,13 +42,20 @@ import {saveScriptScenes, saveScriptData, dumpScriptData, updateMapLocation, scr
isSavingScript:false, isSavingScript:false,
isPause:false, isPause:false,
executeDisabled:false, executeDisabled:false,
backDisabled:false,
// isSaveStage: true, // isSaveStage: true,
} }
}, },
created() { created() {
}, },
watch:{
'$store.state.scriptRecord.bgSet': function (val) {
this.backDisabled=val;
},
},
mounted(){ mounted(){
this.initAutoSaveScript(); this.initAutoSaveScript();
this.backDisabled=this.$store.state.scriptRecord.bgSet;
// this.shrink(); // this.shrink();
}, },
beforeDestroy() { beforeDestroy() {
@ -114,6 +121,7 @@ import {saveScriptScenes, saveScriptData, dumpScriptData, updateMapLocation, scr
saveScriptScenes(this.group).then(resp => { saveScriptScenes(this.group).then(resp => {
updateMapLocation(group,dataZoom).then(response=>{ updateMapLocation(group,dataZoom).then(response=>{
// this.$message.success(''); // this.$message.success('');
this.$store.dispatch('scriptRecord/updateBgSet',true);
this.$message.success('保存背景成功'); this.$message.success('保存背景成功');
}).catch(error => { }).catch(error => {
this.$messageBox(`更新定位失败: ${error.message}`); this.$messageBox(`更新定位失败: ${error.message}`);
@ -154,9 +162,10 @@ import {saveScriptScenes, saveScriptData, dumpScriptData, updateMapLocation, scr
this.$parent.$refs['display'].$refs['menuScript'].resetBeginTime(); this.$parent.$refs['display'].$refs['menuScript'].resetBeginTime();
this.$refs["getAction"].loadInitData(); this.$refs["getAction"].loadInitData();
this.initAutoSaveScript(); this.initAutoSaveScript();
this.$message.success('清除数据成功'); this.$store.dispatch('scriptRecord/updateBgSet',false);
this.$message.success('重置剧本成功');
}).catch(error => { }).catch(error => {
this.$messageBox('清除数据失败!'); this.$messageBox('重置剧本失败!');
}) })
}).catch(error => { }).catch(error => {
this.initAutoSaveScript(); this.initAutoSaveScript();

View File

@ -2,22 +2,32 @@
<div> <div>
<el-card class="conversitionCard"> <el-card class="conversitionCard">
<div class="addConversition">添加对话</div> <div class="addConversition">添加对话</div>
<el-form :model="modalData" ref="modalData" :rules="rules" label-width="100px" class="actionInfo" label-position="right"> <el-form :model="modalData" ref="modalData" :rules="rules" label-width="100px" class="conversitionInfo" label-position="right">
<!-- <el-form-item label="动作类型" class="conditionVO" prop="actionVO.type" > <!-- <el-form-item label="动作类型" class="conditionVO" prop="actionVO.type" >
<el-select v-model="modalData.actionVO.type " placeholder="请选择动作类型" @change="changeType" :disabled="deviceTypeReadOnly||isPause"> <el-select v-model="modalData.actionVO.type " placeholder="请选择动作类型" @change="changeType" :disabled="deviceTypeReadOnly||isPause">
<el-option v-for="actionType in actionTypeList" :key="actionType.label" :label="actionType.label" :value="actionType.value"></el-option> <el-option v-for="actionType in actionTypeList" :key="actionType.label" :label="actionType.label" :value="actionType.value"></el-option>
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item label="讲述者" class="conditionVO" prop="actionVO.memberId"> <div>
<el-select v-model="modalData.actionVO.memberId" placeholder="请选择讲述者" :disabled="isPause&&isNotModify"> <div class="itemGroup">
<el-option v-for="member in memberList" :key="member.id" :label="member.role+(member.name==undefined?'':member.name)" :value="member.id"></el-option> <el-form-item label="讲述者" class="conditionVO" prop="actionVO.memberId">
</el-select> <el-select v-model="modalData.actionVO.memberId" placeholder="请选择讲述者" :disabled="isPause&&isNotModify">
</el-form-item> <el-option v-for="member in memberList" :key="member.id" :label="member.role+(member.name==undefined?'':member.name)" :value="member.id"></el-option>
<el-form-item label="接收者" class="conditionVO" prop="actionVO.targetId"> </el-select>
<el-select v-model="modalData.actionVO.targetId" placeholder="请选择接收者" :disabled="isPause&&isNotModify"> </el-form-item>
<el-option v-for="member in memberList" :key="member.id" :label="member.role+(member.name==undefined?'':member.name)" :value="member.id"></el-option> <el-form-item label="接收者" class="conditionVO" prop="actionVO.targetId">
</el-select> <el-select v-model="modalData.actionVO.targetId" placeholder="请选择接收者" :disabled="isPause&&isNotModify">
</el-form-item> <el-option v-for="member in memberList" :key="member.id" :label="member.role+(member.name==undefined?'':member.name)" :value="member.id"></el-option>
</el-select>
</el-form-item>
</div>
<div class="changeGroup">
<div class="changeTop"></div>
<i class="el-icon-sort changeItem" @click="changeItem"></i>
<div class="changeBottom"></div>
</div>
</div>
<el-form-item label="内容" class="conditionVO" prop="actionVO.reply"> <el-form-item label="内容" class="conditionVO" prop="actionVO.reply">
<el-input v-model="modalData.actionVO.reply" type="textarea" class="textareaStyle" rows="3" :disabled="isPause&&isNotModify"></el-input> <el-input v-model="modalData.actionVO.reply" type="textarea" class="textareaStyle" rows="3" :disabled="isPause&&isNotModify"></el-input>
</el-form-item> </el-form-item>
@ -325,6 +335,14 @@
} }
}, },
changeItem(){
if(!(this.isPause&&this.isNotModify))
{
let temp=this.modalData.actionVO.memberId;
this.modalData.actionVO.memberId=this.modalData.actionVO.targetId;
this.modalData.actionVO.targetId=temp;
}
},
doShow(data){ doShow(data){
if(data) if(data)
{ {
@ -364,7 +382,9 @@
@import "src/styles/mixin.scss"; @import "src/styles/mixin.scss";
.addConversition{ .addConversition{
margin-left:10px; margin-left:10px;
}
.conversitionInfo{
width:350px;
} }
.addAction{ .addAction{
margin-top: 20px; margin-top: 20px;
@ -402,4 +422,30 @@
font-size:15px; font-size:15px;
padding: 20px 10px; padding: 20px 10px;
} }
.itemGroup{
width:310px;
float:left;
}
.changeGroup{
display:inline-block;
}
.changeTop{
margin-top: 15px;
width: 25px;
border-top: 1px #c0c4cc solid;
border-right: 1px #c0c4cc solid;
height: 20px;
}
.changeItem{
margin-left: 15px;
margin-top: 5px;
cursor: pointer;
}
.changeBottom{
margin-top: 5px;
width: 25px;
border-bottom: 1px #c0c4cc solid;
border-right: 1px #c0c4cc solid;
height: 20px;
}
</style> </style>

View File

@ -95,6 +95,7 @@
loadOtherData(obj){ loadOtherData(obj){
let group=obj.group; let group=obj.group;
getScriptRecord(group).then(response=>{ getScriptRecord(group).then(response=>{
this.$store.dispatch('scriptRecord/updateBgSet', response.data.bgSet);
this.actionInfoList=[]; this.actionInfoList=[];
let roleTypeList=ConstConfig.ConstSelect.roleType; let roleTypeList=ConstConfig.ConstSelect.roleType;
let memberVOList=JSON.stringify(response.data.memberVOList); let memberVOList=JSON.stringify(response.data.memberVOList);
@ -243,6 +244,6 @@
color:#409EFF color:#409EFF
} }
.commandStyle{ .commandStyle{
color:#f00; color:#F00;
} }
</style> </style>

View File

@ -133,6 +133,7 @@
type="primary" type="primary"
style="float: right;" style="float: right;"
@click="start" @click="start"
:loading="loading"
> >
开始仿真</el-button> 开始仿真</el-button>
</div> </div>
@ -141,6 +142,7 @@
type="primary" type="primary"
style="float: right; margin-right: 10px;" style="float: right; margin-right: 10px;"
@click="joinJointTrain" @click="joinJointTrain"
:loading="loading"
> >
进入仿真</el-button> 进入仿真</el-button>
<el-button <el-button
@ -148,6 +150,7 @@
type="" type=""
style="float: right; margin-right: 10px;" style="float: right; margin-right: 10px;"
@click="stop" @click="stop"
:loading="loading"
> >
结束仿真</el-button> 结束仿真</el-button>
</div> </div>
@ -156,6 +159,7 @@
type="" type=""
style="float: right; margin-right: 0px;" style="float: right; margin-right: 0px;"
@click="postCode" @click="postCode"
:loading="loading"
>生成二维码 >生成二维码
</el-button> </el-button>
<el-button type="" style="float: right; margin-right: 10px;" @click="backRoom">返回 <el-button type="" style="float: right; margin-right: 10px;" @click="backRoom">返回
@ -165,6 +169,7 @@
type="danger" type="danger"
style="float: right; margin-right: 0px;" style="float: right; margin-right: 0px;"
@click="exit" @click="exit"
:loading="loading"
>销毁房间 >销毁房间
</el-button> </el-button>
</div> </div>
@ -257,7 +262,8 @@ export default {
timeDemon: null, timeDemon: null,
starting: false, starting: false,
mapId: '', mapId: '',
num: 0 num: 0,
loading: false
}; };
}, },
watch: { watch: {
@ -366,6 +372,7 @@ export default {
}, },
async joinJointTrain() { async joinJointTrain() {
// launchFullscreen(); // launchFullscreen();
this.loading = true;
await putJointTrainingSimulationEntrance(this.$route.query.group); await putJointTrainingSimulationEntrance(this.$route.query.group);
const rest = await getPublishMapInfo(this.mapId); const rest = await getPublishMapInfo(this.mapId);
const query = { skinCode: rest.data.skinCode, mapId: this.mapId, group: this.$route.query.group }; const query = { skinCode: rest.data.skinCode, mapId: this.mapId, group: this.$route.query.group };
@ -535,6 +542,7 @@ export default {
}); });
}, },
async postCode() { async postCode() {
this.loading = true;
const res = await getJoinTrainCode({}, this.$route.query.group); const res = await getJoinTrainCode({}, this.$route.query.group);
if (res.code == '200') { if (res.code == '200') {
const param = { const param = {
@ -545,9 +553,11 @@ export default {
this.$refs.qrCode.doShow(param); this.$refs.qrCode.doShow(param);
} }
} }
this.loading = false;
}, },
async start() { async start() {
let flag = true; let flag = true;
this.loading = true;
this.equipmentList.forEach(item => { this.equipmentList.forEach(item => {
if (!item.deviceCode) { if (!item.deviceCode) {
flag = false; flag = false;
@ -557,24 +567,31 @@ export default {
if (flag) { if (flag) {
try { try {
await startJointTraining(this.$route.query.group); await startJointTraining(this.$route.query.group);
this.loading = false;
} catch (error) { } catch (error) {
this.messageInfo('开始综合演练失败。', 'error'); this.messageInfo('开始综合演练失败。', 'error');
this.loading = false;
} }
} else { } else {
this.messageInfo('车站值班员所属车站不能为空', 'error'); this.messageInfo('车站值班员所属车站不能为空', 'error');
this.loading = false;
} }
}, },
async stop() { async stop() {
this.loading = true;
const res = await putJointTrainingSimulation(this.$route.query.group); const res = await putJointTrainingSimulation(this.$route.query.group);
this.mapId = res.data.mapId; this.mapId = res.data.mapId;
if (res.data.state == '01') { if (res.data.state == '01') {
this.starting = false; this.starting = false;
} }
this.loading = false;
}, },
// //
async backRoom() { async backRoom() {
try { try {
this.loading = true;
await putJointTrainingExit(this.$route.query.group); await putJointTrainingExit(this.$route.query.group);
this.loading = false;
this.$router.push({ path: `/` }); this.$router.push({ path: `/` });
} catch (error) { } catch (error) {
this.messageInfo('操作失败!', 'error'); this.messageInfo('操作失败!', 'error');
@ -582,6 +599,7 @@ export default {
}, },
// //
exit() { exit() {
this.loading = false;
this.$confirm('您将销毁房间,是否确定执行此操作', '提示', { this.$confirm('您将销毁房间,是否确定执行此操作', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',