Commit df042e613363f1d87fe8b2946b904620c7dba1ec

Authored by 王通
1 parent de9fff00

1.进出场班次显示RFID状态

src/main/resources/static/real_control_v2/fragments/line_schedule/sch_table.html
1 -<div>  
2 - <script id="line-schedule-table-temp" type="text/html">  
3 - <div class="schedule-wrap {{if dir==0}}up{{else}}down{{/if}}">  
4 - <h3 class="header-title">  
5 - {{if dir==0}}  
6 - {{line.startStationName}}  
7 - {{else}}  
8 - {{line.endStationName}}  
9 - {{/if}}  
10 - <i class="uk-icon-question-circle uk-icon-hover"></i>  
11 - <div class="fixed_legend">  
12 - <div>  
13 - <span class="tl-xxfc">消息发出</span>  
14 - <span class="tl-xxsd">消息收到</span>  
15 - <span class="tl-xxrd">消息阅读</span>  
16 - &nbsp;  
17 - <span class="tl-wd">误点</span>  
18 - <span class="tl-zzzx">正在执行</span>  
19 - <span class="tl-qrlb"></span>  
20 - <span class="tl-yzx">已执行</span>  
21 - <a>  
22 - <i class="uk-icon-angle-double-up fixed_legend_close"></i>  
23 - </a>  
24 - </div>  
25 - </div>  
26 - <i class="uk-icon-eye uk-icon-hover ct_eye_icon"></i>  
27 - <i class="uk-icon-qrcode uk-icon-hover ct_calu_icon" data-toggle="tooltip" data-placement="bottom" title="计算应到实到时间对比"></i>  
28 -  
29 - <!--<i class="uk-icon-share-alt uk-icon-hover tp_info_icon" ></i>-->  
30 -  
31 - <span class="warn_multi_station" data-updown="{{dir}}" data-code="{{line.lineCode}}"></span>  
32 - <div class="search_sch_panel">  
33 - <form class="uk-form" onsubmit="javascript:return false;">  
34 - <div class="uk-autocomplete sch-search-autocom">  
35 - <div class="uk-form-icon">  
36 - <i class="uk-icon-search"></i>  
37 - <input type="text" placeholder="搜索">  
38 - <i class="cancel uk-icon-times-circle" data-uk-tooltip="{pos:'right'}" title="取消过滤"></i>  
39 - </div>  
40 - </div>  
41 - </form>  
42 - </div>  
43 - </h3>  
44 - <div class="schedule-body">  
45 - <div class="ct_table_wrap">  
46 - <div class="ct_table line-schedule-table">  
47 - <div class="ct_table_head">  
48 - <dl>  
49 - <dt>序号</dt>  
50 - <dt>路牌</dt>  
51 - <dt>RFID</dt>  
52 - <dt>车辆</dt>  
53 - <dt>应到</dt>  
54 - <dt>实到</dt>  
55 - <dt sort-field>计发</dt>  
56 - <dt sort-field>待发</dt>  
57 - <dt>实发</dt>  
58 - <dt>原因</dt>  
59 - </dl>  
60 - </div>  
61 - <div class="ct_table_body">  
62 - {{each list as sch i}}  
63 - <dl data-id="{{sch.id}}">  
64 - <dd class="seq_no">{{i + 1}}</dd>  
65 - <dd class="lpName"><a>{{sch.lpName}}</a></dd>  
66 - <dd class="{{if (sch.bcType == 'in') || (sch.bcType == 'out')}}tl-white{{else if !sch.qdzArrDatesj}}tl-white{{else if (sch.rfidState & 1) == 1 && (sch.rfidState & 2) == 2}}tl-green{{else if (sch.rfidState & 1) == 1}}tl-yellow{{else}}tl-grey{{/if}}"></dd>  
67 - <dd data-nbbm="{{sch.clZbh}}"  
68 - class="{{if sch.directiveState == 60}}tl-xxfc{{else if sch.directiveState == 100}}tl-xxsd{{else if sch.directiveState == 200}}tl-xxrd{{/if}}">  
69 - {{sch.clZbh}}  
70 - </dd>  
71 - <dd>{{sch.qdzArrDatejh}}</dd>  
72 - <dd class="qdzArrDatesjDD"><span class="qdzArrDatesjSPAN">{{sch.qdzArrDatesj}}</span><span class="arrsj-diff">{{sch.arrsj_diff}}</span></dd>  
73 - <dd data-sort-val={{sch.fcsjT}}>  
74 - {{sch.fcsj}}  
75 - {{if sch.bcType == "out"}}  
76 - <span class="uk-badge uk-badge-success out">出场</span>  
77 - {{else if sch.bcType == "in"}}  
78 - <span class="uk-badge uk-badge-warning in">进场</span>  
79 - {{else if sch.bcType == "venting"}}  
80 - <span class="uk-badge uk-badge-danger">直放</span>  
81 - {{else if sch.bcType == "major"}}  
82 - <span class="uk-badge uk-badge-danger">放站</span>  
83 - {{else if sch.bcType == "region"}}  
84 - <span class="uk-badge sch_region">区间</span>  
85 - {{else if sch.bcType == "ldks"}}  
86 - <span class="uk-badge sch_ldks">空驶</span>  
87 - {{/if}}  
88 - {{if sch.sflj}}  
89 - <span class="uk-badge uk-badge-danger">临加</span>  
90 - {{/if}}  
91 - {{if sch.cTasks.length > 0}}  
92 - <span class="uk-badge uk-badge-notification c_task {{if sch.c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{sch.cTasks.length}}</span>  
93 - {{/if}}  
94 - {{if sch.lpChange==1}}  
95 - <span class="uk-badge uk-badge-success out">换</span>  
96 - {{/if}}  
97 - </dd>  
98 - <dd data-sort-val={{sch.dfsjT}} dbclick dbclick-type="dfsj" dbclick-val="{{sch.dfsj}}">  
99 - {{sch.dfsj}}  
100 - {{if sch.late2}}  
101 - <span class="late-badge">?+{{sch.lateMinute}}</span>  
102 - {{/if}}  
103 - </dd>  
104 - <dd data-uk-observe class="  
105 - {{if sch.status==-1}}  
106 - tl-qrlb  
107 - {{else if sch.status==2}}  
108 - tl-yzx  
109 - {{else if sch.status==1}}  
110 - tl-zzzx  
111 - {{else if sch.status ==4}}  
112 - tl-wfyd  
113 - {{else if sch.status == 0 && sch.late}}  
114 - tl-wd  
115 - {{/if}} fcsjActualCell">  
116 - {{sch.fcsjActual}}<span class="fcsj-diff">{{sch.fcsj_diff}}</span>  
117 - </dd>  
118 - <dd data-uk-observe>  
119 -  
120 - <span title="{{sch.remarks}}"  
121 - data-uk-tooltip="{pos:'top-left'}">{{sch.remarks}}</span>  
122 - </dd>  
123 - </dl>  
124 - {{/each}}  
125 - </div>  
126 - </div>  
127 - </div>  
128 - </div>  
129 - </div>  
130 - </script>  
131 -  
132 - <script id="line-schedule-fcsj-temp" type="text/html">  
133 - <dd data-sort-val={{fcsjT}}>  
134 - {{fcsj}}  
135 - {{if bcType == "out"}}  
136 - <span class="uk-badge uk-badge-success out">出场</span>  
137 - {{else if bcType == "in"}}  
138 - <span class="uk-badge uk-badge-warning in">进场</span>  
139 - {{else if bcType == "venting"}}  
140 - <span class="uk-badge uk-badge-danger">直放</span>  
141 - {{else if bcType == "major"}}  
142 - <span class="uk-badge uk-badge-danger">放站</span>  
143 - {{else if bcType == "region"}}  
144 - <span class="uk-badge sch_region">区间</span>  
145 - {{else if bcType == "ldks"}}  
146 - <span class="uk-badge sch_ldks">空驶</span>  
147 - {{/if}}  
148 - {{if sflj}}  
149 - <span class="uk-badge uk-badge-danger">临加</span>  
150 - {{/if}}  
151 - {{if cTasks.length > 0}}  
152 - <span class="uk-badge uk-badge-notification c_task {{if c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{cTasks.length}}</span>  
153 - {{/if}}  
154 - </dd>  
155 - </script>  
156 -  
157 - <script id="line-schedule-sfsj-temp" type="text/html">  
158 - <dd data-uk-observe class="  
159 - {{if status==-1}}  
160 - tl-qrlb  
161 - {{else if status==2}}  
162 - tl-yzx  
163 - {{else if status==1}}  
164 - tl-zzzx  
165 - {{else if status == 0 && late}}  
166 - tl-wd  
167 - {{/if}} fcsjActualCell">  
168 - {{fcsjActual}}<span class="fcsj-diff">{{fcsj_diff}}</span>  
169 - </dd>  
170 - </script>  
171 -  
172 - <script id="line-schedule-nbbm-temp" type="text/html">  
173 - <dd data-nbbm="{{clZbh}}"  
174 - class="{{if directiveState == 60}}tl-xxfc{{else if directiveState == 100}}tl-xxsd{{else if directiveState == 200}}tl-xxrd{{/if}}">  
175 - {{clZbh}}  
176 - </dd>  
177 - </script>  
178 -  
179 - <script id="sfsj_sch-detail-temp" type="text/html">  
180 - <ul class="sfsj-sch-detail">  
181 - <li><span>路牌:</span>{{lpName}}</li>  
182 - <li><span>车辆:</span>{{clZbh}}</li>  
183 - <li><span>计发:</span>{{fcsj}}</li>  
184 - <li><span>实发:</span>{{fcsjActual}}</li>  
185 - <li><span>计达:</span>{{zdsj}}</li>  
186 - <li><span>实达:</span>{{zdsjActual}}</li>  
187 - <li><span>驾驶员:</span>{{jGh}}/{{jName}}</li>  
188 - <li><span>售票员:</span>{{sGh}}/{{sName}}</li>  
189 - <li><span>终点站:</span>{{zdzName}}</li>  
190 - </ul>  
191 - </script>  
192 -  
193 - <script id="last-sch-sunken-temp" type="text/html">  
194 - <div class="last-sch-sunken">  
195 - <span class="_badge">{{zdsj}}/{{zdsjActual}}</span>  
196 - </div>  
197 - </script>  
198 -  
199 - <script id="sch-lp-mileage-tip-temp" type="text/html">  
200 - {{each data as obj i}}  
201 - {{if i > 0}}<hr>{{/if}}  
202 -  
203 - <h5 class="_title"> <span class="lp_name">{{lpName}}</span>&nbsp;&nbsp;<a>{{obj.key}}</a></h5>  
204 - <div class="LD_item">  
205 - <span>营运:<a>{{obj.serviceMileage}}</a></span>  
206 - <span>烂班:<a>{{obj.destroyMileage}}</a></span>  
207 - <span>空驶:<a>{{obj.emptyMileage}}</a></span>  
208 - </div>  
209 - {{/each}}  
210 - </script>  
211 -</div> 1 +<div>
  2 + <script id="line-schedule-table-temp" type="text/html">
  3 + <div class="schedule-wrap {{if dir==0}}up{{else}}down{{/if}}">
  4 + <h3 class="header-title">
  5 + {{if dir==0}}
  6 + {{line.startStationName}}
  7 + {{else}}
  8 + {{line.endStationName}}
  9 + {{/if}}
  10 + <i class="uk-icon-question-circle uk-icon-hover"></i>
  11 + <div class="fixed_legend">
  12 + <div>
  13 + <span class="tl-xxfc">消息发出</span>
  14 + <span class="tl-xxsd">消息收到</span>
  15 + <span class="tl-xxrd">消息阅读</span>
  16 + &nbsp;
  17 + <span class="tl-wd">误点</span>
  18 + <span class="tl-zzzx">正在执行</span>
  19 + <span class="tl-qrlb"></span>
  20 + <span class="tl-yzx">已执行</span>
  21 + <a>
  22 + <i class="uk-icon-angle-double-up fixed_legend_close"></i>
  23 + </a>
  24 + </div>
  25 + </div>
  26 + <i class="uk-icon-eye uk-icon-hover ct_eye_icon"></i>
  27 + <i class="uk-icon-qrcode uk-icon-hover ct_calu_icon" data-toggle="tooltip" data-placement="bottom" title="计算应到实到时间对比"></i>
  28 +
  29 + <!--<i class="uk-icon-share-alt uk-icon-hover tp_info_icon" ></i>-->
  30 +
  31 + <span class="warn_multi_station" data-updown="{{dir}}" data-code="{{line.lineCode}}"></span>
  32 + <div class="search_sch_panel">
  33 + <form class="uk-form" onsubmit="javascript:return false;">
  34 + <div class="uk-autocomplete sch-search-autocom">
  35 + <div class="uk-form-icon">
  36 + <i class="uk-icon-search"></i>
  37 + <input type="text" placeholder="搜索">
  38 + <i class="cancel uk-icon-times-circle" data-uk-tooltip="{pos:'right'}" title="取消过滤"></i>
  39 + </div>
  40 + </div>
  41 + </form>
  42 + </div>
  43 + </h3>
  44 + <div class="schedule-body">
  45 + <div class="ct_table_wrap">
  46 + <div class="ct_table line-schedule-table">
  47 + <div class="ct_table_head">
  48 + <dl>
  49 + <dt>序号</dt>
  50 + <dt>路牌</dt>
  51 + <dt>RFID</dt>
  52 + <dt>车辆</dt>
  53 + <dt>应到</dt>
  54 + <dt>实到</dt>
  55 + <dt sort-field>计发</dt>
  56 + <dt sort-field>待发</dt>
  57 + <dt>实发</dt>
  58 + <dt>原因</dt>
  59 + </dl>
  60 + </div>
  61 + <div class="ct_table_body">
  62 + {{each list as sch i}}
  63 + <dl data-id="{{sch.id}}">
  64 + <dd class="seq_no">{{i + 1}}</dd>
  65 + <dd class="lpName"><a>{{sch.lpName}}</a></dd>
  66 + <dd class="{{if !sch.qdzArrDatesj}}tl-white{{else if (sch.rfidState & 1) == 1 && (sch.rfidState & 2) == 2}}tl-green{{else if (sch.rfidState & 1) == 1}}tl-yellow{{else}}tl-grey{{/if}}"></dd>
  67 + <dd data-nbbm="{{sch.clZbh}}"
  68 + class="{{if sch.directiveState == 60}}tl-xxfc{{else if sch.directiveState == 100}}tl-xxsd{{else if sch.directiveState == 200}}tl-xxrd{{/if}}">
  69 + {{sch.clZbh}}
  70 + </dd>
  71 + <dd>{{sch.qdzArrDatejh}}</dd>
  72 + <dd class="qdzArrDatesjDD"><span class="qdzArrDatesjSPAN">{{sch.qdzArrDatesj}}</span><span class="arrsj-diff">{{sch.arrsj_diff}}</span></dd>
  73 + <dd data-sort-val={{sch.fcsjT}}>
  74 + {{sch.fcsj}}
  75 + {{if sch.bcType == "out"}}
  76 + <span class="uk-badge uk-badge-success out">出场</span>
  77 + {{else if sch.bcType == "in"}}
  78 + <span class="uk-badge uk-badge-warning in">进场</span>
  79 + {{else if sch.bcType == "venting"}}
  80 + <span class="uk-badge uk-badge-danger">直放</span>
  81 + {{else if sch.bcType == "major"}}
  82 + <span class="uk-badge uk-badge-danger">放站</span>
  83 + {{else if sch.bcType == "region"}}
  84 + <span class="uk-badge sch_region">区间</span>
  85 + {{else if sch.bcType == "ldks"}}
  86 + <span class="uk-badge sch_ldks">空驶</span>
  87 + {{/if}}
  88 + {{if sch.sflj}}
  89 + <span class="uk-badge uk-badge-danger">临加</span>
  90 + {{/if}}
  91 + {{if sch.cTasks.length > 0}}
  92 + <span class="uk-badge uk-badge-notification c_task {{if sch.c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{sch.cTasks.length}}</span>
  93 + {{/if}}
  94 + {{if sch.lpChange==1}}
  95 + <span class="uk-badge uk-badge-success out">换</span>
  96 + {{/if}}
  97 + </dd>
  98 + <dd data-sort-val={{sch.dfsjT}} dbclick dbclick-type="dfsj" dbclick-val="{{sch.dfsj}}">
  99 + {{sch.dfsj}}
  100 + {{if sch.late2}}
  101 + <span class="late-badge">?+{{sch.lateMinute}}</span>
  102 + {{/if}}
  103 + </dd>
  104 + <dd data-uk-observe class="
  105 + {{if sch.status==-1}}
  106 + tl-qrlb
  107 + {{else if sch.status==2}}
  108 + tl-yzx
  109 + {{else if sch.status==1}}
  110 + tl-zzzx
  111 + {{else if sch.status ==4}}
  112 + tl-wfyd
  113 + {{else if sch.status == 0 && sch.late}}
  114 + tl-wd
  115 + {{/if}} fcsjActualCell">
  116 + {{sch.fcsjActual}}<span class="fcsj-diff">{{sch.fcsj_diff}}</span>
  117 + </dd>
  118 + <dd data-uk-observe>
  119 +
  120 + <span title="{{sch.remarks}}"
  121 + data-uk-tooltip="{pos:'top-left'}">{{sch.remarks}}</span>
  122 + </dd>
  123 + </dl>
  124 + {{/each}}
  125 + </div>
  126 + </div>
  127 + </div>
  128 + </div>
  129 + </div>
  130 + </script>
  131 +
  132 + <script id="line-schedule-fcsj-temp" type="text/html">
  133 + <dd data-sort-val={{fcsjT}}>
  134 + {{fcsj}}
  135 + {{if bcType == "out"}}
  136 + <span class="uk-badge uk-badge-success out">出场</span>
  137 + {{else if bcType == "in"}}
  138 + <span class="uk-badge uk-badge-warning in">进场</span>
  139 + {{else if bcType == "venting"}}
  140 + <span class="uk-badge uk-badge-danger">直放</span>
  141 + {{else if bcType == "major"}}
  142 + <span class="uk-badge uk-badge-danger">放站</span>
  143 + {{else if bcType == "region"}}
  144 + <span class="uk-badge sch_region">区间</span>
  145 + {{else if bcType == "ldks"}}
  146 + <span class="uk-badge sch_ldks">空驶</span>
  147 + {{/if}}
  148 + {{if sflj}}
  149 + <span class="uk-badge uk-badge-danger">临加</span>
  150 + {{/if}}
  151 + {{if cTasks.length > 0}}
  152 + <span class="uk-badge uk-badge-notification c_task {{if c_t_mileage_status==-1}}c_task_mileage_error{{/if}}">{{cTasks.length}}</span>
  153 + {{/if}}
  154 + </dd>
  155 + </script>
  156 +
  157 + <script id="line-schedule-sfsj-temp" type="text/html">
  158 + <dd data-uk-observe class="
  159 + {{if status==-1}}
  160 + tl-qrlb
  161 + {{else if status==2}}
  162 + tl-yzx
  163 + {{else if status==1}}
  164 + tl-zzzx
  165 + {{else if status == 0 && late}}
  166 + tl-wd
  167 + {{/if}} fcsjActualCell">
  168 + {{fcsjActual}}<span class="fcsj-diff">{{fcsj_diff}}</span>
  169 + </dd>
  170 + </script>
  171 +
  172 + <script id="line-schedule-nbbm-temp" type="text/html">
  173 + <dd data-nbbm="{{clZbh}}"
  174 + class="{{if directiveState == 60}}tl-xxfc{{else if directiveState == 100}}tl-xxsd{{else if directiveState == 200}}tl-xxrd{{/if}}">
  175 + {{clZbh}}
  176 + </dd>
  177 + </script>
  178 +
  179 + <script id="sfsj_sch-detail-temp" type="text/html">
  180 + <ul class="sfsj-sch-detail">
  181 + <li><span>路牌:</span>{{lpName}}</li>
  182 + <li><span>车辆:</span>{{clZbh}}</li>
  183 + <li><span>计发:</span>{{fcsj}}</li>
  184 + <li><span>实发:</span>{{fcsjActual}}</li>
  185 + <li><span>计达:</span>{{zdsj}}</li>
  186 + <li><span>实达:</span>{{zdsjActual}}</li>
  187 + <li><span>驾驶员:</span>{{jGh}}/{{jName}}</li>
  188 + <li><span>售票员:</span>{{sGh}}/{{sName}}</li>
  189 + <li><span>终点站:</span>{{zdzName}}</li>
  190 + </ul>
  191 + </script>
  192 +
  193 + <script id="last-sch-sunken-temp" type="text/html">
  194 + <div class="last-sch-sunken">
  195 + <span class="_badge">{{zdsj}}/{{zdsjActual}}</span>
  196 + </div>
  197 + </script>
  198 +
  199 + <script id="sch-lp-mileage-tip-temp" type="text/html">
  200 + {{each data as obj i}}
  201 + {{if i > 0}}<hr>{{/if}}
  202 +
  203 + <h5 class="_title"> <span class="lp_name">{{lpName}}</span>&nbsp;&nbsp;<a>{{obj.key}}</a></h5>
  204 + <div class="LD_item">
  205 + <span>营运:<a>{{obj.serviceMileage}}</a></span>
  206 + <span>烂班:<a>{{obj.destroyMileage}}</a></span>
  207 + <span>空驶:<a>{{obj.emptyMileage}}</a></span>
  208 + </div>
  209 + {{/each}}
  210 + </script>
  211 +</div>
src/main/resources/static/real_control_v2/js/line_schedule/sch_table.js
1 -/** schedule table */  
2 -  
3 -var gb_schedule_table = (function () {  
4 -  
5 - var temps;  
6 - //线路分组的班次数据  
7 - var line2Schedule = {};  
8 - //车辆应发未发车辆数  
9 - var car_yfwf_map = {};  
10 - //班次站点编码和实际不符数据  
11 - var errorCodeData = {};  
12 -  
13 - var bcTypeOrderMap = {  
14 - 'out':0,  
15 - 'normal':1,  
16 - 'region':2,  
17 - 'major':3,  
18 - 'venting':4,  
19 - 'ldks':5,  
20 - 'in':6  
21 - };  
22 - var typeOrder = function (type) {  
23 - return bcTypeOrderMap[type]?bcTypeOrderMap[type]:0;  
24 - };  
25 - var schedule_sort = function (s1, s2) {  
26 - var diff = s1['fcsjT'] - s2['fcsjT'];  
27 - return diff!=0?diff:typeOrder(s1['bcType'])-typeOrder(s2['bcType']);  
28 - };  
29 -  
30 - var show = function (cb) {  
31 - //从服务器获取班次数据  
32 - $.get('/realSchedule/lines', {  
33 - lines: gb_data_basic.line_idx  
34 - }, function (rs) {  
35 - for (var lineCode in rs) {  
36 - line2Schedule[lineCode] = {};  
37 -  
38 - //排序  
39 - rs[lineCode].sort(schedule_sort);  
40 - //calc shift  
41 - $.each(rs[lineCode], function () {  
42 - if(this.status==-1)  
43 - clearActualTime(this);  
44 - calc_sch_real_shift(this);  
45 - wfydcolor(this);  
46 - line2Schedule[lineCode][this.id] = this;  
47 - //子任务公里是否与计划平  
48 - this.c_t_mileage_status = calcCTaskMileageStatus(this);  
49 - });  
50 - //计算应发未发  
51 - calc_yfwf_num(lineCode);  
52 - }  
53 - ep.emit('data', rs);  
54 - });  
55 -  
56 - //加载班次表格渲染模板  
57 - $.get('/real_control_v2/fragments/line_schedule/sch_table.html', function (dom) {  
58 - ep.emit('temp', gb_common.compileTempByDom(dom, {  
59 - compress: true  
60 - }));  
61 - });  
62 -  
63 - var ep = EventProxy.create("data", "temp", function (data, temp) {  
64 - temps = temp;  
65 - var lineCode, dirData, htmlStr;  
66 - $('#main-tab-content .line_schedule').each(function () {  
67 - lineCode = $(this).data('id');  
68 - if (arrayIsNull(data[lineCode]))  
69 - return true;  
70 - dirData = gb_common.groupBy(data[lineCode], 'xlDir');  
71 - for (var upDown in dirData) {  
72 - htmlStr = temps['line-schedule-table-temp']({  
73 - dir: upDown,  
74 - line: gb_data_basic.codeToLine[lineCode],  
75 - list: dirData[upDown]  
76 - });  
77 -  
78 - $('.schedule-wrap .card-panel:eq(' + upDown + ')', this)  
79 - .html(htmlStr);  
80 - }  
81 -  
82 - //标记路牌最后一个班次  
83 - markerLastByLine(lineCode);  
84 - //初始化图例相关,dbclick 不能代理事件  
85 - //gb_sch_legend.init(this);  
86 - });  
87 - //初始化图例  
88 - gb_sch_legend.init();  
89 - var content = $('.line_schedule .ct_table_wrap');  
90 - //初始化滚动条  
91 - content.perfectScrollbar({suppressScrollX: true});  
92 - //fixed table head  
93 - gb_ct_table.fixedHead(content);  
94 - //enable sort  
95 - gb_ct_table.enableSort($('.ct_table', content), reset_seq_no, gb_schedule_table_dbclick.init);  
96 - //dbclick event  
97 - gb_schedule_table_dbclick.init();  
98 - //双击实发  
99 - gb_schedule_table_dbclick.sfsjCellClick($('dd.fcsjActualCell'));  
100 - //双击车辆  
101 - gb_schedule_table_dbclick.carCellClick($('.ct_table_body dd[data-nbbm]'));  
102 - //搜索框初始化  
103 - gb_sch_search.init();  
104 -  
105 - //监听gps车辆信息  
106 - gb_data_gps.registerCallback(renderCarRemark);  
107 - gb_sch_legend.showYdSdDb();  
108 - cb && cb();  
109 - });  
110 -  
111 - };  
112 -  
113 - var renderCarRemark = function () {  
114 - try{  
115 - var $activeTab = $('.north-tabs>ul>li.tab-line.uk-active');//.data('code');  
116 - if($activeTab.length==0)  
117 - return;  
118 - var lineCode = $activeTab.data('code');  
119 - var array = gb_common.get_vals(line2Schedule[lineCode]);  
120 - var nbbms = {};  
121 - for(var i=0,sch;sch=array[i++];){  
122 - nbbms[sch.clZbh]=1;  
123 - }  
124 -  
125 - var $activeWrap = $('#main-tab-content .line_schedule.uk-active .schedule-wrap .schedule-body');  
126 - var gps, e;  
127 - for(var nbbm in nbbms){  
128 - gps = gb_data_gps.findGpsByNbbm(nbbm);  
129 - e = $('.ct_table_body dl>dd[data-nbbm='+nbbm+']', $activeWrap);  
130 - $('i', e).remove();  
131 -  
132 - if(gps && gps['planCode']!=lineCode && gps.remark)  
133 - $(e).append('<i class="uk-icon-exclamation-circle" data-uk-tooltip title="'+gps.remark+'"></i>');  
134 - }  
135 - }catch (e){  
136 - console.log(e);  
137 - }  
138 - };  
139 -  
140 - /**  
141 - * 计算子任务公里是否和计划平  
142 - * @param sch  
143 - */  
144 - var calcCTaskMileageStatus = function (sch) {  
145 - if(!sch.cTasks || sch.cTasks.length==0)  
146 - return 0;  
147 - var sum = 0;  
148 - $.each(sch.cTasks, function () {  
149 - if (this.mileageType == 'service') {  
150 - sum = gb_common.accAdd(sum, this.mileage);  
151 - }  
152 - });  
153 -  
154 - if (sum != sch.jhlcOrig) {  
155 - return -1;  
156 - }  
157 - return 0;  
158 - };  
159 -  
160 -  
161 - //重置序号  
162 - var reset_seq_no = function (dls) {  
163 - dls.each(function (i, dl) {  
164 - $('dd:eq(0)', dl).text(i + 1);  
165 - });  
166 - };  
167 -  
168 - //计算实发时间差值  
169 - var calc_sch_real_shift = function (sch) {  
170 - if (sch['fcsjActualTime']){  
171 - var fs = 'YYYY-MM-DD HH:mm'  
172 - ,m1 = moment(sch['fcsjActualTime']).format(fs)  
173 - ,m2 = moment(sch['dfsjT']).format(fs);//去掉秒  
174 - console.log(moment(m1, fs).format('X'))  
175 - console.log(moment(m2, fs).format('X'))  
176 - var diff = moment(m1, fs).format('X') - moment(m2, fs).format('X')  
177 - ,fcsj_diff = parseInt(diff / 60, 10);;  
178 -  
179 - if(fcsj_diff > 0)  
180 - sch.fcsj_diff = '( +' + fcsj_diff + ' )';  
181 - else if (fcsj_diff < 0)  
182 - sch.fcsj_diff = '( ' + fcsj_diff + ' )';  
183 - else  
184 - sch.fcsj_diff = '';  
185 - }  
186 - };  
187 - //无发有到时间  
188 - var wfydcolor=function (sch) {  
189 - if (sch.fcsjActual==null&&sch.zdsjActual!=null&&sch.zdsjActual!=''&&sch.status!=-1) {//sch.qdzArrDatesj!=''&&sch.qdzArrDatesj!=null&&  
190 - sch.status=4;  
191 - }  
192 - }  
193 -  
194 -  
195 -  
196 - function arrayIsNull(array) {  
197 - return !array || array.length == 0;  
198 - }  
199 -  
200 - var findScheduleByLine = function (lineCode) {  
201 - return line2Schedule[lineCode];  
202 - };  
203 -  
204 - //新增一个班次,附带更新的班次  
205 - var insertSchedule = function (sch, upArr) {  
206 - var xls = {};  
207 - xls[sch.xlBm] = 1;  
208 - line2Schedule[sch.xlBm][sch.id] = sch;  
209 - //update  
210 - if (isArray(upArr)) {  
211 - $.each(upArr, function () {  
212 - line2Schedule[this.xlBm][this.id] = this;  
213 - xls[this.xlBm] = 1;  
214 - });  
215 - }  
216 -  
217 - //重新渲染表格  
218 - for(var xlBm in xls){  
219 - reRenderTable(sch.xlBm);  
220 - }  
221 - //定位到新添加的班次  
222 - scroToDl(sch);  
223 - };  
224 -  
225 - /**  
226 - * 重新渲染表格  
227 - */  
228 - var reRenderTable = function (lineCode) {  
229 - var data = gb_common.get_vals(line2Schedule[lineCode]).sort(schedule_sort),  
230 - dirData = gb_common.groupBy(data, 'xlDir'),  
231 - tabCont = $('li.line_schedule[data-id=' + lineCode + ']'),  
232 - htmlStr;  
233 -  
234 - if($.isEmptyObject(dirData)){  
235 - $('.schedule-wrap .card-panel', tabCont).html('');  
236 - }  
237 - else {  
238 - for (var upDown in dirData) {  
239 - htmlStr = temps['line-schedule-table-temp']({  
240 - dir: upDown,  
241 - line: gb_data_basic.codeToLine[lineCode],  
242 - list: dirData[upDown]  
243 - });  
244 - $('.schedule-wrap .card-panel:eq(' + upDown + ')', tabCont).html(htmlStr);  
245 - }  
246 - //图例相关  
247 - gb_sch_legend.init(tabCont);  
248 - //标记末班  
249 - markerLastByLine(lineCode);  
250 - //计算应发未发  
251 - calc_yfwf_num(lineCode);  
252 - //重新固定表头  
253 - gb_ct_table.fixedHead($('.schedule-wrap .ct_table_wrap', tabCont));  
254 -  
255 - //重新初始化排序  
256 - gb_ct_table.enableSort($('.ct_table', tabCont), reset_seq_no, gb_schedule_table_dbclick.init);  
257 - //重新初始化双击待发调整  
258 - gb_schedule_table_dbclick.init();  
259 - //重新初始化双击实发发车信息微调  
260 - gb_schedule_table_dbclick.sfsjCellClick($('dd.fcsjActualCell', tabCont));  
261 - //重新初始化双击车辆  
262 - gb_schedule_table_dbclick.carCellClick($('.ct_table_body dd[data-nbbm]'));  
263 - //滚动条  
264 - $('.schedule-wrap .ct_table_wrap', tabCont).perfectScrollbar({suppressScrollX: true});  
265 -  
266 - //搜索模板初始化  
267 - gb_sch_search.init();  
268 - }  
269 - };  
270 -  
271 -  
272 - /**  
273 - * 重新从服务器加载数据,并刷新表格  
274 - * @param lineCode  
275 - */  
276 - var reLoadAndRefresh = function (lineCode) {  
277 - $.get('/realSchedule/lines', {  
278 - lines: lineCode + ','  
279 - }, function (rs) {  
280 - if(!rs || $.isEmptyObject(rs)){  
281 - line2Schedule[lineCode] = {};  
282 - }  
283 - else{  
284 - //排序  
285 - rs[lineCode].sort(schedule_sort);  
286 - line2Schedule[lineCode] = {};  
287 - //calc shift  
288 - $.each(rs[lineCode], function () {  
289 - calc_sch_real_shift(this);  
290 - line2Schedule[lineCode][this.id] = this;  
291 - });  
292 - }  
293 - //计算应发未发  
294 - calc_yfwf_num(lineCode);  
295 - //重新渲染  
296 - reRenderTable(lineCode);  
297 - });  
298 - };  
299 -  
300 - //删除一个班次  
301 - var deheteSchedule = function (sch) {  
302 - sch = line2Schedule[sch.xlBm][sch.id];  
303 - if (sch) {  
304 - var dl = $('li.line_schedule[data-id=' + sch.xlBm + '] .ct_table_body dl[data-id=' + sch.id + ']'),  
305 - dls = dl.parent().find('dl');  
306 - delete line2Schedule[sch.xlBm][sch.id];  
307 - dl.remove();  
308 - reset_seq_no(dls);  
309 - calc_yfwf_num(sch.xlBm);  
310 - }  
311 - };  
312 -  
313 - /**  
314 - * 更新班次  
315 - * @param schArr  
316 - */  
317 - var updateSchedule = function (schArr) {  
318 -  
319 - if (!isArray(schArr))  
320 - schArr = [schArr];  
321 -  
322 - //var tMaps = {};  
323 - $.each(schArr, function () {  
324 - try {  
325 - if(this.status==-1)  
326 - clearActualTime(this);  
327 - //子任务公里是否与计划平  
328 - this.c_t_mileage_status = calcCTaskMileageStatus(this);  
329 - line2Schedule[this.xlBm][this.id] = this;  
330 - updateDom(this);  
331 - }catch(e){}  
332 - });  
333 -  
334 - /* //重新标记末班  
335 - var ts=[];  
336 - for(var k in tMaps){  
337 - ts = k.split('_');  
338 - markerLastByNbbm(ts[0], ts[1]);  
339 - }*/  
340 - };  
341 -  
342 -  
343 - /**  
344 - * 更新班次 -只更新数据,不更新dom  
345 - * @param schArr  
346 - */  
347 - var updateData = function (schArr) {  
348 - if (!isArray(schArr))  
349 - schArr = [schArr];  
350 - $.each(schArr, function () {  
351 - if(this.status==-1)  
352 - clearActualTime(this);  
353 - line2Schedule[this.xlBm][this.id] = this;  
354 - });  
355 - };  
356 -  
357 - //update dom  
358 - var updateDom = function (sch) {  
359 - if (!sch) return;  
360 - var dl = $('li.line_schedule[data-id=' + sch.xlBm + '] .ct_table_body dl[data-id=' + sch.id + ']');  
361 - var dds = $('dd', dl);  
362 - $(dds[1]).find('a').text(sch.lpName);  
363 - var light = !sch.qdzArrDatesj ? 'tl-white' : 'tl-grey';  
364 - if (sch.rfidState & 1 == 1) {  
365 - light = 'tl-yellow';  
366 - if (sch.rfidState & 2 == 2) {  
367 - light = 'tl-green';  
368 - }  
369 - }  
370 - if (!(sch.bcType == 'in' || sch.bcType == 'out')) {  
371 - $(dds[2]).style('background', light);  
372 - }  
373 - //车辆自编号  
374 - var $newDds3 = $(temps['line-schedule-nbbm-temp'](sch));  
375 - $(dds[3]).replaceWith($newDds3);  
376 - //车辆双击  
377 - gb_schedule_table_dbclick.carCellClick($newDds3);  
378 - $(dds[4]).text(sch.qdzArrDatejh ? sch.qdzArrDatejh : '');  
379 - $(dds[5]).text(sch.qdzArrDatesj ? sch.qdzArrDatesj : '');  
380 -  
381 - //计发时间  
382 - var d5html = temps['line-schedule-fcsj-temp'](sch);  
383 - if (sch.lpChange == 1) {  
384 - d5html = d5html.replace('</dd>', '') + '<span class="uk-badge uk-badge-success out">换</span>' + '</dd>';  
385 - }  
386 - $(dds[6]).replaceWith(d5html);  
387 - //待发时间  
388 - var dfHtmlStr = sch.dfsj + (sch.late2?'<span class="late-badge">?+'+sch.lateMinute+'</span>':'');  
389 - $(dds[7]).attr('data-sort-val', sch.dfsjT).attr('dbclick-val', sch.dfsj).html(dfHtmlStr);  
390 -  
391 - //实发时间  
392 - calc_sch_real_shift(sch);  
393 - var sfsjDd = $(temps['line-schedule-sfsj-temp'](sch));  
394 - //双击  
395 - gb_schedule_table_dbclick.sfsjCellClick(sfsjDd);  
396 - $(dds[8]).replaceWith(sfsjDd);  
397 - if (sch.remarks)  
398 - $(dds[9]).html('<span title="' + sch.remarks + '" data-uk-tooltip="{pos:\'top-left\'}">' + sch.remarks + '</span>');  
399 - else  
400 - $(dds[9]).html('');  
401 -  
402 - //信号状态标记  
403 - gb_signal_state.marker_sch(sch);  
404 - //班次是车辆的最后一班  
405 - if (dl.hasClass('dl-last-sch'))  
406 - markerLastSch([sch]);  
407 -  
408 - renderCarRemark();  
409 - };  
410 -  
411 - //单击实发单元格显示详细信息  
412 - $(document).on('click', 'dd.fcsjActualCell', function () {  
413 - var that = this;  
414 - $(that).qtip({  
415 - show: true,  
416 - content: {  
417 - text: function (e) {  
418 - var lineCode = $(that).parents('li.line_schedule').data('id')  
419 - , id = $(that).parents('dl').data('id')  
420 - , sch = line2Schedule[lineCode][id];  
421 - return temps['sfsj_sch-detail-temp'](sch);  
422 - }  
423 - }  
424 - , style: {  
425 - classes: 'qtip-dark qtip-rounded qtip-shadow'  
426 - },  
427 - hide: {  
428 - fixed: true,  
429 - delay: 300  
430 - },  
431 - position: {  
432 - target: that,  
433 - my: 'center left',  
434 - at: 'center right'  
435 - },  
436 - events: {  
437 - hidden: function (event, api) {  
438 - $(this).qtip('destroy', true);  
439 - }  
440 - }  
441 - });  
442 -  
443 - //车辆rect 闪烁、  
444 - var wrap = $(that).parents('li.line_schedule');  
445 - var nbbm = $(that).parents('dl').find('dd:eq(2)').data('nbbm');  
446 - var device = gb_data_basic.nbbm2deviceMap()[nbbm];  
447 - var $rect = $('svg.line-chart g.gps-wrap rect[_id=rct_' + device + ']', wrap);  
448 -  
449 - //merge_hide  
450 - if ($rect.hasClass('merge_hide') || $rect.attr('y') < 0)  
451 - return;  
452 - $rect.attr('class', 'twinkle').one('animationend', function () {  
453 - $(this).removeAttr('class');  
454 - });  
455 - });  
456 -  
457 - //拖拽选中...  
458 - var seq_nos = '.line-schedule-table .ct_table_body>dl>dd.seq_no';  
459 - var drag_strat;  
460 - $(document).on('mousedown', seq_nos, function (e) {  
461 - if (e.button != 0) return;  
462 - var dl = $(this).parent();  
463 - if (dl.hasClass('drag-active'))  
464 - dl.removeClass('drag-active');  
465 - else  
466 - dl.addClass('drag-active');  
467 -  
468 - drag_strat = parseInt($(this).text()) - 1;  
469 - }).on('mouseup', function () {  
470 - drag_strat = null;  
471 - }).on('mouseover', seq_nos, function () {  
472 - if (drag_strat != null) {  
473 - var e = parseInt($(this).text()),  
474 - dls = $(this).parents('.ct_table_body').find('dl');  
475 -  
476 - reset_drag_active_all(this);  
477 - //向上选中  
478 - if (e <= drag_strat) {  
479 - for (var i = drag_strat; i > e - 2; i--)  
480 - $(dls[i]).addClass('drag-active');  
481 - }  
482 - //向下选中  
483 - else {  
484 - for (var j = drag_strat; j < e; j++)  
485 - $(dls[j]).addClass('drag-active');  
486 - }  
487 - }  
488 - }).on('click', seq_nos, function () {  
489 - reset_relevance_active(this);  
490 - });  
491 - //非seq_no 单元格点击  
492 - $(document).on('click', '.line-schedule-table .ct_table_body dl dd[class!=seq_no][class!=lpName]', function () {  
493 - reset_drag_active_all(this);  
494 - //选中相关班次  
495 - var id = $(this).parent().data('id'),  
496 - contWrap = $(this).parents('li.line_schedule'),  
497 - lineCode = contWrap.data('id'),  
498 - sch = line2Schedule[lineCode][id],  
499 - schArr = gb_common.get_vals(line2Schedule[lineCode]).filter(function (item) {  
500 - return item.clZbh == sch.clZbh;  
501 - }).sort(schedule_sort),  
502 - nextSch, tempDL;  
503 -  
504 - getDl(sch).addClass('intimity');  
505 - $.each(schArr, function (i) {  
506 - tempDL = $('dl[data-id=' + this.id + ']', contWrap);  
507 - tempDL.addClass('relevance-active');  
508 - if (i < schArr.length - 1 && this.id == id) {  
509 - nextSch = schArr[i + 1];  
510 - }  
511 - });  
512 -  
513 - if (nextSch) {  
514 - $('dl[data-id=' + nextSch.id + ']', contWrap).addClass('intimity');  
515 - /*if (nextSch.xlDir == sch.xlDir)  
516 - return;*/  
517 - //滚动到下一个班次  
518 - if(nextSch.xlDir != sch.xlDir)  
519 - scroToDl(nextSch);  
520 -  
521 - }  
522 -  
523 - //如果有打开轨迹回放  
524 - if($('.layui-layer.play_back-layer').is(':visible')){  
525 - gb_map_play_back.setParam(sch);  
526 - }  
527 - });  
528 -  
529 - //路牌点击  
530 - $(document).on('click', '.line-schedule-table .ct_table_body dl dd[class=lpName]', function () {  
531 - reset_drag_active_all(this);  
532 - //选中路牌下相关班次  
533 - var id = $(this).parent().data('id'),  
534 - contWrap = $(this).parents('li.line_schedule'),  
535 - lineCode = contWrap.data('id'),  
536 - sch = line2Schedule[lineCode][id],  
537 - schArr = gb_common.get_vals(line2Schedule[lineCode]).filter(function (item) {  
538 - return item.lpName == sch.lpName;  
539 - }).sort(schedule_sort);  
540 - $.each(schArr, function (i) {  
541 - $('dl[data-id=' + this.id + ']', contWrap).addClass('relevance-active intimity');  
542 - });  
543 -  
544 - //notify_succ('高亮路牌 ' + sch.lpName);  
545 - showLpMileageTip(lineCode, sch.lpName, schArr);  
546 - });  
547 -  
548 - var showLpMileageTipBySch = function (sch) {  
549 - if(!$('.mileage_elec_panel', $('.line_schedule[data-id='+sch.xlBm+']')).is(':visible'))  
550 - return;  
551 -  
552 - var schArr = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (item) {  
553 - return item.lpName == sch.lpName;  
554 - }).sort(schedule_sort);  
555 -  
556 - showLpMileageTip(sch.xlBm, sch.lpName, schArr);  
557 - };  
558 - /**  
559 - * 弹出路牌公里统计tip  
560 - * @param lineCode  
561 - * @param lpName  
562 - * @param array  
563 - */  
564 - var showLpMileageTip = function (lineCode, lpName, array) {  
565 - var wrap = $('.line_schedule[data-id='+lineCode+']');  
566 - //按驾驶员&车辆分组统计  
567 - var data=mileageTipGroupData(array);  
568 - //统计公里  
569 - var list=[];  
570 - for(var key in data){  
571 - list.push({  
572 - key : key,  
573 - serviceMileage: gb_sch_mileage_count.serviceMileage(data[key]),  
574 - destroyMileage: gb_sch_mileage_count.destroyMileage(data[key]),  
575 - emptyMileage: gb_sch_mileage_count.emptyMileage(data[key])  
576 - })  
577 - }  
578 - var htmlStr = temps['sch-lp-mileage-tip-temp']({data: list, lpName:lpName});  
579 - $('.mileage_elec_panel', wrap).html(htmlStr).addClass('uk-animation-slide-bottom').show()  
580 - .one('animationEnd', function () {  
581 - $(this).removeClass('uk-animation-slide-bottom');  
582 - });  
583 - };  
584 -  
585 - /**  
586 - * 分组数据,处理子任务里的中途换车  
587 - * @param array  
588 - */  
589 - var mileageTipGroupData = function (arr) {  
590 - var list = JSON.parse(JSON.stringify(arr));  
591 - var cts;  
592 - var zthcArray=[];  
593 - var sch;  
594 - for(var i=0,len=list.length;i<len;i++){  
595 - sch = list[i];  
596 - cts = sch['cTasks'];  
597 - if(!cts || cts.length==0)  
598 - continue;  
599 -  
600 - sch['cTasks'] = [];  
601 - //有子任务  
602 - for(var j=0,ct;ct=cts[j++];){  
603 - if(!ct.nbbm || ct.nbbm==sch.clZbh){  
604 - sch['cTasks'].push(ct);  
605 - continue;  
606 - }  
607 -  
608 - zthcArray.push(cloneByCTask(sch, ct));  
609 - }  
610 - }  
611 -  
612 - if(zthcArray.length > 0)  
613 - list = list.concat(zthcArray);  
614 -  
615 - var data={},key;  
616 - for(var i=0,len=list.length;i<len;i++){  
617 - key = list[i].clZbh+'/'+list[i].jGh+'('+list[i].jName+')';  
618 - if(!data[key])  
619 - data[key] = [];  
620 - data[key].push(list[i]);  
621 - }  
622 - return data;  
623 - };  
624 -  
625 - var cloneByCTask = function (sch, ct) {  
626 - var newObj = JSON.parse(JSON.stringify(sch));  
627 - newObj['cTasks']=[];  
628 - newObj.clZbh = ct.nbbm;  
629 - newObj.fcsjActual = ct.startDate;  
630 - newObj.zdsjActual = ct.endDate;  
631 - newObj.jhlc = ct.mileage;  
632 - newObj.jhlcOrig = ct.mileage;  
633 -  
634 - if(ct.type2=='1')  
635 - newObj.bcType='normal';  
636 - else if(ct.type2=='2'){  
637 - newObj.bcType='in';  
638 - }else if(ct.type2=='3')  
639 - newObj.bcType='out';  
640 -  
641 - return newObj;  
642 - };  
643 -  
644 - //头部点击去掉选中光标  
645 - $(document).on('click', '.header-title', function () {  
646 - reset_drag_active_all(this);  
647 - });  
648 -  
649 - var scroToDl = function (sch) {  
650 - var dl = getDl(sch),  
651 - cont = dl.parents('.ct_table_wrap'),  
652 - diff = cont.height() / 2;  
653 - cont.animate({  
654 - scrollTop: dl.offset().top - cont.offset().top + cont.scrollTop() - diff  
655 - }, 500);  
656 -  
657 - return dl;  
658 - };  
659 -  
660 - var getDl = function (sch) {  
661 - return $('dl[data-id=' + sch.id + ']', $('.line_schedule[data-id=' + sch.xlBm + ']'));  
662 - };  
663 -  
664 - var reset_drag_active_all = function (dd) {  
665 - $(dd).parents('.schedule-wrap').find('dl.drag-active').removeClass('drag-active');  
666 - reset_relevance_active(dd);  
667 -  
668 - $('.mileage_elec_panel', $(dd).parents('.top-container')).hide().remove('uk-animation-slide-bottom');  
669 - };  
670 -  
671 - var reset_relevance_active = function (dd) {  
672 - $(dd).parents('.uk-grid.schedule-wrap').find('.relevance-active').removeClass('relevance-active intimity');  
673 - };  
674 -  
675 -  
676 - //计算应发未发数量 car_yfwf_map  
677 - var calc_yfwf_num = function (lineCode) {  
678 -  
679 - var schArr = gb_common.get_vals(line2Schedule[lineCode]).sort(schedule_sort),  
680 - yfwf_num = 0,  
681 - t = new Date().valueOf();  
682 -  
683 - var carYfwfMap = {}, nbbm;  
684 - $.each(schArr, function () {  
685 - /*if (this.dfsjT > t)  
686 - return false;*/  
687 -  
688 - if (this.dfsjT < t &&  
689 - this.fcsjActual == null && this.fcsjActualTime == null && this.status != -1) {  
690 - yfwf_num++;  
691 - nbbm = this.clZbh;  
692 - if (carYfwfMap[nbbm])  
693 - carYfwfMap[nbbm]++;  
694 - else  
695 - carYfwfMap[nbbm] = 1;  
696 - }  
697 - });  
698 - car_yfwf_map[lineCode] = carYfwfMap;  
699 -  
700 - $('#badge_yfwf_num_' + lineCode).text(yfwf_num);  
701 - };  
702 -  
703 - //标记终点时间 -线路  
704 - var markerLastByLine = function (lineCode) {  
705 - var data = gb_common.groupBy(gb_common.get_vals(line2Schedule[lineCode]).filter(schDestroyFilter), 'lpName');  
706 -  
707 - var array, lastSch, dl;  
708 - for (var nbbm in data) {  
709 - array = data[nbbm].sort(schedule_sort);  
710 - markerLastSch(array);  
711 - }  
712 - };  
713 -  
714 - //标记终点时间 -车辆  
715 - var markerLastByNbbm = function (lineCode, nbbm) {  
716 - var array = gb_common.get_vals(line2Schedule[lineCode]).filter(function (a) {  
717 - return a.clZbh == nbbm && a.status != -1;  
718 - }).sort(schedule_sort);  
719 -  
720 - removeMarkers(lineCode, array);  
721 - markerLastSch(array);  
722 - };  
723 -  
724 - var markerLastSch = function (array) {  
725 - var lastSch = array[array.length - 1];  
726 -  
727 - if (!lastSch.jhlc)  
728 - return;  
729 -  
730 - var dl = getDl(lastSch);  
731 - dl.addClass('dl-last-sch');  
732 -  
733 - $('dd.fcsjActualCell', dl).append(temps['last-sch-sunken-temp'](lastSch));  
734 - };  
735 -  
736 - //清除线路下指定班次的 末班标记  
737 - var removeMarkers = function (lineCode, array) {  
738 - var idx = [];  
739 - $.each(array, function () {  
740 - idx.push(this.id);  
741 - });  
742 -  
743 - $('dl.dl-last-sch', 'li.line_schedule[data-id=' + lineCode + ']').each(function () {  
744 - if ($(this).hasClass('dl-last-sch') && idx.indexOf($(this).data('id'))) {  
745 - $(this).removeClass('dl-last-sch').find('.last-sch-sunken').remove();  
746 - }  
747 - });  
748 - };  
749 -  
750 - var schDestroyFilter = function (a) {  
751 - return a.status != -1;  
752 - };  
753 -  
754 - /* 下一个班次 */  
755 - var getNextSch = function (sch) {  
756 - var array = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (a) {  
757 - return a.clZbh == sch.clZbh;  
758 - }).sort(schedule_sort);  
759 -  
760 - for (var i = 0, item; item = array[i++];) {  
761 - if (array[i].id == sch.id) {  
762 - return i < array.length ? array[i + 1] : null;  
763 - }  
764 - }  
765 - };  
766 -  
767 - /* 下一个班次普通班次 */  
768 - var getNextNormalSch = function (sch) {  
769 -  
770 - var array = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (a) {  
771 - return a.clZbh == sch.clZbh && a.bcType=='normal';  
772 - }).sort(schedule_sort);  
773 -  
774 - for (var i = 0; i < array.length; i++) {  
775 - if (array[i].id == sch.id) {  
776 - return i < array.length ? array[i + 1] : null;  
777 - }  
778 - }  
779 - };  
780 -  
781 - /** 添加备注信息 */  
782 - var addRemarks = function (list, remarks) {  
783 - //if(!list || list)  
784 - var i = 0, sch;  
785 -  
786 - (function () {  
787 - var f = arguments.callee;  
788 - if(i >= list.length){  
789 - return;  
790 - }  
791 - sch = list[i];  
792 - gb_common.$post('/realSchedule/addRemarks', {id: sch.id, remarks: remarks}, function (rs) {  
793 - if(rs.t){  
794 - sch = rs.t;  
795 - line2Schedule[sch.xlBm][sch.id] = sch;  
796 - updateDom(sch);  
797 - i++;  
798 - f();  
799 - }  
800 - });  
801 - })();  
802 - };  
803 -  
804 - /**  
805 - * 显示误点停靠时间标记  
806 - * @param id  
807 - * @param minute  
808 - */  
809 - var showLateBadge = function (lineCode, id, minute) {  
810 - var dfCell = cancelLateBadge(lineCode, id);  
811 - $(dfCell).append('<span class="late-badge">?+'+minute+'</span>');  
812 - };  
813 -  
814 - /**  
815 - * 取消误点标记  
816 - * @param lineCode  
817 - * @param id  
818 - */  
819 - var cancelLateBadge = function (lineCode, id) {  
820 - var $dl = getDl({id: id, xlBm: lineCode});  
821 - var dfCell = $dl.find('dd')[6];  
822 - $('.late-badge',dfCell).remove();  
823 - return dfCell;  
824 - };  
825 -  
826 -  
827 - /**  
828 - * 刷新页面的所有线路班次  
829 - */  
830 - var refreshAll = function () {  
831 - show();  
832 - };  
833 -  
834 - /**  
835 - * 获取线路下营运的车辆  
836 - */  
837 - var findNbbmByLineCode = function (lineCode) {  
838 - try{  
839 - return gb_common.get_keys(gb_common.extractNbbm(gb_common.get_vals(line2Schedule[lineCode])));  
840 - }catch (e){  
841 - return [];  
842 - }  
843 - };  
844 -  
845 - var clearActualTime = function (sch) {  
846 - try{  
847 - sch.fcsjActual=null;  
848 - sch.fcsjActualTime=null;  
849 - sch.zdsjActual=null;  
850 - sch.zdsjActualTime=null;  
851 - }catch (e){  
852 - console.log(e);  
853 - }  
854 - };  
855 -  
856 - /**  
857 - * 班次站点编码异常信息  
858 - * @param list  
859 - */  
860 - var putSCodeErrorInfo = function (list) {  
861 - //按线路走向分组  
862 - var data = {};  
863 - var k;  
864 - for(var i=0,obj;obj=list[i++];){  
865 - k = obj.lineCode+'_'+obj.upDown;  
866 -  
867 - if(obj.realStationCode && obj.realStationCode.indexOf('^') != -1)  
868 - obj.realStationCode = obj.realStationCode.split('^')[0];  
869 -  
870 - if(!data[k])  
871 - data[k] = [];  
872 - data[k].push(obj);  
873 - }  
874 -  
875 - var wrap;  
876 - for(var k in data){  
877 - wrap = $('.line_schedule[data-id=' + (k.split('_')[0]) + ']');  
878 - if(wrap.length==0)  
879 - continue;  
880 -  
881 - $(".schedule-wrap span.warn_multi_station[data-updown="+(k.split('_')[1])+"]", wrap)  
882 - .html('o(* ̄▽ ̄*)o 班次和站点关联有点问题!!').show();  
883 - }  
884 -  
885 - errorCodeData = data;  
886 - };  
887 -  
888 - var findSCodeErrorInfo = function (lineCode, upDown) {  
889 - return errorCodeData[lineCode+'_'+upDown];  
890 - };  
891 -  
892 - var refreshRfid = function (sch) {  
893 - var $dl = getDl({id: sch.id, xlBm: sch.xlBm});  
894 - var dfCell = $dl.find('dd')[2];  
895 - var light = !sch.qdzArrDatesj ? 'tl-white' : 'tl-grey';  
896 - if (sch.rfidState & 1 == 1) {  
897 - light = 'tl-yellow';  
898 - if (sch.rfidState & 2 == 2) {  
899 - light = 'tl-green';  
900 - }  
901 - }  
902 - if (!(sch.bcType == 'in' || sch.bcType == 'out')) {  
903 - $(dfCell).attr('class', light);  
904 - }  
905 - };  
906 -  
907 - return {  
908 - show: show,  
909 - findScheduleByLine: findScheduleByLine,  
910 - updateSchedule: updateSchedule,  
911 - updateData: updateData,  
912 - deheteSchedule: deheteSchedule,  
913 - insertSchedule: insertSchedule,  
914 - schedule_sort: schedule_sort,  
915 - calc_yfwf_num: calc_yfwf_num,  
916 - car_yfwf_map: function (lineCode) {  
917 - return car_yfwf_map[lineCode];  
918 - },  
919 - scroToDl: scroToDl,  
920 - reset_drag_active_all: reset_drag_active_all,  
921 - getDl: getDl,  
922 - getNextSch: getNextSch,  
923 - addRemarks: addRemarks,  
924 - reLoadAndRefresh: reLoadAndRefresh,  
925 - showLateBadge: showLateBadge,  
926 - cancelLateBadge: cancelLateBadge,  
927 - refreshAll: refreshAll,  
928 - getNextNormalSch: getNextNormalSch,  
929 - findNbbmByLineCode:findNbbmByLineCode,  
930 - showLpMileageTipBySch: showLpMileageTipBySch,  
931 - renderCarRemark: renderCarRemark,  
932 - putSCodeErrorInfo: putSCodeErrorInfo,  
933 - findSCodeErrorInfo: findSCodeErrorInfo,  
934 - refreshRfid: refreshRfid  
935 - };  
936 -})(); 1 +/** schedule table */
  2 +
  3 +var gb_schedule_table = (function () {
  4 +
  5 + var temps;
  6 + //线路分组的班次数据
  7 + var line2Schedule = {};
  8 + //车辆应发未发车辆数
  9 + var car_yfwf_map = {};
  10 + //班次站点编码和实际不符数据
  11 + var errorCodeData = {};
  12 +
  13 + var bcTypeOrderMap = {
  14 + 'out':0,
  15 + 'normal':1,
  16 + 'region':2,
  17 + 'major':3,
  18 + 'venting':4,
  19 + 'ldks':5,
  20 + 'in':6
  21 + };
  22 + var typeOrder = function (type) {
  23 + return bcTypeOrderMap[type]?bcTypeOrderMap[type]:0;
  24 + };
  25 + var schedule_sort = function (s1, s2) {
  26 + var diff = s1['fcsjT'] - s2['fcsjT'];
  27 + return diff!=0?diff:typeOrder(s1['bcType'])-typeOrder(s2['bcType']);
  28 + };
  29 +
  30 + var show = function (cb) {
  31 + //从服务器获取班次数据
  32 + $.get('/realSchedule/lines', {
  33 + lines: gb_data_basic.line_idx
  34 + }, function (rs) {
  35 + for (var lineCode in rs) {
  36 + line2Schedule[lineCode] = {};
  37 +
  38 + //排序
  39 + rs[lineCode].sort(schedule_sort);
  40 + //calc shift
  41 + $.each(rs[lineCode], function () {
  42 + if(this.status==-1)
  43 + clearActualTime(this);
  44 + calc_sch_real_shift(this);
  45 + wfydcolor(this);
  46 + line2Schedule[lineCode][this.id] = this;
  47 + //子任务公里是否与计划平
  48 + this.c_t_mileage_status = calcCTaskMileageStatus(this);
  49 + });
  50 + //计算应发未发
  51 + calc_yfwf_num(lineCode);
  52 + }
  53 + ep.emit('data', rs);
  54 + });
  55 +
  56 + //加载班次表格渲染模板
  57 + $.get('/real_control_v2/fragments/line_schedule/sch_table.html', function (dom) {
  58 + ep.emit('temp', gb_common.compileTempByDom(dom, {
  59 + compress: true
  60 + }));
  61 + });
  62 +
  63 + var ep = EventProxy.create("data", "temp", function (data, temp) {
  64 + temps = temp;
  65 + var lineCode, dirData, htmlStr;
  66 + $('#main-tab-content .line_schedule').each(function () {
  67 + lineCode = $(this).data('id');
  68 + if (arrayIsNull(data[lineCode]))
  69 + return true;
  70 + dirData = gb_common.groupBy(data[lineCode], 'xlDir');
  71 + for (var upDown in dirData) {
  72 + htmlStr = temps['line-schedule-table-temp']({
  73 + dir: upDown,
  74 + line: gb_data_basic.codeToLine[lineCode],
  75 + list: dirData[upDown]
  76 + });
  77 +
  78 + $('.schedule-wrap .card-panel:eq(' + upDown + ')', this)
  79 + .html(htmlStr);
  80 + }
  81 +
  82 + //标记路牌最后一个班次
  83 + markerLastByLine(lineCode);
  84 + //初始化图例相关,dbclick 不能代理事件
  85 + //gb_sch_legend.init(this);
  86 + });
  87 + //初始化图例
  88 + gb_sch_legend.init();
  89 + var content = $('.line_schedule .ct_table_wrap');
  90 + //初始化滚动条
  91 + content.perfectScrollbar({suppressScrollX: true});
  92 + //fixed table head
  93 + gb_ct_table.fixedHead(content);
  94 + //enable sort
  95 + gb_ct_table.enableSort($('.ct_table', content), reset_seq_no, gb_schedule_table_dbclick.init);
  96 + //dbclick event
  97 + gb_schedule_table_dbclick.init();
  98 + //双击实发
  99 + gb_schedule_table_dbclick.sfsjCellClick($('dd.fcsjActualCell'));
  100 + //双击车辆
  101 + gb_schedule_table_dbclick.carCellClick($('.ct_table_body dd[data-nbbm]'));
  102 + //搜索框初始化
  103 + gb_sch_search.init();
  104 +
  105 + //监听gps车辆信息
  106 + gb_data_gps.registerCallback(renderCarRemark);
  107 + gb_sch_legend.showYdSdDb();
  108 + cb && cb();
  109 + });
  110 +
  111 + };
  112 +
  113 + var renderCarRemark = function () {
  114 + try{
  115 + var $activeTab = $('.north-tabs>ul>li.tab-line.uk-active');//.data('code');
  116 + if($activeTab.length==0)
  117 + return;
  118 + var lineCode = $activeTab.data('code');
  119 + var array = gb_common.get_vals(line2Schedule[lineCode]);
  120 + var nbbms = {};
  121 + for(var i=0,sch;sch=array[i++];){
  122 + nbbms[sch.clZbh]=1;
  123 + }
  124 +
  125 + var $activeWrap = $('#main-tab-content .line_schedule.uk-active .schedule-wrap .schedule-body');
  126 + var gps, e;
  127 + for(var nbbm in nbbms){
  128 + gps = gb_data_gps.findGpsByNbbm(nbbm);
  129 + e = $('.ct_table_body dl>dd[data-nbbm='+nbbm+']', $activeWrap);
  130 + $('i', e).remove();
  131 +
  132 + if(gps && gps['planCode']!=lineCode && gps.remark)
  133 + $(e).append('<i class="uk-icon-exclamation-circle" data-uk-tooltip title="'+gps.remark+'"></i>');
  134 + }
  135 + }catch (e){
  136 + console.log(e);
  137 + }
  138 + };
  139 +
  140 + /**
  141 + * 计算子任务公里是否和计划平
  142 + * @param sch
  143 + */
  144 + var calcCTaskMileageStatus = function (sch) {
  145 + if(!sch.cTasks || sch.cTasks.length==0)
  146 + return 0;
  147 + var sum = 0;
  148 + $.each(sch.cTasks, function () {
  149 + if (this.mileageType == 'service') {
  150 + sum = gb_common.accAdd(sum, this.mileage);
  151 + }
  152 + });
  153 +
  154 + if (sum != sch.jhlcOrig) {
  155 + return -1;
  156 + }
  157 + return 0;
  158 + };
  159 +
  160 +
  161 + //重置序号
  162 + var reset_seq_no = function (dls) {
  163 + dls.each(function (i, dl) {
  164 + $('dd:eq(0)', dl).text(i + 1);
  165 + });
  166 + };
  167 +
  168 + //计算实发时间差值
  169 + var calc_sch_real_shift = function (sch) {
  170 + if (sch['fcsjActualTime']){
  171 + var fs = 'YYYY-MM-DD HH:mm'
  172 + ,m1 = moment(sch['fcsjActualTime']).format(fs)
  173 + ,m2 = moment(sch['dfsjT']).format(fs);//去掉秒
  174 + console.log(moment(m1, fs).format('X'))
  175 + console.log(moment(m2, fs).format('X'))
  176 + var diff = moment(m1, fs).format('X') - moment(m2, fs).format('X')
  177 + ,fcsj_diff = parseInt(diff / 60, 10);;
  178 +
  179 + if(fcsj_diff > 0)
  180 + sch.fcsj_diff = '( +' + fcsj_diff + ' )';
  181 + else if (fcsj_diff < 0)
  182 + sch.fcsj_diff = '( ' + fcsj_diff + ' )';
  183 + else
  184 + sch.fcsj_diff = '';
  185 + }
  186 + };
  187 + //无发有到时间
  188 + var wfydcolor=function (sch) {
  189 + if (sch.fcsjActual==null&&sch.zdsjActual!=null&&sch.zdsjActual!=''&&sch.status!=-1) {//sch.qdzArrDatesj!=''&&sch.qdzArrDatesj!=null&&
  190 + sch.status=4;
  191 + }
  192 + }
  193 +
  194 +
  195 +
  196 + function arrayIsNull(array) {
  197 + return !array || array.length == 0;
  198 + }
  199 +
  200 + var findScheduleByLine = function (lineCode) {
  201 + return line2Schedule[lineCode];
  202 + };
  203 +
  204 + //新增一个班次,附带更新的班次
  205 + var insertSchedule = function (sch, upArr) {
  206 + var xls = {};
  207 + xls[sch.xlBm] = 1;
  208 + line2Schedule[sch.xlBm][sch.id] = sch;
  209 + //update
  210 + if (isArray(upArr)) {
  211 + $.each(upArr, function () {
  212 + line2Schedule[this.xlBm][this.id] = this;
  213 + xls[this.xlBm] = 1;
  214 + });
  215 + }
  216 +
  217 + //重新渲染表格
  218 + for(var xlBm in xls){
  219 + reRenderTable(sch.xlBm);
  220 + }
  221 + //定位到新添加的班次
  222 + scroToDl(sch);
  223 + };
  224 +
  225 + /**
  226 + * 重新渲染表格
  227 + */
  228 + var reRenderTable = function (lineCode) {
  229 + var data = gb_common.get_vals(line2Schedule[lineCode]).sort(schedule_sort),
  230 + dirData = gb_common.groupBy(data, 'xlDir'),
  231 + tabCont = $('li.line_schedule[data-id=' + lineCode + ']'),
  232 + htmlStr;
  233 +
  234 + if($.isEmptyObject(dirData)){
  235 + $('.schedule-wrap .card-panel', tabCont).html('');
  236 + }
  237 + else {
  238 + for (var upDown in dirData) {
  239 + htmlStr = temps['line-schedule-table-temp']({
  240 + dir: upDown,
  241 + line: gb_data_basic.codeToLine[lineCode],
  242 + list: dirData[upDown]
  243 + });
  244 + $('.schedule-wrap .card-panel:eq(' + upDown + ')', tabCont).html(htmlStr);
  245 + }
  246 + //图例相关
  247 + gb_sch_legend.init(tabCont);
  248 + //标记末班
  249 + markerLastByLine(lineCode);
  250 + //计算应发未发
  251 + calc_yfwf_num(lineCode);
  252 + //重新固定表头
  253 + gb_ct_table.fixedHead($('.schedule-wrap .ct_table_wrap', tabCont));
  254 +
  255 + //重新初始化排序
  256 + gb_ct_table.enableSort($('.ct_table', tabCont), reset_seq_no, gb_schedule_table_dbclick.init);
  257 + //重新初始化双击待发调整
  258 + gb_schedule_table_dbclick.init();
  259 + //重新初始化双击实发发车信息微调
  260 + gb_schedule_table_dbclick.sfsjCellClick($('dd.fcsjActualCell', tabCont));
  261 + //重新初始化双击车辆
  262 + gb_schedule_table_dbclick.carCellClick($('.ct_table_body dd[data-nbbm]'));
  263 + //滚动条
  264 + $('.schedule-wrap .ct_table_wrap', tabCont).perfectScrollbar({suppressScrollX: true});
  265 +
  266 + //搜索模板初始化
  267 + gb_sch_search.init();
  268 + }
  269 + };
  270 +
  271 +
  272 + /**
  273 + * 重新从服务器加载数据,并刷新表格
  274 + * @param lineCode
  275 + */
  276 + var reLoadAndRefresh = function (lineCode) {
  277 + $.get('/realSchedule/lines', {
  278 + lines: lineCode + ','
  279 + }, function (rs) {
  280 + if(!rs || $.isEmptyObject(rs)){
  281 + line2Schedule[lineCode] = {};
  282 + }
  283 + else{
  284 + //排序
  285 + rs[lineCode].sort(schedule_sort);
  286 + line2Schedule[lineCode] = {};
  287 + //calc shift
  288 + $.each(rs[lineCode], function () {
  289 + calc_sch_real_shift(this);
  290 + line2Schedule[lineCode][this.id] = this;
  291 + });
  292 + }
  293 + //计算应发未发
  294 + calc_yfwf_num(lineCode);
  295 + //重新渲染
  296 + reRenderTable(lineCode);
  297 + });
  298 + };
  299 +
  300 + //删除一个班次
  301 + var deheteSchedule = function (sch) {
  302 + sch = line2Schedule[sch.xlBm][sch.id];
  303 + if (sch) {
  304 + var dl = $('li.line_schedule[data-id=' + sch.xlBm + '] .ct_table_body dl[data-id=' + sch.id + ']'),
  305 + dls = dl.parent().find('dl');
  306 + delete line2Schedule[sch.xlBm][sch.id];
  307 + dl.remove();
  308 + reset_seq_no(dls);
  309 + calc_yfwf_num(sch.xlBm);
  310 + }
  311 + };
  312 +
  313 + /**
  314 + * 更新班次
  315 + * @param schArr
  316 + */
  317 + var updateSchedule = function (schArr) {
  318 +
  319 + if (!isArray(schArr))
  320 + schArr = [schArr];
  321 +
  322 + //var tMaps = {};
  323 + $.each(schArr, function () {
  324 + try {
  325 + if(this.status==-1)
  326 + clearActualTime(this);
  327 + //子任务公里是否与计划平
  328 + this.c_t_mileage_status = calcCTaskMileageStatus(this);
  329 + line2Schedule[this.xlBm][this.id] = this;
  330 + updateDom(this);
  331 + }catch(e){}
  332 + });
  333 +
  334 + /* //重新标记末班
  335 + var ts=[];
  336 + for(var k in tMaps){
  337 + ts = k.split('_');
  338 + markerLastByNbbm(ts[0], ts[1]);
  339 + }*/
  340 + };
  341 +
  342 +
  343 + /**
  344 + * 更新班次 -只更新数据,不更新dom
  345 + * @param schArr
  346 + */
  347 + var updateData = function (schArr) {
  348 + if (!isArray(schArr))
  349 + schArr = [schArr];
  350 + $.each(schArr, function () {
  351 + if(this.status==-1)
  352 + clearActualTime(this);
  353 + line2Schedule[this.xlBm][this.id] = this;
  354 + });
  355 + };
  356 +
  357 + //update dom
  358 + var updateDom = function (sch) {
  359 + if (!sch) return;
  360 + var dl = $('li.line_schedule[data-id=' + sch.xlBm + '] .ct_table_body dl[data-id=' + sch.id + ']');
  361 + var dds = $('dd', dl);
  362 + $(dds[1]).find('a').text(sch.lpName);
  363 + var light = !sch.qdzArrDatesj ? 'tl-white' : 'tl-grey';
  364 + if (sch.rfidState & 1 == 1) {
  365 + light = 'tl-yellow';
  366 + if (sch.rfidState & 2 == 2) {
  367 + light = 'tl-green';
  368 + }
  369 + }
  370 + $(dds[2]).style('background', light);
  371 + //车辆自编号
  372 + var $newDds3 = $(temps['line-schedule-nbbm-temp'](sch));
  373 + $(dds[3]).replaceWith($newDds3);
  374 + //车辆双击
  375 + gb_schedule_table_dbclick.carCellClick($newDds3);
  376 + $(dds[4]).text(sch.qdzArrDatejh ? sch.qdzArrDatejh : '');
  377 + $(dds[5]).text(sch.qdzArrDatesj ? sch.qdzArrDatesj : '');
  378 +
  379 + //计发时间
  380 + var d5html = temps['line-schedule-fcsj-temp'](sch);
  381 + if (sch.lpChange == 1) {
  382 + d5html = d5html.replace('</dd>', '') + '<span class="uk-badge uk-badge-success out">换</span>' + '</dd>';
  383 + }
  384 + $(dds[6]).replaceWith(d5html);
  385 + //待发时间
  386 + var dfHtmlStr = sch.dfsj + (sch.late2?'<span class="late-badge">?+'+sch.lateMinute+'</span>':'');
  387 + $(dds[7]).attr('data-sort-val', sch.dfsjT).attr('dbclick-val', sch.dfsj).html(dfHtmlStr);
  388 +
  389 + //实发时间
  390 + calc_sch_real_shift(sch);
  391 + var sfsjDd = $(temps['line-schedule-sfsj-temp'](sch));
  392 + //双击
  393 + gb_schedule_table_dbclick.sfsjCellClick(sfsjDd);
  394 + $(dds[8]).replaceWith(sfsjDd);
  395 + if (sch.remarks)
  396 + $(dds[9]).html('<span title="' + sch.remarks + '" data-uk-tooltip="{pos:\'top-left\'}">' + sch.remarks + '</span>');
  397 + else
  398 + $(dds[9]).html('');
  399 +
  400 + //信号状态标记
  401 + gb_signal_state.marker_sch(sch);
  402 + //班次是车辆的最后一班
  403 + if (dl.hasClass('dl-last-sch'))
  404 + markerLastSch([sch]);
  405 +
  406 + renderCarRemark();
  407 + };
  408 +
  409 + //单击实发单元格显示详细信息
  410 + $(document).on('click', 'dd.fcsjActualCell', function () {
  411 + var that = this;
  412 + $(that).qtip({
  413 + show: true,
  414 + content: {
  415 + text: function (e) {
  416 + var lineCode = $(that).parents('li.line_schedule').data('id')
  417 + , id = $(that).parents('dl').data('id')
  418 + , sch = line2Schedule[lineCode][id];
  419 + return temps['sfsj_sch-detail-temp'](sch);
  420 + }
  421 + }
  422 + , style: {
  423 + classes: 'qtip-dark qtip-rounded qtip-shadow'
  424 + },
  425 + hide: {
  426 + fixed: true,
  427 + delay: 300
  428 + },
  429 + position: {
  430 + target: that,
  431 + my: 'center left',
  432 + at: 'center right'
  433 + },
  434 + events: {
  435 + hidden: function (event, api) {
  436 + $(this).qtip('destroy', true);
  437 + }
  438 + }
  439 + });
  440 +
  441 + //车辆rect 闪烁、
  442 + var wrap = $(that).parents('li.line_schedule');
  443 + var nbbm = $(that).parents('dl').find('dd:eq(2)').data('nbbm');
  444 + var device = gb_data_basic.nbbm2deviceMap()[nbbm];
  445 + var $rect = $('svg.line-chart g.gps-wrap rect[_id=rct_' + device + ']', wrap);
  446 +
  447 + //merge_hide
  448 + if ($rect.hasClass('merge_hide') || $rect.attr('y') < 0)
  449 + return;
  450 + $rect.attr('class', 'twinkle').one('animationend', function () {
  451 + $(this).removeAttr('class');
  452 + });
  453 + });
  454 +
  455 + //拖拽选中...
  456 + var seq_nos = '.line-schedule-table .ct_table_body>dl>dd.seq_no';
  457 + var drag_strat;
  458 + $(document).on('mousedown', seq_nos, function (e) {
  459 + if (e.button != 0) return;
  460 + var dl = $(this).parent();
  461 + if (dl.hasClass('drag-active'))
  462 + dl.removeClass('drag-active');
  463 + else
  464 + dl.addClass('drag-active');
  465 +
  466 + drag_strat = parseInt($(this).text()) - 1;
  467 + }).on('mouseup', function () {
  468 + drag_strat = null;
  469 + }).on('mouseover', seq_nos, function () {
  470 + if (drag_strat != null) {
  471 + var e = parseInt($(this).text()),
  472 + dls = $(this).parents('.ct_table_body').find('dl');
  473 +
  474 + reset_drag_active_all(this);
  475 + //向上选中
  476 + if (e <= drag_strat) {
  477 + for (var i = drag_strat; i > e - 2; i--)
  478 + $(dls[i]).addClass('drag-active');
  479 + }
  480 + //向下选中
  481 + else {
  482 + for (var j = drag_strat; j < e; j++)
  483 + $(dls[j]).addClass('drag-active');
  484 + }
  485 + }
  486 + }).on('click', seq_nos, function () {
  487 + reset_relevance_active(this);
  488 + });
  489 + //非seq_no 单元格点击
  490 + $(document).on('click', '.line-schedule-table .ct_table_body dl dd[class!=seq_no][class!=lpName]', function () {
  491 + reset_drag_active_all(this);
  492 + //选中相关班次
  493 + var id = $(this).parent().data('id'),
  494 + contWrap = $(this).parents('li.line_schedule'),
  495 + lineCode = contWrap.data('id'),
  496 + sch = line2Schedule[lineCode][id],
  497 + schArr = gb_common.get_vals(line2Schedule[lineCode]).filter(function (item) {
  498 + return item.clZbh == sch.clZbh;
  499 + }).sort(schedule_sort),
  500 + nextSch, tempDL;
  501 +
  502 + getDl(sch).addClass('intimity');
  503 + $.each(schArr, function (i) {
  504 + tempDL = $('dl[data-id=' + this.id + ']', contWrap);
  505 + tempDL.addClass('relevance-active');
  506 + if (i < schArr.length - 1 && this.id == id) {
  507 + nextSch = schArr[i + 1];
  508 + }
  509 + });
  510 +
  511 + if (nextSch) {
  512 + $('dl[data-id=' + nextSch.id + ']', contWrap).addClass('intimity');
  513 + /*if (nextSch.xlDir == sch.xlDir)
  514 + return;*/
  515 + //滚动到下一个班次
  516 + if(nextSch.xlDir != sch.xlDir)
  517 + scroToDl(nextSch);
  518 +
  519 + }
  520 +
  521 + //如果有打开轨迹回放
  522 + if($('.layui-layer.play_back-layer').is(':visible')){
  523 + gb_map_play_back.setParam(sch);
  524 + }
  525 + });
  526 +
  527 + //路牌点击
  528 + $(document).on('click', '.line-schedule-table .ct_table_body dl dd[class=lpName]', function () {
  529 + reset_drag_active_all(this);
  530 + //选中路牌下相关班次
  531 + var id = $(this).parent().data('id'),
  532 + contWrap = $(this).parents('li.line_schedule'),
  533 + lineCode = contWrap.data('id'),
  534 + sch = line2Schedule[lineCode][id],
  535 + schArr = gb_common.get_vals(line2Schedule[lineCode]).filter(function (item) {
  536 + return item.lpName == sch.lpName;
  537 + }).sort(schedule_sort);
  538 + $.each(schArr, function (i) {
  539 + $('dl[data-id=' + this.id + ']', contWrap).addClass('relevance-active intimity');
  540 + });
  541 +
  542 + //notify_succ('高亮路牌 ' + sch.lpName);
  543 + showLpMileageTip(lineCode, sch.lpName, schArr);
  544 + });
  545 +
  546 + var showLpMileageTipBySch = function (sch) {
  547 + if(!$('.mileage_elec_panel', $('.line_schedule[data-id='+sch.xlBm+']')).is(':visible'))
  548 + return;
  549 +
  550 + var schArr = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (item) {
  551 + return item.lpName == sch.lpName;
  552 + }).sort(schedule_sort);
  553 +
  554 + showLpMileageTip(sch.xlBm, sch.lpName, schArr);
  555 + };
  556 + /**
  557 + * 弹出路牌公里统计tip
  558 + * @param lineCode
  559 + * @param lpName
  560 + * @param array
  561 + */
  562 + var showLpMileageTip = function (lineCode, lpName, array) {
  563 + var wrap = $('.line_schedule[data-id='+lineCode+']');
  564 + //按驾驶员&车辆分组统计
  565 + var data=mileageTipGroupData(array);
  566 + //统计公里
  567 + var list=[];
  568 + for(var key in data){
  569 + list.push({
  570 + key : key,
  571 + serviceMileage: gb_sch_mileage_count.serviceMileage(data[key]),
  572 + destroyMileage: gb_sch_mileage_count.destroyMileage(data[key]),
  573 + emptyMileage: gb_sch_mileage_count.emptyMileage(data[key])
  574 + })
  575 + }
  576 + var htmlStr = temps['sch-lp-mileage-tip-temp']({data: list, lpName:lpName});
  577 + $('.mileage_elec_panel', wrap).html(htmlStr).addClass('uk-animation-slide-bottom').show()
  578 + .one('animationEnd', function () {
  579 + $(this).removeClass('uk-animation-slide-bottom');
  580 + });
  581 + };
  582 +
  583 + /**
  584 + * 分组数据,处理子任务里的中途换车
  585 + * @param array
  586 + */
  587 + var mileageTipGroupData = function (arr) {
  588 + var list = JSON.parse(JSON.stringify(arr));
  589 + var cts;
  590 + var zthcArray=[];
  591 + var sch;
  592 + for(var i=0,len=list.length;i<len;i++){
  593 + sch = list[i];
  594 + cts = sch['cTasks'];
  595 + if(!cts || cts.length==0)
  596 + continue;
  597 +
  598 + sch['cTasks'] = [];
  599 + //有子任务
  600 + for(var j=0,ct;ct=cts[j++];){
  601 + if(!ct.nbbm || ct.nbbm==sch.clZbh){
  602 + sch['cTasks'].push(ct);
  603 + continue;
  604 + }
  605 +
  606 + zthcArray.push(cloneByCTask(sch, ct));
  607 + }
  608 + }
  609 +
  610 + if(zthcArray.length > 0)
  611 + list = list.concat(zthcArray);
  612 +
  613 + var data={},key;
  614 + for(var i=0,len=list.length;i<len;i++){
  615 + key = list[i].clZbh+'/'+list[i].jGh+'('+list[i].jName+')';
  616 + if(!data[key])
  617 + data[key] = [];
  618 + data[key].push(list[i]);
  619 + }
  620 + return data;
  621 + };
  622 +
  623 + var cloneByCTask = function (sch, ct) {
  624 + var newObj = JSON.parse(JSON.stringify(sch));
  625 + newObj['cTasks']=[];
  626 + newObj.clZbh = ct.nbbm;
  627 + newObj.fcsjActual = ct.startDate;
  628 + newObj.zdsjActual = ct.endDate;
  629 + newObj.jhlc = ct.mileage;
  630 + newObj.jhlcOrig = ct.mileage;
  631 +
  632 + if(ct.type2=='1')
  633 + newObj.bcType='normal';
  634 + else if(ct.type2=='2'){
  635 + newObj.bcType='in';
  636 + }else if(ct.type2=='3')
  637 + newObj.bcType='out';
  638 +
  639 + return newObj;
  640 + };
  641 +
  642 + //头部点击去掉选中光标
  643 + $(document).on('click', '.header-title', function () {
  644 + reset_drag_active_all(this);
  645 + });
  646 +
  647 + var scroToDl = function (sch) {
  648 + var dl = getDl(sch),
  649 + cont = dl.parents('.ct_table_wrap'),
  650 + diff = cont.height() / 2;
  651 + cont.animate({
  652 + scrollTop: dl.offset().top - cont.offset().top + cont.scrollTop() - diff
  653 + }, 500);
  654 +
  655 + return dl;
  656 + };
  657 +
  658 + var getDl = function (sch) {
  659 + return $('dl[data-id=' + sch.id + ']', $('.line_schedule[data-id=' + sch.xlBm + ']'));
  660 + };
  661 +
  662 + var reset_drag_active_all = function (dd) {
  663 + $(dd).parents('.schedule-wrap').find('dl.drag-active').removeClass('drag-active');
  664 + reset_relevance_active(dd);
  665 +
  666 + $('.mileage_elec_panel', $(dd).parents('.top-container')).hide().remove('uk-animation-slide-bottom');
  667 + };
  668 +
  669 + var reset_relevance_active = function (dd) {
  670 + $(dd).parents('.uk-grid.schedule-wrap').find('.relevance-active').removeClass('relevance-active intimity');
  671 + };
  672 +
  673 +
  674 + //计算应发未发数量 car_yfwf_map
  675 + var calc_yfwf_num = function (lineCode) {
  676 +
  677 + var schArr = gb_common.get_vals(line2Schedule[lineCode]).sort(schedule_sort),
  678 + yfwf_num = 0,
  679 + t = new Date().valueOf();
  680 +
  681 + var carYfwfMap = {}, nbbm;
  682 + $.each(schArr, function () {
  683 + /*if (this.dfsjT > t)
  684 + return false;*/
  685 +
  686 + if (this.dfsjT < t &&
  687 + this.fcsjActual == null && this.fcsjActualTime == null && this.status != -1) {
  688 + yfwf_num++;
  689 + nbbm = this.clZbh;
  690 + if (carYfwfMap[nbbm])
  691 + carYfwfMap[nbbm]++;
  692 + else
  693 + carYfwfMap[nbbm] = 1;
  694 + }
  695 + });
  696 + car_yfwf_map[lineCode] = carYfwfMap;
  697 +
  698 + $('#badge_yfwf_num_' + lineCode).text(yfwf_num);
  699 + };
  700 +
  701 + //标记终点时间 -线路
  702 + var markerLastByLine = function (lineCode) {
  703 + var data = gb_common.groupBy(gb_common.get_vals(line2Schedule[lineCode]).filter(schDestroyFilter), 'lpName');
  704 +
  705 + var array, lastSch, dl;
  706 + for (var nbbm in data) {
  707 + array = data[nbbm].sort(schedule_sort);
  708 + markerLastSch(array);
  709 + }
  710 + };
  711 +
  712 + //标记终点时间 -车辆
  713 + var markerLastByNbbm = function (lineCode, nbbm) {
  714 + var array = gb_common.get_vals(line2Schedule[lineCode]).filter(function (a) {
  715 + return a.clZbh == nbbm && a.status != -1;
  716 + }).sort(schedule_sort);
  717 +
  718 + removeMarkers(lineCode, array);
  719 + markerLastSch(array);
  720 + };
  721 +
  722 + var markerLastSch = function (array) {
  723 + var lastSch = array[array.length - 1];
  724 +
  725 + if (!lastSch.jhlc)
  726 + return;
  727 +
  728 + var dl = getDl(lastSch);
  729 + dl.addClass('dl-last-sch');
  730 +
  731 + $('dd.fcsjActualCell', dl).append(temps['last-sch-sunken-temp'](lastSch));
  732 + };
  733 +
  734 + //清除线路下指定班次的 末班标记
  735 + var removeMarkers = function (lineCode, array) {
  736 + var idx = [];
  737 + $.each(array, function () {
  738 + idx.push(this.id);
  739 + });
  740 +
  741 + $('dl.dl-last-sch', 'li.line_schedule[data-id=' + lineCode + ']').each(function () {
  742 + if ($(this).hasClass('dl-last-sch') && idx.indexOf($(this).data('id'))) {
  743 + $(this).removeClass('dl-last-sch').find('.last-sch-sunken').remove();
  744 + }
  745 + });
  746 + };
  747 +
  748 + var schDestroyFilter = function (a) {
  749 + return a.status != -1;
  750 + };
  751 +
  752 + /* 下一个班次 */
  753 + var getNextSch = function (sch) {
  754 + var array = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (a) {
  755 + return a.clZbh == sch.clZbh;
  756 + }).sort(schedule_sort);
  757 +
  758 + for (var i = 0, item; item = array[i++];) {
  759 + if (array[i].id == sch.id) {
  760 + return i < array.length ? array[i + 1] : null;
  761 + }
  762 + }
  763 + };
  764 +
  765 + /* 下一个班次普通班次 */
  766 + var getNextNormalSch = function (sch) {
  767 +
  768 + var array = gb_common.get_vals(line2Schedule[sch.xlBm]).filter(function (a) {
  769 + return a.clZbh == sch.clZbh && a.bcType=='normal';
  770 + }).sort(schedule_sort);
  771 +
  772 + for (var i = 0; i < array.length; i++) {
  773 + if (array[i].id == sch.id) {
  774 + return i < array.length ? array[i + 1] : null;
  775 + }
  776 + }
  777 + };
  778 +
  779 + /** 添加备注信息 */
  780 + var addRemarks = function (list, remarks) {
  781 + //if(!list || list)
  782 + var i = 0, sch;
  783 +
  784 + (function () {
  785 + var f = arguments.callee;
  786 + if(i >= list.length){
  787 + return;
  788 + }
  789 + sch = list[i];
  790 + gb_common.$post('/realSchedule/addRemarks', {id: sch.id, remarks: remarks}, function (rs) {
  791 + if(rs.t){
  792 + sch = rs.t;
  793 + line2Schedule[sch.xlBm][sch.id] = sch;
  794 + updateDom(sch);
  795 + i++;
  796 + f();
  797 + }
  798 + });
  799 + })();
  800 + };
  801 +
  802 + /**
  803 + * 显示误点停靠时间标记
  804 + * @param id
  805 + * @param minute
  806 + */
  807 + var showLateBadge = function (lineCode, id, minute) {
  808 + var dfCell = cancelLateBadge(lineCode, id);
  809 + $(dfCell).append('<span class="late-badge">?+'+minute+'</span>');
  810 + };
  811 +
  812 + /**
  813 + * 取消误点标记
  814 + * @param lineCode
  815 + * @param id
  816 + */
  817 + var cancelLateBadge = function (lineCode, id) {
  818 + var $dl = getDl({id: id, xlBm: lineCode});
  819 + var dfCell = $dl.find('dd')[6];
  820 + $('.late-badge',dfCell).remove();
  821 + return dfCell;
  822 + };
  823 +
  824 +
  825 + /**
  826 + * 刷新页面的所有线路班次
  827 + */
  828 + var refreshAll = function () {
  829 + show();
  830 + };
  831 +
  832 + /**
  833 + * 获取线路下营运的车辆
  834 + */
  835 + var findNbbmByLineCode = function (lineCode) {
  836 + try{
  837 + return gb_common.get_keys(gb_common.extractNbbm(gb_common.get_vals(line2Schedule[lineCode])));
  838 + }catch (e){
  839 + return [];
  840 + }
  841 + };
  842 +
  843 + var clearActualTime = function (sch) {
  844 + try{
  845 + sch.fcsjActual=null;
  846 + sch.fcsjActualTime=null;
  847 + sch.zdsjActual=null;
  848 + sch.zdsjActualTime=null;
  849 + }catch (e){
  850 + console.log(e);
  851 + }
  852 + };
  853 +
  854 + /**
  855 + * 班次站点编码异常信息
  856 + * @param list
  857 + */
  858 + var putSCodeErrorInfo = function (list) {
  859 + //按线路走向分组
  860 + var data = {};
  861 + var k;
  862 + for(var i=0,obj;obj=list[i++];){
  863 + k = obj.lineCode+'_'+obj.upDown;
  864 +
  865 + if(obj.realStationCode && obj.realStationCode.indexOf('^') != -1)
  866 + obj.realStationCode = obj.realStationCode.split('^')[0];
  867 +
  868 + if(!data[k])
  869 + data[k] = [];
  870 + data[k].push(obj);
  871 + }
  872 +
  873 + var wrap;
  874 + for(var k in data){
  875 + wrap = $('.line_schedule[data-id=' + (k.split('_')[0]) + ']');
  876 + if(wrap.length==0)
  877 + continue;
  878 +
  879 + $(".schedule-wrap span.warn_multi_station[data-updown="+(k.split('_')[1])+"]", wrap)
  880 + .html('o(* ̄▽ ̄*)o 班次和站点关联有点问题!!').show();
  881 + }
  882 +
  883 + errorCodeData = data;
  884 + };
  885 +
  886 + var findSCodeErrorInfo = function (lineCode, upDown) {
  887 + return errorCodeData[lineCode+'_'+upDown];
  888 + };
  889 +
  890 + var refreshRfid = function (sch) {
  891 + var $dl = getDl({id: sch.id, xlBm: sch.xlBm});
  892 + var dfCell = $dl.find('dd')[2];
  893 + var light = !sch.qdzArrDatesj ? 'tl-white' : 'tl-grey';
  894 + if (sch.rfidState & 1 == 1) {
  895 + light = 'tl-yellow';
  896 + if (sch.rfidState & 2 == 2) {
  897 + light = 'tl-green';
  898 + }
  899 + }
  900 + $(dfCell).attr('class', light);
  901 + };
  902 +
  903 + return {
  904 + show: show,
  905 + findScheduleByLine: findScheduleByLine,
  906 + updateSchedule: updateSchedule,
  907 + updateData: updateData,
  908 + deheteSchedule: deheteSchedule,
  909 + insertSchedule: insertSchedule,
  910 + schedule_sort: schedule_sort,
  911 + calc_yfwf_num: calc_yfwf_num,
  912 + car_yfwf_map: function (lineCode) {
  913 + return car_yfwf_map[lineCode];
  914 + },
  915 + scroToDl: scroToDl,
  916 + reset_drag_active_all: reset_drag_active_all,
  917 + getDl: getDl,
  918 + getNextSch: getNextSch,
  919 + addRemarks: addRemarks,
  920 + reLoadAndRefresh: reLoadAndRefresh,
  921 + showLateBadge: showLateBadge,
  922 + cancelLateBadge: cancelLateBadge,
  923 + refreshAll: refreshAll,
  924 + getNextNormalSch: getNextNormalSch,
  925 + findNbbmByLineCode:findNbbmByLineCode,
  926 + showLpMileageTipBySch: showLpMileageTipBySch,
  927 + renderCarRemark: renderCarRemark,
  928 + putSCodeErrorInfo: putSCodeErrorInfo,
  929 + findSCodeErrorInfo: findSCodeErrorInfo,
  930 + refreshRfid: refreshRfid
  931 + };
  932 +})();