Commit e80841473dece308a68d46f9abba66add6586566
1 parent
7a72d561
update
Showing
29 changed files
with
1052 additions
and
38 deletions
src/main/java/com/bsth/controller/forecast/SampleController.java
0 → 100644
| 1 | +package com.bsth.controller.forecast; | ||
| 2 | + | ||
| 3 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
| 4 | +import org.springframework.web.bind.annotation.RestController; | ||
| 5 | + | ||
| 6 | +import com.bsth.controller.BaseController; | ||
| 7 | +import com.bsth.entity.forecast.Sample; | ||
| 8 | + | ||
| 9 | +@RestController | ||
| 10 | +@RequestMapping("sample") | ||
| 11 | +public class SampleController extends BaseController<Sample, Long>{ | ||
| 12 | + | ||
| 13 | +} |
src/main/java/com/bsth/data/gpsdata/GpsRealData.java
| @@ -63,7 +63,7 @@ public class GpsRealData implements CommandLineRunner{ | @@ -63,7 +63,7 @@ public class GpsRealData implements CommandLineRunner{ | ||
| 63 | @Override | 63 | @Override |
| 64 | public void run(String... arg0) throws Exception { | 64 | public void run(String... arg0) throws Exception { |
| 65 | logger.info("gpsDataLoader,20,8"); | 65 | logger.info("gpsDataLoader,20,8"); |
| 66 | - //Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 8, TimeUnit.SECONDS); | 66 | + Application.mainServices.scheduleWithFixedDelay(gpsDataLoader, 20, 8, TimeUnit.SECONDS); |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | public static GpsEntity add(GpsEntity gps) { | 69 | public static GpsEntity add(GpsEntity gps) { |
src/main/java/com/bsth/data/pilot80/PilotReport.java
| @@ -283,7 +283,7 @@ public class PilotReport { | @@ -283,7 +283,7 @@ public class PilotReport { | ||
| 283 | 283 | ||
| 284 | public void clear(String lineCode){ | 284 | public void clear(String lineCode){ |
| 285 | logger.info("清除 80数据 before: " + d80MultiMap.size()); | 285 | logger.info("清除 80数据 before: " + d80MultiMap.size()); |
| 286 | - d80MultiMap.removeAll(lineCode); | 286 | + d80MultiMap.removeAll(Integer.parseInt(lineCode)); |
| 287 | logger.info("清除 80数据 after: " + d80MultiMap.size()); | 287 | logger.info("清除 80数据 after: " + d80MultiMap.size()); |
| 288 | } | 288 | } |
| 289 | 289 |
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
| @@ -25,6 +25,9 @@ import com.alibaba.fastjson.JSONArray; | @@ -25,6 +25,9 @@ import com.alibaba.fastjson.JSONArray; | ||
| 25 | import com.bsth.Application; | 25 | import com.bsth.Application; |
| 26 | import com.bsth.data.LineConfigData; | 26 | import com.bsth.data.LineConfigData; |
| 27 | import com.bsth.data.directive.FirstScheduleCheckThread; | 27 | import com.bsth.data.directive.FirstScheduleCheckThread; |
| 28 | +import com.bsth.data.schedule.thread.ScheduleLateThread; | ||
| 29 | +import com.bsth.data.schedule.thread.SchedulePstThread; | ||
| 30 | +import com.bsth.data.schedule.thread.ScheduleRefreshThread; | ||
| 28 | import com.bsth.entity.realcontrol.LineConfig; | 31 | import com.bsth.entity.realcontrol.LineConfig; |
| 29 | import com.bsth.entity.realcontrol.ScheduleRealInfo; | 32 | import com.bsth.entity.realcontrol.ScheduleRealInfo; |
| 30 | import com.bsth.entity.schedule.SchedulePlanInfo; | 33 | import com.bsth.entity.schedule.SchedulePlanInfo; |
| @@ -99,6 +102,9 @@ public class DayOfSchedule implements CommandLineRunner { | @@ -99,6 +102,9 @@ public class DayOfSchedule implements CommandLineRunner { | ||
| 99 | 102 | ||
| 100 | @Autowired | 103 | @Autowired |
| 101 | FirstScheduleCheckThread firstScheduleCheckThread; | 104 | FirstScheduleCheckThread firstScheduleCheckThread; |
| 105 | + | ||
| 106 | + @Autowired | ||
| 107 | + ScheduleLateThread scheduleLateThread; | ||
| 102 | 108 | ||
| 103 | @Override | 109 | @Override |
| 104 | public void run(String... arg0) throws Exception { | 110 | public void run(String... arg0) throws Exception { |
| @@ -108,6 +114,8 @@ public class DayOfSchedule implements CommandLineRunner { | @@ -108,6 +114,8 @@ public class DayOfSchedule implements CommandLineRunner { | ||
| 108 | Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 60, TimeUnit.SECONDS); | 114 | Application.mainServices.scheduleWithFixedDelay(schedulePstThread, 60, 60, TimeUnit.SECONDS); |
| 109 | //首班出场指令补发器 | 115 | //首班出场指令补发器 |
| 110 | Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 60, 60, TimeUnit.SECONDS); | 116 | Application.mainServices.scheduleWithFixedDelay(firstScheduleCheckThread, 60, 60, TimeUnit.SECONDS); |
| 117 | + //班次误点扫描 | ||
| 118 | + Application.mainServices.scheduleWithFixedDelay(scheduleLateThread, 60, 60, TimeUnit.SECONDS); | ||
| 111 | } | 119 | } |
| 112 | 120 | ||
| 113 | public Map<String, String> getCurrSchDate() { | 121 | public Map<String, String> getCurrSchDate() { |
| @@ -268,6 +276,7 @@ public class DayOfSchedule implements CommandLineRunner { | @@ -268,6 +276,7 @@ public class DayOfSchedule implements CommandLineRunner { | ||
| 268 | * @Description: TODO(从计划排班表加载数据) | 276 | * @Description: TODO(从计划排班表加载数据) |
| 269 | */ | 277 | */ |
| 270 | public List<ScheduleRealInfo> loadPlanSch(String lineCode, String schDate) { | 278 | public List<ScheduleRealInfo> loadPlanSch(String lineCode, String schDate) { |
| 279 | + logger.info("从计划排班表恢复排班,lineCode: " + lineCode + ", schDate: " + schDate); | ||
| 271 | List<ScheduleRealInfo> realList = new ArrayList<>(); | 280 | List<ScheduleRealInfo> realList = new ArrayList<>(); |
| 272 | 281 | ||
| 273 | try { | 282 | try { |
| @@ -580,4 +589,8 @@ public class DayOfSchedule implements CommandLineRunner { | @@ -580,4 +589,8 @@ public class DayOfSchedule implements CommandLineRunner { | ||
| 580 | public Set<String> allCar(){ | 589 | public Set<String> allCar(){ |
| 581 | return nbbmScheduleMap.keySet(); | 590 | return nbbmScheduleMap.keySet(); |
| 582 | } | 591 | } |
| 592 | + | ||
| 593 | + public Collection<ScheduleRealInfo> findAll(){ | ||
| 594 | + return nbbmScheduleMap.values(); | ||
| 595 | + } | ||
| 583 | } | 596 | } |
src/main/java/com/bsth/data/schedule/ScheduleComparator.java
| @@ -25,7 +25,7 @@ public class ScheduleComparator { | @@ -25,7 +25,7 @@ public class ScheduleComparator { | ||
| 25 | 25 | ||
| 26 | @Override | 26 | @Override |
| 27 | public int compare(ScheduleRealInfo s1, ScheduleRealInfo s2) { | 27 | public int compare(ScheduleRealInfo s1, ScheduleRealInfo s2) { |
| 28 | - return (int) (s1.getFcsjT() - s2.getFcsjT()); | 28 | + return (int) (s1.getDfsjT() - s2.getDfsjT()); |
| 29 | } | 29 | } |
| 30 | } | 30 | } |
| 31 | } | 31 | } |
src/main/java/com/bsth/data/schedule/thread/ScheduleLateThread.java
0 → 100644
| 1 | +package com.bsth.data.schedule.thread; | ||
| 2 | + | ||
| 3 | + | ||
| 4 | +import java.util.ArrayList; | ||
| 5 | +import java.util.Collections; | ||
| 6 | +import java.util.Comparator; | ||
| 7 | +import java.util.List; | ||
| 8 | + | ||
| 9 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 10 | +import org.springframework.stereotype.Component; | ||
| 11 | + | ||
| 12 | +import com.bsth.data.schedule.DayOfSchedule; | ||
| 13 | +import com.bsth.data.schedule.ScheduleComparator; | ||
| 14 | +import com.bsth.entity.realcontrol.ScheduleRealInfo; | ||
| 15 | +import com.bsth.websocket.handler.SendUtils; | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * | ||
| 19 | + * @ClassName: ScheduleLateThread | ||
| 20 | + * @Description: TODO(班次误点扫描线程) | ||
| 21 | + * @author PanZhao | ||
| 22 | + * @date 2016年8月31日 下午3:09:02 | ||
| 23 | + * | ||
| 24 | + */ | ||
| 25 | +@Component | ||
| 26 | +public class ScheduleLateThread extends Thread{ | ||
| 27 | + | ||
| 28 | + @Autowired | ||
| 29 | + DayOfSchedule dayOfSchedule; | ||
| 30 | + | ||
| 31 | + @Autowired | ||
| 32 | + SendUtils sendUtils; | ||
| 33 | + | ||
| 34 | + private static Comparator<ScheduleRealInfo> cpm = new ScheduleComparator.FCSJ(); | ||
| 35 | + | ||
| 36 | + @Override | ||
| 37 | + public void run() { | ||
| 38 | + List<ScheduleRealInfo> all = new ArrayList<>(dayOfSchedule.findAll()); | ||
| 39 | + Collections.sort(all, cpm); | ||
| 40 | + | ||
| 41 | + long t = System.currentTimeMillis(); | ||
| 42 | + int size = all.size(); | ||
| 43 | + | ||
| 44 | + ScheduleRealInfo sch; | ||
| 45 | + for(int i = 0; i < size; i ++){ | ||
| 46 | + sch = all.get(i); | ||
| 47 | + if(sch.getDfsjT() > t) | ||
| 48 | + break; | ||
| 49 | + | ||
| 50 | + if(sch.getStatus() == 0 && sch.getFcsjActual() == null){ | ||
| 51 | + //应发未发 | ||
| 52 | + sch.setLate(true); | ||
| 53 | + //通知客户端 | ||
| 54 | + sendUtils.refreshSch(sch); | ||
| 55 | + } | ||
| 56 | + } | ||
| 57 | + } | ||
| 58 | +} |
src/main/java/com/bsth/data/schedule/SchedulePstThread.java renamed to src/main/java/com/bsth/data/schedule/thread/SchedulePstThread.java
| 1 | -package com.bsth.data.schedule; | 1 | +package com.bsth.data.schedule.thread; |
| 2 | 2 | ||
| 3 | import java.util.LinkedList; | 3 | import java.util.LinkedList; |
| 4 | 4 | ||
| 5 | import org.springframework.beans.factory.annotation.Autowired; | 5 | import org.springframework.beans.factory.annotation.Autowired; |
| 6 | import org.springframework.stereotype.Component; | 6 | import org.springframework.stereotype.Component; |
| 7 | 7 | ||
| 8 | +import com.bsth.data.schedule.DayOfSchedule; | ||
| 8 | import com.bsth.entity.realcontrol.ScheduleRealInfo; | 9 | import com.bsth.entity.realcontrol.ScheduleRealInfo; |
| 9 | import com.bsth.repository.realcontrol.ScheduleRealInfoRepository; | 10 | import com.bsth.repository.realcontrol.ScheduleRealInfoRepository; |
| 10 | 11 |
src/main/java/com/bsth/data/schedule/ScheduleRefreshThread.java renamed to src/main/java/com/bsth/data/schedule/thread/ScheduleRefreshThread.java
| 1 | -package com.bsth.data.schedule; | 1 | +package com.bsth.data.schedule.thread; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | 3 | import java.util.Collection; |
| 4 | import java.util.Set; | 4 | import java.util.Set; |
| @@ -13,6 +13,7 @@ import com.bsth.data.LineConfigData; | @@ -13,6 +13,7 @@ import com.bsth.data.LineConfigData; | ||
| 13 | import com.bsth.data.arrival.ArrivalData_GPS; | 13 | import com.bsth.data.arrival.ArrivalData_GPS; |
| 14 | import com.bsth.data.directive.DayOfDirectives; | 14 | import com.bsth.data.directive.DayOfDirectives; |
| 15 | import com.bsth.data.pilot80.PilotReport; | 15 | import com.bsth.data.pilot80.PilotReport; |
| 16 | +import com.bsth.data.schedule.DayOfSchedule; | ||
| 16 | import com.bsth.entity.realcontrol.LineConfig; | 17 | import com.bsth.entity.realcontrol.LineConfig; |
| 17 | 18 | ||
| 18 | /** | 19 | /** |
src/main/java/com/bsth/entity/forecast/Sample.java
0 → 100644
| 1 | +package com.bsth.entity.forecast; | ||
| 2 | + | ||
| 3 | + | ||
| 4 | +import javax.persistence.Entity; | ||
| 5 | +import javax.persistence.GeneratedValue; | ||
| 6 | +import javax.persistence.Id; | ||
| 7 | +import javax.persistence.Table; | ||
| 8 | +import javax.persistence.Transient; | ||
| 9 | + | ||
| 10 | +/** | ||
| 11 | + * | ||
| 12 | + * @ClassName: Sample | ||
| 13 | + * @Description: TODO(站点耗时预测样本) | ||
| 14 | + * @author PanZhao | ||
| 15 | + * @date 2016年8月31日 上午9:50:49 | ||
| 16 | + * | ||
| 17 | + */ | ||
| 18 | +@Entity | ||
| 19 | +@Table(name = "bsth_forecast_sample") | ||
| 20 | +public class Sample { | ||
| 21 | + | ||
| 22 | + @Id | ||
| 23 | + @GeneratedValue | ||
| 24 | + private Long id; | ||
| 25 | + | ||
| 26 | + private Integer lineCode; | ||
| 27 | + | ||
| 28 | + // 开始时间 | ||
| 29 | + private String sDate; | ||
| 30 | + @Transient | ||
| 31 | + private Long sTime; | ||
| 32 | + | ||
| 33 | + // 结束时间 | ||
| 34 | + private String eDate; | ||
| 35 | + @Transient | ||
| 36 | + private Long eTime; | ||
| 37 | + | ||
| 38 | + // 开始站点 | ||
| 39 | + private String sStation; | ||
| 40 | + | ||
| 41 | + // 结束站点 | ||
| 42 | + private String eStation; | ||
| 43 | + | ||
| 44 | + // 0:gps分析生成, 1:人工录入 | ||
| 45 | + private int type; | ||
| 46 | + | ||
| 47 | + private String tag; | ||
| 48 | + | ||
| 49 | + //行驶时间 | ||
| 50 | + private Float runTime; | ||
| 51 | + | ||
| 52 | + private int updown; | ||
| 53 | + | ||
| 54 | + public Long getId() { | ||
| 55 | + return id; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + public void setId(Long id) { | ||
| 59 | + this.id = id; | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + public String getsDate() { | ||
| 63 | + return sDate; | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + public void setsDate(String sDate) { | ||
| 67 | + this.sDate = sDate; | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + public Long getsTime() { | ||
| 71 | + return sTime; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + public void setsTime(Long sTime) { | ||
| 75 | + this.sTime = sTime; | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + public String geteDate() { | ||
| 79 | + return eDate; | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + public void seteDate(String eDate) { | ||
| 83 | + this.eDate = eDate; | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | + public Long geteTime() { | ||
| 87 | + return eTime; | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + public void seteTime(Long eTime) { | ||
| 91 | + this.eTime = eTime; | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + public String getsStation() { | ||
| 95 | + return sStation; | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + public void setsStation(String sStation) { | ||
| 99 | + this.sStation = sStation; | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + public String geteStation() { | ||
| 103 | + return eStation; | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + public void seteStation(String eStation) { | ||
| 107 | + this.eStation = eStation; | ||
| 108 | + } | ||
| 109 | + | ||
| 110 | + public int getType() { | ||
| 111 | + return type; | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + public void setType(int type) { | ||
| 115 | + this.type = type; | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + public String getTag() { | ||
| 119 | + return tag; | ||
| 120 | + } | ||
| 121 | + | ||
| 122 | + public void setTag(String tag) { | ||
| 123 | + this.tag = tag; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + public Float getRunTime() { | ||
| 127 | + return runTime; | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + public void setRunTime(Float runTime) { | ||
| 131 | + this.runTime = runTime; | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | + public Integer getLineCode() { | ||
| 135 | + return lineCode; | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + public void setLineCode(Integer lineCode) { | ||
| 139 | + this.lineCode = lineCode; | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + public int getUpdown() { | ||
| 143 | + return updown; | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + public void setUpdown(int updown) { | ||
| 147 | + this.updown = updown; | ||
| 148 | + } | ||
| 149 | +} |
src/main/java/com/bsth/entity/realcontrol/ScheduleRealInfo.java
| @@ -140,7 +140,7 @@ public class ScheduleRealInfo { | @@ -140,7 +140,7 @@ public class ScheduleRealInfo { | ||
| 140 | private boolean sflj; | 140 | private boolean sflj; |
| 141 | 141 | ||
| 142 | /** 是否误点*/ | 142 | /** 是否误点*/ |
| 143 | - private boolean isLate; | 143 | + private boolean late; |
| 144 | 144 | ||
| 145 | /**实际里程*/ | 145 | /**实际里程*/ |
| 146 | private Float realMileage; | 146 | private Float realMileage; |
| @@ -459,14 +459,6 @@ public class ScheduleRealInfo { | @@ -459,14 +459,6 @@ public class ScheduleRealInfo { | ||
| 459 | this.status = status; | 459 | this.status = status; |
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | - public boolean isLate() { | ||
| 463 | - return isLate; | ||
| 464 | - } | ||
| 465 | - | ||
| 466 | - public void setLate(boolean isLate) { | ||
| 467 | - this.isLate = isLate; | ||
| 468 | - } | ||
| 469 | - | ||
| 470 | public Float getRealMileage() { | 462 | public Float getRealMileage() { |
| 471 | return realMileage; | 463 | return realMileage; |
| 472 | } | 464 | } |
| @@ -756,4 +748,12 @@ public class ScheduleRealInfo { | @@ -756,4 +748,12 @@ public class ScheduleRealInfo { | ||
| 756 | public void setTwinsSch(ScheduleRealInfo twinsSch) { | 748 | public void setTwinsSch(ScheduleRealInfo twinsSch) { |
| 757 | this.twinsSch = twinsSch; | 749 | this.twinsSch = twinsSch; |
| 758 | } | 750 | } |
| 751 | + | ||
| 752 | + public boolean isLate() { | ||
| 753 | + return late; | ||
| 754 | + } | ||
| 755 | + | ||
| 756 | + public void setLate(boolean late) { | ||
| 757 | + this.late = late; | ||
| 758 | + } | ||
| 759 | } | 759 | } |
src/main/java/com/bsth/repository/forecast/SampleRepository.java
0 → 100644
src/main/java/com/bsth/service/directive/DirectiveService.java
| @@ -4,9 +4,6 @@ package com.bsth.service.directive; | @@ -4,9 +4,6 @@ package com.bsth.service.directive; | ||
| 4 | import java.util.List; | 4 | import java.util.List; |
| 5 | import java.util.Map; | 5 | import java.util.Map; |
| 6 | 6 | ||
| 7 | -import org.springframework.data.domain.Page; | ||
| 8 | -import org.springframework.data.domain.PageRequest; | ||
| 9 | - | ||
| 10 | import com.bsth.entity.directive.D60; | 7 | import com.bsth.entity.directive.D60; |
| 11 | import com.bsth.entity.directive.D64; | 8 | import com.bsth.entity.directive.D64; |
| 12 | import com.bsth.entity.directive.D80; | 9 | import com.bsth.entity.directive.D80; |
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
| @@ -40,6 +40,8 @@ import com.bsth.security.util.SecurityUtils; | @@ -40,6 +40,8 @@ import com.bsth.security.util.SecurityUtils; | ||
| 40 | import com.bsth.service.impl.BaseServiceImpl; | 40 | import com.bsth.service.impl.BaseServiceImpl; |
| 41 | import com.bsth.util.DateUtils; | 41 | import com.bsth.util.DateUtils; |
| 42 | import com.bsth.websocket.handler.RealControlSocketHandler; | 42 | import com.bsth.websocket.handler.RealControlSocketHandler; |
| 43 | +import com.fasterxml.jackson.core.JsonProcessingException; | ||
| 44 | +import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 43 | import com.google.common.base.Splitter; | 45 | import com.google.common.base.Splitter; |
| 44 | 46 | ||
| 45 | @Service | 47 | @Service |
| @@ -165,10 +167,17 @@ public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> implemen | @@ -165,10 +167,17 @@ public class DirectiveServiceImpl extends BaseServiceImpl<D60, Integer> implemen | ||
| 165 | */ | 167 | */ |
| 166 | @Override | 168 | @Override |
| 167 | public void sendD60ToPage(ScheduleRealInfo sch) { | 169 | public void sendD60ToPage(ScheduleRealInfo sch) { |
| 168 | - JSONObject json = new JSONObject(); | ||
| 169 | - json.put("fn", "directive"); | ||
| 170 | - json.put("t", sch); | ||
| 171 | - socketHandler.sendMessageToLine(sch.getXlBm(), json.toJSONString()); | 170 | + Map<String, Object> map = new HashMap<>(); |
| 171 | + map.put("fn", sch); | ||
| 172 | + map.put("t", sch); | ||
| 173 | + | ||
| 174 | + ObjectMapper mapper = new ObjectMapper(); | ||
| 175 | + | ||
| 176 | + try { | ||
| 177 | + socketHandler.sendMessageToLine(sch.getXlBm(), mapper.writeValueAsString(map)); | ||
| 178 | + } catch (JsonProcessingException e) { | ||
| 179 | + logger.error("", e); | ||
| 180 | + } | ||
| 172 | } | 181 | } |
| 173 | 182 | ||
| 174 | @Override | 183 | @Override |
src/main/java/com/bsth/service/forecast/SampleService.java
0 → 100644
src/main/java/com/bsth/service/forecast/SampleServiceImpl.java
0 → 100644
src/main/java/com/bsth/service/sys/impl/ModuleServiceImpl.java
| 1 | package com.bsth.service.sys.impl; | 1 | package com.bsth.service.sys.impl; |
| 2 | 2 | ||
| 3 | import java.util.ArrayList; | 3 | import java.util.ArrayList; |
| 4 | +import java.util.Collections; | ||
| 5 | +import java.util.Comparator; | ||
| 4 | import java.util.HashMap; | 6 | import java.util.HashMap; |
| 5 | import java.util.HashSet; | 7 | import java.util.HashSet; |
| 6 | import java.util.List; | 8 | import java.util.List; |
| @@ -8,6 +10,8 @@ import java.util.Map; | @@ -8,6 +10,8 @@ import java.util.Map; | ||
| 8 | import java.util.Set; | 10 | import java.util.Set; |
| 9 | 11 | ||
| 10 | import org.springframework.beans.factory.annotation.Autowired; | 12 | import org.springframework.beans.factory.annotation.Autowired; |
| 13 | +import org.springframework.data.domain.Sort; | ||
| 14 | +import org.springframework.data.domain.Sort.Direction; | ||
| 11 | import org.springframework.stereotype.Service; | 15 | import org.springframework.stereotype.Service; |
| 12 | 16 | ||
| 13 | import com.bsth.common.ResponseCode; | 17 | import com.bsth.common.ResponseCode; |
| @@ -60,7 +64,7 @@ public class ModuleServiceImpl extends BaseServiceImpl<Module, Integer> implemen | @@ -60,7 +64,7 @@ public class ModuleServiceImpl extends BaseServiceImpl<Module, Integer> implemen | ||
| 60 | SysUser user = SecurityUtils.getCurrentUser(); | 64 | SysUser user = SecurityUtils.getCurrentUser(); |
| 61 | Set<Role> roles = user.getRoles(); | 65 | Set<Role> roles = user.getRoles(); |
| 62 | 66 | ||
| 63 | - List<Module> all = (List<Module>) moduleRepository.findAll() | 67 | + List<Module> all = (List<Module>) moduleRepository.findAll(new Sort(Direction.ASC, "id")) |
| 64 | ,results = new ArrayList<>(); | 68 | ,results = new ArrayList<>(); |
| 65 | 69 | ||
| 66 | Map<Integer, Module> map = new HashMap<>(); | 70 | Map<Integer, Module> map = new HashMap<>(); |
src/main/java/com/bsth/websocket/handler/SendUtils.java
| @@ -155,7 +155,8 @@ public class SendUtils{ | @@ -155,7 +155,8 @@ public class SendUtils{ | ||
| 155 | try{ | 155 | try{ |
| 156 | ScheduleRealInfo twins = sch.getTwinsSch(); | 156 | ScheduleRealInfo twins = sch.getTwinsSch(); |
| 157 | if(twins != null | 157 | if(twins != null |
| 158 | - && lineConfigData.get(sch.getXlBm()).getOutConfig() == 2){ | 158 | + && lineConfigData.get(sch.getXlBm()).getOutConfig() == 2 |
| 159 | + && twins.getBcType().equals("out")){ | ||
| 159 | 160 | ||
| 160 | twins.setFcsjActualAll(sch.getFcsjActualTime()); | 161 | twins.setFcsjActualAll(sch.getFcsjActualTime()); |
| 161 | //刷新关联的出场班次 | 162 | //刷新关联的出场班次 |
| @@ -171,7 +172,8 @@ public class SendUtils{ | @@ -171,7 +172,8 @@ public class SendUtils{ | ||
| 171 | try{ | 172 | try{ |
| 172 | ScheduleRealInfo twins = sch.getTwinsSch(); | 173 | ScheduleRealInfo twins = sch.getTwinsSch(); |
| 173 | if(twins != null | 174 | if(twins != null |
| 174 | - && lineConfigData.get(sch.getXlBm()).getOutConfig() == 2){ | 175 | + && lineConfigData.get(sch.getXlBm()).getOutConfig() == 2 |
| 176 | + && twins.getBcType().equals("in")){ | ||
| 175 | 177 | ||
| 176 | twins.setZdsjActualAll(sch.getZdsjActualTime()); | 178 | twins.setZdsjActualAll(sch.getZdsjActualTime()); |
| 177 | //刷新关联的出场班次 | 179 | //刷新关联的出场班次 |
src/main/resources/datatools/config-dev.properties
| @@ -4,13 +4,13 @@ | @@ -4,13 +4,13 @@ | ||
| 4 | datatools.kettle_properties=/datatools/kettle.properties | 4 | datatools.kettle_properties=/datatools/kettle.properties |
| 5 | # 2、ktr文件通用配置变量(数据库连接,根据不同的环境需要修正) | 5 | # 2、ktr文件通用配置变量(数据库连接,根据不同的环境需要修正) |
| 6 | #数据库ip地址 | 6 | #数据库ip地址 |
| 7 | -datatools.kvars_dbip=127.0.0.1 | 7 | +datatools.kvars_dbip=192.168.168.201 |
| 8 | #数据库用户名 | 8 | #数据库用户名 |
| 9 | datatools.kvars_dbuname=root | 9 | datatools.kvars_dbuname=root |
| 10 | #数据库密码 | 10 | #数据库密码 |
| 11 | -datatools.kvars_dbpwd= | 11 | +datatools.kvars_dbpwd=123456 |
| 12 | #数据库库名 | 12 | #数据库库名 |
| 13 | -datatools.kvars_dbdname=control | 13 | +datatools.kvars_dbdname=mh_control |
| 14 | 14 | ||
| 15 | # 3、上传数据配置信息 | 15 | # 3、上传数据配置信息 |
| 16 | # 上传文件目录配置(根据不同的环境需要修正) | 16 | # 上传文件目录配置(根据不同的环境需要修正) |
src/main/resources/ms-jdbc.properties
| 1 | ms.mysql.driver= com.mysql.jdbc.Driver | 1 | ms.mysql.driver= com.mysql.jdbc.Driver |
| 2 | -ms.mysql.url= jdbc:mysql://192.168.168.201:3306/ms?useUnicode=true&characterEncoding=utf-8 | 2 | +ms.mysql.url= jdbc:mysql://127.0.0.1:3306/ms?useUnicode=true&characterEncoding=utf-8 |
| 3 | ms.mysql.username= root | 3 | ms.mysql.username= root |
| 4 | -ms.mysql.password= 123456 | 4 | +ms.mysql.password= panzhao |
| 5 | 5 | ||
| 6 | #ms.mysql.driver= com.mysql.jdbc.Driver | 6 | #ms.mysql.driver= com.mysql.jdbc.Driver |
| 7 | #ms.mysql.url= jdbc:mysql://192.168.168.171:3306/ms?useUnicode=true&characterEncoding=utf-8 | 7 | #ms.mysql.url= jdbc:mysql://192.168.168.171:3306/ms?useUnicode=true&characterEncoding=utf-8 |
src/main/resources/static/pages/control/line/css/lineControl.css
| @@ -2554,6 +2554,8 @@ span.nt-coord:before{ | @@ -2554,6 +2554,8 @@ span.nt-coord:before{ | ||
| 2554 | margin: 8px 0; | 2554 | margin: 8px 0; |
| 2555 | } | 2555 | } |
| 2556 | 2556 | ||
| 2557 | + | ||
| 2558 | + | ||
| 2557 | tr.linjia td:nth-child(1):AFTER { | 2559 | tr.linjia td:nth-child(1):AFTER { |
| 2558 | content: "\f173"; | 2560 | content: "\f173"; |
| 2559 | font: normal normal normal 14px/1 FontAwesome; | 2561 | font: normal normal normal 14px/1 FontAwesome; |
| @@ -2565,6 +2567,21 @@ tr.linjia td:nth-child(1):AFTER { | @@ -2565,6 +2567,21 @@ tr.linjia td:nth-child(1):AFTER { | ||
| 2565 | padding: 1px 3px 1px 3px; | 2567 | padding: 1px 3px 1px 3px; |
| 2566 | background: #e7505a; | 2568 | background: #e7505a; |
| 2567 | border-radius: 15px; | 2569 | border-radius: 15px; |
| 2570 | + box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12); | ||
| 2571 | +} | ||
| 2572 | + | ||
| 2573 | +tr.child_task td:nth-child(1):AFTER{ | ||
| 2574 | + content: "Z"; | ||
| 2575 | + font: normal normal normal 14px/1 FontAwesome; | ||
| 2576 | + position: absolute; | ||
| 2577 | + right: 1px; | ||
| 2578 | + bottom: 2px; | ||
| 2579 | + color: #ffffff; | ||
| 2580 | + padding: 1px 3px 1px 3px; | ||
| 2581 | + background: #3598dc; | ||
| 2582 | + border-radius: 15px; | ||
| 2583 | + font-weight: bold; | ||
| 2584 | + box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12); | ||
| 2568 | } | 2585 | } |
| 2569 | 2586 | ||
| 2570 | .device_event_str{ | 2587 | .device_event_str{ |
src/main/resources/static/pages/control/line/js/data.js
| @@ -197,10 +197,6 @@ var _data = (function(){ | @@ -197,10 +197,6 @@ var _data = (function(){ | ||
| 197 | if(!lineLpMap[lineCode][this.lpName]) | 197 | if(!lineLpMap[lineCode][this.lpName]) |
| 198 | lineLpMap[lineCode][this.lpName] = []; | 198 | lineLpMap[lineCode][this.lpName] = []; |
| 199 | lineLpMap[lineCode][this.lpName].push(this); | 199 | lineLpMap[lineCode][this.lpName].push(this); |
| 200 | - //车辆 ——> 班次数组 | ||
| 201 | - /*if(!clSchMap[this.clZbh]) | ||
| 202 | - clSchMap[this.clZbh] = []; | ||
| 203 | - clSchMap[this.clZbh].push(this);*/ | ||
| 204 | }); | 200 | }); |
| 205 | 201 | ||
| 206 | //按发车时间排序 | 202 | //按发车时间排序 |
src/main/resources/static/pages/control/line/js/rightMenu.js
| @@ -571,14 +571,15 @@ var _menu = (function() { | @@ -571,14 +571,15 @@ var _menu = (function() { | ||
| 571 | var params = $('form#schinfoFineTune').serializeJSON(); | 571 | var params = $('form#schinfoFineTune').serializeJSON(); |
| 572 | 572 | ||
| 573 | if(!customFormValidate('form#schinfoFineTune'))return; | 573 | if(!customFormValidate('form#schinfoFineTune'))return; |
| 574 | - | 574 | + |
| 575 | + var loadIndex = layer.msg('操作中...', {icon: 16}); | ||
| 575 | $post('/realSchedule/schInfoFineTune', params, function(rs){ | 576 | $post('/realSchedule/schInfoFineTune', params, function(rs){ |
| 576 | layer.close(index); | 577 | layer.close(index); |
| 578 | + layer.close(loadIndex); | ||
| 579 | + | ||
| 577 | if(rs.ts) | 580 | if(rs.ts) |
| 578 | _alone.refreshScheduleArray(rs.ts); | 581 | _alone.refreshScheduleArray(rs.ts); |
| 579 | 582 | ||
| 580 | - /*if(rs.nextSch) | ||
| 581 | - _alone.refreshSchedule(rs.nextSch);*/ | ||
| 582 | }); | 583 | }); |
| 583 | }); | 584 | }); |
| 584 | } | 585 | } |
src/main/resources/static/pages/control/line/temps/alone_tp.html
| @@ -104,7 +104,7 @@ | @@ -104,7 +104,7 @@ | ||
| 104 | <!-- 班次table --> | 104 | <!-- 班次table --> |
| 105 | <script id="alone_plan_table_temp" type="text/html"> | 105 | <script id="alone_plan_table_temp" type="text/html"> |
| 106 | {{each list as item i}} | 106 | {{each list as item i}} |
| 107 | -<tr data-id={{item.id}} class="{{if item.sflj}}linjia{{/if}}"> | 107 | +<tr data-id={{item.id}} class="{{if item.sflj}}linjia{{/if}} {{if item.cTasks.length > 0}} child_task {{/if}}"> |
| 108 | <td name="lineNo"></td> | 108 | <td name="lineNo"></td> |
| 109 | <td data-name="lpName"><a href="javascript:;">{{item.lpName}}</a></td> | 109 | <td data-name="lpName"><a href="javascript:;">{{item.lpName}}</a></td> |
| 110 | 110 | ||
| @@ -138,7 +138,8 @@ | @@ -138,7 +138,8 @@ | ||
| 138 | 138 | ||
| 139 | {{else if item.status == 1}} | 139 | {{else if item.status == 1}} |
| 140 | <td data-name="sjfcsj" class="tl-zzzx sfsj-item">{{item.fcsjActual}}<span class="fcsj-diff">{{item.fcsj_diff}}</span></td> | 140 | <td data-name="sjfcsj" class="tl-zzzx sfsj-item">{{item.fcsjActual}}<span class="fcsj-diff">{{item.fcsj_diff}}</span></td> |
| 141 | - | 141 | +{{else if item.status == 0 && item.late}} |
| 142 | + <td data-name="sjfcsj" class="tl-wd sfsj-item">{{item.fcsjActual}}<span class="fcsj-diff">{{item.fcsj_diff}}</span></td> | ||
| 142 | {{else }} | 143 | {{else }} |
| 143 | <td data-name="sjfcsj" class="sfsj-item">{{item.fcsjActual}}<span class="fcsj-diff">{{item.fcsj_diff}}</span></td> | 144 | <td data-name="sjfcsj" class="sfsj-item">{{item.fcsjActual}}<span class="fcsj-diff">{{item.fcsj_diff}}</span></td> |
| 144 | {{/if}} | 145 | {{/if}} |
src/main/resources/static/pages/forecast/gps/gpsMain.html
0 → 100644
src/main/resources/static/pages/forecast/real/realForecast.html
0 → 100644
src/main/resources/static/pages/forecast/sample/css/main.css
0 → 100644
| 1 | +#lineConfigPanel{ | ||
| 2 | + background: #fff; | ||
| 3 | + overflow: hidden; | ||
| 4 | + font-family: 'Segoe UI',Arial,'Microsoft Yahei',sans-serif !important; | ||
| 5 | + min-width: 1392px; | ||
| 6 | +} | ||
| 7 | + | ||
| 8 | +#lineConfigPanel h1{ | ||
| 9 | + -webkit-margin-start: 23px; | ||
| 10 | + color: rgb(92, 97, 102); | ||
| 11 | + margin-bottom: 1em; | ||
| 12 | + margin-top: 21px; | ||
| 13 | + font-size: 1.5em; | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +#lineConfigPanel .line_config_tree ul { | ||
| 17 | + list-style-type: none; | ||
| 18 | + padding: 0; | ||
| 19 | + height: 100% !important; | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +#lineConfigPanel .line_config_tree ul li{ | ||
| 23 | + -webkit-border-start: 6px solid transparent; | ||
| 24 | + -webkit-padding-start: 18px; | ||
| 25 | + -webkit-user-select: none; | ||
| 26 | + cursor: pointer; | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +#lineConfigPanel .line_config_tree ul li.selected{ | ||
| 30 | + -webkit-border-start-color: #1bbc9b; | ||
| 31 | + cursor: default; | ||
| 32 | + pointer-events: none; | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +#lineConfigPanel .line_config_tree ul li button{ | ||
| 36 | + background-color: white; | ||
| 37 | + border: 0; | ||
| 38 | + color: #999; | ||
| 39 | + cursor: pointer; | ||
| 40 | + font: inherit; | ||
| 41 | + line-height: 1.417em; | ||
| 42 | + margin: 6px 0; | ||
| 43 | + padding: 0; | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +#lineConfigPanel .line_config_tree ul li.selected button{ | ||
| 47 | + color: #1bbc9b; | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +#lineConfigPanel #trafficChart{ | ||
| 51 | + display: inline-block; | ||
| 52 | + width: calc(100% - 152px); | ||
| 53 | + vertical-align: top; | ||
| 54 | + height: 100%; | ||
| 55 | +} | ||
| 56 | + | ||
| 57 | +#lineConfigPanel #trafficChart .sample_tags{ | ||
| 58 | + width: 100%; | ||
| 59 | + height: 65px; | ||
| 60 | + text-align: right; | ||
| 61 | + padding: 20px 40px 0; | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | +#lineConfigPanel #trafficChart .sample_tags a.tag{ | ||
| 65 | + display: inline-block; | ||
| 66 | + line-height: 1; | ||
| 67 | + vertical-align: baseline; | ||
| 68 | + background-color: #E8E8E8; | ||
| 69 | + padding: .5833em .833em; | ||
| 70 | + color: rgba(0,0,0,.6); | ||
| 71 | + text-transform: none; | ||
| 72 | + font-weight: 700; | ||
| 73 | + border: 0 solid transparent; | ||
| 74 | + border-radius: .28571429rem !important; | ||
| 75 | + -webkit-transition: background .1s ease; | ||
| 76 | + transition: background .1s ease; | ||
| 77 | + font-size: .85714286rem; | ||
| 78 | + margin: .8em .5em .5em 0; | ||
| 79 | + font-weight: 400; | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +#lineConfigPanel #trafficChart svg{ | ||
| 83 | + width: 100%; | ||
| 84 | + height: calc(100% - 65px); | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +#lineConfigPanel #trafficChart svg circle{ | ||
| 88 | + fill: #b9b7b7; | ||
| 89 | + r: 6; | ||
| 90 | + stroke: rgb(253, 253, 253); | ||
| 91 | + stroke-width: 3; | ||
| 92 | +} | ||
| 93 | + | ||
| 94 | +#lineConfigPanel #trafficChart svg path{ | ||
| 95 | + stroke-width: 6.4px; | ||
| 96 | + opacity: 0.9; | ||
| 97 | + stroke: #b2afaf; | ||
| 98 | + cursor: pointer; | ||
| 99 | +} | ||
| 100 | + | ||
| 101 | +#lineConfigPanel #trafficChart svg path.active{ | ||
| 102 | + stroke: #1bbc9b; | ||
| 103 | +} | ||
| 104 | + | ||
| 105 | +#lineConfigPanel #trafficChart svg text{ | ||
| 106 | + font-size: 85%; | ||
| 107 | + fill: #6b6666; | ||
| 108 | + font-weight: bold; | ||
| 109 | +} | ||
| 110 | + | ||
| 111 | +#lineConfigPanel #trafficChart .sample_tags a.tag.active{ | ||
| 112 | + background-color: #1bbc9b; | ||
| 113 | + color: white; | ||
| 114 | +} | ||
| 115 | + | ||
| 116 | +.line_config_tree{ | ||
| 117 | + width: 155px; | ||
| 118 | + float: left; | ||
| 119 | + height: 100%; | ||
| 120 | +} | ||
| 121 | + | ||
| 122 | +#lineConfigPanel .slimScrollBar{ | ||
| 123 | + border-radius: 7px !important; | ||
| 124 | + background: rgb(176, 173, 173) !important; | ||
| 125 | + width: 4px !important; | ||
| 126 | +} | ||
| 127 | + | ||
| 128 | +.line_config_content{ | ||
| 129 | + width: calc(100% - 155px); | ||
| 130 | + float: left; | ||
| 131 | + height: 100%; | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | +.line_config_content .body{ | ||
| 135 | + height: 100% !important; | ||
| 136 | + overflow: auto; | ||
| 137 | + color: rgb(48, 57, 66); | ||
| 138 | + overflow: hidden; | ||
| 139 | +} | ||
| 140 | + | ||
| 141 | +.left_station_route{ | ||
| 142 | + height: 100%; | ||
| 143 | + width: 147px; | ||
| 144 | + display: inline-block; | ||
| 145 | + padding-top: 7px; | ||
| 146 | +} | ||
| 147 | + | ||
| 148 | + .left_station_route ul{ | ||
| 149 | + list-style-type: none; | ||
| 150 | + padding-left: 0; | ||
| 151 | +} | ||
| 152 | + | ||
| 153 | +.left_station_route ul li{ | ||
| 154 | + -webkit-user-select: none; | ||
| 155 | + margin: 8px 0; | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | +.left_station_route ul.list li:FIRST-CHILD { | ||
| 159 | + margin-top: 0px; | ||
| 160 | +} | ||
| 161 | + | ||
| 162 | +.left_station_route .tabbable-line ul li div{ | ||
| 163 | + padding-left: 10px; | ||
| 164 | + display: block; | ||
| 165 | + white-space: nowrap; | ||
| 166 | + overflow: hidden; | ||
| 167 | + text-overflow: ellipsis; | ||
| 168 | +} | ||
| 169 | + | ||
| 170 | +.left_station_route .tabbable-line ul li div a{ | ||
| 171 | + color: #605f5f; | ||
| 172 | + text-decoration: none; | ||
| 173 | +} | ||
| 174 | + | ||
| 175 | +.left_station_route ul.list li:FIRST-CHILD div a{ | ||
| 176 | + cursor: default; | ||
| 177 | + color: #bbbaba; | ||
| 178 | +} | ||
| 179 | + | ||
| 180 | +.left_station_route .tabbable-line .tab-content{ | ||
| 181 | + height: 100% !important; | ||
| 182 | + padding: 20px 0 0; | ||
| 183 | +} | ||
| 184 | + | ||
| 185 | +rect.station_rect{ | ||
| 186 | + fill: #949595; | ||
| 187 | + height: 24px; | ||
| 188 | + rx: 3px; | ||
| 189 | +} | ||
| 190 | + | ||
| 191 | +rect.f_rect{ | ||
| 192 | + height: 20px; | ||
| 193 | + fill: #32c2a5; | ||
| 194 | + rx: 3px; | ||
| 195 | +} | ||
| 196 | + | ||
| 197 | +#lineConfigPanel #trafficChart svg text.f_text{ | ||
| 198 | + fill: #ffffff; | ||
| 199 | +} | ||
| 200 | + | ||
| 201 | +.select2-container--open{ | ||
| 202 | + z-index: 100000000; | ||
| 203 | +} | ||
| 0 | \ No newline at end of file | 204 | \ No newline at end of file |
src/main/resources/static/pages/forecast/sample/js/svg.js
0 → 100644
| 1 | +var sampleSvg = (function(){ | ||
| 2 | + | ||
| 3 | + var rowNum = 5 | ||
| 4 | + ,itemWidth = 240 | ||
| 5 | + , rowHeight = 130 | ||
| 6 | + , _count | ||
| 7 | + , margin | ||
| 8 | + , _opt | ||
| 9 | + , svg | ||
| 10 | + , _data; | ||
| 11 | + | ||
| 12 | + var stationMapp = {}; | ||
| 13 | + //路由 | ||
| 14 | + var routes; | ||
| 15 | + //X比例尺 | ||
| 16 | + var scaleX = function(d, i){ | ||
| 17 | + var r = parseInt(i / rowNum) | ||
| 18 | + ,x = (i % rowNum) * itemWidth; | ||
| 19 | + | ||
| 20 | + if(r % 2 != 0) | ||
| 21 | + x = itemWidth * (rowNum - 1) - x ; | ||
| 22 | + return x + margin; | ||
| 23 | + } | ||
| 24 | + //Y 比例尺 | ||
| 25 | + var scaleY = function(d, i){ | ||
| 26 | + return (parseInt(i / rowNum)) * rowHeight + 60; | ||
| 27 | + }; | ||
| 28 | + | ||
| 29 | + var dx = function(d){return d.cx;}; | ||
| 30 | + var dy = function(d){return d.cy;}; | ||
| 31 | + var text = function(d){return d.stationName;} | ||
| 32 | + var transform = function(d, i){ | ||
| 33 | + var size = d.stationName.length | ||
| 34 | + ,dx = size / 2 * 12 | ||
| 35 | + ,dy = -15; | ||
| 36 | + | ||
| 37 | + if((i + 1) % rowNum == 1 && i != 0) | ||
| 38 | + dy += 40; | ||
| 39 | + return 'translate(-'+dx+', '+dy+')'; | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + var line = d3.svg.line().x(function(d) { | ||
| 43 | + return d.cx; | ||
| 44 | + }).y(function(d) { | ||
| 45 | + return d.cy; | ||
| 46 | + }); | ||
| 47 | + | ||
| 48 | + var dataId = function(d, i){ | ||
| 49 | + if(i >= _count - 1) | ||
| 50 | + return null; | ||
| 51 | + else | ||
| 52 | + return _opt.rts[i + 1].stationCode; | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + function draw(opt){ | ||
| 56 | + $('#trafficChart svg').remove(); | ||
| 57 | + svg = d3.select('#trafficChart').append('svg'); | ||
| 58 | + //容器宽度 | ||
| 59 | + var width = $('#trafficChart svg').width(); | ||
| 60 | + margin = (width - (rowNum - 1) * itemWidth) / 2; | ||
| 61 | + var rts = opt.rts | ||
| 62 | + _count = rts.length; | ||
| 63 | + _opt = opt; | ||
| 64 | + routes = rts; | ||
| 65 | + //附加坐标 | ||
| 66 | + $.each(rts , function(i, obj){ | ||
| 67 | + obj.cx = scaleX(obj, i); | ||
| 68 | + obj.cy = scaleY(obj, i); | ||
| 69 | + stationMapp[obj.stationCode] = obj.stationName; | ||
| 70 | + }); | ||
| 71 | + | ||
| 72 | + //画线 | ||
| 73 | + svg.selectAll('path').data(rts) | ||
| 74 | + .enter().append('path') | ||
| 75 | + .attr('d', function(d, i){ | ||
| 76 | + if(i == _count - 1) | ||
| 77 | + return; | ||
| 78 | + return line([d, rts[i + 1]]); | ||
| 79 | + }) | ||
| 80 | + .attr('data-id', dataId) | ||
| 81 | + .attr('data-group', function(d, i){return dataId(d, i - 1) + '_' + dataId(null, i)}) | ||
| 82 | + .on('click', function(){popAddModal($(this).data('id'))}); | ||
| 83 | + | ||
| 84 | + //画点 | ||
| 85 | + svg.selectAll('circle').data(rts) | ||
| 86 | + .enter().append('circle') | ||
| 87 | + .attr('cx', dx) | ||
| 88 | + .attr('cy', dy) | ||
| 89 | + | ||
| 90 | + //站点名 | ||
| 91 | + drawText(rts); | ||
| 92 | + //显示tags | ||
| 93 | + showTags(); | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + $('#trafficChart').on('click', '.sample_tags a.tag', function(){ | ||
| 97 | + $('.sample_tags a.tag.active').removeClass('active'); | ||
| 98 | + $(this).addClass('active'); | ||
| 99 | + var tag = $(this).text(); | ||
| 100 | + clearRunTimeE(); | ||
| 101 | + //show | ||
| 102 | + showRunTimeE(_data[tag]) | ||
| 103 | + | ||
| 104 | + }); | ||
| 105 | + | ||
| 106 | + function showRunTimeE(rs){ | ||
| 107 | + //改变path颜色 | ||
| 108 | + $.each(rs, function(){ | ||
| 109 | + var group = this.sStation + '_' + this.eStation | ||
| 110 | + ,path = $('#trafficChart path[data-group='+group+']') | ||
| 111 | + ,d = path.attr('d'); | ||
| 112 | + this.cp = analysePath(d); | ||
| 113 | + path.attr('class', 'active') | ||
| 114 | + .attr('data-sid', this.id); | ||
| 115 | + }); | ||
| 116 | + | ||
| 117 | + //背景 | ||
| 118 | + svg.selectAll('.f_rect') | ||
| 119 | + .data(rs).enter().append('rect') | ||
| 120 | + .attr('x', function(d){return d.cp[0]}) | ||
| 121 | + .attr('y', function(d){return d.cp[1]}) | ||
| 122 | + .attr('transform', 'translate(-4, -14)') | ||
| 123 | + .attr('width', function(d){ | ||
| 124 | + return (d.runTime + '').length * 7 + 20; | ||
| 125 | + }) | ||
| 126 | + .classed('f_rect', true); | ||
| 127 | + | ||
| 128 | + //时间text | ||
| 129 | + svg.selectAll('.f_text') | ||
| 130 | + .data(rs).enter().append('text') | ||
| 131 | + .attr('x', function(d){return d.cp[0]}) | ||
| 132 | + .attr('y', function(d){return d.cp[1]}) | ||
| 133 | + .attr('class', 'f_text') | ||
| 134 | + .text(function(d){return d.runTime + 'm'}); | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + | ||
| 138 | + function clearRunTimeE(){ | ||
| 139 | + $('#trafficChart path.active').removeAttr('class'); | ||
| 140 | + $('.f_rect,.f_text').remove(); | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + function showTags(){ | ||
| 144 | + //查询 耗时信息 | ||
| 145 | + $.get('/sample/all', {'lineCode_eq': _opt.lineCode, 'updown_eq': _opt.updown}, function(rs){ | ||
| 146 | + //按tag分组数据 | ||
| 147 | + _data = {}; | ||
| 148 | + var tags = '';// | ||
| 149 | + $.each(rs, function(i, d){ | ||
| 150 | + if(!_data[d.tag]){ | ||
| 151 | + _data[d.tag] = []; | ||
| 152 | + tags += '<a class="tag">'+d.tag+'</a>'; | ||
| 153 | + } | ||
| 154 | + _data[d.tag].push(d); | ||
| 155 | + }); | ||
| 156 | + $('#trafficChart .sample_tags').html(tags); | ||
| 157 | + //选中第一个tag | ||
| 158 | + $('#trafficChart .sample_tags a.tag:eq(0)').click(); | ||
| 159 | + }); | ||
| 160 | + } | ||
| 161 | + | ||
| 162 | + function drawText(rts){ | ||
| 163 | + svg.selectAll('text').data(rts) | ||
| 164 | + .enter().append('text') | ||
| 165 | + .attr('x', dx) | ||
| 166 | + .attr('y', dy) | ||
| 167 | + .attr('transform', transform) | ||
| 168 | + .text(text) | ||
| 169 | + } | ||
| 170 | + | ||
| 171 | + var tagRange = {'早高峰': {s: '06:31', e: '08:30'}, '平峰': {s: '08:31', e: '16:00'}, '晚高峰': {s: '16:01', e: '18:00'}}; | ||
| 172 | + function popAddModal(id){ | ||
| 173 | + //var eid = id ,sid = prve(id); | ||
| 174 | + //if(!sid)return; | ||
| 175 | + | ||
| 176 | + //var opts = {sid: sid, eid: eid, sName: stationMapp[sid], eName: stationMapp[eid]}; | ||
| 177 | + $.get('/pages/forecast/sample/modal.html', function(rs){ | ||
| 178 | + var index = layer.open({ | ||
| 179 | + type: 1, | ||
| 180 | + area: '550px', | ||
| 181 | + content: rs, | ||
| 182 | + shift: 5, | ||
| 183 | + // title: '...', | ||
| 184 | + success: function(){ | ||
| 185 | + $('#forecast_sample_modal').trigger('init', {_opt: _opt, _data: _data, id: id}); | ||
| 186 | + /*$("#addSampleForm select[name=tag]").select2({ | ||
| 187 | + maximumSelectionLength: 1, | ||
| 188 | + tags: true | ||
| 189 | + }) | ||
| 190 | + .on('change', function(){ | ||
| 191 | + var t = $(this).val(); | ||
| 192 | + if(tagRange[t]){ | ||
| 193 | + $("#addSampleForm input[name=sDate]").val(tagRange[t].s); | ||
| 194 | + $("#addSampleForm input[name=eDate]").val(tagRange[t].e); | ||
| 195 | + } | ||
| 196 | + }); | ||
| 197 | + | ||
| 198 | + //提交 | ||
| 199 | + $('#addSampleForm .confirm').on('click', function(){ | ||
| 200 | + if(customFormValidate('#addSampleForm')){ | ||
| 201 | + console.log(_opt); | ||
| 202 | + var param = $('#addSampleForm').serializeJSON(); | ||
| 203 | + param.lineCode = _opt.lineCode; | ||
| 204 | + param.updown = _opt.updown; | ||
| 205 | + $post('/sample', param, function(){layer.close(index);}); | ||
| 206 | + } | ||
| 207 | + });*/ | ||
| 208 | + } | ||
| 209 | + }); | ||
| 210 | + }); | ||
| 211 | + } | ||
| 212 | + | ||
| 213 | + | ||
| 214 | + var drawObject = { | ||
| 215 | + draw: draw , | ||
| 216 | + popAddModal: popAddModal | ||
| 217 | + } | ||
| 218 | + | ||
| 219 | + //分析path d 路径中间点 | ||
| 220 | + function analysePath(d){ | ||
| 221 | + d = d.replace('M', ''); | ||
| 222 | + var sp = d.split('L')[0].split(',') | ||
| 223 | + ,ep = d.split('L')[1].split(',') | ||
| 224 | + ,cp = []; | ||
| 225 | + sp[0] = parseInt(sp[0]); | ||
| 226 | + sp[1] = parseInt(sp[1]); | ||
| 227 | + ep[0] = parseInt(ep[0]); | ||
| 228 | + ep[1] = parseInt(ep[1]); | ||
| 229 | + | ||
| 230 | + cp = sp; | ||
| 231 | + var diff; | ||
| 232 | + if(sp[0] != ep[0]){ | ||
| 233 | + diff = Math.abs(sp[0] - ep[0]) / 2 - 16; | ||
| 234 | + cp[0] = sp[0] > ep[0]?ep[0]+diff:sp[0]+diff; | ||
| 235 | + cp[1] -= 10; | ||
| 236 | + } | ||
| 237 | + else if(sp[1] != ep[1]){ | ||
| 238 | + diff = Math.abs(sp[1] - ep[1]) / 2; | ||
| 239 | + cp[1] = sp[1] > ep[1]?ep[1]+diff:sp[1]+diff; | ||
| 240 | + | ||
| 241 | + cp[0] += 10; | ||
| 242 | + } | ||
| 243 | + return cp; | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + /** | ||
| 247 | + * 自定义表单校验 | ||
| 248 | + */ | ||
| 249 | + function customFormValidate(f){ | ||
| 250 | + var rs = true; | ||
| 251 | + //所有可见的项 | ||
| 252 | + var es = $('input,select', f); | ||
| 253 | + | ||
| 254 | + for(var i = 0, e; e = es[i++];){ | ||
| 255 | + if($(e).attr('required') && ( $(e).val() == null || $(e).val() == '')){ | ||
| 256 | + if($(e).hasClass('select2-hidden-accessible')) | ||
| 257 | + $(e).next().find('.select2-selection').addClass('custom-val-error'); | ||
| 258 | + else | ||
| 259 | + $(e).addClass('custom-val-error'); | ||
| 260 | + rs = false; | ||
| 261 | + } | ||
| 262 | + else{ | ||
| 263 | + if($(e).hasClass('select2-hidden-accessible')) | ||
| 264 | + $(e).next().find('.select2-selection').removeClass('custom-val-error'); | ||
| 265 | + else | ||
| 266 | + $(e).removeClass('custom-val-error'); | ||
| 267 | + } | ||
| 268 | + } | ||
| 269 | + | ||
| 270 | + if(!rs){ | ||
| 271 | + layer.alert('数据完整性校验失败,请检查输入项', {icon: 2, title: '操作失败', shift: 5}); | ||
| 272 | + } | ||
| 273 | + return rs; | ||
| 274 | + } | ||
| 275 | + return drawObject; | ||
| 276 | +})(); | ||
| 0 | \ No newline at end of file | 277 | \ No newline at end of file |
src/main/resources/static/pages/forecast/sample/main.html
0 → 100644
| 1 | +<link href="/pages/forecast/sample/css/main.css" rel="stylesheet" type="text/css" /> | ||
| 2 | +<div id="lineConfigPanel"> | ||
| 3 | + <div class="line_config_tree" > | ||
| 4 | + <h1 >线路</h1> | ||
| 5 | + <ul></ul> | ||
| 6 | + </div> | ||
| 7 | + | ||
| 8 | + <div class="line_config_content"> | ||
| 9 | + <div class="body "> | ||
| 10 | + <div class="left_station_route"> | ||
| 11 | + <div class="tabbable-line" style="height: 100%;"> | ||
| 12 | + <ul class="nav nav-tabs "> | ||
| 13 | + <li class="active"><a href="#tab_up" data-toggle="tab" | ||
| 14 | + aria-expanded="true"> 上 行 </a></li> | ||
| 15 | + <li class=""><a href="#tab_down" data-toggle="tab" | ||
| 16 | + aria-expanded="false"> 下 行 </a></li> | ||
| 17 | + </ul> | ||
| 18 | + <div class="tab-content" > | ||
| 19 | + <div class="tab-pane active" id="tab_up"> | ||
| 20 | + <ul class="list"> | ||
| 21 | + </ul> | ||
| 22 | + </div> | ||
| 23 | + <div class="tab-pane" id="tab_down"> | ||
| 24 | + <ul class="list"> | ||
| 25 | + </ul> | ||
| 26 | + </div> | ||
| 27 | + </div> | ||
| 28 | + </div> | ||
| 29 | + </div> | ||
| 30 | + | ||
| 31 | + <div id="trafficChart" > | ||
| 32 | + <div class="sample_tags"></div> | ||
| 33 | + </div> | ||
| 34 | + </div> | ||
| 35 | + </div> | ||
| 36 | +</div> | ||
| 37 | + | ||
| 38 | +<script id="forecast_sample_tree_item_temp" type="text/html"> | ||
| 39 | +{{each array as line }} | ||
| 40 | +<li data-code={{line.lineCode}}> | ||
| 41 | + <button>{{line.name}}</button> | ||
| 42 | +</li> | ||
| 43 | +{{/each}} | ||
| 44 | +</script> | ||
| 45 | + | ||
| 46 | +<script id="forecast_sample_route_temp" type="text/html"> | ||
| 47 | +{{each list as route i}} | ||
| 48 | +<li> | ||
| 49 | + <div> <a class="sample_route_item" data-id="{{route.stationCode}}">{{route.stationName}}</a><div> | ||
| 50 | +</li> | ||
| 51 | +{{/each}} | ||
| 52 | +</script> | ||
| 53 | + | ||
| 54 | +<script src="/pages/forecast/sample/js/svg.js"></script> | ||
| 55 | +<script> | ||
| 56 | +!function(){ | ||
| 57 | + //站点路由信息 | ||
| 58 | + var routes = {}; | ||
| 59 | + | ||
| 60 | + var $panel = $('#lineConfigPanel') | ||
| 61 | + ,$body = $('.line_config_content .body'); | ||
| 62 | + var h = $('.page-container>.page-sidebar-wrapper>.page-sidebar').height(); | ||
| 63 | + $panel.css('height', h - 18); | ||
| 64 | + | ||
| 65 | + //线路滚动条 | ||
| 66 | + $('.line_config_tree ul').slimscroll({ | ||
| 67 | + height : 'calc(100% - 68px)', | ||
| 68 | + alwaysVisible : true, | ||
| 69 | + opacity : .8 | ||
| 70 | + }); | ||
| 71 | + | ||
| 72 | + //路由 | ||
| 73 | + $('.left_station_route .tab-content').slimscroll({ | ||
| 74 | + height : 'calc(100% - 46px)', | ||
| 75 | + opacity : .8 | ||
| 76 | + }); | ||
| 77 | + | ||
| 78 | + //上下行切换事件 | ||
| 79 | + $('.left_station_route .tabbable-line ul li').on('click', function(){setTimeout(drawSvg, 300);}); | ||
| 80 | + | ||
| 81 | + $get('/line/all', {destroy_eq:0}, function(rs){ | ||
| 82 | + var itemsHtml = template('forecast_sample_tree_item_temp', {array: rs}); | ||
| 83 | + $('.line_config_tree ul').html(itemsHtml) | ||
| 84 | + .find('li:eq(0)').click(); | ||
| 85 | + }); | ||
| 86 | + | ||
| 87 | + $panel.on('click', '.line_config_tree li', function(){ | ||
| 88 | + $('.line_config_tree li.selected').removeClass('selected'); | ||
| 89 | + $(this).addClass('selected'); | ||
| 90 | + | ||
| 91 | + //显示路由信息 | ||
| 92 | + showRouteInfo(); | ||
| 93 | + }); | ||
| 94 | + | ||
| 95 | + function showRouteInfo(){ | ||
| 96 | + $.get('/stationroute/all', {'line.lineCode_eq': getLineCode(), 'destroy_eq': 0} | ||
| 97 | + ,function(rs){ | ||
| 98 | + rs.sort(function(a, b){ | ||
| 99 | + return a.stationRouteCode - b.stationRouteCode; | ||
| 100 | + }); | ||
| 101 | + var temp = 'forecast_sample_route_temp'; | ||
| 102 | + //上下行分组 | ||
| 103 | + var ups = [],downs = []; | ||
| 104 | + $.each(rs, function(){ | ||
| 105 | + if(this.directions == 0) | ||
| 106 | + ups.push(this); | ||
| 107 | + else | ||
| 108 | + downs.push(this); | ||
| 109 | + }); | ||
| 110 | + | ||
| 111 | + $('#tab_up ul').html(template(temp, {list: ups})); | ||
| 112 | + $('#tab_down ul').html(template(temp, {list: downs})); | ||
| 113 | + | ||
| 114 | + routes.ups = ups; | ||
| 115 | + routes.downs = downs; | ||
| 116 | + | ||
| 117 | + drawSvg(); | ||
| 118 | + }); | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + function showLoad(text){ | ||
| 122 | + return layer.msg(text, {icon: 16, time: 0, shade: 0.3}); | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + function getUpdown(){ | ||
| 126 | + var activePanel = $('.left_station_route .tab-content .tab-pane.active') | ||
| 127 | + ,updown = -1 | ||
| 128 | + ,id = activePanel.attr('id'); | ||
| 129 | + | ||
| 130 | + if(id == 'tab_up') | ||
| 131 | + updown = 0; | ||
| 132 | + else if(id == 'tab_down') | ||
| 133 | + updown = 1; | ||
| 134 | + | ||
| 135 | + return updown; | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + function getLineCode(){ | ||
| 139 | + return $('.line_config_tree li.selected').data('code'); | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + function drawSvg(){ | ||
| 143 | + //绘制svg | ||
| 144 | + var rts = [], updown = getUpdown(); | ||
| 145 | + if(updown === 0) | ||
| 146 | + rts = routes.ups; | ||
| 147 | + else if(updown === 1) | ||
| 148 | + rts = routes.downs; | ||
| 149 | + sampleSvg.draw({lineCode: getLineCode(), rts: rts, updown: getUpdown()}); | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + $('#lineConfigPanel').on('click', '.sample_route_item', function(){ | ||
| 153 | + sampleSvg.popAddModal($(this).data('id')); | ||
| 154 | + }) | ||
| 155 | +}(); | ||
| 156 | +</script> | ||
| 0 | \ No newline at end of file | 157 | \ No newline at end of file |
src/main/resources/static/pages/forecast/sample/modal.html
0 → 100644
| 1 | +<div id="forecast_sample_modal"> | ||
| 2 | +</div> | ||
| 3 | + | ||
| 4 | +<script id="forecast_addSample_temp" type="text/html"> | ||
| 5 | +<form class="form-horizontal" role="form" style="padding: 35px 25px;" id="addSampleForm"> | ||
| 6 | + <input type="hidden" name="sStation" value="{{sid}}"/> | ||
| 7 | + <input type="hidden" name="eStation" value="{{eid}}"/> | ||
| 8 | + <div class="form-body"> | ||
| 9 | + <div class="form-group"> | ||
| 10 | + <label class="col-md-3 control-label">开始站:</label> | ||
| 11 | + <div class="col-md-9"> | ||
| 12 | + <input type="text" class="form-control " value="{{sName}}" readonly> | ||
| 13 | + </div> | ||
| 14 | + </div> | ||
| 15 | + <div class="form-group"> | ||
| 16 | + <label class="col-md-3 control-label">截止站:</label> | ||
| 17 | + <div class="col-md-9"> | ||
| 18 | + <input type="text" class="form-control" value="{{eName}}" readonly> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + <div class="form-group"> | ||
| 22 | + <label class="col-md-3 control-label">标签:</label> | ||
| 23 | + <div class="col-md-9"> | ||
| 24 | + <select class="form-control" name="tag" multiple required> | ||
| 25 | + <option value="早高峰">早高峰</option> | ||
| 26 | + <option value="平峰">平峰</option> | ||
| 27 | + <option value="晚高峰">晚高峰</option> | ||
| 28 | + </select> | ||
| 29 | + </div> | ||
| 30 | + </div> | ||
| 31 | + <div class="form-group"> | ||
| 32 | + <label class="col-md-3 control-label">时段:</label> | ||
| 33 | + <div class="col-md-4" style="padding-right: 0;"> | ||
| 34 | + <input type="time" class="form-control" name="sDate" required> | ||
| 35 | + </div> | ||
| 36 | + <div class="col-md-1" style="margin-top: 10px;font-size: 85%;color: gray;">至</div> | ||
| 37 | + <div class="col-md-4" style="padding-left: 0;"> | ||
| 38 | + <input type="time" class="form-control" name="eDate" required> | ||
| 39 | + </div> | ||
| 40 | + </div> | ||
| 41 | + <div class="form-group"> | ||
| 42 | + <label class="col-md-3 control-label">耗时(分):</label> | ||
| 43 | + <div class="col-md-9"> | ||
| 44 | + <input type="number" class="form-control" name="runTime" required> | ||
| 45 | + </div> | ||
| 46 | + </div> | ||
| 47 | + </div> | ||
| 48 | +<br> | ||
| 49 | + <div class="form-actions"> | ||
| 50 | + <div class="row"> | ||
| 51 | + <div class="col-md-offset-4 col-md-8"> | ||
| 52 | + <button type="button" class="btn green confirm"><i class="fa fa-check"></i> 提交</button> | ||
| 53 | + <button type="button" class="btn layui-layer-close">取消</button> | ||
| 54 | + </div> | ||
| 55 | + </div> | ||
| 56 | + </div> | ||
| 57 | +</form> | ||
| 58 | +</script> | ||
| 59 | + | ||
| 60 | +<script> | ||
| 61 | +!function(){ | ||
| 62 | + var _data,_opt,id; | ||
| 63 | + | ||
| 64 | + | ||
| 65 | + $('#forecast_sample_modal').on('init', function(e, rs){ | ||
| 66 | + _data = rs._data; | ||
| 67 | + _opt = rs._opt; | ||
| 68 | + id = rs.id; | ||
| 69 | + //console.log(rs); | ||
| 70 | + }); | ||
| 71 | + | ||
| 72 | + | ||
| 73 | + function prve(that){ | ||
| 74 | + for(var i = 0; i < _opt.rts.length; i ++){ | ||
| 75 | + if(routes[i].stationCode == that){ | ||
| 76 | + if(i == 0) | ||
| 77 | + return null; | ||
| 78 | + return routes[i - 1].stationCode; | ||
| 79 | + } | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + return null; | ||
| 83 | + } | ||
| 84 | +}(); | ||
| 85 | +</script> | ||
| 0 | \ No newline at end of file | 86 | \ No newline at end of file |