Commit 7dfd8bc865828f2bf4bc701dc16b1a8ac1888810

Authored by 徐烜
1 parent 44301ffb

时刻表预览更新

1、添加到达时间
2、在头部添加上行下行的起站点和终点站说明
3、点击任何一个班次,高亮显示并且下一个班次也高亮并移动到列表中间
src/main/resources/static/pages/scheduleApp/module/common/dts2/ttinfotable/saTimeTablePreView.js
... ... @@ -18,6 +18,21 @@ angular.module("ScheduleApp").directive(
18 18 controller : function() {
19 19 var self = this;
20 20  
  21 + // 内部班次时刻模型
  22 + self.internalBcModel = {
  23 + up_qdz_name : "", // 上行起点站名字
  24 + down_qdz_name : "", // 下行起点站名字
  25 + up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
  26 + down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
  27 + };
  28 +
  29 + // 内部各个路牌block车次链模型
  30 + self.internalLpBlockModel = {
  31 + // key:路牌名字
  32 + // value: 数组(按照发车时间排序)
  33 + // value 数据内对象 {fcsj:发车时间,isUp:是否上行,fcno:发车顺序号,index:对应的班次列表索引}
  34 + };
  35 +
21 36 // TODO:
22 37 },
23 38  
... ... @@ -34,15 +49,274 @@ angular.module("ScheduleApp").directive(
34 49 throw new Error("saTimeTablePreview指令 name属性required");
35 50 }
36 51  
  52 + // 内部controlAs名字
  53 + var ctrlAs = "$saTimeTablePreviewCtrl";
  54 +
37 55 // TODO:
38 56  
  57 + //------------------ 内部方法 --------------------//
  58 + var date_wrap_prefix = "2000-01-01 "; // 包装日期的前缀
  59 + var date_wrap_format = "YYYY-MM-DD HH:mm"; // 日期格式
  60 + /**
  61 + * 将时间包装成日期,方便计算。
  62 + * @param timeStr 时间格式,如 06:30
  63 + * @returns moment对象
  64 + */
  65 + var _fun_WrapTime = function(timeStr) {
  66 + return moment(
  67 + date_wrap_prefix + timeStr,
  68 + date_wrap_format
  69 + );
  70 + };
  71 +
  72 + /**
  73 + * 点击班次html元素(dl),触发班次移动,如下:
  74 + * 1、点击上行班次,下一个下行班次在下行班次列表中移到中间位置
  75 + * 2、点击下行班次,下一个上行班次在上行班次列表中移到中间位置
  76 + * @param ctrl 内部控制器
  77 + * @param index 班次索引
  78 + * @param isUp 是否上行
  79 + * @private
  80 + */
  81 + var _fun_bcDDViewMove = function(ctrl, index, isUp) {
  82 + // 获取当前点击班次对象
  83 + var oBc;
  84 + if (isUp) {
  85 + oBc = ctrl.internalBcModel.up_bc_list_asc[index];
  86 + } else {
  87 + oBc = ctrl.internalBcModel.down_bc_list_asc[index];
  88 + }
  89 +
  90 + // 找出车次链中的下一个班次索引,没有就undefined
  91 + var nextIndex = undefined;
  92 + var nextBlockBc = undefined;
  93 + var currentBlockBcIndex = undefined;
  94 + angular.forEach(ctrl.internalLpBlockModel[oBc.lpName], function(data, i) {
  95 + if (data.fcsj == oBc.fcsj) {
  96 + currentBlockBcIndex = i;
  97 + }
  98 + });
  99 + if (currentBlockBcIndex != undefined &&
  100 + currentBlockBcIndex < (ctrl.internalLpBlockModel[oBc.lpName].length - 1)) {
  101 + nextBlockBc = ctrl.internalLpBlockModel[oBc.lpName][currentBlockBcIndex + 1];
  102 + nextIndex = nextBlockBc.index;
  103 + }
  104 + // 先删除click标记,再添加
  105 + angular.forEach(ctrl.internalBcModel.up_bc_list_asc, function(data) {
  106 + delete data["isClick"];
  107 + });
  108 + angular.forEach(ctrl.internalBcModel.down_bc_list_asc, function(data) {
  109 + delete data["isClick"];
  110 + });
  111 + oBc.isClick = true;
  112 + if (nextIndex) {
  113 + if (nextBlockBc.isUp) {
  114 + ctrl.internalBcModel.up_bc_list_asc[nextIndex].isClick = true;
  115 + } else {
  116 + ctrl.internalBcModel.down_bc_list_asc[nextIndex].isClick = true;
  117 + }
  118 + }
  119 +
  120 + // 移动,同方向不移动
  121 + var clientHeight = angular.element("#temp").height() - 34;
  122 + if (nextBlockBc && isUp != nextBlockBc.isUp) {
  123 + if (isUp) { // 移动下行
  124 + angular.element(".ttpv_table_scrollbar:eq(1)").animate(
  125 + {scrollTop : nextIndex * 30 - clientHeight / 2}, 400);
  126 + } else { // 移动上行
  127 + angular.element(".ttpv_table_scrollbar:eq(0)").animate(
  128 + {scrollTop : nextIndex * 30 - clientHeight / 2}, 400);
  129 + }
  130 + }
  131 +
  132 + };
  133 +
  134 + /**
  135 + * 刷新内部数据。
  136 + * @param ctrl 内部控制器对象($saTimeTablePreviewCtrl)
  137 + * @private
  138 + */
  139 + var _fun_refreshInternalModel = function(ctrl) {
  140 + // 初始化内部数据
  141 + ctrl.internalBcModel = {
  142 + up_qdz_name : "", // 上行起点站名字
  143 + up_zdz_name : "", // 上行终点站名字
  144 + down_qdz_name : "", // 下行起点站名字
  145 + down_zdz_name : "", // 下行终点站名字
  146 + up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
  147 + down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
  148 + };
  149 + ctrl.internalLpBlockModel = {
  150 +
  151 + };
  152 +
  153 + // ngModel传入的数据
  154 + var dataSource = ctrl.ds.bcList;
  155 +
  156 + // 构造上下行班次列表,并确定上下行的首发站点
  157 + angular.forEach(dataSource, function(bcObj) {
  158 + var _internalBcObj = {};
  159 + // 构造内部班次对象
  160 + _internalBcObj.lpName = bcObj.lp.lpName; // 路牌
  161 + _internalBcObj.fcsj = bcObj.fcsj; // 发车时间
  162 + _internalBcObj.ddsj = _fun_WrapTime(bcObj.fcsj).add(bcObj.bcsj, "m").format("HH:mm");
  163 + _internalBcObj.qdzName = bcObj.qdzName; // 起点站名字
  164 + _internalBcObj.zdzName = bcObj.zdzName; // 终点站名字
  165 + _internalBcObj.bcType = bcObj.bcType; // 班次类型
  166 + _internalBcObj.isTs = bcObj.isTS; // 是否停驶
  167 + _internalBcObj.isFb = bcObj.isFB; // 是否分班
  168 + _internalBcObj.remark = bcObj.remark; // 备注
  169 + _internalBcObj._fcno = bcObj.fcno; // 发车顺序号
  170 +
  171 + if (bcObj.xlDir == "0") { // 上行
  172 + ctrl.internalBcModel.up_bc_list_asc.push(_internalBcObj);
  173 + // 确定起点站
  174 + if (ctrl.internalBcModel.up_qdz_name == "") {
  175 + if (bcObj.bcType == "normal") {
  176 + ctrl.internalBcModel.up_qdz_name = bcObj.qdzName;
  177 + }
  178 + }
  179 + // 确定终点站
  180 + if (ctrl.internalBcModel.up_zdz_name == "") {
  181 + if (bcObj.bcType == "normal") {
  182 + ctrl.internalBcModel.up_zdz_name = bcObj.zdzName;
  183 + }
  184 + }
  185 + }
  186 + if (bcObj.xlDir == "1") { // 下行
  187 + ctrl.internalBcModel.down_bc_list_asc.push(_internalBcObj);
  188 + // 确定起点站
  189 + if (ctrl.internalBcModel.down_qdz_name == "") {
  190 + if (bcObj.bcType == "normal") {
  191 + ctrl.internalBcModel.down_qdz_name = bcObj.qdzName;
  192 + }
  193 + }
  194 + // 确定终点站
  195 + if (ctrl.internalBcModel.down_zdz_name == "") {
  196 + if (bcObj.bcType == "normal") {
  197 + ctrl.internalBcModel.down_zdz_name = bcObj.zdzName;
  198 + }
  199 + }
  200 + }
  201 +
  202 + });
  203 +
  204 + // 发车时间升序排序上行班次
  205 + ctrl.internalBcModel.up_bc_list_asc.sort(function(a, b) {
  206 + var a_wrapTime = _fun_WrapTime(a.fcsj);
  207 + var b_wrapTime = _fun_WrapTime(b.fcsj);
  208 +
  209 + // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
  210 + // TODO:以后要配合首班车的发车时间判定
  211 + if (a.fcsj.indexOf("00:") == 0 ||
  212 + a.fcsj.indexOf("01:") == 0 ||
  213 + a.fcsj.indexOf("02:") == 0) {
  214 + a_wrapTime.add(1, "day");
  215 + }
  216 + if (b.fcsj.indexOf("00:") == 0 ||
  217 + b.fcsj.indexOf("01:") == 0 ||
  218 + b.fcsj.indexOf("02:") == 0) {
  219 + b_wrapTime.add(1, "day");
  220 + }
  221 +
  222 + if (a_wrapTime.isBefore(b_wrapTime)) {
  223 + return -1;
  224 + } else if (a_wrapTime.isAfter(b_wrapTime)) {
  225 + return 1;
  226 + } else {
  227 + return 0;
  228 + }
  229 +
  230 + });
  231 + // 发车时间升序排序下行班次
  232 + ctrl.internalBcModel.down_bc_list_asc.sort(function(a, b) {
  233 + var a_wrapTime = _fun_WrapTime(a.fcsj);
  234 + var b_wrapTime = _fun_WrapTime(b.fcsj);
  235 +
  236 + // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
  237 + // TODO:以后要配合首班车的发车时间判定
  238 + if (a.fcsj.indexOf("00:") == 0 ||
  239 + a.fcsj.indexOf("01:") == 0 ||
  240 + a.fcsj.indexOf("02:") == 0) {
  241 + a_wrapTime.add(1, "day");
  242 + }
  243 + if (b.fcsj.indexOf("00:") == 0 ||
  244 + b.fcsj.indexOf("01:") == 0 ||
  245 + b.fcsj.indexOf("02:") == 0) {
  246 + b_wrapTime.add(1, "day");
  247 + }
  248 +
  249 + if (a_wrapTime.isBefore(b_wrapTime)) {
  250 + return -1;
  251 + } else if (a_wrapTime.isAfter(b_wrapTime)) {
  252 + return 1;
  253 + } else {
  254 + return 0;
  255 + }
  256 + });
  257 +
  258 + // 构造路牌block车次链,按照发车顺序排序
  259 + angular.forEach(ctrl.internalBcModel.up_bc_list_asc, function(data, index) {
  260 + if (!ctrl.internalLpBlockModel[data.lpName]) {
  261 + ctrl.internalLpBlockModel[data.lpName] = [];
  262 + }
  263 + ctrl.internalLpBlockModel[data.lpName].push({
  264 + fcsj : data.fcsj,
  265 + isUp : true,
  266 + fcno : data._fcno,
  267 + index : index
  268 + });
  269 + });
  270 + angular.forEach(ctrl.internalBcModel.down_bc_list_asc, function(data, index) {
  271 + if (!ctrl.internalLpBlockModel[data.lpName]) {
  272 + ctrl.internalLpBlockModel[data.lpName] = [];
  273 + }
  274 + ctrl.internalLpBlockModel[data.lpName].push({
  275 + fcsj : data.fcsj,
  276 + isUp : false,
  277 + fcno : data._fcno,
  278 + index : index
  279 + });
  280 + });
  281 + angular.forEach(ctrl.internalLpBlockModel, function(value, key) {
  282 + value.sort(function (a, b) {
  283 + if (a.fcno < b.fcno) {
  284 + return -1;
  285 + } else if (a.fcno > b.fcno) {
  286 + return 1;
  287 + } else {
  288 + return 0;
  289 + }
  290 + });
  291 + });
  292 +
  293 +
  294 + };
  295 +
39 296 return {
40 297 pre : function(scope, element, attr) {
41 298 // TODO:
42 299 },
43 300 post : function(scope, element, attr) {
44   - // TODO:
  301 + // 班次html点击事件
  302 + scope[ctrlAs].$$bcDD_Click = function(index, xlDir) {
  303 + _fun_bcDDViewMove(scope[ctrlAs], index, xlDir);
  304 + };
45 305  
  306 + // 监控ngModel绑定的外部数据源的刷新状态变化
  307 + scope.$watch(
  308 + function() {
  309 + return scope[ctrlAs].ds.refreshInfos;
  310 + },
  311 + function(newValue, oldValue) {
  312 + if (newValue === undefined && oldValue === undefined) {
  313 + return;
  314 + }
  315 + console.log("saTimetable2 refresh");
  316 + _fun_refreshInternalModel(scope[ctrlAs]);
  317 + },
  318 + true
  319 + );
46 320 }
47 321 };
48 322 }
... ...
src/main/resources/static/pages/scheduleApp/module/common/dts2/ttinfotable/saTimeTablePreViewTemplate.html
... ... @@ -65,7 +65,7 @@
65 65 /** 表格样式 */
66 66 .ttpv_table {
67 67 position: relative;
68   - padding-top: 30px;
  68 + padding-top: 34px;
69 69 font-size: 13px;
70 70 }
71 71  
... ... @@ -74,7 +74,6 @@
74 74 /*width: 100%;*/
75 75 margin: 0;
76 76 /*border-bottom: 1px solid;*/
77   - height: 30px;
78 77 cursor: default;
79 78 }
80 79 .ttpv_table dl {
... ... @@ -91,7 +90,7 @@
91 90 overflow: hidden;
92 91 text-overflow: ellipsis;
93 92 height: 100%;
94   - line-height: 30px;
  93 + line-height: 34px;
95 94 border-right: 1px solid;
96 95 text-indent: 5px;
97 96 }
... ... @@ -100,37 +99,22 @@
100 99 font-size: 13px;
101 100 /*border-bottom: 1px solid #dedede;*/
102 101 border-top: 1px solid #dedede;
103   - }
104   -
105   - .ttpv_table dl dt:nth-of-type(1), .ttpv_table dl dd:nth-of-type(1) {
106   - width: 50px;
107   - text-align: center;
108   - }
109   - .ttpv_table dl dt:nth-of-type(2), .ttpv_table dl dd:nth-of-type(2) {
110   - width: 80px;
111   - text-align: center;
112   - }
113   - .ttpv_table dl dt:nth-of-type(3), .ttpv_table dl dd:nth-of-type(3) {
114   - width: 120px;
115   - text-align: left;
116   - }
117   - .ttpv_table dl dt:nth-of-type(4), .ttpv_table dl dd:nth-of-type(4) {
118   - width: 220px;
119 102 text-align: center;
120 103 }
121 104  
122 105 .ttpv_table > .ttpv_table_head {
123 106 position: absolute;
124 107 top: 0;
125   - height: 30px;
  108 + height: 34px;
126 109 background: #f5f5f5;
127 110 /*width: 100%;*/
128   - line-height: 30px;
  111 + line-height: 34px;
129 112 z-index: 1;
130 113 }
131 114 .ttpv_table_head dl {
132 115 border-bottom: 2px solid #96b9d7;
133 116 color: #333333;
  117 + height: 34px;
134 118 background-color: #f5f5f5;
135 119 }
136 120 .ttpv_table_head dl dt {
... ... @@ -138,6 +122,27 @@
138 122 font-size: 12px;
139 123 }
140 124  
  125 + .ttpv_table_head dl dt:nth-of-type(1) {
  126 + width: 50px;
  127 + height: 34px;
  128 + }
  129 + .ttpv_table_head dl dt:nth-of-type(2) {
  130 + width: 55px;
  131 + height: 34px;
  132 + }
  133 + .ttpv_table_head dl dt:nth-of-type(3) {
  134 + width: 120px;
  135 + height: 34px;
  136 + }
  137 + .ttpv_table_head dl dt:nth-of-type(4) {
  138 + width: 100px;
  139 + height: 34px;
  140 + }
  141 + .ttpv_table_head dl dt:nth-of-type(5) {
  142 + width: 200px;
  143 + height: 34px;
  144 + }
  145 +
141 146 .ttpv_table > .ttpv_table_body {
142 147 /*width: 100%;*/
143 148 position: absolute;
... ... @@ -157,12 +162,43 @@
157 162 color: #501a1a !important;
158 163 }
159 164  
  165 + .ttpv_table_body dd.istsClick {
  166 + background: linear-gradient(to right,#8baabf,#105383,#808086)!important;
  167 + }
  168 + .ttpv_table_body dd.regionClick {
  169 + background: linear-gradient(to right,#8baabf,#686d7b,#a09997)!important;
  170 + }
  171 + .ttpv_table_body dd.isfbClick {
  172 + background: linear-gradient(to right,#8baabf,#adff00,#a09997)!important;
  173 + }
  174 +
  175 + .ttpv_table_body dl dd:nth-of-type(1) {
  176 + width: 50px;
  177 + height: 30px;
  178 + }
  179 + .ttpv_table_body dl dd:nth-of-type(2) {
  180 + width: 55px;
  181 + height: 30px;
  182 + }
  183 + .ttpv_table_body dl dd:nth-of-type(3) {
  184 + width: 120px;
  185 + height: 30px;
  186 + text-align: left;
  187 + }
  188 + .ttpv_table_body dl dd:nth-of-type(4) {
  189 + width: 100px;
  190 + height: 30px;
  191 + }
  192 + .ttpv_table_body dl dd:nth-of-type(5) {
  193 + width: 200px;
  194 + height: 30px;
  195 + }
  196 +
160 197 .ttpv_table_body dd:nth-of-type(1) {
161 198 color: #2765A7;
162 199 background: #eae8e8;
163 200 /*border-bottom: 1px solid #b3b3b3;*/
164 201 border-right: 1px solid #b3b3b3;
165   - text-align: center;
166 202 text-indent: -3px;
167 203 }
168 204 .ttpv_table_body dd:nth-of-type(n + 2) {
... ... @@ -177,6 +213,11 @@
177 213 background: linear-gradient(to right, #fafafa, #f5fbff);
178 214 }
179 215  
  216 + .isClick {
  217 + background: #8baabf!important;
  218 + color: #fff!important;
  219 + }
  220 +
180 221 </style>
181 222  
182 223 <style>
... ... @@ -214,9 +255,12 @@
214 255 <div class="detail-panel">
215 256 <div class="detail-wrap" >
216 257 <h3 class="detail-title">
217   - 上行起始站点:{{$saTimeTablePreviewCtrl.ds.up_qdz_name}}
  258 + 上行:
  259 + {{$saTimeTablePreviewCtrl.internalBcModel.up_qdz_name}}
  260 + <i class="fa fa-angle-double-right" aria-hidden="true"></i>
  261 + {{$saTimeTablePreviewCtrl.internalBcModel.up_zdz_name}}
218 262 </h3>
219   - <div class="detail-body">
  263 + <div id="temp" class="detail-body">
220 264 <div class="ttpv_table_wrap ttpv_table_scrollbar" sa-tscrolly2 scrclass = ".upFixHead">
221 265 <div class="ttpv_table">
222 266 <div class="ttpv_table_head upFixHead">
... ... @@ -224,14 +268,25 @@
224 268 <dt>序号</dt>
225 269 <dt>路牌</dt>
226 270 <dt>发车时间</dt>
  271 + <dt>到达时间</dt>
227 272 <dt>备注</dt>
228 273 </dl>
229 274 </div>
230 275 <div class="ttpv_table_body">
231   - <dl ng-repeat="bc in $saTimeTablePreviewCtrl.ds.up_bc_list_asc track by $index">
  276 + <dl ng-repeat="bc in $saTimeTablePreviewCtrl.internalBcModel.up_bc_list_asc track by $index"
  277 + ng-click="$saTimeTablePreviewCtrl.$$bcDD_Click($index, true)">
232 278 <dd>{{$index + 1}}</dd>
233   - <dd>{{bc.lp.lpName}}</dd>
234   - <dd ng-class="{ists: bc.isTS, region: bc.bcType == 'region', isfb: bc.isFB}">
  279 + <dd ng-class="{isClick : bc.isClick}">
  280 + {{bc.lpName}}
  281 + </dd>
  282 + <dd ng-class="{
  283 + ists: (bc.isTs && !bc.isClick),
  284 + istsClick: (bc.isTs && bc.isClick),
  285 + region: (bc.bcType == 'region' && !bc.isClick),
  286 + regionClick : (bc.bcType == 'region' && bc.isClick),
  287 + isfb: (bc.isFb && !bc.isClick),
  288 + isfbClick : (bc.isFb && bc.isClick),
  289 + isClick: bc.isClick}">
235 290 {{bc.fcsj}}
236 291 <span class="badge"
237 292 style="border-radius: 2px !important; background-color: #f9a124;"
... ... @@ -240,7 +295,10 @@
240 295 style="border-radius: 2px !important; background-color: #f9a124;"
241 296 ng-show="bc.bcType == 'in'">进场</span>
242 297 </dd>
243   - <dd>{{bc.remark}}</dd>
  298 + <dd ng-class="{isClick : bc.isClick}">
  299 + {{bc.ddsj}}
  300 + </dd>
  301 + <dd ng-class="{isClick : bc.isClick}">{{bc.remark}}</dd>
244 302 </dl>
245 303 </div>
246 304 </div>
... ... @@ -254,7 +312,10 @@
254 312 <div class="detail-panel">
255 313 <div class="detail-wrap" >
256 314 <h3 class="detail-title">
257   - 下行起始站点:{{$saTimeTablePreviewCtrl.ds.down_qdz_name}}
  315 + 下行:
  316 + {{$saTimeTablePreviewCtrl.internalBcModel.down_qdz_name}}
  317 + <i class="fa fa-angle-double-right" aria-hidden="true"></i>
  318 + {{$saTimeTablePreviewCtrl.internalBcModel.down_zdz_name}}
258 319 </h3>
259 320 <div class="detail-body">
260 321 <div class="ttpv_table_wrap ttpv_table_scrollbar" sa-tscrolly2 scrclass = ".downFixHead">
... ... @@ -264,14 +325,25 @@
264 325 <dt>序号</dt>
265 326 <dt>路牌</dt>
266 327 <dt>发车时间</dt>
  328 + <dt>到达时间</dt>
267 329 <dt>备注</dt>
268 330 </dl>
269 331 </div>
270 332 <div class="ttpv_table_body">
271   - <dl ng-repeat="bc in $saTimeTablePreviewCtrl.ds.down_bc_list_asc track by $index">
  333 + <dl ng-repeat="bc in $saTimeTablePreviewCtrl.internalBcModel.down_bc_list_asc track by $index"
  334 + ng-click="$saTimeTablePreviewCtrl.$$bcDD_Click($index, false)">
272 335 <dd>{{$index + 1}}</dd>
273   - <dd>{{bc.lp.lpName}}</dd>
274   - <dd ng-class="{ists: bc.isTS, region: bc.bcType == 'region', isfb: bc.isFB}">
  336 + <dd ng-class="{isClick : bc.isClick}">
  337 + {{bc.lpName}}
  338 + </dd>
  339 + <dd ng-class="{
  340 + ists: (bc.isTs && !bc.isClick),
  341 + istsClick: (bc.isTs && bc.isClick),
  342 + region: (bc.bcType == 'region' && !bc.isClick),
  343 + regionClick : (bc.bcType == 'region' && bc.isClick),
  344 + isfb: (bc.isFb && !bc.isClick),
  345 + isfbClick : (bc.isFb && bc.isClick),
  346 + isClick: bc.isClick}">
275 347 {{bc.fcsj}}
276 348 <span class="badge"
277 349 style="border-radius: 2px !important; background-color: #f9a124;"
... ... @@ -280,7 +352,10 @@
280 352 style="border-radius: 2px !important; background-color: #f9a124;"
281 353 ng-show="bc.bcType == 'in'">进场</span>
282 354 </dd>
283   - <dd>{{bc.remark}}</dd>
  355 + <dd ng-class="{isClick : bc.isClick}">
  356 + {{bc.ddsj}}
  357 + </dd>
  358 + <dd ng-class="{isClick : bc.isClick}">{{bc.remark}}</dd>
284 359 </dl>
285 360 </div>
286 361 </div>
... ...
src/main/resources/static/pages/scheduleApp/module/common/prj-common-directive.js
... ... @@ -4427,6 +4427,21 @@ angular.module(&quot;ScheduleApp&quot;).directive(
4427 4427 controller : function() {
4428 4428 var self = this;
4429 4429  
  4430 + // 内部班次时刻模型
  4431 + self.internalBcModel = {
  4432 + up_qdz_name : "", // 上行起点站名字
  4433 + down_qdz_name : "", // 下行起点站名字
  4434 + up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
  4435 + down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
  4436 + };
  4437 +
  4438 + // 内部各个路牌block车次链模型
  4439 + self.internalLpBlockModel = {
  4440 + // key:路牌名字
  4441 + // value: 数组(按照发车时间排序)
  4442 + // value 数据内对象 {fcsj:发车时间,isUp:是否上行,fcno:发车顺序号,index:对应的班次列表索引}
  4443 + };
  4444 +
4430 4445 // TODO:
4431 4446 },
4432 4447  
... ... @@ -4443,15 +4458,274 @@ angular.module(&quot;ScheduleApp&quot;).directive(
4443 4458 throw new Error("saTimeTablePreview指令 name属性required");
4444 4459 }
4445 4460  
  4461 + // 内部controlAs名字
  4462 + var ctrlAs = "$saTimeTablePreviewCtrl";
  4463 +
4446 4464 // TODO:
4447 4465  
  4466 + //------------------ 内部方法 --------------------//
  4467 + var date_wrap_prefix = "2000-01-01 "; // 包装日期的前缀
  4468 + var date_wrap_format = "YYYY-MM-DD HH:mm"; // 日期格式
  4469 + /**
  4470 + * 将时间包装成日期,方便计算。
  4471 + * @param timeStr 时间格式,如 06:30
  4472 + * @returns moment对象
  4473 + */
  4474 + var _fun_WrapTime = function(timeStr) {
  4475 + return moment(
  4476 + date_wrap_prefix + timeStr,
  4477 + date_wrap_format
  4478 + );
  4479 + };
  4480 +
  4481 + /**
  4482 + * 点击班次html元素(dl),触发班次移动,如下:
  4483 + * 1、点击上行班次,下一个下行班次在下行班次列表中移到中间位置
  4484 + * 2、点击下行班次,下一个上行班次在上行班次列表中移到中间位置
  4485 + * @param ctrl 内部控制器
  4486 + * @param index 班次索引
  4487 + * @param isUp 是否上行
  4488 + * @private
  4489 + */
  4490 + var _fun_bcDDViewMove = function(ctrl, index, isUp) {
  4491 + // 获取当前点击班次对象
  4492 + var oBc;
  4493 + if (isUp) {
  4494 + oBc = ctrl.internalBcModel.up_bc_list_asc[index];
  4495 + } else {
  4496 + oBc = ctrl.internalBcModel.down_bc_list_asc[index];
  4497 + }
  4498 +
  4499 + // 找出车次链中的下一个班次索引,没有就undefined
  4500 + var nextIndex = undefined;
  4501 + var nextBlockBc = undefined;
  4502 + var currentBlockBcIndex = undefined;
  4503 + angular.forEach(ctrl.internalLpBlockModel[oBc.lpName], function(data, i) {
  4504 + if (data.fcsj == oBc.fcsj) {
  4505 + currentBlockBcIndex = i;
  4506 + }
  4507 + });
  4508 + if (currentBlockBcIndex != undefined &&
  4509 + currentBlockBcIndex < (ctrl.internalLpBlockModel[oBc.lpName].length - 1)) {
  4510 + nextBlockBc = ctrl.internalLpBlockModel[oBc.lpName][currentBlockBcIndex + 1];
  4511 + nextIndex = nextBlockBc.index;
  4512 + }
  4513 + // 先删除click标记,再添加
  4514 + angular.forEach(ctrl.internalBcModel.up_bc_list_asc, function(data) {
  4515 + delete data["isClick"];
  4516 + });
  4517 + angular.forEach(ctrl.internalBcModel.down_bc_list_asc, function(data) {
  4518 + delete data["isClick"];
  4519 + });
  4520 + oBc.isClick = true;
  4521 + if (nextIndex) {
  4522 + if (nextBlockBc.isUp) {
  4523 + ctrl.internalBcModel.up_bc_list_asc[nextIndex].isClick = true;
  4524 + } else {
  4525 + ctrl.internalBcModel.down_bc_list_asc[nextIndex].isClick = true;
  4526 + }
  4527 + }
  4528 +
  4529 + // 移动,同方向不移动
  4530 + var clientHeight = angular.element("#temp").height() - 34;
  4531 + if (nextBlockBc && isUp != nextBlockBc.isUp) {
  4532 + if (isUp) { // 移动下行
  4533 + angular.element(".ttpv_table_scrollbar:eq(1)").animate(
  4534 + {scrollTop : nextIndex * 30 - clientHeight / 2}, 400);
  4535 + } else { // 移动上行
  4536 + angular.element(".ttpv_table_scrollbar:eq(0)").animate(
  4537 + {scrollTop : nextIndex * 30 - clientHeight / 2}, 400);
  4538 + }
  4539 + }
  4540 +
  4541 + };
  4542 +
  4543 + /**
  4544 + * 刷新内部数据。
  4545 + * @param ctrl 内部控制器对象($saTimeTablePreviewCtrl)
  4546 + * @private
  4547 + */
  4548 + var _fun_refreshInternalModel = function(ctrl) {
  4549 + // 初始化内部数据
  4550 + ctrl.internalBcModel = {
  4551 + up_qdz_name : "", // 上行起点站名字
  4552 + up_zdz_name : "", // 上行终点站名字
  4553 + down_qdz_name : "", // 下行起点站名字
  4554 + down_zdz_name : "", // 下行终点站名字
  4555 + up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
  4556 + down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
  4557 + };
  4558 + ctrl.internalLpBlockModel = {
  4559 +
  4560 + };
  4561 +
  4562 + // ngModel传入的数据
  4563 + var dataSource = ctrl.ds.bcList;
  4564 +
  4565 + // 构造上下行班次列表,并确定上下行的首发站点
  4566 + angular.forEach(dataSource, function(bcObj) {
  4567 + var _internalBcObj = {};
  4568 + // 构造内部班次对象
  4569 + _internalBcObj.lpName = bcObj.lp.lpName; // 路牌
  4570 + _internalBcObj.fcsj = bcObj.fcsj; // 发车时间
  4571 + _internalBcObj.ddsj = _fun_WrapTime(bcObj.fcsj).add(bcObj.bcsj, "m").format("HH:mm");
  4572 + _internalBcObj.qdzName = bcObj.qdzName; // 起点站名字
  4573 + _internalBcObj.zdzName = bcObj.zdzName; // 终点站名字
  4574 + _internalBcObj.bcType = bcObj.bcType; // 班次类型
  4575 + _internalBcObj.isTs = bcObj.isTS; // 是否停驶
  4576 + _internalBcObj.isFb = bcObj.isFB; // 是否分班
  4577 + _internalBcObj.remark = bcObj.remark; // 备注
  4578 + _internalBcObj._fcno = bcObj.fcno; // 发车顺序号
  4579 +
  4580 + if (bcObj.xlDir == "0") { // 上行
  4581 + ctrl.internalBcModel.up_bc_list_asc.push(_internalBcObj);
  4582 + // 确定起点站
  4583 + if (ctrl.internalBcModel.up_qdz_name == "") {
  4584 + if (bcObj.bcType == "normal") {
  4585 + ctrl.internalBcModel.up_qdz_name = bcObj.qdzName;
  4586 + }
  4587 + }
  4588 + // 确定终点站
  4589 + if (ctrl.internalBcModel.up_zdz_name == "") {
  4590 + if (bcObj.bcType == "normal") {
  4591 + ctrl.internalBcModel.up_zdz_name = bcObj.zdzName;
  4592 + }
  4593 + }
  4594 + }
  4595 + if (bcObj.xlDir == "1") { // 下行
  4596 + ctrl.internalBcModel.down_bc_list_asc.push(_internalBcObj);
  4597 + // 确定起点站
  4598 + if (ctrl.internalBcModel.down_qdz_name == "") {
  4599 + if (bcObj.bcType == "normal") {
  4600 + ctrl.internalBcModel.down_qdz_name = bcObj.qdzName;
  4601 + }
  4602 + }
  4603 + // 确定终点站
  4604 + if (ctrl.internalBcModel.down_zdz_name == "") {
  4605 + if (bcObj.bcType == "normal") {
  4606 + ctrl.internalBcModel.down_zdz_name = bcObj.zdzName;
  4607 + }
  4608 + }
  4609 + }
  4610 +
  4611 + });
  4612 +
  4613 + // 发车时间升序排序上行班次
  4614 + ctrl.internalBcModel.up_bc_list_asc.sort(function(a, b) {
  4615 + var a_wrapTime = _fun_WrapTime(a.fcsj);
  4616 + var b_wrapTime = _fun_WrapTime(b.fcsj);
  4617 +
  4618 + // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
  4619 + // TODO:以后要配合首班车的发车时间判定
  4620 + if (a.fcsj.indexOf("00:") == 0 ||
  4621 + a.fcsj.indexOf("01:") == 0 ||
  4622 + a.fcsj.indexOf("02:") == 0) {
  4623 + a_wrapTime.add(1, "day");
  4624 + }
  4625 + if (b.fcsj.indexOf("00:") == 0 ||
  4626 + b.fcsj.indexOf("01:") == 0 ||
  4627 + b.fcsj.indexOf("02:") == 0) {
  4628 + b_wrapTime.add(1, "day");
  4629 + }
  4630 +
  4631 + if (a_wrapTime.isBefore(b_wrapTime)) {
  4632 + return -1;
  4633 + } else if (a_wrapTime.isAfter(b_wrapTime)) {
  4634 + return 1;
  4635 + } else {
  4636 + return 0;
  4637 + }
  4638 +
  4639 + });
  4640 + // 发车时间升序排序下行班次
  4641 + ctrl.internalBcModel.down_bc_list_asc.sort(function(a, b) {
  4642 + var a_wrapTime = _fun_WrapTime(a.fcsj);
  4643 + var b_wrapTime = _fun_WrapTime(b.fcsj);
  4644 +
  4645 + // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
  4646 + // TODO:以后要配合首班车的发车时间判定
  4647 + if (a.fcsj.indexOf("00:") == 0 ||
  4648 + a.fcsj.indexOf("01:") == 0 ||
  4649 + a.fcsj.indexOf("02:") == 0) {
  4650 + a_wrapTime.add(1, "day");
  4651 + }
  4652 + if (b.fcsj.indexOf("00:") == 0 ||
  4653 + b.fcsj.indexOf("01:") == 0 ||
  4654 + b.fcsj.indexOf("02:") == 0) {
  4655 + b_wrapTime.add(1, "day");
  4656 + }
  4657 +
  4658 + if (a_wrapTime.isBefore(b_wrapTime)) {
  4659 + return -1;
  4660 + } else if (a_wrapTime.isAfter(b_wrapTime)) {
  4661 + return 1;
  4662 + } else {
  4663 + return 0;
  4664 + }
  4665 + });
  4666 +
  4667 + // 构造路牌block车次链,按照发车顺序排序
  4668 + angular.forEach(ctrl.internalBcModel.up_bc_list_asc, function(data, index) {
  4669 + if (!ctrl.internalLpBlockModel[data.lpName]) {
  4670 + ctrl.internalLpBlockModel[data.lpName] = [];
  4671 + }
  4672 + ctrl.internalLpBlockModel[data.lpName].push({
  4673 + fcsj : data.fcsj,
  4674 + isUp : true,
  4675 + fcno : data._fcno,
  4676 + index : index
  4677 + });
  4678 + });
  4679 + angular.forEach(ctrl.internalBcModel.down_bc_list_asc, function(data, index) {
  4680 + if (!ctrl.internalLpBlockModel[data.lpName]) {
  4681 + ctrl.internalLpBlockModel[data.lpName] = [];
  4682 + }
  4683 + ctrl.internalLpBlockModel[data.lpName].push({
  4684 + fcsj : data.fcsj,
  4685 + isUp : false,
  4686 + fcno : data._fcno,
  4687 + index : index
  4688 + });
  4689 + });
  4690 + angular.forEach(ctrl.internalLpBlockModel, function(value, key) {
  4691 + value.sort(function (a, b) {
  4692 + if (a.fcno < b.fcno) {
  4693 + return -1;
  4694 + } else if (a.fcno > b.fcno) {
  4695 + return 1;
  4696 + } else {
  4697 + return 0;
  4698 + }
  4699 + });
  4700 + });
  4701 +
  4702 +
  4703 + };
  4704 +
4448 4705 return {
4449 4706 pre : function(scope, element, attr) {
4450 4707 // TODO:
4451 4708 },
4452 4709 post : function(scope, element, attr) {
4453   - // TODO:
  4710 + // 班次html点击事件
  4711 + scope[ctrlAs].$$bcDD_Click = function(index, xlDir) {
  4712 + _fun_bcDDViewMove(scope[ctrlAs], index, xlDir);
  4713 + };
4454 4714  
  4715 + // 监控ngModel绑定的外部数据源的刷新状态变化
  4716 + scope.$watch(
  4717 + function() {
  4718 + return scope[ctrlAs].ds.refreshInfos;
  4719 + },
  4720 + function(newValue, oldValue) {
  4721 + if (newValue === undefined && oldValue === undefined) {
  4722 + return;
  4723 + }
  4724 + console.log("saTimetable2 refresh");
  4725 + _fun_refreshInternalModel(scope[ctrlAs]);
  4726 + },
  4727 + true
  4728 + );
4455 4729 }
4456 4730 };
4457 4731 }
... ... @@ -4547,177 +4821,177 @@ angular.module(&#39;ScheduleApp&#39;).directive(
4547 4821 }
4548 4822 ]
4549 4823 );
4550   -/**
4551   - * saOrderoption指令,搜索时的排序选项(在搜索时可以使用,通用的)
4552   - * 属性如下:
4553   - * name(必须):控件的名字
4554   - * columns(必须,独立作用域):字段名字列表,格式:[{name:[字段名],desc:[字段描述]}...]
4555   - * ordercolumns(必须,独立作用域):字段排序列表,格式:{order: '字段1,字段2',direction: 'ASC,DESC'}
4556   - */
4557   -angular.module('ScheduleApp').directive(
4558   - 'saOrderoption',
4559   - [
4560   - function() {
4561   - return {
4562   - restrict: 'E',
4563   - templateUrl: '/pages/scheduleApp/module/common/dts2/queryOption/saOrderOptionTemplate.html',
4564   - scope: {
4565   - columns: '=',
4566   - ordercolumns: '='
4567   - },
4568   - controllerAs: '$saOrderOptionCtrl',
4569   - bindToController: true,
4570   - controller: function() {
4571   - var self = this;
4572   -
4573   - // 字段列表是否预载入
4574   - self.$$columns_loaded = false;
4575   - // 字段排序是否预载入
4576   - self.$$ordercolumns_loaded = false;
4577   -
4578   -
4579   - // 每组选项内部数据源
4580   - // 格式:[{column:[选中的字段名],dir:[ASC/DESC]}]
4581   - self.$$selectgroupds = [];
4582   -
4583   - // TODO:选择事件
4584   -
4585   - self.$$select_column_change = function() {
4586   - self.$$refresh_selectgroupds();
4587   - };
4588   -
4589   - self.$$select_dir_change = function() {
4590   - self.$$refresh_selectgroupds();
4591   - };
4592   -
4593   - self.$$add_option_click = function(index) {
4594   - self.$$selectgroupds.splice(index, 0, {
4595   - column: self.columns[0].name,
4596   - dir: "ASC"
4597   - });
4598   - self.$$refresh_selectgroupds();
4599   - };
4600   - self.$$del_option_click = function(index) {
4601   - self.$$selectgroupds.splice(index, 1);
4602   - self.$$refresh_selectgroupds();
4603   - };
4604   -
4605   - // 刷新选项内部数据源
4606   - self.$$refresh_selectgroupds = function() {
4607   - if (!self.$$columns_loaded || !self.$$ordercolumns_loaded || self.columns.length == 0) {
4608   - // 没有载入完成,或者字段列表为空
4609   - return;
4610   - }
4611   -
4612   - if (self.$$selectgroupds.length == 0) { // 默认添加一组排序
4613   - self.$$selectgroupds.push({
4614   - column: self.columns[0].name,
4615   - dir: "ASC"
4616   - });
4617   - }
4618   -
4619   - // 重新计算ordercolumns
4620   -
4621   - var aColumn = [];
4622   - var aDir = [];
4623   - for (var i = 0; i < self.$$selectgroupds.length; i++) {
4624   - aColumn.push(self.$$selectgroupds[i].column);
4625   - aDir.push(self.$$selectgroupds[i].dir);
4626   - }
4627   - if (self.ordercolumns) {
4628   - self.ordercolumns.order = aColumn.join(",");
4629   - self.ordercolumns.direction = aDir.join(",");
4630   - } else {
4631   - self.ordercolumns = {order: aColumn.join(","), direction: aDir.join(",")}
4632   - }
4633   -
4634   - }
4635   - },
4636   - compile: function(tElem, tAttrs) {
4637   - // 获取所有属性,并验证
4638   - var $name_attr = tAttrs['name']; // 控件的名字
4639   - if (!$name_attr) {
4640   - throw "必须有名称属性";
4641   - }
4642   -
4643   - // controlAs名字
4644   - var ctrlAs = '$saOrderOptionCtrl';
4645   -
4646   - // TODO:
4647   -
4648   -
4649   -
4650   - return {
4651   - pre: function(scope, element, attr) {
4652   -
4653   - },
4654   -
4655   - post: function(scope, element, attr) {
4656   -
4657   - //--------------------- 监控属性方法 -------------------//
4658   - // 监控字段名字列表
4659   - scope.$watch(
4660   - function() {
4661   - return scope[ctrlAs].columns;
4662   - },
4663   - function(newValue, oldValue) {
4664   - if (!scope[ctrlAs].$$columns_loaded) {
4665   - // TODO:格式判定以后做,假设格式是对的
4666   -
4667   -
4668   - }
4669   -
4670   - scope[ctrlAs].$$columns_loaded = true;
4671   - scope[ctrlAs].$$refresh_selectgroupds();
4672   - },
4673   - true
4674   - );
4675   - // 监控字段排序列表
4676   - scope.$watch(
4677   - function() {
4678   - return scope[ctrlAs].ordercolumns;
4679   - },
4680   - function(newValue, oldValue) {
4681   - if (!scope[ctrlAs].$$ordercolumns_loaded) {
4682   - if (newValue) {
4683   - var aColumns = []; // 排序的字段
4684   - var aDirs = []; // 排序字段对应的排序方向
4685   -
4686   - if (newValue.order) {
4687   - aColumns = newValue.order.split(",");
4688   - }
4689   - if (newValue.direction) {
4690   - aDirs = newValue.direction.split(",");
4691   - }
4692   -
4693   - for (var i = 0; i < aColumns.length; i++) {
4694   - if (i < aDirs.length) {
4695   - scope[ctrlAs].$$selectgroupds.push({
4696   - column: aColumns[i],
4697   - dir: aDirs[i]
4698   - });
4699   - } else {
4700   - scope[ctrlAs].$$selectgroupds.push({
4701   - column: aColumns[i],
4702   - dir: 'ASC'
4703   - });
4704   - }
4705   - }
4706   - }
4707   - }
4708   - scope[ctrlAs].$$ordercolumns_loaded = true;
4709   - scope[ctrlAs].$$refresh_selectgroupds();
4710   -
4711   - },
4712   - true
4713   - );
4714   - }
4715   -
4716   - };
4717   - }
4718   - };
4719   - }
4720   - ]
  4824 +/**
  4825 + * saOrderoption指令,搜索时的排序选项(在搜索时可以使用,通用的)
  4826 + * 属性如下:
  4827 + * name(必须):控件的名字
  4828 + * columns(必须,独立作用域):字段名字列表,格式:[{name:[字段名],desc:[字段描述]}...]
  4829 + * ordercolumns(必须,独立作用域):字段排序列表,格式:{order: '字段1,字段2',direction: 'ASC,DESC'}
  4830 + */
  4831 +angular.module('ScheduleApp').directive(
  4832 + 'saOrderoption',
  4833 + [
  4834 + function() {
  4835 + return {
  4836 + restrict: 'E',
  4837 + templateUrl: '/pages/scheduleApp/module/common/dts2/queryOption/saOrderOptionTemplate.html',
  4838 + scope: {
  4839 + columns: '=',
  4840 + ordercolumns: '='
  4841 + },
  4842 + controllerAs: '$saOrderOptionCtrl',
  4843 + bindToController: true,
  4844 + controller: function() {
  4845 + var self = this;
  4846 +
  4847 + // 字段列表是否预载入
  4848 + self.$$columns_loaded = false;
  4849 + // 字段排序是否预载入
  4850 + self.$$ordercolumns_loaded = false;
  4851 +
  4852 +
  4853 + // 每组选项内部数据源
  4854 + // 格式:[{column:[选中的字段名],dir:[ASC/DESC]}]
  4855 + self.$$selectgroupds = [];
  4856 +
  4857 + // TODO:选择事件
  4858 +
  4859 + self.$$select_column_change = function() {
  4860 + self.$$refresh_selectgroupds();
  4861 + };
  4862 +
  4863 + self.$$select_dir_change = function() {
  4864 + self.$$refresh_selectgroupds();
  4865 + };
  4866 +
  4867 + self.$$add_option_click = function(index) {
  4868 + self.$$selectgroupds.splice(index, 0, {
  4869 + column: self.columns[0].name,
  4870 + dir: "ASC"
  4871 + });
  4872 + self.$$refresh_selectgroupds();
  4873 + };
  4874 + self.$$del_option_click = function(index) {
  4875 + self.$$selectgroupds.splice(index, 1);
  4876 + self.$$refresh_selectgroupds();
  4877 + };
  4878 +
  4879 + // 刷新选项内部数据源
  4880 + self.$$refresh_selectgroupds = function() {
  4881 + if (!self.$$columns_loaded || !self.$$ordercolumns_loaded || self.columns.length == 0) {
  4882 + // 没有载入完成,或者字段列表为空
  4883 + return;
  4884 + }
  4885 +
  4886 + if (self.$$selectgroupds.length == 0) { // 默认添加一组排序
  4887 + self.$$selectgroupds.push({
  4888 + column: self.columns[0].name,
  4889 + dir: "ASC"
  4890 + });
  4891 + }
  4892 +
  4893 + // 重新计算ordercolumns
  4894 +
  4895 + var aColumn = [];
  4896 + var aDir = [];
  4897 + for (var i = 0; i < self.$$selectgroupds.length; i++) {
  4898 + aColumn.push(self.$$selectgroupds[i].column);
  4899 + aDir.push(self.$$selectgroupds[i].dir);
  4900 + }
  4901 + if (self.ordercolumns) {
  4902 + self.ordercolumns.order = aColumn.join(",");
  4903 + self.ordercolumns.direction = aDir.join(",");
  4904 + } else {
  4905 + self.ordercolumns = {order: aColumn.join(","), direction: aDir.join(",")}
  4906 + }
  4907 +
  4908 + }
  4909 + },
  4910 + compile: function(tElem, tAttrs) {
  4911 + // 获取所有属性,并验证
  4912 + var $name_attr = tAttrs['name']; // 控件的名字
  4913 + if (!$name_attr) {
  4914 + throw "必须有名称属性";
  4915 + }
  4916 +
  4917 + // controlAs名字
  4918 + var ctrlAs = '$saOrderOptionCtrl';
  4919 +
  4920 + // TODO:
  4921 +
  4922 +
  4923 +
  4924 + return {
  4925 + pre: function(scope, element, attr) {
  4926 +
  4927 + },
  4928 +
  4929 + post: function(scope, element, attr) {
  4930 +
  4931 + //--------------------- 监控属性方法 -------------------//
  4932 + // 监控字段名字列表
  4933 + scope.$watch(
  4934 + function() {
  4935 + return scope[ctrlAs].columns;
  4936 + },
  4937 + function(newValue, oldValue) {
  4938 + if (!scope[ctrlAs].$$columns_loaded) {
  4939 + // TODO:格式判定以后做,假设格式是对的
  4940 +
  4941 +
  4942 + }
  4943 +
  4944 + scope[ctrlAs].$$columns_loaded = true;
  4945 + scope[ctrlAs].$$refresh_selectgroupds();
  4946 + },
  4947 + true
  4948 + );
  4949 + // 监控字段排序列表
  4950 + scope.$watch(
  4951 + function() {
  4952 + return scope[ctrlAs].ordercolumns;
  4953 + },
  4954 + function(newValue, oldValue) {
  4955 + if (!scope[ctrlAs].$$ordercolumns_loaded) {
  4956 + if (newValue) {
  4957 + var aColumns = []; // 排序的字段
  4958 + var aDirs = []; // 排序字段对应的排序方向
  4959 +
  4960 + if (newValue.order) {
  4961 + aColumns = newValue.order.split(",");
  4962 + }
  4963 + if (newValue.direction) {
  4964 + aDirs = newValue.direction.split(",");
  4965 + }
  4966 +
  4967 + for (var i = 0; i < aColumns.length; i++) {
  4968 + if (i < aDirs.length) {
  4969 + scope[ctrlAs].$$selectgroupds.push({
  4970 + column: aColumns[i],
  4971 + dir: aDirs[i]
  4972 + });
  4973 + } else {
  4974 + scope[ctrlAs].$$selectgroupds.push({
  4975 + column: aColumns[i],
  4976 + dir: 'ASC'
  4977 + });
  4978 + }
  4979 + }
  4980 + }
  4981 + }
  4982 + scope[ctrlAs].$$ordercolumns_loaded = true;
  4983 + scope[ctrlAs].$$refresh_selectgroupds();
  4984 +
  4985 + },
  4986 + true
  4987 + );
  4988 + }
  4989 +
  4990 + };
  4991 + }
  4992 + };
  4993 + }
  4994 + ]
4721 4995 );
4722 4996 /**
4723 4997 * saScpdate指令(非通用指令,只在排班计划form中使用)。
... ... @@ -4950,193 +5224,193 @@ angular.module(&#39;ScheduleApp&#39;).directive(
4950 5224 }
4951 5225 ]
4952 5226 );
4953   -/**
4954   - * saSrule指令(非通用指令,只在排班计划form中使用)。
4955   - * 属性如下:
4956   - * name(必须):控件的名字
4957   - * xlid(必须):线路id
4958   - * from(必须):独立作用域-绑定的开始时间属性名
4959   - * to(必须):独立作用域-绑定的结束时间属性名
4960   - * error(必须):独立作用域-绑定的错误描述属性名
4961   - */
4962   -angular.module('ScheduleApp').directive(
4963   - 'saSrule',
4964   - [
4965   - 'SchedulePlanManageService_g',
4966   - function(service) {
4967   - return {
4968   - restrict: 'E',
4969   - templateUrl: '/pages/scheduleApp/module/common/dts2/scheduleplan/saSruleTemplate.html',
4970   - scope: {
4971   - from: '=',
4972   - to: '=',
4973   - xlid: '=',
4974   - error: '='
4975   - },
4976   - controllerAs: '$saSruleCtrl',
4977   - bindToController: true,
4978   - controller: function() {
4979   - var self = this;
4980   -
4981   - // 内部ng-model值,用于和required配对
4982   - self.$$internalmodel = undefined;
4983   -
4984   - // 内部数据源(时刻表的一些信息)
4985   - self.$$count = 0;
4986   - self.$$qyCount = 0;
4987   - self.$$qyErrorCount = 0;
4988   - self.$$errorInfos = [];
4989   -
4990   - },
4991   - compile: function(tElem, tAttrs) {
4992   - // 获取所有属性,并验证
4993   - var $name_attr = tAttrs['name']; // 控件的名字
4994   - if (!$name_attr) {
4995   - throw "必须有名称属性";
4996   - }
4997   -
4998   - // controlAs名字
4999   - var ctrlAs = '$saSruleCtrl';
5000   -
5001   - // 线路id
5002   - var xl_id = undefined;
5003   - // 开始时间
5004   - var from_date = undefined;
5005   - // 结束时间
5006   - var to_date = undefined;
5007   -
5008   - // 内部添加required验证,将所有的错误应用到required验证上去
5009   - tElem.find("div").attr("required", "");
5010   -
5011   - return {
5012   - pre: function(scope, element, attr) {
5013   -
5014   - },
5015   -
5016   - post: function(scope, element, attr) {
5017   - // 属性值
5018   - if ($name_attr) {
5019   - scope[ctrlAs]["$name_attr"] = $name_attr;
5020   - }
5021   -
5022   - // 开始日期open属性,及方法
5023   - scope[ctrlAs].$$fromDateOpen = false;
5024   - scope[ctrlAs].$$fromDate_open = function() {
5025   - scope[ctrlAs].$$fromDateOpen = true;
5026   - };
5027   -
5028   - // 结束日期open属性,及方法
5029   - scope[ctrlAs].$$toDateOpen = false;
5030   - scope[ctrlAs].$$toDate_open = function() {
5031   - scope[ctrlAs].$$toDateOpen = true;
5032   - };
5033   -
5034   - // 内部模型刷新
5035   - scope[ctrlAs].$$internal_model_refresh = function() {
5036   - if (!xl_id) {
5037   - scope[ctrlAs].$$internalmodel = undefined;
5038   - scope[ctrlAs].error = "线路必须选择";
5039   - return;
5040   - }
5041   - if (!from_date) {
5042   - scope[ctrlAs].$$internalmodel = undefined;
5043   - scope[ctrlAs].error = "开始日期必须选择";
5044   - return;
5045   - }
5046   - if (!to_date) {
5047   - scope[ctrlAs].$$internalmodel = undefined;
5048   - scope[ctrlAs].error = "结束日期必须选择";
5049   - return;
5050   - }
5051   - if (from_date > to_date) {
5052   - scope[ctrlAs].$$internalmodel = undefined;
5053   - scope[ctrlAs].error = "开始日期必须在结束日期之前";
5054   - return;
5055   - }
5056   -
5057   - scope[ctrlAs].$$count = 0;
5058   - scope[ctrlAs].$$qyCount = 0;
5059   - scope[ctrlAs].$$qyErrorCount = 0;
5060   - scope[ctrlAs].$$errorInfos = [];
5061   -
5062   - if (scope[ctrlAs].$$qyCount == 0) {
5063   - scope[ctrlAs].$$internalmodel = undefined;
5064   - scope[ctrlAs].error = "无可启用的规则数";
5065   - }
5066   -
5067   - var QClass = service.v_rules;
5068   - QClass.val({xlid: xl_id, from: from_date, to: to_date},
5069   - function(result) {
5070   - scope[ctrlAs].$$count = result.data.count;
5071   - scope[ctrlAs].$$qyCount = result.data.qyCount;
5072   - scope[ctrlAs].$$qyErrorCount = result.data.qyErrorCount;
5073   -
5074   - angular.forEach(result.data.errorInfos, function(obj) {
5075   - scope[ctrlAs].$$errorInfos.push({
5076   - ruleId: obj.ruleId,
5077   - clZbh: obj.clZbh,
5078   - qyrq: moment(obj.qyrq).format("YYYY年MM月DD日"),
5079   - infos: obj.errorDescList.join("")
5080   - });
5081   - });
5082   -
5083   - if (scope[ctrlAs].$$qyErrorCount > 0) {
5084   - scope[ctrlAs].$$internalmodel = undefined;
5085   - scope[ctrlAs].error = "有错误的规则";
5086   - } else {
5087   - scope[ctrlAs].$$internalmodel = "ok";
5088   - scope[ctrlAs].$$errorInfos = [];
5089   - }
5090   - },
5091   - function() {
5092   - scope[ctrlAs].$$internalmodel = undefined;
5093   - scope[ctrlAs].error = "获取规则数据失败!";
5094   - }
5095   - );
5096   -
5097   - scope[ctrlAs].$$internalmodel = "ok";
5098   - };
5099   -
5100   - scope[ctrlAs].$$internal_model_refresh(); // 初始执行
5101   -
5102   - //--------------------- 监控属性方法 -------------------//
5103   - // 监控线路id模型值变化
5104   - scope.$watch(
5105   - function() {
5106   - return scope[ctrlAs].xlid;
5107   - },
5108   - function(newValue, oldValue) {
5109   - xl_id = newValue;
5110   - scope[ctrlAs].$$internal_model_refresh();
5111   - }
5112   - );
5113   -
5114   - // 监控开始时间模型值变化
5115   - scope.$watch(
5116   - function() {
5117   - return scope[ctrlAs].from;
5118   - },
5119   - function(newValue, oldValue) {
5120   - from_date = newValue;
5121   - scope[ctrlAs].$$internal_model_refresh();
5122   - }
5123   - );
5124   - // 监控结束时间模型值变化
5125   - scope.$watch(
5126   - function() {
5127   - return scope[ctrlAs].to;
5128   - },
5129   - function(newValue, oldValue) {
5130   - to_date = newValue;
5131   - scope[ctrlAs].$$internal_model_refresh();
5132   - }
5133   - );
5134   - }
5135   - };
5136   - }
5137   - };
5138   - }
5139   - ]
  5227 +/**
  5228 + * saSrule指令(非通用指令,只在排班计划form中使用)。
  5229 + * 属性如下:
  5230 + * name(必须):控件的名字
  5231 + * xlid(必须):线路id
  5232 + * from(必须):独立作用域-绑定的开始时间属性名
  5233 + * to(必须):独立作用域-绑定的结束时间属性名
  5234 + * error(必须):独立作用域-绑定的错误描述属性名
  5235 + */
  5236 +angular.module('ScheduleApp').directive(
  5237 + 'saSrule',
  5238 + [
  5239 + 'SchedulePlanManageService_g',
  5240 + function(service) {
  5241 + return {
  5242 + restrict: 'E',
  5243 + templateUrl: '/pages/scheduleApp/module/common/dts2/scheduleplan/saSruleTemplate.html',
  5244 + scope: {
  5245 + from: '=',
  5246 + to: '=',
  5247 + xlid: '=',
  5248 + error: '='
  5249 + },
  5250 + controllerAs: '$saSruleCtrl',
  5251 + bindToController: true,
  5252 + controller: function() {
  5253 + var self = this;
  5254 +
  5255 + // 内部ng-model值,用于和required配对
  5256 + self.$$internalmodel = undefined;
  5257 +
  5258 + // 内部数据源(时刻表的一些信息)
  5259 + self.$$count = 0;
  5260 + self.$$qyCount = 0;
  5261 + self.$$qyErrorCount = 0;
  5262 + self.$$errorInfos = [];
  5263 +
  5264 + },
  5265 + compile: function(tElem, tAttrs) {
  5266 + // 获取所有属性,并验证
  5267 + var $name_attr = tAttrs['name']; // 控件的名字
  5268 + if (!$name_attr) {
  5269 + throw "必须有名称属性";
  5270 + }
  5271 +
  5272 + // controlAs名字
  5273 + var ctrlAs = '$saSruleCtrl';
  5274 +
  5275 + // 线路id
  5276 + var xl_id = undefined;
  5277 + // 开始时间
  5278 + var from_date = undefined;
  5279 + // 结束时间
  5280 + var to_date = undefined;
  5281 +
  5282 + // 内部添加required验证,将所有的错误应用到required验证上去
  5283 + tElem.find("div").attr("required", "");
  5284 +
  5285 + return {
  5286 + pre: function(scope, element, attr) {
  5287 +
  5288 + },
  5289 +
  5290 + post: function(scope, element, attr) {
  5291 + // 属性值
  5292 + if ($name_attr) {
  5293 + scope[ctrlAs]["$name_attr"] = $name_attr;
  5294 + }
  5295 +
  5296 + // 开始日期open属性,及方法
  5297 + scope[ctrlAs].$$fromDateOpen = false;
  5298 + scope[ctrlAs].$$fromDate_open = function() {
  5299 + scope[ctrlAs].$$fromDateOpen = true;
  5300 + };
  5301 +
  5302 + // 结束日期open属性,及方法
  5303 + scope[ctrlAs].$$toDateOpen = false;
  5304 + scope[ctrlAs].$$toDate_open = function() {
  5305 + scope[ctrlAs].$$toDateOpen = true;
  5306 + };
  5307 +
  5308 + // 内部模型刷新
  5309 + scope[ctrlAs].$$internal_model_refresh = function() {
  5310 + if (!xl_id) {
  5311 + scope[ctrlAs].$$internalmodel = undefined;
  5312 + scope[ctrlAs].error = "线路必须选择";
  5313 + return;
  5314 + }
  5315 + if (!from_date) {
  5316 + scope[ctrlAs].$$internalmodel = undefined;
  5317 + scope[ctrlAs].error = "开始日期必须选择";
  5318 + return;
  5319 + }
  5320 + if (!to_date) {
  5321 + scope[ctrlAs].$$internalmodel = undefined;
  5322 + scope[ctrlAs].error = "结束日期必须选择";
  5323 + return;
  5324 + }
  5325 + if (from_date > to_date) {
  5326 + scope[ctrlAs].$$internalmodel = undefined;
  5327 + scope[ctrlAs].error = "开始日期必须在结束日期之前";
  5328 + return;
  5329 + }
  5330 +
  5331 + scope[ctrlAs].$$count = 0;
  5332 + scope[ctrlAs].$$qyCount = 0;
  5333 + scope[ctrlAs].$$qyErrorCount = 0;
  5334 + scope[ctrlAs].$$errorInfos = [];
  5335 +
  5336 + if (scope[ctrlAs].$$qyCount == 0) {
  5337 + scope[ctrlAs].$$internalmodel = undefined;
  5338 + scope[ctrlAs].error = "无可启用的规则数";
  5339 + }
  5340 +
  5341 + var QClass = service.v_rules;
  5342 + QClass.val({xlid: xl_id, from: from_date, to: to_date},
  5343 + function(result) {
  5344 + scope[ctrlAs].$$count = result.data.count;
  5345 + scope[ctrlAs].$$qyCount = result.data.qyCount;
  5346 + scope[ctrlAs].$$qyErrorCount = result.data.qyErrorCount;
  5347 +
  5348 + angular.forEach(result.data.errorInfos, function(obj) {
  5349 + scope[ctrlAs].$$errorInfos.push({
  5350 + ruleId: obj.ruleId,
  5351 + clZbh: obj.clZbh,
  5352 + qyrq: moment(obj.qyrq).format("YYYY年MM月DD日"),
  5353 + infos: obj.errorDescList.join("")
  5354 + });
  5355 + });
  5356 +
  5357 + if (scope[ctrlAs].$$qyErrorCount > 0) {
  5358 + scope[ctrlAs].$$internalmodel = undefined;
  5359 + scope[ctrlAs].error = "有错误的规则";
  5360 + } else {
  5361 + scope[ctrlAs].$$internalmodel = "ok";
  5362 + scope[ctrlAs].$$errorInfos = [];
  5363 + }
  5364 + },
  5365 + function() {
  5366 + scope[ctrlAs].$$internalmodel = undefined;
  5367 + scope[ctrlAs].error = "获取规则数据失败!";
  5368 + }
  5369 + );
  5370 +
  5371 + scope[ctrlAs].$$internalmodel = "ok";
  5372 + };
  5373 +
  5374 + scope[ctrlAs].$$internal_model_refresh(); // 初始执行
  5375 +
  5376 + //--------------------- 监控属性方法 -------------------//
  5377 + // 监控线路id模型值变化
  5378 + scope.$watch(
  5379 + function() {
  5380 + return scope[ctrlAs].xlid;
  5381 + },
  5382 + function(newValue, oldValue) {
  5383 + xl_id = newValue;
  5384 + scope[ctrlAs].$$internal_model_refresh();
  5385 + }
  5386 + );
  5387 +
  5388 + // 监控开始时间模型值变化
  5389 + scope.$watch(
  5390 + function() {
  5391 + return scope[ctrlAs].from;
  5392 + },
  5393 + function(newValue, oldValue) {
  5394 + from_date = newValue;
  5395 + scope[ctrlAs].$$internal_model_refresh();
  5396 + }
  5397 + );
  5398 + // 监控结束时间模型值变化
  5399 + scope.$watch(
  5400 + function() {
  5401 + return scope[ctrlAs].to;
  5402 + },
  5403 + function(newValue, oldValue) {
  5404 + to_date = newValue;
  5405 + scope[ctrlAs].$$internal_model_refresh();
  5406 + }
  5407 + );
  5408 + }
  5409 + };
  5410 + }
  5411 + };
  5412 + }
  5413 + ]
5140 5414 );
5141 5415 /**
5142 5416 * saPlaninfoedit指令,排班明细编辑控件,用在调度执勤日报的修改功能
... ...
src/main/resources/static/pages/scheduleApp/module/core/ttInfoManage/detailedit/timeTableDetailManage_old.js
... ... @@ -22,10 +22,8 @@ angular.module(&#39;ScheduleApp&#39;).factory(
22 22  
23 23 // 时刻表信息(预览视图使用)
24 24 var pvInfo = {
25   - up_qdz_name : "", // 上行起点站名字
26   - down_qdz_name : "", // 下行起点站名字
27   - up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
28   - down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
  25 + bcList : [], // 班次列表
  26 + refreshInfos : undefined // 刷新信息
29 27 };
30 28  
31 29 return {
... ... @@ -48,91 +46,14 @@ angular.module(&#39;ScheduleApp&#39;).factory(
48 46 {page : 0, size : 1000, "ttinfo.id_eq" : ttid},
49 47 function(result) {
50 48 if (result.content.length > 0) {
51   - pvInfo = {
52   - up_qdz_name : "", // 上行起点站名字
53   - down_qdz_name : "", // 下行起点站名字
54   - up_bc_list_asc : [], // 上行班次列表(按照发车时间升序)
55   - down_bc_list_asc : [] // 下行班次列表(按照发车时间升序)
56   - };
57   -
58   - // 构造上下行班次列表,并确定上下行的首发站点
59   - angular.forEach(result.content, function(bcObj) {
60   - if (bcObj.xlDir == "0") { // 上行
61   - pvInfo.up_bc_list_asc.push(bcObj);
62   -
63   - // 确定首发站点
64   - if (pvInfo.up_qdz_name == "") {
65   - if (bcObj.bcType == "normal") {
66   - pvInfo.up_qdz_name = bcObj.qdzName;
67   - }
68   - }
69   - }
70   - if (bcObj.xlDir == "1") { // 下行
71   - pvInfo.down_bc_list_asc.push(bcObj);
72   -
73   - // 确定首发站点
74   - if (pvInfo.down_qdz_name == "") {
75   - if (bcObj.bcType == "normal") {
76   - pvInfo.down_qdz_name = bcObj.qdzName;
77   - }
78   - }
79   - }
80   - });
81   -
82   - // 发车时间升序排序上行班次
83   - pvInfo.up_bc_list_asc.sort(function(a, b) {
84   - var a_wrapTime = moment("2000-01-01 " + a.fcsj, "YYYY-MM-DD HH:mm");
85   - var b_wrapTime = moment("2000-01-01 " + b.fcsj, "YYYY-MM-DD HH:mm");
86   -
87   - // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
88   - // TODO:以后要配合首班车的发车时间判定
89   - if (a.fcsj.indexOf("00:") == 0 ||
90   - a.fcsj.indexOf("01:") == 0 ||
91   - a.fcsj.indexOf("02:") == 0) {
92   - a_wrapTime.add(1, "day");
93   - }
94   - if (b.fcsj.indexOf("00:") == 0 ||
95   - b.fcsj.indexOf("01:") == 0 ||
96   - b.fcsj.indexOf("02:") == 0) {
97   - b_wrapTime.add(1, "day");
98   - }
99   -
100   -
101   - if (a_wrapTime.isBefore(b_wrapTime)) {
102   - return -1;
103   - } else if (a_wrapTime.isAfter(b_wrapTime)) {
104   - return 1;
105   - } else {
106   - return 0;
107   - }
108   -
109   - });
110   - // 发车时间升序排序下行班次
111   - pvInfo.down_bc_list_asc.sort(function(a, b) {
112   - var a_wrapTime = moment("2000-01-01 " + a.fcsj, "YYYY-MM-DD HH:mm");
113   - var b_wrapTime = moment("2000-01-01 " + b.fcsj, "YYYY-MM-DD HH:mm");
114   -
115   - // 判定如果发车时间是以00,01,02,03开头的,说明是下一天凌晨的班次,需要加1天判定
116   - // TODO:以后要配合首班车的发车时间判定
117   - if (a.fcsj.indexOf("00:") == 0 ||
118   - a.fcsj.indexOf("01:") == 0 ||
119   - a.fcsj.indexOf("02:") == 0) {
120   - a_wrapTime.add(1, "day");
121   - }
122   - if (b.fcsj.indexOf("00:") == 0 ||
123   - b.fcsj.indexOf("01:") == 0 ||
124   - b.fcsj.indexOf("02:") == 0) {
125   - b_wrapTime.add(1, "day");
126   - }
127   -
128   - if (a_wrapTime.isBefore(b_wrapTime)) {
129   - return -1;
130   - } else if (a_wrapTime.isAfter(b_wrapTime)) {
131   - return 1;
132   - } else {
133   - return 0;
134   - }
135   - });
  49 + pvInfo.bcList = result.content;
  50 + if (pvInfo.refreshInfos == undefined) {
  51 + pvInfo.refreshInfos = {
  52 + count : 1 // 刷新次数
  53 + };
  54 + } else {
  55 + pvInfo.refreshInfos.count ++;
  56 + }
136 57 }
137 58 }
138 59 );
... ...