Commit e14690ee481e3d2e872d703a255a1ed0c7637833

Authored by 游瑞烽
1 parent 9d3fbdde

时刻表echarts gantt图,和给定班型算法

Showing 23 changed files with 3540 additions and 67 deletions

Too many changes to show.

To preserve performance only 23 of 27 files are displayed.

src/main/resources/static/pages/base/line/js/map-ajax-getdata.js
... ... @@ -63,7 +63,6 @@ var MapGetAjaxData = function(){
63 63 // 新增缓存站点保存
64 64 stationCacheSave : function(station,callback) {
65 65 $post('/station/stationCacheSave',station,function(data) {
66   - debugger
67 66 callback && callback(data);
68 67 });
69 68 },
... ...
src/main/resources/static/pages/base/line/js/map-function.js
... ... @@ -116,7 +116,6 @@ var PublicFunctions = function () {
116 116 }
117 117 // 路段数据长度
118 118 var dataLen = data.length;
119   - //debugger;
120 119 // 如果大于零
121 120 if(dataLen>0) {
122 121 // 编辑路段数据
... ...
src/main/resources/static/pages/base/line/list.html
... ... @@ -49,7 +49,7 @@
49 49 </a>
50 50 <ul class="dropdown-menu pull-right" id="datatable_ajax_tools">
51 51 <li>
52   - <a href="javascript:;" data-action="0" id="createUsingSingle" class="tool-action"> <i class="fa fa-file-zip-o"></i> 生成路单文件</a>
  52 + <a href="javascript:;" data-action="0" id="createUsingSingle" class="tool-action"> <i class="fa fa-file-zip-o"></i> 生成线路文件</a>
53 53 </li>
54 54 <li>
55 55 <a href="javascript:;" data-action="1" id="editRoute" class="tool-action"> <i class="fa fa-level-up"></i>上传GPS生成路线</a>
... ...
src/main/resources/static/pages/base/stationroute/edit_select.html
... ... @@ -112,7 +112,7 @@ $(&#39;#edit_select_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,drw,ajaxd,ed
112 112 var params = form.serializeJSON();
113 113 // 站点名称
114 114 var editStationName = params.stationNamebootbox;
115   -
  115 + // TODO(点击查询位置后绘画效果失败,待修改)
116 116 if(params.editselect==0){
117 117 editStationObj.setEitdStation(Station);
118 118 editStationObj.setEitdStationName(editStationName);
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-list-map.js
... ... @@ -295,7 +295,7 @@ window.WorldsBMap = function () {
295 295 localSearch.search(Address);
296 296 },
297 297  
298   - // 编辑站点
  298 + // 站点编辑
299 299 editShapes: function (obj) {
300 300 // 关闭信息窗口
301 301 mapBValue.closeInfoWindow();
... ... @@ -788,7 +788,7 @@ window.WorldsBMap = function () {
788 788 }
789 789 }
790 790 },
791   - // 编辑路段
  791 + // 路段编辑
792 792 editSection : function(sectionRoudId) {
793 793 layer.confirm('进入编辑状态', {
794 794 btn : [ '确定','返回' ], icon: 3, title:'提示'
... ...
src/main/resources/static/pages/base/timesmodel/css/index.css
... ... @@ -2,6 +2,27 @@ body {
2 2 overflow: hidden;
3 3 }
4 4  
  5 +.bc-adjust-list-input {
  6 + /*border-style: solid;*/
  7 + /*border-width: 2px;*/
  8 + /*border-color: #f1586f;*/
  9 + width: 600px;
  10 + height: 38px;
  11 + /*color: #12cada !important;*/
  12 +
  13 +}
  14 +
  15 +.bc-adjust-list {
  16 + right: 500px;
  17 + position: absolute;
  18 + border: none;
  19 + width: 709px;
  20 + height: 40px;
  21 + border-right-color: #0d638f;
  22 + padding: 4px 0 0 0;
  23 + z-index: 9999;
  24 +}
  25 +
5 26 .relationshipGraph-tip {
6 27 border-radius: 6px !important;
7 28 background: #192838 !important;
... ... @@ -108,7 +129,7 @@ text.alert-danger {
108 129 /* fill: #3b414e; */
109 130 fill: #31394a;
110 131 cursor: default;
111   - stroke: #ffffff
  132 + stroke: #ffffff;
112 133 stroke-width: 1px;
113 134 pointer-events: all;
114 135 rx:4;
... ... @@ -117,9 +138,27 @@ text.alert-danger {
117 138  
118 139  
119 140 .ganttSvgContainer {
120   - height: 400px;
  141 + height: 720px;
121 142 overflow: auto;
122   - position: relative;
  143 + /*position: relative;*/
  144 +}
  145 +
  146 +#bcContainer {
  147 + width: 100%;
  148 + min-height: 100%;
  149 + top: -160px;
  150 + /*margin: 0px -100px 0px 0px;*/
  151 +}
  152 +#upDownContainer {
  153 + width: 100%;
  154 + height: 350px;
  155 + /*margin: 10px 0px 0px 10px;*/
  156 +}
  157 +
  158 +.gtt {
  159 + height: 720px;
  160 + width: 100%;
  161 + overflow-y: auto;
123 162 }
124 163  
125 164 .svg-chart {
... ... @@ -198,7 +237,7 @@ text.alert-danger {
198 237  
199 238  
200 239 .ganttSvgContainer::-webkit-scrollbar {
201   -width:6px;
  240 +width:12px;
202 241 height:6px;
203 242 }
204 243 .ganttSvgContainer::-webkit-scrollbar-button {
... ... @@ -224,4 +263,33 @@ background:rgba(255, 255, 255, 0);
224 263 .ganttSvgContainer::-webkit-scrollbar-resizer {
225 264 /* background:#FF0BEE; */
226 265 background:rgba(255, 255, 255, 0);
  266 +}
  267 +
  268 +.gtt::-webkit-scrollbar {
  269 +width:12px;
  270 +height:6px;
  271 +}
  272 +.gtt::-webkit-scrollbar-button {
  273 +/* background-color:#FF7677; */
  274 +background:rgba(255, 255, 255, 0);
  275 +}
  276 +.gtt::-webkit-scrollbar-track {
  277 +/* background:#FF66D5; */
  278 +background:rgba(255, 255, 255, 0);
  279 +}
  280 +.gtt::-webkit-scrollbar-track-piece {
  281 +/* background:#ff0000; */
  282 +background:rgba(255, 255, 255, 0);
  283 +}
  284 +.gtt::-webkit-scrollbar-thumb{
  285 +background:rgba(197, 196, 196, 0.81);
  286 +border-radius:10px !important;
  287 +}
  288 +.gtt::-webkit-scrollbar-corner {
  289 +/* background:#82AFFF; */
  290 +background:rgba(255, 255, 255, 0);
  291 +}
  292 +.gtt::-webkit-scrollbar-resizer {
  293 +/* background:#FF0BEE; */
  294 +background:rgba(255, 255, 255, 0);
227 295 }
228 296 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/fragments/addbc.html 0 → 100644
  1 +<!-- 添加班次参数 -->
  2 +<div class="modal fade" id="addBc_mobal" tabindex="-1" role="basic" aria-hidden="true">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content" style="width: 900px;">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
  7 + <h4 class="modal-title">添加班次参数</h4>
  8 + </div>
  9 + <div class="modal-body">
  10 + <form class="form-horizontal" action="/" method="post" id="addBc" role="form">
  11 + <!-- alert-danger 组件START -->
  12 + <div class="alert alert-danger display-hide" id="addBcName">
  13 + <button class="close" data-close="alert"></button>
  14 + 您的输入有误,请检查下面的输入项
  15 + </div>
  16 + <input id="qdzInput" class="hidden" />
  17 + <input id="zdzInput" class="hidden" />
  18 +
  19 + <!-- 表单分组组件 form-group START -->
  20 + <div class="form-group">
  21 + <!-- 路牌 (* 必填项) START -->
  22 + <div class="col-md-6">
  23 + <label class="control-label col-md-6">
  24 + <span class="required"> * </span>所属路牌&nbsp;&nbsp;&nbsp;:
  25 + </label>
  26 + <div class="col-md-6">
  27 + <select type="text" name="lpName" class="form-control" id="lpNameSelect" >
  28 + </select>
  29 + </div>
  30 + </div>
  31 + <!-- 路牌 (* 必填项) END -->
  32 +
  33 + <!-- 发车顺序号 (* 必填项) START -->
  34 + <div class="col-md-6">
  35 + <label class="control-label col-md-6">
  36 + <span class="required"> * </span> 发车顺序号:
  37 + </label>
  38 + <div class="col-md-6">
  39 + <input type="text" class="form-control" name="fcno" id="fcnoInput" placeholder="发车顺序号">
  40 + </div>
  41 + </div>
  42 + </div>
  43 + <!-- 表单分组组件 form-group END -->
  44 +
  45 + <!-- 表单分组组件 form-group START -->
  46 + <!--<div class="form-group">
  47 + &lt;!&ndash; 对应班次数 (* 必填项) START &ndash;&gt;
  48 + <div class="col-md-6">
  49 + <label class="control-label col-md-6">
  50 + <span class="required"> * </span> 添加类型&nbsp;&nbsp;&nbsp;:
  51 + </label>
  52 + <div class="col-md-6">
  53 + <select name="addNum" class="form-control" id="addNumSelect">
  54 + &lt;!&ndash;<option value="">&#45;&#45; 请选择添加类型 &#45;&#45;</option>&ndash;&gt;
  55 + <option value="1">单个班次</option>
  56 + <option value="2">一圈(上下行都有)</option>
  57 + </select>
  58 + </div>
  59 + </div>
  60 + &lt;!&ndash; 对应班次数 (* 必填项) END &ndash;&gt;
  61 +
  62 + &lt;!&ndash; 方向 (* 必填项) START &ndash;&gt;
  63 + <div class="col-md-6">
  64 + <label class="control-label col-md-6">
  65 + <span class="required"> * </span> 方向&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
  66 + </label>
  67 + <div class="col-md-6">
  68 + &lt;!&ndash; <input type="text" class="form-control" name="dic" id="dicInput" placeholder="方向"> &ndash;&gt;
  69 + <select name="dir" class="form-control" id="dirSelect">
  70 + <option value="">&#45;&#45; 请选择方向 &#45;&#45;</option>
  71 + <option value="relationshipGraph-up">上行</option>
  72 + <option value="relationshipGraph-down">下行</option>
  73 + </select>
  74 + </div>
  75 + </div>
  76 + &lt;!&ndash; 方向 (* 必填项) END &ndash;&gt;
  77 + </div>-->
  78 + <!-- 表单分组组件 form-group END -->
  79 +
  80 + <!-- 表单分组组件 form-group START -->
  81 + <div class="form-group">
  82 + <!-- 发车时间 (* 必填项) START -->
  83 + <div class="col-md-6">
  84 + <label class="control-label col-md-6">
  85 + <span class="required"> * </span> 发车时间&nbsp;&nbsp;&nbsp;:
  86 + </label>
  87 + <div class="col-md-6">
  88 + <input type="text" class="form-control" name="fcsj" id="fcsjInput" placeholder="发车时间">
  89 + </div>
  90 + </div>
  91 + <!-- 发车时间 (* 必填项) END -->
  92 +
  93 + <!-- 班次类型 (* 必填项) START -->
  94 + <div class="col-md-6">
  95 + <label class="control-label col-md-6">
  96 + <span class="required"> * </span> 班次类型&nbsp;&nbsp;&nbsp;:
  97 + </label>
  98 + <div class="col-md-6">
  99 + <select name="bcType" class="form-control" id="bcTypeSelect">
  100 + <option value="">-- 请选择类型 --</option>
  101 + <option value="bd">早例保</option>
  102 + <option value="out">出场</option>
  103 + <option value="normal">正常</option>
  104 + <option value="cf">吃饭</option>
  105 + <option value="in">进场</option>
  106 + <option value="lc">晚例保</option>
  107 + <option value="major">放大站</option>
  108 + <option value="venting">直放</option>
  109 + <option value="region">区间</option>
  110 + </select>
  111 + </div>
  112 + </div>
  113 + <!-- 班次类型 (* 必填项) END -->
  114 + </div>
  115 + <!-- 表单分组组件 form-group END -->
  116 +
  117 + <!-- 表单分组组件 form-group START -->
  118 + <div class="form-group">
  119 + <!-- 班次历时 (* 必填项) START -->
  120 + <div class="col-md-6">
  121 + <label class="control-label col-md-6">
  122 + <span class="required"> * </span> 班次历时&nbsp;&nbsp;&nbsp;:
  123 + </label>
  124 + <div class="col-md-6">
  125 + <input type="text" class="form-control" name="bcsj" id="bcsjInput" placeholder="班次历时">
  126 + </div>
  127 + </div>
  128 + <!-- 班次历时 (* 必填项) END -->
  129 +
  130 + <!-- 是否分班 START (因为options值基本固定,所以在页面固定。【以后可以根具需求修改成使用字典表实现】) -->
  131 + <div class="col-md-6">
  132 + <label class="control-label col-md-6">
  133 + <span class="required"> * </span> 是否分班&nbsp;&nbsp;&nbsp;:
  134 + </label>
  135 + <div class="col-md-6">
  136 + <select name="isfb" class="form-control" id="isfbSelect">
  137 + <option value=0>否</option>
  138 + <option value=1>是</option>
  139 + </select>
  140 + </div>
  141 + </div>
  142 + <!-- 是否分班 END -->
  143 + </div>
  144 + <!-- 表单分组组件 form-group END -->
  145 + </form>
  146 + </div>
  147 + <div class="modal-footer">
  148 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
  149 + <button type="button" class="btn btn-primary" id="addBcnext">确定</button>
  150 + </div>
  151 + </div>
  152 + </div>
  153 +</div>
  154 +<script type="text/javascript">
  155 +/**
  156 + * @description : (TODO) 触发被选元素的指定事件类型。
  157 + *
  158 + * @params [obj--图形对象;bf--函数集合对象;cardata--路牌对应的Y轴坐标数组]
  159 + *
  160 + * @status OK.
  161 + */
  162 +$('#addBc_mobal').on('addBcMobal.show', function(e,lpData,lpDataCount,echartsDrawGTT){
  163 + // 延迟200毫秒执行.
  164 + setTimeout(function(){
  165 + // 加载显示mobal
  166 + $('#addBc_mobal').modal({show : true,backdrop: 'static', keyboard: false});
  167 + },200);
  168 + $('#fcsjInput').datetimepicker({format : 'HH:mm', locale: 'zh-cn'});
  169 + // 当模态框对用户可见时触发(将等待 CSS 过渡效果完成)
  170 + $('#addBc_mobal').on('show.bs.modal', function () {
  171 + // 初始化路牌下拉选择框.
  172 + var options = '<option value="">-- 请选择路牌 --</option>';
  173 + for(var i=lpData.length-1, len=lpData.length; i>=0; i--) {
  174 + if( lpData[i] != null) {
  175 + options += '<option value="'+lpData[i]+'">'+lpData[i]+'</option>';
  176 + }
  177 + }
  178 + $('#lpNameSelect').html(options);
  179 + });
  180 + var historyData = echartsDrawGTT.getHistoryData(),
  181 + _keyIndex = echartsDrawGTT.get_keyIndex(),
  182 + data = $.extend(true, [], data, historyData[_keyIndex]),
  183 + Stations = {};
  184 +
  185 + // 获取表单元素
  186 + var form = $('#addBc');
  187 + // 错误提示元素
  188 + var addBcName = $('#addBcName', form);
  189 + // 下一步点击事件
  190 + $('#addBcnext').on('click', function() {
  191 + form.submit();// 表单提交
  192 + });
  193 + // 表单验证
  194 + form.validate({
  195 + errorElement : 'span',
  196 + errorClass : 'help-block help-block-error',
  197 + focusInvalid : false,
  198 + rules : {
  199 + 'lpName' : {required : true},
  200 + 'fcno' : {required : true},
  201 + // 'dir' : {required : true},
  202 + 'fcsj' : {required : true},
  203 + 'bcType' : {required : true},
  204 + 'bcsj' : {number : true,required : true},
  205 + 'isfb' : {required : true}
  206 + },
  207 + invalidHandler : function(event, validator) {
  208 + addBcName.show();
  209 + App.scrollTo(addBcName, -200);
  210 + },
  211 + highlight : function(element) {
  212 + $(element).closest('.form-group').addClass('has-error');
  213 + },
  214 + unhighlight : function(element) {
  215 + $(element).closest('.form-group').removeClass('has-error');
  216 + },
  217 + success : function(label) {
  218 + label.closest('.form-group').removeClass('has-error');
  219 + },
  220 + submitHandler : function(f) {
  221 + // 获取表单内容,并序列化.
  222 + var params = form.serializeJSON();
  223 + var bcObj, index, prevBcObj, nextBcObj = null, type=true;
  224 + var fcsj = Date.parse(DateTimeTool.getDateTime(params.fcsj));
  225 + var ARRIVALTIME = fcsj + parseInt(params.bcsj)*60000 ;
  226 +
  227 + for(var i=0; i<data.length-1; i++) {
  228 + if(data[i].value[0] == params.lpName) {
  229 + if(data[i].value[7] < params.fcno) {
  230 + prevBcObj = data[i];
  231 + bcObj = $.extend(true, {}, bcObj, data[i]);
  232 + index = i+1;
  233 + } else {
  234 + if(type) {
  235 + type = false;
  236 + nextBcObj = data[i];
  237 + }
  238 + data[i].value[7] += 1;
  239 + }
  240 + }
  241 + }
  242 + bcObj.value[1] = fcsj;
  243 + bcObj.value[2] = ARRIVALTIME;
  244 + bcObj.value[3] = params.bcsj*60000;
  245 + // bcObj.value[4] = lpNo;
  246 + bcObj.value[6] = params.bcType;
  247 + bcObj.value[7] = parseInt(params.fcno);
  248 + var dir = bcObj.value[8] == 1 ? 0:1;
  249 + bcObj.value[8] = dir;
  250 + bcObj.itemStyle.normal.color = dir==0?"#ff2949":"#518fe3";
  251 + // 起终点互换
  252 + var station = bcObj.value[13];
  253 + bcObj.value[13] = bcObj.value[14];
  254 + bcObj.value[14] = station;
  255 + bcObj.value[16] = parseInt(params.isfb);
  256 + data.splice(index, 0 , bcObj);
  257 +
  258 + if(nextBcObj != null && (nextBcObj.value[1] < ARRIVALTIME || prevBcObj.value[2] > fcsj)){
  259 + layer.confirm('添加的班次与前后班次有时间冲突,是否添加?', {
  260 + btn : [ '添加','取消' ], icon: 3, title:'提示'
  261 + }, function(){
  262 + echartsDrawGTT.init(data,false,true);
  263 + echartsDrawGTT.refreshDrag();
  264 + layer.msg('路牌:'+params.lpName+' fnco:'+params.fcno+' 班次添加成功,注意修改冲突班次!');
  265 + });
  266 + } else {
  267 + echartsDrawGTT.init(data,false,true);
  268 + echartsDrawGTT.refreshDrag();
  269 + layer.msg('路牌:'+params.lpName+' fnco:'+params.fcno+' 班次添加成功!');
  270 + }
  271 + $('#addBc_mobal').modal('hide');
  272 + }
  273 + });
  274 +});
  275 +</script>
0 276 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/fragments/addlp.html 0 → 100644
  1 +<!-- 添加路牌名称 -->
  2 +<div class="modal fade" id="addlp_mobal" tabindex="-1" role="basic" aria-hidden="true" style="top:30%">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
  7 + <h4 class="modal-title">添加路牌</h4>
  8 + </div>
  9 + <div class="modal-body">
  10 + <form class="form-horizontal" action="/" method="post" id="addlpForm" role="form">
  11 + <!-- 路牌名字 -->
  12 + <div class="form-body">
  13 + <div class="form-group">
  14 + <label class="control-label col-md-3">
  15 + <span class="required"> * </span>路牌名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
  16 + </label>
  17 + <div class="col-md-6">
  18 + <input type="text" name="lpName" class="form-control" id="lpNameInput" value="111" style="width:100%" />
  19 + </div>
  20 + </div>
  21 + </div>
  22 + </form>
  23 + </div>
  24 + <div class="modal-footer">
  25 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
  26 + <button type="button" class="btn btn-primary" id="addlpnext">确定</button>
  27 + </div>
  28 + </div>
  29 + </div>
  30 +</div>
  31 +<script type="text/javascript">
  32 +$('#addlp_mobal').on('addlpMobal.show', function(e,lpData,echartsDrawGTT){
  33 + var lpDataCount = echartsDrawGTT.getLpDataCount();
  34 + var lpCount = lpDataCount[lpData[0]][2] + 1;
  35 + // 显示mobal
  36 + $('#addlp_mobal').modal({show : true,backdrop: 'static', keyboard: false});
  37 + // 添加路牌规则
  38 + $('#lpNameInput').val("_"+lpCount);
  39 + // 获取表单元素
  40 + var form = $('#addlpForm');
  41 + // 下一步点击事件
  42 + $('#addlpnext').on('click', function() {
  43 + form.submit();// 表单提交
  44 + });
  45 + // 表单验证
  46 + form.validate({
  47 + errorElement : 'span',
  48 + errorClass : 'help-block help-block-error',
  49 + focusInvalid : false,
  50 + rules : {
  51 + 'lpName': { isTrue : true}
  52 + },
  53 + submitHandler : function(f) {
  54 + // 1、 获取表单内容,并序列化
  55 + var params = form.serializeJSON();
  56 + // 关闭弹出层.
  57 + layer.closeAll();
  58 + var _keyIndex = echartsDrawGTT.get_keyIndex();
  59 + var historyData = echartsDrawGTT.getHistoryData();
  60 + var data = $.extend(true, [], data, historyData[_keyIndex]);
  61 + lpData.splice(0,0,params.lpName);
  62 + lpDataCount[lpData[0]] = [0,0,lpCount];
  63 + echartsDrawGTT.setLpDataCount(lpDataCount);
  64 + echartsDrawGTT.init(data,false,true,lpData);
  65 + echartsDrawGTT.refreshDrag();
  66 + $('#addlp_mobal').modal('hide');
  67 + layer.msg('添加路牌【'+ params.lpName +'】成功!');
  68 + }
  69 + });
  70 + $.validator.addMethod("isTrue", function(value,element) {
  71 + var tel = false;
  72 + var lpName = value.split("_");
  73 + if(lpName[lpName.length-1] == lpCount){
  74 + tel = true;
  75 + return tel;
  76 + }
  77 + return tel;
  78 + },'路牌名字必须以:_'+lpCount+' 结尾');
  79 +});
  80 +</script>
0 81 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/fragments/bcadjust.html 0 → 100644
  1 +<!-- 路牌班次调整 -->
  2 +<div class="modal fade" id="bcadjust_mobal" tabindex="-1" role="basic" aria-hidden="true" style="top:30%">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
  7 + <h4 class="modal-title">班次调整</h4>
  8 + </div>
  9 + <div class="modal-body">
  10 + <form class="form-horizontal" action="/" method="post" id="bcadjustForm" role="form">
  11 + <!-- alert-danger 组件START -->
  12 + <div class="alert alert-danger display-hide" id="bcadjustAlert">
  13 + <button class="close" data-close="alert"></button>
  14 + 请选择路牌
  15 + </div>
  16 + <!-- 路牌名字 -->
  17 + <div class="form-body">
  18 + <div class="form-group">
  19 + <label class="control-label col-md-4">
  20 + <span class="required"> * </span>选择目标路牌&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
  21 + </label>
  22 + <div class="col-md-6">
  23 + <select type="text" name="lpName" class="form-control" id="lpNameSelect" style="width:100%"></select>
  24 + </div>
  25 + </div>
  26 + </div>
  27 + </form>
  28 + </div>
  29 + <div class="modal-footer">
  30 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
  31 + <button type="button" class="btn btn-primary" id="bcadjustnext">确定</button>
  32 + </div>
  33 + </div>
  34 + </div>
  35 +</div>
  36 +<script type="text/javascript">
  37 +$('#bcadjust_mobal').on('bcadjustMobal.show', function(e,lpData,echartsDrawGTT){
  38 + setTimeout(function(){
  39 + // 加载延迟200毫秒显示mobal
  40 + $('#bcadjust_mobal').modal({show : true,backdrop: 'static', keyboard: false});
  41 + },200);
  42 + // 当模态框对用户可见时触发(将等待 CSS 过渡效果完成)。
  43 + $('#bcadjust_mobal').on('show.bs.modal', function () {
  44 + var len_ = lpData.length,paramsD = new Array();
  45 + if(len_>0) {
  46 + var options = '<option value="">-- 请选择路牌 --</option>';
  47 + for(var i=lpData.length-1, len=lpData.length; i>=0; i--) {
  48 + if( lpData[i] != null) {
  49 + options += '<option value="'+lpData[i]+'">'+lpData[i]+'</option>';
  50 + }
  51 + }
  52 + $('#lpNameSelect').html(options);
  53 + }
  54 + });
  55 + // 获取表单元素
  56 + var form = $('#bcadjustForm');
  57 + // 错误提示元素
  58 + var bcadjustAlert = $('#bcadjustAlert', form);
  59 + // 下一步点击事件
  60 + $('#bcadjustnext').on('click', function() {
  61 + form.submit();// 表单提交
  62 + });
  63 + // 表单验证
  64 + form.validate({
  65 + errorElement : 'span',
  66 + errorClass : 'help-block help-block-error',
  67 + focusInvalid : false,
  68 + rules : {
  69 + 'lpName': { isSelect : true}
  70 + },
  71 + invalidHandler : function(event, validator) {
  72 + bcadjustAlert.show();
  73 + App.scrollTo(bcadjustAlert, -200);
  74 + },
  75 + highlight : function(element) {
  76 + $(element).closest('.form-group').addClass('has-error');
  77 + },
  78 + unhighlight : function(element) {
  79 + $(element).closest('.form-group').removeClass('has-error');
  80 + },
  81 + success : function(label) {
  82 + label.closest('.form-group').removeClass('has-error');
  83 + },
  84 + submitHandler : function(f) {
  85 + // 1、 获取表单内容,并序列化
  86 + var params = form.serializeJSON();
  87 + echartsDrawGTT.refreshBC(params.lpName);
  88 + var _keyIndex = echartsDrawGTT.get_keyIndex();
  89 + var historyData = echartsDrawGTT.getHistoryData();
  90 + var data = $.extend(true, [], data, historyData[_keyIndex]);
  91 + var bcList = [];
  92 + for(var i=0, len=data.length; i<len; i++ ){
  93 + if(data[i] && data[i].value[0] != params.lpName){
  94 + bcList.push({'id':i, 'text':data[i].value[0]+' fcno:'+data[i].value[7]});
  95 + }
  96 + }
  97 + $('.bc-adjust-list #bcAdjustName').val(params.lpName);
  98 + $('#bcAdjustList').empty();
  99 + $('#bcAdjustList').select2({
  100 + placeholder : '输入路牌或fcno',
  101 + tags : true,
  102 + multiple : true,
  103 + height: '40px',
  104 + // maximumSelectionLength : 30,
  105 + allowClear : true,
  106 + language: "zh-CN",
  107 + data : bcList
  108 + });
  109 + $('#bcadjust_mobal').modal('hide');
  110 + $('.bc-adjust-list').removeClass('hidden');
  111 + layer.open({title:'操作提示',
  112 + content:'进入班次调整,可单击班次,或者在出现的选着框中选择,提交会将班次拉到目标路牌!'});
  113 + }
  114 + });
  115 + $.validator.addMethod("isSelect", function(value,element) {
  116 + var tel = false;
  117 + var lpName = $('#lpNameSelect').val();
  118 + if(lpName != '请选择...'){
  119 + tel = true;
  120 + return tel;
  121 + }
  122 + return tel;
  123 + },'');
  124 +});
  125 +</script>
0 126 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/fragments/deletelp.html 0 → 100644
  1 +<!-- 删除路牌名称 -->
  2 +<div class="modal fade" id="deletelp_mobal" tabindex="-1" role="basic" aria-hidden="true" style="top:30%">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
  7 + <h4 class="modal-title">删除路牌</h4>
  8 + </div>
  9 + <div class="modal-body">
  10 + <form class="form-horizontal" action="/" method="post" id="deletelpForm" role="form">
  11 + <!-- alert-danger 组件START -->
  12 + <div class="alert alert-danger display-hide" id="deletelpAlert">
  13 + <button class="close" data-close="alert"></button>
  14 + 请选择路牌
  15 + </div>
  16 + <!-- 路牌名字 -->
  17 + <div class="form-body">
  18 + <div class="form-group">
  19 + <label class="control-label col-md-3">
  20 + <span class="required"> * </span>选择路牌&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
  21 + </label>
  22 + <div class="col-md-6">
  23 + <select type="text" name="lpName" class="form-control" id="lpNameSelect" style="width:100%"></select>
  24 + </div>
  25 + </div>
  26 + </div>
  27 + </form>
  28 + </div>
  29 + <div class="modal-footer">
  30 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
  31 + <button type="button" class="btn btn-primary" id="deletelpnext">确定</button>
  32 + </div>
  33 + </div>
  34 + </div>
  35 +</div>
  36 +<script type="text/javascript">
  37 +$('#deletelp_mobal').on('deletelpMobal.show', function(e,lpData,echartsDrawGTT){
  38 + setTimeout(function(){
  39 + // 加载延迟200毫秒显示mobal
  40 + $('#deletelp_mobal').modal({show : true,backdrop: 'static', keyboard: false});
  41 + },200);
  42 + // 当模态框对用户可见时触发(将等待 CSS 过渡效果完成)。
  43 + $('#deletelp_mobal').on('show.bs.modal', function () {
  44 + var len_ = lpData.length,paramsD = new Array();
  45 + if(len_>0) {
  46 + var options = '<option value="">-- 请选择路牌 --</option>';
  47 + for(var i=lpData.length-1, len=lpData.length; i>=0; i--) {
  48 + if( lpData[i] != null) {
  49 + options += '<option value="'+lpData[i]+'">'+lpData[i]+'</option>';
  50 + }
  51 + }
  52 + $('#lpNameSelect').html(options);
  53 + }
  54 + });
  55 + // 获取表单元素
  56 + var form = $('#deletelpForm');
  57 + // 错误提示元素
  58 + var deletelpAlert = $('#deletelpAlert', form);
  59 + // 下一步点击事件
  60 + $('#deletelpnext').on('click', function() {
  61 + form.submit();// 表单提交
  62 + });
  63 + // 表单验证
  64 + form.validate({
  65 + errorElement : 'span',
  66 + errorClass : 'help-block help-block-error',
  67 + focusInvalid : false,
  68 + rules : {
  69 + 'lpName': { isSelect : true}
  70 + },
  71 + invalidHandler : function(event, validator) {
  72 + deletelpAlert.show();
  73 + App.scrollTo(deletelpAlert, -200);
  74 + },
  75 + highlight : function(element) {
  76 + $(element).closest('.form-group').addClass('has-error');
  77 + },
  78 + unhighlight : function(element) {
  79 + $(element).closest('.form-group').removeClass('has-error');
  80 + },
  81 + success : function(label) {
  82 + label.closest('.form-group').removeClass('has-error');
  83 + },
  84 + submitHandler : function(f) {
  85 + // 1、 获取表单内容,并序列化
  86 + var params = form.serializeJSON();
  87 + layer.confirm('您确定要删除路牌【'+ params.lpName +'】以及路牌上的班次吗?'+
  88 + '</br>【注意】:如需要撤销当前操作,您可以在系统工具下拉选择点击【撤销按钮】进行恢复.', {
  89 + btn : [ '确认提示并提交', '取消' ]
  90 + }, function() {
  91 + // 关闭弹出层.
  92 + layer.closeAll();
  93 + var _keyIndex = echartsDrawGTT.get_keyIndex();
  94 + var historyData = echartsDrawGTT.getHistoryData();
  95 + var data = $.extend(true, [], data, historyData[_keyIndex]);
  96 + for(var i=0, len=data.length; i<len; i++ ){
  97 + if(data[i] && data[i].value[0] == params.lpName){
  98 + data.splice(i,1);
  99 + i--;
  100 + }
  101 + }
  102 + $.each(lpData, function (index, lp) {
  103 + if(lp == params.lpName)
  104 + lpData.splice(index,1);
  105 + });
  106 + echartsDrawGTT.setLpData(lpData);
  107 + echartsDrawGTT.init(data,false,true);
  108 + echartsDrawGTT.refreshDrag();
  109 + $('#deletelp_mobal').modal('hide');
  110 + layer.msg('删除路牌【'+ params.lpName +'】成功!');
  111 + });
  112 + }
  113 + });
  114 + $.validator.addMethod("isSelect", function(value,element) {
  115 + var tel = false;
  116 + var lpName = $('#lpNameSelect').val();
  117 + if(lpName != '请选择...'){
  118 + tel = true;
  119 + return tel;
  120 + }
  121 + return tel;
  122 + },'');
  123 +});
  124 +</script>
0 125 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/fragments/editbc.html 0 → 100644
  1 +<!-- 修改班次参数 -->
  2 +<div class="modal fade" id="editBc_mobal" tabindex="-1" role="basic" aria-hidden="true">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content" style="width: 900px;">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
  7 + <h4 class="modal-title">修改班次参数</h4>
  8 + </div>
  9 + <div class="modal-body">
  10 + <form class="form-horizontal" action="/" method="post" id="editBc" role="form">
  11 + <!-- alert-danger 组件START -->
  12 + <div class="alert alert-danger display-hide" id="editBcName">
  13 + <button class="close" data-close="alert"></button>
  14 + 您的输入有误,请检查下面的输入项
  15 + </div>
  16 + <input id="qdzInput" class="hidden" />
  17 + <input id="zdzInput" class="hidden" />
  18 +
  19 + <!-- 表单分组组件 form-group START -->
  20 + <div class="form-group">
  21 + <!-- 路牌 (* 必填项) START -->
  22 + <div class="col-md-6">
  23 + <label class="control-label col-md-6">
  24 + <span class="required"> * </span>所属路牌&nbsp;&nbsp;&nbsp;:
  25 + </label>
  26 + <div class="col-md-6">
  27 + <input type="text" name="lpName" class="form-control" id="lpNameInput" readonly="readonly">
  28 + </div>
  29 + </div>
  30 + <!-- 路牌 (* 必填项) END -->
  31 +
  32 + <!-- 发车顺序号 (* 必填项) START -->
  33 + <div class="col-md-6">
  34 + <label class="control-label col-md-6">
  35 + <span class="required"> * </span> 发车顺序号:
  36 + </label>
  37 + <div class="col-md-6">
  38 + <input type="text" class="form-control" name="fcno" id="fcnoInput" placeholder="发车顺序号" readonly="readonly">
  39 + </div>
  40 + </div>
  41 + </div>
  42 + <!-- 表单分组组件 form-group END -->
  43 + <!-- 表单分组组件 form-group START -->
  44 + <div class="form-group">
  45 + <!-- 发车时间 (* 必填项) START -->
  46 + <div class="col-md-6">
  47 + <label class="control-label col-md-6">
  48 + <span class="required"> * </span> 发车时间&nbsp;&nbsp;&nbsp;:
  49 + </label>
  50 + <div class="col-md-6">
  51 + <input type="text" class="form-control" name="fcsj" id="fcsjInput" placeholder="发车时间">
  52 + </div>
  53 + </div>
  54 + <!-- 发车时间 (* 必填项) END -->
  55 +
  56 + <!-- 班次类型 (* 必填项) START -->
  57 + <div class="col-md-6">
  58 + <label class="control-label col-md-6">
  59 + <span class="required"> * </span> 班次类型&nbsp;&nbsp;&nbsp;:
  60 + </label>
  61 + <div class="col-md-6">
  62 + <select name="bcType" class="form-control" id="bcTypeSelect">
  63 + <option value="">-- 请选择类型 --</option>
  64 + <option value="bd">早例保</option>
  65 + <option value="out">出场</option>
  66 + <option value="normal">正常</option>
  67 + <option value="cf">吃饭</option>
  68 + <option value="in">进场</option>
  69 + <option value="lc">晚例保</option>
  70 + <option value="major">放大站</option>
  71 + <option value="venting">直放</option>
  72 + <option value="region">区间</option>
  73 + </select>
  74 + </div>
  75 + </div>
  76 + <!-- 班次类型 (* 必填项) END -->
  77 + </div>
  78 + <!-- 表单分组组件 form-group END -->
  79 +
  80 + <!-- 表单分组组件 form-group START -->
  81 + <div class="form-group">
  82 + <!-- 班次历时 (* 必填项) START -->
  83 + <div class="col-md-6">
  84 + <label class="control-label col-md-6">
  85 + <span class="required"> * </span> 班次历时&nbsp;&nbsp;&nbsp;:
  86 + </label>
  87 + <div class="col-md-6">
  88 + <input type="text" class="form-control" name="bcsj" id="bcsjInput" placeholder="班次历时">
  89 + </div>
  90 + </div>
  91 + <!-- 班次历时 (* 必填项) END -->
  92 +
  93 + <!-- 是否分班 START (因为options值基本固定,所以在页面固定。【以后可以根具需求修改成使用字典表实现】) -->
  94 + <div class="col-md-6">
  95 + <label class="control-label col-md-6">
  96 + <span class="required"> * </span> 是否分班&nbsp;&nbsp;&nbsp;:
  97 + </label>
  98 + <div class="col-md-6">
  99 + <select name="isfb" class="form-control" id="isfbSelect">
  100 + <option value=0>否</option>
  101 + <option value=1>是</option>
  102 + </select>
  103 + </div>
  104 + </div>
  105 + <!-- 是否分班 END -->
  106 + </div>
  107 + <!-- 表单分组组件 form-group END -->
  108 + </form>
  109 + </div>
  110 + <div class="modal-footer">
  111 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
  112 + <button type="button" class="btn btn-primary" id="editBcnext">确定</button>
  113 + </div>
  114 + </div>
  115 + </div>
  116 +</div>
  117 +<script type="text/javascript">
  118 +/**
  119 + * @description : (TODO) 触发被选元素的指定事件类型。
  120 + *
  121 + * @params [obj--图形对象;bf--函数集合对象;cardata--路牌对应的Y轴坐标数组]
  122 + *
  123 + * @status OK.
  124 + */
  125 +$('#editBc_mobal').on('editBcMobal.show', function(e,index,echartsDrawGTT){
  126 + $('#fcsjInput').datetimepicker({format : 'HH:mm', locale: 'zh-cn'});
  127 +
  128 + var historyData = echartsDrawGTT.getHistoryData(),
  129 + _keyIndex = echartsDrawGTT.get_keyIndex(),
  130 + data = $.extend(true, [], data, historyData[_keyIndex]),
  131 + Stations = {};
  132 + var bcObj = data[index];
  133 + // 延迟200毫秒执行.
  134 + setTimeout(function(){
  135 + // 加载显示mobal
  136 + $('#editBc_mobal').modal({show : true,backdrop: 'static', keyboard: false});
  137 +
  138 + $('#lpNameInput').val(bcObj.value[0]);
  139 + $('#fcnoInput').val(bcObj.value[7]);
  140 + $('#fcsjInput').val(getTimeStr(new Date(bcObj.value[1])));
  141 + $('#bcsjInput').val(bcObj.value[3]/60000);
  142 + $('#bcTypeSelect').val(bcObj.value[6]);
  143 + $('#isfbSelect').val(bcObj.value[16]);
  144 + },200);
  145 +
  146 + // 获取表单元素
  147 + var form = $('#editBc');
  148 + // 错误提示元素
  149 + var editBcName = $('#editBcName', form);
  150 + // 下一步点击事件
  151 + $('#editBcnext').on('click', function() {
  152 + form.submit();// 表单提交
  153 + });
  154 + // 表单验证
  155 + form.validate({
  156 + errorElement : 'span',
  157 + errorClass : 'help-block help-block-error',
  158 + focusInvalid : false,
  159 + rules : {
  160 + 'lpName' : {required : true},
  161 + 'fcno' : {required : true},
  162 + // 'dir' : {required : true},
  163 + 'fcsj' : {required : true},
  164 + 'bcType' : {required : true},
  165 + 'bcsj' : {number : true,required : true},
  166 + 'isfb' : {required : true}
  167 + },
  168 + invalidHandler : function(event, validator) {
  169 + editBcName.show();
  170 + App.scrollTo(editBcName, -200);
  171 + },
  172 + highlight : function(element) {
  173 + $(element).closest('.form-group').addClass('has-error');
  174 + },
  175 + unhighlight : function(element) {
  176 + $(element).closest('.form-group').removeClass('has-error');
  177 + },
  178 + success : function(label) {
  179 + label.closest('.form-group').removeClass('has-error');
  180 + },
  181 + submitHandler : function(f) {
  182 + // 获取表单内容,并序列化.
  183 + var params = form.serializeJSON();
  184 + var fcsj = Date.parse(DateTimeTool.getDateTime(params.fcsj));
  185 + var ARRIVALTIME = fcsj + parseInt(params.bcsj)*60000 ;
  186 +
  187 + bcObj.value[1] = fcsj;
  188 + bcObj.value[2] = ARRIVALTIME;
  189 + bcObj.value[3] = params.bcsj*60000;
  190 + // bcObj.value[4] = lpNo;
  191 + bcObj.value[6] = params.bcType;
  192 + bcObj.value[7] = parseInt(params.fcno);
  193 + bcObj.value[16] = parseInt(params.isfb);
  194 +
  195 + echartsDrawGTT.init(data,false,true);
  196 + echartsDrawGTT.refreshDrag();
  197 + layer.msg('路牌:'+params.lpName+' fnco:'+params.fcno+' 班次修改成功!');
  198 + $('#editBc_mobal').modal('hide');
  199 + }
  200 + });
  201 +
  202 + /**
  203 + * @discription : (TODO) 获取时间格式[00:00]
  204 + *
  205 + * @params : [time--时间对象]
  206 + *
  207 + * @return : 返回字符串。这里返回的是一个时间格式的字符串
  208 + **/
  209 + function getTimeStr(startTime) {
  210 + // == '00' ? '24' :(startTime.getHours()<10? '0' + startTime.getHours() : startTime.getHours()))
  211 + return (startTime.getHours()<10? '0' + startTime.getHours() : startTime.getHours())
  212 + +':'
  213 + +(startTime.getMinutes()<10? '0' + startTime.getMinutes() : startTime.getMinutes());
  214 + }
  215 +});
  216 +</script>
0 217 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/fragments/editlp.html 0 → 100644
  1 +<!-- 修改路牌名称 -->
  2 +<div class="modal fade" id="editlp_mobal" tabindex="-1" role="basic" aria-hidden="true">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
  7 + <h4 class="modal-title">修改路牌名称</h4>
  8 + </div>
  9 + <div class="modal-body">
  10 + <form class="form-horizontal" action="/" method="post" id="editlpForm" role="form">
  11 + <!-- alert-danger 组件START -->
  12 + <div class="alert alert-danger display-hide" id="editlpAlert">
  13 + <button class="close" data-close="alert"></button>
  14 + 您的输入有误,请检查下面的输入项
  15 + </div>
  16 + <div class="portlet-body">
  17 + <div class="table-container" style="margin-top: 10px">
  18 + <table class="table table-striped table-bordered table-hover table-checkable" id="datatable_bctz">
  19 + <thead>
  20 + <tr role="row" class="heading">
  21 + <th width="50%">当前路牌名称</th>
  22 + <th width="50%" style="text-align: center;max-width: 50px;min-width: 40px;padding-left: 0;padding-right: 0;">修改路牌名称</th>
  23 + </tr>
  24 + </thead>
  25 + <tbody></tbody>
  26 + </table>
  27 + </div>
  28 + </div>
  29 + </form>
  30 + </div>
  31 + <div class="modal-footer">
  32 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
  33 + <button type="button" class="btn btn-primary" id="editlpnext">确定</button>
  34 + </div>
  35 + </div>
  36 + </div>
  37 +</div>
  38 +<script type="text/html" id="editlp_temp">
  39 +{{each list as obj i }}
  40 + <tr role="row" class="filter">
  41 + <td>
  42 + <input type="text" readonly class="form-control form-filter input-sm" name="lpname_{{i+1}}" value="{{obj.lpName}}">
  43 + </td>
  44 + <td>
  45 + <input type="text" class="form-control form-filter input-sm" name="{{i+1}}" value="{{obj.lpName}}" required>
  46 + </td>
  47 + </tr>
  48 +{{/each}}
  49 +{{if list.length == 0}}
  50 + <tr>
  51 + <td colspan=3><h6 class="muted">没有找到相关数据</h6></td>
  52 + </tr>
  53 + {{/if}}
  54 +</script>
  55 +<script type="text/javascript">
  56 +$('#editlp_mobal').on('editlpMobal.show', function(e,obj,bf){
  57 + var lpArray = obj.configuration.taskTypes;
  58 + setTimeout(function(){
  59 + // 加载延迟200毫秒显示mobal
  60 + $('#editlp_mobal').modal({show : true,backdrop: 'static', keyboard: false});
  61 + },200);
  62 + // 当模态框对用户可见时触发(将等待 CSS 过渡效果完成)。
  63 + $('#editlp_mobal').on('show.bs.modal', function () {
  64 + // 把数据填充到模版中
  65 + var tbodyHtml = template('editlp_temp',{list:lpArray});
  66 + // 把渲染好的模版html文本追加到表格中
  67 + $('#datatable_bctz tbody').html(tbodyHtml);
  68 + });
  69 + // 获取表单元素
  70 + var form = $('#editlpForm');
  71 + // 错误提示元素
  72 + var editlpAlert = $('#editlpAlert', form);
  73 + // 下一步点击事件
  74 + $('#editlpnext').on('click', function() {
  75 + form.submit();// 表单提交
  76 + });
  77 + // 表单验证
  78 + form.validate({
  79 + errorElement : 'span',
  80 + errorClass : 'help-block help-block-error',
  81 + focusInvalid : false,
  82 + rules : {
  83 + },
  84 + invalidHandler : function(event, validator) {
  85 + editlpAlert.show();
  86 + App.scrollTo(editlpAlert, -200);
  87 + },
  88 + highlight : function(element) {
  89 + $(element).closest('.form-group').addClass('has-error');
  90 + },
  91 + unhighlight : function(element) {
  92 + $(element).closest('.form-group').removeClass('has-error');
  93 + },
  94 + success : function(label) {
  95 + label.closest('.form-group').removeClass('has-error');
  96 + },
  97 + submitHandler : function(f) {
  98 + // 1、 获取表单内容,并序列化
  99 + var params = form.serializeJSON();
  100 + var data = obj.getDataArray();
  101 + // 2、 调整路牌对应的班次总数
  102 + updFormParams(params,data);
  103 + // 删除图形.
  104 + $('svg.svg-chart').remove();
  105 + // 重新创建图形.
  106 + var graph_ = d3.select('#ganttSvg').relationshipGraph(obj.configuration);
  107 + // 根据数据重新渲染图形.
  108 + obj.data(data);
  109 + // 记录早操.并保存历史班次数据
  110 + obj.addHistory();
  111 + // 隐藏错误提示
  112 + editlpAlert.hide();
  113 + // 隐藏 reladplus_mobal 弹出层
  114 + $('#editlp_mobal').modal('hide');
  115 + layer.msg('修改路牌名称成功!');
  116 + }
  117 + });
  118 + function updFormParams(p,data) {
  119 + for(var i= 0;i<lpArray.length;i++) {
  120 + if(p[i+1] != undefined) {
  121 + if(lpArray[i].lpName != p[i+1]) {
  122 + for(var d = 0 ; d< data.length;d++) {
  123 + if(data[d].lpName == lpArray[i].lpName) {
  124 + data[d].lpName = p[i+1];
  125 + }
  126 +
  127 + }
  128 + lpArray[i].lpName = p[i+1];
  129 + obj.configuration.lpNameA[i] = p[i+1];
  130 + }
  131 + }
  132 + }
  133 + }
  134 +});
  135 +</script>
0 136 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/gantt.html
... ... @@ -39,6 +39,14 @@
39 39 <div class="tools" style="margin-left: 20px;margin-top: -10px;">
40 40 <a href="" class="fullscreen" data-original-title="" title="" style="text-decoration: none;"> </a>
41 41 </div>
  42 +
  43 + <!-- 班次调整输入框 -->
  44 + <div class="bc-adjust-list hidden">
  45 + <input type="hidden" id="bcAdjustName" />
  46 + <select class="js-example-placeholder-multiple js-states form-control bc-adjust-list-input" multiple="multiple" id="bcAdjustList"></select>
  47 + <a class="btn" href="javascript:;" data-pjax style="background:#c2c8d2;color: #fff;position: absolute; top: 4px; right: 55px;" id="bcAdjustListCancel"> 取消</a>
  48 + <a class="btn blue" href="javascript:;" data-pjax style="position: absolute; top: 4px; right: 1px;" id="bcAdjustListSubmit"> 提交</a>
  49 + </div>
42 50 <!-- actions 组件START -->
43 51 <div class="actions">
44 52 <div class="btn-group btn-group-devided countbtn" data-toggle="buttons">
... ... @@ -92,33 +100,38 @@
92 100 <i class="fa fa-share"></i>&nbsp;恢&nbsp;&nbsp;复
93 101 </a>
94 102 </li>
95   - <li>
  103 + <!--<li>
96 104 <a href="javascript:" class="tool-action reladelete">
97 105 <i class="fa fa-close"></i>&nbsp;批量删除
98 106 </a>
99   - </li>
  107 + </li>-->
100 108 <li>
101   - <a href="javascript:" class="tool-action reladplus">
  109 + <a href="javascript:" class="tool-action addBc">
102 110 <i class="fa fa-plus"></i>&nbsp;添加班次
103 111 </a>
104 112 </li>
105 113 <li>
106   - <a href="javascript:" class="tool-action editlp">
107   - <i class="fa fa-pencil"></i>&nbsp;修改路牌
  114 + <a href="javascript:" class="tool-action addLp">
  115 + <i class="fa fa-plus"></i>&nbsp;添加路牌
108 116 </a>
109 117 </li>
  118 + <!--<li>
  119 + <a href="javascript:" class="tool-action editLp">
  120 + <i class="fa fa-pencil"></i>&nbsp;修改路牌
  121 + </a>
  122 + </li>-->
110 123 <li>
111   - <a href="javascript:" class="tool-action addlp">
112   - <i class="fa fa-plus"></i>&nbsp;添加路牌
  124 + <a href="javascript:" class="tool-action deleteLp">
  125 + <i class="fa fa-close"></i>&nbsp;删除路牌
113 126 </a>
114 127 </li>
115 128 <li>
116   - <a href="javascript:" class="tool-action updownread">
  129 + <a href="javascript:" class="tool-action upDownRead">
117 130 <i class="fa fa-arrows-h"></i>&nbsp;均匀发车
118 131 </a>
119 132 </li>
120 133 <li>
121   - <a href="javascript:" class="tool-action aboutread">
  134 + <a href="javascript:" class="tool-action bcAdjust">
122 135 <i class="fa fa-arrows-v"></i>&nbsp;班次调整
123 136 </a>
124 137 </li>
... ... @@ -132,9 +145,13 @@
132 145 <!-- portlet-body组件START -->
133 146 <div class="portlet-body" id="scrllmouseEvent">
134 147 <!-- ganttSvgContainer SVG组件START -->
135   - <div class="ganttSvgContainer">
  148 + <!--<div class="ganttSvgContainer">
136 149 <div id="ganttSvg"></div>
137   - </div>
  150 + </div>-->
  151 + <div class="gtt">
  152 + <div id="upDownContainer"></div>
  153 + <div id="bcContainer"></div>
  154 + </div>
138 155 <!-- ganttSvgContainer SVG组件END -->
139 156 </div>
140 157 <!-- portlet-body组件END -->
... ... @@ -146,7 +163,13 @@
146 163 <!-- row 组件END -->
147 164 <script src="/pages/base/timesmodel/js/raty/lib/jquery.raty.js"></script>
148 165 <script src="/pages/base/timesmodel/js/ContextJS/js/context.js"></script>
  166 +<script src="/pages/base/timesmodel/js/dateTimeTool.js"></script>
149 167 <script src="/pages/base/timesmodel/js/base-fun.js"></script>
  168 +<script src="/pages/base/timesmodel/js/v1/bcFun.js"></script>
  169 +<script src="/pages/base/timesmodel/js/v1/lpFun.js"></script>
  170 +<script src="/pages/base/timesmodel/js/v1/scheduleInitialize.js"></script>
  171 +<script src="/pages/base/timesmodel/js/v1/AdjustTrip.js"></script>
  172 +<script src="/pages/base/timesmodel/js/v1/AdjustTrip2.js"></script>
150 173 <script src="/pages/base/timesmodel/js/v2/ParameterObj.js"></script>
151 174 <script src="/pages/base/timesmodel/js/v2/core/InternalBcObj.js"></script>
152 175 <script src="/pages/base/timesmodel/js/v2/core/InternalGroupObj.js"></script>
... ... @@ -160,4 +183,24 @@
160 183 <script src="/pages/base/timesmodel/js/v2/main_v2.js"></script>
161 184 <script src="/pages/base/timesmodel/js/d3.relationshipgraph.js"></script>
162 185 <script src="/pages/base/timesmodel/js/errorinfo.js"></script>
163   -<script src="/pages/base/timesmodel/js/gantt.js"></script>
164 186 \ No newline at end of file
  187 +<script src="/pages/base/timesmodel/js/parameters.js"></script>
  188 +<script src="/pages/base/timesmodel/js/systemTools.js"></script>
  189 +<script src="/pages/base/timesmodel/js/echartsDrawGanTT.js"></script>
  190 +<script src="/pages/base/timesmodel/js/gantt.js"></script>
  191 +
  192 +<script id="rightClick_dropdown_menu" type="text/html">
  193 + <ul class="dropdown-menu dropdown-context" id="dropdown_menu"
  194 + style="{{style}}">
  195 + <input type="hidden" value="{{dataIndex}}" name="dataIndex" id="dataIndex">
  196 + <li><a href="javascript:dropdownMenuUpdate('{{dataIndex}}');" id="update">修改</a></li>
  197 + <li><a href="javascript:dropdownMenuDelete('{{dataIndex}}');" id="delete" >删除</a></li>
  198 + <li><a href="javascript:dropdownMenuSwitchUpDown('{{dataIndex}}');" id="switchUpDown">班次切换上下行</a></li>
  199 + <li><a href="javascript:dropdownMenuLpSwitchUpDown('{{dataIndex}}');" id="lpSwitchUpDown">路牌切换上下行</a></li>
  200 + <li><a href="javascript:dropdownMenuSetNormal('{{dataIndex}}');" id="setNormal">设为正常</a></li>
  201 + <li><a href="javascript:dropdownMenuSetRegion('{{dataIndex}}');" id="setRegion">设为区间</a></li>
  202 + <li><a href="javascript:dropdownMenuSetFb('{{dataIndex}}');" id="setFb">设为分班</a></li>
  203 + <li><a href="javascript:dropdownMenuSetNoFb('{{dataIndex}}');" id="SetNoFb">取消分班</a></li>
  204 + <li><a href="javascript:dropdownMenuSetVenting('{{dataIndex}}');" id="setVenting">设为直放</a></li>
  205 + <li><a href="javascript:dropdownMenuSetMajor('{{dataIndex}}');" id="setMajor">设为放站</a></li>
  206 + </ul>
  207 +</script>
165 208 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/add-form-wizard.js
... ... @@ -845,7 +845,7 @@ var SKBFormWizard = function() {
845 845 $(this).html(payment.join("<br>"));
846 846 }
847 847 });
848   - }
  848 + };
849 849  
850 850 /** 按钮点击时触发 */
851 851 var handleTitle = function(tab, navigation, index) {
... ... @@ -874,7 +874,7 @@ var SKBFormWizard = function() {
874 874 $('#submit_argus_form').find('.button-submit').hide();// 隐藏提交按钮
875 875 }
876 876 App.scrollTo($('.page-title'));// 移动到指定位置
877   - }
  877 + };
878 878  
879 879 // 表单导航向导插件
880 880 $('#submit_argus_form').bootstrapWizard({
... ... @@ -915,6 +915,8 @@ var SKBFormWizard = function() {
915 915  
916 916 if (baseRes == 0) { // 客流大数据分析
917 917 $('#linePlayTypeSelect').val(r.content[0].line.linePlayType);
  918 + // 停站类型选择控件
  919 + ComponentsBootstrapTagsinput.init_stoptype();
918 920 // 日期控件
919 921 $('#qdzsbsjInput').datetimepicker({format : 'HH:mm',locale: 'zh-cn'});// 起始站首班时间
920 922 $('#qdzmbsjInput').datetimepicker({format : 'HH:mm',locale: 'zh-cn'});// 起始站末班时间
... ... @@ -944,6 +946,8 @@ var SKBFormWizard = function() {
944 946 } else if (baseRes == 1) { // 班次/人次/车辆
945 947 $('#linePlayTypeSelect').val(r.content[0].line.linePlayType);
946 948 ComponentsBootstrapTagsinput.init();// 初始化班型人次Input Tag.
  949 + // 停站类型选择控件
  950 + ComponentsBootstrapTagsinput.init_stoptype();
947 951 // 日期控件
948 952 $('#qdzsbsjInput').datetimepicker({format : 'HH:mm',locale: 'zh-cn'});// 起始站首班时间
949 953 $('#qdzmbsjInput').datetimepicker({format : 'HH:mm',locale: 'zh-cn'});// 起始站末班时间
... ...
src/main/resources/static/pages/base/timesmodel/js/dateTimeTool.js 0 → 100644
  1 +/** 时间工具类*/
  2 +var DateTimeTool = function () {
  3 + // 数字格式转化为时间格式
  4 + var calculateHours = function (time) {
  5 + if(!time)
  6 + return;
  7 + var h,m;
  8 + h = Math.floor(time);
  9 + m = Math.round((time % 1) * 60);
  10 + return h+':'+m;
  11 + };
  12 + /**
  13 + * @discription : (TODO) 字符串转时间对象
  14 + *
  15 + * @params : 具有一定格式的时间字符串
  16 + *
  17 + * @return : 返回一个中国标准时间点
  18 + *
  19 + **/
  20 + var getDateTime = function(time) {
  21 + var dateTime = new Date();
  22 + if(time !=null && time !='' && typeof(time) !='undefined') {
  23 + timeArr = time.split(':');
  24 + dateTime.setHours(parseInt(timeArr[0]));
  25 + dateTime.setMinutes(parseInt(timeArr[1]));
  26 + dateTime.setSeconds(0);
  27 + // 在0-3点之间(包括0和3)的时间都默认为下一天的时间
  28 + if(parseInt(timeArr[0]) <= 3 && parseInt(timeArr[0]) >= 0)
  29 + dateTime.setDate(dateTime.getDate() +1);
  30 + }
  31 + return dateTime;
  32 + };
  33 + /**
  34 + * @discription : (TODO) 获取时间格式[00:00]
  35 + *
  36 + * @params : [startTime--时间对象(任意时间对象:字符串、时间戳、时间对象)]
  37 + *
  38 + * @return : 返回字符串。这里返回的是一个时间格式的字符串[00:00]
  39 + **/
  40 + var getHHmmStr = function(time) {
  41 + var date = new Date(time);
  42 + // == '00' ? '24' :(startTime.getHours()<10? '0' + startTime.getHours() : startTime.getHours()))
  43 + return (date.getHours()<10? '0' + date.getHours() : date.getHours())
  44 + +':'
  45 + +(date.getMinutes()<10? '0' + date.getMinutes() : date.getMinutes());
  46 + };
  47 + return{
  48 + calculateHours : calculateHours,
  49 + getDateTime : getDateTime,
  50 + getHHmmStr : getHHmmStr
  51 + }
  52 +}();
... ...
src/main/resources/static/pages/base/timesmodel/js/echartsDrawGanTT.js 0 → 100644
  1 +var echartsDrawGTT = function () {
  2 + // 定义图层
  3 + var bcdom = document.getElementById("bcContainer");
  4 + var chart = echarts.init(bcdom);
  5 + var upDowndom = document.getElementById("upDownContainer");
  6 + var upDownChart = echarts.init(upDowndom);
  7 + // upDowndom.style.height = '200px';
  8 + var option,upDownOption,dataZoomStart = 0,dataZoomEnd = 80;//图层对象
  9 + var historyData = [],// 保存操作图形后的数据集合(撤销与恢复操作)
  10 + _keyIndex = -1,// 记录当前操作步骤 (在撤销与恢复操作时)
  11 + dataUp = [],// (上/下)行发车时刻表数据
  12 + dataDown = [];
  13 + // y坐标
  14 + var lpData = []; //var lpData = ['连班_2','连班_1','连班_3'];
  15 + var lpDataCount = [];// lpDataCount[路牌名字]=[工时,班次,路牌序号]
  16 + // x坐标轴的范围
  17 + var time = DateTimeTool.getDateTime("03:00");
  18 + var xMax = Date.parse(time);
  19 + time.setDate(time.getDate()-1);
  20 + var xMin = Date.parse(time);
  21 + // 上下行bc颜色
  22 + var types = {'relationshipGraph-up': '#ff2949','relationshipGraph-down': '#518fe3'};
  23 + // 班次数据源
  24 + var bcData = [];
  25 +
  26 + // 班次类型
  27 + // var bcType = [bd--早例保;out--出场;normal--正常;cf--吃饭;in--进场;lc--晚例保;major--放站;venting--直放;region--区间]
  28 + var bcType = new Map();
  29 + bcType['in'] = '到';
  30 + bcType['out'] = '离';
  31 + bcType['bd'] = '出';
  32 + bcType['lc'] = '进';
  33 + bcType["normal"] = '正';
  34 + bcType["cf"] = '吃';
  35 + bcType["major"] = '站';
  36 + bcType["venting"] = '直';
  37 + bcType["region"] = '区';
  38 +
  39 + // 处理后班次数据
  40 + var data = [];
  41 + // 单个班次高度
  42 + var height;
  43 + // 坐标轴位置
  44 + var baseTop = 70;
  45 + var gridHeight = 60;
  46 +
  47 + $("#bcContainer").bind("contextmenu", function(){
  48 + return false;
  49 + });
  50 +
  51 + var setLpData = function (data) {
  52 + lpData = data;
  53 + };
  54 + var getLpData = function () {
  55 + return lpData;
  56 + };
  57 + var setLpDataCount = function (data) {
  58 + lpDataCount = data;
  59 + };
  60 + var getLpDataCount = function () {
  61 + return lpDataCount;
  62 + };
  63 + var set_keyIndex = function (indxe) {
  64 + _keyIndex = indxe;
  65 + };
  66 + var get_keyIndex = function () {
  67 + return _keyIndex;
  68 + };
  69 + var getHistoryData = function () {
  70 + return historyData;
  71 + };
  72 + var setHistoryData = function (data) {
  73 + historyData = data;
  74 + };
  75 +
  76 + // 初始化 newData:数据、isLast:是否第一次、isNewData:是否是新数据(撤销、恢复不是)、newLpData:新路牌
  77 + var init = function (newData,isLast,isNewData,newLpData) {
  78 + if(isLast){
  79 + data = [];
  80 + bcData = newData;
  81 + echarts.util.each(bcData, function (bcObj, index) {
  82 + var fcsj = Date.parse(DateTimeTool.getDateTime(bcObj.fcsj)),
  83 + ARRIVALTIME = Date.parse(DateTimeTool.getDateTime(bcObj.ARRIVALTIME)),
  84 + colorStr = bcObj.xlDir,
  85 + xlDir;
  86 + if(bcObj.xlDir == 'relationshipGraph-up')
  87 + xlDir = 0;
  88 + else if(bcObj.xlDir == 'relationshipGraph-down')
  89 + xlDir = 1;
  90 + else
  91 + xlDir = -1;
  92 + data.push({
  93 + value: [
  94 + bcObj.lpName,//纵坐标
  95 + fcsj,//开始时间
  96 + ARRIVALTIME,//结束时间
  97 + bcObj.bcsj*60000,//横坐标长度(持续时间)
  98 + bcObj.lpNo,
  99 + bcObj.lpType,
  100 + bcObj.bcType,
  101 + bcObj.fcno,
  102 + xlDir,
  103 + bcObj.jhlc,
  104 + bcObj.tcc,
  105 + bcObj.ttinfo,
  106 + bcObj.xl,
  107 + bcObj.qdz,
  108 + bcObj.zdz,
  109 + bcObj.STOPTIME,
  110 + bcObj.isfb = 0
  111 + //bcObj.isSwitchXl,
  112 + //bcObj.bz,
  113 + ],
  114 + itemStyle: {
  115 + normal: {
  116 + color: types[colorStr]
  117 + }
  118 + }
  119 + });
  120 + });
  121 + historyData.push(data);
  122 + _keyIndex++;
  123 + { // 遍历获取路牌
  124 + var lpDataCache=[];
  125 + for(var j = 0,len=data.length; j < len; j++) {
  126 + lpDataCache.push([data[j].value[0],data[j].value[4]]);
  127 + }
  128 + lpDataCache.sort(function(a,b){
  129 + return b[1]-a[1];
  130 + });
  131 + $.each(lpDataCache,function () {
  132 + lpData.push(this[0]);
  133 + });
  134 + lpData = unique(lpData);
  135 + }
  136 + } else if(!isLast && isNewData){
  137 + data = newData;
  138 + historyData.splice(_keyIndex+1, historyData.length);
  139 + historyData.push(data);
  140 + _keyIndex++;
  141 + } else if(!isLast && !isNewData){
  142 + data = newData;
  143 + }
  144 + if(!newLpData){
  145 + for(var j = 0,len=lpData.length; j < len; j++) {
  146 + var type = true;
  147 + var name = lpData[j];
  148 + for(var i = 0,len2=data.length; i < len2; i++) {
  149 + if(name == data[i].value[0]) {
  150 + if(type){
  151 + lpDataCount[name] = [data[i].value[3]/60000+data[i].value[15],1,data[i].value[4]];
  152 + type = false;
  153 + } else if(data[i].value[6] == 'in' || data[i].value[16] == 1){
  154 + lpDataCount[name][0] += data[i].value[3]/60000;
  155 + lpDataCount[name][1] += 1;
  156 + } else {
  157 + lpDataCount[name][0] += (data[i].value[3]/60000+data[i].value[15]);
  158 + lpDataCount[name][1] += 1;
  159 + }
  160 + }
  161 + }
  162 + }
  163 + } else {
  164 + lpData = newLpData;// 添加路牌功能
  165 + }
  166 + // 计算图层高度
  167 + bcdom.style.height = (60+lpData.length*60)+'px';
  168 +
  169 + option = {
  170 + tooltip: {
  171 + borderWidth: 1,
  172 + borderRadius: 0,
  173 + triggerOn: 'none',
  174 + textStyle: {
  175 + color: '#000'
  176 + },
  177 + backgroundColor: '#fff',
  178 + borderColor: 'rgba(0, 0, 20, 0.2)',
  179 + formatter: function (params) {
  180 + //bd--早例保;out--出场;normal--正常;cf--吃饭;in--进场;lc--晚例保;major--放站;venting--直放;region--区间
  181 + var bcTypeStr;
  182 + if(params.value[6]=='bd')
  183 + bcTypeStr='早例保';
  184 + else if(params.value[6]=='out')
  185 + bcTypeStr='出场';
  186 + else if(params.value[6]=='normal')
  187 + bcTypeStr='正常';
  188 + else if(params.value[6]=='cf')
  189 + bcTypeStr='吃饭';
  190 + else if(params.value[6]=='in')
  191 + bcTypeStr='进场';
  192 + else if(params.value[6]=='lc')
  193 + bcTypeStr='晚例保';
  194 + else if(params.value[6]=='major')
  195 + bcTypeStr='放站';
  196 + else if(params.value[6]=='venting')
  197 + bcTypeStr='直放';
  198 + else if(params.value[6]=='region')
  199 + bcTypeStr='区间';
  200 + var str = '当前路牌:'+params.value[0]
  201 + + '<br> 行驶方向:'+(params.value[8]==0?'上行':'下行')+'&nbsp;<span>'+ params.marker +'</span>'
  202 + +'<br> fcno:&emsp;&emsp;'+params.value[7]
  203 + +'<br>发车时间:' + getHoursAndMinutes(params.value[1])
  204 + +'<br>到站时间:' + getHoursAndMinutes(params.value[2])
  205 + +'<br>行驶时间:' + params.value[3]/60000 +'分钟'
  206 + +'<br>停休时间:' + params.value[15] +'分钟'
  207 + +'<br>班次类型:' + bcTypeStr ;
  208 + return str;
  209 + }
  210 + },
  211 + grid: {
  212 + top: '0px',
  213 + height: gridHeight * lpData.length
  214 + },
  215 + xAxis: [makeXAxis(0, {
  216 + splitLine: {show: true},
  217 + axisLine: {onZero: false, lineStyle: {color: '#000'}},
  218 + axisLabel: {
  219 + show: true,
  220 + interval:2,
  221 + formatter: function (val) {
  222 + return getHoursAndMinutes(val);
  223 + }
  224 + },
  225 + axisPointer: {
  226 + triggerTooltip: false,
  227 + triggerOn: 'none',
  228 + show: true,
  229 + label: {
  230 + show: true,
  231 + formatter: function (val) {
  232 + return getHoursAndMinutes(val.value);
  233 + }
  234 + }
  235 + }
  236 + })],
  237 + yAxis: {
  238 + data: lpData,
  239 + axisLabel:{
  240 + formatter: function (value, index) {
  241 + var texts = [
  242 + value ,
  243 + '{yAxisLeft|总工时:'+(lpDataCount[value][0]==0 ? 0:(lpDataCount[value][0]/60).toFixed(2)) + '}',
  244 + '{yAxisLeft|总班次:'+lpDataCount[value][1] + '}'
  245 + ];
  246 + return texts.join('\n');
  247 + },
  248 + rich: {
  249 + yAxisLeft: {
  250 + backgroundColor: '#478cf1',
  251 + color: '#fff',
  252 + height: 20,
  253 + width: 80,
  254 + borderRadius: 10,
  255 + align: 'left',
  256 + padding: [0,0,0,5]
  257 + }
  258 + }
  259 + }
  260 + },
  261 + dataZoom: [{
  262 + type: 'slider',
  263 + top: gridHeight * (lpData.length) + 30,//+ gridHeight * (2+lpData.length)
  264 + filterMode: 'weakFilter',
  265 + wDataShadow: false,
  266 + borderColor: 'transparent',
  267 + backgroundColor: '#e2e2e2',
  268 + handleIcon: 'M10.7,11.9H9.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', // jshint ignore:line
  269 + handleSize: 20,
  270 + handleStyle: {
  271 + shadowBlur: 6,
  272 + shadowOffsetX: 1,
  273 + shadowOffsetY: 2,
  274 + shadowColor: '#000'
  275 + },
  276 + start: dataZoomStart,
  277 + end: dataZoomEnd
  278 + }],
  279 + series: [{
  280 + type: 'custom',
  281 + renderItem: renderItem,
  282 + itemStyle: {
  283 + normal: {
  284 + opacity: 0.8
  285 + }
  286 + },
  287 + encode: {
  288 + x: [1, 2],
  289 + y: 0
  290 + },
  291 + label: {
  292 + show: true,
  293 + position: 'insideTopLeft',
  294 + textBorderWidth: -1,
  295 + textBorderColor: '#000',
  296 + fontWeight: 65,
  297 + formatter: function (params) {
  298 +
  299 + var p= chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},[params.data.value[1],params.data.value[2]]);
  300 + var a = p[1]-p[0];
  301 + var type = params.data.value[6],
  302 + lastStr = '',// 班次历时
  303 + stayStr = '',// 停站时间
  304 + timeStr = '',
  305 + bcTypeStr = '';
  306 + if(type=='bd' || type=='lc' || type=='out' || type=='in')
  307 + timeStr = getHoursAndMinutes(params.data.value[1]);
  308 + else
  309 + timeStr = getHoursAndMinutes(params.data.value[1])+'~'+getHoursAndMinutes(params.data.value[2]);
  310 +
  311 + var last = params.data.value[3] / 60000;
  312 + if(last>0) {
  313 + if(type=='bd' || type=='lc')
  314 + lastStr = "保:" + last;
  315 + else if(type=='cf')
  316 + lastStr = "吃:" + last;
  317 + else
  318 + lastStr = "行:" + last;
  319 + }
  320 + // 除了早晚例保,和进出场班次其余类型班次有停站时间
  321 + if(type!='bd' && type!='lc' && type!='out' && type!='in') {
  322 + //if(params.data.value[15]>=0)
  323 + stayStr = "停:" + params.data.value[15];
  324 + }
  325 + // 分班显示‘分’
  326 + if(params.data.value[16] == 1)
  327 + bcTypeStr = "分";
  328 + else
  329 + bcTypeStr = bcType[type];
  330 +
  331 + var arr = [
  332 + '{left|' + timeStr + '}{type|' + bcTypeStr +'}',
  333 + '{left|' + lastStr + '}{left|' + stayStr + '}'
  334 + ];
  335 + return arr.join('\n');
  336 + },
  337 + rich: {
  338 + left: {
  339 + fontSize: 10,
  340 + color: '#000',
  341 + align: 'left'
  342 + },
  343 + type: {
  344 + fontSize: 13,
  345 + color: '#000',
  346 + align: 'right'
  347 + }
  348 + }
  349 + },
  350 + data: data
  351 + }],
  352 + // animation : false,
  353 + animationThreshold : 0,
  354 + animationDurationUpdate : 1500
  355 + };
  356 +
  357 + if (option && typeof option === "object") {
  358 + chart.setOption(option, true);
  359 + }
  360 + // 刷新上下行发车时刻表数据
  361 + refreshUpDownData();
  362 + // 添加可托拽覆盖物
  363 + refreshDrag();
  364 + // 添加缩放数据适配
  365 + chart.on('dataZoom', updatePosition);
  366 + chart.resize();
  367 + upDownOption = {
  368 + tooltip: {
  369 + // trigger: 'axis',
  370 + borderWidth: 1,
  371 + textStyle: {
  372 + color: '#000'
  373 + },
  374 + backgroundColor: '#fff',
  375 + borderColor: 'rgba(0, 0, 20, 0.2)',
  376 + formatter: function (params) {
  377 + var style = 'color: ' + params.color;
  378 + var str = '<span style="' + style + '">发车时间:'+getHoursAndMinutes(params.value[1])+
  379 + '</br>发车间隔:'+params.value[0]+'分钟'+
  380 + '</br>路牌:'+params.value[2]+
  381 + '</br>fcno:'+params.value[7]+
  382 + '</span>';
  383 + return str;
  384 + }
  385 + },
  386 + grid: [
  387 + makeGrid(baseTop),
  388 + makeGrid(baseTop + gridHeight),
  389 + makeGrid(baseTop, {
  390 + show: true,
  391 + height: gridHeight * 2,
  392 + borderColor: '#ccc',
  393 + borderWidth: 1,
  394 + z: 10
  395 + })
  396 + ],
  397 + xAxis: [
  398 + makeXAxis(0),
  399 + makeXAxis(1),
  400 + makeXAxis(2, {
  401 + position: 'top',
  402 + splitLine: {show: true},
  403 + axisLine: {onZero: false, lineStyle: {color: '#000'}},
  404 + axisLabel: {
  405 + show: true,
  406 + interval:2,
  407 + formatter: function (val) {
  408 + return getHoursAndMinutes(val);
  409 + }
  410 + },
  411 + axisPointer: {
  412 + triggerTooltip: false,
  413 + show: true,
  414 + lineStyle: {
  415 + color: '#478cf1',
  416 + width: 1.5
  417 + },
  418 + label: {
  419 + show: true,
  420 + formatter: function (val) {
  421 + return getHoursAndMinutes(val.value);
  422 + }
  423 + }
  424 +
  425 + }
  426 + })
  427 + ],
  428 + yAxis: [
  429 + makeYAxis(0, {
  430 + name: '上行发车时刻表'
  431 + }),
  432 + makeYAxis(1, {
  433 + name: '下行发车时刻表'
  434 + }),
  435 + makeYAxis(2)
  436 + ],
  437 + dataZoom: [{
  438 + type: 'slider',
  439 + xAxisIndex: [0, 1, 2],
  440 + top: baseTop - 60,//+ gridHeight * (2+lpData.length)
  441 + filterMode: 'weakFilter',
  442 + wDataShadow: false,
  443 + borderColor: 'transparent',
  444 + backgroundColor: '#e2e2e2',
  445 + handleIcon: 'M10.7,11.9H9.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', // jshint ignore:line
  446 + handleSize: 20,
  447 + handleStyle: {
  448 + shadowBlur: 6,
  449 + shadowOffsetX: 1,
  450 + shadowOffsetY: 2,
  451 + shadowColor: '#000'
  452 + },
  453 + start: dataZoomStart,
  454 + end: dataZoomEnd
  455 + }],
  456 + visualMap: {
  457 + top: 70,
  458 + right: 20,
  459 + pieces: [{
  460 + lte: 8,
  461 + color: '#75b228'
  462 + },{
  463 + gt: 8,
  464 + lte: 20,
  465 + color: '#ff9933'
  466 + },{
  467 + gt: 20,
  468 + color: '#cc0033'
  469 + }],
  470 + outOfRange: {
  471 + color: '#999'
  472 + },
  473 + seriesIndex: [0, 1],
  474 + dimension: 0
  475 + },
  476 + series: [{
  477 + type: 'line',
  478 + itemStyle: {
  479 + normal: {
  480 + color: '#ff2949'
  481 + }
  482 + },
  483 + data: dataUp,
  484 + markLine: {
  485 + silent: true,
  486 + data: [{
  487 + yAxis: 8
  488 + }, {
  489 + yAxis: 20
  490 + }]
  491 + },
  492 + encode: {
  493 + x: 1,
  494 + y: 0
  495 + }
  496 + }, {
  497 + type: 'line',
  498 + xAxisIndex: 1,
  499 + yAxisIndex: 1,
  500 + itemStyle: {
  501 + normal: {
  502 + color: '#518fe3'
  503 + }
  504 + },
  505 + data: dataDown,
  506 + markLine: {
  507 + silent: true,
  508 + data: [{
  509 + yAxis: 8
  510 + }, {
  511 + yAxis: 20
  512 + }]
  513 + },
  514 + encode: {
  515 + x: 1,
  516 + y: 0
  517 + }
  518 + }],
  519 + //animationEasingUpdate: 'cubicInOut',
  520 + animationDurationUpdate: 1500
  521 + };
  522 +
  523 + if (upDownOption && typeof upDownOption === "object") {
  524 + upDownChart.setOption(upDownOption, true);
  525 + }
  526 + // 添加缩放数据适配
  527 + upDownChart.on('dataZoom', updatePosition);
  528 + upDownChart.resize();
  529 + };
  530 +
  531 + var renderItem = function (params, api) {
  532 + var categoryIndex = api.value(0); //这里使用api.value(0) 取出当前dataItem中第一个维度的数值
  533 + var start = api.coord([api.value(1), categoryIndex]);//将数值在当前坐标系中转换成为屏幕上的点的像素值 api.coord(//开始时间,种类),这)里返回是 start[0][1] x 坐标和 y坐标
  534 + var end = api.coord([api.value(2), categoryIndex]);//将数值在当前坐标系中转成屏幕上的点的像素值api.crood(开始时间,种类)相当于一个x yige y
  535 + height = api.size([0, 1])[1] * 0.6;
  536 + return {
  537 + type: 'rect',
  538 + shape: echarts.graphic.clipRectByRect(
  539 + {
  540 + x: start[0],//矩形的位置和大小
  541 + y: start[1] - height / 2,
  542 + width: end[0] - start[0],
  543 + height: height
  544 + },
  545 + {
  546 + x: params.coordSys.x,
  547 + y: params.coordSys.y,
  548 + width: params.coordSys.width,
  549 + height: params.coordSys.height
  550 + }),
  551 + style: api.style()
  552 + };
  553 + };
  554 +
  555 + // 动作刷新底层班次(缩放条/拖动班次)
  556 + var updatePosition = function (e) {
  557 + data = $.extend(true, [], data, historyData[_keyIndex]);
  558 + dataZoomStart = e.start;
  559 + dataZoomEnd = e.end;
  560 + chart.setOption({
  561 + dataZoom: [{
  562 + start: dataZoomStart,
  563 + end: dataZoomEnd
  564 + }]
  565 + });
  566 + upDownChart.setOption({
  567 + dataZoom: [{
  568 + start: dataZoomStart,
  569 + end: dataZoomEnd
  570 + }]
  571 + });
  572 +
  573 + chart.setOption({
  574 + series: [{
  575 + label: {
  576 + normal: {
  577 + show: true,
  578 + position: 'insideTopLeft',
  579 + textBorderWidth: 0,
  580 + textBorderColor: '#000',
  581 + formatter: function (params) {
  582 +
  583 + var p= chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},[params.data.value[1],params.data.value[2]]);
  584 + var a = p[1]-p[0];
  585 + var type = params.data.value[6],
  586 + lastStr = '',// 班次历时
  587 + stayStr = '',// 停站时间
  588 + timeStr = '';
  589 + if(type=='bd' || type=='lc' || type=='out' || type=='in')
  590 + timeStr = getHoursAndMinutes(params.data.value[1]);
  591 + else
  592 + timeStr = getHoursAndMinutes(params.data.value[1])+'~'+getHoursAndMinutes(params.data.value[2]);
  593 +
  594 + var last = params.data.value[3] / 60000;
  595 + if(last>0) {
  596 + if(type=='bd' || type=='lc')
  597 + lastStr = "保:" + last;
  598 + else if(type=='cf')
  599 + lastStr = "吃:" + last;
  600 + else
  601 + lastStr = "行:" + last;
  602 + }
  603 +
  604 + if(type == 'normal') {
  605 + stayStr = "停:" + params.data.value[15];
  606 + }
  607 + var arr = [
  608 + '{left|' + timeStr + '}{type|'+ ((e.end - e.start) < 80 ? bcType[type] : '') +'}',
  609 + '{left|' + lastStr + '}{left|' + stayStr + '}'
  610 + ];
  611 +
  612 + return arr.join('\n');
  613 + },
  614 + rich: {
  615 + left: {
  616 + fontSize: 10,
  617 + //lineHeight: 30,
  618 + color: '#000',
  619 + align: 'left',
  620 + padding: [0, 5, 0, 0]
  621 + },
  622 + type: {
  623 + fontSize: 13,
  624 + color: '#000',
  625 + align: 'right'
  626 + }
  627 + }
  628 + }
  629 + },
  630 + data: data
  631 + }]
  632 + });
  633 + chart.setOption({
  634 + graphic: echarts.util.map(data, function (item, dataIndex) {
  635 + var p = [item.value[1],item.value[0]];
  636 + var p2 = [item.value[2],item.value[0]];
  637 + var pp= chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},p);
  638 + var pp2= chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},p2);
  639 + return {
  640 + position: chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},p),
  641 + shape: {
  642 + width:pp2[0]-pp[0],
  643 + height:height
  644 + }
  645 + };
  646 + })
  647 + });
  648 + // console.log(data);
  649 + };
  650 + // 刷新可拖动阴影班次
  651 + var refreshDrag = function (){
  652 + data = historyData[_keyIndex];
  653 + chart.setOption({
  654 + graphic: echarts.util.map(data, function (item, dataIndex) {
  655 +
  656 + var p = [item.value[1],item.value[0]];
  657 + var p2 = [item.value[2],item.value[0]];
  658 + var pp= chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},p);
  659 + var pp2= chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},p2);
  660 +
  661 + var dataSize = data.length;
  662 + if(dataIndex<dataSize-1) {
  663 + for(var i=0;i<dataSize;i++) {
  664 + if(i==dataIndex)
  665 + continue;
  666 + if(data[dataIndex].value[6] == 'in' || data[dataIndex].value[16] == 1) {
  667 + data[dataIndex].value[15] = 0;
  668 + break;
  669 + }
  670 + if(data[dataIndex].value[4] == data[i].value[4] && data[dataIndex].value[7] == (data[i].value[7]-1)) {//同一路牌下的下一个班次的发车时间 - 本班次的到站时间 = 停车时间
  671 + data[dataIndex].value[15] = (data[dataIndex+1].value[1] - data[dataIndex].value[2])/60000;
  672 + break;
  673 + }
  674 + }
  675 + }
  676 + return {
  677 + type: 'rect',
  678 + borderWidth: 4,
  679 + position: chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0}, p),
  680 + shape: {
  681 + //x: -30,//矩形的位置和大小
  682 + width:pp2[0]-pp[0],
  683 + height:height,
  684 + y: -18
  685 + },
  686 + style:{
  687 + fill: 'rgba(121, 121, 121, 0.2)'
  688 + },
  689 + //invisible: false,
  690 + draggable: true,//是否可拖拽
  691 + progressive: true,
  692 + // silent : true,
  693 + onmousemove: echarts.util.curry(showTooltip, dataIndex),
  694 + onmouseout: echarts.util.curry(hideTooltip, dataIndex),
  695 + // ondragstart: echarts.util.curry(onPointDragging, dataIndex),
  696 + ondragend: echarts.util.curry(onPointDragging, dataIndex),
  697 + onmousedown: echarts.util.curry(rightClick, dataIndex),
  698 + z: 99
  699 + };
  700 + })
  701 + });
  702 + };
  703 + // 刷新上下行发车时刻表数据
  704 + var refreshUpDownData = function () {
  705 + // 清空数据
  706 + dataUp=[];
  707 + dataDown=[];
  708 + data = $.extend(true, [], data, historyData[_keyIndex]);
  709 + console.log(_keyIndex);
  710 + for(var i = 0,len=data.length; i < len; i++) {
  711 + var type = [];
  712 + type = $.extend(true, [], type, data[i].value);
  713 + if(data[i].value[6] == 'normal') {
  714 + if (data[i].value[8] == 0) {
  715 + dataUp.push(type);
  716 + } else if (data[i].value[8] == 1) {
  717 + dataDown.push(type);
  718 + }
  719 + }
  720 + }
  721 + dataUp.sort(function(a,b){
  722 + return a[1]-b[1];
  723 + });
  724 + dataDown.sort(function(a,b){
  725 + return a[1]-b[1];
  726 + });
  727 + for(var i = 0,len2=dataUp.length; i < len2; i++) {
  728 + dataUp[i][2] = dataUp[i][0];
  729 + if(i>0) {
  730 + dataUp[i][0] = (dataUp[i][1] - dataUp[i-1][1]) / 60000;
  731 + } else {
  732 + dataUp[i][0] = 0;
  733 + }
  734 + }
  735 +
  736 + for(var i = 0,len3=dataDown.length; i < len3; i++) {
  737 + dataDown[i][2] = dataDown[i][0];
  738 + if(i>0) {
  739 + dataDown[i][0] = (dataDown[i][1] - dataDown[i-1][1]) / 60000;
  740 + } else {
  741 + dataDown[i][0] = 0;
  742 + }
  743 + }
  744 + if (option && typeof option === "object") {
  745 + chart.setOption({
  746 + series: [{
  747 + data: data
  748 + }]
  749 + });
  750 + }
  751 + if (upDownOption && typeof upDownOption === "object") {
  752 + upDownChart.setOption({
  753 + series: [{
  754 + xAxisIndex: 0,
  755 + yAxisIndex: 0,
  756 + data: dataUp
  757 + },{
  758 + xAxisIndex: 1,
  759 + yAxisIndex: 1,
  760 + data: dataDown
  761 + }]
  762 + });
  763 + }
  764 + };
  765 +
  766 + // 定义班次调整事件可单击
  767 + var refreshBC = function (lpName){
  768 + data = historyData[_keyIndex];
  769 + chart.setOption({
  770 + graphic: echarts.util.map(data, function (item, dataIndex) {
  771 +
  772 + var p = [item.value[1],item.value[0]];
  773 + var p2 = [item.value[2],item.value[0]];
  774 + var pp= chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},p);
  775 + var pp2= chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0},p2);
  776 +
  777 + var dataSize = data.length;
  778 + if(dataIndex<dataSize-1) {
  779 + for(var i=0;i<dataSize;i++) {
  780 + if(i==dataIndex)
  781 + continue;
  782 + if(data[dataIndex].value[4] == data[i].value[4] && data[dataIndex].value[7] == (data[i].value[7]-1)) {//同一路牌下的下一个班次的发车时间 - 本班次的到站时间 = 停车时间
  783 + data[dataIndex].value[15] = (data[dataIndex+1].value[1] - data[dataIndex].value[2])/60000;
  784 + break;
  785 + }
  786 + }
  787 + }
  788 + return {
  789 + type: 'rect',
  790 + borderWidth: 4,
  791 + position: chart.convertToPixel({xAxisIndex: 0, yAxisIndex:0}, p),
  792 + shape: {
  793 + //x: -30,//矩形的位置和大小
  794 + width:pp2[0]-pp[0],
  795 + height:height,
  796 + y: -18
  797 + },
  798 + style:{
  799 + fill: 'rgba(121, 121, 121, 0.2)'
  800 + },
  801 + //invisible: false,
  802 + draggable: false,//是否可拖拽
  803 + progressive: true,
  804 + onclick: echarts.util.curry(bcClick, dataIndex,lpName),
  805 + ondragend: null,
  806 + onmousedown: null,
  807 + z: 999
  808 + };
  809 + })
  810 + });
  811 + };
  812 +
  813 + var bcClick = function (dataIndex,lpName) {
  814 + var data = $.extend(true, [], data, historyData[_keyIndex]);
  815 + if(data[dataIndex].value[0] != lpName){
  816 + var a = $("#bcAdjustList").val();
  817 + if(a){
  818 + a.push(dataIndex);
  819 + } else
  820 + a = dataIndex;
  821 +
  822 + $("#bcAdjustList").select2('val',a);
  823 + } else
  824 + layer.msg("不能选择目标路牌的班次!");
  825 + };
  826 +
  827 + document.onclick = function(event){
  828 + var count=$(".dropdown-context").length;
  829 + if(count>0){
  830 + $(".dropdown-context").remove();
  831 + }
  832 + };
  833 + // 鼠标右击触发事件
  834 + var rightClick = function (dataIndex, e) {
  835 + var count=$(".dropdown-context").length;
  836 + if(count>0){
  837 + $(".dropdown-context").remove();
  838 + }
  839 + if(e.event.button == 2) {
  840 + var data = $.extend(true, [], data, historyData[_keyIndex]);
  841 + var s = data[dataIndex];
  842 + var htmlStr = template('rightClick_dropdown_menu',{ 'dataIndex': dataIndex, 'style': 'top: '+(e.offsetY+8)+'px; left:'+(e.offsetX-16)+'px; display: block;'});
  843 + $("#bcContainer").append(htmlStr);
  844 + }
  845 + };
  846 + // 显示Tooltip
  847 + var showTooltip = function (dataIndex,e) {
  848 + chart.dispatchAction({
  849 + type: 'showTip',
  850 + seriesIndex: 0,
  851 + dataIndex: dataIndex
  852 + });
  853 + };
  854 + // 隐藏Tooltip
  855 + var hideTooltip = function (dataIndex) {
  856 + chart.dispatchAction({
  857 + type: 'hideTip'
  858 + });
  859 + };
  860 + // 拖动刷新底层班次
  861 + var onPointDragging = function (dataIndex,e) {
  862 + if(e.event.button == 0 || e.event.button == 1) {
  863 + var data = $.extend(true, [], data, historyData[_keyIndex]);
  864 + var p = chart.convertFromPixel({xAxisIndex: 0, yAxisIndex: 0}, this.position);
  865 + data[dataIndex].value[1] = Math.floor(p[0]/60000)*60000;
  866 + //data[dataIndex].value[0] = p[1]; // y轴数据改变(注释时表示只能拖动数据x轴移动)
  867 + data[dataIndex].value[2] = data[dataIndex].value[1] + data[dataIndex].value[3];
  868 +
  869 + var flag = true;
  870 + for (var i = 0, len = data.length; i < len; i++) {
  871 + if (i == dataIndex)
  872 + continue;
  873 + // 同路牌比较
  874 + if (data[dataIndex].value[4] == data[i].value[4] && data[dataIndex].value[7] == (data[i].value[7] - 1)) {// 和后一个班次比较
  875 + if (data[dataIndex].value[2] > data[i].value[1]) {// 班次结束时间晚于于下一班次开始时间(处理数据)
  876 + data[dataIndex].value[2] = data[i].value[1];
  877 + data[dataIndex].value[1] = data[dataIndex].value[2] - data[dataIndex].value[3];
  878 + break;
  879 + }
  880 + }
  881 + if (data[dataIndex].value[4] == data[i].value[4] && data[dataIndex].value[7] == (data[i].value[7] + 1)) {// 和前一个班次比较
  882 + if (data[dataIndex].value[1] < data[i].value[2]) {// 班次开始时间早于上一班次结束时间(处理数据)
  883 + data[dataIndex].value[1] = data[i].value[2];
  884 + data[dataIndex].value[2] = data[dataIndex].value[1] + data[dataIndex].value[3];
  885 + //flag = false;
  886 + break;
  887 + }
  888 + }
  889 + // 阴影拖动外围在xMin-xMax之间
  890 + if (data[dataIndex].value[1] < xMin) {
  891 + data[dataIndex].value[1] = xMin;
  892 + data[dataIndex].value[2] = data[dataIndex].value[1] + data[dataIndex].value[3];
  893 + }
  894 + if (data[dataIndex].value[2] > xMax) {
  895 + data[dataIndex].value[2] = xMax;
  896 + data[dataIndex].value[1] = data[dataIndex].value[2] - data[dataIndex].value[3];
  897 + }
  898 +
  899 + }
  900 + _keyIndex++;
  901 +
  902 + historyData[_keyIndex] = $.extend(true, [], historyData[_keyIndex], data);// 历史数组增加一次数据
  903 + refreshDrag();
  904 + refreshUpDownData();
  905 + historyData.splice(_keyIndex + 1, historyData.length);// 数据改变后过后清除多余的历史数据
  906 + } else {
  907 + refreshDrag();
  908 + }
  909 + };
  910 +
  911 + var makeXAxis = function(gridIndex, opt) {
  912 + return echarts.util.merge({
  913 + type: 'time',
  914 + gridIndex: gridIndex,
  915 + axisLine: {onZero: false, lineStyle: {color: '#ddd'}},
  916 + axisTick: {show: false},
  917 + axisLabel: {show: false},
  918 + splitLine: {show: false, lineStyle: {color: '#ddd'}},
  919 + min: xMin,//"2010-01-01 03:30:00"
  920 + max: xMax,//"2010-01-02 03:30:00"
  921 + scale: true,
  922 + axisPointer: {
  923 + lineStyle: {color: 'transparent'}
  924 + },
  925 + maxInterval: 3600000
  926 + }, opt || {}, true);
  927 + };
  928 +
  929 + var makeYAxis = function (gridIndex, opt) {
  930 + return echarts.util.merge({
  931 + type: 'value',
  932 + gridIndex: gridIndex,
  933 + // nameLocation: 'middle',
  934 + nameLocation: 'left',
  935 + nameTextStyle: {
  936 + color: '#333'
  937 + },
  938 + min: 0,
  939 + max: 30,
  940 + axisTick: {show: false},
  941 + //axisLine: {lineStyle: {color: '#ccc'}},
  942 + axisLabel: {show: false},
  943 + splitLine: {show: false}
  944 + }, opt || {}, true);
  945 + };
  946 +
  947 + var makeGrid = function (top, opt) {
  948 + return echarts.util.merge({
  949 + top: top,
  950 + height: gridHeight
  951 + }, opt || {}, true);
  952 + };
  953 + // 窗口大小改变刷新图层
  954 + $(window).resize(function() {
  955 + resizeChart();
  956 + });
  957 + // 刷新图层大小
  958 + var resizeChart = function () {
  959 + chart.resize();
  960 + upDownChart.resize();
  961 + refreshDrag();
  962 + };
  963 + // 补齐两位
  964 + var swallowTow = function (date) {
  965 + return date>=10?date:(date="0"+date);
  966 + };
  967 + // 时间戳转时间(时间:分钟)
  968 + var getHoursAndMinutes = function (timestamp) {
  969 + var date = new Date(timestamp);
  970 + var Hours = swallowTow(date.getHours());
  971 + var Minutes = swallowTow(date.getMinutes());
  972 + return Hours+":"+Minutes;
  973 + };
  974 +
  975 + /* 数组去重
  976 + * 优化遍历数组法
  977 + * 思路:获取没重复的最右一值放入新数组
  978 + */
  979 + var unique = function (array){
  980 + var r = [];
  981 + for(var i = 0, l = array.length; i < l; i++) {
  982 + for(var j = i + 1; j < l; j++)
  983 + if (array[i] === array[j]) j = ++i;
  984 + r.push(array[i]);
  985 + }
  986 + return r;
  987 + };
  988 + return {
  989 + init: init,
  990 + setLpData: setLpData,
  991 + getLpData: getLpData,
  992 + setLpDataCount: setLpDataCount,
  993 + getLpDataCount: getLpDataCount,
  994 + set_keyIndex: set_keyIndex,
  995 + get_keyIndex: get_keyIndex,
  996 + setHistoryData: setHistoryData,
  997 + getHistoryData: getHistoryData,
  998 + refreshDrag: refreshDrag,
  999 + refreshUpDownData: refreshUpDownData,
  1000 + refreshBC: refreshBC,
  1001 + resizeChart: resizeChart
  1002 + };
  1003 +}();
0 1004 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/gantt.js
1 1 (function() {
2 2 // 全屏模式点击事件.
  3 + // $(document).on('click','.fullscreen',function() {
  4 + // if($('.ganttSvgContainer').height()>400)
  5 + // $('.ganttSvgContainer').css('height','400px');
  6 + // else
  7 + // $('.ganttSvgContainer').css('height','99%');
  8 + // });
3 9 $(document).on('click','.fullscreen',function() {
4   - if($('.ganttSvgContainer').height()>400)
5   - $('.ganttSvgContainer').css('height','400px');
6   - else
7   - $('.ganttSvgContainer').css('height','99%');
  10 + if($('.gtt').height()>720)
  11 + $('.gtt').css('height','720px');
  12 + else
  13 + $('.gtt').css('height','99%');
  14 + echartsDrawGTT.resizeChart();
8 15 });
9 16 // 获取已存在的该时刻表明细数据.
10 17 var objD = window.localStorage.isDoDate;
... ... @@ -32,7 +39,6 @@
32 39 });
33 40 $('.tipso-animation').tipso('show');
34 41 setTimeout(function(){$('.tipso-animation').tipso('hide');},4000);
35   - //debugger;
36 42 // 1、定义开始与结束时间点字符串.
37 43 var seMap = getStartAndEndDate(map);
38 44 // 2、获取开始与结束时间对象.
... ... @@ -46,6 +52,7 @@
46 52 var bcTypeArr = getbcType();
47 53 // 7、参数配置信息.
48 54 var dataMap = argsMap(map,dirA,bcTypeArr,seMap);
  55 + parameters.setDataMap(dataMap);
49 56 // 8、定义最大车辆数与停站时间.
50 57 var CSMap = null,data = null;
51 58  
... ... @@ -65,21 +72,22 @@
65 72 _paramObj = Main_v2.getFactory().createParameterObj(map, dataMap);
66 73 map.clzs = _paramObj.calcuClzx();
67 74 CSMap = getMaxCarAndStopSpace1(map);
68   -
69 75 }
70 76  
71 77 // 定义时间参数.
72   - var stopAraay = getsj(map);
  78 + var stopArray = getsj(map);
73 79 if(isNull(objD)) {
74 80 if(map.baseRes== '0') {
75 81 // 采用客流数据获取渲染时刻表明细图形的配置参数数据.
76   - data = BaseFun.KLplaceClassesTime(CSMap.gattA,stopAraay,CSMap.maxCar,map,seMap,dataMap);
  82 + data = BaseFun.KLplaceClassesTime(CSMap.gattA,stopArray,CSMap.maxCar,map,seMap,dataMap);
77 83 }else if(map.baseRes== '1') {
78 84 // 采用班型人次数据获取渲染时刻表明细图形的配置参数数据.
79   - // data = BaseFun.BXPplaceClassesTime(stopAraay,CSMap.maxCar,map,seMap,dataMap,getylp(CSMap.maxCar).lpNoA);
80   - // data = BaseFun.BXPplaceClassesTime01(stopAraay,CSMap.maxCar,map,seMap,dataMap,getylp(CSMap.maxCar).lpNoA);
81   - data = BaseFun.BXPplaceClassesTime02(stopAraay,CSMap.maxCar,map,seMap,dataMap);
82   - } else if (map.baseRes == '2') {
  85 + // data = BaseFun.BXPplaceClassesTime(stopArray,CSMap.maxCar,map,seMap,dataMap,getylp(CSMap.maxCar).lpNoA);
  86 + // data = BaseFun.BXPplaceClassesTime01(stopArray,CSMap.maxCar,map,seMap,dataMap,getylp(CSMap.maxCar).lpNoA);
  87 + // data = BaseFun.BXPplaceClassesTime02(stopArray,CSMap.maxCar,map,seMap,dataMap);
  88 + data = scheduleInitialize.scheduleInit(stopArray,CSMap.maxCar,map,seMap,dataMap);
  89 + $(".paramAdd").addClass("hidden");
  90 + } else if (map.baseRes == '2') {
83 91 // TODO:绘制gantt图表
84 92 // TODO:var seDate = getksjssj(null,seMap.s); 关联参数必须设置
85 93 // TODO:CSMap.maxCar 之后要设定一下的
... ... @@ -109,20 +117,22 @@
109 117 }
110 118 // 按照发车序号顺序排序.
111 119 lpbc_.sort(function(a,b){return a.fcno-b.fcno});
112   - resultJA = resultJA.concat(BaseFun.addjclbbc01(lpbc_,dataMap,stopAraay[0].lbsj,map));
  120 + resultJA = resultJA.concat(BaseFun.addjclbbc01(lpbc_,dataMap,stopAraay[0].lbsj,map));
113 121 }
114 122 data = {'json':rsjar,'bxrcgs':null};
115 123 }
116   - // 创建甘特图对象.
117   - var graph = d3.select('#ganttSvg').relationshipGraph(
118   - getGraphArgus({'ganttInitParams': map,'yAxisCarArray':CSMap.maxCar,
119   - 'startDateTime':seDate.kssj,'endDateTime':seDate.jssj,'stopAraay':stopAraay,'dataMap':dataMap,'bxrcgs':data.bxrcgs}));
120   - // 渲染数据.
121   - graph.data(data.json);
122   - // 记录操作记录.
123   - graph.addHistory();
124   - // 初始化右键菜单.
125   - contextInit(graph);
  124 + echartsDrawGTT.init(data.json,true,true);
  125 + console.log(data.json);
  126 + // 创建甘特图对象.
  127 + // var graph = d3.select('#ganttSvg').relationshipGraph(
  128 + // getGraphArgus({'ganttInitParams': map,'yAxisCarArray':CSMap.maxCar,
  129 + // 'startDateTime':seDate.kssj,'endDateTime':seDate.jssj,'stopArray':stopArray,'dataMap':dataMap,'bxrcgs':data.bxrcgs}));
  130 + // // 渲染数据.
  131 + // graph.data(data.json);
  132 + // // 记录操作记录.
  133 + // graph.addHistory();
  134 + // // 初始化右键菜单.
  135 + // contextInit(graph);
126 136 },500);
127 137  
128 138 /**
... ... @@ -439,8 +449,8 @@
439 449 * @return 返回甘特图的参数配置信息.
440 450 * */
441 451 function getGraphArgus(p) {
442   - var bs = p.stopAraay[0].sxsj > 40 ? 4 : 2;
443   - var MULTIPLE = Math.round(105/parseInt(p.stopAraay[0].sxsj)) >3 ? Math.round(90/parseInt(p.stopAraay[0].sxsj)) : Math.round(90/parseInt(p.stopAraay[0].sxsj)) *bs;
  452 + var bs = p.stopArray[0].sxsj > 40 ? 4 : 2;
  453 + var MULTIPLE = Math.round(105/parseInt(p.stopArray[0].sxsj)) >3 ? Math.round(90/parseInt(p.stopArray[0].sxsj)) : Math.round(90/parseInt(p.stopArray[0].sxsj)) *bs;
444 454 var VALUEKEYNAME = 'Worldwide Gross' ,
445 455 DXHOURS = 24,MINUTE = 60,WIDTH = DXHOURS*MINUTE,MARGINLEFT = 380,HEIGHT = p.yAxisCarArray.length*60 + 240,
446 456 MARGINBOTTOM = 240,OFFSETX = 90,OFFSETY = 180,OFFSETUPY = 120,OFFSETDOWNY = 60,
... ... @@ -453,7 +463,6 @@
453 463 var hours=Math.floor(leave1/(3600*1000));
454 464 DXHOURS = days*24+hours;
455 465 WIDTH = DXHOURS*MINUTE*MULTIPLE;
456   - // debugger;
457 466 var lpsplitA = getylp(p.yAxisCarArray);
458 467 var args = {
459 468 'valueKeyName': VALUEKEYNAME,
... ... @@ -476,11 +485,11 @@
476 485 'lpNoA':lpsplitA.lpNoA,
477 486 'lpNameA':lpsplitA.lpNameA,
478 487 'tickFormat': TICKFORMAT,
479   - 'stopAraay' : p.stopAraay,
  488 + 'stopArray' : p.stopArray,
480 489 'dataMap':p.dataMap,
481 490 'showTooltips': SHOWTOOLTIPS,
482 491 'bxrcgs':p.bxrcgs
483   - }
  492 + };
484 493 return args;
485 494 }
486 495  
... ... @@ -556,18 +565,18 @@
556 565 // 把当前路牌下的班次按发车序号顺序排序.
557 566 normalA.sort(function(a,b){return a.fcno-b.fcno});
558 567 // 先添加进出场班次和早晚例保班次-->然后合并其他班次-->然后重置发车序号和班次数-->根据数据重新渲染视图.
559   - data = BaseFun.setbcsAndfcno(qtlpbc.concat(BaseFun.addjclbbc(normalA,graph.configuration.dataMap,graph.configuration.stopAraay[0].lbsj,map)));
  568 + data = BaseFun.setbcsAndfcno(qtlpbc.concat(BaseFun.addjclbbc(normalA,graph.configuration.dataMap,graph.configuration.stopArray[0].lbsj,map)));
560 569 }else {
561 570 data = graph.getDataArray();
562 571 }
563 572 var rsjar = BaseFun.tzsztest(graph.configuration.taskTypes,data,graph.configuration.dataMap);
564 573 /*var resultJA = BaseFun.addjcclcbc01(graph.configuration.taskTypes,rsjar,
565   - graph.configuration.dataMap,graph.configuration.stopAraay,data,
  574 + graph.configuration.dataMap,graph.configuration.stopArray,data,
566 575 graph.configuration.dataMap.map);*/
567 576 // 获取图形数据.重新绘制.
568 577 graph.data(BaseFun.addjcclcbc01(graph.configuration.taskTypes,rsjar,
569 578 graph.configuration.dataMap,
570   - graph.configuration.stopAraay,
  579 + graph.configuration.stopArray,
571 580 graph.configuration.dataMap.map));
572 581 // 记录当前操作.
573 582 graph.addHistory();
... ... @@ -727,8 +736,8 @@
727 736 // 把当前路牌下的班次按发车序号顺序排序.
728 737 normalA.sort(function(a,b){return a.fcno-b.fcno});
729 738 // 先添加进出场班次和早晚例保班次-->然后合并其他班次-->然后重置发车序号和班次数-->根据数据重新渲染视图.
730   - graph.data(BaseFun.setbcsAndfcno(qtlpbc.concat(BaseFun.addjclbbc(normalA,graph.configuration.dataMap,graph.configuration.stopAraay[0].lbsj,map))));
731   - // graph.data(BaseFun.addjclbbc(normalA,graph.configuration.dataMap,graph.configuration.stopAraay[0].lbsj,map));
  739 + graph.data(BaseFun.setbcsAndfcno(qtlpbc.concat(BaseFun.addjclbbc(normalA,graph.configuration.dataMap,graph.configuration.stopArray[0].lbsj,map))));
  740 + // graph.data(BaseFun.addjclbbc(normalA,graph.configuration.dataMap,graph.configuration.stopArray[0].lbsj,map));
732 741 // 记录当前操作.
733 742 graph.addHistory();
734 743 }
... ...
src/main/resources/static/pages/base/timesmodel/js/parameters.js 0 → 100644
  1 +/**
  2 + * 时刻表参数类
  3 + */
  4 +var parameters = function () {
  5 + var dataMap;
  6 + var getDataMap = function(){
  7 + return dataMap;
  8 + };
  9 + var setDataMap = function(data){
  10 + dataMap = data;
  11 + };
  12 + return {
  13 + getDataMap : getDataMap,
  14 + setDataMap : setDataMap
  15 + }
  16 +}();
0 17 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/systemTools.js 0 → 100644
  1 +// 恢复动作
  2 +$('.recover').on('click',function() {
  3 + // 关闭弹出层.
  4 + layer.closeAll();
  5 + // 获取当前操作步数
  6 + var _keyIndex = echartsDrawGTT.get_keyIndex();
  7 + // 判断当前操作是否恢复到最后一步的操纵.
  8 + if(_keyIndex >= echartsDrawGTT.getHistoryData().length-1) {
  9 + layer.msg('您已经是操作记录的【最后一步】了,不能在恢复了!');
  10 + return;
  11 + } else {
  12 + // 标记操作下标前进.
  13 + echartsDrawGTT.set_keyIndex(++_keyIndex);
  14 + var historyData = echartsDrawGTT.getHistoryData();
  15 + var data = $.extend(true, [], data, historyData[_keyIndex]);
  16 + echartsDrawGTT.init(data,false,false);
  17 + echartsDrawGTT.refreshDrag();
  18 + layer.msg('恢复到操作记录的【第'+(_keyIndex+1)+'步】了!');
  19 + }
  20 +});
  21 +// 撤销动作
  22 +$(".revoke").on("click",function(){
  23 + // 关闭弹出层.
  24 + layer.closeAll();
  25 + // 获取当前操作步数
  26 + var _keyIndex = echartsDrawGTT.get_keyIndex();
  27 + // 判断当对图形操作的步骤.
  28 + if(_keyIndex==0) {
  29 + layer.msg('您已经是操作记录的【第一步】了,不能在撤销了!');
  30 + return;
  31 + } else {
  32 + // 标记操作下标后退.
  33 + echartsDrawGTT.set_keyIndex(--_keyIndex);
  34 + var historyData = echartsDrawGTT.getHistoryData();
  35 + var data = $.extend(true, [], data, historyData[_keyIndex]);
  36 + echartsDrawGTT.init(data,false,false);
  37 + echartsDrawGTT.refreshDrag();
  38 + layer.msg('撤销到操作记录的【第'+(_keyIndex+1)+'步】了!');
  39 + }
  40 +});
  41 +/** 监听添加班次事件.*/
  42 +$('.addBc').on('click',function() {
  43 + var bcdom = document.getElementById("bcContainer");
  44 + var lpData = echartsDrawGTT.getLpData();
  45 + var lpDataCount = echartsDrawGTT.getLpDataCount();
  46 + // 弹出层mobal页面
  47 + $.get('/pages/base/timesmodel/fragments/addBc.html', function(m){
  48 + $(pjaxContainer).append(m);
  49 + // 规定被选元素要触发的事件。可以使自定义事件(使用 bind() 函数来附加),或者任何标准事件。
  50 + $('#addBc_mobal').trigger('addBcMobal.show',[lpData,lpDataCount,echartsDrawGTT]);
  51 + });
  52 +});
  53 +/** 监听添加路牌事件. **/
  54 +$('.addLp').on('click',function() {
  55 + var lpData = echartsDrawGTT.getLpData();
  56 + $.get('/pages/base/timesmodel/fragments/addlp.html', function(m){
  57 + $(pjaxContainer).append(m);
  58 + // 显示修改班次片段.
  59 + $('#addlp_mobal').trigger('addlpMobal.show',[lpData,echartsDrawGTT]);
  60 + });
  61 +});
  62 +/** 监听删除路牌事件. **/
  63 +$('.deleteLp').on('click',function() {
  64 + var lpData = echartsDrawGTT.getLpData();
  65 + $.get('/pages/base/timesmodel/fragments/deletelp.html', function(m){
  66 + $(pjaxContainer).append(m);
  67 + // 显示修改班次片段.
  68 + $('#deletelp_mobal').trigger('deletelpMobal.show',[lpData,echartsDrawGTT]);
  69 + });
  70 +});
  71 +/** 监听班次调整事件.(点击) **/
  72 +$('.bcAdjust').on('click',function() {
  73 + var lpData = echartsDrawGTT.getLpData();
  74 + $.get('/pages/base/timesmodel/fragments/bcadjust.html', function(m){
  75 + $(pjaxContainer).append(m);
  76 + // 显示修改班次片段.
  77 + $('#bcadjust_mobal').trigger('bcadjustMobal.show',[lpData,echartsDrawGTT]);
  78 + });
  79 +});
  80 +/** 监听班次调整事件.(取消) **/
  81 +$('#bcAdjustListCancel').on('click',function() {
  82 + $('.bc-adjust-list').addClass('hidden');
  83 + $('#bcAdjustList').empty();
  84 + echartsDrawGTT.refreshDrag();
  85 + layer.msg('已经退出班次调整!');
  86 +});
  87 +/** 监听班次调整事件.(提交) **/
  88 +$('#bcAdjustListSubmit').on('click',function() {
  89 + var bcAdjustList = $('#bcAdjustList').val(),
  90 + lpName = $('.bc-adjust-list #bcAdjustName').val(),
  91 + lpDataCount = echartsDrawGTT.getLpDataCount();
  92 + if(lpName){
  93 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  94 + historyData = echartsDrawGTT.getHistoryData(),
  95 + data = $.extend(true, [], data, historyData[_keyIndex]);
  96 + for(var i=0,len1 = bcAdjustList.length; i<len1; i++){
  97 + data[bcAdjustList[i]].value[0] = lpName;
  98 + data[bcAdjustList[i]].value[4] = lpDataCount[lpName][2];
  99 + }
  100 + echartsDrawGTT.init(data,false,true);
  101 + echartsDrawGTT.refreshDrag();
  102 + } else
  103 + layer.msg('没有找到目标路牌,请重新选择!');
  104 + $('.bc-adjust-list').addClass('hidden');
  105 + $('#bcAdjustList').empty();
  106 + echartsDrawGTT.refreshDrag();
  107 + layer.msg('已经退出班次调整!');
  108 +
  109 +});
  110 +
  111 +/* 右击菜单事件
  112 +* 1.修改 update
  113 +* 2.删除 delete
  114 +* 3.设为上行 setUp
  115 +* 4.设为下行 setDown
  116 +* 5.设为正常 setNormal
  117 +* 6.设为区间 setRegion
  118 +* 7.设为分班 setFb
  119 +* 8.取消分班 setNofb
  120 +* 9.设为直放 setVenting
  121 +* 10.设为放站 setMajor
  122 +* */
  123 +// 修改
  124 +function dropdownMenuUpdate(dataIndex) {
  125 + $.get('/pages/base/timesmodel/fragments/editbc.html', function(m){
  126 + $(pjaxContainer).append(m);
  127 + // 显示修改班次片段.
  128 + $('#editBc_mobal').trigger('editBcMobal.show',[dataIndex,echartsDrawGTT]);
  129 + });
  130 +}
  131 +// 删除
  132 +function dropdownMenuDelete(dataIndex) {
  133 + // 获取当前操作步数
  134 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  135 + historyData = echartsDrawGTT.getHistoryData(),
  136 + data = $.extend(true, [], data, historyData[_keyIndex]),
  137 + bc = data[dataIndex],
  138 + type = bc.value[6];
  139 + if(!isType(data[dataIndex].value[6],'删除')) {
  140 + layer.confirm('您确定要删除【路牌'+ bc.value[0] +'-->发车序号'+ bc.value[7] +'】当前班次嘛!'+
  141 + '</br>【注意】:如需要撤销当前操作,您可以在系统工具下拉选择点击【撤销按钮】进行恢复.', {
  142 + btn : [ '确认提示并提交', '取消' ]
  143 + }, function() {
  144 + // 关闭弹出层.
  145 + layer.closeAll();
  146 + data.splice(dataIndex,1);
  147 + echartsDrawGTT.init(data,false,true);
  148 + echartsDrawGTT.refreshDrag();
  149 + layer.msg('删除成功!');
  150 + });
  151 + }
  152 +}
  153 +// 切换上下行
  154 +function dropdownMenuSwitchUpDown(dataIndex) {
  155 + // 获取当前操作步数
  156 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  157 + historyData = echartsDrawGTT.getHistoryData(),
  158 + data = $.extend(true, [], data, historyData[_keyIndex]);
  159 + var dir = data[dataIndex].value[8] == 1 ? 0:1;
  160 + data[dataIndex].value[8] = dir;
  161 + data[dataIndex].itemStyle.normal.color = dir==0?"#ff2949":"#518fe3";
  162 + // 起终点互换
  163 + var station = data[dataIndex].value[13];
  164 + data[dataIndex].value[13] = data[dataIndex].value[14];
  165 + data[dataIndex].value[14] = station;
  166 + var dataMap;
  167 + if(data[dataIndex].value[6] == 'in' || data[dataIndex].value[6] == 'out') {
  168 + dataMap = parameters.getDataMap();
  169 + if(data[dataIndex].value[6] == 'out' && dir == 0)
  170 + data[dataIndex].value[3] = parseInt(dataMap.map.upOutTimer)*60000;
  171 + else if(data[dataIndex].value[6] == 'out' && dir == 1)
  172 + data[dataIndex].value[3] = parseInt(dataMap.map.downOutTimer)*60000;
  173 + else if(data[dataIndex].value[6] == 'in' && dir == 0)
  174 + data[dataIndex].value[3] = parseInt(dataMap.map.upInTimer)*60000;
  175 + else if(data[dataIndex].value[6] == 'in' && dir == 1)
  176 + data[dataIndex].value[3] = parseInt(dataMap.map.downInTimer)*60000;
  177 + data[dataIndex].value[2] = data[dataIndex].value[1] + data[dataIndex].value[3];
  178 + }
  179 + echartsDrawGTT.init(data,false,true);
  180 + echartsDrawGTT.refreshDrag();
  181 + layer.msg('设置为上行成功!');
  182 +}
  183 +// 路牌切换上下行
  184 +function dropdownMenuLpSwitchUpDown(dataIndex) {
  185 + // 获取当前操作步数
  186 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  187 + historyData = echartsDrawGTT.getHistoryData(),
  188 + data = $.extend(true, [], data, historyData[_keyIndex]);
  189 + var dataMap = parameters.getDataMap();
  190 + for(var i=0,len=data.length; i<len; i++){
  191 + if(data[dataIndex].value[0] == data[i].value[0]) {
  192 + var dir = (data[i].value[8] == 1 ? 0:1);
  193 + data[i].value[8] = dir;
  194 + data[i].itemStyle.normal.color = dir==0?"#ff2949":"#518fe3";
  195 + // 起终点互换
  196 + var station = data[i].value[13];
  197 + data[i].value[13] = data[i].value[14];
  198 + data[i].value[14] = station;
  199 + if(data[i].value[6] == 'in' || data[i].value[6] == 'out') {
  200 + if(data[i].value[6] == 'out' && dir == 0)
  201 + data[i].value[3] = parseInt(dataMap.map.upOutTimer)*60000;
  202 + else if(data[i].value[6] == 'out' && dir == 1)
  203 + data[i].value[3] = parseInt(dataMap.map.downOutTimer)*60000;
  204 + else if(data[i].value[6] == 'in' && dir == 0)
  205 + data[i].value[3] = parseInt(dataMap.map.upInTimer)*60000;
  206 + else if(data[i].value[6] == 'in' && dir == 1)
  207 + data[i].value[3] = parseInt(dataMap.map.downInTimer)*60000;
  208 + data[i].value[2] = data[i].value[1] + data[i].value[3];
  209 + }
  210 + }
  211 + }
  212 + echartsDrawGTT.init(data,false,true);
  213 + echartsDrawGTT.refreshDrag();
  214 + layer.msg('路牌切换上下行成功!');
  215 +}
  216 +// 设为正常
  217 +function dropdownMenuSetNormal(dataIndex) {
  218 + // 获取当前操作步数
  219 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  220 + historyData = echartsDrawGTT.getHistoryData(),
  221 + data = $.extend(true, [], data, historyData[_keyIndex]);
  222 +
  223 + if(!isType(data[dataIndex].value[6],'设置为正常班次','normal','正常班次')) {
  224 + data[dataIndex].value[6] = 'normal';
  225 + historyData.push(data);
  226 + echartsDrawGTT.set_keyIndex(++_keyIndex);
  227 + echartsDrawGTT.setHistoryData(historyData);
  228 + echartsDrawGTT.refreshDrag();
  229 + echartsDrawGTT.refreshUpDownData();
  230 + layer.msg('设置为正常成功!');
  231 + }
  232 +}
  233 +// 设为区间
  234 +function dropdownMenuSetRegion(dataIndex) {
  235 + // 获取当前操作步数
  236 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  237 + historyData = echartsDrawGTT.getHistoryData(),
  238 + data = $.extend(true, [], data, historyData[_keyIndex]);
  239 + if(!isType(data[dataIndex].value[6],'设置为区间班次','region','区间班次')) {
  240 + data[dataIndex].value[6] = 'region';
  241 + historyData.push(data);
  242 + echartsDrawGTT.set_keyIndex(++_keyIndex);
  243 + echartsDrawGTT.setHistoryData(historyData);
  244 + echartsDrawGTT.refreshDrag();
  245 + echartsDrawGTT.refreshUpDownData();
  246 + layer.msg('设置为区间成功!');
  247 + }
  248 +}
  249 +// 设为分班
  250 +function dropdownMenuSetFb(dataIndex) {
  251 + // 获取当前操作步数
  252 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  253 + historyData = echartsDrawGTT.getHistoryData(),
  254 + data = $.extend(true, [], data, historyData[_keyIndex]);
  255 + if(!isType(data[dataIndex].value[6],'设置为分班班次') && !isType(data[dataIndex].value[16],'设置为分班班次',1,'分班班次')) {
  256 + data[dataIndex].value[16] = 1;
  257 + historyData.push(data);
  258 + echartsDrawGTT.set_keyIndex(++_keyIndex);
  259 + echartsDrawGTT.setHistoryData(historyData);
  260 + echartsDrawGTT.refreshDrag();
  261 + echartsDrawGTT.refreshUpDownData();
  262 + layer.msg('设置为分班成功!');
  263 + }
  264 +}
  265 +// 取消分班
  266 +function dropdownMenuSetNoFb(dataIndex) {
  267 + // 获取当前操作步数
  268 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  269 + historyData = echartsDrawGTT.getHistoryData(),
  270 + data = $.extend(true, [], data, historyData[_keyIndex]);
  271 + if(!isType(data[dataIndex].value[16],0,'不是分班班次')) {
  272 + data[dataIndex].value[16] = 0;
  273 + historyData.push(data);
  274 + echartsDrawGTT.set_keyIndex(++_keyIndex);
  275 + echartsDrawGTT.setHistoryData(historyData);
  276 + echartsDrawGTT.refreshDrag();
  277 + echartsDrawGTT.refreshUpDownData();
  278 + layer.msg('取消分班成功!');
  279 + }
  280 +}
  281 +// 设为直放
  282 +function dropdownMenuSetVenting(dataIndex) {
  283 + // 获取当前操作步数
  284 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  285 + historyData = echartsDrawGTT.getHistoryData(),
  286 + data = $.extend(true, [], data, historyData[_keyIndex]);
  287 + if(!isType(data[dataIndex].value[6],'设置为直放班次','venting','直放班次')) {
  288 + data[dataIndex].value[6] = 'venting';
  289 + historyData.push(data);
  290 + echartsDrawGTT.set_keyIndex(++_keyIndex);
  291 + echartsDrawGTT.setHistoryData(historyData);
  292 + echartsDrawGTT.refreshDrag();
  293 + echartsDrawGTT.refreshUpDownData();
  294 + layer.msg('设置为直放成功!');
  295 + }
  296 +}
  297 +// 设为放站
  298 +function dropdownMenuSetMajor(dataIndex) {
  299 + // 获取当前操作步数
  300 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  301 + historyData = echartsDrawGTT.getHistoryData(),
  302 + data = $.extend(true, [], data, historyData[_keyIndex]);
  303 + if(!isType(data[dataIndex].value[6],'设置为放站班次','major','放站班次')){
  304 + data[dataIndex].value[6] = 'major' ;
  305 + historyData.push(data);
  306 + echartsDrawGTT.set_keyIndex(++_keyIndex);
  307 + echartsDrawGTT.setHistoryData(historyData);
  308 + echartsDrawGTT.refreshDrag();
  309 + echartsDrawGTT.refreshUpDownData();
  310 + layer.msg('设置为放站成功!');
  311 + }
  312 +}
  313 +
  314 +function isType(bcType,msg,inType,opr) {
  315 + var tag = false ;
  316 + layer.closeAll();
  317 + if(bcType=='bd') {
  318 + layer.msg('当前选择的班次是【早例保时间】不能'+ msg +'!');
  319 + tag = true;
  320 + }else if(bcType=='cf') {
  321 + layer.msg('当前选择的班次是【吃饭时间】不能'+ msg +'!');
  322 + tag = true;
  323 + }else if(bcType=='in') {
  324 + layer.msg('当前选择的班次是【进场班次】不能'+ msg +'!');
  325 + tag = true;
  326 + }else if(bcType=='lc') {
  327 + layer.msg('当前选择的班次是【晚例保时间】不能'+ msg +'!');
  328 + tag = true;
  329 + }else if(bcType=='out') {
  330 + layer.msg('当前选择的班次是【出场班次】不能'+ msg +'!');
  331 + tag = true;
  332 + }else if(bcType==inType) {
  333 + layer.msg('当前选择的班次是【'+ opr +'】不能重复设置!');
  334 + tag = true;
  335 + }
  336 + return tag;
  337 +}
  338 +
  339 +/**
  340 + * @description : (TODO) 监听统计数据事件.
  341 + *
  342 + * @status OK.
  343 + ************************************************************************************************************************************************/
  344 +$('.countAdd').on('click',function() {
  345 + var _keyIndex = echartsDrawGTT.get_keyIndex(),
  346 + historyData = echartsDrawGTT.getHistoryData(),
  347 + // list = $.extend(true, [], list, historyData[_keyIndex]);
  348 + list = historyData[_keyIndex],
  349 + dataMap = parameters.getDataMap();
  350 + var countBc = 0,// 总班次
  351 + serviceBc = 0,// 营运班次
  352 + jcbc = 0, // 进场总班次.
  353 + ccbc = 0, // 出场总班次.
  354 + cfbc = 0,// 吃饭总班次.
  355 + zwlbbc = 0,// 早晚例保总班次.
  356 + countGs = 0.0,// 总工时
  357 + servicesj = 0,// 营运班次总时间
  358 + jcsj = 0.0,// 进场总时间.
  359 + ccsj = 0.0, // 出场总时间.
  360 + cfsj = 0.0, // 吃饭总时间.
  361 + zwlbsj = 0.0, // 早晚例保总时间.
  362 + ksBc = 0,// 空驶班次
  363 + serviceLc = 0.0 ,// 营运里程
  364 + ksLc = 0.0 ,// 空驶里程
  365 + avgTzjx = 0.0,// 平均停站间隙
  366 + gfServiceBc = 0,// 高峰营运班次
  367 + dgServiceBc = 0,// 低谷营运班次
  368 + gfAvgTzjx = 0.0,// 高峰平均停站间隙
  369 + dgAvgTzjx = 0.0;// 低谷平均停站间隙
  370 + for(var i = 0;i<list.length;i++) {
  371 + var bcObj = list[i].value;
  372 + if(bcObj[3]>0) {
  373 + countBc = countBc + 1;
  374 + countGs = countGs + bcObj[15] + bcObj[3]/60000;
  375 + var nowDate = new Date(bcObj[1]);
  376 + if((BaseFun.isgfsjd(dataMap.zgfsjd[0].st,dataMap.zgfsjd[0].ed,nowDate) ||
  377 + BaseFun.isgfsjd(dataMap.wgfsjd[0].st,dataMap.wgfsjd[0].ed,nowDate)) &&
  378 + (bcObj[6] == dataMap.bcTypeArr.normal ||
  379 + bcObj[6] == dataMap.bcTypeArr.region ||
  380 + bcObj[6] == dataMap.bcTypeArr.major)) {
  381 + gfServiceBc = gfServiceBc + 1;
  382 + gfAvgTzjx = gfAvgTzjx + bcObj[15];
  383 + } else if((!BaseFun.isgfsjd(dataMap.zgfsjd[0].st,dataMap.zgfsjd[0].ed,nowDate) &&
  384 + !BaseFun.isgfsjd(dataMap.wgfsjd[0].st,dataMap.wgfsjd[0].ed,nowDate)) &&
  385 + (bcObj[6] == dataMap.bcTypeArr.normal ||
  386 + bcObj[6] == dataMap.bcTypeArr.region ||
  387 + bcObj[6] == dataMap.bcTypeArr.major)){
  388 + dgServiceBc = dgServiceBc + 1;
  389 + dgAvgTzjx = dgAvgTzjx + bcObj[15];
  390 + }
  391 + if(bcObj[6] == dataMap.bcTypeArr.normal ||
  392 + bcObj[6] == dataMap.bcTypeArr.region ||
  393 + bcObj[6] == dataMap.bcTypeArr.major) {
  394 + serviceBc = serviceBc + 1;
  395 + serviceLc = serviceLc + bcObj[9];
  396 + servicesj = servicesj + bcObj[3]/60000;
  397 + avgTzjx = avgTzjx + bcObj[15];
  398 + }else if(bcObj[6] == dataMap.bcTypeArr.venting) {
  399 + ksBc = ksBc +1;
  400 + ksLc = ksLc + bcObj[9];
  401 + }else if(bcObj[6] == dataMap.bcTypeArr.in_) {
  402 + jcbc = jcbc +1;
  403 + jcsj = jcsj + bcObj[3]/60000;
  404 + }else if(bcObj[6] == dataMap.bcTypeArr.out) {
  405 + ccbc = ccbc +1;
  406 + ccsj = ccsj + bcObj[3]/60000;
  407 + }else if(bcObj[6] == dataMap.bcTypeArr.cf) {
  408 + cfbc = cfbc +1;
  409 + cfsj = cfsj + bcObj[3]/60000;
  410 + }else if(bcObj[6] == dataMap.bcTypeArr.bd ||
  411 + bcObj[6] == dataMap.bcTypeArr.lc ) {
  412 + zwlbbc = zwlbbc +1;
  413 + zwlbsj = zwlbsj + bcObj[3]/60000;
  414 + }
  415 + }
  416 + }
  417 + dgAvgTzjx = dgAvgTzjx/dgServiceBc;
  418 + gfAvgTzjx = gfAvgTzjx/gfServiceBc;
  419 + avgTzjx = avgTzjx/dgServiceBc;
  420 + var countDate = [{'name':'总班次(包括进出场、吃饭时间、早晚例保、营运且班次时间大于零的班次)','value':countBc},
  421 + {'name':'进场总班次(包括进场且班次时间大于零的班次)','value':jcbc},
  422 + {'name':'出场总班次(包括进场且班次时间大于零的班次)','value':ccbc},
  423 + {'name':'吃饭总班次(包括吃饭且班次时间大于零的班次)','value':cfbc},
  424 + {'name':'早晚例保总班次(包括早晚例保且时间大于零的班次)','value':zwlbbc},
  425 + {'name':'营运总班次(包括正常、区间、放大站且班次时间大于零班次)','value':serviceBc},
  426 + {'name':'进场总时间(包括进场班次且班次时间大于零)','value':parseFloat((jcsj/60).toFixed(2)) + ' 小时'},
  427 + {'name':'出场总时间(包括进场班次且班次时间大于零)','value':parseFloat((ccsj/60).toFixed(2)) + ' 小时'},
  428 + {'name':'吃饭总时间(包括吃饭班次且班次时间大于零)','value':parseFloat((cfsj/60).toFixed(2)) + ' 小时'},
  429 + {'name':'早晚例保总时间(包括早晚例保班次且时间大于零的)','value':parseFloat((zwlbsj/60).toFixed(2)) + ' 小时'},
  430 + {'name':'营运班次总时间(包括正常、区间、放大站且班次时间大于零)','value':parseFloat((servicesj/60).toFixed(2)) + ' 小时'},
  431 + {'name':'总工时(包括进出场、吃饭时间、早晚例保、营运班次时间)','value': parseFloat((countGs/60).toFixed(2)) + ' 小时'},
  432 + {'name':'空驶班次(包括直放班次)','value':ksBc},
  433 + {'name':'营运里程(包括正常、区间、放大站里程)','value':Number(serviceLc).toFixed(3) + ' 公里'},
  434 + {'name':'空驶里程(包括直放里程)','value':ksLc + ' 公里'},
  435 + {'name':'平均停站时间(营运班次停站时间总和/营运总班次)','value':parseInt(avgTzjx) + ' 分钟' },
  436 + {'name':'高峰营运班次(包括早晚高峰时段的正常、区间、放大站班次)','value':gfServiceBc},
  437 + {'name':'低谷营运班次(包括低谷时段的正常、区间、放大站班次)','value':dgServiceBc},
  438 + {'name':'高峰平均停站间隙(高峰营运班次停站时间总和/高峰营运班次总和)','value':parseInt(gfAvgTzjx) + ' 分钟'},
  439 + {'name':'低谷平均停站间隙(低谷营运班次停站时间总和/低谷营运班次总和)','value':parseInt(dgAvgTzjx) + ' 分钟'},
  440 + {'name':'综合评估','value':3}];
  441 + // 弹出层mobal页面
  442 + $.get('/pages/base/timesmodel/countadd.html', function(m){
  443 + $(pjaxContainer).append(m);
  444 + // 规定被选元素要触发的事件。可以使自定义事件(使用 bind() 函数来附加),或者任何标准事件。
  445 + $('#countadd_mobal').trigger('countAddMobal.show',[countDate]);
  446 + });
  447 +});
  448 +
  449 +/**
  450 + * @description : (TODO) 重新生成事件.
  451 + *
  452 + * @status OK.
  453 + ************************************************************************************************************************************************/
  454 +$('.parambtn').on('click', function() {
  455 + // 弹出层mobal页面
  456 + $.get('/pages/base/timesmodel/paramadd.html', function(m){
  457 + $(pjaxContainer).append(m);
  458 + // 规定被选元素要触发的事件。可以使自定义事件(使用 bind() 函数来附加),或者任何标准事件。
  459 + $('#paramadd_mobal').trigger('paramAddMobal.show', Main_v2);
  460 + });
  461 +});
0 462 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/tagsinput.js
... ... @@ -42,8 +42,8 @@ var ComponentsBootstrapTagsinput = function() {
42 42 var bctypeValue = $('#state_tagsinput_bctype').val();
43 43 var rcnum = $('#state_tagsinput_rcsvalue').val();
44 44 var clnum = $('#state_tagsinput_clsvalue').val();
45   - var gsvag = $('#state_tagsinput_gsavgvalue').val();
46   - if(isNull(bctypeValue,rcnum,clnum,gsvag)) {
  45 + // var gsvag = $('#state_tagsinput_gsavgvalue').val();
  46 + if(isNull(bctypeValue,rcnum,clnum)) {
47 47 if(!Number.isInteger(parseInt(rcnum)/parseInt(clnum))) {
48 48 layer.msg('当前算法只支持【单/双挡】!请您重新输入!');
49 49 $('#state_tagsinput_bctype').val(null);
... ... @@ -57,24 +57,40 @@ var ComponentsBootstrapTagsinput = function() {
57 57 if(s1a[0]==bctypeValue) {
58 58 rcnum = parseInt(rcnum) + parseInt(s1a[1]);
59 59 clnum = parseInt(clnum) + parseInt(s1a[2]);
60   - gsvag = parseInt(s1a[3]);
  60 + // gsvag = parseInt(s1a[3]);
61 61 }
62 62 }
63 63 elt.tagsinput('add', {
64   - "value": bctypeValue + '/' + rcnum + '/' + clnum + '/' + gsvag,
65   - "text": bctypeValue + '/' + rcnum + '/' + clnum + '/' + gsvag,
66   - "continent": bctypeValue,
  64 + // "value": bctypeValue + '/' + rcnum + '/' + clnum + '/' + gsvag,
  65 + // "text": bctypeValue + '/' + rcnum + '/' + clnum + '/' + gsvag,
  66 + "value": bctypeValue + '/' + rcnum + '/' + clnum,
  67 + "text": bctypeValue + '/' + rcnum + '/' + clnum,
  68 + "continent": bctypeValue
67 69 });
68 70 $('#state_tagsinput_bctype').val(null);
69 71 $('#state_tagsinput_rcsvalue').val(null);
70 72 $('#state_tagsinput_clsvalue').val(null);
71   - $('#state_tagsinput_gsavgvalue').val(null);
72   - }
  73 + // $('#state_tagsinput_gsavgvalue').val(null);
  74 + setTimeout(function () {
  75 + var bxrc = $('#state_tagsinput').val();
  76 + // 判断.
  77 + if(bxrc=='' || bxrc==null)
  78 + return false;
  79 + var bxrcAr = bxrc.split(','),pczs = 0;
  80 + for(var s = 0 ; s< bxrcAr.length;s++) {
  81 + // 切割单个班型人次.
  82 + pczs = pczs + parseInt(bxrcAr[s].split('/')[2]);
  83 + }
  84 + $('#clzsInput').val(pczs);
  85 + },500);
  86 + } else {
  87 + layer.msg('请输入完整参数!');
  88 + }
73 89 });
74 90  
75   - var isNull = function(v1,v2,v3,v4) {
  91 + var isNull = function(v1,v2,v3) {
76 92 var tag = true;
77   - if(v1==''|| v2=='' || v3=='' || v4=='')
  93 + if(v1==''|| v2=='' || v3=='')
78 94 tag = false;
79 95 return tag;
80 96 }
... ...
src/main/resources/static/pages/base/timesmodel/js/v1/AdjustTrip.js 0 → 100644
  1 +/**
  2 + * 平衡车距策略
  3 + * 调整策略如下(有点像滤波器):
  4 + * 1、从头开始,连续取3个班次,获取2个间隔,根据间隔的不同及其他规则,调整中间班次的发车时间
  5 + * 2、基本调整如下,
  6 + * (1)、如果2个间隔时间差1分钟,不调整
  7 + * (2)、如果第一个间隔在区间间隔范围外,调整发车时间1分钟到指定的边界
  8 + * (3)、如果第一个间隔大,调整中间班次发车时间-1分钟,如果调整后的间隔在区间间隔范围外,不调整
  9 + * (4)、如果第二个间隔大,调整中间班次发车时间+1分钟,如果调整后的间隔在区间间隔范围外,不调整
  10 + * 3、如果可调整,但是相关的停站时间无法满足,不调整
  11 + *
  12 + * 以1分钟调整,不停的迭代上述步骤
  13 + *
  14 + * 4、如果还有没有满足要求的班次,此时需要智能修改分班路牌头尾班次,删除,或这加入,然后再次迭代
  15 + */
  16 +var AdjustTrip = function () {
  17 + var departureClearanceAdjust = function (bcList, dataMap) {
  18 + var upBc = new Array(), downBc = new Array();
  19 + // 取出上下行班次,并按发车时间排序
  20 + $.each(bcList, function () {
  21 + if(this.bcType == "normal"){
  22 + if(this.xlDir == "relationshipGraph-up")
  23 + upBc.push(this);
  24 + if(this.xlDir == "relationshipGraph-down")
  25 + downBc.push(this);
  26 + }
  27 + });
  28 + // upBc.sort(function(a,b){return a.fcint-b.fcint});
  29 + // downBc.sort(function(a,b){return a.fcint-b.fcint});
  30 + calculate(upBc, bcList, dataMap, 11);
  31 + calculate(downBc, bcList, dataMap, 11);
  32 + };
  33 +
  34 + var iBcCountOfGroup = 3; // 3个班次一次参与计算
  35 + var dirBcOfGroup = [];
  36 + var dirBcIntervalOfGroup = []; // 班次间隔列表,3个班次,2个间隔
  37 + var oBcFcTime; // 班次发车时间
  38 + /**
  39 + * 平衡车距内部方法。
  40 + * @param dirBc {array} 单方向班次列表
  41 + * @param bcList {array} 所有班次列表对象
  42 + * @param dataMap {array} 参数对象
  43 + * @param iFre {int} 递归次数
  44 + * @private
  45 + */
  46 + var calculate = function (dirBc, bcList, dataMap, iFre) {
  47 + if(iFre > 0){
  48 + // 升序排序
  49 + dirBc.sort(function(a,b){return a.fcint-b.fcint});
  50 +
  51 + for (var i = 0; i <= dirBc.length; i++) {
  52 + // 获取班次列表
  53 + _calcuBcGroup(i, dirBc);
  54 +
  55 + if (dirBcOfGroup.length > 0) {
  56 + // 获取中间预调整的班次时间
  57 + oBcFcTime = dirBcOfGroup[1].fcint;
  58 + // 获取发车间隙:用发车时间判断
  59 + var fcjx = dataMap.fcjx[judgmentTimeQuantum(oBcFcTime)];
  60 + // 发车时间所在时间段
  61 + // var timeQuantum = judgmentTimeQuantum(oBcFcTime);
  62 + if (dirBcIntervalOfGroup[0] < fcjx.min) {
  63 + // 发车间隙调整为高峰发车间隙 +时间
  64 + if (_isModifyBcFcsj(
  65 + bcList,
  66 + dirBcOfGroup[1],
  67 + dataMap,
  68 + 1
  69 + )) {
  70 + _modifyFcsj(
  71 + bcList,
  72 + dirBcOfGroup[1],
  73 + dataMap,
  74 + 1
  75 + );
  76 + }
  77 + } else if (dirBcIntervalOfGroup[0] > fcjx.max) {
  78 + // 发车间隙调整为高峰发车间隙 -时间
  79 + if (_isModifyBcFcsj(
  80 + bcList,
  81 + dirBcOfGroup[1],
  82 + dataMap,
  83 + -1
  84 + )) {
  85 + _modifyFcsj(
  86 + bcList,
  87 + dirBcOfGroup[1],
  88 + dataMap,
  89 + -1
  90 + );
  91 + }
  92 + } else {
  93 + // -1或+1分钟
  94 + if (Math.abs(dirBcIntervalOfGroup[0] - dirBcIntervalOfGroup[1]) <= 1) {
  95 + // 两个间隔相差1分钟,不处理
  96 + } else if (dirBcIntervalOfGroup[0] > dirBcIntervalOfGroup[1]) {
  97 + if (_isModifyBcFcsj(
  98 + bcList,
  99 + dirBcOfGroup[1],
  100 + dataMap,
  101 + -1
  102 + )) {
  103 + _modifyFcsj(
  104 + bcList,
  105 + dirBcOfGroup[1],
  106 + dataMap,
  107 + -1
  108 + );
  109 + }
  110 + } else {
  111 + if (_isModifyBcFcsj(
  112 + bcList,
  113 + dirBcOfGroup[1],
  114 + dataMap,
  115 + 1
  116 + )) {
  117 + _modifyFcsj(
  118 + bcList,
  119 + dirBcOfGroup[1],
  120 + dataMap,
  121 + 1
  122 + );
  123 + }
  124 + }
  125 + }
  126 + }
  127 + }
  128 + // bcFun.deleteNotInRangeBc(dirBc, dataMap.smbcsjArr[].kssj, dataMap.smbcsjArr[].jssj);
  129 + // 递归迭代
  130 + calculate(dirBc, bcList, dataMap, iFre - 1);
  131 + }
  132 + };
  133 + /**
  134 + * 按照规则计算班次列表。
  135 + * @param iStartIndex {int} 开始索引
  136 + * @param dirBc {array} 班次列表
  137 + * @private
  138 + */
  139 + var _calcuBcGroup = function(iStartIndex, dirBc) {
  140 + dirBcOfGroup = [];
  141 + dirBcIntervalOfGroup = [];
  142 + for (var i = iStartIndex; i < iStartIndex + iBcCountOfGroup && iStartIndex < dirBc.length - 2; i++) {
  143 + dirBcOfGroup.push(dirBc[i]);
  144 + }
  145 + for (var j = 0; j < dirBcOfGroup.length - 1; j++) {
  146 + dirBcIntervalOfGroup.push((DateTimeTool.getDateTime(dirBcOfGroup[j + 1].fcsj).getTime() - DateTimeTool.getDateTime(dirBcOfGroup[j].fcsj).getTime())/60000);
  147 + // dirBcIntervalOfGroup.push(Math.round((dirBcOfGroup[j + 1].fcint - dirBcOfGroup[j].fcint)/360000));
  148 + }
  149 + };
  150 +
  151 + /**
  152 + * 是否可以调整班次发车时间。
  153 + * @param bcList {InternalLpObj} 所有班次对象
  154 + * @param oBc {InternalBcObj} 调整班次对象
  155 + * @param iStep {int} 修正时间步长
  156 + * @private
  157 + */
  158 + function _isModifyBcFcsj(bcList, oBc, dataMap, iStep) {
  159 + // 获取前后班次
  160 + var bc = getLpPrevAndNextBc(bcList, oBc),
  161 + prevBc = bc[0],
  162 + nextBc = bc[1];
  163 + if (prevBc != null && nextBc != null){
  164 + if (prevBc.bcType == 'cf') { // 如果是吃饭班次,不能修改发车时间
  165 + return false;
  166 + }
  167 + // 上一个班次的停站范围, 本班次停站范围, 上一班次停站时间, 本班次停站时间
  168 + var prevStopTimeScope = dataMap.tzsj[bcFun.upDownStrConvertNum(prevBc.xlDir)][judgmentTimeQuantum(prevBc.fcint)],
  169 + StopTimeScope = dataMap.tzsj[bcFun.upDownStrConvertNum(oBc.xlDir)][judgmentTimeQuantum(oBc.fcint)],
  170 + // prevBcStopTime = prevBc.STOPTIME + iStep,
  171 + // BcStopTime = oBc.STOPTIME + iStep;
  172 + // iStep为班次往后移动的时间,调整后的时间 = 停站 - 往后移动的时间
  173 + prevBcStopTime = (DateTimeTool.getDateTime(oBc.fcsj) - DateTimeTool.getDateTime(prevBc.ARRIVALTIME))/60000 + iStep,
  174 + BcStopTime = (DateTimeTool.getDateTime(nextBc.fcsj) - DateTimeTool.getDateTime(oBc.ARRIVALTIME))/60000 - iStep;
  175 + // 班次移动调整发车间隔时,需要考录的移动班次的前后停站
  176 + if (prevBcStopTime >= 0 && BcStopTime >= 0) {
  177 + return true;
  178 + } else {
  179 + return false;
  180 + }
  181 + } else if(prevBc == null && nextBc != null) {
  182 + var StopTimeScope = dataMap.tzsj[bcFun.upDownStrConvertNum(nextBc.xlDir)][judgmentTimeQuantum(nextBc.fcint)],
  183 + BcStopTime = (DateTimeTool.getDateTime(nextBc.fcsj) - DateTimeTool.getDateTime(oBc.ARRIVALTIME))/60000 - iStep;
  184 + // 班次移动调整发车间隔时,需要考录的移动班次的前后停站 TODO:没有判定调整发车时间后会不会不够
  185 + if (BcStopTime >= 0) {
  186 + return true;
  187 + } else {
  188 + return false;
  189 + }
  190 + // 如果是第一个班次为空
  191 + } else if(prevBc != null && nextBc == null) {
  192 + if (prevBc.bcType == 'cf') { // 如果是吃饭班次,不能修改发车时间
  193 + return false;
  194 + }
  195 + var prevStopTimeScope = dataMap.tzsj[bcFun.upDownStrConvertNum(prevBc.xlDir)][judgmentTimeQuantum(prevBc.fcint)],
  196 + prevBcStopTime = (DateTimeTool.getDateTime(oBc.fcsj) - DateTimeTool.getDateTime(prevBc.ARRIVALTIME))/60000 + iStep;
  197 + // 班次移动调整发车间隔时,需要考录的移动班次的前后停站
  198 + if (prevBcStopTime >= 0) {
  199 + return true;
  200 + } else {
  201 + return false;
  202 + }
  203 + }
  204 + }
  205 + /*function _isModifyBcFcsj(bcList, oBc, dataMap, iStep) {
  206 + // 获取前后班次
  207 + var bc = getLpPrevAndNextBc(bcList, oBc),
  208 + prevBc = bc[0],
  209 + nextBc = bc[1];
  210 + if (prevBc != null && nextBc != null){
  211 + if (prevBc.bcType == 'cf') { // 如果是吃饭班次,不能修改发车时间
  212 + return false;
  213 + }
  214 + // 上一个班次的停站范围, 本班次停站范围, 上一班次停站时间, 本班次停站时间
  215 + var prevStopTimeScope = dataMap.tzsj[bcFun.upDownStrConvertNum(prevBc.xlDir)][judgmentTimeQuantum(prevBc.fcint)],
  216 + StopTimeScope = dataMap.tzsj[bcFun.upDownStrConvertNum(oBc.xlDir)][judgmentTimeQuantum(oBc.fcint)],
  217 + // prevBcStopTime = prevBc.STOPTIME + iStep,
  218 + // BcStopTime = oBc.STOPTIME + iStep;
  219 + // iStep为班次往后移动的时间,调整后的时间 = 停站 - 往后移动的时间
  220 + prevBcStopTime = (DateTimeTool.getDateTime(oBc.fcsj) - DateTimeTool.getDateTime(prevBc.ARRIVALTIME))/60000 + iStep,
  221 + BcStopTime = (DateTimeTool.getDateTime(nextBc.fcsj) - DateTimeTool.getDateTime(oBc.ARRIVALTIME))/60000 - iStep;
  222 + // 班次移动调整发车间隔时,需要考录的移动班次的前后停站
  223 + if (prevBcStopTime >= prevStopTimeScope.min && BcStopTime >= StopTimeScope.min) {
  224 + return true;
  225 + } else {
  226 + return false;
  227 + }
  228 + } else if(prevBc == null && nextBc != null) {
  229 + var StopTimeScope = dataMap.tzsj[bcFun.upDownStrConvertNum(nextBc.xlDir)][judgmentTimeQuantum(nextBc.fcint)],
  230 + BcStopTime = (DateTimeTool.getDateTime(nextBc.fcsj) - DateTimeTool.getDateTime(oBc.ARRIVALTIME))/60000 - iStep;
  231 + // 班次移动调整发车间隔时,需要考录的移动班次的前后停站 TODO:没有判定调整发车时间后会不会不够
  232 + if (BcStopTime >= StopTimeScope.min) {
  233 + return true;
  234 + } else {
  235 + return false;
  236 + }
  237 + // 如果是第一个班次为空
  238 + } else if(prevBc != null && nextBc == null) {
  239 + if (prevBc.bcType == 'cf') { // 如果是吃饭班次,不能修改发车时间
  240 + return false;
  241 + }
  242 + var prevStopTimeScope = dataMap.tzsj[bcFun.upDownStrConvertNum(prevBc.xlDir)][judgmentTimeQuantum(prevBc.fcint)],
  243 + prevBcStopTime = (DateTimeTool.getDateTime(oBc.fcsj) - DateTimeTool.getDateTime(prevBc.ARRIVALTIME))/60000 + iStep;
  244 + // 班次移动调整发车间隔时,需要考录的移动班次的前后停站
  245 + if (prevBcStopTime >= prevStopTimeScope.min) {
  246 + return true;
  247 + } else {
  248 + return false;
  249 + }
  250 + }
  251 + }*/
  252 +
  253 + /**
  254 + * 调整发车时间(调整当前班次后,需要处理后续路牌的所有班次)。
  255 + * @param olp {InternalLpObj} 路牌对象
  256 + * @param oBc {InternalBcObj} 班次对象
  257 + * @param iMin {int} 分钟
  258 + * @param dataMap 参数对象
  259 + * @private
  260 + */
  261 + function _modifyFcsj(bcList, oBc, dataMap, iMin) {
  262 + var bc = getLpPrevAndNextBc(bcList, oBc),
  263 + prevBc = bc[0],
  264 + nextBc = bc[1];
  265 + var fcsj = DateTimeTool.getDateTime(oBc.fcsj);
  266 + fcsj.setMinutes(fcsj.getMinutes() + iMin);
  267 + $.each(bcList, function () {
  268 + if(this.lpNo == oBc.lpNo && this.fcno == oBc.fcno){
  269 + var time = new Date(fcsj);
  270 + this.ARRIVALTIME = DateTimeTool.getHHmmStr(time.setMinutes(time.getMinutes() + this.bcsj));
  271 + this.fcsj = DateTimeTool.getHHmmStr(fcsj);
  272 + this.fcint = fcsj.getTime();
  273 + // 前一个班次停站时间 = 原停站时间 - 中间班次移动时间
  274 + this.STOPTIME -= iMin;
  275 + }
  276 + if(prevBc != undefined && prevBc != null && this.lpNo == oBc.lpNo && this.fcno == prevBc.fcno){
  277 + // 前一个班次停站时间 = 原停站时间 + 中间班次移动时间
  278 + this.STOPTIME += iMin;
  279 + }
  280 + });
  281 + }
  282 + // 获取班次前后班次
  283 + var getLpPrevAndNextBc = function (bcList, oBc) {
  284 + var lpBc = new Array(),
  285 + // 前一个班次
  286 + prevBc = null, nextBc = null;
  287 + $.each(bcList, function () {
  288 + if(this.lpNo == oBc.lpNo)
  289 + lpBc.push(this);
  290 + });
  291 + lpBc.sort(function (a,b) {return a.fcint - b.fcint;});
  292 + for(var n = 0; n < lpBc.length; n++) {
  293 + if(lpBc[n].fcno == oBc.fcno && n > 0)
  294 + prevBc = lpBc[n-1];
  295 + if(lpBc[n].fcno == oBc.fcno && n < lpBc.length-1)
  296 + nextBc = lpBc[n+1];
  297 + }
  298 + return [prevBc, nextBc];
  299 + };
  300 + // 判断时间在什么时间段段内
  301 + /**
  302 + * 判断时间在什么时间段段内
  303 + * @param t 时间
  304 + * @private
  305 + */
  306 + var judgmentTimeQuantum = function (t) {
  307 + if(t <= DateTimeTool.getDateTime('6:30'))
  308 + return 0;
  309 + else if(t > DateTimeTool.getDateTime('6:30') && t <= DateTimeTool.getDateTime('8:30'))
  310 + return 1;
  311 + else if(t > DateTimeTool.getDateTime('8:30') && t <= DateTimeTool.getDateTime('16:00'))
  312 + return 2;
  313 + else if(t > DateTimeTool.getDateTime('16:00') && t <= DateTimeTool.getDateTime('18:00'))
  314 + return 3;
  315 + else if(t > DateTimeTool.getDateTime('18:00'))
  316 + return 4;
  317 + };
  318 + return {
  319 + departureClearanceAdjust : departureClearanceAdjust
  320 + }
  321 +}();
0 322 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/v1/bcFun.js 0 → 100644
  1 +/**
  2 + * 内部班次对象。
  3 + * @param lpObj 内部路牌对象
  4 + * @param groupObj 内部圈对象
  5 + * @param otherParamObj 其他参数对象
  6 + * @constructor InternalBcObj
  7 + */
  8 +var bcFun = function() {
  9 +
  10 +
  11 + /**
  12 + * @discription : (TODO) 封装班次属性值
  13 + *
  14 + * @params : [t--起始时间;bcsj--班次历时;c--lp对象属性值;type--类型]
  15 + *
  16 + * @params : [dir--方向;bcs--序号;jhlc--计划里程;gatps--表单参数对象]
  17 + *
  18 + * @params : [isfb--是否分班;qdz--起点站;zdz--终点站;isSwitchXl--是否切割线路;st--停站时间]
  19 + *
  20 + * @return : 返回班次对象属性值
  21 + *
  22 + */
  23 + var getbcObj = function(t,bcsj,c,type,dir,xh,jhlc,gatps,isfb,qdz,zdz,isSwitchXl,st,lbsj) {
  24 + var obj = {};
  25 + obj.parent = c.lpNo;
  26 + obj.lpNo = c.lpNo;
  27 + obj.lp = c.lp;
  28 + obj.lpName = c.lpName;
  29 + obj.lpType = c.lpType;
  30 + obj.bcType = type;
  31 + obj.xlDir = dir;
  32 + obj.fcno = xh;
  33 + obj.jhlc = jhlc;// 计划里程
  34 + obj.tcc = gatps.tcc_id;// 停车场id
  35 + obj.ttinfo = gatps.skbName;// 时刻表id
  36 + obj.xl = gatps.lineName.split('_')[0];// 线路id
  37 + obj.isfb = isfb;
  38 + obj.qdz = qdz;
  39 + obj.zdz = zdz;
  40 + obj.isSwitchXl = isSwitchXl;
  41 + obj.STOPTIME = st;
  42 + obj.bz = null;
  43 + var startTime = null;
  44 + if(type == 'bd' || type == 'out' || type == 'in' || type == 'lc')
  45 + startTime = new Date(t);
  46 + else
  47 + startTime = t;
  48 + if(type=='bd' || type=='lc' )
  49 + obj.bcsj = lbsj;
  50 + else
  51 + obj.bcsj = bcsj;
  52 + if(type=='bd') {
  53 + startTime = new Date(startTime.setMinutes(startTime.getMinutes()-bcsj));
  54 + obj.ARRIVALTIME = DateTimeTool.getHHmmStr(startTime);
  55 + startTime = new Date(startTime.setMinutes(startTime.getMinutes()-lbsj));
  56 + obj.fcsj = DateTimeTool.getHHmmStr(startTime);
  57 + }else if(type=='out') {
  58 + obj.ARRIVALTIME = DateTimeTool.getHHmmStr(startTime);
  59 + startTime = new Date(startTime.setMinutes(startTime.getMinutes()-bcsj));
  60 + obj.fcsj = DateTimeTool.getHHmmStr(startTime);
  61 + }else if(type =='cf') {
  62 + obj.fcsj = DateTimeTool.getHHmmStr(startTime);
  63 + startTime = new Date(startTime.setMinutes(startTime.getMinutes()+bcsj));
  64 + obj.ARRIVALTIME = DateTimeTool.getHHmmStr(startTime);
  65 + }else if(type=='lc') {
  66 + startTime = new Date(startTime.setMinutes(startTime.getMinutes()+bcsj));
  67 + obj.fcsj = DateTimeTool.getHHmmStr(startTime);
  68 + startTime = new Date(startTime.setMinutes(startTime.getMinutes()+lbsj));
  69 + obj.ARRIVALTIME = DateTimeTool.getHHmmStr(startTime);
  70 + }else if(type=='in') {
  71 + obj.fcsj = DateTimeTool.getHHmmStr(startTime);
  72 + startTime = new Date(startTime.setMinutes(startTime.getMinutes()+bcsj));
  73 + obj.ARRIVALTIME = DateTimeTool.getHHmmStr(startTime);
  74 + }else if(type=='normal') {
  75 + obj.fcsj = DateTimeTool.getHHmmStr(startTime);
  76 + startTime = new Date(startTime.setMinutes(startTime.getMinutes()+bcsj));
  77 + obj.ARRIVALTIME = DateTimeTool.getHHmmStr(startTime);
  78 + }
  79 + return obj;
  80 + };
  81 + /**
  82 + * 修正班次停车时间
  83 + * @param bcList 所有班次集合
  84 + * @param lpNo 修改班次所在路牌
  85 + * @param dataMap 参数
  86 + */
  87 + var adjustBcStopTime = function (bcList, lpNo, dataMap) {
  88 + bcList;
  89 + };
  90 +
  91 + // 上下行字符串转换数字
  92 + var upDownStrConvertNum = function (dir) {
  93 + return dir == "relationshipGraph-up" ? 0: 1;
  94 + };
  95 + /**
  96 + * @description (TODO) 剔除不在上、下行时间范围内的班次.
  97 + * @param jsonArray 初始化路牌下的所有班次并且已经均匀发车间隙的数组集合.
  98 + * @param dataMap 封装的 以上、下行方向成对存在的 一些参数数组 [下标0 -- 代表上行 ; 下标1 -- 代表下行].
  99 + */
  100 + var markFirstAndLastBusAlsoDietNotInRangeBc = function(jsonArray , dataMap) {
  101 + // 定义上、下行的正常、区间、空放、直放班次、返回数组集合.
  102 + var listMap = getUpAndDownBc( jsonArray , dataMap) , resultArray = new Array();
  103 + for(var i = 0 ; i < listMap.length ; i++) {
  104 + if(listMap[i].length > 0){
  105 + // 剔除不在时间范围内的班次
  106 + deleteNotInRangeBc(listMap[i] , dataMap.smbcsjArr[i].kssj, dataMap.smbcsjArr[i].jssj);
  107 + // 把班次顺序排序.
  108 + listMap[i].sort(function(a,b){return a.fcint-b.fcint});
  109 + }
  110 + resultArray = resultArray.concat(listMap[i]);
  111 + }
  112 + return resultArray;
  113 + };
  114 + /**
  115 + * @desription (TODO) 剔除不在时间范围内的班次.
  116 + * @param ar 某方向下的班次.
  117 + * @param 开始时间.
  118 + * @param 结束时间.
  119 + */
  120 + var deleteNotInRangeBc = function(ar , kssj , jssj) {
  121 + for(var s = 0 ; s < ar.length ; s++) {
  122 + if(isDelete(DateTimeTool.getDateTime(kssj), DateTimeTool.getDateTime(jssj), DateTimeTool.getDateTime(ar[s].fcsj))) {
  123 + ar.splice(s, 1);
  124 + s--;
  125 + }
  126 + }
  127 + };
  128 + /**
  129 + * @description (TODO) 获取 上、下行的正常、区间、空放、直放班次.
  130 + * @param 需要分割的班次数据集合.
  131 + * @param 封装的 以上、下行方向成对存在的 一些参数数组 [下标0 -- 代表上行 ; 下标1 -- 代表下行].
  132 + */
  133 + var getUpAndDownBc = function(json,dataMap) {
  134 + // 定义上行班次 、 下行班次 数组集合、返回数组集合对象.
  135 + var upArray = new Array(),downArray = new Array(),rs = new Array();
  136 + for(var j = 0 ; j< json.length ; j++) {
  137 + // 判断是否为正常、区间、空放、直放班次
  138 + if(json[j].bcType== dataMap.bcTypeArr.normal ||
  139 + json[j].bcType== dataMap.bcTypeArr.region ||
  140 + json[j].bcType== dataMap.bcTypeArr.major ||
  141 + json[j].bcType== dataMap.bcTypeArr.venting) {
  142 + if(json[j].xlDir == dataMap.dira[0])
  143 + upArray.push(json[j]);
  144 + else if(json[j].xlDir == dataMap.dira[1])
  145 + downArray.push(json[j]);
  146 + }
  147 + }
  148 + rs.push(upArray,downArray);
  149 + // 返回数据.
  150 + return rs;
  151 + };
  152 + var isDelete = function(t1,t2,t) {
  153 + var tag = false;
  154 + if(t<t1 || t>t2)
  155 + tag = true;
  156 + return tag;
  157 + };
  158 + /**
  159 + * @description (TODO) 添加进出场班次.
  160 + * @param cara 路牌
  161 + * @param rsjar 班次集合数组
  162 + * @param dataMap dataMap 封装的 以上、下行方向成对存在的 一些参数数组 [下标0 -- 代表上行 ; 下标1 -- 代表下行].
  163 + * @param map 表单参数对象.
  164 + *
  165 + */
  166 + var addInOutFieldBc = function(cara,rsjar,dataMap,map) {
  167 + var resultJA = new Array(),bcs = 0;
  168 + for(var m = 0 ; m < cara.length; m++) {
  169 + // 获取路牌编号.
  170 + var lpNo_ = cara[m].lpNo;
  171 + // 定义路牌下的所有班次.
  172 + var lpbc_ = new Array();
  173 + // 遍历班次数.
  174 + for(var x =0 ; x <rsjar.length; x++) {
  175 + // 判断当期遍历的班次是否属于当前的路牌.
  176 + if(rsjar[x].lpNo == lpNo_) {
  177 + delete rsjar[x].fcint;
  178 + lpbc_.push(rsjar[x]);
  179 + }
  180 + }
  181 + // 按照发车序号顺序排序.
  182 + lpbc_.sort(function(a,b){return a.fcno-b.fcno});
  183 + addcfbc01(lpbc_,dataMap,map);
  184 + // 按照发车序号顺序排序.
  185 + lpbc_.sort(function(a,b){return a.fcno-b.fcno});
  186 + var tt = addjclbbc01(lpbc_,dataMap,dataMap.lbsj,map);
  187 + bcs = updfcno(tt,bcs);
  188 + resultJA = resultJA.concat(tt);
  189 + }
  190 + return resultJA;
  191 + };
  192 +
  193 + var updfcno = function(bcArr,bcs) {
  194 + for(var i =0; i < bcArr.length;i++) {
  195 + bcArr[i].fcint = DateTimeTool.getDateTime(bcArr[i].fcsj).getTime();
  196 + }
  197 + bcArr.sort(function(a,b){return a.fcint-b.fcint});
  198 + for(var t = 0 ; t <bcArr.length;t++) {
  199 + bcs++;
  200 + bcArr[t].bcs = bcs;
  201 + bcArr[t].fcno = t+1;
  202 + delete bcArr[t].fcint;
  203 + }
  204 + return bcs;
  205 + };
  206 +
  207 +
  208 + /**
  209 + * @description : (TODO) 添加进出场班次、早晚例保班次.
  210 + *
  211 + * @param [bc--路牌下的所有班次;dataMap--参数信息;lbsj--例保时间]
  212 + *
  213 + */
  214 + var addjclbbc01 = function(bc,dataMap,lbsj,gatps) {
  215 + if(bc.length>0)
  216 + bc[bc.length-1].STOPTIME = 0;
  217 + var result = new Array();
  218 + var fcno = 0,dxfno = 0,stas = false;
  219 + for(var b = 0 ; b < bc.length;b++) {
  220 + var fxdm = dirDmToIndex(bc[b].xlDir);
  221 + var car = {'lp':bc[b].lp, 'lpNo':bc[b].lpNo, 'lpName':bc[b].lpName, 'lpType':bc[b].lpType };
  222 + if(b==0) {
  223 + var dqbcfcsj = DateTimeTool.getDateTime(bc[b].fcsj);
  224 + result.push(getbcObj(
  225 + dqbcfcsj,dataMap.ccsjArr[fxdm],car,dataMap.bcTypeArr.bd,
  226 + dataMap.dira[fxdm],1,0,gatps,0,null,null,null,0,lbsj));// 早行例保班次
  227 + result.push(getbcObj(
  228 + dqbcfcsj,dataMap.ccsjArr[fxdm],car,dataMap.bcTypeArr.out,
  229 + dataMap.dira[fxdm],2,dataMap.cclcArr[fxdm],gatps,0,dataMap.qdzArr[fxdm],null,null,0,0));// 出场班次
  230 + fcno ++;
  231 + }else if(b==bc.length-1){
  232 + var fcno_ = dxfno + 2;
  233 + var qdbcddsj = DateTimeTool.getDateTime(bc[b].ARRIVALTIME);
  234 + result.push(getbcObj(
  235 + qdbcddsj,dataMap.jcsjArr[fxdm],car,dataMap.bcTypeArr.in_,
  236 + dataMap.dira[fxdm],fcno_++,dataMap.jclcArr[fxdm],gatps,0,dataMap.qdzArr[fxdm],null,null,0,0));// 进场班次
  237 + result.push(getbcObj(
  238 + qdbcddsj,dataMap.jcsjArr[fxdm],car,dataMap.bcTypeArr.lc,
  239 + dataMap.dira[fxdm],fcno_++,0,gatps,0,null,null,null,0,lbsj));// 晚班例保班次
  240 + }
  241 + dxfno = bc[b].fcno + fcno;
  242 + bc[b].fcno = dxfno;
  243 + if(stas) {
  244 + fcno ++;
  245 + stas = false;
  246 + }
  247 + result.push(bc[b]);
  248 + }
  249 + return result;
  250 + };
  251 +
  252 + var addcfbc01 = function(lpbcar,dataMap,map) {
  253 + var gs = 0 ,sicftag = true;
  254 + for(var g = 0 ; g <lpbcar.length-1;g++ ) {
  255 + if( parseInt((DateTimeTool.getDateTime(lpbcar[g+1].fcsj) - DateTimeTool.getDateTime(lpbcar[g].ARRIVALTIME))/60000) > 180
  256 + && lpbcar[g].STOPTIME==0 && lpbcar[g].bcType =='normal' ) {
  257 + lpbcar[g].isfb = 1;
  258 + }
  259 + }
  260 + };
  261 + var dirDmToIndex = function (str) {
  262 + if(str == 'relationshipGraph-up')
  263 + return 0;
  264 + else if(str == 'relationshipGraph-down')
  265 + return 1;
  266 + };
  267 +
  268 + return{
  269 + getbcObj : getbcObj, //封装班次属性值
  270 + upDownStrConvertNum : upDownStrConvertNum,
  271 + deleteNotInRangeBc : deleteNotInRangeBc,
  272 + markFirstAndLastBusAlsoDietNotInRangeBc : markFirstAndLastBusAlsoDietNotInRangeBc,
  273 + getUpAndDownBc : getUpAndDownBc,
  274 + addInOutFieldBc : addInOutFieldBc, //添加进出场班次
  275 + updfcno : updfcno
  276 + }
  277 +}();
... ...
src/main/resources/static/pages/base/timesmodel/js/v1/lpFun.js 0 → 100644
  1 +var lpFun = function () {
  2 + var _bxDesc = [ // 班型描述(班型名称,平均工时,平均工时,平均需要的班次数) 186/月度当值标准天数 = 工时
  3 + {'type':'六工一休','hoursV':7.13, 'minueV':'7:08', 'qcount': 0},
  4 + {'type':'五工一休','hoursV':7.33, 'minueV':'7:20', 'qcount': 0},
  5 + {'type':'四工一休','hoursV':7.14, 'minueV':'7:08', 'qcount': 0},
  6 + {'type':'三工一休','hoursV':8.15, 'minueV':'8:09', 'qcount': 0},
  7 + {'type':'二工一休','hoursV':9.17, 'minueV':'9:10', 'qcount': 0},
  8 + {'type':'一工一休','hoursV':12.22, 'minueV':'12:13', 'qcount': 0},
  9 + {'type':'五工二休','hoursV':8.62, 'minueV':'8:37', 'qcount': 0},
  10 + {'type':'无工休', 'hoursV':5.43, 'minueV':'5:43', 'qcount': 0},
  11 + {'type':'二周三休','hoursV':7.78, 'minueV':'7:47', 'qcount': 0}
  12 + ];
  13 +
  14 + var get_bxDesc = function () {
  15 + return _bxDesc;
  16 + };
  17 +
  18 +
  19 + /**
  20 + * @description (TODO) [ 切割 班型/人次/配车数 ]参数 并封装成数组集合对象.
  21 + * @param str 切割 班型/人次/配车数 字符串.
  22 + */
  23 + var getBxRcListCollection = function(str) {
  24 + // 如果为空 , 直接return
  25 + if(str=='' || str==null)
  26 + return false;
  27 + // 定义返回数组集合.
  28 + var list = new Array();
  29 + // 获取各个班型对应的工时数组.
  30 + // var _bxDesc = get_bxDesc();
  31 + // 按多号切开.
  32 + var bxrcAr = str.split(',');
  33 + if(bxrcAr.length>0) {
  34 + for(var s = 0 ; s< bxrcAr.length;s++) {
  35 + // 按反斜杠切开.
  36 + var s1a = bxrcAr[s].split('/');
  37 + if(s1a.length >= 3) {
  38 + // 定义人数、配车数、日平均工时.
  39 + var rs = parseInt(s1a[1]),fpcls = parseInt(s1a[2]);
  40 + // 定义班型标准小时系数 、 分钟系数.
  41 + var hoursV = 0.0 , minueV = '' ;
  42 + for(var g = 0 ; g < _bxDesc.length; g++) {
  43 + // 如果班型字符串相同.
  44 + if(_bxDesc[g].type == s1a[0]) {
  45 + hoursV = _bxDesc[g].hoursV;
  46 + minueV = _bxDesc[g].minueV;
  47 + break;
  48 + }
  49 + }
  50 + if(rs == fpcls) {
  51 + // 添加到返回数组集合中.
  52 + list.push({'type' : s1a[0] , 'rs' : rs , 'fpcls' : fpcls , 'hoursV' : hoursV ,
  53 + 'minueV' : minueV ,'sslp':[]});
  54 + } else {
  55 + // 双档路牌
  56 + var sdlp = rs - fpcls;
  57 + // 添加到返回数组集合中.
  58 + list.push({'type' : s1a[0] , 'rs' : fpcls-sdlp , 'fpcls' : fpcls-sdlp , 'hoursV' : hoursV ,'minueV' : minueV,'sslp':[]},
  59 + {'type' : s1a[0]+'(双档)' , 'rs' : sdlp , 'fpcls' : sdlp , 'hoursV' : hoursV*2 , 'minueV' : DateTimeTool.calculateHours(hoursV*2),'sslp':[]});
  60 + }
  61 + }
  62 + }
  63 + }
  64 + // 返回数据.
  65 + return list.sort(function(a,b){return b.hoursV-a.hoursV});
  66 + };
  67 + /**
  68 + * @description (TODO) 把班型人次合理的分配到不同的路牌上.
  69 + * @param list 班型人次数组集合.
  70 + * @param clzs 路牌数组.
  71 + * @return 返回一个把路牌合理的分配到班型人次下组成的数据集合.
  72 + * */
  73 + var bxAlloTotLp = function(arr,clzs){
  74 + var cLen = clzs.length;
  75 + var type = getMode(arr);
  76 + var i=0;
  77 + while(clzs.length > i){
  78 + for(var j=0; j<type.length; j++) {
  79 + if(arr[type[j]].len-- > 0) {
  80 + arr[type[j]].bx.sslp.push(clzs[i]);
  81 + i++
  82 + }
  83 + }
  84 + }
  85 + };
  86 + var getMode = function(arr){
  87 + var mode = [], bxRcList = arr;
  88 + var count = bxRcList[0].lps;
  89 + for(var i=1; i<bxRcList.length; i++) {
  90 + if(bxRcList[i].lps < count)
  91 + count = bxRcList[i].lps;
  92 + }
  93 + for(var i=0; i<bxRcList.length; i++) {
  94 + bxRcList[i] = {'bx':bxRcList[i],'len':bxRcList[i].lps, 'ratio':Math.round(bxRcList[i].lps/count)}
  95 + }
  96 + for(var i=0; i<bxRcList.length; i++) {
  97 + for(var j=0; j<bxRcList[i].ratio; j++) {
  98 + mode.push(i);
  99 + }
  100 + }
  101 + // for(var m=0; m<mode.length-2; m++) {
  102 + // if(mode[m] == mode[m+1]) {
  103 + // var a = mode[m+1];
  104 + // mode[m+1] = mode[m+2];
  105 + // mode[m+2] = a;
  106 + // }
  107 + // }
  108 + return mode;
  109 + };
  110 + // 路牌整理
  111 + var lpNeaten = function (bxRcList, carList, dataMap) {
  112 + var carListH = new Array();
  113 + // 取出有工时的路牌
  114 + for (var i = 0; i < bxRcList.length; i++) {
  115 + var sslp = bxRcList[i].bx.sslp, bx = bxRcList[i].bx;
  116 + var count = Math.round(bx.hoursV / (dataMap.zzsj[1] / 60));// 早高峰周转:dataMap.zzsj[1]
  117 + $.each(sslp, function () {
  118 + this.hoursV = bx.hoursV;
  119 + this.count = count;
  120 + this.lpName = bx.type + '_' + this.lpNo;
  121 + this.isfb = false;
  122 + carListH.push(this);
  123 + });
  124 + }
  125 + carListH.sort(function (a, b) {
  126 + return a.lpNo - b.lpNo
  127 + });
  128 + return carListH;
  129 + };
  130 + // 路牌分班
  131 + var lpAddFb = function (bxRcList, carList, dataMap, map) {
  132 + // carListH:带工时和圈数的车辆list,carListCache:缓存为分班车辆
  133 + var carListH = [],carListCache = [];
  134 +
  135 + // 最少分班路牌 = 总路牌 - (低谷周转/低谷最大发车间隔)向上取整
  136 + var fblps = carList.length - Math.ceil((dataMap.zzsj[2]) / map.dgmaxfcjx);
  137 + // 取出有工时的路牌
  138 + for (var i = 0; i < bxRcList.length; i++) {
  139 + var sslp = bxRcList[i].bx.sslp, bx = bxRcList[i].bx;
  140 + var count = Math.round(bx.hoursV / (dataMap.zzsj[1]/60));// 早高峰周转:dataMap.zzsj[1]
  141 + if(bx.type == '五工二休') {
  142 + $.each(sslp, function () {
  143 + // this.wfpBC = 0;// 未分配班次 = 0
  144 + this.hoursV = bx.hoursV;
  145 + // 圈数 = 工时/高峰周转时间(H)
  146 + this.count = count;
  147 + this.lpName = bx.type+'_'+this.lpNo;
  148 + // 五休二默认分班,分班数不够,剩余的在其他路牌分班
  149 + this.isfb = true;
  150 + fblps--;// 分班数 -1
  151 + carListH.push(this);
  152 + });
  153 + } else {
  154 + $.each(sslp, function () {
  155 + this.hoursV = bx.hoursV;
  156 + this.count = count;
  157 + this.lpName = bx.type+'_'+this.lpNo;
  158 + this.isfb = false;
  159 + carListH.push(this);
  160 + });
  161 + }
  162 + }
  163 + if(fblps>0) {
  164 + // 把剩余的分班数,按比例分给剩余连班路牌
  165 + carListCache = [];
  166 + // 切割出连班路牌
  167 + cutCar(carListH,carListCache);
  168 + var index = Math.floor(carListH.length / fblps);
  169 + for(var s=1; s<=fblps; s++){
  170 + carListH[s*index].isfb = true;
  171 + }
  172 + }
  173 + carListH = carListH.concat(carListCache);
  174 + carListH.sort(function (a, b) {
  175 + return a.lpNo - b.lpNo
  176 + });
  177 + for (var i = 0; i < bxRcList.length; i++) {
  178 + bxRcList[i] = bxRcList[i].bx;
  179 + }
  180 + return carListH;
  181 + };
  182 + // 确定路牌分班数
  183 + var lpfbs = function (fblps, bxRcList, index) {
  184 + if(fblps > bxRcList[index].lps){
  185 + fblps = fblps - bxRcList[index].lps;
  186 + bxRcList[index].fblps = bxRcList[index].lps;
  187 + lpfbs(fblps, bxRcList, --index);
  188 + } else {
  189 + bxRcList[index].fblps = fblps;
  190 + }
  191 + };
  192 +
  193 + /**
  194 + * @description (TODO) 把班型人次合理的分配到不同的路牌上.
  195 + * @param list 班型人次数组集合.
  196 + * @param clzs 路牌数组.
  197 + * @return 返回一个把路牌合理的分配到班型人次下组成的数据集合.
  198 + * */
  199 + var bxAlloTotLp = function(arr,clzs){
  200 + var fblp=0,lblp=0;
  201 + for(var j=0; j<arr.length; j++) {
  202 + if(arr[j].ifsb) {
  203 + arr[type[j]].bx.sslp.push(clzs[i]);
  204 + i++
  205 + }
  206 + }
  207 + var cLen = clzs.length;
  208 + var type = getMode(arr);
  209 + var i=0;
  210 + while(clzs.length > i){
  211 + for(var j=0; j<type.length; j++) {
  212 + if(arr[type[j]].len-- > 0) {
  213 + arr[type[j]].bx.sslp.push(clzs[i]);
  214 + i++
  215 + }
  216 + }
  217 + }
  218 + };
  219 + var getMode = function(arr){
  220 + var mode = [], bxRcList = arr;
  221 + var count = bxRcList[0].fpcls;
  222 + for(var i=1; i<bxRcList.length; i++) {
  223 + if(bxRcList[i].fpcls < count)
  224 + count = bxRcList[i].fpcls;
  225 + }
  226 + for(var i=0; i<bxRcList.length; i++) {
  227 + bxRcList[i] = {'bx':bxRcList[i],'len':bxRcList[i].fpcls, 'ratio':Math.round(bxRcList[i].fpcls/count)}
  228 + }
  229 + for(var i=0; i<bxRcList.length; i++) {
  230 + for(var j=0; j<bxRcList[i].ratio; j++) {
  231 + mode.push(i);
  232 + }
  233 + }
  234 + // for(var m=0; m<mode.length-2; m++) {
  235 + // if(mode[m] == mode[m+1]) {
  236 + // var a = mode[m+1];
  237 + // mode[m+1] = mode[m+2];
  238 + // mode[m+2] = a;
  239 + // }
  240 + // }
  241 + return mode;
  242 + };
  243 + return {
  244 + getBxRcListCollection : getBxRcListCollection, // [ 切割 班型/人次/配车数 ]参数 并封装成数组集合对象.
  245 + bxAlloTotLp : bxAlloTotLp, // 把班型人次合理的分配到不同的路牌上
  246 + lpAddFb : lpAddFb, // 路牌分班
  247 + lpNeaten : lpNeaten, // 路牌整理
  248 + get_bxDesc : get_bxDesc, // 获取路牌类型
  249 + }
  250 +}();
0 251 \ No newline at end of file
... ...