Commit dd39e319928cdfaf99cb3e1ca61c7037d5c379d7

Authored by 潘钊
2 parents 9e7255d7 770b34dd

Merge branch 'pudong' of http://222.66.0.204:8090/panzhaov5/bsth_control into pudong

Showing 24 changed files with 1876 additions and 1726 deletions

Too many changes to show.

To preserve performance only 24 of 25 files are displayed.

src/main/java/com/bsth/controller/LineController.java
1 package com.bsth.controller; 1 package com.bsth.controller;
2 2
  3 +import java.text.ParseException;
  4 +import java.text.SimpleDateFormat;
  5 +import java.util.Date;
3 import java.util.HashMap; 6 import java.util.HashMap;
4 import java.util.Map; 7 import java.util.Map;
5 8
@@ -11,7 +14,9 @@ import org.springframework.web.bind.annotation.RestController; @@ -11,7 +14,9 @@ import org.springframework.web.bind.annotation.RestController;
11 14
12 import com.bsth.common.ResponseCode; 15 import com.bsth.common.ResponseCode;
13 import com.bsth.entity.Line; 16 import com.bsth.entity.Line;
  17 +import com.bsth.entity.LineVersions;
14 import com.bsth.service.LineService; 18 import com.bsth.service.LineService;
  19 +import com.bsth.service.LineVersionsService;
15 import com.bsth.util.GetUIDAndCode; 20 import com.bsth.util.GetUIDAndCode;
16 21
17 /** 22 /**
@@ -36,6 +41,9 @@ public class LineController extends BaseController<Line, Integer> { @@ -36,6 +41,9 @@ public class LineController extends BaseController<Line, Integer> {
36 @Autowired 41 @Autowired
37 private LineService service; 42 private LineService service;
38 43
  44 + @Autowired
  45 + private LineVersionsService lineVersionsService;
  46 +
39 /** 47 /**
40 * 获取线路编码与ID 48 * 获取线路编码与ID
41 * 49 *
@@ -74,13 +82,31 @@ public class LineController extends BaseController<Line, Integer> { @@ -74,13 +82,31 @@ public class LineController extends BaseController<Line, Integer> {
74 map.put("status", ResponseCode.ERROR); 82 map.put("status", ResponseCode.ERROR);
75 return map; 83 return map;
76 } 84 }
77 - return service.save(t); 85 + // 添加线路版本
  86 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  87 + try {
  88 + Date endDate = simpleDateFormat.parse("2088-08-08 00:00:00");
  89 + LineVersions lineVersions = new LineVersions();
  90 + lineVersions.setName("原始版本");
  91 + lineVersions.setLine(t);
  92 + lineVersions.setLineCode(t.getLineCode());
  93 + lineVersions.setStartDate(t.getCreateDate());
  94 + lineVersions.setEndDate(new java.sql.Date(endDate.getTime()));// 2088-8-8 00:00:00
  95 + lineVersions.setVersions(1);
  96 + lineVersions.setStatus(1);
  97 + // 先添加线路再添加版本
  98 + service.save(t);
  99 + return lineVersionsService.save(lineVersions);
  100 + } catch (ParseException e) {
  101 + // TODO Auto-generated catch block
  102 + e.printStackTrace();
  103 + map.put("status", ResponseCode.ERROR);
  104 + return map;
  105 + }
78 } 106 }
79 107
80 /** 108 /**
81 - *  
82 * 更改 109 * 更改
83 - *  
84 */ 110 */
85 @RequestMapping(value="/update", method = RequestMethod.POST) 111 @RequestMapping(value="/update", method = RequestMethod.POST)
86 public Map<String, Object> update(Line l){ 112 public Map<String, Object> update(Line l){
src/main/java/com/bsth/controller/LineVersionsController.java
@@ -12,16 +12,9 @@ import org.springframework.web.bind.annotation.RequestMethod; @@ -12,16 +12,9 @@ import org.springframework.web.bind.annotation.RequestMethod;
12 import org.springframework.web.bind.annotation.RequestParam; 12 import org.springframework.web.bind.annotation.RequestParam;
13 import org.springframework.web.bind.annotation.RestController; 13 import org.springframework.web.bind.annotation.RestController;
14 14
15 -import com.alibaba.fastjson.JSON;  
16 -import com.alibaba.fastjson.JSONObject;  
17 -import com.alibaba.fastjson.TypeReference;  
18 -import com.bsth.data.LineVersionsData;  
19 import com.bsth.entity.Line; 15 import com.bsth.entity.Line;
20 import com.bsth.entity.LineVersions; 16 import com.bsth.entity.LineVersions;
21 -import com.bsth.entity.LsStationRoute;  
22 -import com.bsth.entity.StationRoute;  
23 import com.bsth.repository.LineRepository; 17 import com.bsth.repository.LineRepository;
24 -import com.bsth.repository.LsStationRouteRepository;  
25 import com.bsth.service.LineVersionsService; 18 import com.bsth.service.LineVersionsService;
26 19
27 /** 20 /**
@@ -46,8 +39,15 @@ public class LineVersionsController extends BaseController&lt;LineVersions, Integer @@ -46,8 +39,15 @@ public class LineVersionsController extends BaseController&lt;LineVersions, Integer
46 39
47 @Autowired 40 @Autowired
48 LineRepository lineRepository; 41 LineRepository lineRepository;
49 - @Autowired  
50 - LsStationRouteRepository lsStationRouteRepository ; 42 +
  43 + /**
  44 + * 获取线路所有版本
  45 + */
  46 + @RequestMapping(value = "findLineVersionsMax", method = RequestMethod.GET)
  47 + public LineVersions findLineVersionsMax(@RequestParam(defaultValue = "lineId") int lineId) {
  48 + return service.findLineVersionsMax(lineId);
  49 + }
  50 +
51 /** 51 /**
52 * 获取线路所有版本 52 * 获取线路所有版本
53 * 53 *
@@ -63,7 +63,6 @@ public class LineVersionsController extends BaseController&lt;LineVersions, Integer @@ -63,7 +63,6 @@ public class LineVersionsController extends BaseController&lt;LineVersions, Integer
63 */ 63 */
64 @RequestMapping(value = "findById", method = RequestMethod.GET) 64 @RequestMapping(value = "findById", method = RequestMethod.GET)
65 public LineVersions findOne(@RequestParam(defaultValue = "id") int id) { 65 public LineVersions findOne(@RequestParam(defaultValue = "id") int id) {
66 - service.lineUpdate();  
67 return service.findById(id); 66 return service.findById(id);
68 } 67 }
69 68
@@ -85,6 +84,7 @@ public class LineVersionsController extends BaseController&lt;LineVersions, Integer @@ -85,6 +84,7 @@ public class LineVersionsController extends BaseController&lt;LineVersions, Integer
85 Date startDate = simpleDateFormat.parse(map.get("startDate").toString()); 84 Date startDate = simpleDateFormat.parse(map.get("startDate").toString());
86 Date endDate = simpleDateFormat.parse(map.get("endDate").toString()); 85 Date endDate = simpleDateFormat.parse(map.get("endDate").toString());
87 Line line = lineRepository.findOne(Integer.valueOf(map.get("lineId").toString())); 86 Line line = lineRepository.findOne(Integer.valueOf(map.get("lineId").toString()));
  87 + lineVersions.setName(map.get("name").toString());
88 lineVersions.setLine(line); 88 lineVersions.setLine(line);
89 lineVersions.setLineCode(map.get("lineCode").toString()); 89 lineVersions.setLineCode(map.get("lineCode").toString());
90 lineVersions.setStartDate(new java.sql.Date(startDate.getTime())); 90 lineVersions.setStartDate(new java.sql.Date(startDate.getTime()));
@@ -92,6 +92,8 @@ public class LineVersionsController extends BaseController&lt;LineVersions, Integer @@ -92,6 +92,8 @@ public class LineVersionsController extends BaseController&lt;LineVersions, Integer
92 lineVersions.setVersions(Integer.valueOf(map.get("versions").toString())); 92 lineVersions.setVersions(Integer.valueOf(map.get("versions").toString()));
93 lineVersions.setStatus(Integer.valueOf(map.get("status").toString())); 93 lineVersions.setStatus(Integer.valueOf(map.get("status").toString()));
94 lineVersions.setRemark(map.get("remark").toString()); 94 lineVersions.setRemark(map.get("remark").toString());
  95 +
  96 +
95 } catch (ParseException e) { 97 } catch (ParseException e) {
96 // TODO Auto-generated catch block 98 // TODO Auto-generated catch block
97 e.printStackTrace(); 99 e.printStackTrace();
src/main/java/com/bsth/entity/LineVersions.java
@@ -32,6 +32,11 @@ public class LineVersions{ @@ -32,6 +32,11 @@ public class LineVersions{
32 /** ID 主键(唯一标识符) int length(11) */ 32 /** ID 主键(唯一标识符) int length(11) */
33 private Integer id; 33 private Integer id;
34 34
  35 + /** 线路版本名字 varchar length(50)
  36 + * 给排版人员选版本使用
  37 + * */
  38 + private String name;
  39 +
35 /** 线路ID int length(11) */ 40 /** 线路ID int length(11) */
36 @ManyToOne 41 @ManyToOne
37 private Line line; 42 private Line line;
@@ -71,6 +76,14 @@ public class LineVersions{ @@ -71,6 +76,14 @@ public class LineVersions{
71 public void setId(Integer id) { 76 public void setId(Integer id) {
72 this.id = id; 77 this.id = id;
73 } 78 }
  79 +
  80 + public String getName() {
  81 + return name;
  82 + }
  83 +
  84 + public void setName(String name) {
  85 + this.name = name;
  86 + }
74 87
75 public Line getLine() { 88 public Line getLine() {
76 return line; 89 return line;
src/main/java/com/bsth/repository/LineVersionsRepository.java
@@ -59,5 +59,12 @@ public interface LineVersionsRepository extends BaseRepository&lt;LineVersions, Int @@ -59,5 +59,12 @@ public interface LineVersionsRepository extends BaseRepository&lt;LineVersions, Int
59 @Modifying 59 @Modifying
60 @Query(value = "UPDATE LineVersions lv set lv.status=1 where lv.line.id=?1 and lv.lineCode=?2 and lv.versions=?3") 60 @Query(value = "UPDATE LineVersions lv set lv.status=1 where lv.line.id=?1 and lv.lineCode=?2 and lv.versions=?3")
61 public void updateNewVersions(Integer lineId, String lineCode, Integer versions); 61 public void updateNewVersions(Integer lineId, String lineCode, Integer versions);
  62 +
  63 +
  64 + /**
  65 + * 查询线路最大线路版本
  66 + */
  67 + @Query(value = "select lv2 from LineVersions lv2 where lv2.line.id =?1 and lv2.versions=(SELECT max(lv.versions) FROM LineVersions lv where lv.line.id = ?1) ")
  68 + public LineVersions findLineVersionsMax(int lineId);
62 69
63 } 70 }
src/main/java/com/bsth/service/LineVersionsService.java
@@ -32,4 +32,6 @@ public interface LineVersionsService extends BaseService&lt;LineVersions, Integer&gt; @@ -32,4 +32,6 @@ public interface LineVersionsService extends BaseService&lt;LineVersions, Integer&gt;
32 32
33 List<LineVersions> lineUpdate(); 33 List<LineVersions> lineUpdate();
34 34
  35 + LineVersions findLineVersionsMax(int lineId);
  36 +
35 } 37 }
src/main/java/com/bsth/service/forms/impl/FormsServiceImpl.java
@@ -114,8 +114,15 @@ public class FormsServiceImpl implements FormsService { @@ -114,8 +114,15 @@ public class FormsServiceImpl implements FormsService {
114 List<ScheduleRealInfo> listInfo=new ArrayList<ScheduleRealInfo>(); 114 List<ScheduleRealInfo> listInfo=new ArrayList<ScheduleRealInfo>();
115 for (int j = 0; j < realList.size(); j++) { 115 for (int j = 0; j < realList.size(); j++) {
116 ScheduleRealInfo s=realList.get(j); 116 ScheduleRealInfo s=realList.get(j);
117 - if(w.getNbbm().equals(s.getClZbh()) && w.getJgh().equals(w.getJgh())){  
118 - listInfo.add(s); 117 + if(w.getNbbm().equals(s.getClZbh()) && w.getJgh().equals(s.getjGh())){
  118 + Set<ChildTaskPlan> cts = s.getcTasks();
  119 + if(cts != null && cts.size() > 0){
  120 + listInfo.add(s);
  121 + }else{
  122 + if(s.getZdsjActual()!=null && s.getFcsjActual()!=null){
  123 + listInfo.add(s);
  124 + }
  125 + }
119 } 126 }
120 } 127 }
121 128
@@ -290,9 +297,11 @@ public class FormsServiceImpl implements FormsService { @@ -290,9 +297,11 @@ public class FormsServiceImpl implements FormsService {
290 }); 297 });
291 298
292 List<ScheduleRealInfo> sList; 299 List<ScheduleRealInfo> sList;
  300 + List<ScheduleRealInfo> list_s;
293 List<ScheduleRealInfo> lists=scheduleRealInfoRepository.scheduleByDateAndLineYbb(map.get("line").toString(), map.get("startDate").toString(), map.get("endDate").toString()); 301 List<ScheduleRealInfo> lists=scheduleRealInfoRepository.scheduleByDateAndLineYbb(map.get("line").toString(), map.get("startDate").toString(), map.get("endDate").toString());
294 for(int i=0;i<list.size();i++){ 302 for(int i=0;i<list.size();i++){
295 sList =new ArrayList<ScheduleRealInfo>(); 303 sList =new ArrayList<ScheduleRealInfo>();
  304 + list_s =new ArrayList<ScheduleRealInfo>();
296 Shiftuehiclemanth d=list.get(i); 305 Shiftuehiclemanth d=list.get(i);
297 for (int j = 0; j < lists.size(); j++) { 306 for (int j = 0; j < lists.size(); j++) {
298 ScheduleRealInfo s=lists.get(j); 307 ScheduleRealInfo s=lists.get(j);
@@ -302,31 +311,56 @@ public class FormsServiceImpl implements FormsService { @@ -302,31 +311,56 @@ public class FormsServiceImpl implements FormsService {
302 if(empnames.equals("驾驶员")){ 311 if(empnames.equals("驾驶员")){
303 if(d.getJgh().equals(s.getjGh())){ 312 if(d.getJgh().equals(s.getjGh())){
304 sList.add(s); 313 sList.add(s);
  314 + Set<ChildTaskPlan> cts = s.getcTasks();
  315 + if(cts != null && cts.size() > 0){
  316 + list_s.add(s);
  317 + }else{
  318 + if(s.getZdsjActual()!=null && s.getFcsjActual()!=null){
  319 + list_s.add(s);
  320 + }
  321 + }
  322 +
305 } 323 }
306 }else if(empnames.equals("售票员")){ 324 }else if(empnames.equals("售票员")){
307 String sgh=s.getsGh()==null?"":s.getsGh(); 325 String sgh=s.getsGh()==null?"":s.getsGh();
308 if(d.getSgh().equals(sgh)){ 326 if(d.getSgh().equals(sgh)){
309 sList.add(s); 327 sList.add(s);
  328 + Set<ChildTaskPlan> cts = s.getcTasks();
  329 + if(cts != null && cts.size() > 0){
  330 + list_s.add(s);
  331 + }else{
  332 + if(s.getZdsjActual()!=null && s.getFcsjActual()!=null){
  333 + list_s.add(s);
  334 + }
  335 + }
310 } 336 }
311 }else if(empnames.equals("车辆自编号")){ 337 }else if(empnames.equals("车辆自编号")){
312 if(d.getjName().equals(s.getClZbh())){ 338 if(d.getjName().equals(s.getClZbh())){
313 sList.add(s); 339 sList.add(s);
  340 + Set<ChildTaskPlan> cts = s.getcTasks();
  341 + if(cts != null && cts.size() > 0){
  342 + list_s.add(s);
  343 + }else{
  344 + if(s.getZdsjActual()!=null && s.getFcsjActual()!=null){
  345 + list_s.add(s);
  346 + }
  347 + }
314 } 348 }
315 } 349 }
316 350
317 } 351 }
318 352
319 - double ksgl=culateMileageService.culateKsgl(sList);  
320 - double jccgl=culateMileageService.culateJccgl(sList); 353 + double ksgl=culateMileageService.culateKsgl(list_s);
  354 + double jccgl=culateMileageService.culateJccgl(list_s);
321 double zksgl=Arith.add(ksgl, jccgl); 355 double zksgl=Arith.add(ksgl, jccgl);
322 - double ljgl=culateMileageService.culateLjgl(sList);  
323 - double sjgl=culateMileageService.culateSjgl(sList); 356 + double ljgl=culateMileageService.culateLjgl(list_s);
  357 + double sjgl=culateMileageService.culateSjgl(list_s);
324 double zyygl=Arith.add(ljgl, sjgl); 358 double zyygl=Arith.add(ljgl, sjgl);
325 int cjbc=culateMileageService.culateLbbc(sList); 359 int cjbc=culateMileageService.culateLbbc(sList);
326 - int ljbc=culateMileageService.culateLjbc(sList,"");  
327 - int sjbc=culateMileageService.culateSjbc(sList, ""); 360 + int ljbc=culateMileageService.culateLjbc(list_s,"");
  361 + int sjbc=culateMileageService.culateSjbc(list_s, "");
328 double cjgl=culateMileageService.culateLbgl(sList); 362 double cjgl=culateMileageService.culateLbgl(sList);
329 - double zjgl=culateMileageService.culateLjgl(sList); 363 + double zjgl=culateMileageService.culateLjgl(list_s);
330 d.setEmptMileage(String.valueOf(zksgl));//空驶公里 364 d.setEmptMileage(String.valueOf(zksgl));//空驶公里
331 d.setTotalm(String.valueOf(Arith.add(zksgl, zyygl)));//总公里 365 d.setTotalm(String.valueOf(Arith.add(zksgl, zyygl)));//总公里
332 d.setSjbc(String.valueOf(sjbc+ljbc)); 366 d.setSjbc(String.valueOf(sjbc+ljbc));
@@ -418,30 +452,40 @@ public class FormsServiceImpl implements FormsService { @@ -418,30 +452,40 @@ public class FormsServiceImpl implements FormsService {
418 452
419 }); 453 });
420 List<ScheduleRealInfo> sList; 454 List<ScheduleRealInfo> sList;
  455 + List<ScheduleRealInfo> list_s;
421 List<ScheduleRealInfo> lists=scheduleRealInfoRepository.scheduleByDateAndLineTjrb(map.get("line").toString(), map.get("date").toString()); 456 List<ScheduleRealInfo> lists=scheduleRealInfoRepository.scheduleByDateAndLineTjrb(map.get("line").toString(), map.get("date").toString());
422 for(int i=0;i<list.size();i++){ 457 for(int i=0;i<list.size();i++){
423 sList =new ArrayList<ScheduleRealInfo>(); 458 sList =new ArrayList<ScheduleRealInfo>();
  459 + list_s =new ArrayList<ScheduleRealInfo>();
424 Shifday d=list.get(i); 460 Shifday d=list.get(i);
425 for (int j = 0; j < lists.size(); j++) { 461 for (int j = 0; j < lists.size(); j++) {
426 ScheduleRealInfo s=lists.get(j); 462 ScheduleRealInfo s=lists.get(j);
427 if(d.getJgh().equals(s.getjGh()) && d.getCarPlate().equals(s.getClZbh())){ 463 if(d.getJgh().equals(s.getjGh()) && d.getCarPlate().equals(s.getClZbh())){
428 sList.add(s); 464 sList.add(s);
  465 + Set<ChildTaskPlan> cts = s.getcTasks();
  466 + if(cts != null && cts.size() > 0){
  467 + list_s.add(s);
  468 + }else{
  469 + if(s.getZdsjActual()!=null && s.getFcsjActual()!=null){
  470 + list_s.add(s);
  471 + }
  472 + }
429 } 473 }
430 } 474 }
431 475
432 - double ksgl=culateMileageService.culateKsgl(sList);  
433 - double jccgl=culateMileageService.culateJccgl(sList); 476 + double ksgl=culateMileageService.culateKsgl(list_s);
  477 + double jccgl=culateMileageService.culateJccgl(list_s);
434 double zksgl=Arith.add(ksgl, jccgl); 478 double zksgl=Arith.add(ksgl, jccgl);
435 - double ljgl=culateMileageService.culateLjgl(sList);  
436 - double sjgl=culateMileageService.culateSjgl(sList); 479 + double ljgl=culateMileageService.culateLjgl(list_s);
  480 + double sjgl=culateMileageService.culateSjgl(list_s);
437 double zyygl=Arith.add(ljgl, sjgl); 481 double zyygl=Arith.add(ljgl, sjgl);
438 double jhgl=culateMileageService.culateJhgl(sList); 482 double jhgl=culateMileageService.culateJhgl(sList);
439 double cjgl=culateMileageService.culateLbgl(sList); 483 double cjgl=culateMileageService.culateLbgl(sList);
440 - int jhbc =culateMileageService.culateJhbc(sList,""); 484 + int jhbc=culateMileageService.culateJhbc(sList,"");
441 int cjbc=culateMileageService.culateLbbc(sList); 485 int cjbc=culateMileageService.culateLbbc(sList);
442 - int ljbc=culateMileageService.culateLjbc(sList,"");  
443 - int sjbc=culateMileageService.culateSjbc(sList, "");  
444 - double zjgl=culateMileageService.culateLjgl(sList); 486 + int ljbc=culateMileageService.culateLjbc(list_s,"");
  487 + int sjbc=culateMileageService.culateSjbc(list_s, "");
  488 + double zjgl=culateMileageService.culateLjgl(list_s);
445 d.setEmptMileage(String.valueOf(zksgl));//空驶公里 489 d.setEmptMileage(String.valueOf(zksgl));//空驶公里
446 d.setTotalm(String.valueOf(Arith.add(zksgl, zyygl)));//总公里 490 d.setTotalm(String.valueOf(Arith.add(zksgl, zyygl)));//总公里
447 d.setSjbc(String.valueOf(sjbc+ljbc)); 491 d.setSjbc(String.valueOf(sjbc+ljbc));
@@ -1055,7 +1099,7 @@ public class FormsServiceImpl implements FormsService { @@ -1055,7 +1099,7 @@ public class FormsServiceImpl implements FormsService {
1055 if (cts != null && cts.size() > 0) { 1099 if (cts != null && cts.size() > 0) {
1056 newList.add(s); 1100 newList.add(s);
1057 } else { 1101 } else {
1058 - if (s.getZdsjActual() != null) { 1102 + if (s.getZdsjActual() != null && s.getFcsjActual() != null) {
1059 newList.add(s); 1103 newList.add(s);
1060 } 1104 }
1061 } 1105 }
@@ -1140,7 +1184,7 @@ public class FormsServiceImpl implements FormsService { @@ -1140,7 +1184,7 @@ public class FormsServiceImpl implements FormsService {
1140 if (cts != null && cts.size() > 0) { 1184 if (cts != null && cts.size() > 0) {
1141 newList_.add(s); 1185 newList_.add(s);
1142 } else { 1186 } else {
1143 - if (s.getZdsjActual() != null) { 1187 + if (s.getZdsjActual() != null && s.getFcsjActual() != null) {
1144 newList_.add(s); 1188 newList_.add(s);
1145 } 1189 }
1146 } 1190 }
@@ -1610,10 +1654,19 @@ public class FormsServiceImpl implements FormsService { @@ -1610,10 +1654,19 @@ public class FormsServiceImpl implements FormsService {
1610 for (int j = 0; j < lists.size(); j++) { 1654 for (int j = 0; j < lists.size(); j++) {
1611 ScheduleRealInfo s=lists.get(j); 1655 ScheduleRealInfo s=lists.get(j);
1612 if(d.getJgh().equals(s.getjGh()) && d.getZbh().equals(s.getClZbh())){ 1656 if(d.getJgh().equals(s.getjGh()) && d.getZbh().equals(s.getClZbh())){
1613 - sList.add(s); 1657 + Set<ChildTaskPlan> cts = s.getcTasks();
  1658 + if(cts != null && cts.size() > 0){
  1659 + sList.add(s);
  1660 + }else{
  1661 + if(s.getZdsjActual()!=null && s.getFcsjActual()!=null){
  1662 + sList.add(s);
  1663 + }
  1664 + }
  1665 +
1614 } 1666 }
1615 } 1667 }
1616 1668
  1669 +
1617 double ksgl=culateMileageService.culateKsgl(sList); 1670 double ksgl=culateMileageService.culateKsgl(sList);
1618 double jccgl=culateMileageService.culateJccgl(sList); 1671 double jccgl=culateMileageService.culateJccgl(sList);
1619 double zksgl=Arith.add(ksgl, jccgl); 1672 double zksgl=Arith.add(ksgl, jccgl);
src/main/java/com/bsth/service/impl/BusIntervalServiceImpl.java
@@ -418,7 +418,8 @@ public class BusIntervalServiceImpl implements BusIntervalService { @@ -418,7 +418,8 @@ public class BusIntervalServiceImpl implements BusIntervalService {
418 for(ScheduleRealInfo schedule : keyMap2.get(date)){ 418 for(ScheduleRealInfo schedule : keyMap2.get(date)){
419 if(schedule.getFcsjT() != null && !schedule.isSflj()) 419 if(schedule.getFcsjT() != null && !schedule.isSflj())
420 fcsjs.add(schedule.getFcsjT()); 420 fcsjs.add(schedule.getFcsjT());
421 - if(schedule.getFcsjActualTime() != null && schedule.getStatus() != -1) 421 + if(schedule.getFcsjActualTime() != null && schedule.getZdsjActualTime() != null
  422 + && schedule.getStatus() != -1)
422 fcsjAs.add(schedule.getFcsjActualTime()); 423 fcsjAs.add(schedule.getFcsjActualTime());
423 } 424 }
424 Collections.sort(fcsjs); 425 Collections.sort(fcsjs);
@@ -1686,7 +1687,8 @@ public class BusIntervalServiceImpl implements BusIntervalService { @@ -1686,7 +1687,8 @@ public class BusIntervalServiceImpl implements BusIntervalService {
1686 jhbc++; 1687 jhbc++;
1687 jhlc = jhlc.add(lc); 1688 jhlc = jhlc.add(lc);
1688 } 1689 }
1689 - if(schedule.getStatus() != -1 && !schedule.isCcService()){ 1690 + if(schedule.getFcsjActual() != null && schedule.getZdsjActual() != null
  1691 + && schedule.getStatus() != -1 && !schedule.isCcService()){
1690 sjbc++; 1692 sjbc++;
1691 sjlc = sjlc.add(lc); 1693 sjlc = sjlc.add(lc);
1692 } else if(schedule.getStatus() == -1 && !schedule.isCcService()){ 1694 } else if(schedule.getStatus() == -1 && !schedule.isCcService()){
@@ -1920,8 +1922,8 @@ public class BusIntervalServiceImpl implements BusIntervalService { @@ -1920,8 +1922,8 @@ public class BusIntervalServiceImpl implements BusIntervalService {
1920 dxtz = 0, lbtz = 0; 1922 dxtz = 0, lbtz = 0;
1921 for(ScheduleRealInfo schedule : keyMap.get(key)){ 1923 for(ScheduleRealInfo schedule : keyMap.get(key)){
1922 boolean flag = false; 1924 boolean flag = false;
1923 - if(schedule.getFcsjActual() != null && schedule.getStatus() != -1  
1924 - && !schedule.isCcService()){ 1925 + if(schedule.getFcsjActual() != null && schedule.getZdsjActual() != null
  1926 + && schedule.getStatus() != -1 && !schedule.isCcService()){
1925 sjbc++; 1927 sjbc++;
1926 if(schedule.getDfsj() != null && !schedule.getDfsj().equals(schedule.getFcsj())){ 1928 if(schedule.getDfsj() != null && !schedule.getDfsj().equals(schedule.getFcsj())){
1927 flag = true; 1929 flag = true;
src/main/java/com/bsth/service/impl/LineVersionsServiceImpl.java
@@ -9,7 +9,6 @@ import java.util.HashMap; @@ -9,7 +9,6 @@ import java.util.HashMap;
9 import java.util.List; 9 import java.util.List;
10 import java.util.Map; 10 import java.util.Map;
11 11
12 -import org.drools.core.time.impl.PseudoClockScheduler;  
13 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
14 import org.springframework.jdbc.core.BatchPreparedStatementSetter; 13 import org.springframework.jdbc.core.BatchPreparedStatementSetter;
15 import org.springframework.jdbc.core.JdbcTemplate; 14 import org.springframework.jdbc.core.JdbcTemplate;
@@ -141,9 +140,8 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ @@ -141,9 +140,8 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ
141 jdbcTemplate.update("delete from bsth_c_stationroute where line = ? and line_code = ?", lineId, lineCode); 140 jdbcTemplate.update("delete from bsth_c_stationroute where line = ? and line_code = ?", lineId, lineCode);
142 141
143 String stationSql ="insert into bsth_c_stationroute(id,line,station,station_name,station_route_code," 142 String stationSql ="insert into bsth_c_stationroute(id,line,station,station_name,station_route_code,"
144 - + "line_code,station_code,station_mark,out_station_nmber,directions,distances,"  
145 - + "to_time,first_time,end_time,descriptions,destroy,versions,create_by,create_date,"  
146 - + "update_by,update_date) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 143 + + "line_code,station_code,station_mark,directions,distances,to_time,destroy,versions,"
  144 + + "create_date,update_date) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
147 jdbcTemplate.batchUpdate(stationSql, new BatchPreparedStatementSetter() { 145 jdbcTemplate.batchUpdate(stationSql, new BatchPreparedStatementSetter() {
148 146
149 @Override 147 @Override
@@ -158,19 +156,13 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ @@ -158,19 +156,13 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ
158 ps.setString(6, sRoute.getLineCode()); 156 ps.setString(6, sRoute.getLineCode());
159 ps.setString(7, sRoute.getStationCode()); 157 ps.setString(7, sRoute.getStationCode());
160 ps.setString(8, sRoute.getStationMark()); 158 ps.setString(8, sRoute.getStationMark());
161 - ps.setInt(9, sRoute.getOutStationNmber()==null ? 0:sRoute.getOutStationNmber());  
162 - ps.setInt(10, sRoute.getDirections());  
163 - ps.setDouble(11, sRoute.getDistances());  
164 - ps.setDouble(12, sRoute.getToTime());  
165 - ps.setString(13, sRoute.getFirstTime()==null ? "":sRoute.getFirstTime());  
166 - ps.setString(14, sRoute.getEndTime()==null ? "":sRoute.getEndTime());  
167 - ps.setString(15, sRoute.getDescriptions()==null ? "":sRoute.getDescriptions());  
168 - ps.setInt(16, sRoute.getDestroy());  
169 - ps.setInt(17, sRoute.getVersions());  
170 - ps.setInt(18, sRoute.getCreateBy()==null ? 0:sRoute.getCreateBy());  
171 - ps.setDate(19, new java.sql.Date(sRoute.getCreateDate().getTime()));  
172 - ps.setInt(20, sRoute.getUpdateBy()==null ? 0:sRoute.getUpdateBy());  
173 - ps.setDate(21, new java.sql.Date(sRoute.getUpdateDate().getTime())); 159 + ps.setInt(9, sRoute.getDirections());
  160 + ps.setDouble(10, sRoute.getDistances());
  161 + ps.setDouble(11, sRoute.getToTime());
  162 + ps.setInt(12, sRoute.getDestroy());
  163 + ps.setInt(13, sRoute.getVersions());
  164 + ps.setDate(14, new java.sql.Date(sRoute.getCreateDate().getTime()));
  165 + ps.setDate(15, new java.sql.Date(sRoute.getUpdateDate().getTime()));
174 } 166 }
175 167
176 @Override 168 @Override
@@ -182,8 +174,8 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ @@ -182,8 +174,8 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ
182 jdbcTemplate.update("delete from bsth_c_sectionroute where line = ? and line_code = ?", lineId, lineCode); 174 jdbcTemplate.update("delete from bsth_c_sectionroute where line = ? and line_code = ?", lineId, lineCode);
183 175
184 String sectionSql ="insert into bsth_c_sectionroute(id,line_code,section_code,sectionroute_code," 176 String sectionSql ="insert into bsth_c_sectionroute(id,line_code,section_code,sectionroute_code,"
185 - + "directions,line,section,descriptions,create_by,create_date,update_by,update_date,versions,"  
186 - + "destroy,is_roade_speed) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 177 + + "directions,line,section,create_date,update_date,versions,"
  178 + + "destroy) values(?,?,?,?,?,?,?,?,?,?,?)";
187 jdbcTemplate.batchUpdate(sectionSql, new BatchPreparedStatementSetter() { 179 jdbcTemplate.batchUpdate(sectionSql, new BatchPreparedStatementSetter() {
188 180
189 @Override 181 @Override
@@ -196,14 +188,10 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ @@ -196,14 +188,10 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ
196 ps.setInt(5, sRoute.getDirections()); 188 ps.setInt(5, sRoute.getDirections());
197 ps.setInt(6, sRoute.getLine().getId()); 189 ps.setInt(6, sRoute.getLine().getId());
198 ps.setInt(7, sRoute.getSection().getId()); 190 ps.setInt(7, sRoute.getSection().getId());
199 - ps.setString(8, sRoute.getDescriptions()==null ? "":sRoute.getDescriptions());  
200 - ps.setInt(9, sRoute.getCreateBy()==null ? 0:sRoute.getCreateBy());  
201 - ps.setDate(10, new java.sql.Date(sRoute.getCreateDate().getTime()));  
202 - ps.setInt(11, sRoute.getUpdateBy()==null ? 0:sRoute.getUpdateBy());  
203 - ps.setDate(12, new java.sql.Date(sRoute.getUpdateDate().getTime()));  
204 - ps.setInt(13, sRoute.getVersions());  
205 - ps.setInt(14, sRoute.getDestroy());  
206 - ps.setInt(15, sRoute.getIsRoadeSpeed()==null ? 0:sRoute.getIsRoadeSpeed()); 191 + ps.setDate(8, new java.sql.Date(sRoute.getCreateDate().getTime()));
  192 + ps.setDate(9, new java.sql.Date(sRoute.getUpdateDate().getTime()));
  193 + ps.setInt(10, sRoute.getVersions());
  194 + ps.setInt(11, sRoute.getDestroy());
207 } 195 }
208 196
209 @Override 197 @Override
@@ -231,5 +219,10 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ @@ -231,5 +219,10 @@ public class LineVersionsServiceImpl extends BaseServiceImpl&lt;LineVersions, Integ
231 } 219 }
232 return list; 220 return list;
233 } 221 }
  222 +
  223 + @Override
  224 + public LineVersions findLineVersionsMax(int lineId) {
  225 + return repository.findLineVersionsMax(lineId);
  226 + }
234 227
235 } 228 }
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
@@ -800,7 +800,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -800,7 +800,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
800 + " min(s.fcsj) as fcsj,2 as px from bsth_c_s_sp_info_real s " 800 + " min(s.fcsj) as fcsj,2 as px from bsth_c_s_sp_info_real s "
801 + " where s.xl_Bm = '"+line+"' and s.schedule_date_str ='"+date+"'" 801 + " where s.xl_Bm = '"+line+"' and s.schedule_date_str ='"+date+"'"
802 + " GROUP BY s.j_Gh,s.cl_Zbh,s.lp_Name ,s.j_Name " 802 + " GROUP BY s.j_Gh,s.cl_Zbh,s.lp_Name ,s.j_Name "
803 - + " ) y where y.fcsj <='"+minfcsj+"') z order by (" + state + "),dateStr,px " + type; 803 + + " ) y where y.fcsj <='"+minfcsj+"') z order by (" + state + "),dateStr,px,fcsj " + type;
804 List<ScheduleRealInfo> list = jdbcTemplate.query(sqlPlan, 804 List<ScheduleRealInfo> list = jdbcTemplate.query(sqlPlan,
805 new RowMapper<ScheduleRealInfo>() { 805 new RowMapper<ScheduleRealInfo>() {
806 @Override 806 @Override
@@ -2646,11 +2646,18 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -2646,11 +2646,18 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
2646 map.put("dtbc", 0); 2646 map.put("dtbc", 0);
2647 map.put("dtbc_m", 0); 2647 map.put("dtbc_m", 0);
2648 map.put("dtbc_a", 0); 2648 map.put("dtbc_a", 0);
2649 - Map<String, Object> m_=culateService.culateDjg(list_s, list.get(0).getXlBm());  
2650 - map.put("djg", m_.get("djgcsq"));  
2651 - map.put("djg_m", m_.get("djgcsz"));  
2652 - map.put("djg_a", m_.get("djgcsw"));  
2653 - map.put("djg_time", m_.get("djgsj")); 2649 + if(list.size()>0){
  2650 + Map<String, Object> m_=culateService.culateDjg(list_s, list.get(0).getXlBm());
  2651 + map.put("djg", m_.get("djgcsq"));
  2652 + map.put("djg_m", m_.get("djgcsz"));
  2653 + map.put("djg_a", m_.get("djgcsw"));
  2654 + map.put("djg_time", m_.get("djgsj"));
  2655 + }else{
  2656 + map.put("djg", "0");
  2657 + map.put("djg_m", "0");
  2658 + map.put("djg_a", "0");
  2659 + map.put("djg_time", "0");
  2660 + }
2654 lMap.add(map); 2661 lMap.add(map);
2655 if (type != null && type.length() != 0 && type.equals("export")) { 2662 if (type != null && type.length() != 0 && type.equals("export")) {
2656 SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"), 2663 SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM-dd"),
src/main/java/com/bsth/service/report/impl/CulateMileageServiceImpl.java
@@ -1383,7 +1383,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{ @@ -1383,7 +1383,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{
1383 djgcsz ++; 1383 djgcsz ++;
1384 djgcsq ++; 1384 djgcsq ++;
1385 if(fscjNext-fcsjTime>djcsj){ 1385 if(fscjNext-fcsjTime>djcsj){
1386 - djcsj=(fscjNext-fcsjTime)/1000; 1386 + djcsj=(fscjNext-fcsjTime)/60000;
1387 } 1387 }
1388 } 1388 }
1389 }else if((fcsj>=wgf1&&fcsj<=wgf2)){ 1389 }else if((fcsj>=wgf1&&fcsj<=wgf2)){
@@ -1392,7 +1392,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{ @@ -1392,7 +1392,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{
1392 djgcsw ++; 1392 djgcsw ++;
1393 djgcsq ++; 1393 djgcsq ++;
1394 if(fscjNext-fcsjTime>djcsj){ 1394 if(fscjNext-fcsjTime>djcsj){
1395 - djcsj=(fscjNext-fcsjTime)/1000; 1395 + djcsj=(fscjNext-fcsjTime)/60000;
1396 } 1396 }
1397 } 1397 }
1398 }else{ 1398 }else{
@@ -1400,7 +1400,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{ @@ -1400,7 +1400,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{
1400 if(fscjNext-fcsjTime>djg){ 1400 if(fscjNext-fcsjTime>djg){
1401 djgcsq ++; 1401 djgcsq ++;
1402 if(fscjNext-fcsjTime>djcsj){ 1402 if(fscjNext-fcsjTime>djcsj){
1403 - djcsj=(fscjNext-fcsjTime)/1000; 1403 + djcsj=(fscjNext-fcsjTime)/60000;
1404 } 1404 }
1405 } 1405 }
1406 } 1406 }
@@ -1421,7 +1421,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{ @@ -1421,7 +1421,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{
1421 djgcsz ++; 1421 djgcsz ++;
1422 djgcsq ++; 1422 djgcsq ++;
1423 if(fscjNext-fcsjTime>djcsj){ 1423 if(fscjNext-fcsjTime>djcsj){
1424 - djcsj=(fscjNext-fcsjTime)/1000; 1424 + djcsj=(fscjNext-fcsjTime)/60000;
1425 } 1425 }
1426 } 1426 }
1427 }else if(fcsj>=wgf1&&fcsj<=wgf2){ 1427 }else if(fcsj>=wgf1&&fcsj<=wgf2){
@@ -1430,7 +1430,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{ @@ -1430,7 +1430,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{
1430 djgcsw ++; 1430 djgcsw ++;
1431 djgcsq ++; 1431 djgcsq ++;
1432 if(fscjNext-fcsjTime>djcsj){ 1432 if(fscjNext-fcsjTime>djcsj){
1433 - djcsj=(fscjNext-fcsjTime)/1000; 1433 + djcsj=(fscjNext-fcsjTime)/60000;
1434 } 1434 }
1435 } 1435 }
1436 }else{ 1436 }else{
@@ -1438,7 +1438,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{ @@ -1438,7 +1438,7 @@ public class CulateMileageServiceImpl implements CulateMileageService{
1438 if(fscjNext-fcsjTime>djg){ 1438 if(fscjNext-fcsjTime>djg){
1439 djgcsq ++; 1439 djgcsq ++;
1440 if(fscjNext-fcsjTime>djcsj){ 1440 if(fscjNext-fcsjTime>djcsj){
1441 - djcsj=(fscjNext-fcsjTime)/1000; 1441 + djcsj=(fscjNext-fcsjTime)/60000;
1442 } 1442 }
1443 } 1443 }
1444 } 1444 }
src/main/java/com/bsth/service/report/impl/ReportServiceImpl.java
@@ -3089,15 +3089,26 @@ public class ReportServiceImpl implements ReportService{ @@ -3089,15 +3089,26 @@ public class ReportServiceImpl implements ReportService{
3089 ScheduleRealInfo sinfo=list.get(j); 3089 ScheduleRealInfo sinfo=list.get(j);
3090 try { 3090 try {
3091 if(sinfo.getXlBm().equals(lineCode)){ 3091 if(sinfo.getXlBm().equals(lineCode)){
3092 - list_.add(sinfo);  
3093 - ScheduleRealInfo s=checkBc(sinfo);  
3094 - String fcsj=s.getFcsjActual()==null?"":s.getFcsjActual();  
3095 - if(!fcsj.equals("")){  
3096 - Long fcsjAcual = sdf.parse(s.getRealExecDate() + " " + s.getFcsjActual()).getTime();  
3097 - s.setFcsjActualTime(fcsjAcual);  
3098 - s.setFcsjActual(fcsj);  
3099 - listInfo.add(s);  
3100 - } 3092 + boolean type_=false;
  3093 + Set<ChildTaskPlan> cts = sinfo.getcTasks();
  3094 + if(cts != null && cts.size() > 0){
  3095 + type_=true;
  3096 + }else{
  3097 + if(sinfo.getZdsjActual()!=null && sinfo.getFcsjActual()!=null){
  3098 + type_=true;
  3099 + }
  3100 + }
  3101 + if(type_){
  3102 + list_.add(sinfo);
  3103 + ScheduleRealInfo s=checkBc(sinfo);
  3104 + String fcsj=s.getFcsjActual()==null?"":s.getFcsjActual();
  3105 + if(!fcsj.equals("")){
  3106 + Long fcsjAcual = sdf.parse(s.getRealExecDate() + " " + s.getFcsjActual()).getTime();
  3107 + s.setFcsjActualTime(fcsjAcual);
  3108 + s.setFcsjActual(fcsj);
  3109 + listInfo.add(s);
  3110 + }
  3111 + }
3101 3112
3102 } 3113 }
3103 } catch (ParseException e) { 3114 } catch (ParseException e) {
src/main/java/com/bsth/service/schedule/impl/PeopleCarPlanServiceImpl.java
@@ -80,6 +80,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { @@ -80,6 +80,7 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
80 schedule.setsGh(rs.getString("s_gh")); 80 schedule.setsGh(rs.getString("s_gh"));
81 schedule.setsName(rs.getString("s_name")); 81 schedule.setsName(rs.getString("s_name"));
82 schedule.setSpId(rs.getLong("sp_id")); 82 schedule.setSpId(rs.getLong("sp_id"));
  83 + schedule.setSflj(rs.getBoolean("sflj"));
83 schedule.setCcService(rs.getBoolean("cc_service")); 84 schedule.setCcService(rs.getBoolean("cc_service"));
84 85
85 if(schedule.getFcsjActual() != null && schedule.getFcsjActual().trim().length() == 0){ 86 if(schedule.getFcsjActual() != null && schedule.getFcsjActual().trim().length() == 0){
@@ -224,8 +225,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { @@ -224,8 +225,12 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
224 225
225 //分组计算路程公里 226 //分组计算路程公里
226 for(SchedulePlanInfo schedule : list){ 227 for(SchedulePlanInfo schedule : list){
  228 + if(schedule.getsName() != null && schedule.getsName().trim().equals("")){
  229 + schedule.setsName(null);
  230 + }
227 String key = schedule.getXlName() + "/" + schedule.getLpName() + "/" + 231 String key = schedule.getXlName() + "/" + schedule.getLpName() + "/" +
228 schedule.getClZbh() + "/" + schedule.getjName() + "/" + schedule.getsName(); 232 schedule.getClZbh() + "/" + schedule.getjName() + "/" + schedule.getsName();
  233 + key = key.trim();
229 if(!keyMap.containsKey(key)) 234 if(!keyMap.containsKey(key))
230 keyMap.put(key, new ArrayList<SchedulePlanInfo>()); 235 keyMap.put(key, new ArrayList<SchedulePlanInfo>());
231 keyMap.get(key).add(schedule); 236 keyMap.get(key).add(schedule);
@@ -273,10 +278,11 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { @@ -273,10 +278,11 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
273 str += (int)lp.charAt(i); 278 str += (int)lp.charAt(i);
274 } 279 }
275 Long i = Long.valueOf(str); 280 Long i = Long.valueOf(str);
276 - if(!tempList.containsKey(i)) 281 + if(!tempList.containsKey(i)){
277 tempList.put(i, new ArrayList<Map<String, Object>>()); 282 tempList.put(i, new ArrayList<Map<String, Object>>());
  283 + keyList.add(i);
  284 + }
278 tempList.get(i).add(m); 285 tempList.get(i).add(m);
279 - keyList.add(i);  
280 } 286 }
281 Collections.sort(keyList); 287 Collections.sort(keyList);
282 for(Long i : keyList){ 288 for(Long i : keyList){
@@ -387,14 +393,22 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { @@ -387,14 +393,22 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
387 } 393 }
388 394
389 //班次数和出场数 395 //班次数和出场数
390 - jhbc++;  
391 - if(schedule.getBcType().equals("out"))  
392 - jhcc++; 396 + if(!schedule.isSflj() && schedule.getFcsj() != null && schedule.getZdsj() != null){
  397 + if(!schedule.getBcType().equals("in") && !schedule.getBcType().equals("out") && !schedule.getBcType().equals("ldks")){
  398 + jhbc++;
  399 + System.out.print((""+schedule.isSflj()).equals("false")?"":"X" + " ");
  400 + }
  401 + if(schedule.getBcType().equals("out"))
  402 + jhcc++;
  403 + }
  404 + if(schedule.getStatus() != -1 && schedule.getBcType().equals("out"))
  405 + sjcc++;
393 406
  407 + if(!schedule.getBcType().equals("in") && !schedule.getBcType().equals("out") && !schedule.getBcType().equals("ldks")
  408 + && schedule.getFcsjActual() != null && schedule.getZdsjActual() != null && schedule.getStatus() != -1){
  409 +
394 //发出时间快慢 410 //发出时间快慢
395 if(schedule.getFcsjActual() != null){ 411 if(schedule.getFcsjActual() != null){
396 - if(schedule.getBcType().equals("out"))  
397 - sjcc++;  
398 // schedule.setFcsjActualAll(schedule.getFcsjActual()); 412 // schedule.setFcsjActualAll(schedule.getFcsjActual());
399 if(schedule.getFcsjActualTime() - schedule.getFcsjT() < -1){ 413 if(schedule.getFcsjActualTime() - schedule.getFcsjT() < -1){
400 if(schedule.getXlDir().equals("0")) 414 if(schedule.getXlDir().equals("0"))
@@ -434,14 +448,15 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService { @@ -434,14 +448,15 @@ public class PeopleCarPlanServiceImpl implements PeopleCarPlanService {
434 } 448 }
435 } 449 }
436 450
437 - if(!schedule.getBcType().equals("in") && !schedule.getBcType().equals("out")  
438 - && !schedule.getBcType().equals("ldks") && schedule.getFcsjActual() != null){ 451 + if(!schedule.getBcType().equals("in") && !schedule.getBcType().equals("out") && !schedule.getBcType().equals("ldks")
  452 + && schedule.getFcsjActual() != null && schedule.getZdsjActual() != null){
439 // String clZbh = schedule.getClZbh(); 453 // String clZbh = schedule.getClZbh();
440 String xlDir = schedule.getXlDir(); 454 String xlDir = schedule.getXlDir();
441 if(!listMap.containsKey(xlDir)) 455 if(!listMap.containsKey(xlDir))
442 listMap.put(xlDir, new ArrayList<ScheduleRealInfo>()); 456 listMap.put(xlDir, new ArrayList<ScheduleRealInfo>());
443 listMap.get(xlDir).add(schedule); 457 listMap.get(xlDir).add(schedule);
444 } 458 }
  459 + }
445 } 460 }
446 461
447 //求首末班准点率 462 //求首末班准点率
src/main/resources/application-prod.properties
1 -server.port=9088  
2 -management.port= 9001  
3 -management.address= 127.0.0.1  
4 -  
5 -spring.jpa.hibernate.ddl-auto= none  
6 -spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy  
7 -#DATABASE  
8 -spring.jpa.database= MYSQL  
9 -spring.jpa.show-sql= false  
10 -spring.datasource.driver-class-name= com.mysql.jdbc.Driver  
11 -spring.datasource.url= jdbc:mysql://10.10.150.20:3306/control?useUnicode=true&characterEncoding=utf-8&useSSL=false  
12 -spring.datasource.username= root  
13 -spring.datasource.password= root2jsp@JSP  
14 -#DATASOURCE  
15 -spring.datasource.max-active=100  
16 -spring.datasource.max-idle=8  
17 -spring.datasource.min-idle=8  
18 -spring.datasource.initial-size=5  
19 -  
20 -spring.datasource.test-on-borrow=true  
21 -spring.datasource.test-on-connect=true  
22 -spring.datasource.test-on-return=true  
23 -spring.datasource.test-while-idle=true  
24 -spring.datasource.validation-query=select 1  
25 -  
26 -## gps client data  
27 -http.gps.real.cache.url= http://10.10.150.24:12580/realGps/all  
28 -## gateway real data  
29 -http.gps.real.url= http://10.10.150.21:8080/transport_server/rtgps/  
30 -## gateway send directive 1 +server.port=9088
  2 +management.port= 9001
  3 +management.address= 127.0.0.1
  4 +
  5 +spring.jpa.hibernate.ddl-auto= none
  6 +spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy
  7 +#DATABASE
  8 +spring.jpa.database= MYSQL
  9 +spring.jpa.show-sql= false
  10 +spring.datasource.driver-class-name= com.mysql.jdbc.Driver
  11 +spring.datasource.url= jdbc:mysql://10.10.150.20:3306/control?useUnicode=true&characterEncoding=utf-8&useSSL=false
  12 +spring.datasource.username= root
  13 +spring.datasource.password= root2jsp@JSP
  14 +#DATASOURCE
  15 +spring.datasource.max-active=100
  16 +spring.datasource.max-idle=8
  17 +spring.datasource.min-idle=8
  18 +spring.datasource.initial-size=5
  19 +
  20 +spring.datasource.test-on-borrow=true
  21 +spring.datasource.test-on-connect=true
  22 +spring.datasource.test-on-return=true
  23 +spring.datasource.test-while-idle=true
  24 +spring.datasource.validation-query=select 1
  25 +
  26 +## gps client data
  27 +http.gps.real.cache.url= http://10.10.150.24:12580/realGps/all
  28 +## gateway real data
  29 +http.gps.real.url= http://10.10.150.21:8080/transport_server/rtgps/
  30 +## gateway send directive
31 http.send.directive = http://10.10.150.21:8080/transport_server/message/ 31 http.send.directive = http://10.10.150.21:8080/transport_server/message/
32 \ No newline at end of file 32 \ No newline at end of file
src/main/resources/static/pages/base/line/editRoute.html
@@ -57,7 +57,7 @@ @@ -57,7 +57,7 @@
57 <p> 57 <p>
58 <span class="help-block" style="color: #1bbc9b;"> 58 <span class="help-block" style="color: #1bbc9b;">
59 &nbsp;请在文本域中按顺序依次输坐标点,每行中的数据之间用【Tab】键隔开(如果是站点,请将在坐标后面加 stop;没有 59 &nbsp;请在文本域中按顺序依次输坐标点,每行中的数据之间用【Tab】键隔开(如果是站点,请将在坐标后面加 stop;没有
60 - stop默认是路段点),每输入完一个坐标时请按回车键【Enter】换行. 例如:<!-- <br> 121.715623 60 + stop默认是路段点,连续带stop的坐标认为是同一个站点),每输入完一个坐标时请按回车键【Enter】换行. 例如:<!-- <br> 121.715623
61 31.224058 042408.000<br> 121.715623 31.224065 042409.000 61 31.224058 042408.000<br> 121.715623 31.224065 042409.000
62 Stop<br> 121.715623 31.224065 042410.000<br> --> 62 Stop<br> 121.715623 31.224065 042410.000<br> -->
63 <br>121.511870 31.180638 043703.000 63 <br>121.511870 31.180638 043703.000
src/main/resources/static/pages/base/line/map.html
@@ -175,7 +175,7 @@ $(function(){ @@ -175,7 +175,7 @@ $(function(){
175 WorldsBMapLine.deleteCutSectionPoint(firstPoint); 175 WorldsBMapLine.deleteCutSectionPoint(firstPoint);
176 WorldsBMapLine.setIsCutSection(false); 176 WorldsBMapLine.setIsCutSection(false);
177 } else { 177 } else {
178 - layer.msg("没有截取路段,不可以删除!!!"); 178 + layer.msg("没有截取路段,不可以撤销!!!");
179 } 179 }
180 }); 180 });
181 // 滚动轴监听事件 181 // 滚动轴监听事件
src/main/resources/static/pages/base/line/submit_select.html
@@ -23,9 +23,9 @@ @@ -23,9 +23,9 @@
23 </form> 23 </form>
24 </div> 24 </div>
25 <div class="modal-footer"> 25 <div class="modal-footer">
26 - <button type="button" class="btn default" data-dismiss="modal">取消</button>  
27 <button type="button" class="btn btn-primary" 26 <button type="button" class="btn btn-primary"
28 id="submitSelectnextButton">提交</button> 27 id="submitSelectnextButton">提交</button>
  28 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
29 </div> 29 </div>
30 </div> 30 </div>
31 </div> 31 </div>
@@ -50,9 +50,9 @@ @@ -50,9 +50,9 @@
50 } 50 }
51 if(this.status==1){ 51 if(this.status==1){
52 //当前版本为默认 52 //当前版本为默认
53 - options += '<option value="'+this.versions+','+this.status+','+startDate+'" > 版本'+this.versions+' 启用时间:'+startDate+' 当前版本</option>'; 53 + options += '<option value="'+this.versions+','+this.status+','+startDate+'" selected = "selected" > 版本'+this.versions+' 启用时间:'+startDate+' 当前版本</option>';
54 } else if(this.status==2){ 54 } else if(this.status==2){
55 - options += '<option value="'+this.versions+','+this.status+','+startDate+'" selected = "selected"> 版本'+this.versions+' 启用时间:'+startDate+' 待更新版本</option>'; 55 + options += '<option value="'+this.versions+','+this.status+','+startDate+'"> 版本'+this.versions+' 启用时间:'+startDate+' 待更新版本</option>';
56 } 56 }
57 }); 57 });
58 $('#lineVersions').html(options); 58 $('#lineVersions').html(options);
src/main/resources/static/pages/base/lineversions/add.html
1 <!-- 片段标题 START --> 1 <!-- 片段标题 START -->
2 <div class="page-head"> 2 <div class="page-head">
3 <div class="page-title"> 3 <div class="page-title">
4 - <h1>修改添加信息</h1> 4 + <h1>添加线路版本</h1>
5 </div> 5 </div>
6 </div> 6 </div>
7 <!-- 片段标题 END --> 7 <!-- 片段标题 END -->
8 8
9 -<!-- 线路信息导航栏组件 START --> 9 +<!-- 线路版本信息导航栏组件 START -->
10 <ul class="page-breadcrumb breadcrumb"> 10 <ul class="page-breadcrumb breadcrumb">
11 <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> 11 <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li>
12 <li><span class="active">基础信息</span> <i class="fa fa-circle"></i></li> 12 <li><span class="active">基础信息</span> <i class="fa fa-circle"></i></li>
13 - <li><a href="/pages/base/line/list.html" data-pjax>线路信息</a> <i class="fa fa-circle"></i></li> 13 + <li><a href="/pages/base/lineversions/list.html" data-pjax>线路版本信息</a> <i class="fa fa-circle"></i></li>
14 <li><span class="active">修改添加信息</span></li> 14 <li><span class="active">修改添加信息</span></li>
15 </ul> 15 </ul>
16 -<!-- 线路信息导航栏组件 END --> 16 +<!-- 线路版本信息导航栏组件 END -->
17 17
18 <!-- 信息容器组件 START --> 18 <!-- 信息容器组件 START -->
19 <div class="portlet light bordered"> 19 <div class="portlet light bordered">
@@ -22,7 +22,7 @@ @@ -22,7 +22,7 @@
22 <div class="portlet-title"> 22 <div class="portlet-title">
23 <div class="caption"> 23 <div class="caption">
24 <i class="icon-equalizer font-red-sunglo"></i> 24 <i class="icon-equalizer font-red-sunglo"></i>
25 - <span class="caption-subject font-red-sunglo bold uppercase">添加线路信息</span> 25 + <span class="caption-subject font-red-sunglo bold uppercase">添加线路版本信息</span>
26 </div> 26 </div>
27 </div> 27 </div>
28 <!-- 信息容器组件标题 END --> 28 <!-- 信息容器组件标题 END -->
@@ -48,6 +48,17 @@ @@ -48,6 +48,17 @@
48 <!-- 表单分组组件 form-group START --> 48 <!-- 表单分组组件 form-group START -->
49 <div class="form-group"> 49 <div class="form-group">
50 <label class="control-label col-md-5"> 50 <label class="control-label col-md-5">
  51 + <span class="required"> * </span>线路版本名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
  52 + </label>
  53 + <div class="col-md-4">
  54 + <input name="name" class="form-control" style="width:100%" id="nameInput" placeholder="请填写更换版本原因,方便排班人员操作!" />
  55 + </div>
  56 + </div>
  57 + <!-- 表单分组组件 form-group END -->
  58 +
  59 + <!-- 表单分组组件 form-group START -->
  60 + <div class="form-group">
  61 + <label class="control-label col-md-5">
51 <span class="required"> * </span>线路名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: 62 <span class="required"> * </span>线路名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
52 </label> 63 </label>
53 <div class="col-md-4"> 64 <div class="col-md-4">
@@ -105,9 +116,9 @@ @@ -105,9 +116,9 @@
105 116
106 <!-- 表单分组组件 form-group START --> 117 <!-- 表单分组组件 form-group START -->
107 <div class="form-group"> 118 <div class="form-group">
108 - <label class="control-label col-md-5"> 描述/说明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label> 119 + <label class="control-label col-md-5"> 描述/说明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
109 <div class="col-md-4"> 120 <div class="col-md-4">
110 - <textarea class="form-control" rows="3" name="remark" id="remarkTextarea" placeholder="请填写更换版本原因,方便排班人员操作!"></textarea> 121 + <textarea class="form-control" rows="3" name="remark" id="remarkTextarea" placeholder="描述/说明"></textarea>
111 </div> 122 </div>
112 </div> 123 </div>
113 <!-- 表单分组组件 form-group END --> 124 <!-- 表单分组组件 form-group END -->
@@ -130,5 +141,5 @@ @@ -130,5 +141,5 @@
130 </div> 141 </div>
131 <!-- 信息容器组件 END --> 142 <!-- 信息容器组件 END -->
132 143
133 -<!-- 线路信息添加片段JS模块 --> 144 +<!-- 线路版本信息添加片段JS模块 -->
134 <script src="/pages/base/lineversions/js/lineversions-add-from.js"></script> 145 <script src="/pages/base/lineversions/js/lineversions-add-from.js"></script>
135 \ No newline at end of file 146 \ No newline at end of file
src/main/resources/static/pages/base/lineversions/js/lineversions-add-from.js
@@ -70,6 +70,9 @@ @@ -70,6 +70,9 @@
70 $('#lineIdInput').val('');// 设值线路ID. 70 $('#lineIdInput').val('');// 设值线路ID.
71 }else { 71 }else {
72 var lineSelectValueArray = lineSelectValue.split('_');// 切割线路名称值. 72 var lineSelectValueArray = lineSelectValue.split('_');// 切割线路名称值.
  73 + $.get('/lineVersions/findLineVersionsMax',{'lineId':lineSelectValueArray[1]}, function(lineVersionsMax){
  74 + $('#versionsInput').val(++lineVersionsMax.versions);// 设值线路编码.
  75 + });
73 $('#lineIdInput').val(lineSelectValueArray[0]);// 设值线路编码. 76 $('#lineIdInput').val(lineSelectValueArray[0]);// 设值线路编码.
74 $('#lineCodeInput').val(lineSelectValueArray[1]);// 设值线路ID. 77 $('#lineCodeInput').val(lineSelectValueArray[1]);// 设值线路ID.
75 } 78 }
@@ -110,6 +113,7 @@ @@ -110,6 +113,7 @@
110 focusInvalid : true, 113 focusInvalid : true,
111 // 需要验证的表单元素 114 // 需要验证的表单元素
112 rules : { 115 rules : {
  116 + 'name' : {required : true,maxlength: 30},// 线路名称 必填项、最大长度.
113 'line' : {required : true,maxlength: 30},// 线路名称 必填项、最大长度. 117 'line' : {required : true,maxlength: 30},// 线路名称 必填项、最大长度.
114 'startDate' : {required : true},// 启用时间 不为空. 118 'startDate' : {required : true},// 启用时间 不为空.
115 'endDate' : {required : true},// 结束时间. 119 'endDate' : {required : true},// 结束时间.
src/main/resources/static/pages/base/stationroute/edit_select.html
@@ -124,6 +124,10 @@ $(&#39;#edit_select_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,drw,ajaxd,ed @@ -124,6 +124,10 @@ $(&#39;#edit_select_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,drw,ajaxd,ed
124 // 打开绘制工具 124 // 打开绘制工具
125 drw.openDrawingManager(); 125 drw.openDrawingManager();
126 map_.localtionPoint(editStationName); 126 map_.localtionPoint(editStationName);
  127 + layer.open({
  128 + title: '友情提示'
  129 + ,content: '重绘站点,会修改站点编码,影响已做好的排班和线路文件。请谨慎使用,谢谢!'
  130 + });
127 }else if(params.editselect==1){ 131 }else if(params.editselect==1){
128 // 弹出添加失败提示消息,2秒关闭(如果不配置,默认是3秒) 132 // 弹出添加失败提示消息,2秒关闭(如果不配置,默认是3秒)
129 var mindex = layer.msg('编辑完图形后,请双击图形区域保存',{ offset: '126px', 133 var mindex = layer.msg('编辑完图形后,请双击图形区域保存',{ offset: '126px',
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalLpObj.js
1 -/**  
2 - * 内部路牌对象。  
3 - * @constructor  
4 - */  
5 -var InternalLpObj = function(  
6 - orilpObj, // 原始路牌对象  
7 - qCount, // 总共多少圈  
8 - isUp // 圈是以上行开始还是下行开始  
9 -) {  
10 - // TODO:原始路牌对象(这个路牌是对接外部gantt图像,以后有机会改了)  
11 - this._$$_orign_lp_obj = orilpObj;  
12 -  
13 - this._$_isUp = isUp;  
14 -  
15 - // 距离上一个路牌的最小发车间隔时间  
16 - // 用于纵向添加班次的时候使用  
17 - // 默认第一个路牌为0  
18 - this._$_minVerticalIntervalTime = 0;  
19 -  
20 - // 路牌的圈数,注意每个路牌的圈数都是一致的,  
21 - // 但并不是每一圈都有值  
22 - // 第1圈从上标线开始  
23 - // 第0圈表示中标线的第一个班次组成的半圈  
24 - // 有多少圈根据最终迭代的结果来看  
25 - this._$_qCount = qCount;  
26 - // 保存的是 InternalGroupBcObj 对象  
27 - this._$_groupBcArray = new Array(qCount);  
28 -  
29 - var i;  
30 - for (i = 0; i < this._$_qCount; i++) {  
31 - this._$_groupBcArray[i] = new InternalGroupObj(  
32 - this, this._$_isUp, undefined, undefined);  
33 - }  
34 -  
35 - // 班型的相关变量  
36 - this._$_bx_isLb = false; // 是否连班  
37 - this._$_bx_isfb = false; // 是否分班  
38 - this._$_bx_isfb_5_2 = false; // 是否5休2分班  
39 - this._$_bx_desc; // 班型描述(默认为路牌编号)  
40 -  
41 - // TODO:  
42 -  
43 -};  
44 -  
45 -//------------------- get/set 方法 -------------------//  
46 -  
47 -/**  
48 - * 获取圈  
49 - * @param qIndex 圈index  
50 - */  
51 -InternalLpObj.prototype.getGroup = function(qIndex) {  
52 - return this._$_groupBcArray[qIndex];  
53 -};  
54 -  
55 -/**  
56 - * 获取班次。  
57 - * @param qIndex 第几圈  
58 - * @param bcIndex 第几个班次  
59 - */  
60 -InternalLpObj.prototype.getBc = function(qIndex, bcIndex) {  
61 - var group = this._$_groupBcArray[qIndex];  
62 - var bc;  
63 - if (bcIndex == 0) {  
64 - bc = group.getBc1();  
65 - } else if (bcIndex == 1) {  
66 - bc = group.getBc2();  
67 - }  
68 - return bc;  
69 -};  
70 -  
71 -/**  
72 - * 在具体位置设置班次。  
73 - * @param qIndex 第几圈  
74 - * @param bcIndex 第几个班次  
75 - * @param bc 班次对象  
76 - */  
77 -InternalLpObj.prototype.setBc = function(qIndex, bcIndex, bc) {  
78 - var group = this._$_groupBcArray[qIndex];  
79 - if (bcIndex == 0) {  
80 - group.setBc1(bc);  
81 - bc.setGroup(group);  
82 - } else if (bcIndex == 1) {  
83 - group.setBc2(bc);  
84 - bc.setGroup(group);  
85 - }  
86 -};  
87 -  
88 -/**  
89 - * 设置原始路牌对象。  
90 - * @param lpObj 原始路牌对象  
91 - */  
92 -InternalLpObj.prototype.setLp = function(lpObj) {  
93 - this._$$_orign_lp_obj = lpObj;  
94 - var i;  
95 - var group;  
96 - for (i = 0; i < this._$_groupBcArray.length; i++) {  
97 - group = this._$_groupBcArray[i];  
98 - if (group) {  
99 - group.setLp(this); // 圈和班次保存都是 InternalLpObj 对象  
100 - }  
101 - }  
102 -};  
103 -  
104 -InternalLpObj.prototype.getLpNo = function() {  
105 - return this._$$_orign_lp_obj.lpNo;  
106 -};  
107 -InternalLpObj.prototype.getLpName = function() {  
108 - return this._$$_orign_lp_obj.lpName;  
109 -};  
110 -InternalLpObj.prototype.setBxFb5_2 = function(fb) {  
111 - this._$_bx_isfb_5_2 = fb;  
112 -};  
113 -InternalLpObj.prototype.isBxFb5_2 = function() {  
114 - return this._$_bx_isfb_5_2;  
115 -};  
116 -InternalLpObj.prototype.setBxLb = function(lb) {  
117 - this._$_bx_isLb = lb;  
118 -};  
119 -InternalLpObj.prototype.isBxLb = function() {  
120 - return this._$_bx_isLb;  
121 -};  
122 -  
123 -InternalLpObj.prototype.setBxFb = function(fb) {  
124 - this._$_bx_isfb = fb;  
125 -};  
126 -InternalLpObj.prototype.isBxFb = function() {  
127 - return this._$_bx_isfb;  
128 -};  
129 -  
130 -/**  
131 - * 设置路牌的班型描述(最终是设置班次的路牌名字)。  
132 - * @param desc 描述  
133 - */  
134 -InternalLpObj.prototype.setBxDesc = function(desc) {  
135 - // 最终原始路牌的名字  
136 - this._$$_orign_lp_obj.lpName = desc + "_" + this._$$_orign_lp_obj.lpNo;  
137 - // 内部对象的班型描述  
138 - this._$_bx_desc = desc;  
139 -};  
140 -/**  
141 - * 获取版型描述  
142 - * @returns string  
143 - */  
144 -InternalLpObj.prototype.getBxDesc = function() {  
145 - return this._$_bx_desc;  
146 -};  
147 -  
148 -/**  
149 - * 设置纵向最小发车间隔时间。  
150 - * @param v  
151 - */  
152 -InternalLpObj.prototype.setVerticalMinIntervalTime = function(v) {  
153 - // 第一个路牌,都为0  
154 - this._$_minVerticalIntervalTime = v;  
155 -};  
156 -/**  
157 - * 获取纵向最小发车间隔时间。  
158 - * @returns {number|*}  
159 - */  
160 -InternalLpObj.prototype.getVerticalMinIntervalTime = function() {  
161 - return this._$_minVerticalIntervalTime;  
162 -};  
163 -  
164 -//-------------------- 班次操作方法(查询,统计,删除) -----------------------//  
165 -  
166 -/**  
167 - * 返回总共班次数。  
168 - */  
169 -InternalLpObj.prototype.getBcCount = function() {  
170 - var i;  
171 - var group;  
172 - var bccount = 0;  
173 - for (i = 0; i < this._$_groupBcArray.length; i++) {  
174 - group = this._$_groupBcArray[i];  
175 - if (group) {  
176 - if (group.getBc1()) {  
177 - bccount += 1;  
178 - }  
179 - if (group.getBc2()) {  
180 - bccount += 1;  
181 - }  
182 - }  
183 - }  
184 -  
185 - return bccount;  
186 -};  
187 -  
188 -/**  
189 - * 返回班次列表,过滤空的班次,将所有存在的班次连成连续的对象数组返回。  
190 - * @returns arrays (InternalBcObj)  
191 - */  
192 -InternalLpObj.prototype.getBcArray = function() {  
193 - var bcArray = [];  
194 - var i;  
195 - var group;  
196 - for (i = 0; i < this._$_groupBcArray.length; i++) {  
197 - group = this._$_groupBcArray[i];  
198 - if (group) {  
199 - group.getBc1() ? bcArray.push(group.getBc1()) : "";  
200 - group.getBc2() ? bcArray.push(group.getBc2()) : "";  
201 - }  
202 - }  
203 -  
204 - return bcArray;  
205 -};  
206 -  
207 -/**  
208 - * 获取最小(最早)班次对象。  
209 - * @returns [{圈index},{班次index}]  
210 - */  
211 -InternalLpObj.prototype.getMinBcObjPosition = function() {  
212 - var i;  
213 - var bIndex = [];  
214 - for (i = 0; i < this._$_groupBcArray.length; i++) {  
215 - if (this._$_groupBcArray[i].getBc1()) {  
216 - bIndex.push(i);  
217 - bIndex.push(0);  
218 - break;  
219 - }  
220 - if (this._$_groupBcArray[i].getBc2()) {  
221 - bIndex.push(i);  
222 - bIndex.push(1);  
223 - break;  
224 - }  
225 - }  
226 - return bIndex;  
227 -};  
228 -  
229 -/**  
230 - * 获取最大(最晚)班次对象。  
231 - * @returns [{圈index},{班次index}]  
232 - */  
233 -InternalLpObj.prototype.getMaxBcObjPosition = function() {  
234 - var i;  
235 - var bIndex = [];  
236 - for (i = this._$_groupBcArray.length - 1; i >= 0; i--) {  
237 - if (this._$_groupBcArray[i].getBc2()) {  
238 - bIndex.push(i);  
239 - bIndex.push(1);  
240 - break;  
241 - }  
242 - if (this._$_groupBcArray[i].getBc1()) {  
243 - bIndex.push(i);  
244 - bIndex.push(0);  
245 - break;  
246 - }  
247 - }  
248 - return bIndex;  
249 -};  
250 -  
251 -/**  
252 - * 在具体位置移除班次。  
253 - * @param qIndex 第几圈  
254 - * @param bcIndex 第几个班次  
255 - */  
256 -InternalLpObj.prototype.removeBc = function(qIndex, bcIndex) {  
257 - var group = this._$_groupBcArray[qIndex];  
258 - if (bcIndex == 0) {  
259 - group.removeBc1();  
260 - } else if (bcIndex == 1) {  
261 - group.removeBc2();  
262 - }  
263 -};  
264 -  
265 -/**  
266 - * 使用指定时间匹配返回离之最近的第几圈第几个班次,  
267 - * 使用时间差的绝度值,比较,取最小的  
268 - * 如果有两个一样的时间差,取比fctime大的时间  
269 - * @param fctime 比较用时间  
270 - * @param groupArray 圈数组  
271 - * @returns [{第几圈},{第几个班次}]  
272 - */  
273 -InternalLpObj.prototype.getgetQBcIndexWithFcTimeFromGroupArray = function(  
274 - fctime, groupArray  
275 -) {  
276 - var i;  
277 - var timediff; // 时间差取绝对值  
278 - var qIndex;  
279 - var bcIndex;  
280 -  
281 - var group;  
282 - var bc1time;  
283 - var bc2time;  
284 -  
285 - var tempdiff;  
286 - for (i = 0; i < this._$_qCount; i++) {  
287 - group = groupArray[i];  
288 - if (group) {  
289 - if (group.getBc1()) {  
290 - bc1time = group.getBc1().getFcTimeObj();  
291 - tempdiff = Math.abs(bc1time.diff(fctime));  
292 -  
293 - if (!timediff) {  
294 - timediff = Math.abs(tempdiff);  
295 - qIndex = i;  
296 - bcIndex = 0;  
297 - } else {  
298 - if (tempdiff < timediff) {  
299 - timediff = tempdiff;  
300 - qIndex = i;  
301 - bcIndex = 0;  
302 - } if (Math.abs(tempdiff) == timediff) {  
303 - if (bc1time.isBefore(fctime)) {  
304 - timediff = tempdiff;  
305 - qIndex = i;  
306 - bcIndex = 0;  
307 - }  
308 -  
309 - }  
310 - }  
311 - }  
312 -  
313 - if (group.getBc2()) {  
314 - bc2time = group.getBc2().getFcTimeObj();  
315 - tempdiff = Math.abs(bc2time.diff(fctime));  
316 -  
317 - if (!timediff) {  
318 - timediff = Math.abs(tempdiff);  
319 - qIndex = i;  
320 - bcIndex = 1;  
321 - } else {  
322 - if (tempdiff < timediff) {  
323 - timediff = tempdiff;  
324 - qIndex = i;  
325 - bcIndex = 1;  
326 - } if (Math.abs(tempdiff) == timediff) {  
327 - if (bc2time.isBefore(fctime)) {  
328 - timediff = tempdiff;  
329 - qIndex = i;  
330 - bcIndex = 1;  
331 - }  
332 -  
333 - }  
334 - }  
335 - }  
336 - }  
337 - }  
338 -  
339 - var rst = [];  
340 - rst.push(qIndex);  
341 - rst.push(bcIndex);  
342 -  
343 - return rst;  
344 -};  
345 -  
346 -/**  
347 - * 使用指定时间匹配返回离之最近的第几圈第几个班次,  
348 - * 使用时间差的绝度值,比较,取最小的  
349 - * 如果有两个一样的时间差,取比fctime大的时间  
350 - * @param fctime 比较用时间  
351 - * @returns [{第几圈},{第几个班次}]  
352 - */  
353 -InternalLpObj.prototype.getQBcIndexWithFcTime = function(  
354 - fctime  
355 -) {  
356 - return this.getgetQBcIndexWithFcTimeFromGroupArray(fctime, this._$_groupBcArray);  
357 -};  
358 -  
359 -//---------------------- 内部数据初始化方法(不同于构造函数)---------------------//  
360 -  
361 -/**  
362 - * 从指定开始时间到结束时间创建不间断班次(连班),并初始化路牌  
363 - * 注意,之前有班次会删除后再创建。  
364 - * @param startTime 开始时间  
365 - * @param endTime 结束时间  
366 - * @param isUp 第一个班次是上行还是下行  
367 - * @param fromQ 从第几圈开始加入  
368 - * @param paramObj 参数对象  
369 - * @param factory 工厂对象  
370 - */  
371 -InternalLpObj.prototype.initDataFromTimeToTime = function(  
372 - startTime,  
373 - endTime,  
374 - isUp,  
375 - fromQ,  
376 - paramObj,  
377 - factory) {  
378 -  
379 - var bcData = []; // 班次数组  
380 - var bcObj;  
381 - var kssj = startTime;  
382 - var fcno = 1; // 发车顺序号  
383 - var bcCount = 1; // 班次数  
384 - do {  
385 - bcObj = factory.createBcObj(  
386 - this, "normal", isUp, fcno, kssj, paramObj); // this就是所属路牌对象  
387 - bcData.push(bcObj);  
388 -  
389 - kssj = paramObj.addMinute(kssj, bcObj.getBcTime() + bcObj.getStopTime());  
390 - fcno ++;  
391 - bcCount ++;  
392 - isUp = !isUp;  
393 - } while(kssj.isBefore(endTime));  
394 - bcCount--;  
395 -  
396 - if (bcCount > 0 && bcData[bcCount - 1].getArrTimeObj().isAfter(endTime)) {  
397 - // 如果最后一个班次的到达时间超过结束时间,也要去除  
398 - bcData.splice(bcCount - 1, 1);  
399 - }  
400 -  
401 - this._initDataFromLbBcArray(bcData, fromQ);  
402 -  
403 -};  
404 -  
405 -/**  
406 - * 使用连班的班次数组初始化路牌(相应的圈会被覆盖)。  
407 - * @param bcArray 连班班次数组  
408 - * @param fromQ 从第几圈开始加入  
409 - */  
410 -InternalLpObj.prototype._initDataFromLbBcArray = function(  
411 - bcArray,  
412 - fromQ  
413 -) {  
414 - var _bc1Obj;  
415 - var _bc2Obj;  
416 - var _qObj;  
417 -  
418 - // 第一班次是上行还是下行  
419 - var isUp = bcArray[0].isUp();  
420 -  
421 - if (bcArray.length > 0 && fromQ < this._$_qCount) {  
422 - // 构造圈数  
423 - if (isUp != this._$_isUp) {  
424 - // 如果方向不一致,意味着第一个班次是半圈  
425 - // 加半圈,并加在bc2上  
426 - _bc2Obj = bcArray.slice(0, 1)[0];  
427 - _qObj = new InternalGroupObj(  
428 - this,  
429 - this._$_isUp,  
430 - undefined,  
431 - _bc2Obj  
432 - );  
433 - _bc2Obj.setGroup(_qObj);  
434 - this._$_groupBcArray[fromQ] = _qObj;  
435 -  
436 - bcArray.splice(0, 1);  
437 - fromQ ++;  
438 - }  
439 -  
440 - var qCount1 = Math.floor(bcArray.length / 2); // 需要添加多少圈  
441 - var qCount2 = bcArray.length % 2; // 最后是否有半圈  
442 -  
443 - while (fromQ < this._$_qCount) {  
444 - if (qCount1 > 0) {  
445 - _bc1Obj = bcArray.slice(0, 1)[0];  
446 - _bc2Obj = bcArray.slice(1, 2)[0];  
447 - _qObj = new InternalGroupObj(  
448 - this,  
449 - this._$_isUp,  
450 - _bc1Obj,  
451 - _bc2Obj  
452 - );  
453 - _bc1Obj.setGroup(_qObj);  
454 - _bc2Obj.setGroup(_qObj);  
455 - this._$_groupBcArray[fromQ] = _qObj;  
456 -  
457 - bcArray.splice(0, 2);  
458 - qCount1 --;  
459 - } else if (qCount2 > 0) {  
460 - // 加半圈,并加在bc1上  
461 - _bc1Obj = bcArray.slice(0, 1)[0];  
462 - _qObj = new InternalGroupObj(  
463 - this,  
464 - this._$_isUp,  
465 - _bc1Obj,  
466 - undefined  
467 - );  
468 - _bc1Obj.setGroup(_qObj);  
469 - this._$_groupBcArray[fromQ] = _qObj;  
470 - } else {  
471 - break;  
472 - }  
473 -  
474 - fromQ ++;  
475 - }  
476 - }  
477 -};  
478 -  
479 -//-------------------------- 其他方法 ----------------------------//  
480 -  
481 -  
482 -// TODO  
483 -  
484 -/**  
485 - *  
486 - *  
487 - */  
488 -InternalLpObj.prototype.calcuLpBx = function() {  
489 -  
490 -};  
491 -  
492 -  
493 -  
494 -  
495 -  
496 -  
497 - 1 +/**
  2 + * 内部路牌对象。
  3 + * @constructor
  4 + */
  5 +var InternalLpObj = function(
  6 + orilpObj, // 原始路牌对象
  7 + qCount, // 总共多少圈
  8 + isUp // 圈是以上行开始还是下行开始
  9 +) {
  10 + // TODO:原始路牌对象(这个路牌是对接外部gantt图像,以后有机会改了)
  11 + this._$$_orign_lp_obj = orilpObj;
  12 +
  13 + this._$_isUp = isUp;
  14 +
  15 + // 距离上一个路牌的最小发车间隔时间
  16 + // 用于纵向添加班次的时候使用
  17 + // 默认第一个路牌为0
  18 + this._$_minVerticalIntervalTime = 0;
  19 +
  20 + // 路牌的圈数,注意每个路牌的圈数都是一致的,
  21 + // 但并不是每一圈都有值
  22 + // 第1圈从上标线开始
  23 + // 第0圈表示中标线的第一个班次组成的半圈
  24 + // 有多少圈根据最终迭代的结果来看
  25 + this._$_qCount = qCount;
  26 + // 保存的是 InternalGroupBcObj 对象
  27 + this._$_groupBcArray = new Array(qCount);
  28 +
  29 + var i;
  30 + for (i = 0; i < this._$_qCount; i++) {
  31 + this._$_groupBcArray[i] = new InternalGroupObj(
  32 + this, this._$_isUp, undefined, undefined);
  33 + }
  34 +
  35 + // 班型的相关变量
  36 + this._$_bx_isLb = false; // 是否连班
  37 + this._$_bx_isfb = false; // 是否分班
  38 + this._$_bx_isfb_5_2 = false; // 是否5休2分班
  39 + this._$_bx_desc; // 班型描述(默认为路牌编号)
  40 +
  41 + // TODO:
  42 +
  43 +};
  44 +
  45 +//------------------- get/set 方法 -------------------//
  46 +
  47 +/**
  48 + * 获取圈
  49 + * @param qIndex 圈index
  50 + */
  51 +InternalLpObj.prototype.getGroup = function(qIndex) {
  52 + return this._$_groupBcArray[qIndex];
  53 +};
  54 +
  55 +/**
  56 + * 获取班次。
  57 + * @param qIndex 第几圈
  58 + * @param bcIndex 第几个班次
  59 + */
  60 +InternalLpObj.prototype.getBc = function(qIndex, bcIndex) {
  61 + var group = this._$_groupBcArray[qIndex];
  62 + var bc;
  63 + if (bcIndex == 0) {
  64 + bc = group.getBc1();
  65 + } else if (bcIndex == 1) {
  66 + bc = group.getBc2();
  67 + }
  68 + return bc;
  69 +};
  70 +
  71 +/**
  72 + * 在具体位置设置班次。
  73 + * @param qIndex 第几圈
  74 + * @param bcIndex 第几个班次
  75 + * @param bc 班次对象
  76 + */
  77 +InternalLpObj.prototype.setBc = function(qIndex, bcIndex, bc) {
  78 + var group = this._$_groupBcArray[qIndex];
  79 + if (bcIndex == 0) {
  80 + group.setBc1(bc);
  81 + bc.setGroup(group);
  82 + } else if (bcIndex == 1) {
  83 + group.setBc2(bc);
  84 + bc.setGroup(group);
  85 + }
  86 +};
  87 +
  88 +/**
  89 + * 设置原始路牌对象。
  90 + * @param lpObj 原始路牌对象
  91 + */
  92 +InternalLpObj.prototype.setLp = function(lpObj) {
  93 + this._$$_orign_lp_obj = lpObj;
  94 + var i;
  95 + var group;
  96 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  97 + group = this._$_groupBcArray[i];
  98 + if (group) {
  99 + group.setLp(this); // 圈和班次保存都是 InternalLpObj 对象
  100 + }
  101 + }
  102 +};
  103 +
  104 +InternalLpObj.prototype.getLpNo = function() {
  105 + return this._$$_orign_lp_obj.lpNo;
  106 +};
  107 +InternalLpObj.prototype.getLpName = function() {
  108 + return this._$$_orign_lp_obj.lpName;
  109 +};
  110 +InternalLpObj.prototype.setBxFb5_2 = function(fb) {
  111 + this._$_bx_isfb_5_2 = fb;
  112 +};
  113 +InternalLpObj.prototype.isBxFb5_2 = function() {
  114 + return this._$_bx_isfb_5_2;
  115 +};
  116 +InternalLpObj.prototype.setBxLb = function(lb) {
  117 + this._$_bx_isLb = lb;
  118 +};
  119 +InternalLpObj.prototype.isBxLb = function() {
  120 + return this._$_bx_isLb;
  121 +};
  122 +
  123 +InternalLpObj.prototype.setBxFb = function(fb) {
  124 + this._$_bx_isfb = fb;
  125 +};
  126 +InternalLpObj.prototype.isBxFb = function() {
  127 + return this._$_bx_isfb;
  128 +};
  129 +
  130 +/**
  131 + * 设置路牌的班型描述(最终是设置班次的路牌名字)。
  132 + * @param desc 描述
  133 + */
  134 +InternalLpObj.prototype.setBxDesc = function(desc) {
  135 + // 最终原始路牌的名字
  136 + this._$$_orign_lp_obj.lpName = desc + "_" + this._$$_orign_lp_obj.lpNo;
  137 + // 内部对象的班型描述
  138 + this._$_bx_desc = desc;
  139 +};
  140 +/**
  141 + * 获取版型描述
  142 + * @returns string
  143 + */
  144 +InternalLpObj.prototype.getBxDesc = function() {
  145 + return this._$_bx_desc;
  146 +};
  147 +
  148 +/**
  149 + * 设置纵向最小发车间隔时间。
  150 + * @param v
  151 + */
  152 +InternalLpObj.prototype.setVerticalMinIntervalTime = function(v) {
  153 + // 第一个路牌,都为0
  154 + this._$_minVerticalIntervalTime = v;
  155 +};
  156 +/**
  157 + * 获取纵向最小发车间隔时间。
  158 + * @returns {number|*}
  159 + */
  160 +InternalLpObj.prototype.getVerticalMinIntervalTime = function() {
  161 + return this._$_minVerticalIntervalTime;
  162 +};
  163 +
  164 +//-------------------- 班次操作方法(查询,统计,删除) -----------------------//
  165 +
  166 +/**
  167 + * 返回总共班次数。
  168 + */
  169 +InternalLpObj.prototype.getBcCount = function() {
  170 + var i;
  171 + var group;
  172 + var bccount = 0;
  173 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  174 + group = this._$_groupBcArray[i];
  175 + if (group) {
  176 + if (group.getBc1()) {
  177 + bccount += 1;
  178 + }
  179 + if (group.getBc2()) {
  180 + bccount += 1;
  181 + }
  182 + }
  183 + }
  184 +
  185 + return bccount;
  186 +};
  187 +
  188 +/**
  189 + * 返回班次列表,过滤空的班次,将所有存在的班次连成连续的对象数组返回。
  190 + * @returns arrays (InternalBcObj)
  191 + */
  192 +InternalLpObj.prototype.getBcArray = function() {
  193 + var bcArray = [];
  194 + var i;
  195 + var group;
  196 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  197 + group = this._$_groupBcArray[i];
  198 + if (group) {
  199 + group.getBc1() ? bcArray.push(group.getBc1()) : "";
  200 + group.getBc2() ? bcArray.push(group.getBc2()) : "";
  201 + }
  202 + }
  203 +
  204 + return bcArray;
  205 +};
  206 +
  207 +/**
  208 + * 获取最小(最早)班次对象。
  209 + * @returns [{圈index},{班次index}]
  210 + */
  211 +InternalLpObj.prototype.getMinBcObjPosition = function() {
  212 + var i;
  213 + var bIndex = [];
  214 + for (i = 0; i < this._$_groupBcArray.length; i++) {
  215 + if (this._$_groupBcArray[i].getBc1()) {
  216 + bIndex.push(i);
  217 + bIndex.push(0);
  218 + break;
  219 + }
  220 + if (this._$_groupBcArray[i].getBc2()) {
  221 + bIndex.push(i);
  222 + bIndex.push(1);
  223 + break;
  224 + }
  225 + }
  226 + return bIndex;
  227 +};
  228 +
  229 +/**
  230 + * 获取最大(最晚)班次对象。
  231 + * @returns [{圈index},{班次index}]
  232 + */
  233 +InternalLpObj.prototype.getMaxBcObjPosition = function() {
  234 + var i;
  235 + var bIndex = [];
  236 + for (i = this._$_groupBcArray.length - 1; i >= 0; i--) {
  237 + if (this._$_groupBcArray[i].getBc2()) {
  238 + bIndex.push(i);
  239 + bIndex.push(1);
  240 + break;
  241 + }
  242 + if (this._$_groupBcArray[i].getBc1()) {
  243 + bIndex.push(i);
  244 + bIndex.push(0);
  245 + break;
  246 + }
  247 + }
  248 + return bIndex;
  249 +};
  250 +
  251 +/**
  252 + * 在具体位置移除班次。
  253 + * @param qIndex 第几圈
  254 + * @param bcIndex 第几个班次
  255 + */
  256 +InternalLpObj.prototype.removeBc = function(qIndex, bcIndex) {
  257 + var group = this._$_groupBcArray[qIndex];
  258 + if (bcIndex == 0) {
  259 + group.removeBc1();
  260 + } else if (bcIndex == 1) {
  261 + group.removeBc2();
  262 + }
  263 +};
  264 +
  265 +/**
  266 + * 使用指定时间匹配返回离之最近的第几圈第几个班次,
  267 + * 使用时间差的绝度值,比较,取最小的
  268 + * 如果有两个一样的时间差,取比fctime大的时间
  269 + * @param fctime 比较用时间
  270 + * @param groupArray 圈数组
  271 + * @returns [{第几圈},{第几个班次}]
  272 + */
  273 +InternalLpObj.prototype.getgetQBcIndexWithFcTimeFromGroupArray = function(
  274 + fctime, groupArray
  275 +) {
  276 + var i;
  277 + var timediff; // 时间差取绝对值
  278 + var qIndex;
  279 + var bcIndex;
  280 +
  281 + var group;
  282 + var bc1time;
  283 + var bc2time;
  284 +
  285 + var tempdiff;
  286 + for (i = 0; i < this._$_qCount; i++) {
  287 + group = groupArray[i];
  288 + if (group) {
  289 + if (group.getBc1()) {
  290 + bc1time = group.getBc1().getFcTimeObj();
  291 + tempdiff = Math.abs(bc1time.diff(fctime));
  292 +
  293 + if (!timediff) {
  294 + timediff = Math.abs(tempdiff);
  295 + qIndex = i;
  296 + bcIndex = 0;
  297 + } else {
  298 + if (tempdiff < timediff) {
  299 + timediff = tempdiff;
  300 + qIndex = i;
  301 + bcIndex = 0;
  302 + } if (Math.abs(tempdiff) == timediff) {
  303 + if (bc1time.isBefore(fctime)) {
  304 + timediff = tempdiff;
  305 + qIndex = i;
  306 + bcIndex = 0;
  307 + }
  308 +
  309 + }
  310 + }
  311 + }
  312 +
  313 + if (group.getBc2()) {
  314 + bc2time = group.getBc2().getFcTimeObj();
  315 + tempdiff = Math.abs(bc2time.diff(fctime));
  316 +
  317 + if (!timediff) {
  318 + timediff = Math.abs(tempdiff);
  319 + qIndex = i;
  320 + bcIndex = 1;
  321 + } else {
  322 + if (tempdiff < timediff) {
  323 + timediff = tempdiff;
  324 + qIndex = i;
  325 + bcIndex = 1;
  326 + } if (Math.abs(tempdiff) == timediff) {
  327 + if (bc2time.isBefore(fctime)) {
  328 + timediff = tempdiff;
  329 + qIndex = i;
  330 + bcIndex = 1;
  331 + }
  332 +
  333 + }
  334 + }
  335 + }
  336 + }
  337 + }
  338 +
  339 + var rst = [];
  340 + rst.push(qIndex);
  341 + rst.push(bcIndex);
  342 +
  343 + return rst;
  344 +};
  345 +
  346 +/**
  347 + * 使用指定时间匹配返回离之最近的第几圈第几个班次,
  348 + * 使用时间差的绝度值,比较,取最小的
  349 + * 如果有两个一样的时间差,取比fctime大的时间
  350 + * @param fctime 比较用时间
  351 + * @returns [{第几圈},{第几个班次}]
  352 + */
  353 +InternalLpObj.prototype.getQBcIndexWithFcTime = function(
  354 + fctime
  355 +) {
  356 + return this.getgetQBcIndexWithFcTimeFromGroupArray(fctime, this._$_groupBcArray);
  357 +};
  358 +
  359 +//---------------------- 内部数据初始化方法(不同于构造函数)---------------------//
  360 +
  361 +/**
  362 + * 从指定开始时间到结束时间创建不间断班次(连班),并初始化路牌
  363 + * 注意,之前有班次会删除后再创建。
  364 + * @param startTime 开始时间
  365 + * @param endTime 结束时间
  366 + * @param isUp 第一个班次是上行还是下行
  367 + * @param fromQ 从第几圈开始加入
  368 + * @param paramObj 参数对象
  369 + * @param factory 工厂对象
  370 + */
  371 +InternalLpObj.prototype.initDataFromTimeToTime = function(
  372 + startTime,
  373 + endTime,
  374 + isUp,
  375 + fromQ,
  376 + paramObj,
  377 + factory) {
  378 +
  379 + var bcData = []; // 班次数组
  380 + var bcObj;
  381 + var kssj = startTime;
  382 + var fcno = 1; // 发车顺序号
  383 + var bcCount = 1; // 班次数
  384 + do {
  385 + bcObj = factory.createBcObj(
  386 + this, "normal", isUp, fcno, kssj, paramObj); // this就是所属路牌对象
  387 + bcData.push(bcObj);
  388 +
  389 + kssj = paramObj.addMinute(kssj, bcObj.getBcTime() + bcObj.getStopTime());
  390 + fcno ++;
  391 + bcCount ++;
  392 + isUp = !isUp;
  393 + } while(kssj.isBefore(endTime));
  394 + bcCount--;
  395 +
  396 + if (bcCount > 0 && bcData[bcCount - 1].getArrTimeObj().isAfter(endTime)) {
  397 + // 如果最后一个班次的到达时间超过结束时间,也要去除
  398 + bcData.splice(bcCount - 1, 1);
  399 + }
  400 +
  401 + this._initDataFromLbBcArray(bcData, fromQ);
  402 +
  403 +};
  404 +
  405 +/**
  406 + * 使用连班的班次数组初始化路牌(相应的圈会被覆盖)。
  407 + * @param bcArray 连班班次数组
  408 + * @param fromQ 从第几圈开始加入
  409 + */
  410 +InternalLpObj.prototype._initDataFromLbBcArray = function(
  411 + bcArray,
  412 + fromQ
  413 +) {
  414 + var _bc1Obj;
  415 + var _bc2Obj;
  416 + var _qObj;
  417 +
  418 + // 第一班次是上行还是下行
  419 + var isUp = bcArray[0].isUp();
  420 +
  421 + if (bcArray.length > 0 && fromQ < this._$_qCount) {
  422 + // 构造圈数
  423 + if (isUp != this._$_isUp) {
  424 + // 如果方向不一致,意味着第一个班次是半圈
  425 + // 加半圈,并加在bc2上
  426 + _bc2Obj = bcArray.slice(0, 1)[0];
  427 + _qObj = new InternalGroupObj(
  428 + this,
  429 + this._$_isUp,
  430 + undefined,
  431 + _bc2Obj
  432 + );
  433 + _bc2Obj.setGroup(_qObj);
  434 + this._$_groupBcArray[fromQ] = _qObj;
  435 +
  436 + bcArray.splice(0, 1);
  437 + fromQ ++;
  438 + }
  439 +
  440 + var qCount1 = Math.floor(bcArray.length / 2); // 需要添加多少圈
  441 + var qCount2 = bcArray.length % 2; // 最后是否有半圈
  442 +
  443 + while (fromQ < this._$_qCount) {
  444 + if (qCount1 > 0) {
  445 + _bc1Obj = bcArray.slice(0, 1)[0];
  446 + _bc2Obj = bcArray.slice(1, 2)[0];
  447 + _qObj = new InternalGroupObj(
  448 + this,
  449 + this._$_isUp,
  450 + _bc1Obj,
  451 + _bc2Obj
  452 + );
  453 + _bc1Obj.setGroup(_qObj);
  454 + _bc2Obj.setGroup(_qObj);
  455 + this._$_groupBcArray[fromQ] = _qObj;
  456 +
  457 + bcArray.splice(0, 2);
  458 + qCount1 --;
  459 + } else if (qCount2 > 0) {
  460 + // 加半圈,并加在bc1上
  461 + _bc1Obj = bcArray.slice(0, 1)[0];
  462 + _qObj = new InternalGroupObj(
  463 + this,
  464 + this._$_isUp,
  465 + _bc1Obj,
  466 + undefined
  467 + );
  468 + _bc1Obj.setGroup(_qObj);
  469 + this._$_groupBcArray[fromQ] = _qObj;
  470 + } else {
  471 + break;
  472 + }
  473 +
  474 + fromQ ++;
  475 + }
  476 + }
  477 +};
  478 +
  479 +//-------------------------- 其他方法 ----------------------------//
  480 +
  481 +
  482 +// TODO
  483 +
  484 +/**
  485 + *
  486 + *
  487 + */
  488 +InternalLpObj.prototype.calcuLpBx = function() {
  489 +
  490 +};
  491 +
  492 +
  493 +
  494 +
  495 +
  496 +
  497 +
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalScheduleObj.js
1 -/**  
2 - * 内部行车计划对象。  
3 - * @constructor  
4 - */  
5 -var InternalScheduleObj = function(paramObj, lpArray, factory) {  
6 - // 参数对象  
7 - var _paramObj = paramObj;  
8 - // 外部的路牌数组  
9 - var _lpArray = lpArray;  
10 - // 工厂对象  
11 - var _factory = factory;  
12 -  
13 - //------------------ 初始化方法1,以及计算关联的内部变量 -----------------//  
14 - var _qIsUp; // 每一圈是上行开始还是下行开始  
15 - var _qCount = 0; // 总的圈数  
16 - var _internalLpArray = []; // 内部对象数组  
17 -  
18 - var _initFun1 = function() { // 初始化方法1  
19 -  
20 - //----------------------- 1、确定上标线的方向,圈的方向 -------------------//  
21 -  
22 - // 确定_qIsUp,哪个方向的首班车晚就用哪个  
23 - _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore(  
24 - _paramObj.getDownFirstDTimeObj()) ? false : true;  
25 - // 上标线开始时间,就是方向的首班车时间  
26 - var st = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();  
27 - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向  
28 - var et;  
29 - var et_IsUp;  
30 - if (_paramObj.getUpLastDtimeObj().isBefore(  
31 - _paramObj.getDownLastDTimeObj())) {  
32 - et = _paramObj.getDownLastDTimeObj();  
33 - et_IsUp = false;  
34 - } else {  
35 - et = _paramObj.getUpLastDtimeObj();  
36 - et_IsUp = true;  
37 - }  
38 -  
39 - //------------------------ 2、计算总共有多少圈 ------------------------//  
40 -  
41 -  
42 -  
43 - // 以开始时间,结束时间,构造上标线用连班班次发车时间  
44 - var bcFcsjArrays = []; // 班次发车时间对象数组  
45 - var bcArsjArrays = []; // 班次到达时间对象数组  
46 - var isUp = _qIsUp; // 方向  
47 - var bcCount = 1; // 班次数  
48 -  
49 - var _kssj = st; // 开始时间  
50 - var _bcsj = paramObj.calcuTravelTime(_kssj, isUp); // 班次历时  
51 - var _arrsj = paramObj.addMinute(_kssj, _bcsj); // 到达时间  
52 - var _stoptime = paramObj.calcuFixedStopNumber(_arrsj, !isUp); // 停站时间  
53 -  
54 - do {  
55 - bcFcsjArrays.push(_kssj);  
56 - bcArsjArrays.push(_arrsj);  
57 - _kssj = paramObj.addMinute(_kssj, _bcsj + _stoptime);  
58 - bcCount ++;  
59 - isUp = !isUp;  
60 - } while(_kssj.isBefore(et));  
61 - bcCount--; // 因为先做do,所以总的班次要减1  
62 - if (bcCount > 0 && bcArsjArrays[bcCount - 1].isAfter(et)) {  
63 - // 如果最后一个班次的到达时间超过结束时间,也要去除  
64 - bcFcsjArrays.splice(bcCount - 1, 1);  
65 - bcArsjArrays.splice(bcCount - 1, 1);  
66 - bcCount--;  
67 - }  
68 - var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈  
69 - var _qCount_p2 = bcCount % 2; // 余下的1个班次也算一圈  
70 -  
71 - // 利用连班数组计算圈数  
72 - _qCount = 1; // 前面加1圈,补中标线的班次  
73 - _qCount += _qCount_p1;  
74 - _qCount += _qCount_p2;  
75 -  
76 - // 计算最后是不是还要补一圈  
77 - if (_qCount > 1) { // 总的圈数就1圈,没必要加了(其实是不可能的,除非参数里问题)  
78 - if (_qCount_p2 == 0) { // 没有余下班次,整数圈数  
79 - // 最后一个班次的方向一定和开始的方向相反,如:上-下,上-下,上-下,一共三圈,最后一个班次为下行  
80 - // 判定最后一个班次的方向和上标线判定结束时间的班次方向是否一致  
81 - if (!_qIsUp == et_IsUp) {  
82 - // 一致不用加圈数  
83 - } else {  
84 - // 不一致需要加圈补最后一个结束时间班次  
85 - _qCount ++;  
86 - }  
87 - } else {  
88 - // 有余下的圈数,最后要不补的班次不管上行,下行都在这一圈里  
89 - // 不需要在补圈数了  
90 - }  
91 - }  
92 -  
93 - //------------------------ 3、根据路牌数,圈数创建路牌对象 ----------------------//  
94 -  
95 - // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中  
96 - var i;  
97 - for (i = 0; i < _lpArray.length; i++) {  
98 - _internalLpArray.push(new InternalLpObj(_lpArray[i], _qCount, _qIsUp));  
99 - }  
100 - // 初始化上标线,从第1圈开始  
101 - _internalLpArray[0].initDataFromTimeToTime(bcFcsjArrays[0], et, _qIsUp, 1, _paramObj, _factory);  
102 -  
103 - console.log("//---------------- 行车计划,初始化方法1 start ----------------//");  
104 - console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") +  
105 - "上行末班车时间:" + _paramObj.getUpLastDtimeObj().format("HH:mm"));  
106 - console.log("下行首班车时间:" + _paramObj.getDownFirstDTimeObj().format("HH:mm") +  
107 - "下行末班车时间:" + _paramObj.getDownLastDTimeObj().format("HH:mm"));  
108 - console.log("总共计算的圈数:" + _qCount);  
109 - console.log("圈的方向isUP:" + _qIsUp);  
110 - console.log("//---------------- 行车计划,初始化方法1 end ----------------//");  
111 -  
112 - };  
113 -  
114 - //------------------ 初始化方法2,以及计算关联的内部变量 ----------------//  
115 - var _approximate_zgfQIndex; // 预估早高峰车辆从第几圈开始全部发出  
116 - var _approximate_zgfBIndex; // 预估早高峰车辆从第几圈第几个班次开始全部发出(上行或下行)  
117 - var _approximate_wgfQIndex; // 预估晚高峰车辆从第几圈开始全部发出  
118 - var _approximate_wgfBIndex; // 预估晚高峰车辆从第几圈第几个班次开始全部发出(上行或下行)  
119 -  
120 - // 同一圈同一方向班次发车间隔的最小值  
121 - // 注意:这个值就是用来添加班次的时间增加单位,在后面相关的方法里会具体说明  
122 - var _qbcMinIntervalValue;  
123 -  
124 - var _initFun2 = function() { // 初始化方法2  
125 - //------------------------ 1、预估早高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//  
126 -  
127 - // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次  
128 - // 以这个班次为早高峰起点,全部出车策略  
129 - var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(  
130 - _paramObj.getMPeakStartTimeObj());  
131 - var qIndex = qbcIndexArray[0]; // 第几圈  
132 - var bIndex = qbcIndexArray[1]; // 第几个班次  
133 - var startbc = _internalLpArray[0].getBc(qIndex, bIndex);  
134 -  
135 - // 计算早高峰  
136 - var _clCount = _paramObj.calcuClzx();  
137 - var _c1 = Math.floor(_paramObj.calcuPeakZzsj() / _clCount);  
138 - var _c2 = _paramObj.calcuPeakZzsj() % _clCount;  
139 - var _kssj = startbc.getFcTimeObj();  
140 -  
141 - var i;  
142 - for (i = 2; i <= _clCount - _c2; i++) {  
143 - _kssj = _paramObj.addMinute(_kssj, _c1);  
144 - _internalLpArray[i - 1].setBc(  
145 - qIndex,  
146 - bIndex,  
147 - _factory.createBcObj(  
148 - _internalLpArray[i - 1],  
149 - "normal", startbc.isUp(),  
150 - 1, _kssj, paramObj)  
151 - );  
152 - // 使用早高峰的发车间隔最为路牌纵向最小发车间隔,不能整除的话,小的放在前面的路牌  
153 - _internalLpArray[i - 1].setVerticalMinIntervalTime(_c1);  
154 - }  
155 - for (i = 1; i <= _c2; i++) {  
156 - _kssj = _paramObj.addMinute(_kssj, _c1 + 1);  
157 - _internalLpArray[_clCount - _c2 + i - 1].setBc(  
158 - qIndex,  
159 - bIndex,  
160 - _factory.createBcObj(  
161 - _internalLpArray[_clCount - _c2 + i - 1],  
162 - "normal", startbc.isUp(),  
163 - 1, _kssj, paramObj)  
164 - );  
165 - // 使用早高峰的发车间隔最为路牌纵向最小发车间隔,,不能整除的话,大的放在后面的路牌  
166 - _internalLpArray[_clCount - _c2 + i - 1].setVerticalMinIntervalTime(_c1);  
167 - }  
168 -  
169 - _approximate_zgfQIndex = qIndex;  
170 - _approximate_zgfBIndex = bIndex;  
171 -  
172 - //------------------------ 2、预估晚高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//  
173 -  
174 - // 以上标线为标准,查找离晚高峰开始时间最近的班次作为晚高峰开始班次  
175 - // 以这个班次为早高峰起点,全部出车策略  
176 - qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(  
177 - _paramObj.getEPeakStartTimeObj());  
178 - qIndex = qbcIndexArray[0]; // 第几圈  
179 - bIndex = qbcIndexArray[1]; // 第几个班次  
180 - startbc = _internalLpArray[0].getBc(qIndex, bIndex);  
181 -  
182 - // 计算晚高峰  
183 - _clCount = _paramObj.calcuClzx();  
184 - _c1 = Math.floor(_paramObj.calcuPeakZzsj() / _clCount);  
185 - _c2 = _paramObj.calcuPeakZzsj() % _clCount;  
186 - _kssj = startbc.getFcTimeObj();  
187 -  
188 - for (i = 2; i <= _clCount - _c2; i++) {  
189 - _kssj = _paramObj.addMinute(_kssj, _c1);  
190 - _internalLpArray[i - 1].setBc(  
191 - qIndex,  
192 - bIndex,  
193 - _factory.createBcObj(  
194 - _internalLpArray[i - 1],  
195 - "normal", startbc.isUp(),  
196 - 1, _kssj, _paramObj)  
197 - );  
198 - }  
199 - for (i = 1; i <= _c2; i++) {  
200 - _kssj = _paramObj.addMinute(_kssj, _c1 + 1);  
201 - _internalLpArray[_clCount - _c2 + i - 1].setBc(  
202 - qIndex,  
203 - bIndex,  
204 - _factory.createBcObj(  
205 - _internalLpArray[_clCount - _c2 + i - 1],  
206 - "normal", startbc.isUp(),  
207 - 1, _kssj, _paramObj)  
208 - );  
209 - }  
210 -  
211 - _approximate_wgfQIndex = qIndex;  
212 - _approximate_wgfBIndex = bIndex;  
213 - _qbcMinIntervalValue = _c1;  
214 -  
215 - console.log("//---------------- 行车计划,初始化方法2 start ----------------//");  
216 - console.log("预估早高峰第" + _approximate_zgfQIndex + "(index)圈,第" + _approximate_zgfBIndex + "(index)班次车辆全部发出");  
217 - console.log("预估晚高峰第" + _approximate_wgfQIndex + "(index)圈,第" + _approximate_wgfBIndex + "(index)班次车辆全部发出");  
218 - console.log("预估同圈同方向班次最小间隔(分钟):" + _qbcMinIntervalValue);  
219 - console.log("//---------------- 行车计划,初始化方法2 end ----------------//");  
220 - };  
221 -  
222 - //----------------------- 初始化方法3,以及计算关联的内部变量 ----------------//  
223 - var _zbx_lpIndex; // 中标线对应第几个路牌  
224 -  
225 - var _initFun3 = function() { // 初始化方法3  
226 - //---------------------------- 1、模拟一个中标线,使用临时路牌 ----------------------//  
227 -  
228 - // 构造中标线  
229 - // 中标线开始时间,就是方向的首班车时间  
230 - var st = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();  
231 - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向  
232 - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向  
233 - var et;  
234 - if (_paramObj.getUpLastDtimeObj().isBefore(  
235 - _paramObj.getDownLastDTimeObj())) {  
236 - et = _paramObj.getDownLastDTimeObj();  
237 - } else {  
238 - et = _paramObj.getUpLastDtimeObj();  
239 - }  
240 -  
241 - var tempLpObj = new InternalLpObj({lpNo: -999, lpName: "-999"}, _qCount, _qIsUp);  
242 - tempLpObj.initDataFromTimeToTime(  
243 - st,  
244 - et,  
245 - !_qIsUp,  
246 - 0,  
247 - _paramObj,  
248 - _factory  
249 - );  
250 -  
251 - //------------------------ 2、找出中标线的早高峰班次,计算应该插在当前路牌数组的那个位置 ----------------//  
252 - // TODO:中标线的早高峰发车班次,和插入位置的早高分班次的时间会有误差的  
253 - // TODO:这里是直接把中标线班次覆盖,没有根据误差调整,以后改  
254 -  
255 - // 找出中标线对应的早高峰的班次对象  
256 - var _zb_bcobj = tempLpObj.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);  
257 -  
258 - // 把所有高峰班次重新构造成一个一个的圈数组,计算对应中标线最近的是第几个路牌  
259 - var _tempq_array = [];  
260 - var _temp_group;  
261 - var _temp_bc;  
262 - var i;  
263 - for (i = 0; i < _internalLpArray.length; i++) {  
264 - _temp_bc = _internalLpArray[i].getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);  
265 - if (_temp_bc.isUp() == _qIsUp) {  
266 - _temp_group = new InternalGroupObj(_internalLpArray[i], _qIsUp, _temp_bc, undefined);  
267 - } else {  
268 - _temp_group = new InternalGroupObj(_internalLpArray[i], _qIsUp, undefined, _temp_bc);  
269 - }  
270 - _tempq_array.push(_temp_group);  
271 - }  
272 -  
273 - var _ttindex_ = tempLpObj.getgetQBcIndexWithFcTimeFromGroupArray(  
274 - _zb_bcobj.getFcTimeObj(),  
275 - _tempq_array  
276 - );  
277 - _zbx_lpIndex = _ttindex_[0]; // 中标线放在第几个路牌  
278 - tempLpObj.setLp(_lpArray[_zbx_lpIndex]); // 设置原始路牌对象  
279 - tempLpObj.setVerticalMinIntervalTime( // 设置纵向最小发车间隔  
280 - _internalLpArray[_zbx_lpIndex].getVerticalMinIntervalTime()  
281 - );  
282 -  
283 - // 注意:这里直接把中标线数据替换到指定路牌位置  
284 - // TODO:由初始化方法1,初始化方法2得到的2个高峰的班次会被中标线对应班次覆盖  
285 - // TODO:目前使用中标线的班次覆盖,以后相互动态调整  
286 -  
287 - _internalLpArray[_zbx_lpIndex] = tempLpObj;  
288 -  
289 - console.log("//---------------- 行车计划,初始化方法3 start ----------------//");  
290 - console.log("中标线对应第" + (_zbx_lpIndex + 1) + "个路牌");  
291 - console.log("//---------------- 行车计划,初始化方法3 end ----------------//");  
292 -  
293 - };  
294 -  
295 - //----------------------- 初始化方法4,以及计算关联的内部变量 ----------------//  
296 - var _bx_lb_lpcount; // 连班路牌数  
297 - var _bx_5_2_fb_lpcount; // 5休2分班路牌数  
298 - var _bx_other_fb_lpcount; // 其他分班路牌数  
299 -  
300 - var _initFun4 = function() { // 初始化方法4  
301 - // 总共车辆数(高峰最大车辆数)  
302 - var cls = _paramObj.calcuClzx();  
303 - // 低谷最少配车(连班车数量)  
304 - var dgminpc = Math.round(_paramObj.calcuTroughZzsj() / _paramObj.getTroughMaxFcjx());  
305 - // 加班车路牌数(做5休2的路牌数)  
306 - var _5_2_lpes = _paramObj.getJBLpes();  
307 -  
308 - // 做些简单的验证  
309 - if (cls < dgminpc) {  
310 - alert("总配车数小于低谷最小配车");  
311 - throw "总配车数小于低谷最小配车";  
312 - }  
313 - if (dgminpc < 2) {  
314 - alert("连班路牌小于2,办不到啊");  
315 - throw "连班路牌小于2,办不到啊";  
316 - }  
317 - if (cls - dgminpc < _5_2_lpes) {  
318 - alert("总分班路牌数小于加班路牌数");  
319 - throw "总分班路牌数小于加班路牌数";  
320 - }  
321 -  
322 - _bx_lb_lpcount = dgminpc;  
323 - _bx_5_2_fb_lpcount = _5_2_lpes;  
324 - _bx_other_fb_lpcount = cls - dgminpc - _5_2_lpes;  
325 -  
326 - console.log("//---------------- 行车计划,初始化方法4 start ----------------//");  
327 - console.log("连班路牌数:" + _bx_lb_lpcount);  
328 - console.log("5休2分班路牌数:" + _bx_5_2_fb_lpcount);  
329 - console.log("其他分班路牌数:" + _bx_other_fb_lpcount);  
330 - console.log("//---------------- 行车计划,初始化方法4 end ----------------//");  
331 - };  
332 -  
333 - //-------------------- 重要的内部方法 -----------------------//  
334 - /**  
335 - * 在指定位置生成班次(内部重要方法)。  
336 - * @param lpIndex 第几个路牌  
337 - * @param qIndex 第几圈  
338 - * @param bcIndex 第几个班次  
339 - * @returns InternalBcObj  
340 - */  
341 - var _generateBc = function(lpIndex, qIndex, bcIndex) {  
342 - // 在初始化布局后使用,否则没有参照班次加不了  
343 - // 初始化布局后,相当于把时刻表比作一个围棋棋盘,行为路牌数,列为圈数  
344 - // 上标线,中标线,早晚高峰已经布局在棋盘上,其余的空格可以创建班次  
345 -  
346 - // 这个生成班次是以上一班次时间,以发车间隔为基础添加的,纵向加  
347 - // 和生成标线时那种一直往后加班次时不一样,那种是以前一个班次为基础,横向加  
348 -  
349 - // 1、生成的班次以同一圈同一个方向里离它最早的班次的发车时间为基础  
350 - // 2、以每个路牌的纵向最小发车间隔时间为计算发车间隔  
351 - // 3、如果班次发车时间越界不管,有其余方法排除这种情况  
352 -  
353 - // 1、查找同圈同方向里最近的班次,找不到报错(因为有标线存在是不可能找不到的)  
354 - var _i;  
355 - var _bcObj;  
356 - for (_i = lpIndex - 1; _i >= 0; _i--) {  
357 - _bcObj = _internalLpArray[_i].getBc(qIndex, bcIndex);  
358 - if (_bcObj) {  
359 - break;  
360 - }  
361 - }  
362 - if (!_bcObj) {  
363 - return false;  
364 - //alert("无法在指定位置生成班次");  
365 - //throw "无法在路牌index=" + lpIndex + ",圈index=" + qIndex + ",班次index=" + bcIndex + "生成班次";  
366 - }  
367 -  
368 - // 2、计算发车间隔  
369 - var _intervalTime = 0;  
370 - for (_i = _i + 1; _i <= lpIndex; _i++) {  
371 - _intervalTime += _internalLpArray[_i].getVerticalMinIntervalTime();  
372 - }  
373 -  
374 - // 3、计算班次并添加班次  
375 - var _kssj = _paramObj.addMinute(_bcObj.getFcTimeObj(), _intervalTime);  
376 - _bcObj = _factory.createBcObj(  
377 - _internalLpArray[lpIndex],  
378 - "normal", _bcObj.isUp(),  
379 - 1, _kssj, _paramObj);  
380 - _bcObj.setGroup(_internalLpArray[lpIndex].getGroup(qIndex));  
381 -  
382 - return _bcObj;  
383 -  
384 - // TODO:这种添加班次的方法,可能造成相邻班次的停站时间问题  
385 - // TODO:主要是由于中标线的问题,但是误差不会很大,  
386 - // TODO:后面有方法直接调整停站时间(所谓的平滑过度时间)  
387 - };  
388 -  
389 - /**  
390 - * 在指定位置生成班次并添加到路牌指定位置中。  
391 - * @param lpIndex 第几个路牌  
392 - * @param qIndex 第几圈  
393 - * @param bcIndex 第几个班次  
394 - */  
395 - var _generateBcAndSetBc = function(lpIndex, qIndex, bcIndex) {  
396 - var _bcObj = _generateBc(lpIndex, qIndex, bcIndex);  
397 - _internalLpArray[lpIndex].setBc(qIndex, bcIndex, _bcObj);  
398 -  
399 - };  
400 -  
401 - /**  
402 - * 查找离指定时间最近的前面的班次索引信息  
403 - * @param timeObj 查找时间  
404 - * @param isUp 是否上行  
405 - * @returns [{路牌index},{圈index},{班次index}]  
406 - */  
407 - var _findUpClosedBcIndexWithTime = function(timeObj, isUp) {  
408 - var _lpObj;  
409 - var _groupObj;  
410 - var _bcObj;  
411 - var _i;  
412 - var _j;  
413 - var timediff; // 时间差取绝对值  
414 -  
415 - var _lpIndex;  
416 - var _up_qIndex;  
417 - var _up_bIndex;  
418 -  
419 - for (_i = 0; _i < _qCount; _i++) {  
420 - for (_j = 0; _j < _internalLpArray.length; _j++) {  
421 - _lpObj = _internalLpArray[_j];  
422 - _groupObj = _lpObj.getGroup(_i);  
423 - _bcObj = isUp ? _groupObj.getBc1() : _groupObj.getBc2();  
424 - if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的  
425 - _bcObj = _generateBc(_j, _i, isUp == _qIsUp ? 0 : 1);  
426 - }  
427 - if (_bcObj) {  
428 - if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) {  
429 - if (!timediff) {  
430 - timediff = timeObj.diff(_bcObj.getFcTimeObj());  
431 - _lpIndex = _j;  
432 - _up_qIndex = _i;  
433 - _up_bIndex = isUp == _qIsUp ? 0 : 1;  
434 - } else {  
435 - if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) {  
436 - timediff = timeObj.diff(_bcObj.getFcTimeObj());  
437 - _lpIndex = _j;  
438 - _up_qIndex = _i;  
439 - _up_bIndex = isUp == _qIsUp ? 0 : 1;  
440 - }  
441 - }  
442 - }  
443 - }  
444 - }  
445 - }  
446 -  
447 - if (_lpIndex == undefined) {  
448 - return false;  
449 - }  
450 -  
451 - var bcindex = [];  
452 - bcindex.push(_lpIndex);  
453 - bcindex.push(_up_qIndex);  
454 - bcindex.push(_up_bIndex);  
455 -  
456 - return bcindex;  
457 - };  
458 -  
459 - /**  
460 - * 查找离指定时间最近的后面的班次索引信息  
461 - * @param timeObj 查找时间  
462 - * @param isUp 是否上行  
463 - * @returns [{路牌index},{圈index},{班次index}]  
464 - */  
465 - var _findDownClosedBcIndexWithTime = function(timeObj, isUp) {  
466 - var _lpObj;  
467 - var _groupObj;  
468 - var _bcObj;  
469 - var _i;  
470 - var _j;  
471 - var timediff; // 时间差取绝对值  
472 -  
473 - var _lpIndex;  
474 - var _down_qIndex;  
475 - var _down_bIndex;  
476 -  
477 - var flag;  
478 -  
479 - for (_i = 0; _i < _qCount; _i++) {  
480 - for (_j = 0; _j < _internalLpArray.length; _j++) {  
481 - _lpObj = _internalLpArray[_j];  
482 - _groupObj = _lpObj.getGroup(_i);  
483 - _bcObj = isUp ? _groupObj.getBc1() : _groupObj.getBc2();  
484 - if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的  
485 - _bcObj = _generateBc(_j, _i, isUp == _qIsUp ? 0 : 1);  
486 - }  
487 - if (_bcObj) {  
488 - //console.log("timeobj -> bcobj diff flag " +  
489 - // timeObj.format("HH:mm") + "->" +  
490 - // _bcObj.getFcTimeObj().format("HH:mm") +  
491 - // timeObj.diff(_bcObj.getFcTimeObj()) +  
492 - // (timeObj.diff(_bcObj.getFcTimeObj()) <= 0)  
493 - //);  
494 -  
495 - flag = (timeObj.diff(_bcObj.getFcTimeObj())) <= 0;  
496 -  
497 - if (flag) {  
498 - if (!timediff) {  
499 - timediff = timeObj.diff(_bcObj.getFcTimeObj());  
500 - _lpIndex = _j;  
501 - _down_qIndex = _i;  
502 - _down_bIndex = isUp == _qIsUp ? 0 : 1;  
503 - } else {  
504 - if ((timeObj.diff(_bcObj.getFcTimeObj())) > timediff) {  
505 - timediff = timeObj.diff(_bcObj.getFcTimeObj());  
506 - _lpIndex = _j;  
507 - _down_qIndex = _i;  
508 - _down_bIndex = isUp == _qIsUp ? 0 : 1;  
509 - }  
510 - }  
511 - }  
512 - }  
513 - }  
514 - }  
515 -  
516 - if (_lpIndex == undefined) {  
517 - return false;  
518 - }  
519 -  
520 - var bcindex = [];  
521 - bcindex.push(_lpIndex);  
522 - bcindex.push(_down_qIndex);  
523 - bcindex.push(_down_bIndex);  
524 -  
525 - return bcindex;  
526 - };  
527 -  
528 - return {  
529 - //------------- 布局初始化方法 ------------//  
530 - /**  
531 - * 初始化数据,使用标线初始化  
532 - */  
533 - initDataWithBxLayout: function() {  
534 - // 初始化布局1,构造上标线,计算圈数,把上标线数据放入第一个路牌中  
535 - _initFun1();  
536 - // 初始化布局2,从上标线的某个班次开始,构造所有路牌的早高峰班次,晚高峰班次  
537 - _initFun2();  
538 - // 初始化布局3,构造中标线,根据高峰班次,将中标线放入合适的路牌中  
539 - _initFun3();  
540 - // 初始化4,计算连班,分班相关路牌数  
541 - _initFun4();  
542 -  
543 - // 测试添加班次  
544 - //this._generateBc(8, 1, 0);  
545 - //this._generateBc(10, 1, 0);  
546 - //this._generateBc(11, 1, 0);  
547 - //this._generateBc(12, 1, 0);  
548 - //this._generateBc(13, 1, 0);  
549 - //this._generateBc(14, 1, 0);  
550 - //this._generateBc(15, 1, 0);  
551 - //this._generateBc(16, 1, 0);  
552 - //this._generateBc(17, 1, 0);  
553 - //this._generateBc(18, 1, 0);  
554 - //  
555 - //this._generateBc(10, 1, 1);  
556 - //this._generateBc(11, 1, 1);  
557 - //this._generateBc(12, 1, 1);  
558 - //this._generateBc(13, 1, 1);  
559 - //this._generateBc(14, 1, 1);  
560 - //this._generateBc(15, 1, 1);  
561 - //this._generateBc(16, 1, 1);  
562 - //this._generateBc(17, 1, 1);  
563 - //this._generateBc(18, 1, 1);  
564 -  
565 - // 6:31 8:30  
566 - // 16:01 18:00  
567 -  
568 - // 测试找上界  
569 - console.log("上界:" + _findUpClosedBcIndexWithTime(_paramObj.getMPeakStartTimeObj(), false));  
570 - console.log("下界:" + _findDownClosedBcIndexWithTime(_paramObj.getMPeakEndTimeObj(), false));  
571 -  
572 - // TODO:  
573 -  
574 - // 测试时间判定  
575 - //console.log("班次出车时间:" + _internalLpArray[0].getQBcIndexWithFcTime(  
576 - // _paramObj.getMPeakStartTimeObj()  
577 - // ));  
578 -  
579 - //// 测试画中标线,第6个路牌的位置,下行中标  
580 - //_internalLpArray[7].initDataFromTimeToTime(  
581 - // _paramObj.getDownFirstDTimeObj(),  
582 - // _paramObj.getUpLastDtimeObj(),  
583 - // false,  
584 - // 0,  
585 - // _paramObj,  
586 - // _factory  
587 - //);  
588 -  
589 - // TODO:问题  
590 - // 1、中标线是直接赋值在具体位置的,没有修正班次时间  
591 - // 2、路牌间隔时间需要修正的  
592 -  
593 - },  
594 -  
595 - // TODO:  
596 -  
597 - /**  
598 - * 调整高峰班次,  
599 - * 初始化生成早高峰,晚高峰班次并不准确,因为根据高峰时间段,并不在一个完整圈内,应该是在两个或多个圈之间  
600 - * 当初始化定好布局后(上标线,中标线),然后确定每个路牌的班型(连班,分班,5休2分班)后  
601 - * 然后重新计算框在高峰时间段内的班次索引,不足的添加,之前多加的删除(只删除分班路牌上的)  
602 - * @param isZgf 是否早高峰  
603 - * @param isUp 是否上行  
604 - */  
605 - adjustGfbc : function(isZgf, isUp) {  
606 - var startTime; // 开始时间  
607 - var endTime; // 结束时间  
608 - var startBcIndex; // 开始班次索引  
609 - var endBcIndex; // 结束班次索引  
610 -  
611 - startTime = isZgf ? _paramObj.getMPeakStartTimeObj() : _paramObj.getEPeakStartTimeObj();  
612 - endTime = isZgf ? _paramObj.getMPeakEndTimeObj() : _paramObj.getEPeakEndTimeObj();  
613 -  
614 - startBcIndex = _findUpClosedBcIndexWithTime(startTime, isUp);  
615 - endBcIndex = _findDownClosedBcIndexWithTime(endTime, isUp);  
616 -  
617 - var _lpIndex;  
618 - var _qIndex;  
619 - var _bcIndex;  
620 - var _qInternelCount; // 高峰时间段中间包含的圈数  
621 - var i;  
622 - var j;  
623 -  
624 - var _lp;  
625 -  
626 - if (startBcIndex && endBcIndex) {  
627 - _lpIndex = startBcIndex[0];  
628 - _qIndex = startBcIndex[1];  
629 - _bcIndex = startBcIndex[2];  
630 -  
631 - // 处理头  
632 - // 删除头部多余班次  
633 - for (j = 0; j < _lpIndex; j++) {  
634 - _lp = _internalLpArray[j];  
635 - if (_lp.isBxFb() && _lp.getBc(_qIndex, _bcIndex)) {  
636 - _lp.removeBc(_qIndex, _bcIndex);  
637 - }  
638 - }  
639 -  
640 - for (j = _lpIndex; j < _internalLpArray.length; j++) {  
641 - _lp = _internalLpArray[j];  
642 - if (!_lp.getBc(_qIndex, _bcIndex)) {  
643 - _generateBcAndSetBc(j, _qIndex, _bcIndex);  
644 - }  
645 - }  
646 -  
647 - // 处理中间  
648 - _qInternelCount = endBcIndex[1] - startBcIndex[1] - 1;  
649 - for (i = 1; i <= _qInternelCount; i++) {  
650 - _lp = _internalLpArray[_qIndex + i];  
651 - if (!_lp.getBc(_qIndex + i, _bcIndex)) {  
652 - _generateBcAndSetBc(i, _qIndex + i, _bcIndex);  
653 - }  
654 - }  
655 -  
656 - // 处理尾部  
657 - _lpIndex = endBcIndex[0];  
658 - _qIndex = endBcIndex[1];  
659 - _bcIndex = endBcIndex[2];  
660 - for (j = 0; j < _lpIndex; j++) {  
661 - _lp = _internalLpArray[j];  
662 - if (!_lp.getBc(_qIndex, _bcIndex)) {  
663 - _generateBcAndSetBc(j, _qIndex, _bcIndex);  
664 - }  
665 - }  
666 - // 删除尾部多余的班次  
667 - for (j = _lpIndex; j < _internalLpArray.length; j++) {  
668 - _lp = _internalLpArray[j];  
669 - if (_lp.isBxFb() && _lp.getBc(_qIndex, _bcIndex)) {  
670 - _lp.removeBc(_qIndex, _bcIndex);  
671 - }  
672 - }  
673 - }  
674 -  
675 - },  
676 -  
677 - /**  
678 - * 补充做5休2的班型班次。  
679 - * 1、做5休2的路牌总工时不能超过7个小时  
680 - * 2、5休2的路牌全部从早晚高峰班次开始往前补充1个班次,组成早晚2圈  
681 - * 3、再根据余下工时及早晚高峰开始时间,确定向前或者向后加班次  
682 - */  
683 - calcuLpBx_5_2: function() {  
684 - // 1、先在早晚高峰班次前加1个班次压压惊  
685 - var i;  
686 - var _lp;  
687 - var _zgfbcpos; // 早高峰班次位置  
688 - var _wgfbcpos; // 晚高峰班次位置  
689 - var _qIndex;  
690 - var _bIndex;  
691 -  
692 - //for (i = 0; i < _internalLpArray.length; i++) {  
693 - // _lp = _internalLpArray[i];  
694 - // if (_lp.isBxFb5_2()) {  
695 - // _zgfbcpos = _lp.getMinBcObjPosition();  
696 - // _wgfbcpos = _lp.getMaxBcObjPosition();  
697 - //  
698 - // // TODO:测试向前添加一个班次  
699 - // _qIndex = _zgfbcpos[0];  
700 - // _bIndex = _zgfbcpos[1];  
701 - // _bIndex == 0 ?  
702 - // _generateBcAndSetBc(i, _qIndex - 1, 1) :  
703 - // _generateBcAndSetBc(i, _qIndex, 0);  
704 - //  
705 - // _qIndex = _wgfbcpos[0];  
706 - // _bIndex = _wgfbcpos[1];  
707 - // _bIndex == 0 ?  
708 - // _generateBcAndSetBc(i, _qIndex - 1, 1) :  
709 - // _generateBcAndSetBc(i, _qIndex, 0);  
710 - //  
711 - // }  
712 - //}  
713 -  
714 - // 2、  
715 - },  
716 -  
717 - /**  
718 - * 补充连班路牌班次。  
719 - * 1、上标线,中标线中间的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向上标线起始班次靠拢  
720 - * 2、中标线以下的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向中标线起始班次靠拢  
721 - */  
722 - calcuLpBx_lb: function() {  
723 - // 补充连班的班次,参照上标线,中标线补充不足的班次  
724 - var _zgffcsj; // 早高峰发车时间  
725 - var _etsj = // 结束时间  
726 - _paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj()) ?  
727 - _paramObj.getDownLastDTimeObj() :  
728 - _paramObj.getUpLastDtimeObj();  
729 -  
730 - var _lp;  
731 - var _minbcPos;  
732 - var _bcObj;  
733 - var i;  
734 - for (i = 0; i < _internalLpArray.length; i++) {  
735 - _lp = _internalLpArray[i];  
736 - if (_lp.isBxLb() && i != 0 && i != _zbx_lpIndex) {  
737 - _minbcPos = _lp.getMinBcObjPosition();  
738 - _bcObj = _lp.getBc(_minbcPos[0], _minbcPos[1]);  
739 - _zgffcsj = _bcObj.getFcTimeObj();  
740 - // 重新初始化连班班型班次  
741 - _lp.initDataFromTimeToTime(  
742 - _zgffcsj,  
743 - _etsj,  
744 - _bcObj.isUp(),  
745 - _minbcPos[0],  
746 - _paramObj,  
747 - _factory  
748 - );  
749 - }  
750 - }  
751 -  
752 - // 还要补充缺失的班次,差上标线几个班次要往前补上  
753 - var _bccount;  
754 - var j;  
755 - var _qIndex;  
756 - var _bIndex;  
757 - // 补上标线到中标线之间的连班路牌的班次  
758 - for (i = 0; i < _zbx_lpIndex; i++) {  
759 - _lp = _internalLpArray[i];  
760 - if (_lp.isBxLb() && i != 0 && i != _zbx_lpIndex) {  
761 - _minbcPos = _lp.getMinBcObjPosition();  
762 - _qIndex = _minbcPos[0];  
763 - _bIndex = _minbcPos[1];  
764 - _bccount = (_qIndex - 1) * 2 + _bIndex; // 距离上标线起始站点差几个班次  
765 - for (j = 0; j < _bccount; j++) {  
766 - if (_bIndex == 0) {  
767 - _qIndex --;  
768 - _bIndex = 1;  
769 - _generateBcAndSetBc(i, _qIndex, _bIndex);  
770 - } else if (_bIndex == 1) {  
771 - _bIndex --;  
772 - _generateBcAndSetBc(i, _qIndex, _bIndex);  
773 - }  
774 - }  
775 - }  
776 - }  
777 - // 补中标线以下的连班路牌的班次  
778 - for (i = _zbx_lpIndex; i < _internalLpArray.length; i++) {  
779 - _lp = _internalLpArray[i];  
780 - if (_lp.isBxLb() && i != 0 && i != _zbx_lpIndex) {  
781 - _minbcPos = _lp.getMinBcObjPosition();  
782 - _qIndex = _minbcPos[0];  
783 - _bIndex = _minbcPos[1];  
784 - _bccount = (_qIndex - 0) * 2 + _bIndex - 1; // 距离上标线起始站点差几个班次  
785 - for (j = 0; j < _bccount; j++) {  
786 - if (_bIndex == 0) {  
787 - _qIndex --;  
788 - _bIndex = 1;  
789 - _generateBcAndSetBc(i, _qIndex, _bIndex);  
790 - } else if (_bIndex == 1) {  
791 - _bIndex --;  
792 - _generateBcAndSetBc(i, _qIndex, _bIndex);  
793 - }  
794 - }  
795 - }  
796 - }  
797 -  
798 - },  
799 -  
800 - /**  
801 - * 计算每个路牌的班型及工时对应的圈数。  
802 - * 1、将连班,分班路牌分配到各个路牌上(分隔法),上标线,中标线上连班路牌  
803 - * 2、确定班型的工时,其中连班路牌的工时由上标线,中标线确定好了,5休2路牌工时也确定了,  
804 - * 其余分班路牌的工时由高峰低谷最大,最小发车间隔计算  
805 - */  
806 - calcuLpBx_fg: function() {  
807 - // 间隔法  
808 -  
809 - //--------------------------- 1、间隔法分隔连班路牌 ----------------------//  
810 -  
811 - // 除去上标线,中标线的连班路牌个数  
812 - var _lblbcount = _bx_lb_lpcount - 2;  
813 - // 计算由标线隔开的两个区域的路牌数比率  
814 - var _p1 = (_zbx_lpIndex + 1) / (_internalLpArray.length + 1);  
815 - var _p2 = (_internalLpArray.length - _zbx_lpIndex) / (_internalLpArray.length + 1);  
816 - var _p1_lpcount = _lblbcount * _p1;  
817 - var _p2_lpcount = _lblbcount * _p2;  
818 - if (parseInt(_p1_lpcount) != _p1_lpcount) { // 没有整除  
819 - _p1_lpcount = Math.floor(_p1_lpcount);  
820 - _p2_lpcount = Math.floor(_p2_lpcount) + 1;  
821 - }  
822 -  
823 - // 设定第一个区域的连班路牌  
824 - var i;  
825 - var _count = _p1_lpcount + 1;  
826 - var _c1 = Math.floor(_zbx_lpIndex / _count);  
827 - var _c2 = _zbx_lpIndex % _count;  
828 - var _c2_start_index;  
829 - for (i = 1; i <= _count - _c2; i++) {  
830 - _internalLpArray[(i - 1) * _c1].setBxLb(true);  
831 - _internalLpArray[(i - 1) * _c1].setBxDesc("连班");  
832 - _c2_start_index = (i - 1) * _c1;  
833 - }  
834 - for (i = 1; i <= _c2; i++) {  
835 - _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true);  
836 - _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxDesc("连班");  
837 - }  
838 -  
839 - // 设定第二个区域的连班路牌  
840 - _count = _p2_lpcount + 1;  
841 - _c1 = Math.floor((_internalLpArray.length - _zbx_lpIndex - 1) / _count);  
842 - _c2 = (_internalLpArray.length - _zbx_lpIndex - 1) % _count;  
843 - for (i = 1; i <= _count - _c2; i++) {  
844 - _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxLb(true);  
845 - _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb(false);  
846 - _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb5_2(false);  
847 - _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxDesc("连班");  
848 - _c2_start_index = (i - 1) * _c1 + _zbx_lpIndex;  
849 - }  
850 - for (i = 1; i <= _c2; i++) {  
851 - _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true);  
852 - _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb(false);  
853 - _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb5_2(false);  
854 - _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxDesc("连班");  
855 - }  
856 -  
857 - //---------------------------- 2、分隔法,分隔分班路牌 -------------------------//  
858 -  
859 - // 设定分班路牌  
860 - var notlbIndexes = []; // 去除连班的路牌index列表  
861 - for (i = 0; i < _internalLpArray.length; i++) {  
862 - if (!_internalLpArray[i].isBxLb()) {  
863 - notlbIndexes.push(i);  
864 - }  
865 - }  
866 - // 获取离中标线最近的分班路牌索引  
867 - var _temp_fg_index;  
868 - for (i = 0; i < notlbIndexes.length; i++) {  
869 - if (notlbIndexes[i] == _zbx_lpIndex - 1) {  
870 - _temp_fg_index = i;  
871 - break;  
872 - }  
873 - }  
874 -  
875 - // 使用上面的分隔比率,分隔5休2班型  
876 - _p1_lpcount = _bx_5_2_fb_lpcount * _p1;  
877 - _p2_lpcount = _bx_5_2_fb_lpcount * _p2;  
878 - if (parseInt(_p1_lpcount) != _p1_lpcount) { // 没有整除  
879 - _p1_lpcount = Math.floor(_p1_lpcount);  
880 - _p2_lpcount = Math.floor(_p2_lpcount) + 1;  
881 - }  
882 - // 第一个区域  
883 - _count = _p1_lpcount;  
884 - _c1 = Math.floor(_temp_fg_index / _count);  
885 - _c2 = _temp_fg_index % _count;  
886 - for (i = 1; i <= _count - _c2; i++) {  
887 - _internalLpArray[notlbIndexes[(i - 1) * _c1]].setBxLb(false);  
888 - _internalLpArray[notlbIndexes[(i - 1) * _c1]].setBxFb(true);  
889 - _internalLpArray[notlbIndexes[(i - 1) * _c1]].setBxFb5_2(true);  
890 - _internalLpArray[notlbIndexes[(i - 1) * _c1]].setBxDesc("5休2分班");  
891 - _c2_start_index = (i - 1) * _c1;  
892 - }  
893 - for (i = 1; i <= _c2; i++) {  
894 - _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxLb(false);  
895 - _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxLb(true);  
896 - _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxFb5_2(true);  
897 - _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxDesc("5休2分班");  
898 - }  
899 - // 第二个区域  
900 - _count = _p2_lpcount;  
901 - _c1 = Math.floor((notlbIndexes.length - _temp_fg_index - 1) / _count);  
902 - _c2 = (notlbIndexes.length - _temp_fg_index - 1) % _count;  
903 - for (i = 1; i <= _count - _c2; i++) {  
904 - _internalLpArray[notlbIndexes[(i - 1) * _c1 + _temp_fg_index + 1]].setBxLb(false);  
905 - _internalLpArray[notlbIndexes[(i - 1) * _c1 + _temp_fg_index + 1]].setBxFb(true);  
906 - _internalLpArray[notlbIndexes[(i - 1) * _c1 + _temp_fg_index + 1]].setBxFb5_2(true);  
907 - _internalLpArray[notlbIndexes[(i - 1) * _c1 + _temp_fg_index + 1]].setBxDesc("5休2分班");  
908 - _c2_start_index = (i - 1) * _c1 + _temp_fg_index + 1;  
909 - }  
910 - for (i = 1; i <= _c2; i++) {  
911 - _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxLb(false);  
912 - _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxFb(true);  
913 - _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxFb5_2(true);  
914 - _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxDesc("5休2分班");  
915 - }  
916 -  
917 - //-------------------------- 3、余下班次就是其他分班类型 ----------------------//  
918 -  
919 - for (i = 0; i < notlbIndexes.length; i++) {  
920 - if (!_internalLpArray[notlbIndexes[i]].isBxFb5_2()) {  
921 - _internalLpArray[notlbIndexes[i]].setBxLb(false);  
922 - _internalLpArray[notlbIndexes[i]].setBxFb(true);  
923 - _internalLpArray[notlbIndexes[i]].setBxFb5_2(false);  
924 - _internalLpArray[notlbIndexes[i]].setBxDesc("其他分班");  
925 - }  
926 - }  
927 -  
928 - // 测试打印  
929 - var lbIndexes = [];  
930 - for (i = 0; i < _internalLpArray.length; i++) {  
931 - if (_internalLpArray[i].isBxLb()) {  
932 - lbIndexes.push(i);  
933 - }  
934 - }  
935 - console.log("连班路牌indexes=" + lbIndexes);  
936 -  
937 - var _other_fbIndexes = [];  
938 - for (i = 0; i < _internalLpArray.length; i++) {  
939 - if (_internalLpArray[i].isBxFb() && !_internalLpArray[i].isBxFb5_2()) {  
940 - _other_fbIndexes.push(i);  
941 - }  
942 - }  
943 - console.log("其他分班路牌indexes=" + _other_fbIndexes);  
944 -  
945 - var _5_2_fbIndexes = [];  
946 - for (i = 0; i < _internalLpArray.length; i++) {  
947 - if (_internalLpArray[i].isBxFb() && _internalLpArray[i].isBxFb5_2()) {  
948 - _5_2_fbIndexes.push(i);  
949 - }  
950 - }  
951 - console.log("5休2分班路牌indexes=" + _5_2_fbIndexes);  
952 - },  
953 -  
954 - //------------- 其他方法 -------------//  
955 - /**  
956 - * 内部数据转化成显示用的班次数组。  
957 - */  
958 - toGanttBcArray: function() {  
959 - var bcData = [];  
960 - var lpObj;  
961 - for (i = 0; i < _internalLpArray.length; i++) {  
962 - lpObj = _internalLpArray[i];  
963 - bcData = bcData.concat(lpObj.getBcArray());  
964 - }  
965 -  
966 - var ganttBcData = [];  
967 - for (i = 0; i < bcData.length; i++) {  
968 - ganttBcData.push(bcData[i].toGanttBcObj());  
969 - }  
970 -  
971 - return ganttBcData;  
972 - }  
973 -  
974 - // TODO:  
975 - }; 1 +/**
  2 + * 内部行车计划对象。
  3 + * @constructor
  4 + */
  5 +var InternalScheduleObj = function(paramObj, lpArray, factory) {
  6 + // 参数对象
  7 + var _paramObj = paramObj;
  8 + // 外部的路牌数组
  9 + var _lpArray = lpArray;
  10 + // 工厂对象
  11 + var _factory = factory;
  12 +
  13 + //------------------ 初始化方法1,以及计算关联的内部变量 -----------------//
  14 + var _qIsUp; // 每一圈是上行开始还是下行开始
  15 + var _qCount = 0; // 总的圈数
  16 + var _internalLpArray = []; // 内部对象数组
  17 +
  18 + var _initFun1 = function() { // 初始化方法1
  19 +
  20 + //----------------------- 1、确定上标线的方向,圈的方向 -------------------//
  21 +
  22 + // 确定_qIsUp,哪个方向的首班车晚就用哪个
  23 + _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore(
  24 + _paramObj.getDownFirstDTimeObj()) ? false : true;
  25 + // 上标线开始时间,就是方向的首班车时间
  26 + var st = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
  27 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  28 + var et;
  29 + var et_IsUp;
  30 + if (_paramObj.getUpLastDtimeObj().isBefore(
  31 + _paramObj.getDownLastDTimeObj())) {
  32 + et = _paramObj.getDownLastDTimeObj();
  33 + et_IsUp = false;
  34 + } else {
  35 + et = _paramObj.getUpLastDtimeObj();
  36 + et_IsUp = true;
  37 + }
  38 +
  39 + //------------------------ 2、计算总共有多少圈 ------------------------//
  40 +
  41 +
  42 +
  43 + // 以开始时间,结束时间,构造上标线用连班班次发车时间
  44 + var bcFcsjArrays = []; // 班次发车时间对象数组
  45 + var bcArsjArrays = []; // 班次到达时间对象数组
  46 + var isUp = _qIsUp; // 方向
  47 + var bcCount = 1; // 班次数
  48 +
  49 + var _kssj = st; // 开始时间
  50 + var _bcsj = paramObj.calcuTravelTime(_kssj, isUp); // 班次历时
  51 + var _arrsj = paramObj.addMinute(_kssj, _bcsj); // 到达时间
  52 + var _stoptime = paramObj.calcuFixedStopNumber(_arrsj, !isUp); // 停站时间
  53 +
  54 + do {
  55 + bcFcsjArrays.push(_kssj);
  56 + bcArsjArrays.push(_arrsj);
  57 + _kssj = paramObj.addMinute(_kssj, _bcsj + _stoptime);
  58 + bcCount ++;
  59 + isUp = !isUp;
  60 + } while(_kssj.isBefore(et));
  61 + bcCount--; // 因为先做do,所以总的班次要减1
  62 + if (bcCount > 0 && bcArsjArrays[bcCount - 1].isAfter(et)) {
  63 + // 如果最后一个班次的到达时间超过结束时间,也要去除
  64 + bcFcsjArrays.splice(bcCount - 1, 1);
  65 + bcArsjArrays.splice(bcCount - 1, 1);
  66 + bcCount--;
  67 + }
  68 + var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈
  69 + var _qCount_p2 = bcCount % 2; // 余下的1个班次也算一圈
  70 +
  71 + // 利用连班数组计算圈数
  72 + _qCount = 1; // 前面加1圈,补中标线的班次
  73 + _qCount += _qCount_p1;
  74 + _qCount += _qCount_p2;
  75 +
  76 + // 计算最后是不是还要补一圈
  77 + if (_qCount > 1) { // 总的圈数就1圈,没必要加了(其实是不可能的,除非参数里问题)
  78 + if (_qCount_p2 == 0) { // 没有余下班次,整数圈数
  79 + // 最后一个班次的方向一定和开始的方向相反,如:上-下,上-下,上-下,一共三圈,最后一个班次为下行
  80 + // 判定最后一个班次的方向和上标线判定结束时间的班次方向是否一致
  81 + if (!_qIsUp == et_IsUp) {
  82 + // 一致不用加圈数
  83 + } else {
  84 + // 不一致需要加圈补最后一个结束时间班次
  85 + _qCount ++;
  86 + }
  87 + } else {
  88 + // 有余下的圈数,最后要不补的班次不管上行,下行都在这一圈里
  89 + // 不需要在补圈数了
  90 + }
  91 + }
  92 +
  93 + //------------------------ 3、根据路牌数,圈数创建路牌对象 ----------------------//
  94 +
  95 + // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中
  96 + var i;
  97 + for (i = 0; i < _lpArray.length; i++) {
  98 + _internalLpArray.push(new InternalLpObj(_lpArray[i], _qCount, _qIsUp));
  99 + }
  100 + // 初始化上标线,从第1圈开始
  101 + _internalLpArray[0].initDataFromTimeToTime(bcFcsjArrays[0], et, _qIsUp, 1, _paramObj, _factory);
  102 +
  103 + console.log("//---------------- 行车计划,初始化方法1 start ----------------//");
  104 + console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") +
  105 + "上行末班车时间:" + _paramObj.getUpLastDtimeObj().format("HH:mm"));
  106 + console.log("下行首班车时间:" + _paramObj.getDownFirstDTimeObj().format("HH:mm") +
  107 + "下行末班车时间:" + _paramObj.getDownLastDTimeObj().format("HH:mm"));
  108 + console.log("总共计算的圈数:" + _qCount);
  109 + console.log("圈的方向isUP:" + _qIsUp);
  110 + console.log("//---------------- 行车计划,初始化方法1 end ----------------//");
  111 +
  112 + };
  113 +
  114 + //------------------ 初始化方法2,以及计算关联的内部变量 ----------------//
  115 + var _approximate_zgfQIndex; // 预估早高峰车辆从第几圈开始全部发出
  116 + var _approximate_zgfBIndex; // 预估早高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
  117 + var _approximate_wgfQIndex; // 预估晚高峰车辆从第几圈开始全部发出
  118 + var _approximate_wgfBIndex; // 预估晚高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
  119 +
  120 + // 同一圈同一方向班次发车间隔的最小值
  121 + // 注意:这个值就是用来添加班次的时间增加单位,在后面相关的方法里会具体说明
  122 + var _qbcMinIntervalValue;
  123 +
  124 + var _initFun2 = function() { // 初始化方法2
  125 + //------------------------ 1、预估早高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
  126 +
  127 + // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次
  128 + // 以这个班次为早高峰起点,全部出车策略
  129 + var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
  130 + _paramObj.getMPeakStartTimeObj());
  131 + var qIndex = qbcIndexArray[0]; // 第几圈
  132 + var bIndex = qbcIndexArray[1]; // 第几个班次
  133 + var startbc = _internalLpArray[0].getBc(qIndex, bIndex);
  134 +
  135 + // 计算早高峰
  136 + var _clCount = _paramObj.calcuClzx();
  137 + var _c1 = Math.floor(_paramObj.calcuPeakZzsj() / _clCount);
  138 + var _c2 = _paramObj.calcuPeakZzsj() % _clCount;
  139 + var _kssj = startbc.getFcTimeObj();
  140 +
  141 + var i;
  142 + for (i = 2; i <= _clCount - _c2; i++) {
  143 + _kssj = _paramObj.addMinute(_kssj, _c1);
  144 + _internalLpArray[i - 1].setBc(
  145 + qIndex,
  146 + bIndex,
  147 + _factory.createBcObj(
  148 + _internalLpArray[i - 1],
  149 + "normal", startbc.isUp(),
  150 + 1, _kssj, paramObj)
  151 + );
  152 + // 使用早高峰的发车间隔最为路牌纵向最小发车间隔,不能整除的话,小的放在前面的路牌
  153 + _internalLpArray[i - 1].setVerticalMinIntervalTime(_c1);
  154 + }
  155 + for (i = 1; i <= _c2; i++) {
  156 + _kssj = _paramObj.addMinute(_kssj, _c1 + 1);
  157 + _internalLpArray[_clCount - _c2 + i - 1].setBc(
  158 + qIndex,
  159 + bIndex,
  160 + _factory.createBcObj(
  161 + _internalLpArray[_clCount - _c2 + i - 1],
  162 + "normal", startbc.isUp(),
  163 + 1, _kssj, paramObj)
  164 + );
  165 + // 使用早高峰的发车间隔最为路牌纵向最小发车间隔,,不能整除的话,大的放在后面的路牌
  166 + _internalLpArray[_clCount - _c2 + i - 1].setVerticalMinIntervalTime(_c1);
  167 + }
  168 +
  169 + _approximate_zgfQIndex = qIndex;
  170 + _approximate_zgfBIndex = bIndex;
  171 +
  172 + //------------------------ 2、预估晚高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
  173 +
  174 + // 以上标线为标准,查找离晚高峰开始时间最近的班次作为晚高峰开始班次
  175 + // 以这个班次为早高峰起点,全部出车策略
  176 + qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
  177 + _paramObj.getEPeakStartTimeObj());
  178 + qIndex = qbcIndexArray[0]; // 第几圈
  179 + bIndex = qbcIndexArray[1]; // 第几个班次
  180 + startbc = _internalLpArray[0].getBc(qIndex, bIndex);
  181 +
  182 + // 计算晚高峰
  183 + _clCount = _paramObj.calcuClzx();
  184 + _c1 = Math.floor(_paramObj.calcuPeakZzsj() / _clCount);
  185 + _c2 = _paramObj.calcuPeakZzsj() % _clCount;
  186 + _kssj = startbc.getFcTimeObj();
  187 +
  188 + for (i = 2; i <= _clCount - _c2; i++) {
  189 + _kssj = _paramObj.addMinute(_kssj, _c1);
  190 + _internalLpArray[i - 1].setBc(
  191 + qIndex,
  192 + bIndex,
  193 + _factory.createBcObj(
  194 + _internalLpArray[i - 1],
  195 + "normal", startbc.isUp(),
  196 + 1, _kssj, _paramObj)
  197 + );
  198 + }
  199 + for (i = 1; i <= _c2; i++) {
  200 + _kssj = _paramObj.addMinute(_kssj, _c1 + 1);
  201 + _internalLpArray[_clCount - _c2 + i - 1].setBc(
  202 + qIndex,
  203 + bIndex,
  204 + _factory.createBcObj(
  205 + _internalLpArray[_clCount - _c2 + i - 1],
  206 + "normal", startbc.isUp(),
  207 + 1, _kssj, _paramObj)
  208 + );
  209 + }
  210 +
  211 + _approximate_wgfQIndex = qIndex;
  212 + _approximate_wgfBIndex = bIndex;
  213 + _qbcMinIntervalValue = _c1;
  214 +
  215 + console.log("//---------------- 行车计划,初始化方法2 start ----------------//");
  216 + console.log("预估早高峰第" + _approximate_zgfQIndex + "(index)圈,第" + _approximate_zgfBIndex + "(index)班次车辆全部发出");
  217 + console.log("预估晚高峰第" + _approximate_wgfQIndex + "(index)圈,第" + _approximate_wgfBIndex + "(index)班次车辆全部发出");
  218 + console.log("预估同圈同方向班次最小间隔(分钟):" + _qbcMinIntervalValue);
  219 + console.log("//---------------- 行车计划,初始化方法2 end ----------------//");
  220 + };
  221 +
  222 + //----------------------- 初始化方法3,以及计算关联的内部变量 ----------------//
  223 + var _zbx_lpIndex; // 中标线对应第几个路牌
  224 +
  225 + var _initFun3 = function() { // 初始化方法3
  226 + //---------------------------- 1、模拟一个中标线,使用临时路牌 ----------------------//
  227 +
  228 + // 构造中标线
  229 + // 中标线开始时间,就是方向的首班车时间
  230 + var st = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
  231 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  232 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  233 + var et;
  234 + if (_paramObj.getUpLastDtimeObj().isBefore(
  235 + _paramObj.getDownLastDTimeObj())) {
  236 + et = _paramObj.getDownLastDTimeObj();
  237 + } else {
  238 + et = _paramObj.getUpLastDtimeObj();
  239 + }
  240 +
  241 + var tempLpObj = new InternalLpObj({lpNo: -999, lpName: "-999"}, _qCount, _qIsUp);
  242 + tempLpObj.initDataFromTimeToTime(
  243 + st,
  244 + et,
  245 + !_qIsUp,
  246 + 0,
  247 + _paramObj,
  248 + _factory
  249 + );
  250 +
  251 + //------------------------ 2、找出中标线的早高峰班次,计算应该插在当前路牌数组的那个位置 ----------------//
  252 + // TODO:中标线的早高峰发车班次,和插入位置的早高分班次的时间会有误差的
  253 + // TODO:这里是直接把中标线班次覆盖,没有根据误差调整,以后改
  254 +
  255 + // 找出中标线对应的早高峰的班次对象
  256 + var _zb_bcobj = tempLpObj.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
  257 +
  258 + // 把所有高峰班次重新构造成一个一个的圈数组,计算对应中标线最近的是第几个路牌
  259 + var _tempq_array = [];
  260 + var _temp_group;
  261 + var _temp_bc;
  262 + var i;
  263 + for (i = 0; i < _internalLpArray.length; i++) {
  264 + _temp_bc = _internalLpArray[i].getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
  265 + if (_temp_bc.isUp() == _qIsUp) {
  266 + _temp_group = new InternalGroupObj(_internalLpArray[i], _qIsUp, _temp_bc, undefined);
  267 + } else {
  268 + _temp_group = new InternalGroupObj(_internalLpArray[i], _qIsUp, undefined, _temp_bc);
  269 + }
  270 + _tempq_array.push(_temp_group);
  271 + }
  272 +
  273 + var _ttindex_ = tempLpObj.getgetQBcIndexWithFcTimeFromGroupArray(
  274 + _zb_bcobj.getFcTimeObj(),
  275 + _tempq_array
  276 + );
  277 + _zbx_lpIndex = _ttindex_[0]; // 中标线放在第几个路牌
  278 + tempLpObj.setLp(_lpArray[_zbx_lpIndex]); // 设置原始路牌对象
  279 + tempLpObj.setVerticalMinIntervalTime( // 设置纵向最小发车间隔
  280 + _internalLpArray[_zbx_lpIndex].getVerticalMinIntervalTime()
  281 + );
  282 +
  283 + // 注意:这里直接把中标线数据替换到指定路牌位置
  284 + // TODO:由初始化方法1,初始化方法2得到的2个高峰的班次会被中标线对应班次覆盖
  285 + // TODO:目前使用中标线的班次覆盖,以后相互动态调整
  286 +
  287 + _internalLpArray[_zbx_lpIndex] = tempLpObj;
  288 +
  289 + console.log("//---------------- 行车计划,初始化方法3 start ----------------//");
  290 + console.log("中标线对应第" + (_zbx_lpIndex + 1) + "个路牌");
  291 + console.log("//---------------- 行车计划,初始化方法3 end ----------------//");
  292 +
  293 + };
  294 +
  295 + //----------------------- 初始化方法4,以及计算关联的内部变量 ----------------//
  296 + var _bx_lb_lpcount; // 连班路牌数
  297 + var _bx_5_2_fb_lpcount; // 5休2分班路牌数
  298 + var _bx_other_fb_lpcount; // 其他分班路牌数
  299 +
  300 + var _initFun4 = function() { // 初始化方法4
  301 + // 总共车辆数(高峰最大车辆数)
  302 + var cls = _paramObj.calcuClzx();
  303 + // 低谷最少配车(连班车数量)
  304 + var dgminpc = Math.round(_paramObj.calcuTroughZzsj() / _paramObj.getTroughMaxFcjx());
  305 + // 加班车路牌数(做5休2的路牌数)
  306 + var _5_2_lpes = _paramObj.getJBLpes();
  307 +
  308 + // 做些简单的验证
  309 + if (cls < dgminpc) {
  310 + alert("总配车数小于低谷最小配车");
  311 + throw "总配车数小于低谷最小配车";
  312 + }
  313 + if (dgminpc < 2) {
  314 + alert("连班路牌小于2,办不到啊");
  315 + throw "连班路牌小于2,办不到啊";
  316 + }
  317 + if (cls - dgminpc < _5_2_lpes) {
  318 + alert("总分班路牌数小于加班路牌数");
  319 + throw "总分班路牌数小于加班路牌数";
  320 + }
  321 +
  322 + _bx_lb_lpcount = dgminpc;
  323 + _bx_5_2_fb_lpcount = _5_2_lpes;
  324 + _bx_other_fb_lpcount = cls - dgminpc - _5_2_lpes;
  325 +
  326 + console.log("//---------------- 行车计划,初始化方法4 start ----------------//");
  327 + console.log("连班路牌数:" + _bx_lb_lpcount);
  328 + console.log("5休2分班路牌数:" + _bx_5_2_fb_lpcount);
  329 + console.log("其他分班路牌数:" + _bx_other_fb_lpcount);
  330 + console.log("//---------------- 行车计划,初始化方法4 end ----------------//");
  331 + };
  332 +
  333 + //-------------------- 重要的内部方法 -----------------------//
  334 + /**
  335 + * 在指定位置生成班次(内部重要方法)。
  336 + * @param lpIndex 第几个路牌
  337 + * @param qIndex 第几圈
  338 + * @param bcIndex 第几个班次
  339 + * @returns InternalBcObj
  340 + */
  341 + var _generateBc = function(lpIndex, qIndex, bcIndex) {
  342 + // 在初始化布局后使用,否则没有参照班次加不了
  343 + // 初始化布局后,相当于把时刻表比作一个围棋棋盘,行为路牌数,列为圈数
  344 + // 上标线,中标线,早晚高峰已经布局在棋盘上,其余的空格可以创建班次
  345 +
  346 + // 这个生成班次是以上一班次时间,以发车间隔为基础添加的,纵向加
  347 + // 和生成标线时那种一直往后加班次时不一样,那种是以前一个班次为基础,横向加
  348 +
  349 + // 1、生成的班次以同一圈同一个方向里离它最早的班次的发车时间为基础
  350 + // 2、以每个路牌的纵向最小发车间隔时间为计算发车间隔
  351 + // 3、如果班次发车时间越界不管,有其余方法排除这种情况
  352 +
  353 + // 1、查找同圈同方向里最近的班次,找不到报错(因为有标线存在是不可能找不到的)
  354 + var _i;
  355 + var _bcObj;
  356 + for (_i = lpIndex - 1; _i >= 0; _i--) {
  357 + _bcObj = _internalLpArray[_i].getBc(qIndex, bcIndex);
  358 + if (_bcObj) {
  359 + break;
  360 + }
  361 + }
  362 + if (!_bcObj) {
  363 + return false;
  364 + //alert("无法在指定位置生成班次");
  365 + //throw "无法在路牌index=" + lpIndex + ",圈index=" + qIndex + ",班次index=" + bcIndex + "生成班次";
  366 + }
  367 +
  368 + // 2、计算发车间隔
  369 + var _intervalTime = 0;
  370 + for (_i = _i + 1; _i <= lpIndex; _i++) {
  371 + _intervalTime += _internalLpArray[_i].getVerticalMinIntervalTime();
  372 + }
  373 +
  374 + // 3、计算班次并添加班次
  375 + var _kssj = _paramObj.addMinute(_bcObj.getFcTimeObj(), _intervalTime);
  376 + _bcObj = _factory.createBcObj(
  377 + _internalLpArray[lpIndex],
  378 + "normal", _bcObj.isUp(),
  379 + 1, _kssj, _paramObj);
  380 + _bcObj.setGroup(_internalLpArray[lpIndex].getGroup(qIndex));
  381 +
  382 + return _bcObj;
  383 +
  384 + // TODO:这种添加班次的方法,可能造成相邻班次的停站时间问题
  385 + // TODO:主要是由于中标线的问题,但是误差不会很大,
  386 + // TODO:后面有方法直接调整停站时间(所谓的平滑过度时间)
  387 + };
  388 +
  389 + /**
  390 + * 在指定位置生成班次并添加到路牌指定位置中。
  391 + * @param lpIndex 第几个路牌
  392 + * @param qIndex 第几圈
  393 + * @param bcIndex 第几个班次
  394 + */
  395 + var _generateBcAndSetBc = function(lpIndex, qIndex, bcIndex) {
  396 + var _bcObj = _generateBc(lpIndex, qIndex, bcIndex);
  397 + _internalLpArray[lpIndex].setBc(qIndex, bcIndex, _bcObj);
  398 +
  399 + };
  400 +
  401 + /**
  402 + * 查找离指定时间最近的前面的班次索引信息
  403 + * @param timeObj 查找时间
  404 + * @param isUp 是否上行
  405 + * @returns [{路牌index},{圈index},{班次index}]
  406 + */
  407 + var _findUpClosedBcIndexWithTime = function(timeObj, isUp) {
  408 + var _lpObj;
  409 + var _groupObj;
  410 + var _bcObj;
  411 + var _i;
  412 + var _j;
  413 + var timediff; // 时间差取绝对值
  414 +
  415 + var _lpIndex;
  416 + var _up_qIndex;
  417 + var _up_bIndex;
  418 +
  419 + for (_i = 0; _i < _qCount; _i++) {
  420 + for (_j = 0; _j < _internalLpArray.length; _j++) {
  421 + _lpObj = _internalLpArray[_j];
  422 + _groupObj = _lpObj.getGroup(_i);
  423 + _bcObj = isUp ? _groupObj.getBc1() : _groupObj.getBc2();
  424 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
  425 + _bcObj = _generateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
  426 + }
  427 + if (_bcObj) {
  428 + if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) {
  429 + if (!timediff) {
  430 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  431 + _lpIndex = _j;
  432 + _up_qIndex = _i;
  433 + _up_bIndex = isUp == _qIsUp ? 0 : 1;
  434 + } else {
  435 + if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) {
  436 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  437 + _lpIndex = _j;
  438 + _up_qIndex = _i;
  439 + _up_bIndex = isUp == _qIsUp ? 0 : 1;
  440 + }
  441 + }
  442 + }
  443 + }
  444 + }
  445 + }
  446 +
  447 + if (_lpIndex == undefined) {
  448 + return false;
  449 + }
  450 +
  451 + var bcindex = [];
  452 + bcindex.push(_lpIndex);
  453 + bcindex.push(_up_qIndex);
  454 + bcindex.push(_up_bIndex);
  455 +
  456 + return bcindex;
  457 + };
  458 +
  459 + /**
  460 + * 查找离指定时间最近的后面的班次索引信息
  461 + * @param timeObj 查找时间
  462 + * @param isUp 是否上行
  463 + * @returns [{路牌index},{圈index},{班次index}]
  464 + */
  465 + var _findDownClosedBcIndexWithTime = function(timeObj, isUp) {
  466 + var _lpObj;
  467 + var _groupObj;
  468 + var _bcObj;
  469 + var _i;
  470 + var _j;
  471 + var timediff; // 时间差取绝对值
  472 +
  473 + var _lpIndex;
  474 + var _down_qIndex;
  475 + var _down_bIndex;
  476 +
  477 + var flag;
  478 +
  479 + for (_i = 0; _i < _qCount; _i++) {
  480 + for (_j = 0; _j < _internalLpArray.length; _j++) {
  481 + _lpObj = _internalLpArray[_j];
  482 + _groupObj = _lpObj.getGroup(_i);
  483 + _bcObj = isUp ? _groupObj.getBc1() : _groupObj.getBc2();
  484 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
  485 + _bcObj = _generateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
  486 + }
  487 + if (_bcObj) {
  488 + //console.log("timeobj -> bcobj diff flag " +
  489 + // timeObj.format("HH:mm") + "->" +
  490 + // _bcObj.getFcTimeObj().format("HH:mm") +
  491 + // timeObj.diff(_bcObj.getFcTimeObj()) +
  492 + // (timeObj.diff(_bcObj.getFcTimeObj()) <= 0)
  493 + //);
  494 +
  495 + flag = (timeObj.diff(_bcObj.getFcTimeObj())) <= 0;
  496 +
  497 + if (flag) {
  498 + if (!timediff) {
  499 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  500 + _lpIndex = _j;
  501 + _down_qIndex = _i;
  502 + _down_bIndex = isUp == _qIsUp ? 0 : 1;
  503 + } else {
  504 + if ((timeObj.diff(_bcObj.getFcTimeObj())) > timediff) {
  505 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  506 + _lpIndex = _j;
  507 + _down_qIndex = _i;
  508 + _down_bIndex = isUp == _qIsUp ? 0 : 1;
  509 + }
  510 + }
  511 + }
  512 + }
  513 + }
  514 + }
  515 +
  516 + if (_lpIndex == undefined) {
  517 + return false;
  518 + }
  519 +
  520 + var bcindex = [];
  521 + bcindex.push(_lpIndex);
  522 + bcindex.push(_down_qIndex);
  523 + bcindex.push(_down_bIndex);
  524 +
  525 + return bcindex;
  526 + };
  527 +
  528 + return {
  529 + //------------- 布局初始化方法 ------------//
  530 + /**
  531 + * 初始化数据,使用标线初始化
  532 + */
  533 + initDataWithBxLayout: function() {
  534 + // 初始化布局1,构造上标线,计算圈数,把上标线数据放入第一个路牌中
  535 + _initFun1();
  536 + // 初始化布局2,从上标线的某个班次开始,构造所有路牌的早高峰班次,晚高峰班次
  537 + _initFun2();
  538 + // 初始化布局3,构造中标线,根据高峰班次,将中标线放入合适的路牌中
  539 + _initFun3();
  540 + // 初始化4,计算连班,分班相关路牌数
  541 + _initFun4();
  542 +
  543 + // 测试添加班次
  544 + //this._generateBc(8, 1, 0);
  545 + //this._generateBc(10, 1, 0);
  546 + //this._generateBc(11, 1, 0);
  547 + //this._generateBc(12, 1, 0);
  548 + //this._generateBc(13, 1, 0);
  549 + //this._generateBc(14, 1, 0);
  550 + //this._generateBc(15, 1, 0);
  551 + //this._generateBc(16, 1, 0);
  552 + //this._generateBc(17, 1, 0);
  553 + //this._generateBc(18, 1, 0);
  554 + //
  555 + //this._generateBc(10, 1, 1);
  556 + //this._generateBc(11, 1, 1);
  557 + //this._generateBc(12, 1, 1);
  558 + //this._generateBc(13, 1, 1);
  559 + //this._generateBc(14, 1, 1);
  560 + //this._generateBc(15, 1, 1);
  561 + //this._generateBc(16, 1, 1);
  562 + //this._generateBc(17, 1, 1);
  563 + //this._generateBc(18, 1, 1);
  564 +
  565 + // 6:31 8:30
  566 + // 16:01 18:00
  567 +
  568 + // 测试找上界
  569 + console.log("上界:" + _findUpClosedBcIndexWithTime(_paramObj.getMPeakStartTimeObj(), false));
  570 + console.log("下界:" + _findDownClosedBcIndexWithTime(_paramObj.getMPeakEndTimeObj(), false));
  571 +
  572 + // TODO:
  573 +
  574 + // 测试时间判定
  575 + //console.log("班次出车时间:" + _internalLpArray[0].getQBcIndexWithFcTime(
  576 + // _paramObj.getMPeakStartTimeObj()
  577 + // ));
  578 +
  579 + //// 测试画中标线,第6个路牌的位置,下行中标
  580 + //_internalLpArray[7].initDataFromTimeToTime(
  581 + // _paramObj.getDownFirstDTimeObj(),
  582 + // _paramObj.getUpLastDtimeObj(),
  583 + // false,
  584 + // 0,
  585 + // _paramObj,
  586 + // _factory
  587 + //);
  588 +
  589 + // TODO:问题
  590 + // 1、中标线是直接赋值在具体位置的,没有修正班次时间
  591 + // 2、路牌间隔时间需要修正的
  592 +
  593 + },
  594 +
  595 + // TODO:
  596 +
  597 + /**
  598 + * 调整高峰班次,
  599 + * 初始化生成早高峰,晚高峰班次并不准确,因为根据高峰时间段,并不在一个完整圈内,应该是在两个或多个圈之间
  600 + * 当初始化定好布局后(上标线,中标线),然后确定每个路牌的班型(连班,分班,5休2分班)后
  601 + * 然后重新计算框在高峰时间段内的班次索引,不足的添加,之前多加的删除(只删除分班路牌上的)
  602 + * @param isZgf 是否早高峰
  603 + * @param isUp 是否上行
  604 + */
  605 + adjustGfbc : function(isZgf, isUp) {
  606 + var startTime; // 开始时间
  607 + var endTime; // 结束时间
  608 + var startBcIndex; // 开始班次索引
  609 + var endBcIndex; // 结束班次索引
  610 +
  611 + startTime = isZgf ? _paramObj.getMPeakStartTimeObj() : _paramObj.getEPeakStartTimeObj();
  612 + endTime = isZgf ? _paramObj.getMPeakEndTimeObj() : _paramObj.getEPeakEndTimeObj();
  613 +
  614 + startBcIndex = _findUpClosedBcIndexWithTime(startTime, isUp);
  615 + endBcIndex = _findDownClosedBcIndexWithTime(endTime, isUp);
  616 +
  617 + var _lpIndex;
  618 + var _qIndex;
  619 + var _bcIndex;
  620 + var _qInternelCount; // 高峰时间段中间包含的圈数
  621 + var i;
  622 + var j;
  623 +
  624 + var _lp;
  625 +
  626 + if (startBcIndex && endBcIndex) {
  627 + _lpIndex = startBcIndex[0];
  628 + _qIndex = startBcIndex[1];
  629 + _bcIndex = startBcIndex[2];
  630 +
  631 + // 处理头
  632 + // 删除头部多余班次
  633 + for (j = 0; j < _lpIndex; j++) {
  634 + _lp = _internalLpArray[j];
  635 + if (_lp.isBxFb() && _lp.getBc(_qIndex, _bcIndex)) {
  636 + _lp.removeBc(_qIndex, _bcIndex);
  637 + }
  638 + }
  639 +
  640 + for (j = _lpIndex; j < _internalLpArray.length; j++) {
  641 + _lp = _internalLpArray[j];
  642 + if (!_lp.getBc(_qIndex, _bcIndex)) {
  643 + _generateBcAndSetBc(j, _qIndex, _bcIndex);
  644 + }
  645 + }
  646 +
  647 + // 处理中间
  648 + _qInternelCount = endBcIndex[1] - startBcIndex[1] - 1;
  649 + for (i = 1; i <= _qInternelCount; i++) {
  650 + _lp = _internalLpArray[_qIndex + i];
  651 + if (!_lp.getBc(_qIndex + i, _bcIndex)) {
  652 + _generateBcAndSetBc(i, _qIndex + i, _bcIndex);
  653 + }
  654 + }
  655 +
  656 + // 处理尾部
  657 + _lpIndex = endBcIndex[0];
  658 + _qIndex = endBcIndex[1];
  659 + _bcIndex = endBcIndex[2];
  660 + for (j = 0; j < _lpIndex; j++) {
  661 + _lp = _internalLpArray[j];
  662 + if (!_lp.getBc(_qIndex, _bcIndex)) {
  663 + _generateBcAndSetBc(j, _qIndex, _bcIndex);
  664 + }
  665 + }
  666 + // 删除尾部多余的班次
  667 + for (j = _lpIndex; j < _internalLpArray.length; j++) {
  668 + _lp = _internalLpArray[j];
  669 + if (_lp.isBxFb() && _lp.getBc(_qIndex, _bcIndex)) {
  670 + _lp.removeBc(_qIndex, _bcIndex);
  671 + }
  672 + }
  673 + }
  674 +
  675 + },
  676 +
  677 + /**
  678 + * 补充做5休2的班型班次。
  679 + * 1、做5休2的路牌总工时不能超过7个小时
  680 + * 2、5休2的路牌全部从早晚高峰班次开始往前补充1个班次,组成早晚2圈
  681 + * 3、再根据余下工时及早晚高峰开始时间,确定向前或者向后加班次
  682 + */
  683 + calcuLpBx_5_2: function() {
  684 + // 1、先在早晚高峰班次前加1个班次压压惊
  685 + var i;
  686 + var _lp;
  687 + var _zgfbcpos; // 早高峰班次位置
  688 + var _wgfbcpos; // 晚高峰班次位置
  689 + var _qIndex;
  690 + var _bIndex;
  691 +
  692 + //for (i = 0; i < _internalLpArray.length; i++) {
  693 + // _lp = _internalLpArray[i];
  694 + // if (_lp.isBxFb5_2()) {
  695 + // _zgfbcpos = _lp.getMinBcObjPosition();
  696 + // _wgfbcpos = _lp.getMaxBcObjPosition();
  697 + //
  698 + // // TODO:测试向前添加一个班次
  699 + // _qIndex = _zgfbcpos[0];
  700 + // _bIndex = _zgfbcpos[1];
  701 + // _bIndex == 0 ?
  702 + // _generateBcAndSetBc(i, _qIndex - 1, 1) :
  703 + // _generateBcAndSetBc(i, _qIndex, 0);
  704 + //
  705 + // _qIndex = _wgfbcpos[0];
  706 + // _bIndex = _wgfbcpos[1];
  707 + // _bIndex == 0 ?
  708 + // _generateBcAndSetBc(i, _qIndex - 1, 1) :
  709 + // _generateBcAndSetBc(i, _qIndex, 0);
  710 + //
  711 + // }
  712 + //}
  713 +
  714 + // 2、
  715 + },
  716 +
  717 + /**
  718 + * 补充连班路牌班次。
  719 + * 1、上标线,中标线中间的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向上标线起始班次靠拢
  720 + * 2、中标线以下的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向中标线起始班次靠拢
  721 + */
  722 + calcuLpBx_lb: function() {
  723 + // 补充连班的班次,参照上标线,中标线补充不足的班次
  724 + var _zgffcsj; // 早高峰发车时间
  725 + var _etsj = // 结束时间
  726 + _paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj()) ?
  727 + _paramObj.getDownLastDTimeObj() :
  728 + _paramObj.getUpLastDtimeObj();
  729 +
  730 + var _lp;
  731 + var _minbcPos;
  732 + var _bcObj;
  733 + var i;
  734 + for (i = 0; i < _internalLpArray.length; i++) {
  735 + _lp = _internalLpArray[i];
  736 + if (_lp.isBxLb() && i != 0 && i != _zbx_lpIndex) {
  737 + _minbcPos = _lp.getMinBcObjPosition();
  738 + _bcObj = _lp.getBc(_minbcPos[0], _minbcPos[1]);
  739 + _zgffcsj = _bcObj.getFcTimeObj();
  740 + // 重新初始化连班班型班次
  741 + _lp.initDataFromTimeToTime(
  742 + _zgffcsj,
  743 + _etsj,
  744 + _bcObj.isUp(),
  745 + _minbcPos[0],
  746 + _paramObj,
  747 + _factory
  748 + );
  749 + }
  750 + }
  751 +
  752 + // 还要补充缺失的班次,差上标线几个班次要往前补上
  753 + var _bccount;
  754 + var j;
  755 + var _qIndex;
  756 + var _bIndex;
  757 + // 补上标线到中标线之间的连班路牌的班次
  758 + for (i = 0; i < _zbx_lpIndex; i++) {
  759 + _lp = _internalLpArray[i];
  760 + if (_lp.isBxLb() && i != 0 && i != _zbx_lpIndex) {
  761 + _minbcPos = _lp.getMinBcObjPosition();
  762 + _qIndex = _minbcPos[0];
  763 + _bIndex = _minbcPos[1];
  764 + _bccount = (_qIndex - 1) * 2 + _bIndex; // 距离上标线起始站点差几个班次
  765 + for (j = 0; j < _bccount; j++) {
  766 + if (_bIndex == 0) {
  767 + _qIndex --;
  768 + _bIndex = 1;
  769 + _generateBcAndSetBc(i, _qIndex, _bIndex);
  770 + } else if (_bIndex == 1) {
  771 + _bIndex --;
  772 + _generateBcAndSetBc(i, _qIndex, _bIndex);
  773 + }
  774 + }
  775 + }
  776 + }
  777 + // 补中标线以下的连班路牌的班次
  778 + for (i = _zbx_lpIndex; i < _internalLpArray.length; i++) {
  779 + _lp = _internalLpArray[i];
  780 + if (_lp.isBxLb() && i != 0 && i != _zbx_lpIndex) {
  781 + _minbcPos = _lp.getMinBcObjPosition();
  782 + _qIndex = _minbcPos[0];
  783 + _bIndex = _minbcPos[1];
  784 + _bccount = (_qIndex - 0) * 2 + _bIndex - 1; // 距离上标线起始站点差几个班次
  785 + for (j = 0; j < _bccount; j++) {
  786 + if (_bIndex == 0) {
  787 + _qIndex --;
  788 + _bIndex = 1;
  789 + _generateBcAndSetBc(i, _qIndex, _bIndex);
  790 + } else if (_bIndex == 1) {
  791 + _bIndex --;
  792 + _generateBcAndSetBc(i, _qIndex, _bIndex);
  793 + }
  794 + }
  795 + }
  796 + }
  797 +
  798 + },
  799 +
  800 + /**
  801 + * 计算每个路牌的班型及工时对应的圈数。
  802 + * 1、将连班,分班路牌分配到各个路牌上(分隔法),上标线,中标线上连班路牌
  803 + * 2、确定班型的工时,其中连班路牌的工时由上标线,中标线确定好了,5休2路牌工时也确定了,
  804 + * 其余分班路牌的工时由高峰低谷最大,最小发车间隔计算
  805 + */
  806 + calcuLpBx_fg: function() {
  807 + // 间隔法
  808 +
  809 + //--------------------------- 1、间隔法分隔连班路牌 ----------------------//
  810 +
  811 + // 除去上标线,中标线的连班路牌个数
  812 + var _lblbcount = _bx_lb_lpcount - 2;
  813 + // 计算由标线隔开的两个区域的路牌数比率
  814 + var _p1 = (_zbx_lpIndex + 1) / (_internalLpArray.length + 1);
  815 + var _p2 = (_internalLpArray.length - _zbx_lpIndex) / (_internalLpArray.length + 1);
  816 + var _p1_lpcount = _lblbcount * _p1;
  817 + var _p2_lpcount = _lblbcount * _p2;
  818 + if (parseInt(_p1_lpcount) != _p1_lpcount) { // 没有整除
  819 + _p1_lpcount = Math.floor(_p1_lpcount);
  820 + _p2_lpcount = Math.floor(_p2_lpcount) + 1;
  821 + }
  822 +
  823 + // 设定第一个区域的连班路牌
  824 + var i;
  825 + var _count = _p1_lpcount + 1;
  826 + var _c1 = Math.floor(_zbx_lpIndex / _count);
  827 + var _c2 = _zbx_lpIndex % _count;
  828 + var _c2_start_index;
  829 + for (i = 1; i <= _count - _c2; i++) {
  830 + _internalLpArray[(i - 1) * _c1].setBxLb(true);
  831 + _internalLpArray[(i - 1) * _c1].setBxDesc("连班");
  832 + _c2_start_index = (i - 1) * _c1;
  833 + }
  834 + for (i = 1; i <= _c2; i++) {
  835 + _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true);
  836 + _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxDesc("连班");
  837 + }
  838 +
  839 + // 设定第二个区域的连班路牌
  840 + _count = _p2_lpcount + 1;
  841 + _c1 = Math.floor((_internalLpArray.length - _zbx_lpIndex - 1) / _count);
  842 + _c2 = (_internalLpArray.length - _zbx_lpIndex - 1) % _count;
  843 + for (i = 1; i <= _count - _c2; i++) {
  844 + _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxLb(true);
  845 + _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb(false);
  846 + _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxFb5_2(false);
  847 + _internalLpArray[(i - 1) * _c1 + _zbx_lpIndex].setBxDesc("连班");
  848 + _c2_start_index = (i - 1) * _c1 + _zbx_lpIndex;
  849 + }
  850 + for (i = 1; i <= _c2; i++) {
  851 + _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxLb(true);
  852 + _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb(false);
  853 + _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxFb5_2(false);
  854 + _internalLpArray[_c2_start_index + i * (_c1 + 1)].setBxDesc("连班");
  855 + }
  856 +
  857 + //---------------------------- 2、分隔法,分隔分班路牌 -------------------------//
  858 +
  859 + // 设定分班路牌
  860 + var notlbIndexes = []; // 去除连班的路牌index列表
  861 + for (i = 0; i < _internalLpArray.length; i++) {
  862 + if (!_internalLpArray[i].isBxLb()) {
  863 + notlbIndexes.push(i);
  864 + }
  865 + }
  866 + // 获取离中标线最近的分班路牌索引
  867 + var _temp_fg_index;
  868 + for (i = 0; i < notlbIndexes.length; i++) {
  869 + if (notlbIndexes[i] == _zbx_lpIndex - 1) {
  870 + _temp_fg_index = i;
  871 + break;
  872 + }
  873 + }
  874 +
  875 + // 使用上面的分隔比率,分隔5休2班型
  876 + _p1_lpcount = _bx_5_2_fb_lpcount * _p1;
  877 + _p2_lpcount = _bx_5_2_fb_lpcount * _p2;
  878 + if (parseInt(_p1_lpcount) != _p1_lpcount) { // 没有整除
  879 + _p1_lpcount = Math.floor(_p1_lpcount);
  880 + _p2_lpcount = Math.floor(_p2_lpcount) + 1;
  881 + }
  882 + // 第一个区域
  883 + _count = _p1_lpcount;
  884 + _c1 = Math.floor(_temp_fg_index / _count);
  885 + _c2 = _temp_fg_index % _count;
  886 + for (i = 1; i <= _count - _c2; i++) {
  887 + _internalLpArray[notlbIndexes[(i - 1) * _c1]].setBxLb(false);
  888 + _internalLpArray[notlbIndexes[(i - 1) * _c1]].setBxFb(true);
  889 + _internalLpArray[notlbIndexes[(i - 1) * _c1]].setBxFb5_2(true);
  890 + _internalLpArray[notlbIndexes[(i - 1) * _c1]].setBxDesc("5休2分班");
  891 + _c2_start_index = (i - 1) * _c1;
  892 + }
  893 + for (i = 1; i <= _c2; i++) {
  894 + _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxLb(false);
  895 + _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxLb(true);
  896 + _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxFb5_2(true);
  897 + _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxDesc("5休2分班");
  898 + }
  899 + // 第二个区域
  900 + _count = _p2_lpcount;
  901 + _c1 = Math.floor((notlbIndexes.length - _temp_fg_index - 1) / _count);
  902 + _c2 = (notlbIndexes.length - _temp_fg_index - 1) % _count;
  903 + for (i = 1; i <= _count - _c2; i++) {
  904 + _internalLpArray[notlbIndexes[(i - 1) * _c1 + _temp_fg_index + 1]].setBxLb(false);
  905 + _internalLpArray[notlbIndexes[(i - 1) * _c1 + _temp_fg_index + 1]].setBxFb(true);
  906 + _internalLpArray[notlbIndexes[(i - 1) * _c1 + _temp_fg_index + 1]].setBxFb5_2(true);
  907 + _internalLpArray[notlbIndexes[(i - 1) * _c1 + _temp_fg_index + 1]].setBxDesc("5休2分班");
  908 + _c2_start_index = (i - 1) * _c1 + _temp_fg_index + 1;
  909 + }
  910 + for (i = 1; i <= _c2; i++) {
  911 + _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxLb(false);
  912 + _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxFb(true);
  913 + _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxFb5_2(true);
  914 + _internalLpArray[notlbIndexes[_c2_start_index + i * (_c1 + 1)]].setBxDesc("5休2分班");
  915 + }
  916 +
  917 + //-------------------------- 3、余下班次就是其他分班类型 ----------------------//
  918 +
  919 + for (i = 0; i < notlbIndexes.length; i++) {
  920 + if (!_internalLpArray[notlbIndexes[i]].isBxFb5_2()) {
  921 + _internalLpArray[notlbIndexes[i]].setBxLb(false);
  922 + _internalLpArray[notlbIndexes[i]].setBxFb(true);
  923 + _internalLpArray[notlbIndexes[i]].setBxFb5_2(false);
  924 + _internalLpArray[notlbIndexes[i]].setBxDesc("其他分班");
  925 + }
  926 + }
  927 +
  928 + // 测试打印
  929 + var lbIndexes = [];
  930 + for (i = 0; i < _internalLpArray.length; i++) {
  931 + if (_internalLpArray[i].isBxLb()) {
  932 + lbIndexes.push(i);
  933 + }
  934 + }
  935 + console.log("连班路牌indexes=" + lbIndexes);
  936 +
  937 + var _other_fbIndexes = [];
  938 + for (i = 0; i < _internalLpArray.length; i++) {
  939 + if (_internalLpArray[i].isBxFb() && !_internalLpArray[i].isBxFb5_2()) {
  940 + _other_fbIndexes.push(i);
  941 + }
  942 + }
  943 + console.log("其他分班路牌indexes=" + _other_fbIndexes);
  944 +
  945 + var _5_2_fbIndexes = [];
  946 + for (i = 0; i < _internalLpArray.length; i++) {
  947 + if (_internalLpArray[i].isBxFb() && _internalLpArray[i].isBxFb5_2()) {
  948 + _5_2_fbIndexes.push(i);
  949 + }
  950 + }
  951 + console.log("5休2分班路牌indexes=" + _5_2_fbIndexes);
  952 + },
  953 +
  954 + //------------- 其他方法 -------------//
  955 + /**
  956 + * 内部数据转化成显示用的班次数组。
  957 + */
  958 + toGanttBcArray: function() {
  959 + var bcData = [];
  960 + var lpObj;
  961 + for (i = 0; i < _internalLpArray.length; i++) {
  962 + lpObj = _internalLpArray[i];
  963 + bcData = bcData.concat(lpObj.getBcArray());
  964 + }
  965 +
  966 + var ganttBcData = [];
  967 + for (i = 0; i < bcData.length; i++) {
  968 + ganttBcData.push(bcData[i].toGanttBcObj());
  969 + }
  970 +
  971 + return ganttBcData;
  972 + }
  973 +
  974 + // TODO:
  975 + };
976 }; 976 };
977 \ No newline at end of file 977 \ No newline at end of file
src/main/resources/static/pages/base/timesmodel/js/v2/main_v2.js
1 -/**  
2 - * 主类。  
3 - */  
4 -var Main_v2 = function() {  
5 - // 内部工厂类  
6 - var _factoryFun = function() {  
7 - return {  
8 - // 创建参数  
9 - createParameterObj: function(formMap, dataMap) {  
10 - var paramObj = ParameterObj();  
11 - paramObj.wrap(formMap, dataMap);  
12 - return paramObj;  
13 - },  
14 - // 创建班次对象  
15 - createBcObj: function(lpObj, bcType, isUp, fcno, fcTimeObj, paramObj) {  
16 - var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType);  
17 - var _bcsj = paramObj.calcuTravelTime(fcTimeObj, isUp);  
18 - var _arrsj = paramObj.addMinute(fcTimeObj, _bcsj);  
19 - var _stoptime = paramObj.calcuFixedStopNumber(_arrsj, !isUp);  
20 - var _tccid = paramObj.getTTinfoId();  
21 - var _ttinfoid = paramObj.getTTinfoId();  
22 - var _xl = paramObj.getXlId();  
23 - var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;  
24 - var _zdz = isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;  
25 -  
26 - var bcParamObj = {};  
27 - bcParamObj.bcType = bcType; // 班次类型(normal,in,out等)  
28 - bcParamObj.isUp = isUp; // boolean是否上下行  
29 - bcParamObj.fcno = fcno; // 发车顺序号  
30 - bcParamObj.fcTimeObj = fcTimeObj; // 发车时间对象  
31 - bcParamObj.bclc = _bclc; // 班次里程  
32 - bcParamObj.bcsj = _bcsj; // 班次历时  
33 - bcParamObj.arrtime = _arrsj; // 到达时间对象  
34 - bcParamObj.stoptime = _stoptime; // 停站时间  
35 - bcParamObj.tccid = _tccid; // 停车场id  
36 - bcParamObj.ttinfoid = _ttinfoid; // 时刻表id  
37 - bcParamObj.xl = _xl; // 线路id  
38 - bcParamObj.qdzid = _qdz; // 起点站id  
39 - bcParamObj.zdzid = _zdz; // 终点站id  
40 -  
41 - return new InternalBcObj(lpObj, bcParamObj);  
42 - }  
43 - };  
44 - };  
45 - var _factory = _factoryFun();  
46 -  
47 - // 所有的时间使用moment.js计算  
48 -  
49 - var _paramObj; // 参数对象  
50 -  
51 - var _bxDesc = [ // 班型描述  
52 - {'type':'六工一休','hoursV':6.66, 'minueV':'6:40', 'qcount': 0, 'avertime': 0},  
53 - {'type':'五工一休','hoursV':6.85, 'minueV':'6:51', 'qcount': 0, 'avertime': 0},  
54 - {'type':'四工一休','hoursV':7.14, 'minueV':'7:08', 'qcount': 0, 'avertime': 0},  
55 - {'type':'三工一休','hoursV':7.61, 'minueV':'7:37', 'qcount': 0, 'avertime': 0},  
56 - {'type':'二工一休','hoursV':8.57, 'minueV':'8:34', 'qcount': 0, 'avertime': 0},  
57 - {'type':'一工一休','hoursV':11.42, 'minueV':'11:25', 'qcount': 0, 'avertime': 0},  
58 - {'type':'五工二休','hoursV':7.99, 'minueV':'8:00', 'qcount': 0, 'avertime': 0},  
59 - {'type':'无工休', 'hoursV':5.43, 'minueV':'5:43', 'qcount': 0, 'avertime': 0}  
60 - ];  
61 -  
62 - return {  
63 - /**  
64 - * 工厂对象,创建不同的对象。  
65 - * @returns {{createParameterObj, createBcObj}}  
66 - */  
67 - getFactory: function() {  
68 - return _factory;  
69 - },  
70 -  
71 - /**  
72 - * 使用发车间隔策略生成时刻表。  
73 - * @param paramObj 参数对象  
74 - * @param lpArray 路牌数组  
75 - * @constructor  
76 - */  
77 - BXPplaceClassesTime03 : function(paramObj, lpArray) {  
78 - // 参数对象  
79 - _paramObj = paramObj;  
80 -  
81 - // 1、初始化行车计划  
82 - var schedule = new InternalScheduleObj(_paramObj, lpArray, _factory);  
83 - schedule.initDataWithBxLayout();  
84 - // 2、计算每个路牌的班型及对应工时  
85 - schedule.calcuLpBx_fg();  
86 - // 3、将连班路牌的班次补足  
87 - schedule.calcuLpBx_lb();  
88 -  
89 - // 4、修正针对初始化时生成的高峰班次,之前不足的补上,多余的删除  
90 - schedule.adjustGfbc(true, true); // 修正上行早高峰  
91 - schedule.adjustGfbc(true, false); // 修正下行早高峰  
92 - schedule.adjustGfbc(false, true); // 修正上行晚高峰  
93 - schedule.adjustGfbc(false, false); // 修正下行晚高峰  
94 -  
95 - // 5、TODO:根据班型补充所有的不足班次  
96 - schedule.calcuLpBx_5_2();  
97 -  
98 - // TODO:6、确定末班车  
99 -  
100 - // TODO:8、修正不准确的停站时间,微调发车间隔  
101 -  
102 - // TODO:9、补进出场报道班次  
103 -  
104 -  
105 - //-------------------- 输出ganut图上的班次,班型描述 ----------------------//  
106 - var gBcData = schedule.toGanttBcArray();  
107 - // TODO:班型再议  
108 - return {'json':gBcData,'bxrcgs':null};  
109 -  
110 - }  
111 -  
112 - };  
113 - 1 +/**
  2 + * 主类。
  3 + */
  4 +var Main_v2 = function() {
  5 + // 内部工厂类
  6 + var _factoryFun = function() {
  7 + return {
  8 + // 创建参数
  9 + createParameterObj: function(formMap, dataMap) {
  10 + var paramObj = ParameterObj();
  11 + paramObj.wrap(formMap, dataMap);
  12 + return paramObj;
  13 + },
  14 + // 创建班次对象
  15 + createBcObj: function(lpObj, bcType, isUp, fcno, fcTimeObj, paramObj) {
  16 + var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType);
  17 + var _bcsj = paramObj.calcuTravelTime(fcTimeObj, isUp);
  18 + var _arrsj = paramObj.addMinute(fcTimeObj, _bcsj);
  19 + var _stoptime = paramObj.calcuFixedStopNumber(_arrsj, !isUp);
  20 + var _tccid = paramObj.getTTinfoId();
  21 + var _ttinfoid = paramObj.getTTinfoId();
  22 + var _xl = paramObj.getXlId();
  23 + var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;
  24 + var _zdz = isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;
  25 +
  26 + var bcParamObj = {};
  27 + bcParamObj.bcType = bcType; // 班次类型(normal,in,out等)
  28 + bcParamObj.isUp = isUp; // boolean是否上下行
  29 + bcParamObj.fcno = fcno; // 发车顺序号
  30 + bcParamObj.fcTimeObj = fcTimeObj; // 发车时间对象
  31 + bcParamObj.bclc = _bclc; // 班次里程
  32 + bcParamObj.bcsj = _bcsj; // 班次历时
  33 + bcParamObj.arrtime = _arrsj; // 到达时间对象
  34 + bcParamObj.stoptime = _stoptime; // 停站时间
  35 + bcParamObj.tccid = _tccid; // 停车场id
  36 + bcParamObj.ttinfoid = _ttinfoid; // 时刻表id
  37 + bcParamObj.xl = _xl; // 线路id
  38 + bcParamObj.qdzid = _qdz; // 起点站id
  39 + bcParamObj.zdzid = _zdz; // 终点站id
  40 +
  41 + return new InternalBcObj(lpObj, bcParamObj);
  42 + }
  43 + };
  44 + };
  45 + var _factory = _factoryFun();
  46 +
  47 + // 所有的时间使用moment.js计算
  48 +
  49 + var _paramObj; // 参数对象
  50 +
  51 + var _bxDesc = [ // 班型描述
  52 + {'type':'六工一休','hoursV':6.66, 'minueV':'6:40', 'qcount': 0, 'avertime': 0},
  53 + {'type':'五工一休','hoursV':6.85, 'minueV':'6:51', 'qcount': 0, 'avertime': 0},
  54 + {'type':'四工一休','hoursV':7.14, 'minueV':'7:08', 'qcount': 0, 'avertime': 0},
  55 + {'type':'三工一休','hoursV':7.61, 'minueV':'7:37', 'qcount': 0, 'avertime': 0},
  56 + {'type':'二工一休','hoursV':8.57, 'minueV':'8:34', 'qcount': 0, 'avertime': 0},
  57 + {'type':'一工一休','hoursV':11.42, 'minueV':'11:25', 'qcount': 0, 'avertime': 0},
  58 + {'type':'五工二休','hoursV':7.99, 'minueV':'8:00', 'qcount': 0, 'avertime': 0},
  59 + {'type':'无工休', 'hoursV':5.43, 'minueV':'5:43', 'qcount': 0, 'avertime': 0}
  60 + ];
  61 +
  62 + return {
  63 + /**
  64 + * 工厂对象,创建不同的对象。
  65 + * @returns {{createParameterObj, createBcObj}}
  66 + */
  67 + getFactory: function() {
  68 + return _factory;
  69 + },
  70 +
  71 + /**
  72 + * 使用发车间隔策略生成时刻表。
  73 + * @param paramObj 参数对象
  74 + * @param lpArray 路牌数组
  75 + * @constructor
  76 + */
  77 + BXPplaceClassesTime03 : function(paramObj, lpArray) {
  78 + // 参数对象
  79 + _paramObj = paramObj;
  80 +
  81 + // 1、初始化行车计划
  82 + var schedule = new InternalScheduleObj(_paramObj, lpArray, _factory);
  83 + schedule.initDataWithBxLayout();
  84 + // 2、计算每个路牌的班型及对应工时
  85 + schedule.calcuLpBx_fg();
  86 + // 3、将连班路牌的班次补足
  87 + schedule.calcuLpBx_lb();
  88 +
  89 + // 4、修正针对初始化时生成的高峰班次,之前不足的补上,多余的删除
  90 + schedule.adjustGfbc(true, true); // 修正上行早高峰
  91 + schedule.adjustGfbc(true, false); // 修正下行早高峰
  92 + schedule.adjustGfbc(false, true); // 修正上行晚高峰
  93 + schedule.adjustGfbc(false, false); // 修正下行晚高峰
  94 +
  95 + // 5、TODO:根据班型补充所有的不足班次
  96 + schedule.calcuLpBx_5_2();
  97 +
  98 + // TODO:6、确定末班车
  99 +
  100 + // TODO:8、修正不准确的停站时间,微调发车间隔
  101 +
  102 + // TODO:9、补进出场报道班次
  103 +
  104 +
  105 + //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
  106 + var gBcData = schedule.toGanttBcArray();
  107 + // TODO:班型再议
  108 + return {'json':gBcData,'bxrcgs':null};
  109 +
  110 + }
  111 +
  112 + };
  113 +
114 }(); 114 }();
115 \ No newline at end of file 115 \ No newline at end of file
src/main/resources/static/pages/forms/statement/busInterval.html
@@ -308,7 +308,7 @@ @@ -308,7 +308,7 @@
308 // $(".hidden").removeClass("hidden"); 308 // $(".hidden").removeClass("hidden");
309 $get('/busInterval/interval', params, function(result){ 309 $get('/busInterval/interval', params, function(result){
310 // 把数据填充到模版中 310 // 把数据填充到模版中
311 - var tbodyHtml = template('list_workDaily',{list:result,statu:statu}); 311 + var tbodyHtml = template('list_busInteval',{list:result,statu:statu});
312 // 把渲染好的模版html文本追加到表格中 312 // 把渲染好的模版html文本追加到表格中
313 $('#forms').html(tbodyHtml); 313 $('#forms').html(tbodyHtml);
314 _w_table_rowspan("#forms tbody", 1); 314 _w_table_rowspan("#forms tbody", 1);
@@ -440,7 +440,7 @@ @@ -440,7 +440,7 @@
440 }); 440 });
441 441
442 </script> 442 </script>
443 -<script type="text/html" id="list_workDaily"> 443 +<script type="text/html" id="list_busInteval">
444 <thead> 444 <thead>
445 <tr> 445 <tr>
446 <th>日期</th> 446 <th>日期</th>
src/main/resources/static/pages/forms/statement/scheduleAnaly_sum.html
@@ -257,7 +257,7 @@ @@ -257,7 +257,7 @@
257 $(".hidden").removeClass("hidden"); 257 $(".hidden").removeClass("hidden");
258 $get('/pcpc/scheduleAnaly_sum', params, function(result){ 258 $get('/pcpc/scheduleAnaly_sum', params, function(result){
259 // 把数据填充到模版中 259 // 把数据填充到模版中
260 - var tbodyHtml = template('list_scheduleAnaly',{list:result.dataList, companyName:companyName, subCompanyName:subCompanyName}); 260 + var tbodyHtml = template('list_scheduleAnaly_sum',{list:result.dataList, companyName:companyName, subCompanyName:subCompanyName});
261 // 把渲染好的模版html文本追加到表格中 261 // 把渲染好的模版html文本追加到表格中
262 $('#forms tbody').html(tbodyHtml); 262 $('#forms tbody').html(tbodyHtml);
263 263
@@ -384,7 +384,7 @@ @@ -384,7 +384,7 @@
384 }); 384 });
385 385
386 </script> 386 </script>
387 -<script type="text/html" id="list_scheduleAnaly"> 387 +<script type="text/html" id="list_scheduleAnaly_sum">
388 {{each list as obj i}} 388 {{each list as obj i}}
389 <tr> 389 <tr>
390 <th style="display: none;"></th> 390 <th style="display: none;"></th>