Commit 7753da64754da5b6b9362f174e712643d70e6c35

Authored by 徐烜
1 parent 75aa8fc6

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

src/main/resources/static/pages/base/timesmodel/gantt.html
@@ -213,9 +213,11 @@ @@ -213,9 +213,11 @@
213 <script src="/pages/base/timesmodel/js/v2_2/strategy/runtime/LinearRuntimeS1.js"></script> 213 <script src="/pages/base/timesmodel/js/v2_2/strategy/runtime/LinearRuntimeS1.js"></script>
214 <script src="/pages/base/timesmodel/js/v2_2/strategy/layovertime/LayoverTimeS1.js"></script> 214 <script src="/pages/base/timesmodel/js/v2_2/strategy/layovertime/LayoverTimeS1.js"></script>
215 <script src="/pages/base/timesmodel/js/v2/strategy/StrategyUtils.js"></script> 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 <!-- v4版本的时刻表生成组件 --> 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 <script src="/pages/base/timesmodel/js/v4/scheduleBuilder.component.js"></script> 221 <script src="/pages/base/timesmodel/js/v4/scheduleBuilder.component.js"></script>
220 222
221 <script src="/pages/base/timesmodel/js/errorinfo.js"></script> 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,6 +328,24 @@ var ParameterObj = function() {
328 return _timeObj; 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 return { 349 return {
332 350
333 /** 351 /**
@@ -359,6 +377,8 @@ var ParameterObj = function() { @@ -359,6 +377,8 @@ var ParameterObj = function() {
359 _fcjxIntervalObj = _fcjxIntervalObj_fun(); 377 _fcjxIntervalObj = _fcjxIntervalObj_fun();
360 // 停站类型 378 // 停站类型
361 _stopTypeObj = _stopTypeObj_fun(); 379 _stopTypeObj = _stopTypeObj_fun();
  380 + // 班型分布列表
  381 + _bxDisList = _fnBxDisList();
362 // 线路对象 382 // 线路对象
363 _xlObj = _xlObj_fun(); 383 _xlObj = _xlObj_fun();
364 // 停车场对象 384 // 停车场对象
@@ -843,6 +863,14 @@ var ParameterObj = function() { @@ -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,4 +1477,4 @@ var ParameterObj = function() {
1449 1477
1450 1478
1451 }; 1479 };
1452 -};  
1453 \ No newline at end of file 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,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 * @param _array 数组 15 * @param _array 数组
91 * @param logCallBackFun 数组元素的log值函数 16 * @param logCallBackFun 数组元素的log值函数
@@ -99,13 +24,6 @@ @@ -99,13 +24,6 @@
99 console.log(_logStrArray); 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 * @param _options 组件内部参数 29 * @param _options 组件内部参数
@@ -199,6 +117,21 @@ @@ -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 _options.xlId = paramObjV2.getXlId(); // 线路id 136 _options.xlId = paramObjV2.getXlId(); // 线路id
204 _options.ttInfoId = paramObjV2.getTTinfoId(); // 时刻表id 137 _options.ttInfoId = paramObjV2.getTTinfoId(); // 时刻表id
@@ -211,97 +144,6 @@ @@ -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 // TODO:还有其他全局函数 147 // TODO:还有其他全局函数
306 148
307 // ------------ 全局函数(如上)-------------- // 149 // ------------ 全局函数(如上)-------------- //
@@ -312,7 +154,7 @@ @@ -312,7 +154,7 @@
312 * @param paramObj v2版本的ParameterObj对象。 154 * @param paramObj v2版本的ParameterObj对象。
313 */ 155 */
314 $jQuery.fn.scheduleBuilder_v4 = function(paramObj) { 156 $jQuery.fn.scheduleBuilder_v4 = function(paramObj) {
315 - _Asserts(paramObj != null, "参数ParameterObj(v2版本)不能为空!"); 157 + ScheduleBuilderUtils.AssertIsTrue(paramObj != null, "参数ParameterObj(v2版本)不能为空!");
316 158
317 // 内部map对象 159 // 内部map对象
318 var _options = { 160 var _options = {
@@ -322,129 +164,6 @@ @@ -322,129 +164,6 @@
322 // 计算参数 164 // 计算参数
323 _calcuParameter(_options, paramObj); 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 // 插件的根dom,包含模版的dom元素,由使用插件的界面指定 167 // 插件的根dom,包含模版的dom元素,由使用插件的界面指定
449 var _rootDom = this[0]; 168 var _rootDom = this[0];
450 169
@@ -472,33 +191,12 @@ @@ -472,33 +191,12 @@
472 }); 191 });
473 192
474 // 1-1、计算上行,下行的发车时间列表 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,7 +199,7 @@
199 <div class="col-md-6"> 199 <div class="col-md-6">
200 <label class="control-label col-md-5"><span class="required"> * </span>早高峰发车间隔 :</label> 200 <label class="control-label col-md-5"><span class="required"> * </span>早高峰发车间隔 :</label>
201 <div class="col-md-3" style="padding-right: 0px;"> 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 placeholder="最小间隔"> 203 placeholder="最小间隔">
204 </div> 204 </div>
205 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div> 205 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div>
@@ -225,7 +225,7 @@ @@ -225,7 +225,7 @@
225 <div class="col-md-6"> 225 <div class="col-md-6">
226 <label class="control-label col-md-5"><span class="required"> * </span>晚高峰发车间隔 :</label> 226 <label class="control-label col-md-5"><span class="required"> * </span>晚高峰发车间隔 :</label>
227 <div class="col-md-3" style="padding-right: 0px;"> 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 placeholder="最小间隔"> 229 placeholder="最小间隔">
230 </div> 230 </div>
231 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div> 231 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div>
@@ -247,12 +247,12 @@ @@ -247,12 +247,12 @@
247 <div class="col-md-6"> 247 <div class="col-md-6">
248 <label class="control-label col-md-5"><span class="required"> * </span>低谷发车间隔 :</label> 248 <label class="control-label col-md-5"><span class="required"> * </span>低谷发车间隔 :</label>
249 <div class="col-md-3" style="padding-right: 0px;"> 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 placeholder="最小间隔"> 251 placeholder="最小间隔">
252 </div> 252 </div>
253 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div> 253 <div class="col-md-1" style="padding-top: 10px; font-size: 85%;">至</div>
254 <div class="col-md-3" style="padding-left: 0px;"> 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 placeholder="最大间隔"> 256 placeholder="最大间隔">
257 </div> 257 </div>
258 </div> 258 </div>