Commit d1c098ed77c313823076292767df1be2a8260d60

Authored by 廖磊
2 parents e843e7fc abd9f44a

Merge branch 'minhang' of

http://222.66.0.204:8090/panzhaov5/bsth_control into minhang
Showing 31 changed files with 1420 additions and 394 deletions
src/main/java/com/bsth/controller/realcontrol/ScheduleRealInfoController.java
@@ -186,16 +186,6 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, @@ -186,16 +186,6 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo,
186 186
187 /** 187 /**
188 * 188 *
189 - * @Title: trustStatus @Description: TODO(线路托管状态) @param @param lineCodes  
190 - * 线路编码 @throws  
191 - */  
192 - @RequestMapping(value = "/trustStatus")  
193 - public Map<Integer, Integer> trustStatus(@RequestParam String lineCodes) {  
194 - return scheduleRealInfoService.trustStatus(lineCodes);  
195 - }  
196 -  
197 - /**  
198 - *  
199 * @Title: outgoAdjustAll 189 * @Title: outgoAdjustAll
200 * @Description: TODO(批量待发调整) 190 * @Description: TODO(批量待发调整)
201 * @param @param list 191 * @param @param list
@@ -207,17 +197,6 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo, @@ -207,17 +197,6 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
207 params = StringEscapeUtils.unescapeHtml4(params); 197 params = StringEscapeUtils.unescapeHtml4(params);
208 return scheduleRealInfoService.outgoAdjustAll(params); 198 return scheduleRealInfoService.outgoAdjustAll(params);
209 } 199 }
210 -  
211 - /**  
212 - *  
213 - * @Title: changeTrustStatus @Description: TODO(切换线路托管状态) @param @param  
214 - * lineCode 线路编码 @param @param status 托管状态 @throws  
215 - */  
216 - @RequestMapping(value = "/trustStatus/change", method = RequestMethod.POST)  
217 - public int changeTrustStatus(@RequestParam Integer lineCode, @RequestParam Integer status) {  
218 - //ScheduleBuffer.trustMap.put(lineCode, status);  
219 - return 200;  
220 - }  
221 200
222 /** 201 /**
223 * 202 *
@@ -243,12 +222,6 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo, @@ -243,12 +222,6 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
243 return scheduleRealInfoService.findRouteByLine(lineCode); 222 return scheduleRealInfoService.findRouteByLine(lineCode);
244 } 223 }
245 224
246 - @RequestMapping(value = "/test/getSch")  
247 - public int getSch(){  
248 - //getSchedulePlanThread.start();  
249 - return 1;  
250 - }  
251 -  
252 /** 225 /**
253 * 226 *
254 * @Title: removeChildTask 227 * @Title: removeChildTask
@@ -269,7 +242,6 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo, @@ -269,7 +242,6 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
269 */ 242 */
270 @RequestMapping(value = "/lineCode/{lineCode}") 243 @RequestMapping(value = "/lineCode/{lineCode}")
271 public List<ScheduleRealInfo> findByLineCode(@PathVariable("lineCode") String lineCode){ 244 public List<ScheduleRealInfo> findByLineCode(@PathVariable("lineCode") String lineCode){
272 - //return ScheduleBuffer.realSchedulListMap.get(lineCode);  
273 return dayOfSchedule.findByLineCode(lineCode); 245 return dayOfSchedule.findByLineCode(lineCode);
274 } 246 }
275 247
@@ -447,10 +419,10 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo, @@ -447,10 +419,10 @@ public class ScheduleRealInfoController extends BaseController&lt;ScheduleRealInfo,
447 return scheduleRealInfoService.changeBcType(id, bcType, remarks); 419 return scheduleRealInfoService.changeBcType(id, bcType, remarks);
448 } 420 }
449 421
450 - @RequestMapping(value="/history", method=RequestMethod.POST) 422 +/* @RequestMapping(value="/history", method=RequestMethod.POST)
451 public Map<String,Object> historySave(ScheduleRealInfo sch){ 423 public Map<String,Object> historySave(ScheduleRealInfo sch){
452 return scheduleRealInfoService.historySave(sch); 424 return scheduleRealInfoService.historySave(sch);
453 - } 425 + }*/
454 426
455 427
456 private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd"); 428 private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd");
src/main/java/com/bsth/data/gpsdata/arrival/SignalHandle.java
@@ -85,7 +85,7 @@ public abstract class SignalHandle { @@ -85,7 +85,7 @@ public abstract class SignalHandle {
85 gps.setStopNo(station.getCode()); 85 gps.setStopNo(station.getCode());
86 } 86 }
87 87
88 - logger.info(fmtHHmm.print(gps.getTimestamp()) + " 车辆 :" + gps.getNbbm() + " 切换到走向 : " + updown); 88 + logger.info(gps.getTimestamp() + " -" + fmtHHmm.print(gps.getTimestamp()) + " 车辆 :" + gps.getNbbm() + " 切换到走向 : " + updown);
89 } 89 }
90 90
91 /** 91 /**
src/main/java/com/bsth/data/gpsdata/arrival/handlers/CorrectSignalHandle.java
@@ -48,12 +48,6 @@ public class CorrectSignalHandle extends SignalHandle { @@ -48,12 +48,6 @@ public class CorrectSignalHandle extends SignalHandle {
48 gps.setState(0); 48 gps.setState(0);
49 } 49 }
50 50
51 - /*if(gps.getState() != 0){  
52 - logger.info(gps.getNbbm() + " 纠正状态到营运");  
53 - //切换到营运状态  
54 - directiveService.send60Operation(sch.getClZbh(), 0, Integer.parseInt(sch.getXlDir()), null, "纠正@系统");  
55 - }*/  
56 -  
57 return true; 51 return true;
58 } 52 }
59 } 53 }
src/main/java/com/bsth/data/gpsdata/arrival/handlers/InOutStationSignalHandle.java
@@ -257,13 +257,19 @@ public class InOutStationSignalHandle extends SignalHandle{ @@ -257,13 +257,19 @@ public class InOutStationSignalHandle extends SignalHandle{
257 dayOfSchedule.save(sch); 257 dayOfSchedule.save(sch);
258 258
259 if(next != null){ 259 if(next != null){
260 - next.setQdzArrDatesj(sch.getZdsjActual());  
261 dayOfSchedule.addExecPlan(next); 260 dayOfSchedule.addExecPlan(next);
262 //进站既进场 261 //进站既进场
263 inStationAndInPark(sch, next); 262 inStationAndInPark(sch, next);
264 } 263 }
  264 +
  265 + //该路牌的下一个班次,起点实际到达时间
  266 + ScheduleRealInfo lpNext = dayOfSchedule.nextByLp(sch);
  267 + if(lpNext != null){
  268 + lpNext.setQdzArrDatesj(sch.getZdsjActual());
  269 + }
  270 +
265 //通知客户端 271 //通知客户端
266 - sendUtils.sendZdsj(sch, next, doneSum); 272 + sendUtils.sendZdsj(sch, lpNext, doneSum);
267 273
268 //准备执行下一个班次 274 //准备执行下一个班次
269 if (next != null) { 275 if (next != null) {
src/main/java/com/bsth/data/gpsdata/recovery/GpsDataRecovery.java
@@ -60,7 +60,7 @@ public class GpsDataRecovery implements ApplicationContextAware { @@ -60,7 +60,7 @@ public class GpsDataRecovery implements ApplicationContextAware {
60 for (String nbbm : keys) { 60 for (String nbbm : keys) {
61 Collections.sort(listMap.get(nbbm), comp); 61 Collections.sort(listMap.get(nbbm), comp);
62 threadPool.execute(new RecoveryThread(listMap.get(nbbm), count)); 62 threadPool.execute(new RecoveryThread(listMap.get(nbbm), count));
63 - /*if(nbbm.equals("W9G-013")) 63 + /*if(nbbm.equals("W7C-001"))
64 new RecoveryThread(listMap.get(nbbm), count).run();*/ 64 new RecoveryThread(listMap.get(nbbm), count).run();*/
65 } 65 }
66 66
@@ -150,8 +150,6 @@ public class GpsDataRecovery implements ApplicationContextAware { @@ -150,8 +150,6 @@ public class GpsDataRecovery implements ApplicationContextAware {
150 CircleQueue<GpsEntity> prevs; 150 CircleQueue<GpsEntity> prevs;
151 boolean task; 151 boolean task;
152 for (GpsEntity gps : list) { 152 for (GpsEntity gps : list) {
153 - /*if(gps.getTimestamp() > 1491951840000L)  
154 - System.out.print("");*/  
155 153
156 //是否有任务 154 //是否有任务
157 155
src/main/java/com/bsth/data/safe_driv/SafeDrivDataLoadThread.java
@@ -88,7 +88,7 @@ public class SafeDrivDataLoadThread extends Thread{ @@ -88,7 +88,7 @@ public class SafeDrivDataLoadThread extends Thread{
88 httpClient.close(); 88 httpClient.close();
89 response.close(); 89 response.close();
90 } catch (Exception e) { 90 } catch (Exception e) {
91 - logger.error("", e); 91 + logger.error(e.getMessage());
92 } 92 }
93 } 93 }
94 } 94 }
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
@@ -23,7 +23,9 @@ import com.bsth.service.schedule.SchedulePlanInfoService; @@ -23,7 +23,9 @@ import com.bsth.service.schedule.SchedulePlanInfoService;
23 import com.bsth.util.BatchSaveUtils; 23 import com.bsth.util.BatchSaveUtils;
24 import com.bsth.util.DateUtils; 24 import com.bsth.util.DateUtils;
25 import com.bsth.websocket.handler.SendUtils; 25 import com.bsth.websocket.handler.SendUtils;
  26 +import com.google.common.base.Predicate;
26 import com.google.common.collect.ArrayListMultimap; 27 import com.google.common.collect.ArrayListMultimap;
  28 +import com.google.common.collect.Collections2;
27 import org.apache.commons.lang3.StringUtils; 29 import org.apache.commons.lang3.StringUtils;
28 import org.joda.time.format.DateTimeFormat; 30 import org.joda.time.format.DateTimeFormat;
29 import org.joda.time.format.DateTimeFormatter; 31 import org.joda.time.format.DateTimeFormatter;
@@ -59,16 +61,16 @@ public class DayOfSchedule implements CommandLineRunner { @@ -59,16 +61,16 @@ public class DayOfSchedule implements CommandLineRunner {
59 // 按车辆分组的班次数据 61 // 按车辆分组的班次数据
60 private static ArrayListMultimap<String, ScheduleRealInfo> nbbmScheduleMap; 62 private static ArrayListMultimap<String, ScheduleRealInfo> nbbmScheduleMap;
61 63
  64 + //按路牌分组的班次数据 线路编码_路牌名称 ——> 班次list
  65 + private static ArrayListMultimap<String, ScheduleRealInfo> lpScheduleMap;
  66 +
62 // 班次主键映射 67 // 班次主键映射
63 private static Map<Long, ScheduleRealInfo> id2SchedulMap; 68 private static Map<Long, ScheduleRealInfo> id2SchedulMap;
64 69
65 - // 车辆和排班起终点站对照(包括进出的停车场,区间起终点)  
66 - //private static TreeMultimap<String, String> nbbm2SEStationMap;  
67 -  
68 //车辆 ——> 当前执行班次 70 //车辆 ——> 当前执行班次
69 private static Map<String, ScheduleRealInfo> carExecutePlanMap; 71 private static Map<String, ScheduleRealInfo> carExecutePlanMap;
70 72
71 - // 持久化缓冲区 73 + // 持久化
72 public static LinkedList<ScheduleRealInfo> pstBuffer; 74 public static LinkedList<ScheduleRealInfo> pstBuffer;
73 75
74 // 排序器 76 // 排序器
@@ -102,11 +104,12 @@ public class DayOfSchedule implements CommandLineRunner { @@ -102,11 +104,12 @@ public class DayOfSchedule implements CommandLineRunner {
102 104
103 static { 105 static {
104 nbbmScheduleMap = ArrayListMultimap.create(); 106 nbbmScheduleMap = ArrayListMultimap.create();
  107 + lpScheduleMap = ArrayListMultimap.create();
  108 +
105 id2SchedulMap = new HashMap<>(); 109 id2SchedulMap = new HashMap<>();
106 pstBuffer = new LinkedList<>(); 110 pstBuffer = new LinkedList<>();
107 schFCSJComparator = new ScheduleComparator.FCSJ(); 111 schFCSJComparator = new ScheduleComparator.FCSJ();
108 currSchDateMap = new HashMap<>(); 112 currSchDateMap = new HashMap<>();
109 - //nbbm2SEStationMap = TreeMultimap.create();  
110 carExecutePlanMap = new HashMap<>(); 113 carExecutePlanMap = new HashMap<>();
111 114
112 schedulePlanMap = new HashMap<>(); 115 schedulePlanMap = new HashMap<>();
@@ -233,10 +236,14 @@ public class DayOfSchedule implements CommandLineRunner { @@ -233,10 +236,14 @@ public class DayOfSchedule implements CommandLineRunner {
233 //添加到缓存 236 //添加到缓存
234 putAll(list); 237 putAll(list);
235 238
  239 +
  240 + Set<String> lps = searchAllLP(list);
  241 + for(String lp : lps){
  242 + //计算“起点站应到”时间
  243 + schAttrCalculator.calcQdzTimePlan(lpScheduleMap.get(lineCode + "_" + lp));
  244 + }
236 Set<String> cars = searchAllCars(list); 245 Set<String> cars = searchAllCars(list);
237 for (String nbbm : cars) { 246 for (String nbbm : cars) {
238 - //计算“起点站应到”时间  
239 - schAttrCalculator.calcQdzTimePlan(nbbmScheduleMap.get(nbbm));  
240 //车辆 ——> 要执行的班次对照 247 //车辆 ——> 要执行的班次对照
241 reCalcExecPlan(nbbm); 248 reCalcExecPlan(nbbm);
242 } 249 }
@@ -258,7 +265,7 @@ public class DayOfSchedule implements CommandLineRunner { @@ -258,7 +265,7 @@ public class DayOfSchedule implements CommandLineRunner {
258 /** 265 /**
259 * @Title: searchAllCars 266 * @Title: searchAllCars
260 * @Description: TODO(搜索班次集合中的车辆) 267 * @Description: TODO(搜索班次集合中的车辆)
261 - */ 268 + */
262 private Set<String> searchAllCars(List<ScheduleRealInfo> list) { 269 private Set<String> searchAllCars(List<ScheduleRealInfo> list) {
263 Set<String> cars = new HashSet<>(); 270 Set<String> cars = new HashSet<>();
264 for (ScheduleRealInfo sch : list) 271 for (ScheduleRealInfo sch : list)
@@ -267,6 +274,18 @@ public class DayOfSchedule implements CommandLineRunner { @@ -267,6 +274,18 @@ public class DayOfSchedule implements CommandLineRunner {
267 return cars; 274 return cars;
268 } 275 }
269 276
  277 + /**
  278 + * @Title: searchAllCars
  279 + * @Description: TODO(搜索班次集合中的路牌)
  280 + */
  281 + private Set<String> searchAllLP(List<ScheduleRealInfo> list) {
  282 + Set<String> lps = new HashSet<>();
  283 + for (ScheduleRealInfo sch : list)
  284 + lps.add(sch.getLpName());
  285 +
  286 + return lps;
  287 + }
  288 +
270 private void putAll(List<ScheduleRealInfo> list) { 289 private void putAll(List<ScheduleRealInfo> list) {
271 for (ScheduleRealInfo sch : list) 290 for (ScheduleRealInfo sch : list)
272 put(sch); 291 put(sch);
@@ -312,6 +331,17 @@ public class DayOfSchedule implements CommandLineRunner { @@ -312,6 +331,17 @@ public class DayOfSchedule implements CommandLineRunner {
312 } 331 }
313 } 332 }
314 333
  334 + //清理路牌对照
  335 + List<String> lprms = new ArrayList<>();
  336 + Set<String> lps = lpScheduleMap.keySet();
  337 + for(String lp : lps){
  338 + if(lp.indexOf(lineCode + "_") != -1)
  339 + lprms.add(lp);
  340 + }
  341 +
  342 + for(String lp : lprms)
  343 + lpScheduleMap.removeAll(lp);
  344 +
315 logger.info(lineCode + "排班清理 " + count); 345 logger.info(lineCode + "排班清理 " + count);
316 } 346 }
317 347
@@ -496,18 +526,31 @@ public class DayOfSchedule implements CommandLineRunner { @@ -496,18 +526,31 @@ public class DayOfSchedule implements CommandLineRunner {
496 return id2SchedulMap.get(id); 526 return id2SchedulMap.get(id);
497 } 527 }
498 528
499 - /* public Set<String> getSEStationList(String nbbm) {  
500 - return nbbm2SEStationMap.get(nbbm);  
501 - }*/  
502 529
503 /** 530 /**
504 * @Title: next 531 * @Title: next
505 * @Description: TODO(下一个班次) 532 * @Description: TODO(下一个班次)
506 */ 533 */
507 public ScheduleRealInfo next(ScheduleRealInfo sch) { 534 public ScheduleRealInfo next(ScheduleRealInfo sch) {
  535 + List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh());
  536 + return next(list, sch);
  537 + }
508 538
  539 + /**
  540 + * 下一个相同走向的班次
  541 + * @param sch
  542 + * @return
  543 + */
  544 + public ScheduleRealInfo nextSame(final ScheduleRealInfo sch){
509 List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); 545 List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh());
510 - int outConfig = -1; 546 + Collection<ScheduleRealInfo> subList = Collections2.filter(list, new Predicate<ScheduleRealInfo>(){
  547 +
  548 + @Override
  549 + public boolean apply(ScheduleRealInfo item) {
  550 + return item.getXlDir().equals(sch.getXlDir());
  551 + }
  552 + });
  553 + /*int outConfig = -1;
511 LineConfig config = lineConfigData.get(sch.getXlBm()); 554 LineConfig config = lineConfigData.get(sch.getXlBm());
512 if (config != null) 555 if (config != null)
513 outConfig = config.getOutConfig(); 556 outConfig = config.getOutConfig();
@@ -531,21 +574,22 @@ public class DayOfSchedule implements CommandLineRunner { @@ -531,21 +574,22 @@ public class DayOfSchedule implements CommandLineRunner {
531 && (!limitPark || park.equals(temp.getQdzCode()))) 574 && (!limitPark || park.equals(temp.getQdzCode())))
532 continue; 575 continue;
533 576
534 - if (flag) { 577 + if (flag && temp.getXlDir().equals(sch.getXlDir())) {
535 next = temp; 578 next = temp;
536 break; 579 break;
537 } 580 }
538 - }  
539 - return next; 581 + }*/
  582 + return next(subList, sch);
540 } 583 }
541 584
  585 +
542 /** 586 /**
543 - * 下一个相同走向的班次  
544 - * @param sch 587 + * 下一个班次
  588 + * @param list 班次集合
  589 + * @param sch 当前班次
545 * @return 590 * @return
546 */ 591 */
547 - public ScheduleRealInfo nextSame(ScheduleRealInfo sch){  
548 - List<ScheduleRealInfo> list = nbbmScheduleMap.get(sch.getClZbh()); 592 + private ScheduleRealInfo next(Collection<ScheduleRealInfo> list , ScheduleRealInfo sch){
549 int outConfig = -1; 593 int outConfig = -1;
550 LineConfig config = lineConfigData.get(sch.getXlBm()); 594 LineConfig config = lineConfigData.get(sch.getXlBm());
551 if (config != null) 595 if (config != null)
@@ -570,7 +614,7 @@ public class DayOfSchedule implements CommandLineRunner { @@ -570,7 +614,7 @@ public class DayOfSchedule implements CommandLineRunner {
570 && (!limitPark || park.equals(temp.getQdzCode()))) 614 && (!limitPark || park.equals(temp.getQdzCode())))
571 continue; 615 continue;
572 616
573 - if (flag && temp.getXlDir().equals(sch.getXlDir())) { 617 + if (flag) {
574 next = temp; 618 next = temp;
575 break; 619 break;
576 } 620 }
@@ -626,16 +670,21 @@ public class DayOfSchedule implements CommandLineRunner { @@ -626,16 +670,21 @@ public class DayOfSchedule implements CommandLineRunner {
626 670
627 String nbbm = sch.getClZbh(); 671 String nbbm = sch.getClZbh();
628 nbbmScheduleMap.put(nbbm, sch); 672 nbbmScheduleMap.put(nbbm, sch);
629 - //nbbm2SEStationMap.put(nbbm, sch.getQdzCode());  
630 - //nbbm2SEStationMap.put(nbbm, sch.getZdzCode());  
631 673
632 //主键索引 674 //主键索引
633 id2SchedulMap.put(sch.getId(), sch); 675 id2SchedulMap.put(sch.getId(), sch);
  676 + //路牌对照表
  677 + addLPMapp(sch);
  678 +
634 //跨24点的,再save一次 679 //跨24点的,再save一次
635 if (!sch.getRealExecDate().equals(sch.getScheduleDateStr())) 680 if (!sch.getRealExecDate().equals(sch.getScheduleDateStr()))
636 save(sch); 681 save(sch);
637 } 682 }
638 683
  684 + public void addLPMapp(ScheduleRealInfo sch){
  685 + lpScheduleMap.put(sch.getXlBm() + "_" + sch.getLpName(), sch);
  686 + }
  687 +
639 public void delete(ScheduleRealInfo sch) { 688 public void delete(ScheduleRealInfo sch) {
640 //ScheduleRealInfo sch = id2SchedulMap.get(id); 689 //ScheduleRealInfo sch = id2SchedulMap.get(id);
641 if (!sch.isSflj()) 690 if (!sch.isSflj())
@@ -643,13 +692,24 @@ public class DayOfSchedule implements CommandLineRunner { @@ -643,13 +692,24 @@ public class DayOfSchedule implements CommandLineRunner {
643 692
644 nbbmScheduleMap.remove(sch.getClZbh(), sch); 693 nbbmScheduleMap.remove(sch.getClZbh(), sch);
645 id2SchedulMap.remove(sch.getId()); 694 id2SchedulMap.remove(sch.getId());
  695 + lpScheduleMap.remove(sch.getXlBm() + "_" + sch.getLpName(), sch);
646 //return sch; 696 //return sch;
647 } 697 }
648 698
649 699
650 - public List<ScheduleRealInfo> updateQdzTimePlan(String nbbm) { 700 +/* public List<ScheduleRealInfo> updateQdzTimePlan(String nbbm) {
651 Collections.sort(nbbmScheduleMap.get(nbbm), schFCSJComparator); 701 Collections.sort(nbbmScheduleMap.get(nbbm), schFCSJComparator);
652 return schAttrCalculator.updateQdzTimePlan(nbbmScheduleMap.get(nbbm)); 702 return schAttrCalculator.updateQdzTimePlan(nbbmScheduleMap.get(nbbm));
  703 + }*/
  704 +
  705 + public List<ScheduleRealInfo> updateQdzTimePlan(String lpName) {
  706 + List<ScheduleRealInfo> list = lpScheduleMap.get(lpName);
  707 + Collections.sort(list, schFCSJComparator);
  708 + return schAttrCalculator.updateQdzTimePlan(list);
  709 + }
  710 +
  711 + public List<ScheduleRealInfo> updateQdzTimePlan(ScheduleRealInfo sch) {
  712 + return updateQdzTimePlan(sch.getXlBm() + "_" + sch.getLpName());
653 } 713 }
654 714
655 /** 715 /**
@@ -810,9 +870,9 @@ public class DayOfSchedule implements CommandLineRunner { @@ -810,9 +870,9 @@ public class DayOfSchedule implements CommandLineRunner {
810 */ 870 */
811 public List<ScheduleRealInfo> changeCar(ScheduleRealInfo sch, String newClZbh) { 871 public List<ScheduleRealInfo> changeCar(ScheduleRealInfo sch, String newClZbh) {
812 List<ScheduleRealInfo> ups = new ArrayList<>(); 872 List<ScheduleRealInfo> ups = new ArrayList<>();
813 - String oldClzbh = sch.getClZbh(); 873 + /*String oldClzbh = sch.getClZbh();
814 if (oldClzbh.equals(newClZbh)) 874 if (oldClzbh.equals(newClZbh))
815 - return ups; 875 + return ups;*/
816 876
817 877
818 //变更相关映射信息 878 //变更相关映射信息
@@ -820,12 +880,10 @@ public class DayOfSchedule implements CommandLineRunner { @@ -820,12 +880,10 @@ public class DayOfSchedule implements CommandLineRunner {
820 880
821 sch.setClZbh(newClZbh); 881 sch.setClZbh(newClZbh);
822 nbbmScheduleMap.put(newClZbh, sch); 882 nbbmScheduleMap.put(newClZbh, sch);
823 - //nbbm2SEStationMap.put(newClZbh, sch.getQdzCode());  
824 - //nbbm2SEStationMap.put(newClZbh, sch.getZdzCode());  
825 883
826 //重新计算班次应到时间 884 //重新计算班次应到时间
827 - ups.addAll(updateQdzTimePlan(oldClzbh));  
828 - ups.addAll(updateQdzTimePlan(newClZbh)); 885 + //ups.addAll(updateQdzTimePlan(oldClzbh));
  886 + //ups.addAll(updateQdzTimePlan(newClZbh));
829 887
830 //重新计算车辆当前执行班次 888 //重新计算车辆当前执行班次
831 reCalcExecPlan(newClZbh); 889 reCalcExecPlan(newClZbh);
@@ -842,7 +900,9 @@ public class DayOfSchedule implements CommandLineRunner { @@ -842,7 +900,9 @@ public class DayOfSchedule implements CommandLineRunner {
842 } 900 }
843 901
844 public void reCalcExecPlan(String nbbm){ 902 public void reCalcExecPlan(String nbbm){
845 - carExecutePlanMap.put(nbbm, schAttrCalculator.calcCurrentExecSch(nbbmScheduleMap.get(nbbm))); 903 + List<ScheduleRealInfo> list = nbbmScheduleMap.get(nbbm);
  904 + Collections.sort(list, schFCSJComparator);
  905 + carExecutePlanMap.put(nbbm, schAttrCalculator.calcCurrentExecSch(list));
846 } 906 }
847 907
848 /** 908 /**
@@ -942,4 +1002,15 @@ public class DayOfSchedule implements CommandLineRunner { @@ -942,4 +1002,15 @@ public class DayOfSchedule implements CommandLineRunner {
942 //重新计算班次应到时间 1002 //重新计算班次应到时间
943 updateQdzTimePlan(nbbm); 1003 updateQdzTimePlan(nbbm);
944 } 1004 }
  1005 +
  1006 + /**
  1007 + * 获取该班次所在路牌的下一个班次
  1008 + * @param sch
  1009 + * @return
  1010 + */
  1011 + public ScheduleRealInfo nextByLp(ScheduleRealInfo sch) {
  1012 + List<ScheduleRealInfo> list = lpScheduleMap.get(sch.getXlBm() + "_" + sch.getLpName());
  1013 + Collections.sort(list, schFCSJComparator);
  1014 + return next(list, sch);
  1015 + }
945 } 1016 }
946 \ No newline at end of file 1017 \ No newline at end of file
src/main/java/com/bsth/data/schedule/SchAttrCalculator.java
@@ -104,7 +104,7 @@ public class SchAttrCalculator { @@ -104,7 +104,7 @@ public class SchAttrCalculator {
104 /** 104 /**
105 * 105 *
106 * @Title: calcQdzTimePlan 106 * @Title: calcQdzTimePlan
107 - * @Description: TODO(计算班次的起点应到时间,list 必须是同一辆车的班次) 107 + * @Description: TODO(计算班次的起点应到时间)
108 */ 108 */
109 public void calcQdzTimePlan(List<ScheduleRealInfo> list){ 109 public void calcQdzTimePlan(List<ScheduleRealInfo> list){
110 Collections.sort(list, new ScheduleComparator.FCSJ()); 110 Collections.sort(list, new ScheduleComparator.FCSJ());
@@ -116,12 +116,13 @@ public class SchAttrCalculator { @@ -116,12 +116,13 @@ public class SchAttrCalculator {
116 ScheduleRealInfo prve = list.get(0), curr; 116 ScheduleRealInfo prve = list.get(0), curr;
117 for(int i = 1; i < len; i ++){ 117 for(int i = 1; i < len; i ++){
118 curr = list.get(i); 118 curr = list.get(i);
119 - if(prve.getZdzName().equals(curr.getQdzName())){ 119 +
  120 + if(prve.getZdzName().equals(curr.getQdzName())
  121 + || prve.getZdzCode().equals(curr.getQdzCode())){
120 curr.setQdzArrDateJH(prve.getZdsj()); 122 curr.setQdzArrDateJH(prve.getZdsj());
121 - if(StringUtils.isNotEmpty(prve.getZdsjActual()) && StringUtils.isEmpty(curr.getQdzArrDatesj())) 123 + if(StringUtils.isNotEmpty(prve.getZdsjActual()))
122 curr.setQdzArrDatesj(prve.getZdsjActual()); 124 curr.setQdzArrDatesj(prve.getZdsjActual());
123 } 125 }
124 -  
125 prve = curr; 126 prve = curr;
126 } 127 }
127 } 128 }
@@ -129,7 +130,7 @@ public class SchAttrCalculator { @@ -129,7 +130,7 @@ public class SchAttrCalculator {
129 /** 130 /**
130 * 131 *
131 * @Title: updateQdzTimePlan 132 * @Title: updateQdzTimePlan
132 - * @Description: TODO(更新班次的起点应到时间,list 必须是同一辆车的班次) 并返回被更新的班次 133 + * @Description: TODO(更新班次的起点应到时间) 并返回被更新的班次
133 */ 134 */
134 public List<ScheduleRealInfo> updateQdzTimePlan(List<ScheduleRealInfo> list){ 135 public List<ScheduleRealInfo> updateQdzTimePlan(List<ScheduleRealInfo> list){
135 Collections.sort(list, new ScheduleComparator.FCSJ()); 136 Collections.sort(list, new ScheduleComparator.FCSJ());
@@ -143,7 +144,8 @@ public class SchAttrCalculator { @@ -143,7 +144,8 @@ public class SchAttrCalculator {
143 for(int i = 1; i < len; i ++){ 144 for(int i = 1; i < len; i ++){
144 curr = list.get(i); 145 curr = list.get(i);
145 146
146 - if(prve.getZdzName().equals(curr.getQdzName())){ 147 + if(prve.getZdzName().equals(curr.getQdzName())
  148 + || prve.getZdzCode().equals(curr.getQdzCode())){
147 149
148 if(curr.getQdzArrDateJH() != null && prve.getZdsj().equals(curr.getQdzArrDateJH())){ 150 if(curr.getQdzArrDateJH() != null && prve.getZdsj().equals(curr.getQdzArrDateJH())){
149 prve = curr; 151 prve = curr;
src/main/java/com/bsth/data/schedule/thread/ScheduleRefreshThread.java
@@ -57,8 +57,6 @@ public class ScheduleRefreshThread extends Thread{ @@ -57,8 +57,6 @@ public class ScheduleRefreshThread extends Thread{
57 if(oldSchDate == null || !oldSchDate.equals(currSchDate)){ 57 if(oldSchDate == null || !oldSchDate.equals(currSchDate)){
58 58
59 logger.info(lineCode + "开始翻班, " + currSchDate); 59 logger.info(lineCode + "开始翻班, " + currSchDate);
60 - //清除进出站数据  
61 - //arrivalData.clearRAMData(lineCode);  
62 //清除指令数据 60 //清除指令数据
63 Set<String> cars = dayOfSchedule.findCarByLineCode(lineCode); 61 Set<String> cars = dayOfSchedule.findCarByLineCode(lineCode);
64 for(String car : cars) 62 for(String car : cars)
src/main/java/com/bsth/entity/realcontrol/ScheduleRealInfo.java
@@ -779,6 +779,8 @@ public class ScheduleRealInfo { @@ -779,6 +779,8 @@ public class ScheduleRealInfo {
779 779
780 public void destroy(){ 780 public void destroy(){
781 this.jhlc = 0.0; 781 this.jhlc = 0.0;
  782 + if(this.isSflj())
  783 + this.jhlcOrig = 0.0;
782 this.status = -1; 784 this.status = -1;
783 this.clearFcsjActual(); 785 this.clearFcsjActual();
784 } 786 }
src/main/java/com/bsth/service/realcontrol/ScheduleRealInfoService.java
@@ -138,7 +138,7 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L @@ -138,7 +138,7 @@ public interface ScheduleRealInfoService extends BaseService&lt;ScheduleRealInfo, L
138 138
139 Map<String,Object> changeBcType(Long id, String bcType, String remarks); 139 Map<String,Object> changeBcType(Long id, String bcType, String remarks);
140 140
141 - Map<String,Object> historySave(ScheduleRealInfo sch); 141 + //Map<String,Object> historySave(ScheduleRealInfo sch);
142 142
143 Map<String, Object> MapById(Long id) ; 143 Map<String, Object> MapById(Long id) ;
144 144
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
@@ -3,7 +3,6 @@ package com.bsth.service.realcontrol.impl; @@ -3,7 +3,6 @@ package com.bsth.service.realcontrol.impl;
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONArray; 4 import com.alibaba.fastjson.JSONArray;
5 import com.alibaba.fastjson.JSONObject; 5 import com.alibaba.fastjson.JSONObject;
6 -import com.alibaba.fastjson.support.odps.udf.CodecCheck.A;  
7 import com.bsth.common.Constants; 6 import com.bsth.common.Constants;
8 import com.bsth.common.ResponseCode; 7 import com.bsth.common.ResponseCode;
9 import com.bsth.controller.realcontrol.dto.ChangePersonCar; 8 import com.bsth.controller.realcontrol.dto.ChangePersonCar;
@@ -158,6 +157,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -158,6 +157,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
158 private static int BUF_SIZE = 1024; 157 private static int BUF_SIZE = 1024;
159 158
160 private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd"); 159 private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyy-MM-dd");
  160 + private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm");
161 161
162 @Override 162 @Override
163 public Map<String, Object> outgoAdjust(Long id, String remarks, String dfsj, String bcType) { 163 public Map<String, Object> outgoAdjust(Long id, String remarks, String dfsj, String bcType) {
@@ -166,7 +166,6 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -166,7 +166,6 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
166 166
167 ScheduleRealInfo schedule = dayOfSchedule.get(id); 167 ScheduleRealInfo schedule = dayOfSchedule.get(id);
168 168
169 -  
170 LineConfig config = lineConfigData.get(schedule.getXlBm()); 169 LineConfig config = lineConfigData.get(schedule.getXlBm());
171 //小于线路开始运营时间,则默认跨过24点 170 //小于线路开始运营时间,则默认跨过24点
172 if (dfsj.compareTo(config.getStartOpt()) < 0) { 171 if (dfsj.compareTo(config.getStartOpt()) < 0) {
@@ -178,17 +177,11 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -178,17 +177,11 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
178 schedule.setDfsjAll(dfsj); 177 schedule.setDfsjAll(dfsj);
179 schedule.addRemarks(remarks); 178 schedule.addRemarks(remarks);
180 179
181 - //取消应发未到标记  
182 - if(schedule.isLate2()){  
183 - schedule.setLate2(false);  
184 - LateAdjustHandle.remove(schedule);  
185 - }  
186 -  
187 List<ScheduleRealInfo> ts = new ArrayList<>(); 180 List<ScheduleRealInfo> ts = new ArrayList<>();
188 ts.add(schedule); 181 ts.add(schedule);
189 //调整终点时间和下一个班次的应到时间 182 //调整终点时间和下一个班次的应到时间
190 schedule.calcEndTime(); 183 schedule.calcEndTime();
191 - ScheduleRealInfo nextSch = dayOfSchedule.next(schedule); 184 + ScheduleRealInfo nextSch = dayOfSchedule.nextByLp(schedule);
192 if (null != nextSch) { 185 if (null != nextSch) {
193 nextSch.setQdzArrDateJH(schedule.getZdsj()); 186 nextSch.setQdzArrDateJH(schedule.getZdsj());
194 ts.add(nextSch); 187 ts.add(nextSch);
@@ -201,7 +194,11 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -201,7 +194,11 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
201 194
202 //重新计算是否误点 195 //重新计算是否误点
203 schedule.reCalcLate(); 196 schedule.reCalcLate();
204 - 197 + //取消应发未到标记,不再自动调整待发
  198 + if(schedule.isLate2()){
  199 + schedule.setLate2(false);
  200 + LateAdjustHandle.remove(schedule);
  201 + }
205 // 持久化到数据库 202 // 持久化到数据库
206 dayOfSchedule.save(schedule); 203 dayOfSchedule.save(schedule);
207 204
@@ -223,7 +220,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -223,7 +220,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
223 try { 220 try {
224 List<String> idList = Lists.newArrayList(Splitter.on(',').trimResults().omitEmptyStrings().split(idsStr)); 221 List<String> idList = Lists.newArrayList(Splitter.on(',').trimResults().omitEmptyStrings().split(idsStr));
225 222
226 - ScheduleRealInfo schedule = null, next; 223 + ScheduleRealInfo schedule = null;
227 for (String id : idList) { 224 for (String id : idList) {
228 schedule = dayOfSchedule.get(Long.parseLong(id)); 225 schedule = dayOfSchedule.get(Long.parseLong(id));
229 if (schedule.isDestroy()) { 226 if (schedule.isDestroy()) {
@@ -238,13 +235,6 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -238,13 +235,6 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
238 235
239 dayOfSchedule.save(schedule); 236 dayOfSchedule.save(schedule);
240 rsList.add(schedule); 237 rsList.add(schedule);
241 -  
242 - /*//如果正在执行当前班次,跳下一个班次  
243 - execSch = dayOfSchedule.executeCurr(schedule.getClZbh());  
244 - if(execSch != null && execSch.getId().equals(schedule.getId())){  
245 - next = dayOfSchedule.next(schedule);  
246 - dayOfSchedule.addExecPlan(next);  
247 - }*/  
248 } 238 }
249 239
250 //重新计算当前执行班次 240 //重新计算当前执行班次
@@ -374,7 +364,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -374,7 +364,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
374 t.setQdzName(BasicData.getStationNameByCode(t.getQdzCode(), prefix)); 364 t.setQdzName(BasicData.getStationNameByCode(t.getQdzCode(), prefix));
375 t.setZdzName(BasicData.getStationNameByCode(t.getZdzCode(), prefix)); 365 t.setZdzName(BasicData.getStationNameByCode(t.getZdzCode(), prefix));
376 366
377 - //计算班次实际时间 367 + //计算班次实际执行时间
378 schAttrCalculator.calcRealDate(t).calcAllTimeByFcsj(t); 368 schAttrCalculator.calcRealDate(t).calcAllTimeByFcsj(t);
379 if (t.getZdsjT() < t.getFcsjT()) { 369 if (t.getZdsjT() < t.getFcsjT()) {
380 rs.put("status", ResponseCode.ERROR); 370 rs.put("status", ResponseCode.ERROR);
@@ -389,7 +379,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -389,7 +379,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
389 dayOfSchedule.put(t); 379 dayOfSchedule.put(t);
390 380
391 //更新起点应到时间 381 //更新起点应到时间
392 - List<ScheduleRealInfo> ts = dayOfSchedule.updateQdzTimePlan(t.getClZbh()); 382 + List<ScheduleRealInfo> ts = dayOfSchedule.updateQdzTimePlan(t);
393 383
394 //重新计算车辆当前执行班次 384 //重新计算车辆当前执行班次
395 dayOfSchedule.reCalcExecPlan(t.getClZbh()); 385 dayOfSchedule.reCalcExecPlan(t.getClZbh());
@@ -429,7 +419,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -429,7 +419,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
429 if(rs.get("status").equals(ResponseCode.SUCCESS)){ 419 if(rs.get("status").equals(ResponseCode.SUCCESS)){
430 dayOfSchedule.delete(sch); 420 dayOfSchedule.delete(sch);
431 //更新起点应到时间 421 //更新起点应到时间
432 - List<ScheduleRealInfo> ts = dayOfSchedule.updateQdzTimePlan(sch.getClZbh()); 422 + List<ScheduleRealInfo> ts = dayOfSchedule.updateQdzTimePlan(sch);
433 rs.put("ts", ts); 423 rs.put("ts", ts);
434 rs.put("delete", sch); 424 rs.put("delete", sch);
435 } 425 }
@@ -946,23 +936,14 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -946,23 +936,14 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
946 for (int i = 1; i < size; i++) { 936 for (int i = 1; i < size; i++) {
947 st += plus; 937 st += plus;
948 sch = list.get(i); 938 sch = list.get(i);
949 - sch.setDfsjAll(st);  
950 - //重新计算终点时间  
951 - sch.calcEndTime();  
952 939
953 - dayOfSchedule.save(sch);  
954 -  
955 - updateList.add(sch);  
956 - next = dayOfSchedule.next(sch);  
957 - if (next.getQdzName().equals(sch.getZdzName())) {  
958 - next.setQdzArrDateJH(sch.getZdsj());  
959 - updateList.add(next);  
960 - } 940 + //调整待发
  941 + outgoAdjust(sch.getId(), null, fmtHHmm.print(st), null);
961 } 942 }
962 943
963 -  
964 rs.put("status", ResponseCode.SUCCESS); 944 rs.put("status", ResponseCode.SUCCESS);
965 - rs.put("ts", updateList); 945 + //返回最后一个班次,页面会全量刷新
  946 + rs.put("t", sch);
966 } 947 }
967 948
968 } catch (Exception e) { 949 } catch (Exception e) {
@@ -980,121 +961,146 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -980,121 +961,146 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
980 List<ScheduleRealInfo> ts = new ArrayList<>(); 961 List<ScheduleRealInfo> ts = new ArrayList<>();
981 try { 962 try {
982 Long id = Long.parseLong(map.get("id")); 963 Long id = Long.parseLong(map.get("id"));
983 - //实际发车时间  
984 - String fcsjActual = map.get("fcsjActual");  
985 - //实际终点时间  
986 - String zdsjActual = map.get("zdsjActual");  
987 - //备注  
988 - String remarks = map.get("remarks");  
989 ScheduleRealInfo sch = dayOfSchedule.get(id); 964 ScheduleRealInfo sch = dayOfSchedule.get(id);
990 - if (null != sch) {  
991 -  
992 - String clZbh = map.get("clZbh");  
993 - if (StringUtils.isNotEmpty(clZbh)) {  
994 - //换车  
995 - BiMap<String, String> clMap = BasicData.deviceId2NbbmMap.inverse();  
996 - if (clMap.get(clZbh) == null) {  
997 - rs.put("status", ResponseCode.ERROR);  
998 - rs.put("msg", "车辆 " + clZbh + " 不存在!");  
999 - return rs;  
1000 - } else {  
1001 - dayOfSchedule.changeCar(sch, clZbh);  
1002 - }  
1003 - }  
1004 - //换驾驶员  
1005 - String jsy = map.get("jsy");  
1006 - if (StringUtils.isNotEmpty(jsy) && jsy.indexOf("/") != -1) {  
1007 - persoChange(sch, jsy.split("/")[0]);  
1008 - }  
1009 - //换售票员  
1010 - String spy = map.get("spy");  
1011 - if (StringUtils.isNotEmpty(spy) && spy.indexOf("/") != -1 && !spy.equals("/")) {  
1012 - persoChangeSPY(sch, spy.split("/")[0]);  
1013 - }  
1014 - else{  
1015 - sch.setsGh("");  
1016 - sch.setsName("");  
1017 - }  
1018 965
  966 + if(null == sch){
  967 + rs.put("status", ResponseCode.ERROR);
  968 + rs.put("msg", "不存在的班次!");
  969 + return rs;
  970 + }
1019 971
1020 - if (StringUtils.isNotBlank(fcsjActual)) {  
1021 - LineConfig config = lineConfigData.get(sch.getXlBm());  
1022 - long t = 0L;  
1023 - //小于线路开始运营时间,则默认跨过24点  
1024 - if (fcsjActual.compareTo(config.getStartOpt()) < 0)  
1025 - t = fmtyyyyMMddHHmm.parseMillis(fmtyyyyMMdd.print(sch.getScheduleDate().getTime() + DAY_TIME) + fcsjActual);  
1026 - else  
1027 - t = fmtyyyyMMddHHmm.parseMillis(sch.getScheduleDateStr() + fcsjActual); 972 + /**
  973 + * 换车
  974 + */
  975 + String clZbh = map.get("clZbh");
  976 + if (StringUtils.isNotEmpty(clZbh)) {
  977 + //换车
  978 + if (!BasicData.deviceId2NbbmMap.inverse().containsKey(clZbh)) {
  979 + rs.put("status", ResponseCode.ERROR);
  980 + rs.put("msg", "车辆 " + clZbh + " 不存在!");
  981 + return rs;
  982 + } else {
  983 + dayOfSchedule.changeCar(sch, clZbh);
  984 + }
  985 + }
1028 986
1029 - //调整实发  
1030 - if (!fcsjActual.equals(sch.getFcsjActual())){  
1031 - sch.setFcsjActualAll(t); 987 + /**
  988 + * 换驾驶员
  989 + */
  990 + String jsy = map.get("jsy");
  991 + if (StringUtils.isNotEmpty(jsy) && jsy.indexOf("/") != -1) {
  992 + persoChange(sch, jsy.split("/")[0]);
  993 + }
1032 994
1033 - //取消应发未到标记  
1034 - if(sch.isLate2()){  
1035 - sch.setLate2(false);  
1036 - LateAdjustHandle.remove(sch);  
1037 - }  
1038 - }  
1039 - } else {  
1040 - //撤销实发  
1041 - if (sch.getFcsjActual() != null)  
1042 - revokeRealOutgo(sch.getId()); 995 + /**
  996 + * 换售票员
  997 + */
  998 + String spy = map.get("spy");
  999 + if (StringUtils.isNotEmpty(spy) && spy.indexOf("/") != -1 && !spy.equals("/")) {
  1000 + persoChangeSPY(sch, spy.split("/")[0]);
  1001 + }
  1002 + else{
  1003 + sch.setsGh("");
  1004 + sch.setsName("");
  1005 + }
  1006 +
  1007 + /**
  1008 + * 调整实发
  1009 + */
  1010 + String fcsjActual = map.get("fcsjActual");
  1011 + if (StringUtils.isNotBlank(fcsjActual)
  1012 + && !fcsjActual.equals(sch.getFcsjActual())) {
  1013 +
  1014 + LineConfig config = lineConfigData.get(sch.getXlBm());
  1015 + long t = 0L;
  1016 + //小于线路开始运营时间,则默认跨过24点
  1017 + if (fcsjActual.compareTo(config.getStartOpt()) < 0)
  1018 + t = fmtyyyyMMddHHmm.parseMillis(fmtyyyyMMdd.print(sch.getScheduleDate().getTime() + DAY_TIME) + fcsjActual);
  1019 + else
  1020 + t = fmtyyyyMMddHHmm.parseMillis(sch.getScheduleDateStr() + fcsjActual);
  1021 +
  1022 + sch.setFcsjActualAll(t);
  1023 + //取消应发未到标记
  1024 + if(sch.isLate2()){
  1025 + sch.setLate2(false);
  1026 + LateAdjustHandle.remove(sch);
1043 } 1027 }
1044 - //实达时间  
1045 - if (StringUtils.isNotBlank(zdsjActual)) {  
1046 - if (!zdsjActual.equals(sch.getZdsjActual())) {  
1047 - //调整实达  
1048 - sch.setZdsjActualAll(zdsjActual);  
1049 - //下一班次起点到达时间  
1050 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
1051 - if (null != next) {  
1052 - next.setQdzArrDateSJ(zdsjActual);  
1053 - next.setLate2(false);  
1054 - ts.add(next);  
1055 - } 1028 + } else if (sch.getFcsjActual() != null){
  1029 + //撤销实发
  1030 + revokeRealOutgo(sch.getId());
  1031 + }
1056 1032
1057 - //重新计算车辆执行班次  
1058 - dayOfSchedule.reCalcExecPlan(sch.getClZbh());  
1059 - }  
1060 - } else {  
1061 - //清除实达时间  
1062 - sch.clearZdsjActual();  
1063 - //清除下一班次起点到达时间  
1064 - ScheduleRealInfo next = dayOfSchedule.next(sch);  
1065 - if (null != next) {  
1066 - next.setQdzArrDateSJ(null);  
1067 - ts.add(next);  
1068 - } 1033 + /**
  1034 + * 调整实达
  1035 + */
  1036 + String zdsjActual = map.get("zdsjActual");
  1037 + if (StringUtils.isNotBlank(zdsjActual)
  1038 + && !zdsjActual.equals(sch.getZdsjActual())) {
  1039 +
  1040 + //调整实达
  1041 + sch.setZdsjActualAll(zdsjActual);
  1042 + //路牌下一班起点到达时间
  1043 + ScheduleRealInfo next = dayOfSchedule.nextByLp(sch);
  1044 + if (null != next) {
  1045 + next.setQdzArrDateSJ(zdsjActual);
  1046 + next.setLate2(false);
  1047 + ts.add(next);
1069 } 1048 }
1070 - sch.setRemarks(remarks);  
1071 1049
1072 - try {  
1073 - //烂班  
1074 - if (map.get("status") != null  
1075 - && Integer.parseInt(map.get("status").toString()) == -1) {  
1076 - destroy(sch.getId() + "", "", map.get("adjustExps").toString());  
1077 - }  
1078 - } catch (NumberFormatException e) {  
1079 - logger.error("", e); 1050 + //重新计算车辆执行班次
  1051 + dayOfSchedule.reCalcExecPlan(sch.getClZbh());
  1052 + } else if(StringUtils.isNotEmpty(sch.getZdsjActual())){
  1053 + //清除实达时间
  1054 + sch.clearZdsjActual();
  1055 + //清除路牌下一班起点到达时间
  1056 + ScheduleRealInfo next = dayOfSchedule.nextByLp(sch);
  1057 + if (null != next) {
  1058 + next.setQdzArrDateSJ(null);
  1059 + ts.add(next);
1080 } 1060 }
  1061 + //重新计算车辆执行班次
  1062 + dayOfSchedule.reCalcExecPlan(sch.getClZbh());
  1063 + }
1081 1064
1082 - //修改班次里程  
1083 - String jhlc = map.get("jhlc");  
1084 - if (StringUtils.isNotEmpty(jhlc)) {  
1085 - if(Double.parseDouble(jhlc) == 0 && sch.getJhlcOrig() != 0)  
1086 - destroy(sch.getId() + "", "", map.get("adjustExps").toString());  
1087 - else{  
1088 - sch.setJhlc(Double.parseDouble(jhlc));  
1089 - } 1065 + /**
  1066 + * 备注
  1067 + */
  1068 + sch.setRemarks(map.get("remarks"));
  1069 +
  1070 + /**
  1071 + * 烂班
  1072 + */
  1073 + if (map.get("status") != null
  1074 + && Integer.parseInt(map.get("status").toString()) == -1) {
  1075 + destroy(sch.getId() + "", "", map.get("adjustExps").toString());
  1076 + }
  1077 +
  1078 + /**
  1079 + * 修改班次里程
  1080 + */
  1081 + String jhlc = map.get("jhlc");
  1082 + if (StringUtils.isNotEmpty(jhlc)) {
  1083 + double jhlcNum = Double.parseDouble(jhlc);
  1084 + //烂班
  1085 + if(jhlcNum == 0 && sch.getJhlcOrig() != 0)
  1086 + destroy(sch.getId() + "", "", map.get("adjustExps").toString());
  1087 + else if(jhlcNum != sch.getJhlc()){
  1088 + sch.setJhlc(jhlcNum);
  1089 + //临加班次,实际计划一起改
  1090 + if(sch.isSflj())
  1091 + sch.setJhlcOrig(jhlcNum);
1090 } 1092 }
1091 } 1093 }
1092 1094
  1095 + /**
  1096 + * 修改班次类型
  1097 + */
1093 String bcType = map.get("bcType"); 1098 String bcType = map.get("bcType");
1094 if (StringUtils.isNotEmpty(bcType)) { 1099 if (StringUtils.isNotEmpty(bcType)) {
1095 sch.setBcType(bcType); 1100 sch.setBcType(bcType);
1096 } 1101 }
1097 - //班次状态 1102 +
  1103 + //重新计算班次状态
1098 sch.calcStatus(); 1104 sch.calcStatus();
1099 dayOfSchedule.save(sch); 1105 dayOfSchedule.save(sch);
1100 //页面需要更新的班次信息 1106 //页面需要更新的班次信息
@@ -1118,25 +1124,19 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -1118,25 +1124,19 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
1118 ScheduleRealInfo schedule = null; 1124 ScheduleRealInfo schedule = null;
1119 JSONObject jsonObj; 1125 JSONObject jsonObj;
1120 String dfsj; 1126 String dfsj;
  1127 + long id;
1121 for (int i = 0; i < jsonArray.size(); i++) { 1128 for (int i = 0; i < jsonArray.size(); i++) {
1122 jsonObj = jsonArray.getJSONObject(i); 1129 jsonObj = jsonArray.getJSONObject(i);
1123 dfsj = jsonObj.getString("t"); 1130 dfsj = jsonObj.getString("t");
1124 - schedule = dayOfSchedule.get(jsonObj.getLong("id"));  
1125 - //设置待发时间  
1126 - schedule.setDfsjAll(dfsj);  
1127 - //重新计算是否误点  
1128 - schedule.reCalcLate(); 1131 + id = jsonObj.getLong("id");
  1132 + schedule = dayOfSchedule.get(id);
1129 1133
1130 - //取消应发未到标记  
1131 - if(schedule.isLate2()){  
1132 - schedule.setLate2(false);  
1133 - LateAdjustHandle.remove(schedule);  
1134 - }  
1135 - dayOfSchedule.save(schedule); 1134 + if(schedule != null)
  1135 + outgoAdjust(id, null, dfsj, null);
1136 } 1136 }
1137 1137
1138 rs.put("status", ResponseCode.SUCCESS); 1138 rs.put("status", ResponseCode.SUCCESS);
1139 - //将更新的最后一个班次返回 1139 + //将更新的最后一个班次返回,页面会做全量刷新
1140 rs.put("t", schedule); 1140 rs.put("t", schedule);
1141 } catch (Exception e) { 1141 } catch (Exception e) {
1142 logger.error("", e); 1142 logger.error("", e);
@@ -2909,29 +2909,15 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -2909,29 +2909,15 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
2909 Map<String, Object> rs = new HashMap<>(), tempMap = new HashMap<>(); 2909 Map<String, Object> rs = new HashMap<>(), tempMap = new HashMap<>();
2910 List<ScheduleRealInfo> list = new ArrayList<>(); 2910 List<ScheduleRealInfo> list = new ArrayList<>();
2911 2911
2912 - ScheduleRealInfo sch, next;  
2913 for (DfsjChange dc : dfsjcs) { 2912 for (DfsjChange dc : dfsjcs) {
2914 if (StringUtils.isEmpty(dc.getOld_dfsj()) || StringUtils.isEmpty(dc.getNew_dfsj())) 2913 if (StringUtils.isEmpty(dc.getOld_dfsj()) || StringUtils.isEmpty(dc.getNew_dfsj()))
2915 continue; 2914 continue;
2916 -  
2917 - /*sch = dayOfSchedule.get(dc.getSchId());  
2918 - if(sch==null)  
2919 - continue;  
2920 -  
2921 - sch.setDfsjAll(dc.getNew_dfsj());  
2922 - //重新计算终点时间  
2923 - sch.calcEndTime();  
2924 - list.add(sch);*/ 2915 +
2925 tempMap = outgoAdjust(dc.getSchId(), "", dc.getNew_dfsj(), null); 2916 tempMap = outgoAdjust(dc.getSchId(), "", dc.getNew_dfsj(), null);
2926 2917
2927 if (tempMap.get("status").equals(ResponseCode.SUCCESS)) { 2918 if (tempMap.get("status").equals(ResponseCode.SUCCESS)) {
2928 list.addAll((Collection<? extends ScheduleRealInfo>) tempMap.get("ts")); 2919 list.addAll((Collection<? extends ScheduleRealInfo>) tempMap.get("ts"));
2929 } 2920 }
2930 - //next=dayOfSchedule.next(sch);  
2931 - /*if(next.getQdzName().equals(sch.getZdzName())){  
2932 - next.setQdzArrDateJH(sch.getZdsj());  
2933 - list.add(next);  
2934 - }*/  
2935 } 2921 }
2936 2922
2937 rs.put("status", ResponseCode.SUCCESS); 2923 rs.put("status", ResponseCode.SUCCESS);
@@ -3021,7 +3007,6 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -3021,7 +3007,6 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
3021 if (sch != null) { 3007 if (sch != null) {
3022 sch.setBcType(bcType); 3008 sch.setBcType(bcType);
3023 sch.addRemarks(remarks); 3009 sch.addRemarks(remarks);
3024 - //有时间记录一下相关变更数据  
3025 rs.put("status", ResponseCode.SUCCESS); 3010 rs.put("status", ResponseCode.SUCCESS);
3026 rs.put("t", sch); 3011 rs.put("t", sch);
3027 } 3012 }
@@ -3033,7 +3018,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -3033,7 +3018,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
3033 return rs; 3018 return rs;
3034 } 3019 }
3035 3020
3036 - @Override 3021 + /* @Override
3037 public Map<String, Object> historySave(ScheduleRealInfo sch) { 3022 public Map<String, Object> historySave(ScheduleRealInfo sch) {
3038 Map<String, Object> rs = new HashMap<>(); 3023 Map<String, Object> rs = new HashMap<>();
3039 rs.put("status", ResponseCode.ERROR); 3024 rs.put("status", ResponseCode.ERROR);
@@ -3073,7 +3058,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -3073,7 +3058,7 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
3073 scheduleRealInfoRepository.save(oldSch); 3058 scheduleRealInfoRepository.save(oldSch);
3074 rs.put("status", ResponseCode.SUCCESS); 3059 rs.put("status", ResponseCode.SUCCESS);
3075 return rs; 3060 return rs;
3076 - } 3061 + }*/
3077 3062
3078 @Autowired 3063 @Autowired
3079 SvgAttributeRepository svgAttributeRepository; 3064 SvgAttributeRepository svgAttributeRepository;
@@ -4151,8 +4136,8 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -4151,8 +4136,8 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
4151 4136
4152 sch.clearFcsjActual(); 4137 sch.clearFcsjActual();
4153 sch.clearZdsjActual(); 4138 sch.clearZdsjActual();
4154 - //清除下一个班次的起点到达时间  
4155 - ScheduleRealInfo next = dayOfSchedule.next(sch); 4139 + //清除路牌下一个班的起点到达时间
  4140 + ScheduleRealInfo next = dayOfSchedule.nextByLp(sch);
4156 if (null != next) { 4141 if (null != next) {
4157 next.setQdzArrDateSJ(null); 4142 next.setQdzArrDateSJ(null);
4158 ts.add(next); 4143 ts.add(next);
@@ -4164,6 +4149,8 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf @@ -4164,6 +4149,8 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
4164 rs.put("ts", ts); 4149 rs.put("ts", ts);
4165 4150
4166 dayOfSchedule.save(sch); 4151 dayOfSchedule.save(sch);
  4152 + //重新计算当前执行班次
  4153 + dayOfSchedule.reCalcExecPlan(sch.getClZbh());
4167 4154
4168 } 4155 }
4169 } catch (Exception e) { 4156 } catch (Exception e) {
src/main/java/com/bsth/service/schedule/impl/SchedulePlanServiceImpl.java
@@ -244,11 +244,12 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im @@ -244,11 +244,12 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
244 Date end4 = new Date(); 244 Date end4 = new Date();
245 245
246 246
247 - logger.info("删除数据 {} ms,drool时刻表每日路牌计算 {} ms,drool循环规则计算 {} ms,drool计划数据 {} ms,插入数据 {} ms", 247 + logger.info("删除数据 {} ms,drool时刻表每日路牌计算 {} ms,drool循环规则计算 {} ms,drool计划数据 {} ms,插入数据 {} 条 耗时 {} ms",
248 endpre.getTime() - startpre.getTime(), 248 endpre.getTime() - startpre.getTime(),
249 end1.getTime() - start1.getTime(), 249 end1.getTime() - start1.getTime(),
250 end2.getTime() - start2.getTime(), 250 end2.getTime() - start2.getTime(),
251 end3.getTime() - start3.getTime(), 251 end3.getTime() - start3.getTime(),
  252 + planResult.getSchedulePlanInfos().size(),
252 end4.getTime() - start4.getTime()); 253 end4.getTime() - start4.getTime());
253 254
254 255
src/main/java/com/bsth/service/schedule/rules/MyDroolsConfiguration.java
@@ -76,12 +76,12 @@ public class MyDroolsConfiguration { @@ -76,12 +76,12 @@ public class MyDroolsConfiguration {
76 // 4、创建KieBuilder,使用KieFileSystem构建 76 // 4、创建KieBuilder,使用KieFileSystem构建
77 KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); 77 KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
78 Results results = kieBuilder.getResults(); 78 Results results = kieBuilder.getResults();
79 -// if (results.hasMessages(Message.Level.ERROR))  
80 -// throw new IllegalStateException("构建drools6错误:" + results.getMessages());  
81 - if (results.hasMessages(Message.Level.ERROR)) {  
82 - logger.info("构建drools6错误:" + results.getMessages());  
83 - return null;  
84 - } 79 + if (results.hasMessages(Message.Level.ERROR))
  80 + throw new IllegalStateException("构建drools6错误:" + results.getMessages());
  81 +// if (results.hasMessages(Message.Level.ERROR)) {
  82 +// logger.info("构建drools6错误:" + results.getMessages());
  83 +// return null;
  84 +// }
85 85
86 // 5、获取KieContainer 86 // 5、获取KieContainer
87 // TODO:ReleaseId用处很大,以后再议 87 // TODO:ReleaseId用处很大,以后再议
src/main/resources/logback.xml
@@ -159,6 +159,32 @@ @@ -159,6 +159,32 @@
159 <!--<appender-ref ref="STDOUT" />--> 159 <!--<appender-ref ref="STDOUT" />-->
160 <!--</logger>--> 160 <!--</logger>-->
161 161
  162 + <!--JdbcTemplate的日志输出器 -->
  163 + <logger name="org.springframework.jdbc.core.StatementCreatorUtils"
  164 + additivity="false" level="TRACE">
  165 + <appender-ref ref="STDOUT" />
  166 + </logger>
  167 + <logger name="org.springframework.jdbc.core" additivity="true">
  168 + <level value="DEBUG" />
  169 + <appender-ref ref="STDOUT" />
  170 + </logger>
  171 + <logger name="java.sql.Connection" additivity="true">
  172 + <level value="DEBUG" />
  173 + <appender-ref ref="STDOUT" />
  174 + </logger>
  175 + <logger name="java.sql.Statement" additivity="true">
  176 + <level value="DEBUG" />
  177 + <appender-ref ref="STDOUT" />
  178 + </logger>
  179 + <logger name="java.sql.PreparedStatement" additivity="true">
  180 + <level value="DEBUG" />
  181 + <appender-ref ref="STDOUT" />
  182 + </logger>
  183 + <logger name="java.sql.ResultSet" additivity="true">
  184 + <level value="DEBUG" />
  185 + <appender-ref ref="STDOUT" />
  186 + </logger>
  187 +
162 <!-- 日志输出级别 --> 188 <!-- 日志输出级别 -->
163 <root level="info"> 189 <root level="info">
164 <appender-ref ref="STDOUT" /> 190 <appender-ref ref="STDOUT" />
src/main/resources/rules/legacy/plan.drl 0 → 100644
  1 +package com.bsth.service.schedule.plan;
  2 +
  3 +import org.joda.time.*;
  4 +import java.util.*;
  5 +
  6 +import com.bsth.service.schedule.rules.plan.PlanCalcuParam_input;
  7 +import com.bsth.service.schedule.rules.plan.PlanResult;
  8 +
  9 +import com.bsth.repository.schedule.TTInfoDetailRepository;
  10 +import com.bsth.repository.schedule.CarConfigInfoRepository;
  11 +import com.bsth.repository.schedule.EmployeeConfigInfoRepository;
  12 +import com.bsth.repository.LineRepository;
  13 +import com.bsth.repository.BusinessRepository;
  14 +
  15 +import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output;
  16 +import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
  17 +import com.bsth.service.schedule.rules.ttinfo.TTInfoResult_output;
  18 +import com.bsth.service.schedule.rules.ttinfo.TTInfoResults_output;
  19 +import com.bsth.entity.Line;
  20 +import com.bsth.entity.Business;
  21 +
  22 +import com.bsth.entity.schedule.CarConfigInfo;
  23 +import com.bsth.entity.schedule.EmployeeConfigInfo;
  24 +import com.bsth.entity.schedule.TTInfo;
  25 +import com.bsth.entity.schedule.TTInfoDetail;
  26 +import com.bsth.entity.schedule.SchedulePlanInfo;
  27 +
  28 +import org.slf4j.Logger
  29 +import org.joda.time.format.DateTimeFormat
  30 +import org.apache.commons.lang3.StringUtils;
  31 +
  32 +
  33 +// 全局日志类(一般使用调用此规则的service类)
  34 +global Logger log;
  35 +
  36 +global TTInfoDetailRepository tTInfoDetailRepository;
  37 +global CarConfigInfoRepository carConfigInfoRepository;
  38 +global EmployeeConfigInfoRepository employeeConfigInfoRepository;
  39 +global LineRepository lineRepository;
  40 +global BusinessRepository businessRepository;
  41 +
  42 +// 输出
  43 +global PlanResult planResult;
  44 +
  45 +function Map xlidParams(String xlid) {
  46 + Map param = new HashMap();
  47 + param.put("xl.id_eq", Integer.valueOf(xlid));
  48 + return param;
  49 +}
  50 +
  51 +function List ecList(EmployeeConfigInfoRepository repo, String ecids) {
  52 + List<String> ids = Arrays.asList(ecids.split("-"));
  53 + List rst = new ArrayList();
  54 + for (int i = 0; i < ids.size(); i++) {
  55 + rst.add(repo.findOne(Long.parseLong(ids.get(i))));
  56 + }
  57 + return rst;
  58 +}
  59 +
  60 +function LocalTime fcsjTime(String fcsj) {
  61 + if ("NULL".equals(fcsj)) {
  62 + return null;
  63 + }
  64 + return LocalTime.parse(fcsj, DateTimeFormat.forPattern("HH:mm"));
  65 +}
  66 +
  67 +function String ttInfoId_sd(Map map, DateTime sd) {
  68 + TTInfoResult_output ttInfoResult_output = (TTInfoResult_output) map.get(sd);
  69 + return ttInfoResult_output.getTtInfoId();
  70 +}
  71 +
  72 +/*
  73 + 规则说明:
  74 + 根据循环规则输出,时刻表选择规则输出,组合计算排班明细
  75 +*/
  76 +
  77 +//-------------------- 第一阶段、计算迭代数据 -----------------//
  78 +declare Loop_result
  79 + xlId: String // 线路id
  80 +
  81 + ruleLoop: List // 每天分配的规则 List<ScheduleResult_output>
  82 +
  83 + ttInfoMapLoop_temp: Map // 每天分配的时刻表 Map<DataTime, Collection<TTInfoResult_output>>
  84 + ttInfoMapLoop: Map // 每天分配的时刻表 Map<DataTime, TTInfoResult_output>
  85 + ttInfoMap: Map // 总共用到的时刻表 Map<id, TTInfoResult_output>
  86 +end
  87 +
  88 +rule "calcu_step1_Loop_result"
  89 + salience 1000
  90 + when
  91 + $param: PlanCalcuParam_input($xlId: xlId)
  92 + then
  93 + Loop_result loop_result = new Loop_result();
  94 + loop_result.setXlId($xlId);
  95 + loop_result.setRuleLoop($param.getScheduleResults_output().getResults());
  96 +
  97 + loop_result.setTtInfoMapLoop(new HashMap());
  98 + loop_result.setTtInfoMap(new HashMap());
  99 +
  100 + com.google.common.collect.Multimap ttInfoMap_temp =
  101 + (com.google.common.collect.Multimap)
  102 + $param.getTtInfoResults_output().getResults().get(
  103 + String.valueOf($xlId));
  104 +
  105 + loop_result.setTtInfoMapLoop_temp(ttInfoMap_temp.asMap());
  106 +
  107 + insert(loop_result);
  108 +
  109 +// log.info("calcu_step1_Loop_result");
  110 +end
  111 +
  112 +rule "calcu_step2_loop_result"
  113 + salience 1000
  114 + no-loop
  115 + when
  116 + $param: PlanCalcuParam_input($xlId: xlId)
  117 + $lr: Loop_result(xlId == $xlId)
  118 + $sd: DateTime() from $lr.ttInfoMapLoop_temp.keySet()
  119 + then
  120 + // 当天时刻表只取第一张 TODO:
  121 + Collection col = (Collection) $lr.getTtInfoMapLoop_temp().get($sd);
  122 + Iterator iter = col.iterator();
  123 + TTInfoResult_output ttInfo_result = (TTInfoResult_output) iter.next();
  124 + $lr.getTtInfoMapLoop().put($sd, ttInfo_result);
  125 +
  126 + // 总共使用的时刻表
  127 + $lr.getTtInfoMap().put(ttInfo_result.getTtInfoId(), ttInfo_result);
  128 +
  129 + update($lr);
  130 +
  131 +// log.info("calcu_step2_Loop_result");
  132 +end
  133 +
  134 +//-------------------- 第二阶段、将时刻表班次,车辆配置,人员配置信息载入 -----------------//
  135 +
  136 +//--------------- 车辆配置信息载入 -------------//
  137 +declare CarConfig_Wrap
  138 + id: String // 车辆配置id(cast字符串-方便比较)
  139 +
  140 + self: CarConfigInfo // 原始数据
  141 +end
  142 +
  143 +rule "calcu_CarConfig_Wrap"
  144 + salience 800
  145 + when
  146 + $lr: Loop_result($xlId: xlId)
  147 + $ccf: CarConfigInfo() from carConfigInfoRepository.findByXlId(Integer.parseInt($xlId))
  148 + then
  149 + CarConfig_Wrap carConfig_wrap = new CarConfig_Wrap();
  150 + carConfig_wrap.setId(String.valueOf($ccf.getId()));
  151 + carConfig_wrap.setSelf($ccf);
  152 +
  153 + insert(carConfig_wrap);
  154 +
  155 +// log.info("calcu_CarConfig_Wrap");
  156 +end
  157 +
  158 +//--------------- 人员配置信息载入 --------------//
  159 +declare EmployeeConfig_Wrap
  160 + id: String // 人员配置id(cast字符串-方便比较)
  161 +
  162 + self: EmployeeConfigInfo // 原始数据
  163 +end
  164 +
  165 +rule "calcu_EmployeeConfig_Wrap"
  166 + salience 800
  167 + when
  168 + $lr: Loop_result($xlId: xlId)
  169 + $eci: EmployeeConfigInfo() from employeeConfigInfoRepository.findByXlId(Integer.parseInt($xlId))
  170 + then
  171 + EmployeeConfig_Wrap employeeConfig_wrap = new EmployeeConfig_Wrap();
  172 + employeeConfig_wrap.setId(String.valueOf($eci.getId()));
  173 + employeeConfig_wrap.setSelf($eci);
  174 +
  175 + insert(employeeConfig_wrap);
  176 +
  177 +// log.info("calcu_EmployeeConfig_Wrap");
  178 +end
  179 +
  180 +//----------------- 时刻表班次信息载入 -----------------//
  181 +declare TTInfo_gid_stat
  182 + xlId: String // 线路id(cast字符串-方便比较)
  183 + ttInfoId: String // 时刻表id(cast字符串-方便比较)
  184 + gid: String // 路牌id(cast字符串-方便比较)
  185 +
  186 + maxFcno: Integer // 最大发车顺序号
  187 +
  188 + fbTime: LocalTime // 分班时间
  189 +end
  190 +
  191 +rule "calcu_TTInfo_gid_stat"
  192 + salience 800
  193 + when
  194 + $lr: Loop_result($xlId: xlId)
  195 + $ttInfoId: String() from $lr.getTtInfoMap().keySet()
  196 + $gids: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidscount($ttd))
  197 + $gid: String() from $gids
  198 + $fbtime_str: String() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbtime($ttd))
  199 + $maxfcno: Double() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), max($ttd.getFcno()))
  200 + then
  201 + TTInfo_gid_stat ttInfo_gid_stat = new TTInfo_gid_stat();
  202 + ttInfo_gid_stat.setXlId($xlId);
  203 + ttInfo_gid_stat.setTtInfoId($ttInfoId);
  204 + ttInfo_gid_stat.setGid($gid);
  205 +
  206 + ttInfo_gid_stat.setMaxFcno($maxfcno.intValue());
  207 + ttInfo_gid_stat.setFbTime(fcsjTime($fbtime_str));
  208 +
  209 + insert(ttInfo_gid_stat);
  210 +
  211 +// log.info("xlid={},ttid={},gid={},maxfcno={},fbtime={}",
  212 +// $xlId, $ttInfoId, $gid, ttInfo_gid_stat.getMaxFcno(), ttInfo_gid_stat.getFbTime());
  213 +
  214 +end
  215 +
  216 +declare TTInfoDetail_Wrap
  217 + xlId: String // 线路id(cast字符串-方便比较)
  218 + ttInfoId: String // 时刻表id(cast字符串-方便比较)
  219 + gid: String // 路牌id(cast字符串-方便比较)
  220 +
  221 + isFirstBc: Boolean = false // 是否是当前路牌的第一个班次
  222 + isLastBc: Boolean = false // 是否是当前路牌的最后一个班次
  223 + isFb: Boolean = false // 是否分班
  224 +
  225 + self: TTInfoDetail // 原始数据
  226 +end
  227 +
  228 +rule "calcu_TTInfoDetail_Wrap"
  229 + salience 800
  230 + when
  231 + $lr: Loop_result($xlId: xlId)
  232 + $ttInfoId: String() from $lr.getTtInfoMap().keySet()
  233 + $ttInfoStat: TTInfo_gid_stat(
  234 + ttInfoId == $ttInfoId,
  235 + $gid: gid, $maxFcno: maxFcno)
  236 + $ttInfoDetail: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId))
  237 + then
  238 + TTInfoDetail_Wrap ttInfoDetail_wrap = new TTInfoDetail_Wrap();
  239 + ttInfoDetail_wrap.setXlId($xlId);
  240 + ttInfoDetail_wrap.setTtInfoId($ttInfoId);
  241 + ttInfoDetail_wrap.setGid($gid);
  242 + ttInfoDetail_wrap.setIsFirstBc(1 == $ttInfoDetail.getFcno());
  243 + ttInfoDetail_wrap.setIsLastBc($maxFcno == $ttInfoDetail.getFcno());
  244 +
  245 + LocalTime fcsj = fcsjTime($ttInfoDetail.getFcsj());
  246 + LocalTime fbsj = $ttInfoStat.getFbTime();
  247 + ttInfoDetail_wrap.setIsFb(fbsj == null ? false : (fcsj.isEqual(fbsj) || fcsj.isAfter(fbsj)));
  248 +
  249 + ttInfoDetail_wrap.setSelf($ttInfoDetail);
  250 +
  251 + insert(ttInfoDetail_wrap);
  252 +
  253 +// log.info("xlid={},ttid={},gid={},isFirstBc={},isLastBc={},isFb={},fcsj={}",
  254 +// $xlId, $ttInfoId, $gid,
  255 +// ttInfoDetail_wrap.getIsFirstBc(),
  256 +// ttInfoDetail_wrap.getIsLastBc(),
  257 +// ttInfoDetail_wrap.getIsFb(),
  258 +// $ttInfoDetail.getFcsj());
  259 +end
  260 +
  261 +//-------------------- 第三阶段、合并计算SchedulePlanInfo -----------------//
  262 +
  263 +rule "Calcu_SchedulePlanInfo"
  264 + salience 600
  265 + when
  266 + $param: PlanCalcuParam_input($xlId: xlId)
  267 + $lr: Loop_result(xlId == $xlId)
  268 + $sro: ScheduleResult_output($sd: sd, $gid: guideboardId) from $lr.getRuleLoop()
  269 + CarConfig_Wrap(id == $sro.carConfigId, $cc: self)
  270 + TTInfoDetail_Wrap(
  271 + ttInfoId == ttInfoId_sd($lr.getTtInfoMapLoop(), $sd),
  272 + gid == $gid,
  273 + $isFb: isFb, $isFirstBc: isFirstBc, $isLastBc: isLastBc,
  274 + $ttInfoDetail: self
  275 + )
  276 + then
  277 + // 线路
  278 + Line xl = lineRepository.findOne(Integer.parseInt($xlId));
  279 +
  280 + SchedulePlanInfo schedulePlanInfo = new SchedulePlanInfo(
  281 + xl,
  282 + $sro,
  283 + $ttInfoDetail,
  284 + $isFb,
  285 + $cc,
  286 + ecList(employeeConfigInfoRepository, $sro.getEmployeeConfigId()),
  287 + $param.getSchedulePlan(),
  288 + $isFirstBc,
  289 + $isLastBc
  290 + );
  291 +
  292 + // 获取公司,分公司信息
  293 + String gsbm = xl.getCompany();
  294 + String fgsbm = xl.getBrancheCompany();
  295 + Business gs = null;
  296 + Business fgs = null;
  297 +
  298 + if (StringUtils.isNotEmpty(gsbm)) {
  299 + Iterator<Business> businessIterator1 = businessRepository.findByBusinessCode(gsbm).iterator();
  300 + if (businessIterator1.hasNext()) {
  301 + gs = (Business) businessIterator1.next();
  302 + }
  303 + }
  304 + if (StringUtils.isNotEmpty(gsbm) && StringUtils.isNotEmpty(fgsbm)) {
  305 + Iterator<Business> businessIterator2 = businessRepository.findByUpCodeAndBusinessCode(gsbm, fgsbm).iterator();
  306 + if (businessIterator2.hasNext()) {
  307 + fgs = (Business) businessIterator2.next();
  308 + }
  309 + }
  310 +
  311 + if (gs != null) {
  312 + schedulePlanInfo.setGsBm(gs.getBusinessCode());
  313 + schedulePlanInfo.setGsName(gs.getBusinessName());
  314 + }
  315 + if (fgs != null) {
  316 + schedulePlanInfo.setFgsBm(fgs.getBusinessCode());
  317 + schedulePlanInfo.setFgsName(fgs.getBusinessName());
  318 + }
  319 +
  320 + // 操作人,操作时间
  321 + schedulePlanInfo.setCreateBy($param.getSchedulePlan().getCreateBy());
  322 + schedulePlanInfo.setCreateDate($param.getSchedulePlan().getCreateDate());
  323 + schedulePlanInfo.setUpdateBy($param.getSchedulePlan().getUpdateBy());
  324 + schedulePlanInfo.setUpdateDate($param.getSchedulePlan().getUpdateDate());
  325 +
  326 + // result 输出
  327 + planResult.getSchedulePlanInfos().add(schedulePlanInfo);
  328 +
  329 + log.info("gid={},ecid={},ttInfoId={}",
  330 + $gid, ecList(employeeConfigInfoRepository, $sro.getEmployeeConfigId()),
  331 + ttInfoId_sd($lr.getTtInfoMapLoop(), $sd));
  332 +
  333 +end
  334 +
  335 +
  336 +
  337 +
  338 +
  339 +
  340 +
  341 +
  342 +
  343 +
  344 +
  345 +
  346 +
  347 +
  348 +
src/main/resources/rules/plan.drl
@@ -69,6 +69,34 @@ function String ttInfoId_sd(Map map, DateTime sd) { @@ -69,6 +69,34 @@ function String ttInfoId_sd(Map map, DateTime sd) {
69 return ttInfoResult_output.getTtInfoId(); 69 return ttInfoResult_output.getTtInfoId();
70 } 70 }
71 71
  72 +function Map gsMap(List gses) {
  73 + Map gsMap = new HashMap();
  74 + for (int i = 0; i < gses.size(); i++) {
  75 + Business gs = (Business) gses.get(i);
  76 + if (StringUtils.isNotEmpty(gs.getBusinessCode())) {
  77 + if ("88".equals(gs.getUpCode())) { // 浦东公交
  78 + gsMap.put(gs.getBusinessCode(), gs);
  79 + }
  80 + if (gs.getBusinessCode().equals(gs.getUpCode())) { // 闵行,青浦
  81 + gsMap.put(gs.getBusinessCode(), gs);
  82 + }
  83 + }
  84 + }
  85 + return gsMap;
  86 +}
  87 +
  88 +function Map fgsMap(List gses) {
  89 + // 这里简单将 businessCode和upCode合并
  90 + Map fgsMap = new HashMap();
  91 + for (int i = 0; i < gses.size(); i++) {
  92 + Business gs = (Business) gses.get(i);
  93 + if (StringUtils.isNotEmpty(gs.getBusinessCode()) && StringUtils.isNotEmpty(gs.getUpCode())) {
  94 + fgsMap.put(gs.getUpCode() + "_" + gs.getBusinessCode(), gs);
  95 + }
  96 + }
  97 + return fgsMap;
  98 +}
  99 +
72 /* 100 /*
73 规则说明: 101 规则说明:
74 根据循环规则输出,时刻表选择规则输出,组合计算排班明细 102 根据循环规则输出,时刻表选择规则输出,组合计算排班明细
@@ -106,7 +134,7 @@ rule &quot;calcu_step1_Loop_result&quot; @@ -106,7 +134,7 @@ rule &quot;calcu_step1_Loop_result&quot;
106 134
107 insert(loop_result); 135 insert(loop_result);
108 136
109 - log.info("calcu_step1_Loop_result"); 137 +// log.info("calcu_step1_Loop_result");
110 end 138 end
111 139
112 rule "calcu_step2_loop_result" 140 rule "calcu_step2_loop_result"
@@ -128,51 +156,61 @@ rule &quot;calcu_step2_loop_result&quot; @@ -128,51 +156,61 @@ rule &quot;calcu_step2_loop_result&quot;
128 156
129 update($lr); 157 update($lr);
130 158
131 - log.info("calcu_step2_Loop_result"); 159 +// log.info("calcu_step2_Loop_result");
132 end 160 end
133 161
134 //-------------------- 第二阶段、将时刻表班次,车辆配置,人员配置信息载入 -----------------// 162 //-------------------- 第二阶段、将时刻表班次,车辆配置,人员配置信息载入 -----------------//
135 163
136 //--------------- 车辆配置信息载入 -------------// 164 //--------------- 车辆配置信息载入 -------------//
137 -declare CarConfig_Wrap  
138 - id: String // 车辆配置id(cast字符串-方便比较)  
139 -  
140 - self: CarConfigInfo // 原始数据 165 +declare CarConfig_Wraps
  166 + xlId: String // 线路Id
  167 + ccMap: Map // 车辆配置Map Map<id, CarConfigInfo>
141 end 168 end
142 169
143 -rule "calcu_CarConfig_Wrap" 170 +rule "calcu_CarConfig_Wraps"
144 salience 800 171 salience 800
145 when 172 when
146 $lr: Loop_result($xlId: xlId) 173 $lr: Loop_result($xlId: xlId)
147 - $ccf: CarConfigInfo() from carConfigInfoRepository.findByXlId(Integer.parseInt($xlId))  
148 then 174 then
149 - CarConfig_Wrap carConfig_wrap = new CarConfig_Wrap();  
150 - carConfig_wrap.setId(String.valueOf($ccf.getId()));  
151 - carConfig_wrap.setSelf($ccf); 175 + List carConfigInfos = carConfigInfoRepository.findByXlId(Integer.parseInt($xlId));
  176 +
  177 + CarConfig_Wraps carConfig_wraps = new CarConfig_Wraps();
  178 + carConfig_wraps.setXlId($xlId);
  179 + carConfig_wraps.setCcMap(new HashMap());
  180 +
  181 + for (int i = 0; i < carConfigInfos.size(); i++) {
  182 + CarConfigInfo carConfigInfo = (CarConfigInfo) carConfigInfos.get(i);
  183 + carConfig_wraps.getCcMap().put(carConfigInfo.getId().toString(), carConfigInfo);
  184 + }
152 185
153 - insert(carConfig_wrap); 186 + insert(carConfig_wraps);
154 187
155 log.info("calcu_CarConfig_Wrap"); 188 log.info("calcu_CarConfig_Wrap");
156 end 189 end
157 190
158 //--------------- 人员配置信息载入 --------------// 191 //--------------- 人员配置信息载入 --------------//
159 -declare EmployeeConfig_Wrap  
160 - id: String // 人员配置id(cast字符串-方便比较)  
161 -  
162 - self: EmployeeConfigInfo // 原始数据 192 +declare EmployeeConfig_Wraps
  193 + xlId: String // 线路Id
  194 + ecMap: Map // 人员配置Map Map<id, EmployeeConfigInfo>
163 end 195 end
164 196
165 -rule "calcu_EmployeeConfig_Wrap" 197 +rule "calcu_EmployeeConfig_Wraps"
166 salience 800 198 salience 800
167 when 199 when
168 $lr: Loop_result($xlId: xlId) 200 $lr: Loop_result($xlId: xlId)
169 - $eci: EmployeeConfigInfo() from employeeConfigInfoRepository.findByXlId(Integer.parseInt($xlId))  
170 then 201 then
171 - EmployeeConfig_Wrap employeeConfig_wrap = new EmployeeConfig_Wrap();  
172 - employeeConfig_wrap.setId(String.valueOf($eci.getId()));  
173 - employeeConfig_wrap.setSelf($eci); 202 + List employeeConfigInfos = employeeConfigInfoRepository.findByXlId(Integer.parseInt($xlId));
  203 +
  204 + EmployeeConfig_Wraps employeeConfig_wraps = new EmployeeConfig_Wraps();
  205 + employeeConfig_wraps.setXlId($xlId);
  206 + employeeConfig_wraps.setEcMap(new HashMap());
  207 +
  208 + for (int i = 0; i < employeeConfigInfos.size(); i++) {
  209 + EmployeeConfigInfo employeeConfigInfo = (EmployeeConfigInfo) employeeConfigInfos.get(i);
  210 + employeeConfig_wraps.getEcMap().put(employeeConfigInfo.getId().toString(), employeeConfigInfo);
  211 + }
174 212
175 - insert(employeeConfig_wrap); 213 + insert(employeeConfig_wraps);
176 214
177 log.info("calcu_EmployeeConfig_Wrap"); 215 log.info("calcu_EmployeeConfig_Wrap");
178 end 216 end
@@ -208,16 +246,12 @@ rule &quot;calcu_TTInfo_gid_stat&quot; @@ -208,16 +246,12 @@ rule &quot;calcu_TTInfo_gid_stat&quot;
208 246
209 insert(ttInfo_gid_stat); 247 insert(ttInfo_gid_stat);
210 248
211 - log.info("xlid={},ttid={},gid={},maxfcno={},fbtime={}",  
212 - $xlId, $ttInfoId, $gid, ttInfo_gid_stat.getMaxFcno(), ttInfo_gid_stat.getFbTime()); 249 +// log.info("xlid={},ttid={},gid={},maxfcno={},fbtime={}",
  250 +// $xlId, $ttInfoId, $gid, ttInfo_gid_stat.getMaxFcno(), ttInfo_gid_stat.getFbTime());
213 251
214 end 252 end
215 253
216 declare TTInfoDetail_Wrap 254 declare TTInfoDetail_Wrap
217 - xlId: String // 线路id(cast字符串-方便比较)  
218 - ttInfoId: String // 时刻表id(cast字符串-方便比较)  
219 - gid: String // 路牌id(cast字符串-方便比较)  
220 -  
221 isFirstBc: Boolean = false // 是否是当前路牌的第一个班次 255 isFirstBc: Boolean = false // 是否是当前路牌的第一个班次
222 isLastBc: Boolean = false // 是否是当前路牌的最后一个班次 256 isLastBc: Boolean = false // 是否是当前路牌的最后一个班次
223 isFb: Boolean = false // 是否分班 257 isFb: Boolean = false // 是否分班
@@ -225,110 +259,193 @@ declare TTInfoDetail_Wrap @@ -225,110 +259,193 @@ declare TTInfoDetail_Wrap
225 self: TTInfoDetail // 原始数据 259 self: TTInfoDetail // 原始数据
226 end 260 end
227 261
228 -rule "calcu_TTInfoDetail_Wrap"  
229 - salience 800 262 +declare TTInfoDetail_Wraps
  263 + xlId: String // 线路id(cast字符串-方便比较)
  264 + ttInfoId: String // 时刻表id(cast字符串-方便比较)
  265 +
  266 + detailsMap: Map // 明细Map,Map<路牌id, List<TTInfoDetail_Wrap>>
  267 +end
  268 +
  269 +rule "calcu_TTInfoDetail_Wraps"
  270 + salience 700
230 when 271 when
231 $lr: Loop_result($xlId: xlId) 272 $lr: Loop_result($xlId: xlId)
232 $ttInfoId: String() from $lr.getTtInfoMap().keySet() 273 $ttInfoId: String() from $lr.getTtInfoMap().keySet()
233 - $ttInfoStat: TTInfo_gid_stat(  
234 - ttInfoId == $ttInfoId,  
235 - $gid: gid, $maxFcno: maxFcno)  
236 - $ttInfoDetail: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)) 274 + $ttInfoStatList: List(size > 0) from collect (TTInfo_gid_stat(ttInfoId == $ttInfoId))
237 then 275 then
238 - TTInfoDetail_Wrap ttInfoDetail_wrap = new TTInfoDetail_Wrap();  
239 - ttInfoDetail_wrap.setXlId($xlId);  
240 - ttInfoDetail_wrap.setTtInfoId($ttInfoId);  
241 - ttInfoDetail_wrap.setGid($gid);  
242 - ttInfoDetail_wrap.setIsFirstBc(1 == $ttInfoDetail.getFcno());  
243 - ttInfoDetail_wrap.setIsLastBc($maxFcno == $ttInfoDetail.getFcno());  
244 -  
245 - LocalTime fcsj = fcsjTime($ttInfoDetail.getFcsj());  
246 - LocalTime fbsj = $ttInfoStat.getFbTime();  
247 - ttInfoDetail_wrap.setIsFb(fbsj == null ? false : (fcsj.isEqual(fbsj) || fcsj.isAfter(fbsj)));  
248 -  
249 - ttInfoDetail_wrap.setSelf($ttInfoDetail);  
250 -  
251 - insert(ttInfoDetail_wrap);  
252 -  
253 - log.info("xlid={},ttid={},gid={},isFirstBc={},isLastBc={},isFb={},fcsj={}",  
254 - $xlId, $ttInfoId, $gid,  
255 - ttInfoDetail_wrap.getIsFirstBc(),  
256 - ttInfoDetail_wrap.getIsLastBc(),  
257 - ttInfoDetail_wrap.getIsFb(),  
258 - $ttInfoDetail.getFcsj()); 276 + TTInfoDetail_Wraps ttInfoDetail_wraps = new TTInfoDetail_Wraps();
  277 + ttInfoDetail_wraps.setXlId($xlId);
  278 + ttInfoDetail_wraps.setTtInfoId($ttInfoId);
  279 + ttInfoDetail_wraps.setDetailsMap(new HashMap());
  280 +
  281 + // 将list的形式变成 Map<路牌id, TTInfo_gid_stat>
  282 + Map statMap = new HashMap();
  283 + for (int i = 0; i < $ttInfoStatList.size(); i++) {
  284 + TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) $ttInfoStatList.get(i);
  285 + statMap.put(ttInfo_gid_stat.getGid(), ttInfo_gid_stat);
  286 + }
  287 +
  288 + // 迭代ttinfodetail,拼装 TTInfoDetail_Wraps
  289 + List detaillist = tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId));
  290 + for (int j = 0; j < detaillist.size(); j++) {
  291 + TTInfoDetail ttInfoDetail = (TTInfoDetail) detaillist.get(j);
  292 + String gid = String.valueOf(ttInfoDetail.getLp().getId());
  293 +
  294 + if (ttInfoDetail_wraps.getDetailsMap().get(gid) == null) {
  295 + ttInfoDetail_wraps.getDetailsMap().put(gid, new ArrayList());
  296 + }
  297 +
  298 + // 获取stat
  299 + TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) statMap.get(gid);
  300 +
  301 + TTInfoDetail_Wrap ttInfoDetail_wrap = new TTInfoDetail_Wrap();
  302 + ttInfoDetail_wrap.setIsFirstBc(1 == ttInfoDetail.getFcno());
  303 + ttInfoDetail_wrap.setIsLastBc(ttInfo_gid_stat.getMaxFcno() == ttInfoDetail.getFcno());
  304 +
  305 + LocalTime fcsj = fcsjTime(ttInfoDetail.getFcsj());
  306 + LocalTime fbsj = ttInfo_gid_stat.getFbTime();
  307 + ttInfoDetail_wrap.setIsFb(fbsj == null ? false : (fcsj.isEqual(fbsj) || fcsj.isAfter(fbsj)));
  308 +
  309 + ttInfoDetail_wrap.setSelf(ttInfoDetail);
  310 +
  311 + ((List) ttInfoDetail_wraps.getDetailsMap().get(gid)).add(ttInfoDetail_wrap);
  312 +
  313 + }
  314 +
  315 +
  316 + insert(ttInfoDetail_wraps);
  317 +
  318 + log.info("xlid={}, ttinfoid={}, lpstatCount={}, detailLpCount={}",
  319 + $xlId, $ttInfoId, $ttInfoStatList.size(), ttInfoDetail_wraps.getDetailsMap().keySet().size());
  320 +
  321 +
  322 +end
  323 +
  324 +declare TTInfoDetail_Wraps_map
  325 + xlId: String // 线路id(cast字符串-方便比较)
  326 +
  327 + wrapsMap: Map // 明细Map,Map<时刻表Id, TTInfoDetail_Wraps>
  328 +end
  329 +
  330 +rule "calcu_TTInfoDetail_Wraps_toMap"
  331 + salience 600
  332 + when
  333 + $lr: Loop_result($xlId: xlId)
  334 + $wrapsList: List(size > 0) from collect (TTInfoDetail_Wraps(xlId == $xlId))
  335 + then
  336 + // 转换成Map
  337 + TTInfoDetail_Wraps_map all = new TTInfoDetail_Wraps_map();
  338 + all.setXlId($xlId);
  339 + all.setWrapsMap(new HashMap());
  340 +
  341 + for (int i = 0; i < $wrapsList.size(); i++) {
  342 + TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $wrapsList.get(i);
  343 + all.getWrapsMap().put(ttInfoDetail_wraps.getTtInfoId(), ttInfoDetail_wraps);
  344 + }
  345 +
  346 + insert(all);
259 end 347 end
260 348
  349 +
  350 +
  351 +
261 //-------------------- 第三阶段、合并计算SchedulePlanInfo -----------------// 352 //-------------------- 第三阶段、合并计算SchedulePlanInfo -----------------//
262 353
  354 +
263 rule "Calcu_SchedulePlanInfo" 355 rule "Calcu_SchedulePlanInfo"
264 - salience 600 356 + salience 500
265 when 357 when
266 $param: PlanCalcuParam_input($xlId: xlId) 358 $param: PlanCalcuParam_input($xlId: xlId)
267 $lr: Loop_result(xlId == $xlId) 359 $lr: Loop_result(xlId == $xlId)
268 - $sro: ScheduleResult_output($sd: sd, $gid: guideboardId) from $lr.getRuleLoop()  
269 - CarConfig_Wrap(id == $sro.carConfigId, $cc: self)  
270 - TTInfoDetail_Wrap(  
271 - ttInfoId == ttInfoId_sd($lr.getTtInfoMapLoop(), $sd),  
272 - gid == $gid,  
273 - $isFb: isFb, $isFirstBc: isFirstBc, $isLastBc: isLastBc,  
274 - $ttInfoDetail: self  
275 - ) 360 + $ccs: CarConfig_Wraps(xlId == $xlId)
  361 + $ecs: EmployeeConfig_Wraps(xlId == $xlId)
  362 + $tts: TTInfoDetail_Wraps_map(xlId == $xlId)
276 then 363 then
277 // 线路 364 // 线路
278 Line xl = lineRepository.findOne(Integer.parseInt($xlId)); 365 Line xl = lineRepository.findOne(Integer.parseInt($xlId));
279 366
280 - SchedulePlanInfo schedulePlanInfo = new SchedulePlanInfo(  
281 - xl,  
282 - $sro,  
283 - $ttInfoDetail,  
284 - $isFb,  
285 - $cc,  
286 - ecList(employeeConfigInfoRepository, $sro.getEmployeeConfigId()),  
287 - $param.getSchedulePlan(),  
288 - $isFirstBc,  
289 - $isLastBc  
290 - );  
291 -  
292 - // 获取公司,分公司信息  
293 - String gsbm = xl.getCompany();  
294 - String fgsbm = xl.getBrancheCompany();  
295 - Business gs = null;  
296 - Business fgs = null;  
297 -  
298 - if (StringUtils.isNotEmpty(gsbm)) {  
299 - Iterator<Business> businessIterator1 = businessRepository.findByBusinessCode(gsbm).iterator();  
300 - if (businessIterator1.hasNext()) {  
301 - gs = (Business) businessIterator1.next(); 367 + // 查找公司
  368 + List gses = (List) businessRepository.findAll();
  369 + // 构造公司代码对应map
  370 + Map gsMap = gsMap(gses);
  371 + // 构造分公司对应的map
  372 + Map fgsMap = fgsMap(gses);
  373 +
  374 + for (int i = 0; i < $lr.getRuleLoop().size(); i++) {
  375 + ScheduleResult_output sro = (ScheduleResult_output) $lr.getRuleLoop().get(i);
  376 +
  377 + // 日期
  378 + DateTime sd = sro.getSd();
  379 + // 路牌
  380 + String gid = sro.getGuideboardId();
  381 + // 车辆配置
  382 + CarConfigInfo carConfigInfo = (CarConfigInfo) $ccs.getCcMap().get(sro.getCarConfigId());
  383 + // 人员配置
  384 + List eclist = ecList(employeeConfigInfoRepository, sro.getEmployeeConfigId());
  385 +
  386 + // 时刻表id
  387 + String ttInfoId = ttInfoId_sd($lr.getTtInfoMapLoop(), sd);
  388 + TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $tts.getWrapsMap().get(ttInfoId);
  389 + List detaillist = (List) ttInfoDetail_wraps.getDetailsMap().get(gid);
  390 +
  391 + if (detaillist == null) {
  392 + // 这里翻到的路牌时刻表里可能没有,
  393 + // 因为没有考虑翻班格式(就是做几休几)
  394 + // 所有翻班格式全由时刻表决定,即时刻表有的路牌就做,没有不做
  395 + continue;
302 } 396 }
303 - }  
304 - if (StringUtils.isNotEmpty(gsbm) && StringUtils.isNotEmpty(fgsbm)) {  
305 - Iterator<Business> businessIterator2 = businessRepository.findByUpCodeAndBusinessCode(gsbm, fgsbm).iterator();  
306 - if (businessIterator2.hasNext()) {  
307 - fgs = (Business) businessIterator2.next();  
308 - }  
309 - }  
310 397
311 - if (gs != null) {  
312 - schedulePlanInfo.setGsBm(gs.getBusinessCode());  
313 - schedulePlanInfo.setGsName(gs.getBusinessName());  
314 - }  
315 - if (fgs != null) {  
316 - schedulePlanInfo.setFgsBm(fgs.getBusinessCode());  
317 - schedulePlanInfo.setFgsName(fgs.getBusinessName());  
318 - } 398 + for (int j = 0; j < detaillist.size(); j++) {
  399 + TTInfoDetail_Wrap wrap = (TTInfoDetail_Wrap) detaillist.get(j);
  400 +
  401 + SchedulePlanInfo schedulePlanInfo = new SchedulePlanInfo(
  402 + xl,
  403 + sro,
  404 + wrap.getSelf(),
  405 + wrap.getIsFb(),
  406 + carConfigInfo,
  407 + eclist,
  408 + $param.getSchedulePlan(),
  409 + wrap.getIsFirstBc(),
  410 + wrap.getIsLastBc()
  411 + );
  412 +
  413 + // 获取公司,分公司信息
  414 + String gsbm = xl.getCompany();
  415 + String fgsbm = xl.getBrancheCompany();
  416 + Business gs = null;
  417 + Business fgs = null;
  418 +
  419 + if (StringUtils.isNotEmpty(gsbm)) {
  420 + gs = (Business) gsMap.get(gsbm);
  421 + }
  422 + if (StringUtils.isNotEmpty(gsbm) && StringUtils.isNotEmpty(fgsbm)) {
  423 + fgs = (Business) fgsMap.get(gsbm + "_" + fgsbm);
  424 + }
  425 +
  426 + if (gs != null) {
  427 + schedulePlanInfo.setGsBm(gs.getBusinessCode());
  428 + schedulePlanInfo.setGsName(gs.getBusinessName());
  429 + }
  430 + if (fgs != null) {
  431 + schedulePlanInfo.setFgsBm(fgs.getBusinessCode());
  432 + schedulePlanInfo.setFgsName(fgs.getBusinessName());
  433 + }
  434 +
  435 + // 操作人,操作时间
  436 + schedulePlanInfo.setCreateBy($param.getSchedulePlan().getCreateBy());
  437 + schedulePlanInfo.setCreateDate($param.getSchedulePlan().getCreateDate());
  438 + schedulePlanInfo.setUpdateBy($param.getSchedulePlan().getUpdateBy());
  439 + schedulePlanInfo.setUpdateDate($param.getSchedulePlan().getUpdateDate());
  440 +
  441 + // result 输出
  442 + planResult.getSchedulePlanInfos().add(schedulePlanInfo);
319 443
320 - // 操作人,操作时间  
321 - schedulePlanInfo.setCreateBy($param.getSchedulePlan().getCreateBy());  
322 - schedulePlanInfo.setCreateDate($param.getSchedulePlan().getCreateDate());  
323 - schedulePlanInfo.setUpdateBy($param.getSchedulePlan().getUpdateBy());  
324 - schedulePlanInfo.setUpdateDate($param.getSchedulePlan().getUpdateDate()); 444 + }
325 445
326 - // result 输出  
327 - planResult.getSchedulePlanInfos().add(schedulePlanInfo); 446 + }
328 447
329 - log.info("gid={},ecid={},ttInfoId={}",  
330 - $gid, ecList(employeeConfigInfoRepository, $sro.getEmployeeConfigId()),  
331 - ttInfoId_sd($lr.getTtInfoMapLoop(), $sd)); 448 + log.info("xlid={} plan ok!", $xlId);
332 449
333 end 450 end
334 451
@@ -345,4 +462,3 @@ end @@ -345,4 +462,3 @@ end
345 462
346 463
347 464
348 -  
src/main/resources/static/real_control_v2/css/line_schedule_table.css 0 → 100644
  1 +
  2 +.electron-waybill-table{
  3 + height: 100%;
  4 +}
  5 +
  6 +.electron-waybill-table dl{
  7 + font-size: 0;
  8 + white-space: nowrap;
  9 + overflow: hidden;
  10 + text-overflow: ellipsis;
  11 +}
  12 +
  13 +.electron-waybill-table dt,
  14 +.electron-waybill-table dd{
  15 + display: inline-block;
  16 + font-size: 14px;
  17 + white-space: nowrap;
  18 + overflow: hidden;
  19 + text-overflow: ellipsis;
  20 + border-right: 1px solid;
  21 + text-indent: 5px;
  22 + height: 37px;
  23 +}
  24 +.electron-waybill-table dt:nth-of-type(1),
  25 +.electron-waybill-table dd:nth-of-type(1){
  26 + width: 50px;
  27 + text-align: center;
  28 +}
  29 +.electron-waybill-table dt:nth-of-type(2),
  30 +.electron-waybill-table dd:nth-of-type(2){
  31 + width: 55px;
  32 + text-align: center;
  33 +}
  34 +.electron-waybill-table dt:nth-of-type(3),
  35 +.electron-waybill-table dd:nth-of-type(3){
  36 + width: calc(2% + 66px);
  37 +}
  38 +.electron-waybill-table dt:nth-of-type(4),
  39 +.electron-waybill-table dd:nth-of-type(4){
  40 + width: 10%;
  41 +}
  42 +.electron-waybill-table dt:nth-of-type(5),
  43 +.electron-waybill-table dd:nth-of-type(5){
  44 + width: 10%;
  45 +}
  46 +.electron-waybill-table dt:nth-of-type(6),
  47 +.electron-waybill-table dd:nth-of-type(6){
  48 + width: calc(13% + 18px);
  49 +}
  50 +.electron-waybill-table dt:nth-of-type(7),
  51 +.electron-waybill-table dd:nth-of-type(7){
  52 + width: calc(10% + 10px);
  53 +}
  54 +.electron-waybill-table dt:nth-of-type(8),
  55 +.electron-waybill-table dd:nth-of-type(8){
  56 + width: calc(51% - 233px);
  57 +}
  58 +.electron-waybill-table dt:nth-of-type(9),
  59 +.electron-waybill-table dd:nth-of-type(9){
  60 + width: 65px;
  61 +}
  62 +
  63 +
  64 +
  65 +.electron-waybill-table .electron-waybill-header{
  66 + color: #cfd2da;
  67 +}
  68 +
  69 +.electron-waybill-table .electron-waybill-header dl{
  70 + border-bottom: 1px solid #979494;
  71 + height: 38px;
  72 + line-height: 38px;
  73 + margin-bottom: 0;
  74 + margin-top: 0;
  75 +}
  76 +.electron-waybill-table .electron-waybill-header dl dt{
  77 +
  78 +}
  79 +
  80 +
  81 +.electron-waybill-table .electron-waybill-body{
  82 + color: #cfd2da;
  83 + height: calc(100% - 39px);
  84 + overflow: hidden;
  85 + position: relative;
  86 +}
  87 +
  88 +.electron-waybill-table .electron-waybill-body dl{
  89 + height: 38px;
  90 + line-height: 38px;
  91 + margin-bottom: 0;
  92 + margin-top: 0;
  93 +}
  94 +
  95 +.electron-waybill-table .electron-waybill-body dl:nth-child(1n+2){
  96 + border-top: 1px solid;
  97 +}
  98 +
  99 +.electron-waybill-table .electron-waybill-body dl:last-child{
  100 + border-bottom: 1px solid;
  101 +}
  102 +
  103 +.electron-waybill-table dt,
  104 +.electron-waybill-table dd,
  105 +.electron-waybill-table .electron-waybill-body dl:nth-child(1n+2),
  106 +.electron-waybill-table .electron-waybill-body dl:last-child{
  107 + border-color: #363a44;
  108 +}
  109 +
  110 +.electron-waybill-table .electron-waybill-body dl:nth-child(odd){
  111 +
  112 +}
  113 +
  114 +.electron-waybill-table .electron-waybill-body dl:nth-child(even){
  115 + /*background: #434753;*/
  116 +}
  117 +
  118 +.electron-waybill-table .uk-badge{
  119 + padding: 0 1px 0 1px;
  120 + text-indent: 0;
  121 + font-family: 华文细黑;
  122 +}
  123 +
  124 +
  125 +
  126 +.electron-waybill-table .ps-container:hover > .ps-scrollbar-y-rail:hover,
  127 +.electron-waybill-table .ps-container.ps-in-scrolling.ps-y > .ps-scrollbar-y-rail{
  128 + background-color: #484848;
  129 +}
  130 +
  131 +.electron-waybill-table .ps-container:hover > .ps-scrollbar-y-rail:hover > .ps-scrollbar-y {
  132 + background-color: #fff;
  133 + }
0 \ No newline at end of file 134 \ No newline at end of file
src/main/resources/static/real_control_v2/css/main.css
@@ -1058,4 +1058,79 @@ span.late-badge { @@ -1058,4 +1058,79 @@ span.late-badge {
1058 1058
1059 dl.intimity span.late-badge{ 1059 dl.intimity span.late-badge{
1060 color: #fbfbfb; 1060 color: #fbfbfb;
1061 -}  
1062 \ No newline at end of file 1061 \ No newline at end of file
  1062 +}
  1063 +
  1064 +/** badge tooltip */
  1065 +.uk-badge.c_task:hover,
  1066 +.uk-badge.sch_region:hover{
  1067 + background-image: none;
  1068 + background: #38b3e1;
  1069 + border: 1px solid #7ebad1;
  1070 +}
  1071 +
  1072 +.uk-badge.out:hover{
  1073 + background-image: none;
  1074 + background: #8fc650;
  1075 + border: 1px solid #949f86;
  1076 +}
  1077 +
  1078 +.uk-badge.in:hover{
  1079 + background-image: none;
  1080 + background: #fabc64;
  1081 + border: 1px solid #a68c67;
  1082 +}
  1083 +
  1084 +.qtip.sch-badge-tip{
  1085 + max-width: 500px;
  1086 +}
  1087 +
  1088 +.tip_task_list {
  1089 + width: 460px;
  1090 + margin-bottom: -10px;
  1091 +}
  1092 +.tip_task_list dl{
  1093 + font-size: 0;
  1094 + border-bottom: 1px solid #e6e6e6;
  1095 + margin: 0;
  1096 +}
  1097 +.tip_task_list dl:last-child{
  1098 + border-bottom: none;
  1099 +}
  1100 +.tip_task_list dl dt,
  1101 +.tip_task_list dl dd{
  1102 + display: inline-block;
  1103 + font-size: 13px;
  1104 + white-space: nowrap;
  1105 + overflow: hidden;
  1106 + text-overflow: ellipsis;
  1107 + height: 24px;
  1108 + line-height: 24px;
  1109 +}
  1110 +
  1111 +.tip_task_list dl dt:nth-of-type(1), .tip_task_list dl dd:nth-of-type(1){
  1112 + width: 19%;
  1113 +}
  1114 +.tip_task_list dl dt:nth-of-type(2), .tip_task_list dl dd:nth-of-type(2){
  1115 + width: 12%;
  1116 +}
  1117 +.tip_task_list dl dt:nth-of-type(3), .tip_task_list dl dd:nth-of-type(3){
  1118 + width: 28%;
  1119 +}
  1120 +.tip_task_list dl dt:nth-of-type(4), .tip_task_list dl dd:nth-of-type(4){
  1121 + width: 28%;
  1122 +}
  1123 +.tip_task_list dl dt:nth-of-type(5), .tip_task_list dl dd:nth-of-type(5){
  1124 + width: 13%;
  1125 +}
  1126 +
  1127 +.tip_task_list dl.service{
  1128 + color: blue;
  1129 +}
  1130 +.tip_task_list dl.service.destroy{
  1131 + color: red;
  1132 +}
  1133 +
  1134 +.tip_task_list dl span{
  1135 + margin: 0;
  1136 + width: auto;
  1137 +}
src/main/resources/static/real_control_v2/fragments/line_schedule/badge_tooltip.html 0 → 100644
  1 +<div>
  2 + <script id="sch-table-task-tootip-temp" type="text/html">
  3 + <div class="tl-tip-panel">
  4 + <div class="tip_task_list">
  5 + <dl>
  6 + <dt>类型</dt>
  7 + <dt>里程</dt>
  8 + <dt>起点</dt>
  9 + <dt>终点</dt>
  10 + <dt>备注</dt>
  11 + </dl>
  12 + {{each tasks as t i}}
  13 + <dl class="{{t.mileageType}} {{if t.destroy}}destroy{{/if}}">
  14 + <dd>
  15 + {{if t.mileageType=="service"}}
  16 + 营运
  17 + {{else if t.mileageType=="empty"}}
  18 + 空驶
  19 + {{/if}}
  20 + {{if t.destroy}}
  21 + <span>(烂班)</span>
  22 + {{else if t.type2==2}}
  23 + <span>(进场)</span>
  24 + {{else if t.type2==3}}
  25 + <span>(出场)</span>
  26 + {{/if}}
  27 + </dd>
  28 + <dd>
  29 + {{t.mileage}}
  30 + </dd>
  31 + <dd title="{{t.startStationName}}">{{t.startStationName}}</dd>
  32 + <dd title="{{t.endStationName}}">{{t.endStationName}}</dd>
  33 + <dd title="{{t.remarks}}">{{t.remarks}}</dd>
  34 + </dl>
  35 + {{/each}}
  36 + </div>
  37 + </div>
  38 + </script>
  39 +
  40 +
  41 + <script id="sch-table-region-tootip-temp" type="text/html">
  42 + <div class="tl-tip-panel">
  43 + <div style="font-size: 13px;">
  44 + 由 {{qdzName}} 发往 {{zdzName}}
  45 + </div>
  46 + </div>
  47 + </script>
  48 +
  49 + <script id="sch-table-out-tootip-temp" type="text/html">
  50 + <div class="tl-tip-panel">
  51 + <div style="font-size: 13px;">
  52 + {{qdzName}} 出场至 {{zdzName}}
  53 + </div>
  54 + </div>
  55 + </script>
  56 +
  57 + <script id="sch-table-in-tootip-temp" type="text/html">
  58 + <div class="tl-tip-panel">
  59 + <div style="font-size: 13px;">
  60 + 进 {{zdzName}}
  61 + </div>
  62 + </div>
  63 + </script>
  64 +</div>
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task/add_sub_task_inpark.html
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 6
7 <div style="width: 100%;padding-left: 1%;"> 7 <div style="width: 100%;padding-left: 1%;">
8 <div class="sub-task-card"> 8 <div class="sub-task-card">
9 - <div class="uk-panel uk-panel-box uk-panel-box-primary"> 9 + <div class="uk-panel uk-panel-box uk-panel-box-primary twins_task_panel">
10 <div class="uk-panel-badge uk-badge">营运</div> 10 <div class="uk-panel-badge uk-badge">营运</div>
11 <h3 class="uk-panel-title">线路上站点间</h3> 11 <h3 class="uk-panel-title">线路上站点间</h3>
12 <form class="uk-form uk-form-horizontal inpark_form" service_form> 12 <form class="uk-form uk-form-horizontal inpark_form" service_form>
@@ -105,7 +105,7 @@ @@ -105,7 +105,7 @@
105 </div> 105 </div>
106 </div> 106 </div>
107 <div class="uk-width-7-10 pl5"> 107 <div class="uk-width-7-10 pl5">
108 - <select name="startStation" disabled></select> 108 + <select name="startStation" ></select>
109 </div> 109 </div>
110 </div> 110 </div>
111 <div class="uk-grid"> 111 <div class="uk-grid">
@@ -352,6 +352,9 @@ @@ -352,6 +352,9 @@
352 var e =$('#globalRemarks', modal); 352 var e =$('#globalRemarks', modal);
353 e.val(e.val() + $(this).val() + ','); 353 e.val(e.val() + $(this).val() + ',');
354 }); 354 });
  355 +
  356 + //根据主任务状态,复子任务
  357 + updateTwinsTaskBySch(sch);
355 }); 358 });
356 359
357 function allValidSuccess() { 360 function allValidSuccess() {
@@ -579,6 +582,22 @@ @@ -579,6 +582,22 @@
579 btmDrawer.data('name', id).data('url', url).trigger('drawer_show'); 582 btmDrawer.data('name', id).data('url', url).trigger('drawer_show');
580 } 583 }
581 } 584 }
  585 +
  586 +
  587 + function updateTwinsTaskBySch(sch) {
  588 + //主任务是烂班
  589 + if(sch.destroy){
  590 + serviceForm.prepend('<input type="hidden" name="destroy" value="true">');
  591 + $('[name=mileage]', serviceForm).val(sch.jhlcOrig).attr('disabled', 'disabled');
  592 + $('.twins_task_panel .uk-badge', modal).addClass('uk-badge-danger').text('烂班');
  593 + //终点禁选
  594 + $('select[name=endStation]', serviceForm).attr('disabled', 'disabled');
  595 + //开始结束时间禁选
  596 +
  597 + //空驶起点
  598 + $('select[name=startStation]', emptyForm).val(sch.qdzCode);
  599 + }
  600 + }
582 })(); 601 })();
583 </script> 602 </script>
584 </div> 603 </div>
585 \ No newline at end of file 604 \ No newline at end of file
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task/add_sub_task_oil.html
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 6
7 <div class="uk-grid"> 7 <div class="uk-grid">
8 <div class="uk-width-1-3"> 8 <div class="uk-width-1-3">
9 - <form class="uk-form uk-form-horizontal c_task_form"> 9 + <form class="uk-form uk-form-horizontal c_task_form twins_task_form">
10 <input type="hidden" name="type1" value="正常"> 10 <input type="hidden" name="type1" value="正常">
11 <input type="hidden" name="type2" value="1"> 11 <input type="hidden" name="type2" value="1">
12 <input type="hidden" name="mileageType" value="service"> 12 <input type="hidden" name="mileageType" value="service">
@@ -189,6 +189,7 @@ @@ -189,6 +189,7 @@
189 $(modal).on('init', function (e, data) { 189 $(modal).on('init', function (e, data) {
190 e.stopPropagation(); 190 e.stopPropagation();
191 sch = data.sch; 191 sch = data.sch;
  192 +
192 oilId = sch.xlBm + '_oil_station'; 193 oilId = sch.xlBm + '_oil_station';
193 lineInfo = gb_data_basic.codeToLine[sch.xlBm]; 194 lineInfo = gb_data_basic.codeToLine[sch.xlBm];
194 195
@@ -242,6 +243,9 @@ @@ -242,6 +243,9 @@
242 }, {center: false, bgclose: false, modal: false}); 243 }, {center: false, bgclose: false, modal: false});
243 }); 244 });
244 }); 245 });
  246 +
  247 + //根据主任务状态,复子任务
  248 + updateTwinsTaskBySch(sch);
245 }); 249 });
246 250
247 var dataArray = []; 251 var dataArray = [];
@@ -274,7 +278,7 @@ @@ -274,7 +278,7 @@
274 } 278 }
275 else{ 279 else{
276 //营运子任务不写备注 280 //营运子任务不写备注
277 - if(data.mileageType == 'service' && !data.destroy) 281 + if(data.mileageType == 'service')
278 data.remarks = ''; 282 data.remarks = '';
279 gb_common.$post('/childTask', data, function (rs) { 283 gb_common.$post('/childTask', data, function (rs) {
280 notify_succ('子任务添加成功'); 284 notify_succ('子任务添加成功');
@@ -450,6 +454,23 @@ @@ -450,6 +454,23 @@
450 $('.inout_reason_tags>span.active', modal).removeClass('active'); 454 $('.inout_reason_tags>span.active', modal).removeClass('active');
451 $(this).addClass('active'); 455 $(this).addClass('active');
452 }); 456 });
  457 +
  458 +
  459 + function updateTwinsTaskBySch(sch) {
  460 + //主任务是烂班
  461 + if(sch.destroy){
  462 + var f = $('.twins_task_form', modal);
  463 + $('.uk-badge', f).addClass('uk-badge-danger').text('烂班');
  464 + $('.uk-panel-box', f).removeClass('uk-panel-box-primary');
  465 + f.prepend('<input type="hidden" name="destroy" value="true">');
  466 + $('[name=mileage]', f).val(sch.jhlcOrig);
  467 +
  468 + //进场起点
  469 + $('[name=startStation]', jcForm).val(sch.qdzCode);
  470 + //出场终点
  471 + $('[name=endStation]', ccForm).val(sch.qdzCode);
  472 + }
  473 + }
453 })(); 474 })();
454 </script> 475 </script>
455 </div> 476 </div>
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/sub_task/add_sub_task_outpark.html
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 </div> 42 </div>
43 </div> 43 </div>
44 <div class="uk-width-7-10 pl5"> 44 <div class="uk-width-7-10 pl5">
45 - <select name="endStation" class="ct_focus" disabled></select> 45 + <select name="endStation" class="ct_focus"></select>
46 </div> 46 </div>
47 </div> 47 </div>
48 <div class="uk-grid"> 48 <div class="uk-grid">
@@ -82,7 +82,7 @@ @@ -82,7 +82,7 @@
82 </div> 82 </div>
83 83
84 <div class="sub-task-card"> 84 <div class="sub-task-card">
85 - <div class="uk-panel uk-panel-box uk-panel-box-primary"> 85 + <div class="uk-panel uk-panel-box uk-panel-box-primary twins_task_panel">
86 <div class="uk-panel-badge uk-badge">营运</div> 86 <div class="uk-panel-badge uk-badge">营运</div>
87 <h3 class="uk-panel-title">线路上站点间</h3> 87 <h3 class="uk-panel-title">线路上站点间</h3>
88 <form class="uk-form uk-form-horizontal inpark_form" service_form> 88 <form class="uk-form uk-form-horizontal inpark_form" service_form>
@@ -199,6 +199,9 @@ @@ -199,6 +199,9 @@
199 199
200 //设置默认值 200 //设置默认值
201 setDefaultVal(); 201 setDefaultVal();
  202 +
  203 + //根据主任务状态,复子任务
  204 + updateTwinsTaskBySch(sch);
202 }); 205 });
203 //线路标准 206 //线路标准
204 information = gb_data_basic.getLineInformation(sch.xlBm); 207 information = gb_data_basic.getLineInformation(sch.xlBm);
@@ -271,13 +274,6 @@ @@ -271,13 +274,6 @@
271 }); 274 });
272 }); 275 });
273 276
274 - /* function outUpOrDown() {  
275 - if (information.carPark != $('select[name=startStation]', emptyForm).val())  
276 - return -1;  
277 -  
278 - return sch.xlDir;  
279 - }*/  
280 -  
281 function getOutTime() { 277 function getOutTime() {
282 if (information.carPark != $('select[name=startStation]', emptyForm).val()) 278 if (information.carPark != $('select[name=startStation]', emptyForm).val())
283 return null; 279 return null;
@@ -337,6 +333,16 @@ @@ -337,6 +333,16 @@
337 //空驶里程 333 //空驶里程
338 $('input[name=mileage]', emptyForm).val(sch.xlDir == 0 ? information.upOutMileage : information.downOutMileage); 334 $('input[name=mileage]', emptyForm).val(sch.xlDir == 0 ? information.upOutMileage : information.downOutMileage);
339 } 335 }
  336 +
  337 +
  338 + function updateTwinsTaskBySch(sch) {
  339 + //主任务是烂班
  340 + if(sch.destroy){
  341 + serviceForm.prepend('<input type="hidden" name="destroy" value="true">');
  342 + $('.twins_task_panel .uk-badge', modal).addClass('uk-badge-danger').text('烂班');
  343 + $('[name=mileage]', serviceForm).val(sch.jhlcOrig).attr('disabled', 'disabled');
  344 + }
  345 + }
340 })(); 346 })();
341 </script> 347 </script>
342 </div> 348 </div>
343 \ No newline at end of file 349 \ No newline at end of file
src/main/resources/static/real_control_v2/fragments/line_schedule/sch_table.html
@@ -3,9 +3,9 @@ @@ -3,9 +3,9 @@
3 <div class="schedule-wrap {{if dir==0}}up{{else}}down{{/if}}"> 3 <div class="schedule-wrap {{if dir==0}}up{{else}}down{{/if}}">
4 <h3 class="header-title"> 4 <h3 class="header-title">
5 {{if dir==0}} 5 {{if dir==0}}
6 - 上行/{{line.startStationName}} 6 + {{line.startStationName}}
7 {{else}} 7 {{else}}
8 - 下行/{{line.endStationName}} 8 + {{line.endStationName}}
9 {{/if}} 9 {{/if}}
10 <i class="uk-icon-question-circle uk-icon-hover"></i> 10 <i class="uk-icon-question-circle uk-icon-hover"></i>
11 <div class="fixed_legend"> 11 <div class="fixed_legend">
@@ -65,21 +65,21 @@ @@ -65,21 +65,21 @@
65 <dd data-sort-val={{sch.fcsjT}}> 65 <dd data-sort-val={{sch.fcsjT}}>
66 {{sch.fcsj}} 66 {{sch.fcsj}}
67 {{if sch.bcType == "out"}} 67 {{if sch.bcType == "out"}}
68 - <span class="uk-badge uk-badge-success">出场</span> 68 + <span class="uk-badge uk-badge-success out">出场</span>
69 {{else if sch.bcType == "in"}} 69 {{else if sch.bcType == "in"}}
70 - <span class="uk-badge uk-badge-warning">进场</span> 70 + <span class="uk-badge uk-badge-warning in">进场</span>
71 {{else if sch.bcType == "venting"}} 71 {{else if sch.bcType == "venting"}}
72 <span class="uk-badge uk-badge-danger">直放</span> 72 <span class="uk-badge uk-badge-danger">直放</span>
73 {{else if sch.bcType == "major"}} 73 {{else if sch.bcType == "major"}}
74 <span class="uk-badge uk-badge-danger">放站</span> 74 <span class="uk-badge uk-badge-danger">放站</span>
75 {{else if sch.bcType == "region"}} 75 {{else if sch.bcType == "region"}}
76 - <span class="uk-badge">区间</span> 76 + <span class="uk-badge sch_region">区间</span>
77 {{/if}} 77 {{/if}}
78 {{if sch.sflj}} 78 {{if sch.sflj}}
79 <span class="uk-badge uk-badge-danger">临加</span> 79 <span class="uk-badge uk-badge-danger">临加</span>
80 {{/if}} 80 {{/if}}
81 {{if sch.cTasks.length > 0}} 81 {{if sch.cTasks.length > 0}}
82 - <span class="uk-badge uk-badge-notification">{{sch.cTasks.length}}</span> 82 + <span class="uk-badge uk-badge-notification c_task">{{sch.cTasks.length}}</span>
83 {{/if}} 83 {{/if}}
84 </dd> 84 </dd>
85 <dd data-sort-val={{sch.dfsjT}} dbclick dbclick-type="dfsj" dbclick-val="{{sch.dfsj}}"> 85 <dd data-sort-val={{sch.dfsjT}} dbclick dbclick-type="dfsj" dbclick-val="{{sch.dfsj}}">
@@ -117,21 +117,21 @@ @@ -117,21 +117,21 @@
117 <dd data-sort-val={{fcsjT}}> 117 <dd data-sort-val={{fcsjT}}>
118 {{fcsj}} 118 {{fcsj}}
119 {{if bcType == "out"}} 119 {{if bcType == "out"}}
120 - <span class="uk-badge uk-badge-success">出场</span> 120 + <span class="uk-badge uk-badge-success out">出场</span>
121 {{else if bcType == "in"}} 121 {{else if bcType == "in"}}
122 - <span class="uk-badge uk-badge-warning">进场</span> 122 + <span class="uk-badge uk-badge-warning in">进场</span>
123 {{else if bcType == "venting"}} 123 {{else if bcType == "venting"}}
124 <span class="uk-badge uk-badge-danger">直放</span> 124 <span class="uk-badge uk-badge-danger">直放</span>
125 {{else if bcType == "major"}} 125 {{else if bcType == "major"}}
126 <span class="uk-badge uk-badge-danger">放站</span> 126 <span class="uk-badge uk-badge-danger">放站</span>
127 {{else if bcType == "region"}} 127 {{else if bcType == "region"}}
128 - <span class="uk-badge">区间</span> 128 + <span class="uk-badge sch_region">区间</span>
129 {{/if}} 129 {{/if}}
130 {{if sflj}} 130 {{if sflj}}
131 <span class="uk-badge uk-badge-danger">临加</span> 131 <span class="uk-badge uk-badge-danger">临加</span>
132 {{/if}} 132 {{/if}}
133 {{if cTasks.length > 0}} 133 {{if cTasks.length > 0}}
134 - <span class="uk-badge uk-badge-notification">{{cTasks.length}}</span> 134 + <span class="uk-badge uk-badge-notification c_task">{{cTasks.length}}</span>
135 {{/if}} 135 {{/if}}
136 </dd> 136 </dd>
137 </script> 137 </script>
src/main/resources/static/real_control_v2/js/line_schedule/badge_tooltip.js 0 → 100644
  1 +
  2 +/** badge 悬停 tip 相关 */
  3 +var gb_schedule_badge_tootip = (function () {
  4 +
  5 + var temps;
  6 + //html 模板
  7 + $.get('/real_control_v2/fragments/line_schedule/badge_tooltip.html', function(dom) {
  8 + temps = gb_common.compileTempByDom(dom);
  9 + });
  10 +
  11 + //子任务 tootip
  12 + $(document).on('mouseenter', '.schedule-wrap .ct_table_body .uk-badge.c_task', function() {
  13 + $(this).qtip({
  14 + show: {
  15 + ready: true,
  16 + delay: 300
  17 + },
  18 + content: {
  19 + text: function() {
  20 + var id = $(this).parents('dl').data('id'),
  21 + lineCode = $(this).parents('li.line_schedule').data('id'),
  22 + sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  23 + //排序
  24 + var array = sch.cTasks.sort(function (a, b) {
  25 + var an = (a.mileageType=='service'?1:0)+''+(a.destroy?0:1);
  26 + var bn = (b.mileageType=='service'?1:0)+''+(b.destroy?0:1);
  27 + return parseInt(bn) - parseInt(an);
  28 + });
  29 + return temps['sch-table-task-tootip-temp']({tasks: array});
  30 + }
  31 + },
  32 + position: {
  33 + viewport: $(window),
  34 + my: 'center left',
  35 + at: 'center right'
  36 + },
  37 + style: {
  38 + classes: 'qtip-light qtip-rounded qtip-shadow sch-badge-tip'
  39 + },
  40 + hide: {
  41 + fixed: true,
  42 + delay: 300
  43 + },
  44 + events: {
  45 + hidden: function(event, api) {
  46 + //destroy dom
  47 + $(this).qtip('destroy', true);
  48 + }
  49 + }
  50 + });
  51 + });
  52 +
  53 + //区间 tootip
  54 + $(document).on('mouseenter', '.schedule-wrap .ct_table_body .uk-badge.sch_region', function() {
  55 + $(this).qtip({
  56 + show: {
  57 + ready: true,
  58 + delay: 300
  59 + },
  60 + content: {
  61 + text: function() {
  62 + var id = $(this).parents('dl').data('id'),
  63 + lineCode = $(this).parents('li.line_schedule').data('id'),
  64 + sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  65 + return temps['sch-table-region-tootip-temp'](sch);
  66 + }
  67 + },
  68 + position: {
  69 + viewport: $(window),
  70 + my: 'center left',
  71 + at: 'center right'
  72 + },
  73 + style: {
  74 + classes: 'qtip-youtube sch-badge-tip'
  75 + },
  76 + hide: {
  77 + fixed: true,
  78 + delay: 300
  79 + },
  80 + events: {
  81 + hidden: function(event, api) {
  82 + //destroy dom
  83 + $(this).qtip('destroy', true);
  84 + }
  85 + }
  86 + });
  87 + });
  88 +
  89 +
  90 + //出场 tootip
  91 + $(document).on('mouseenter', '.schedule-wrap .ct_table_body .uk-badge.out', function() {
  92 + $(this).qtip({
  93 + show: {
  94 + ready: true,
  95 + delay: 300
  96 + },
  97 + content: {
  98 + text: function() {
  99 + var id = $(this).parents('dl').data('id'),
  100 + lineCode = $(this).parents('li.line_schedule').data('id'),
  101 + sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  102 + return temps['sch-table-out-tootip-temp'](sch);
  103 + }
  104 + },
  105 + position: {
  106 + viewport: $(window),
  107 + my: 'center left',
  108 + at: 'center right'
  109 + },
  110 + style: {
  111 + classes: 'qtip-youtube sch-badge-tip'
  112 + },
  113 + hide: {
  114 + fixed: true,
  115 + delay: 300
  116 + },
  117 + events: {
  118 + hidden: function(event, api) {
  119 + //destroy dom
  120 + $(this).qtip('destroy', true);
  121 + }
  122 + }
  123 + });
  124 + });
  125 +
  126 +
  127 + //进场 tootip
  128 + $(document).on('mouseenter', '.schedule-wrap .ct_table_body .uk-badge.in', function() {
  129 + $(this).qtip({
  130 + show: {
  131 + ready: true,
  132 + delay: 300
  133 + },
  134 + content: {
  135 + text: function() {
  136 + var id = $(this).parents('dl').data('id'),
  137 + lineCode = $(this).parents('li.line_schedule').data('id'),
  138 + sch = gb_schedule_table.findScheduleByLine(lineCode)[id];
  139 + return temps['sch-table-in-tootip-temp'](sch);
  140 + }
  141 + },
  142 + position: {
  143 + viewport: $(window),
  144 + my: 'center left',
  145 + at: 'center right'
  146 + },
  147 + style: {
  148 + classes: 'qtip-youtube sch-badge-tip'
  149 + },
  150 + hide: {
  151 + fixed: true,
  152 + delay: 300
  153 + },
  154 + events: {
  155 + hidden: function(event, api) {
  156 + //destroy dom
  157 + $(this).qtip('destroy', true);
  158 + }
  159 + }
  160 + });
  161 + });
  162 +})();
0 \ No newline at end of file 163 \ No newline at end of file
src/main/resources/static/real_control_v2/js/line_schedule/context_menu.js
@@ -118,7 +118,10 @@ var gb_schedule_context_menu = (function () { @@ -118,7 +118,10 @@ var gb_schedule_context_menu = (function () {
118 if (!isNaN(newValue) && newValue > 0) { 118 if (!isNaN(newValue) && newValue > 0) {
119 gb_common.$post_arr('/realSchedule/spaceAdjust', {ids: idArr, space: newValue}, function (rs) { 119 gb_common.$post_arr('/realSchedule/spaceAdjust', {ids: idArr, space: newValue}, function (rs) {
120 //刷新数据 120 //刷新数据
121 - gb_schedule_table.updateSchedule(rs.ts); 121 + if(rs.t){
  122 + gb_schedule_table.reLoadAndRefresh(rs.t.xlBm);
  123 + }
  124 + //gb_schedule_table.updateSchedule(rs.ts);
122 notify_succ('调整间隔成功!'); 125 notify_succ('调整间隔成功!');
123 }); 126 });
124 } else 127 } else
@@ -171,13 +174,15 @@ var gb_schedule_context_menu = (function () { @@ -171,13 +174,15 @@ var gb_schedule_context_menu = (function () {
171 add_sub_task_range_turn: function (sch) { 174 add_sub_task_range_turn: function (sch) {
172 if(sch.bcType == 'out' || sch.bcType == 'in') 175 if(sch.bcType == 'out' || sch.bcType == 'in')
173 return notify_err('进出场班次不能做区间掉头!'); 176 return notify_err('进出场班次不能做区间掉头!');
  177 + if(sch.destroy)
  178 + return notify_err('没有理由在烂班上做区间调头!!');
174 open_modal(folder + '/sub_task/add_sub_task_range_turn.html', { 179 open_modal(folder + '/sub_task/add_sub_task_range_turn.html', {
175 sch: sch 180 sch: sch
176 }, modal_opts); 181 }, modal_opts);
177 }, 182 },
178 add_oil: function (sch) { 183 add_oil: function (sch) {
179 if(sch.bcType == 'out' || sch.bcType == 'in'){ 184 if(sch.bcType == 'out' || sch.bcType == 'in'){
180 - notify_err('暂不能在进出场班次上做加油子任务!'); 185 + notify_err('暂不能在进出场班次上做这个操作!');
181 return; 186 return;
182 } 187 }
183 open_modal(folder + '/sub_task/add_sub_task_oil.html', { 188 open_modal(folder + '/sub_task/add_sub_task_oil.html', {
src/main/resources/static/real_control_v2/js/line_schedule/sch_table.js
@@ -86,7 +86,7 @@ var gb_schedule_table = (function () { @@ -86,7 +86,7 @@ var gb_schedule_table = (function () {
86 .html(htmlStr); 86 .html(htmlStr);
87 } 87 }
88 88
89 - //标记车辆最后一个班次 89 + //标记路牌最后一个班次
90 markerLastByLine(lineCode); 90 markerLastByLine(lineCode);
91 //初始化图例相关,dbclick 不能代理事件 91 //初始化图例相关,dbclick 不能代理事件
92 gb_sch_legend.init(this); 92 gb_sch_legend.init(this);
@@ -194,6 +194,9 @@ var gb_schedule_table = (function () { @@ -194,6 +194,9 @@ var gb_schedule_table = (function () {
194 gb_schedule_table_dbclick.sfsjCellClick($('dd.fcsjActualCell', tabCont)); 194 gb_schedule_table_dbclick.sfsjCellClick($('dd.fcsjActualCell', tabCont));
195 //滚动条 195 //滚动条
196 $('.schedule-wrap .ct_table_wrap', tabCont).perfectScrollbar({suppressScrollX: true}); 196 $('.schedule-wrap .ct_table_wrap', tabCont).perfectScrollbar({suppressScrollX: true});
  197 +
  198 + //搜索模板初始化
  199 + gb_sch_search.init();
197 } 200 }
198 }; 201 };
199 202
@@ -495,7 +498,7 @@ var gb_schedule_table = (function () { @@ -495,7 +498,7 @@ var gb_schedule_table = (function () {
495 498
496 //标记终点时间 -线路 499 //标记终点时间 -线路
497 var markerLastByLine = function (lineCode) { 500 var markerLastByLine = function (lineCode) {
498 - var data = gb_common.groupBy(gb_common.get_vals(line2Schedule[lineCode]).filter(schDestroyFilter), 'clZbh'); 501 + var data = gb_common.groupBy(gb_common.get_vals(line2Schedule[lineCode]).filter(schDestroyFilter), 'lpName');
499 502
500 var array, lastSch, dl; 503 var array, lastSch, dl;
501 for (var nbbm in data) { 504 for (var nbbm in data) {
src/main/resources/static/real_control_v2/js/line_schedule/search.js
@@ -40,6 +40,9 @@ var gb_sch_search = (function() { @@ -40,6 +40,9 @@ var gb_sch_search = (function() {
40 var elements = '.search_sch_panel .sch-search-autocom'; 40 var elements = '.search_sch_panel .sch-search-autocom';
41 var init = function() { 41 var init = function() {
42 $(elements).each(function() { 42 $(elements).each(function() {
  43 + if($('script[type="text/autocomplete"]', this).length > 0)
  44 + return true;
  45 +
43 $(this).append(result_template); 46 $(this).append(result_template);
44 constructor(this); 47 constructor(this);
45 }); 48 });
src/main/resources/static/real_control_v2/js/main.js
@@ -171,8 +171,8 @@ var disabled_submit_btn = function (form) { @@ -171,8 +171,8 @@ var disabled_submit_btn = function (form) {
171 function showUpdateDescription() { 171 function showUpdateDescription() {
172 //更新说明 172 //更新说明
173 var updateDescription = { 173 var updateDescription = {
174 - date: '2017-04-20',  
175 - text: '<h5>现在可以在轨迹回放里看到停车场位置和多边形电子围栏</h5><h5>区间调头子任务,可以勾选“调头后空驶回起点”</h5>' 174 + date: '2017-04-24',
  175 + text: '<h5>应到实到时间按路牌连接显示</h5><h5>批量子任务时,如果主任务烂班,则自动复一个全程烂班子任务</h5><h5>鼠标悬停在子任务数字徽章上可查看详细</h5>'
176 }; 176 };
177 177
178 var storage = window.localStorage 178 var storage = window.localStorage
src/main/resources/static/real_control_v2/main.html
@@ -22,6 +22,8 @@ @@ -22,6 +22,8 @@
22 <link rel="stylesheet" href="/real_control_v2/css/home.css" merge="custom_style"/> 22 <link rel="stylesheet" href="/real_control_v2/css/home.css" merge="custom_style"/>
23 <!-- line style --> 23 <!-- line style -->
24 <link rel="stylesheet" href="/real_control_v2/css/line_schedule.css" merge="custom_style"/> 24 <link rel="stylesheet" href="/real_control_v2/css/line_schedule.css" merge="custom_style"/>
  25 + <link rel="stylesheet" href="/real_control_v2/css/line_schedule_table.css" merge="custom_style"/>
  26 +
25 <link rel="stylesheet" href="/real_control_v2/css/sch_autocomp_result.css" merge="custom_style"/> 27 <link rel="stylesheet" href="/real_control_v2/css/sch_autocomp_result.css" merge="custom_style"/>
26 <!-- custom table --> 28 <!-- custom table -->
27 <link rel="stylesheet" href="/real_control_v2/css/ct_table.css" merge="custom_style"/> 29 <link rel="stylesheet" href="/real_control_v2/css/ct_table.css" merge="custom_style"/>
@@ -172,6 +174,7 @@ @@ -172,6 +174,7 @@
172 <script src="/real_control_v2/js/line_schedule/context_menu.js" merge="custom_js"></script> 174 <script src="/real_control_v2/js/line_schedule/context_menu.js" merge="custom_js"></script>
173 <script src="/real_control_v2/js/line_schedule/dbclick.js" merge="custom_js"></script> 175 <script src="/real_control_v2/js/line_schedule/dbclick.js" merge="custom_js"></script>
174 <script src="/real_control_v2/js/line_schedule/search.js" merge="custom_js"></script> 176 <script src="/real_control_v2/js/line_schedule/search.js" merge="custom_js"></script>
  177 +<script src="/real_control_v2/js/line_schedule/badge_tooltip.js" merge="custom_js"></script>
175 178
176 <!-- 字典相关 --> 179 <!-- 字典相关 -->
177 <script src="/assets/js/dictionary.js" merge="custom_js"></script> 180 <script src="/assets/js/dictionary.js" merge="custom_js"></script>
src/test/resources/testdata/problem.txt 0 → 100644
  1 +1、时刻表明细导入,线路标准里所有的高峰低谷时间需要带入时刻表班次时间里,标准可以点击切换到线路标准界面
  2 +2、时刻表明细编辑功能,数据工具移到时刻表里,类似工具栏的样子
  3 +3、时刻表导入,可以选一个已经存在的时刻表导入,而不是excel文件
  4 +4、所有的删除,作废,都要有提示框操作
  5 +5、排班计划错误提示,如果选的排班日期之前没有排班,提示错误,排班结果有重复与时刻表不符合,显示错误
  6 +6、调度执行日报,显示最近排班日期,修改操作强化
  7 +7、警告功能,如时刻表选择相同的常规有效日,特殊有效日,车辆,人员配置重复等等
  8 +8、时刻表明细编辑,颜色覆盖冲突
  9 +9、下拉框貌似中文不能搜索
  10 +10、时刻表明细编辑,环线,选上下行,上下的站点在下行站点列表里
  11 +11、人员基础信息导入问题,工号前要加公司代码
0 \ No newline at end of file 12 \ No newline at end of file