Commit 7753da64754da5b6b9362f174e712643d70e6c35

Authored by 徐烜
1 parent 75aa8fc6

1、时刻表生成(班型/人次/共时)优化,适配1112路

src/main/resources/static/pages/base/timesmodel/gantt.html
... ... @@ -213,9 +213,11 @@
213 213 <script src="/pages/base/timesmodel/js/v2_2/strategy/runtime/LinearRuntimeS1.js"></script>
214 214 <script src="/pages/base/timesmodel/js/v2_2/strategy/layovertime/LayoverTimeS1.js"></script>
215 215 <script src="/pages/base/timesmodel/js/v2/strategy/StrategyUtils.js"></script>
216   -<script src="/pages/base/timesmodel/js/v4/strategy/StrategyUtils.js"></script>
217 216  
218 217 <!-- v4版本的时刻表生成组件 -->
  218 +<script src="/pages/base/timesmodel/js/v4/utils/ScheduleBuilderUtils.js"></script>
  219 +<script src="/pages/base/timesmodel/js/v4/core/CalcuFcsj_v1.js"></script>
  220 +<script src="/pages/base/timesmodel/js/v4/core/VspFcsj_v1.js"></script>
219 221 <script src="/pages/base/timesmodel/js/v4/scheduleBuilder.component.js"></script>
220 222  
221 223 <script src="/pages/base/timesmodel/js/errorinfo.js"></script>
... ...
src/main/resources/static/pages/base/timesmodel/js/v2/ParameterObj.js
... ... @@ -328,6 +328,24 @@ var ParameterObj = function() {
328 328 return _timeObj;
329 329 };
330 330  
  331 + // 班型分布列表
  332 + var _bxDisList = [];
  333 + var _fnBxDisList = function() {
  334 + var _rtn = [];
  335 + // bxgsrc的数据格式参考 bxtypeSelect.js 组件输出
  336 + if (_formMap["bxgsrc"]) {
  337 + $.each(_formMap["bxgsrc"].split(","), function(index, value) {
  338 + var _str_array = value.split("/");
  339 + _rtn.push({
  340 + bxName: _str_array[0], // 班型名字
  341 + bxGs: parseFloat(_str_array[1]), // 班型工时
  342 + bxCount: parseInt(_str_array[2]) // 班型个数
  343 + });
  344 + });
  345 + }
  346 + return _rtn;
  347 + };
  348 +
331 349 return {
332 350  
333 351 /**
... ... @@ -359,6 +377,8 @@ var ParameterObj = function() {
359 377 _fcjxIntervalObj = _fcjxIntervalObj_fun();
360 378 // 停站类型
361 379 _stopTypeObj = _stopTypeObj_fun();
  380 + // 班型分布列表
  381 + _bxDisList = _fnBxDisList();
362 382 // 线路对象
363 383 _xlObj = _xlObj_fun();
364 384 // 停车场对象
... ... @@ -843,6 +863,14 @@ var ParameterObj = function() {
843 863 };
844 864 },
845 865  
  866 + /**
  867 + * 获取班型分布列表。
  868 + */
  869 + getBxDisList: function() {
  870 + _validInternal(); // 验证
  871 + return _bxDisList;
  872 + },
  873 +
846 874 //-------------- 时间操作 ------------//
847 875 /**
848 876 * 通过字符串创建时间对象。
... ... @@ -1449,4 +1477,4 @@ var ParameterObj = function() {
1449 1477  
1450 1478  
1451 1479 };
1452   -};
1453 1480 \ No newline at end of file
  1481 +};
... ...
src/main/resources/static/pages/base/timesmodel/js/v4/core/CalcuFcsj_v1.js 0 → 100644
  1 +/**
  2 + * 计算发车时间列表v1。
  3 + * 1、计算当前班次的下一个班次时间(使用各个时间段的平均发车间隔,首班车,末班车发车时间)
  4 + * 2、重复操作1,直到下一个班次时间大于末班车发车时间
  5 + * 3、退出循环,使用末班车作为最后一个班次,计算与上一个班次的发车间隔
  6 + * 4、这里直接将最后一个班次删除,将倒数第二个班次改成末班车时间,
  7 + * 这样会造成最后一般车发车间隔可能大于最大发车间隔(TODO:这个暂时不管了以后再说)
  8 + * @param $jQuery jQuery对象
  9 + */
  10 +var CalcuFcsj_v1 = (function($jQuery) {
  11 +
  12 + /**
  13 + * 将时间列表转换成 InternalBcObj v2版本的班次对象Array
  14 + * @param Utils 工具类对象(参考:/pages/base/timesmodel/js/v4/utils/ScheduleBuilderUtils.js)
  15 + * @param isUp 是否上行
  16 + * @param fcsjArray 发车时间列表(moment对象)
  17 + * @param _options 组件内部参数(参考:/pages/base/timesmodel/js/v4/scheduleBuilder.component.js)
  18 + * @param paramObjV2 v2版本的参数对象(看考:/pages/base/timesmodel/js/v2/ParameterObj.js)
  19 + * @return Array InternalBcObj v2版本的班次对象列表(参考:/pages/base/timesmodel/js/v2/core/InternalBcObj.js)
  20 + * @private
  21 + */
  22 + function _convertFcsjArrayToInternalBcObjv2Array(
  23 + Utils,
  24 + isUp, fcsjArray, _options, paramObjV2) {
  25 + var _rtn_array = [];
  26 +
  27 + $jQuery.each(fcsjArray, function(index, item) {
  28 + // 1、计算行驶时间,到达时间
  29 + var runTime;
  30 + var arriveTime;
  31 + if (paramObjV2.isMPeakBc(item)) {
  32 + runTime = isUp ? _options.upMPeakRunningTime : _options.downMPeakRunningTime;
  33 + } else if (paramObjV2.isEPeakBc(item)) {
  34 + runTime = isUp ? _options.upEPeakRunningTime : _options.downEPeakRunningTime;
  35 + } else {
  36 + runTime = isUp ? _options.upLowRunningTime : _options.downLowRunningTime;
  37 + }
  38 + arriveTime = paramObjV2.addMinute(item, runTime);
  39 +
  40 + // 2、计算停站时间(平均停站时间)
  41 + var layOverTime;
  42 + if (paramObjV2.isMPeakBc(arriveTime)) {
  43 + layOverTime = isUp ?
  44 + (Math.floor((_options.upMPeakMinLayoverTime + _options.upMPeakMaxLayoverTime) / 2)):
  45 + (Math.floor((_options.downMPeakMinLayoverTime + _options.downMPeakMaxLayoverTime) / 2));
  46 + } else if (paramObjV2.isEPeakBc(arriveTime)) {
  47 + layOverTime = isUp ?
  48 + (Math.floor((_options.upEPeakMinLayoverTime + _options.upEPeakMaxLayoverTime) / 2)):
  49 + (Math.floor((_options.downEPeakMinLayoverTime + _options.downEPeakMaxLayoverTime) / 2));
  50 + } else {
  51 + layOverTime = isUp ?
  52 + (Math.floor((_options.upLowMinLayoverTime + _options.upLowMaxLayoverTime) / 2)):
  53 + (Math.floor((_options.downLowMinLayoverTime + _options.downLowMaxLayoverTime) / 2));
  54 + }
  55 +
  56 + // TODO:1112路特殊layover设置成3分钟
  57 + if (_options.xlId == 81001) {
  58 + layOverTime = 3;
  59 + }
  60 +
  61 + _rtn_array.push(Utils.getInternalBcObjectBuilder(_options, paramObjV2)
  62 + .tripTime(item)
  63 + .runTime(runTime)
  64 + .arriveTime(arriveTime)
  65 + .layOverTime(layOverTime)
  66 + .isUp(isUp)
  67 + .tripType("normal")
  68 + .build());
  69 +
  70 + console.log("发车时间:" + moment(item).format("HH:mm") + " 停站时间:" + layOverTime);
  71 + });
  72 + return _rtn_array;
  73 + }
  74 +
  75 + /**
  76 + * 计算发车时间列表v1。
  77 + * @param Utils 工具类对象(参考:/pages/base/timesmodel/js/v4/utils/ScheduleBuilderUtils.js)
  78 + * @param paramObj v2版本的参数对象(参考:/pages/base/timesmodel/js/v2/ParameterObj.js)
  79 + * @param _options 组件内部参数(参考:/pages/base/timesmodel/js/v4/scheduleBuilder.component.js)
  80 + * @param firstTripTime 第一个班次时间(moment对象)
  81 + * @param lastTripTime 最后一个班次时间(moment对象)
  82 + * @return {Array} 时间从早到晚的发车时间列表(moment对象Array)
  83 + * @private
  84 + */
  85 + function _calcuFcsjArray_v1(
  86 + Utils, paramObj, _options,
  87 + firstTripTime, lastTripTime) {
  88 + Utils.AssertIsTrue(firstTripTime.isBefore(lastTripTime),
  89 + "firstTripTime必须早于lastTripTime!");
  90 +
  91 + var _fcsjArray = [];
  92 + _fcsjArray.push(firstTripTime);
  93 +
  94 + // 按照,低谷->早高峰->低谷->晚高峰->低谷推进
  95 + var _previousTripTime = null;
  96 + var _nextTripTime = null;
  97 + do {
  98 + _previousTripTime = _fcsjArray[_fcsjArray.length - 1];
  99 +
  100 + if (paramObj.isMPeakBc(_previousTripTime)) { // 早高峰班次
  101 + _nextTripTime = paramObj.addMinute( // 使用平均发车间隔
  102 + _previousTripTime,
  103 + Math.floor((_options.mPeakMinHeadway + _options.mPeakMaxHeadway) / 2)
  104 + );
  105 + } else if (paramObj.isEPeakBc(_previousTripTime)) { // 晚高峰班次
  106 + _nextTripTime = paramObj.addMinute( // 使用平均发车间隔
  107 + _previousTripTime,
  108 + Math.floor((_options.ePeakMinHeadway + _options.ePeakMaxHeadway) / 2)
  109 + );
  110 + } else { // 低谷班次
  111 + _nextTripTime = paramObj.addMinute( // 使用平均发车间隔
  112 + _previousTripTime,
  113 + Math.floor((_options.lowMinHeadway + _options.lowMaxHeadway) / 2)
  114 + );
  115 + }
  116 + _fcsjArray.push(_nextTripTime);
  117 + } while (_nextTripTime.isBefore(lastTripTime));
  118 +
  119 + _fcsjArray.pop(); // 删除最后一个班次
  120 + _fcsjArray.pop(); // 删除倒数第二个班次
  121 + // 将末班车班次作为最后一个班次,倒数第二个发车间隔可能大于最大发车间隔
  122 + // TODO:程序暂时不自动修正,人工修正
  123 + _fcsjArray.push(lastTripTime);
  124 +
  125 + return _fcsjArray;
  126 + }
  127 +
  128 + /**
  129 + * 主函数。
  130 + * @param Utils 工具类对象(参考:/pages/base/timesmodel/js/v4/utils/ScheduleBuilderUtils.js)
  131 + * @param paramObj v2版本的参数对象(参考:/pages/base/timesmodel/js/v2/ParameterObj.js)
  132 + * @param _options 组件内部参数(参考:/pages/base/timesmodel/js/v4/scheduleBuilder.component.js)
  133 + *
  134 + * //---------------- 输出参数(如下:)--------------//
  135 + * @param upDirFcsjArray(输出参数)上行的发车时间列表(moment对象)
  136 + * @param downDirFcsjArray(输出参数)下行的发车时间列表(moment对象)
  137 + * @param upDirBcObjArray(输出参数)上行的发车时间列表(InternalBcObj v2版本的班次对象)
  138 + * @param downDirBcObjArray(输出参数)下行的发车时间列表(InternalBcObj v2版本的班次对象)
  139 + */
  140 + return function(Utils, paramObj, _options,
  141 + upDirFcsjArray, downDirFcsjArray, upDirBcObjArray, downDirBcObjArray) {
  142 +
  143 + // 1-1、计算上行,下行的发车时间列表
  144 + var _upDirFcsjArray = _calcuFcsjArray_v1( // 上行的发车时间列表(moment对象)
  145 + Utils, paramObj, _options,
  146 + _options.upDirFirstTripTime,
  147 + _options.upDirLastTripTime
  148 + );
  149 + var _downDirFcsjArray = _calcuFcsjArray_v1( // 下行的发车时间列表(moment对象)
  150 + Utils, paramObj, _options,
  151 + _options.downDirFirstTripTime,
  152 + _options.downDirLastTripTime
  153 + );
  154 +
  155 + // 1-2、将上下时间列表转换成 InternalBcObj v2版本的班次对象Array
  156 + var _upDirBcObjArray = _convertFcsjArrayToInternalBcObjv2Array( // 上行的发车时间列表(InternalBcObj v2版本的班次对象)
  157 + Utils, true, _upDirFcsjArray, _options, paramObj);
  158 + var _downDirBcObjArray = _convertFcsjArrayToInternalBcObjv2Array( // 下行的发车时间列表(InternalBcObj v2版本的班次对象)
  159 + Utils, false, _downDirFcsjArray, _options, paramObj);
  160 +
  161 + // 1-3、保存到输出参数
  162 + $jQuery.each(_upDirFcsjArray, function(index, value) {
  163 + upDirFcsjArray.push(value);
  164 + });
  165 + $jQuery.each(_downDirFcsjArray, function(index, value) {
  166 + downDirFcsjArray.push(value);
  167 + });
  168 + $jQuery.each(_upDirBcObjArray, function(index, value) {
  169 + upDirBcObjArray.push(value);
  170 + });
  171 + $jQuery.each(_downDirBcObjArray, function(index, value) {
  172 + downDirBcObjArray.push(value);
  173 + });
  174 +
  175 + };
  176 +
  177 +} ($));
... ...
src/main/resources/static/pages/base/timesmodel/js/v4/core/VspFcsj_v1.js 0 → 100644
  1 +/**
  2 + * 将上行下行班次连接起来(VSP问题)
  3 + * v1版本目前如下:
  4 + * 1、要求block至少覆盖上下行首班车,末班车,原来的时刻表不需要完全覆盖,其他优化暂时不考虑
  5 + * 2、使用班型分布列表尽量覆盖生成的block
  6 + *
  7 + * @param $jQuery jQuery对象
  8 + */
  9 +var VspFcsj_v1 = (function ($jQuery) {
  10 +
  11 + /**
  12 + * 在指定列表中查找比指定班次大的最小班次。
  13 + * @param currentBcObj 指定班次(InternalBcObj v2版本的班次对象)
  14 + * @param isUpDir 是否上行
  15 + * @param bcObjArray 指定班次列表(从小到大,有序列表,InternalBcObj v2版本的班次对象列表)
  16 + * @param _options 组件内部参数
  17 + * @param paramObj v2版本的参数对象(看考:/pages/base/timesmodel/js/v2/ParameterObj.js)
  18 + */
  19 + function _findCeilBcObj(currentBcObj, isUpDir, bcObjArray, _options, paramObj) {
  20 + // 当前班次的到达时间
  21 + var _arriveTime = currentBcObj._$_arrtime;
  22 + // 停站时间(平均停站时间)
  23 + // TODO:后面要考虑停驶时间
  24 + // TODO:以临港8路为例,暂时修正参与计算的停站时间(上行加10分钟,下行加80分钟,80分钟实际上是停驶,以后要作为单独项计算)
  25 + var _layOverTime = currentBcObj._$_stoptime;
  26 + if (isUpDir) {
  27 + // _layOverTime = _layOverTime + 10;
  28 + } else {
  29 + // _layOverTime = _layOverTime + 80;
  30 + }
  31 +
  32 + var _rtnBcObj = null;
  33 + $jQuery.each(bcObjArray, function(index, item) {
  34 + // TODO:这里的算法后面再优化
  35 + if (!item._$$_internal_lp_obj.getLpNo()) { // 没有被block
  36 + if (item._$_fcsjObj.isAfter(paramObj.addMinute(_arriveTime, _layOverTime))) {
  37 + _rtnBcObj = item;
  38 + return false;
  39 + }
  40 + }
  41 + });
  42 +
  43 + return _rtnBcObj;
  44 + }
  45 +
  46 + /**
  47 + * 将上行下行班次连接起来(VSP问题)。
  48 + * @param upDirBcObjArray 上行班次列表(InternalBcObj v2版本的班次对象)
  49 + * @param downDirBcObjArray 下行班次列表(InternalBcObj v2版本的班次对象)
  50 + * @param _options 组件内部参数(参考:/pages/base/timesmodel/js/v4/scheduleBuilder.component.js)
  51 + * @param paramObj v2版本的参数对象(看考:/pages/base/timesmodel/js/v2/ParameterObj.js)
  52 + * @private
  53 + */
  54 + function _blockBcObjArray_v1(upDirBcObjArray, downDirBcObjArray,
  55 + _options, paramObj) {
  56 + var _rtn_blocks = [];
  57 +
  58 + // TODO:要求block至少覆盖上下行首班车,末班车,原来的时刻表不需要完全覆盖,其他优化暂时不考虑
  59 + // TODO:使用班型分布列表尽量覆盖生成的block
  60 +
  61 + var _block_no; // block编号
  62 + var _block = []; // block班次列表
  63 + var _fcNo = 1; // 班次发车的顺序号
  64 + var _current_trip; // block的第一个班次
  65 + var _current_trip_isUpDir; // block第一个班次的方向
  66 +
  67 + var _blockGs = 0; // block工时
  68 + var _bxDisIndex = _options.bxDisList.length == 0 ? -1 : 0; // 取第一个班型描述
  69 +
  70 + $jQuery.each(upDirBcObjArray, function(index, item) {
  71 + if (item._$$_internal_lp_obj.getLpNo()) {
  72 + // 已经被block跳过
  73 + return true;
  74 + }
  75 +
  76 + _block_no = (function (_b_no) {return _b_no} (index + 1));
  77 + _block = [];
  78 + _fcNo = 1;
  79 + _current_trip = item;
  80 + _current_trip_isUpDir = true;
  81 + _blockGs = 0;
  82 +
  83 + while (_current_trip != null) {
  84 + // 确定班型分布index,判定工时
  85 + if (_bxDisIndex != -1 && _bxDisIndex < _options.bxDisList.length) {
  86 + if (_blockGs > _options.bxDisList[_bxDisIndex].bxGs) {
  87 + console.log(_blockGs);
  88 + console.log(_options.bxDisList[_bxDisIndex].bxName);
  89 + _bxDisIndex ++;
  90 + break;
  91 + }
  92 + }
  93 +
  94 + _current_trip._$$_internal_lp_obj = { // 路牌对象
  95 + getLpNo : function() { return (function (_b_no) { return _b_no; } (index + 1)); },
  96 + getLpName: function() { return "路牌" + (function (_b_no) { return _b_no; } (index + 1)); }
  97 + };
  98 + _current_trip._$_fcno = _fcNo; // 发车顺序号
  99 + _blockGs += _current_trip._$_bcsj;
  100 + // _blockGs += _current_trip._$_stoptime;
  101 + _block.push(_current_trip);
  102 +
  103 + _current_trip = _findCeilBcObj(
  104 + _current_trip,
  105 + _current_trip_isUpDir,
  106 + _current_trip_isUpDir ? downDirBcObjArray : upDirBcObjArray,
  107 + _options,
  108 + paramObj
  109 + );
  110 + _current_trip_isUpDir = !_current_trip_isUpDir;
  111 +
  112 + /**
  113 + * 修正停站时间,
  114 + * 连起来后上一个班次的停站时间就不是_$_stoptime,需要用下一个班次时间重启计算,否则公时不准
  115 + * TODO:如果停站时间里包含停驶时间,需要另外计算的,后面再议
  116 + */
  117 + if (_current_trip != null) {
  118 + _block[_block.length - 1]._$_stoptime =
  119 + _current_trip._$_fcsjObj.diff(_block[_block.length - 1]._$_arrtime, 'minutes');
  120 + _blockGs += _block[_block.length - 1]._$_stoptime;
  121 +
  122 + console.log(_block[_block.length - 1]._$_stoptime);
  123 + }
  124 +
  125 + _fcNo ++;
  126 + }
  127 +
  128 + _rtn_blocks.push(_block);
  129 + });
  130 +
  131 + // // 调试打印
  132 + // $jQuery.each(_rtn_blocks, function(index, block) {
  133 + // _LogArray(block, function(item) {
  134 + // return item;
  135 + // });
  136 + // });
  137 +
  138 + return _rtn_blocks;
  139 + }
  140 +
  141 + /**
  142 + * 按照规则将block run cut。
  143 + * @param blockArray block列表(二维数组)
  144 + * @private
  145 + */
  146 + function _runcutBlockArray_v1(blockArray) {
  147 + // TODO:
  148 + }
  149 +
  150 +
  151 + /**
  152 + * 主函数。
  153 + * @param Utils 工具类对象(参考:/pages/base/timesmodel/js/v4/utils/ScheduleBuilderUtils.js)
  154 + * @param paramObj v2版本的参数对象(参考:/pages/base/timesmodel/js/v2/ParameterObj.js)
  155 + * @param _options 组件内部参数(参考:/pages/base/timesmodel/js/v4/scheduleBuilder.component.js)
  156 + * @param upDirBcObjArray 上行的发车时间列表(InternalBcObj v2版本的班次对象)
  157 + * @param downDirBcObjArray 下行的发车时间列表(InternalBcObj v2版本的班次对象)
  158 + *
  159 + * //---------------- 输出参数(如下:)--------------//
  160 + * @param blockArray(输出参数) block列表(二维数组)
  161 + */
  162 + return function(Utils, paramObj, _options,
  163 + upDirBcObjArray, downDirBcObjArray,
  164 + blockArray) {
  165 + // 1-1、将上下行班次block
  166 + var _blockArray = _blockBcObjArray_v1( // VSP后的数据(最重要的数据)
  167 + upDirBcObjArray, downDirBcObjArray, _options, paramObj);
  168 +
  169 + // 1-2、run cut block
  170 + _runcutBlockArray_v1(_blockArray);
  171 +
  172 + // TODO:可能还有更复杂的VSP计算,再议
  173 +
  174 + // 1-3、保存到输出参数
  175 + $jQuery.each(_blockArray, function(index1, value1) {
  176 + blockArray.push([]);
  177 + $jQuery.each(value1, function(index2, value2) {
  178 + blockArray[index1].push(value2);
  179 + })
  180 + });
  181 + };
  182 +
  183 +
  184 +} ($));
... ...
src/main/resources/static/pages/base/timesmodel/js/v4/scheduleBuilder.component.js
... ... @@ -11,81 +11,6 @@
11 11 // ------------ 全局函数(如下)-------------- //
12 12  
13 13 /**
14   - * 获取内部对象Builder
15   - * @param _options 组件内部参数
16   - * @param paramObjV2 v2版本的参数对象(参考:/pages/base/timesmodel/js/v2/ParameterObj.js)
17   - * @private
18   - */
19   - var _getInternalBcObjectBuilder_ = function(_options, paramObjV2) {
20   - var _block; // block编号,类似路牌
21   - var _run; // run编号,对block runcut产生,目前暂时不用
22   - var _tripTime; // 发车时间
23   - var _runTime; // 行驶时间
24   - var _arriveTime; // 到达时间
25   - var _layOverTime; // 停站时间
26   - var _isUp; // boolean 是否上行
27   - var _tripType; // 班次类型(normal,in_,out, bd, lc, cf等)
28   -
29   - // TODO:还有其他参数
30   -
31   - return {
32   - block: function(value) {
33   - _block = value;
34   - return this;
35   - },
36   - run: function(value) {
37   - _run = value;
38   - return this;
39   - },
40   - tripTime: function(value) {
41   - _tripTime = value;
42   - return this;
43   - },
44   - runTime: function(value) {
45   - _runTime = value;
46   - return this;
47   - },
48   - arriveTime: function(value) {
49   - _arriveTime = value;
50   - return this;
51   - },
52   - layOverTime: function(value) {
53   - _layOverTime = value;
54   - return this;
55   - },
56   - isUp: function(value) {
57   - _isUp = value;
58   - return this;
59   - },
60   - tripType: function(value) {
61   - _tripType = value;
62   - return this;
63   - },
64   -
65   - build : function() {
66   - // 返回InternalBcObj v2版本的班次对象(参考:/pages/base/timesmodel/js/v2/core/InternalBcObj.js)
67   - return new InternalBcObj(
68   - { getLpNo : function() { return _block;}, getLpName: function() { return "路牌" + _block; }},
69   - {
70   - bcType : _tripType, // 班次类型(normal,in_,out, bd, lc, cf等)
71   - isUp : _isUp, // boolean是否上下行
72   - fcno : 0, // 发车顺序号(block后确定)
73   - fcTimeObj : _tripTime, // 发车时间对象
74   - bclc : paramObjV2.calcuTravelLcNumber(_isUp, _tripType), // 班次里程
75   - bcsj : _runTime, // 班次历时
76   - arrtime : _arriveTime, // 到达时间对象
77   - stoptime : _layOverTime, // 停站时间
78   - tccid : _options.tccId, // 停车场id
79   - ttinfoid : _options.ttInfoId, // 时刻表id
80   - xl : _options.xlId, // 线路id
81   - qdzid : _isUp ? _options.upQdzId : _options.downQdzId, // 起点站id
82   - zdzid : _isUp ? _options.upZdzId : _options.downZdzId // 终点站id
83   - });
84   - }
85   - };
86   - };
87   -
88   - /**
89 14 * 打印数组。
90 15 * @param _array 数组
91 16 * @param logCallBackFun 数组元素的log值函数
... ... @@ -99,13 +24,6 @@
99 24 console.log(_logStrArray);
100 25 };
101 26  
102   - // 验证条件函数。
103   - var _Asserts = function(condition, msg) {
104   - if (!condition) {
105   - throw msg;
106   - }
107   - };
108   -
109 27 /**
110 28 * 重新计算组件内部用参数。
111 29 * @param _options 组件内部参数
... ... @@ -199,6 +117,21 @@
199 117  
200 118 //--------------- 时刻表生成用参数(以上)-----------------//
201 119  
  120 + //--------------- 时刻表生成用辅助参数(以下)-----------------//
  121 + _options.bxDisList = []; // 班型分布列表
  122 + $jQuery.each(paramObjV2.getBxDisList(), function(index, item) {
  123 + var bxCount = item.bxCount;
  124 + while (bxCount > 0) {
  125 + _options.bxDisList.push({
  126 + bxName: item.bxName,
  127 + bxGs: item.bxGs * 60 // 工时转换成分钟
  128 + });
  129 + bxCount --;
  130 + }
  131 + });
  132 +
  133 + //--------------- 时刻表生成用辅助参数(以上)-----------------//
  134 +
202 135 //--------------- 时刻表关联参数(以下)---------------//
203 136 _options.xlId = paramObjV2.getXlId(); // 线路id
204 137 _options.ttInfoId = paramObjV2.getTTinfoId(); // 时刻表id
... ... @@ -211,97 +144,6 @@
211 144 //--------------- 时刻表关联参数(以上)---------------//
212 145 };
213 146  
214   - /**
215   - * 将时间列表转换成 InternalBcObj v2版本的班次对象Array
216   - * @param isUp 是否上行
217   - * @param fcsjArray 发车时间列表(moment对象)
218   - * @param _options 组件内部参数
219   - * @param paramObjV2 v2版本的参数对象(看考:/pages/base/timesmodel/js/v2/ParameterObj.js)
220   - * @return Array InternalBcObj v2版本的班次对象列表(参考:/pages/base/timesmodel/js/v2/core/InternalBcObj.js)
221   - * @private
222   - */
223   - var _convertFcsjArrayToInternalBcObjv2Array = function(isUp, fcsjArray, _options, paramObjV2) {
224   - var _rtn_array = [];
225   -
226   - $jQuery.each(fcsjArray, function(index, item) {
227   - // 1、计算行驶时间,到达时间
228   - var runTime;
229   - var arriveTime;
230   - if (paramObjV2.isMPeakBc(item)) {
231   - runTime = isUp ? _options.upMPeakRunningTime : _options.downMPeakRunningTime;
232   - } else if (paramObjV2.isEPeakBc(item)) {
233   - runTime = isUp ? _options.upEPeakRunningTime : _options.downEPeakRunningTime;
234   - } else {
235   - runTime = isUp ? _options.upLowRunningTime : _options.downLowRunningTime;
236   - }
237   - arriveTime = paramObjV2.addMinute(item, runTime);
238   -
239   - // 2、计算停站时间(平均停站时间)
240   - var layOverTime;
241   - if (paramObjV2.isMPeakBc(arriveTime)) {
242   - layOverTime = isUp ?
243   - (Math.floor((_options.upMPeakMinLayoverTime + _options.upMPeakMaxLayoverTime) / 2)):
244   - (Math.floor((_options.downMPeakMinLayoverTime + _options.downMPeakMaxLayoverTime) / 2));
245   - } else if (paramObjV2.isEPeakBc(arriveTime)) {
246   - layOverTime = isUp ?
247   - (Math.floor((_options.upEPeakMinLayoverTime + _options.upEPeakMaxLayoverTime) / 2)):
248   - (Math.floor((_options.downEPeakMinLayoverTime + _options.downEPeakMaxLayoverTime) / 2));
249   - } else {
250   - layOverTime = isUp ?
251   - (Math.floor((_options.upLowMinLayoverTime + _options.upLowMaxLayoverTime) / 2)):
252   - (Math.floor((_options.downLowMinLayoverTime + _options.downLowMaxLayoverTime) / 2));
253   - }
254   -
255   - _rtn_array.push(_getInternalBcObjectBuilder_(_options, paramObjV2)
256   - .tripTime(item)
257   - .runTime(runTime)
258   - .arriveTime(arriveTime)
259   - .layOverTime(layOverTime)
260   - .isUp(isUp)
261   - .tripType("normal")
262   - .build());
263   - });
264   - return _rtn_array;
265   -
266   - };
267   -
268   - /**
269   - * 在指定列表中查找比指定班次大的最小班次。
270   - * @param currentBcObj 指定班次(InternalBcObj v2版本的班次对象)
271   - * @param isUpDir 是否上行
272   - * @param bcObjArray 指定班次列表(从小到大,有序列表,InternalBcObj v2版本的班次对象列表)
273   - * @param _options 组件内部参数
274   - * @param paramObjV2 v2版本的参数对象(看考:/pages/base/timesmodel/js/v2/ParameterObj.js)
275   - */
276   - var _findCeilBcObj = function(currentBcObj, isUpDir, bcObjArray, _options, paramObjV2) {
277   - // 当前班次的到达时间
278   - var _arriveTime = currentBcObj._$_arrtime;
279   - // 停站时间(平均停站时间)
280   - // TODO:后面要考虑停驶时间
281   - // TODO:以临港8路为例,暂时修正参与计算的停站时间(上行加10分钟,下行加80分钟,80分钟实际上是停驶,以后要作为单独项计算)
282   - var _layOverTime = currentBcObj._$_stoptime;
283   - if (isUpDir) {
284   - _layOverTime = _layOverTime + 10;
285   - } else {
286   - _layOverTime = _layOverTime + 80;
287   - }
288   -
289   - var _rtnBcObj = null;
290   - $jQuery.each(bcObjArray, function(index, item) {
291   - // TODO:这里的算法后面再优化
292   - if (!item._$$_internal_lp_obj.getLpNo()) { // 没有被block
293   - if (item._$_fcsjObj.isAfter(paramObjV2.addMinute(_arriveTime, _layOverTime))) {
294   - _rtnBcObj = item;
295   - return false;
296   - }
297   - }
298   - });
299   -
300   - return _rtnBcObj;
301   -
302   - };
303   -
304   -
305 147 // TODO:还有其他全局函数
306 148  
307 149 // ------------ 全局函数(如上)-------------- //
... ... @@ -312,7 +154,7 @@
312 154 * @param paramObj v2版本的ParameterObj对象。
313 155 */
314 156 $jQuery.fn.scheduleBuilder_v4 = function(paramObj) {
315   - _Asserts(paramObj != null, "参数ParameterObj(v2版本)不能为空!");
  157 + ScheduleBuilderUtils.AssertIsTrue(paramObj != null, "参数ParameterObj(v2版本)不能为空!");
316 158  
317 159 // 内部map对象
318 160 var _options = {
... ... @@ -322,129 +164,6 @@
322 164 // 计算参数
323 165 _calcuParameter(_options, paramObj);
324 166  
325   - /**
326   - * 计算发车时间列表v1。
327   - * 1、计算当前班次的下一个班次时间(使用各个时间段的平均发车间隔,首班车,末班车发车时间)
328   - * 2、重复操作1,直到下一个班次时间大于末班车发车时间
329   - * 3、退出循环,使用末班车作为最后一个班次,计算与上一个班次的发车间隔
330   - * 4、这里直接将最后一个班次删除,将倒数第二个班次改成末班车时间,这样会造成最后一般车发车间隔可能大于最大发车间隔(TODO:这个暂时不管了以后再说)
331   - * @param firstTripTime 第一个班次时间(moment对象)
332   - * @param lastTripTime 最后一个班次时间(moment对象)
333   - * @return Array 时间从早到晚的发车时间列表(moment对象Array)
334   - */
335   - var _calcuFcsjArray_v1 = function (firstTripTime, lastTripTime) {
336   - _Asserts(firstTripTime.isBefore(lastTripTime), "firstTripTime必须早于lastTripTime!");
337   -
338   - var _fcsjArray = [];
339   - _fcsjArray.push(firstTripTime);
340   -
341   - // 按照,低谷->早高峰->低谷->晚高峰->低谷推进
342   - var _previousTripTime = null;
343   - var _nextTripTime = null;
344   - do {
345   - _previousTripTime = _fcsjArray[_fcsjArray.length - 1];
346   -
347   - if (paramObj.isMPeakBc(_previousTripTime)) { // 早高峰班次
348   - _nextTripTime = paramObj.addMinute( // 使用平均发车间隔
349   - _previousTripTime,
350   - Math.floor((_options.mPeakMinHeadway + _options.mPeakMaxHeadway) / 2)
351   - );
352   - } else if (paramObj.isEPeakBc(_previousTripTime)) { // 晚高峰班次
353   - _nextTripTime = paramObj.addMinute( // 使用平均发车间隔
354   - _previousTripTime,
355   - Math.floor((_options.ePeakMinHeadway + _options.ePeakMaxHeadway) / 2)
356   - );
357   - } else { // 低谷班次
358   - _nextTripTime = paramObj.addMinute( // 使用平均发车间隔
359   - _previousTripTime,
360   - Math.floor((_options.lowMinHeadway + _options.lowMaxHeadway) / 2)
361   - );
362   - }
363   - _fcsjArray.push(_nextTripTime);
364   - } while (_nextTripTime.isBefore(lastTripTime));
365   -
366   - _fcsjArray.pop(); // 删除最后一个班次
367   - _fcsjArray.pop(); // 删除倒数第二个班次
368   - // 将末班车班次作为最后一个班次,倒数第二个发车间隔可能大于最大发车间隔
369   - // TODO:程序暂时不自动修正,人工修正
370   - _fcsjArray.push(lastTripTime);
371   -
372   - return _fcsjArray;
373   - };
374   -
375   - /**
376   - * 将上行下行班次连接起来(VSP问题)。
377   - * @param upDirBcObjArray 上行班次列表(InternalBcObj v2版本的班次对象)
378   - * @param downDirBcObjArray 下行班次列表(InternalBcObj v2版本的班次对象)
379   - * @private
380   - */
381   - var _blockBcObjArray_v1 = function (upDirBcObjArray, downDirBcObjArray) {
382   - var _rtn_blocks = [];
383   -
384   - // TODO:要求block至少覆盖上下行首班车,末班车,原来的时刻表不需要完全覆盖,其他优化暂时不考虑
385   -
386   - var _block_no; // block编号
387   - var _block = []; // block班次列表
388   - var _fcNo = 1; // 班次发车的顺序号
389   - var _current_trip; // block的第一个班次
390   - var _current_trip_isUpDir; // block第一个班次的方向
391   -
392   - $jQuery.each(upDirBcObjArray, function(index, item) {
393   - if (item._$$_internal_lp_obj.getLpNo()) {
394   - // 已经被block跳过
395   - return true;
396   - }
397   -
398   - _block_no = (function (_b_no) {return _b_no} (index + 1));
399   - _block = [];
400   - _fcNo = 1;
401   - _current_trip = item;
402   - _current_trip_isUpDir = true;
403   -
404   - while (_current_trip != null) {
405   - _current_trip._$$_internal_lp_obj = { // 路牌对象
406   - getLpNo : function() { return (function (_b_no) { return _b_no; } (index + 1)); },
407   - getLpName: function() { return "路牌" + (function (_b_no) { return _b_no; } (index + 1)); }
408   - };
409   - _current_trip._$_fcno = _fcNo; // 发车顺序号
410   - _block.push(_current_trip);
411   -
412   - _current_trip = _findCeilBcObj(
413   - _current_trip,
414   - _current_trip_isUpDir,
415   - _current_trip_isUpDir ? downDirBcObjArray : upDirBcObjArray,
416   - _options,
417   - paramObj
418   - );
419   - _current_trip_isUpDir = !_current_trip_isUpDir;
420   -
421   - _fcNo ++;
422   - }
423   -
424   - _rtn_blocks.push(_block);
425   - });
426   -
427   - // 调试打印
428   - $jQuery.each(_rtn_blocks, function(index, block) {
429   - _LogArray(block, function(item) {
430   - return item;
431   - });
432   - });
433   -
434   - return _rtn_blocks;
435   - };
436   -
437   - /**
438   - * 按照规则将block run cut。
439   - * @param blockArray block列表(二维数组)
440   - * @private
441   - */
442   - var _runcutBlockArray_v1 = function (blockArray) {
443   - // TODO:
444   -
445   - };
446   -
447   -
448 167 // 插件的根dom,包含模版的dom元素,由使用插件的界面指定
449 168 var _rootDom = this[0];
450 169  
... ... @@ -472,33 +191,12 @@
472 191 });
473 192  
474 193 // 1-1、计算上行,下行的发车时间列表
475   - upDirFcsjArray = _calcuFcsjArray_v1(
476   - _options.upDirFirstTripTime,
477   - _options.upDirLastTripTime
478   - );
479   - downDirFcsjArray = _calcuFcsjArray_v1(
480   - _options.downDirFirstTripTime,
481   - _options.downDirLastTripTime
482   - );
483   - // 1-2、将上下时间列表转换成 InternalBcObj v2版本的班次对象Array
484   - upDirBcObjArray = _convertFcsjArrayToInternalBcObjv2Array(true, upDirFcsjArray, _options, paramObj);
485   - downDirBcObjArray = _convertFcsjArrayToInternalBcObjv2Array(false, downDirFcsjArray, _options, paramObj);
486   -
487   - // 调试打印
488   - _LogArray(upDirBcObjArray, function(item) {
489   - return item._$_fcsjObj.format("HH:mm");
490   - });
491   - _LogArray(downDirBcObjArray, function(item) {
492   - return item._$_fcsjObj.format("HH:mm");
493   - });
494   -
495   - // 2、将上下行班次block
496   - blockArray = _blockBcObjArray_v1(upDirBcObjArray, downDirBcObjArray);
497   -
498   - // 3、run cut block
499   - _runcutBlockArray_v1(blockArray);
  194 + CalcuFcsj_v1(ScheduleBuilderUtils, paramObj, _options,
  195 + upDirFcsjArray, downDirFcsjArray, upDirBcObjArray, downDirBcObjArray);
500 196  
501   - // TODO:可能还有更复杂的VSP计算,再议
  197 + // 1-2、VSP上下行发车时间列表
  198 + VspFcsj_v1(ScheduleBuilderUtils, paramObj, _options,
  199 + upDirBcObjArray, downDirBcObjArray, blockArray);
502 200  
503 201 });
504 202  
... ...
src/main/resources/static/pages/base/timesmodel/js/v4/utils/ScheduleBuilderUtils.js 0 → 100644
  1 +/**
  2 + * 时刻表生成v4版本工具类。
  3 + */
  4 +var ScheduleBuilderUtils = (function () {
  5 +
  6 + /**
  7 + * 验证condition条件是否为真,为否跑异常
  8 + * @param condition 条件
  9 + * @param msg 异常msg
  10 + * @private
  11 + */
  12 + function _AssertIsTrue_(condition, msg) {
  13 + if (!condition) {
  14 + throw msg;
  15 + }
  16 + }
  17 +
  18 + /**
  19 + * 获取内部对象Builder(Build模式)
  20 + * @param _options 组件内部参数(参考:/pages/base/timesmodel/js/v4/scheduleBuilder.component.js)
  21 + * @param paramObjV2 v2版本的参数对象(参考:/pages/base/timesmodel/js/v2/ParameterObj.js)
  22 + * @private
  23 + */
  24 + function _getInternalBcObjectBuilder_(_options, paramObjV2) {
  25 + var _block; // block编号,类似路牌
  26 + var _run; // run编号,对block runcut产生,目前暂时不用
  27 + var _tripTime; // 发车时间
  28 + var _runTime; // 行驶时间
  29 + var _arriveTime; // 到达时间
  30 + var _layOverTime; // 停站时间
  31 + var _isUp; // boolean 是否上行
  32 + var _tripType; // 班次类型(normal,in_,out, bd, lc, cf等)
  33 +
  34 + // TODO:还有其他参数
  35 +
  36 + return {
  37 + block: function(value) {
  38 + _block = value;
  39 + return this;
  40 + },
  41 + run: function(value) {
  42 + _run = value;
  43 + return this;
  44 + },
  45 + tripTime: function(value) {
  46 + _tripTime = value;
  47 + return this;
  48 + },
  49 + runTime: function(value) {
  50 + _runTime = value;
  51 + return this;
  52 + },
  53 + arriveTime: function(value) {
  54 + _arriveTime = value;
  55 + return this;
  56 + },
  57 + layOverTime: function(value) {
  58 + _layOverTime = value;
  59 + return this;
  60 + },
  61 + isUp: function(value) {
  62 + _isUp = value;
  63 + return this;
  64 + },
  65 + tripType: function(value) {
  66 + _tripType = value;
  67 + return this;
  68 + },
  69 +
  70 + build : function() {
  71 + // 返回InternalBcObj v2版本的班次对象(参考:/pages/base/timesmodel/js/v2/core/InternalBcObj.js)
  72 + return new InternalBcObj(
  73 + { getLpNo : function() { return _block;}, getLpName: function() { return "路牌" + _block; }},
  74 + {
  75 + bcType : _tripType, // 班次类型(normal,in_,out, bd, lc, cf等)
  76 + isUp : _isUp, // boolean是否上下行
  77 + fcno : 0, // 发车顺序号(block后确定)
  78 + fcTimeObj : _tripTime, // 发车时间对象
  79 + bclc : paramObjV2.calcuTravelLcNumber(_isUp, _tripType), // 班次里程
  80 + bcsj : _runTime, // 班次历时
  81 + arrtime : _arriveTime, // 到达时间对象
  82 + stoptime : _layOverTime, // 停站时间
  83 + tccid : _options.tccId, // 停车场id
  84 + ttinfoid : _options.ttInfoId, // 时刻表id
  85 + xl : _options.xlId, // 线路id
  86 + qdzid : _isUp ? _options.upQdzId : _options.downQdzId, // 起点站id
  87 + zdzid : _isUp ? _options.upZdzId : _options.downZdzId // 终点站id
  88 + });
  89 + }
  90 + };
  91 + }
  92 +
  93 +
  94 + return {
  95 + AssertIsTrue : _AssertIsTrue_,
  96 + getInternalBcObjectBuilder : _getInternalBcObjectBuilder_,
  97 +
  98 + };
  99 +
  100 +
  101 +} ());
... ...
src/main/resources/static/pages/base/timesmodel/tepms/run_headway_temp.html
... ... @@ -199,7 +199,7 @@
199 199 <div class="col-md-6">
200 200 <label class="control-label col-md-5"><span class="required"> * </span>早高峰发车间隔 :</label>
201 201 <div class="col-md-3" style="padding-right: 0px;">
202   - <input type="text" class="form-control" value="15" name="zgffcjxmin" id="zgffcjxmin_id"
  202 + <input type="text" class="form-control" value="20" name="zgffcjxmin" id="zgffcjxmin_id"
203 203 placeholder="最小间隔">
204 204 </div>
205 205 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div>
... ... @@ -225,7 +225,7 @@
225 225 <div class="col-md-6">
226 226 <label class="control-label col-md-5"><span class="required"> * </span>晚高峰发车间隔 :</label>
227 227 <div class="col-md-3" style="padding-right: 0px;">
228   - <input type="text" class="form-control" value="15" name="wffcjxmin" id="wffcjxmin_id"
  228 + <input type="text" class="form-control" value="20" name="wffcjxmin" id="wffcjxmin_id"
229 229 placeholder="最小间隔">
230 230 </div>
231 231 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div>
... ... @@ -247,12 +247,12 @@
247 247 <div class="col-md-6">
248 248 <label class="control-label col-md-5"><span class="required"> * </span>低谷发车间隔 :</label>
249 249 <div class="col-md-3" style="padding-right: 0px;">
250   - <input type="text" class="form-control" value="20" name="dgfcjxmin" id="dgfcjxmin_id"
  250 + <input type="text" class="form-control" value="40" name="dgfcjxmin" id="dgfcjxmin_id"
251 251 placeholder="最小间隔">
252 252 </div>
253 253 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div>
254 254 <div class="col-md-3" style="padding-left: 0px;">
255   - <input type="text" class="form-control" value="25" name="dgfcjxmax" id="dgfcjxmax_id"
  255 + <input type="text" class="form-control" value="40" name="dgfcjxmax" id="dgfcjxmax_id"
256 256 placeholder="最大间隔">
257 257 </div>
258 258 </div>
... ...