Commit a5156f52f573a1ca56b6721d69ae62cc83b659f3

Authored by 娄高锋
2 parents 7ace67b2 100a7c1f

Merge branch 'pudong' of 192.168.168.201:panzhaov5/bsth_control into pudong

Showing 58 changed files with 6029 additions and 5379 deletions
src/main/java/com/bsth/controller/SectionRouteController.java
... ... @@ -37,14 +37,22 @@ public class SectionRouteController extends BaseController<SectionRoute, Integer
37 37 SectionRouteService routeService;
38 38  
39 39 /**
40   - * @param String
  40 + * @param map
41 41 * @throws
42 42 * @Description: TODO(批量撤销路段)
43 43 */
44   - @RequestMapping(value = "/batchDestroy", method = RequestMethod.GET)
  44 + @RequestMapping(value = "/batchDestroy", method = RequestMethod.POST)
45 45 public Map<String, Object> updateBatch(@RequestParam Map<String, Object> map) {
46 46 return routeService.updateSectionRouteInfoFormId(map);
47 47 }
  48 + /**
  49 + * @param id //路段路由id
  50 + * @Description: TODO(撤销路段)
  51 + */
  52 + @RequestMapping(value = "/destroy", method = RequestMethod.POST)
  53 + public Map<String, Object> destroy(@RequestParam Integer id) {
  54 + return routeService.destroy(id);
  55 + }
48 56  
49 57 /**
50 58 * @param @param map
... ...
src/main/java/com/bsth/controller/StationRouteController.java
... ... @@ -137,6 +137,18 @@ public class StationRouteController extends BaseController&lt;StationRoute, Integer
137 137 public List<Map<String, Object>> getStationRouteCenterPoints(@RequestParam Map<String, Object> map) {
138 138 return service.getStationRouteCenterPoints(map);
139 139 }
  140 +
  141 + /**
  142 + * @Description :TODO(查询线路某方向下所有站点)
  143 + *
  144 + * @param map <lineId:线路ID; direction:方向>
  145 + *
  146 + * @return List<Map<String, Object>>
  147 + */
  148 + @RequestMapping(value = "/getStationRouteList" , method = RequestMethod.GET)
  149 + public List<Map<String, Object>> getStationRouteList(@RequestParam Map<String, Object> map) {
  150 + return service.getStationRouteList(map);
  151 + }
140 152  
141 153 /**
142 154 * @Description :TODO(查询线路某方向下所有站点的中心百度坐标)
... ...
src/main/java/com/bsth/controller/realcontrol/AdminUtilsController.java
... ... @@ -2,9 +2,11 @@ package com.bsth.controller.realcontrol;
2 2  
3 3 import com.bsth.data.directive.DayOfDirectives;
4 4 import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  5 +import com.bsth.data.gpsdata_v2.handlers.overspeed.OverspeedProcess;
5 6 import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread;
6 7 import com.bsth.data.msg_queue.DirectivePushQueue;
7 8 import com.bsth.data.msg_queue.WebSocketPushQueue;
  9 +import com.bsth.data.pilot80.PilotReport;
8 10 import com.bsth.data.schedule.DayOfSchedule;
9 11 import com.bsth.entity.realcontrol.ScheduleRealInfo;
10 12 import com.bsth.websocket.handler.SendUtils;
... ... @@ -41,29 +43,32 @@ public class AdminUtilsController {
41 43 @Autowired
42 44 SendUtils sendUtils;
43 45  
  46 + @Autowired
  47 + PilotReport pilotReport;
  48 +
44 49 /**
45 50 * 出现重复班次的车辆
46 51 * @param
47 52  
48   - @RequestMapping(value = "/schRepeat", method = RequestMethod.POST)
49   - public void schRepeat(@RequestParam String nbbm){
50   - logger.info("前端通知,车辆 " + nbbm + "出现重复班次,开始检测...");
51   - List<ScheduleRealInfo> list = dayOfSchedule.findByNbbm(nbbm);
52   - logger.info("检测前,车辆班次数量:" + list.size());
53   -
54   - Map<Long, ScheduleRealInfo> map = new HashMap<>();
55   - for(ScheduleRealInfo sch : list){
56   - if(map.containsKey(sch.getId())){
57   - logger.info("检测到重复ID: " + sch.getId());
58   - }
59   - map.put(sch.getId(), sch);
60   - }
61   -
62   - logger.info("检测后,车辆班次数量:" + list.size());
63   - if(map.values().size() > 0){
64   - dayOfSchedule.replaceByNbbm(nbbm, map.values());
65   - }
66   - }*/
  53 + @RequestMapping(value = "/schRepeat", method = RequestMethod.POST)
  54 + public void schRepeat(@RequestParam String nbbm){
  55 + logger.info("前端通知,车辆 " + nbbm + "出现重复班次,开始检测...");
  56 + List<ScheduleRealInfo> list = dayOfSchedule.findByNbbm(nbbm);
  57 + logger.info("检测前,车辆班次数量:" + list.size());
  58 +
  59 + Map<Long, ScheduleRealInfo> map = new HashMap<>();
  60 + for(ScheduleRealInfo sch : list){
  61 + if(map.containsKey(sch.getId())){
  62 + logger.info("检测到重复ID: " + sch.getId());
  63 + }
  64 + map.put(sch.getId(), sch);
  65 + }
  66 +
  67 + logger.info("检测后,车辆班次数量:" + list.size());
  68 + if(map.values().size() > 0){
  69 + dayOfSchedule.replaceByNbbm(nbbm, map.values());
  70 + }
  71 + }*/
67 72  
68 73 /* @RequestMapping(value = "/directivePushQueue")
69 74 public void directivePushQueue(){
... ... @@ -132,10 +137,12 @@ public class AdminUtilsController {
132 137 public Map<String, Integer> containerSize(){
133 138 Map<String, Integer> rs = new HashMap<>();
134 139 rs.put("60_size", dayOfDirectives.all60().size());
  140 + rs.put("80_size", pilotReport.findAll().size());
135 141 rs.put("nbbm_sch_size", dayOfSchedule.findAll().size());
136 142 rs.put("lp_sch_size", dayOfSchedule.findAllByLpContainer().size());
137 143 rs.put("id_sch_size", dayOfSchedule.findAllByIdContainer().size());
138 144 rs.put("pst_sch_size", dayOfSchedule.getPstSize());
  145 + rs.put("speeds_size", OverspeedProcess.size());
139 146 return rs;
140 147 }
141 148  
... ...
src/main/java/com/bsth/data/directive/DayOfDirectives.java
... ... @@ -16,6 +16,7 @@ import org.springframework.stereotype.Component;
16 16  
17 17 import java.util.*;
18 18 import java.util.concurrent.ConcurrentHashMap;
  19 +import java.util.concurrent.ConcurrentMap;
19 20  
20 21 /**
21 22 *
... ... @@ -29,13 +30,10 @@ import java.util.concurrent.ConcurrentHashMap;
29 30 public class DayOfDirectives {
30 31  
31 32 // 当日60指令缓存
32   - private static Map<Integer, D60> d60Map;
  33 + private static ConcurrentMap<Integer, D60> d60Map;
33 34  
34 35 // 线路切换指令 64
35   - public static Map<String, D64> d64Map;
36   -
37   - //等待C0_A4回复的用户
38   - //public static Map<K, V>
  36 + public static ConcurrentMap<String, D64> d64Map;
39 37  
40 38 //等待入库的指令
41 39 public static LinkedList<Directive> pstDirectives;
... ... @@ -149,9 +147,53 @@ public class DayOfDirectives {
149 147 return;
150 148  
151 149 directiveService.save(d60);
  150 + }
  151 +
  152 + public void clear(String lineCode){
  153 + int c60 = 0, c64 = 0;
  154 +
  155 + Collection<D60> d60s = d60Map.values();
  156 + List<D60> rem60List = new ArrayList<>();
  157 + for(D60 d60 : d60s){
  158 + if(d60.getLineCode().equals(lineCode))
  159 + rem60List.add(d60);
  160 + }
  161 +
  162 + //清除60数据
  163 + for(D60 d60 : rem60List){
  164 + if(d60.getReply47() == null)
  165 + directiveService.save(d60);
  166 + if(null != d60Map.remove(d60.getMsgId()))
  167 + c60 ++;
  168 + }
  169 +
  170 + rem60List.clear();
  171 + if(c60 > 0)
  172 + logger.info("清除60数据 ," + c60);
  173 +
  174 + //找到该设备的64数据
  175 + Collection<D64> d64s = d64Map.values();
  176 + List<D64> rem64List = new ArrayList<>();
  177 + for(D64 d64 : d64s){
  178 + if(d64.get)
  179 + rem64List.add(d64);
  180 + }
  181 +
  182 + //清除64数据
  183 + for(D64 d64 : rem64List){
  184 + if(d64.getRespAck() == null)
  185 + directiveService.save64(d64);
  186 +
  187 + if(null != d64Map.remove(d64.getKey()))
  188 + c64 ++;
  189 + }
  190 +
  191 + rem64List.clear();
  192 + if(c64 > 0)
  193 + logger.info("清除64数据 ," + c64);
152 194 }*/
153   -
154   - public void clear(String device){
  195 +
  196 +/* public void clear(String device){
155 197 int c60 = 0, c64 = 0;
156 198  
157 199 Collection<D60> d60s = d60Map.values();
... ... @@ -193,6 +235,12 @@ public class DayOfDirectives {
193 235 rem64List.clear();
194 236 if(c64 > 0)
195 237 logger.info("清除64数据 ," + c64);
  238 + }*/
  239 +
  240 + public void clearAll(){
  241 + d60Map = new ConcurrentHashMap<>();
  242 + d64Map = new ConcurrentHashMap<>();
  243 + logger.info("清除指令数据 ,,,");
196 244 }
197 245  
198 246 public Collection<D60> all60(){
... ...
src/main/java/com/bsth/data/directive/DirectiveCreator.java
... ... @@ -81,7 +81,7 @@ public class DirectiveCreator {
81 81 }
82 82  
83 83  
84   - public D60 createD60_01(String nbbm, String text, int upDown, int state, Date alarmTime){
  84 + public D60 createD60_02(String nbbm, String text, int upDown, int state, Date alarmTime){
85 85 SimpleDateFormat sdfMMddHHmm = new SimpleDateFormat("MMddHHmm");
86 86  
87 87 Long timestamp = System.currentTimeMillis();
... ... @@ -102,7 +102,7 @@ public class DirectiveCreator {
102 102 directive.setMsgId(msgId);
103 103 // 构造数据
104 104 data.setDeviceId(deviceId);
105   - data.setDispatchInstruct((short) 0x01);
  105 + data.setDispatchInstruct((short) 0x02);
106 106 data.setTimestamp(timestamp);
107 107 data.setCompanyCode(company);
108 108 data.setMsgId(msgId);
... ...
src/main/java/com/bsth/data/directive/GatewayHttpUtils.java
... ... @@ -48,9 +48,7 @@ public class GatewayHttpUtils {
48 48  
49 49 int statusCode = response.getStatusLine().getStatusCode();
50 50 if(statusCode != 200){
51   - //post.abort();
52 51 logger.error("http client status code: " + statusCode);
53   - //return code;
54 52 }
55 53  
56 54 JSONObject json = JSONObject.parseObject(EntityUtils.toString(response.getEntity()));
... ...
src/main/java/com/bsth/data/gpsdata_v2/entity/GpsEntity.java
... ... @@ -13,6 +13,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
13 13 public class GpsEntity implements Cloneable{
14 14  
15 15 /** 公司代码 */
  16 + @JsonIgnore
16 17 private Short companyCode;
17 18  
18 19 /** 线路编码 */
... ... @@ -31,6 +32,7 @@ public class GpsEntity implements Cloneable{
31 32 private String stationName;
32 33  
33 34 /** 到站时间 */
  35 + @JsonIgnore
34 36 private long arrTime;
35 37  
36 38 /** 经度 */
... ... @@ -56,6 +58,12 @@ public class GpsEntity implements Cloneable{
56 58  
57 59 /** 上下行(0 上行 , 1 下行 , -1 无效) */
58 60 private Byte upDown;
  61 +
  62 + /**
  63 + * 设备原始走向_营运状态
  64 + * 当设备状态和系统不一致时,该字段有值
  65 + */
  66 + private String origStateStr;
59 67  
60 68 /** 车辆内部编码 */
61 69 private String nbbm;
... ... @@ -379,4 +387,12 @@ public class GpsEntity implements Cloneable{
379 387 public void setPlanCode(String planCode) {
380 388 this.planCode = planCode;
381 389 }
  390 +
  391 + public String getOrigStateStr() {
  392 + return origStateStr;
  393 + }
  394 +
  395 + public void setOrigStateStr(String origStateStr) {
  396 + this.origStateStr = origStateStr;
  397 + }
382 398 }
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/GpsStateProcess.java
... ... @@ -7,6 +7,9 @@ import com.bsth.entity.realcontrol.ScheduleRealInfo;
7 7 import org.springframework.beans.factory.annotation.Autowired;
8 8 import org.springframework.stereotype.Component;
9 9  
  10 +import java.util.concurrent.ConcurrentHashMap;
  11 +import java.util.concurrent.ConcurrentMap;
  12 +
10 13 /**
11 14 * GPS 状态处理
12 15 * Created by panzhao on 2017/11/15.
... ... @@ -20,6 +23,13 @@ public class GpsStateProcess {
20 23 @Autowired
21 24 GpsStatusManager gpsStatusManager;
22 25  
  26 + /**
  27 + * 设置状态差异连续次数
  28 + */
  29 + private static ConcurrentMap<String, Integer> stateDiffMap = new ConcurrentHashMap<>();
  30 +
  31 + private final static int CHANGE_THRESHOLD = 2;
  32 +
23 33 public void process(GpsEntity gps) {
24 34 //在执行的任务
25 35 ScheduleRealInfo sch = dayOfSchedule.executeCurr(gps.getNbbm());
... ... @@ -27,16 +37,40 @@ public class GpsStateProcess {
27 37 if (null == sch)
28 38 return;
29 39  
30   - byte upDown = Byte.parseByte(sch.getXlDir());
  40 + int upDown = Integer.parseInt(sch.getXlDir());
31 41 int schState = dayOfSchedule.emptyService(sch)?1:0;
32   -
  42 + String device = gps.getDeviceId();
  43 + /**
  44 + * 网关在进终点的时候,会直接将当前点位状态改变
  45 + * 为避免出现单个点的状态跳动,设置一下切换阈值
  46 + */
33 47 if(gps.getState() != schState || gps.getUpDown() != upDown){
34   - //下发指令纠正车载的 营运状态 和 走向
35   - gpsStatusManager.changeServiceState(gps.getNbbm(), upDown, schState, "同步@系统");
  48 + Integer count = 0;
  49 + if(stateDiffMap.containsKey(device))
  50 + count = stateDiffMap.get(device);
  51 +
  52 + count ++;
  53 +
  54 + if(count >= CHANGE_THRESHOLD){
  55 + //下发指令纠正车载的 营运状态 和 走向
  56 + gpsStatusManager.changeServiceState(gps.getNbbm(), upDown, schState, "同步@系统");
  57 + count = 0;
  58 + }
  59 +
  60 + stateDiffMap.put(device, count);
  61 +
  62 + //记录原始设备状态
  63 + gps.setOrigStateStr(gps.getUpDown() + "_" + gps.getState());
36 64 }
  65 + else
  66 + stateDiffMap.put(device, 0);
37 67  
38 68 if (gps.getUpDown() != upDown) {
39   - gps.setUpDown(upDown);//修正走向
  69 + gps.setUpDown((byte) upDown);//修正走向
  70 + }
  71 +
  72 + if(gps.getState() != schState){
  73 + gps.setState(schState);//修正营运状态
40 74 }
41 75  
42 76 if (!sch.getXlBm().equals(gps.getLineId())) {
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/InStationProcess.java
... ... @@ -144,6 +144,8 @@ public class InStationProcess {
144 144 dayOfSchedule.addExecPlan(next);
145 145 inStationAndInPark(sch, next);//进站既进场
146 146 }
  147 + else
  148 + dayOfSchedule.removeExecPlan(nbbm);
147 149  
148 150 //路牌的下一个班次,页面显示起点实际到达时间
149 151 ScheduleRealInfo lpNext = dayOfSchedule.nextByLp(sch);
... ... @@ -176,9 +178,14 @@ public class InStationProcess {
176 178 if(null == next && gps.isService()){
177 179 nonService(sch, "结束@系统");//营运结束
178 180 }
179   - //下发运营指令
180   - DirectivePushQueue.put6003(next, "到站@系统");
181 181  
  182 + /**
  183 + * 下一班不是全程班次的时候,下发运营指令
  184 + * 全程班次时,由网关根据进出起终点,自动切换走向
  185 +
  186 + if(null != next && !next.getBcType().equals("normal"))
  187 + DirectivePushQueue.put6003(next, "到站@系统");
  188 + */
182 189 //下发调度指令
183 190 DirectivePushQueue.put6002(next, doneSum, "到站@系统", "");
184 191 }
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/overspeed/OverspeedProcess.java
... ... @@ -43,7 +43,7 @@ public class OverspeedProcess {
43 43 */
44 44 private static Map<String, Integer> contSpeedMap;
45 45  
46   - Logger logger = LoggerFactory.getLogger(this.getClass());
  46 + static Logger logger = LoggerFactory.getLogger(OverspeedProcess.class);
47 47  
48 48 static{
49 49 multimap = ArrayListMultimap.create();
... ... @@ -51,6 +51,10 @@ public class OverspeedProcess {
51 51 realOverspeedMap = new HashMap();
52 52 }
53 53  
  54 + public static int size(){
  55 + return multimap.size();
  56 + }
  57 +
54 58 public static void clear(){
55 59 multimap = null;
56 60 multimap = ArrayListMultimap.create();
... ... @@ -60,6 +64,8 @@ public class OverspeedProcess {
60 64  
61 65 realOverspeedMap = null;
62 66 realOverspeedMap = new HashMap();
  67 +
  68 + logger.info("清理超速缓存数据,,,");
63 69 }
64 70  
65 71 public boolean process(GpsEntity gps){
... ...
src/main/java/com/bsth/data/gpsdata_v2/utils/GpsDataUtils.java
... ... @@ -15,6 +15,8 @@ public class GpsDataUtils {
15 15  
16 16 static Logger logger = LoggerFactory.getLogger(GpsDataUtils.class);
17 17  
  18 + private final static long MAX_DIFF = 1000 * 60 * 60 * 24;
  19 +
18 20 /**
19 21 * 过滤无效的gps点位
20 22 *
... ... @@ -24,9 +26,16 @@ public class GpsDataUtils {
24 26 public static List<GpsEntity> clearInvalid(List<GpsEntity> list) {
25 27 List<GpsEntity> rs = new ArrayList<>();
26 28  
  29 + long t = System.currentTimeMillis();
27 30 try {
28 31 GpsEntity prev;
29 32 for (GpsEntity gps : list) {
  33 + if(Math.abs(gps.getTimestamp() - t) > MAX_DIFF){
  34 + //尝试校准GPS时间
  35 + gps.setTimestamp(t + 1);
  36 + gps.setAbnormalStatus("timeError");
  37 + }
  38 +
30 39 prev = GpsRealData.get(gps.getDeviceId());
31 40  
32 41 //不接收过期数据
... ... @@ -48,7 +57,7 @@ public class GpsDataUtils {
48 57 if (rs.size() < list.size())
49 58 logger.info("过滤无效的点位 : " + (list.size() - rs.size()));
50 59 } catch (Exception e) {
51   - logger.error("", e);
  60 + logger.error("过滤GPS出现异常", e);
52 61 rs = list;
53 62 }
54 63 return rs;
... ...
src/main/java/com/bsth/data/msg_queue/DirectivePushQueue.java
... ... @@ -24,7 +24,7 @@ public class DirectivePushQueue implements ApplicationContextAware {
24 24 static ConcurrentLinkedQueue<QueueData_Directive> linkedList;
25 25 static DataPushThread thread;
26 26 static DirectiveService directiveService;
27   - static long t;
  27 + static long threadT;
28 28  
29 29 /**
30 30 * 下发运营指令6003的最小间隔时间
... ... @@ -34,11 +34,11 @@ public class DirectivePushQueue implements ApplicationContextAware {
34 34 /**
35 35 * 车辆 ——> 上次下发6003的时间
36 36 */
37   - static ConcurrentMap<String, Long> lastSend6003Map;
  37 + static ConcurrentMap<String, Long> lastSend60TimeMap;
38 38  
39 39 static {
40 40 linkedList = new ConcurrentLinkedQueue<>();
41   - lastSend6003Map = new ConcurrentHashMap<>();
  41 + lastSend60TimeMap = new ConcurrentHashMap<>();
42 42 }
43 43  
44 44 public static void put6002(ScheduleRealInfo sch, int finish, String sender, String txtPrefix){
... ... @@ -52,12 +52,13 @@ public class DirectivePushQueue implements ApplicationContextAware {
52 52 qd6002.setTxtPrefix(txtPrefix);
53 53  
54 54 linkedList.add(qd6002);
  55 + lastSend60TimeMap.put(sch.getClZbh(), System.currentTimeMillis());
55 56 }
56 57  
57 58 public static void put6003(String nbbm, int state, int upDown, String sender){
58 59 long t = System.currentTimeMillis();
59   - if(lastSend6003Map.containsKey(nbbm)
60   - && t - lastSend6003Map.get(nbbm) < MIN_SEND6003_SPACE)
  60 + if(lastSend60TimeMap.containsKey(nbbm)
  61 + && t - lastSend60TimeMap.get(nbbm) < MIN_SEND6003_SPACE)
61 62 return; //最短下发间隔
62 63  
63 64 QueueData_Directive qd6003 = new QueueData_Directive();
... ... @@ -68,7 +69,7 @@ public class DirectivePushQueue implements ApplicationContextAware {
68 69 qd6003.setCode("60_03");
69 70  
70 71 linkedList.add(qd6003);
71   - lastSend6003Map.put(nbbm, t);
  72 + lastSend60TimeMap.put(nbbm, t);
72 73 }
73 74  
74 75 public static void put6003(ScheduleRealInfo sch, String sender){
... ... @@ -146,7 +147,7 @@ public class DirectivePushQueue implements ApplicationContextAware {
146 147 sleepFlag = true;
147 148 }
148 149 }
149   - t = System.currentTimeMillis();
  150 + threadT = System.currentTimeMillis();
150 151 }
151 152 catch(InterruptedException e){
152 153 log.error("", e);
... ...
src/main/java/com/bsth/data/safe_driv/SafeDrivCenter.java
... ... @@ -3,6 +3,8 @@ package com.bsth.data.safe_driv;
3 3 import com.bsth.websocket.handler.SendUtils;
4 4 import org.joda.time.format.DateTimeFormat;
5 5 import org.joda.time.format.DateTimeFormatter;
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
6 8 import org.springframework.beans.BeansException;
7 9 import org.springframework.beans.factory.annotation.Autowired;
8 10 import org.springframework.context.ApplicationContext;
... ... @@ -33,6 +35,8 @@ public class SafeDrivCenter implements ApplicationContextAware {
33 35 */
34 36 private static Map<String, SafeDriv> safeMap;
35 37  
  38 + static Logger logger = LoggerFactory.getLogger(SafeDrivCenter.class);
  39 +
36 40 static {
37 41 data = new HashSet<>();
38 42 safeMap = new HashMap<>();
... ... @@ -61,6 +65,7 @@ public class SafeDrivCenter implements ApplicationContextAware {
61 65 public static void clear(){
62 66 data = new HashSet<>();
63 67 safeMap = new HashMap<>();
  68 + logger.info("清除安全驾驶数据,,,");
64 69 }
65 70  
66 71 @Override
... ...
src/main/java/com/bsth/data/schedule/thread/CalcOilThread.java
1 1 package com.bsth.data.schedule.thread;
2 2  
  3 +import com.bsth.data.directive.DayOfDirectives;
3 4 import com.bsth.data.gpsdata_v2.handlers.overspeed.OverspeedProcess;
4 5 import com.bsth.service.oil.DlbService;
5 6 import com.bsth.data.safe_driv.SafeDrivCenter;
... ... @@ -27,6 +28,9 @@ public class CalcOilThread extends Thread{
27 28 SheetService sheetService;
28 29 Logger logger = LoggerFactory.getLogger(this.getClass());
29 30  
  31 + @Autowired
  32 + DayOfDirectives dayOfDirectives;
  33 +
30 34 @Override
31 35 public void run() {
32 36 try{
... ... @@ -37,12 +41,15 @@ public class CalcOilThread extends Thread{
37 41 logger.info("开始计算班次准点率....");
38 42 sheetService.saveSheetList("");
39 43 logger.info("计算班次准点率结束!");
40   - //清除安全驾驶数据 先临时蹭这个线程
41   - SafeDrivCenter.clear();
42   - //清除超速缓存数据
43   - OverspeedProcess.clear();
44 44 } catch(Exception e){
45 45 logger.error("计算路单里程加注量失败",e);
46 46 }
  47 +
  48 + //清除指令数据
  49 + dayOfDirectives.clearAll();
  50 + //清除安全驾驶数据
  51 + SafeDrivCenter.clear();
  52 + //清除超速缓存数据
  53 + OverspeedProcess.clear();
47 54 }
48 55 }
... ...
src/main/java/com/bsth/data/schedule/thread/ScheduleRefreshThread.java
1 1 package com.bsth.data.schedule.thread;
2 2  
3   -import com.bsth.data.BasicData;
4 3 import com.bsth.data.LineConfigData;
5 4 import com.bsth.data.directive.DayOfDirectives;
6 5 import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
... ... @@ -56,17 +55,15 @@ public class ScheduleRefreshThread extends Thread{
56 55  
57 56 if(oldSchDate == null || !oldSchDate.equals(currSchDate)){
58 57  
59   - //logger.info(lineCode + "开始翻班, " + currSchDate);
60   -
61 58 try{
62   - //清除指令数据
63 59 Set<String> cars = dayOfSchedule.findCarByLineCode(lineCode);
64 60 for(String car : cars){
65   - dayOfDirectives.clear(BasicData.deviceId2NbbmMap.inverse().get(car));
66 61 GpsCacheData.remove(car);
67 62 }
68 63 //清除驾驶员上报数据
69 64 pilotReport.clear(lineCode);
  65 + //清除指令数据 指令数据,直接定时全部清空
  66 + //dayOfDirectives.clear(lineCode);
70 67 }catch (Exception e){
71 68 logger.error("清理 60 和 80出现问题", e);
72 69 }
... ...
src/main/java/com/bsth/repository/StationRouteRepository.java
... ... @@ -301,7 +301,77 @@ public interface StationRouteRepository extends BaseRepository&lt;StationRoute, Int
301 301 " s.update_date AS stationRouteUpdateDate FROM bsth_c_stationroute s WHERE s.id = ?1 ) a " +
302 302 " LEFT JOIN bsth_c_station b ON a.stationRouteStation = b.id", nativeQuery=true)
303 303 List<Object[]> findStationRouteInfo(Integer id);
304   -
  304 +
  305 + /**
  306 + * @Description : TODO(根据站点路由Id查询详情)
  307 + *
  308 + * @param id:站点路由ID
  309 + *
  310 + * @return List<Object[]>
  311 + */
  312 + @Query(value = "SELECT a.stationRouteLine," +
  313 + " a.stationRouteStation," +
  314 + " a.stationRouteCode," +
  315 + " a.stationRouteLIneCode," +
  316 + " a.stationRouteStationMark," +
  317 + " a.stationOutStationNmber," +
  318 + " a.stationRoutedirections," +
  319 + " a.stationRouteDistances," +
  320 + " a.stationRouteToTime," +
  321 + " a.staitonRouteFirstTime," +
  322 + " a.stationRouteEndTime," +
  323 + " a.stationRouteDescriptions," +
  324 + " a.stationRouteDestroy," +
  325 + " a.stationRouteVersions," +
  326 + " a.stationRouteCreateBy," +
  327 + " a.stationRouteCreateDate," +
  328 + " a.stationRouteUpdateBy," +
  329 + " a.stationRouteUpdateDate," +
  330 + " b.id AS stationId," +
  331 + " b.station_cod AS stationCode," +
  332 + " a.stationRouteName," +
  333 + " b.road_coding AS stationRoadCoding," +
  334 + " b.db_type AS stationDbType," +
  335 + " b.b_jwpoints AS stationJwpoints," +
  336 + " b.g_lonx AS stationGlonx," +
  337 + " b.g_laty AS stationGlaty," +
  338 + " b.x AS stationX," +
  339 + " b.y AS stationY," +
  340 + " ST_AsText(b.b_polygon_grid) as stationBPolyonGrid," +
  341 + " ST_AsText(b.g_polygon_grid) AS stationGPloyonGrid, " +
  342 + " b.destroy AS stationDestroy," +
  343 + " b.radius AS stationRadius," +
  344 + " b.shapes_type AS stationShapesType," +
  345 + " b.versions AS stationVersions," +
  346 + " b.descriptions AS sttationDescriptions," +
  347 + " b.create_by AS stationCreateBy," +
  348 + " b.create_date AS stationCreateDate," +
  349 + " b.update_by AS stationUpdateBy," +
  350 + " b.update_date AS stationUpdateDate," +
  351 + " a.stationRouteId,b.station_name as zdmc "+
  352 + " FROM ( SELECT s.id AS stationRouteId," +
  353 + " s.line AS stationRouteLine," +
  354 + " s.station as stationRouteStation," +
  355 + " s.station_name AS stationRouteName," +
  356 + " s.station_route_code as stationRouteCode," +
  357 + " s.line_code AS stationRouteLIneCode," +
  358 + " s.station_mark AS stationRouteStationMark," +
  359 + " s.out_station_nmber AS stationOutStationNmber," +
  360 + " s.directions AS stationRoutedirections," +
  361 + " s.distances AS stationRouteDistances," +
  362 + " s.to_time AS stationRouteToTime," +
  363 + " s.first_time AS staitonRouteFirstTime," +
  364 + " s.end_time AS stationRouteEndTime," +
  365 + " s.descriptions AS stationRouteDescriptions," +
  366 + " s.destroy AS stationRouteDestroy," +
  367 + " s.versions AS stationRouteVersions," +
  368 + " s.create_by AS stationRouteCreateBy," +
  369 + " s.create_date AS stationRouteCreateDate," +
  370 + " s.update_by AS stationRouteUpdateBy," +
  371 + " s.update_date AS stationRouteUpdateDate FROM bsth_c_stationroute s WHERE s.line = ?1 and s.directions = ?2 and s.destroy = 0) a " +
  372 + " LEFT JOIN bsth_c_station b ON a.stationRouteStation = b.id", nativeQuery=true)
  373 + List<Object[]> getStationRouteList(Integer lineId, Integer dir);
  374 +
305 375 List<StationRoute> findByLine(Line line);
306 376  
307 377 @EntityGraph(value = "stationRoute_station", type = EntityGraph.EntityGraphType.FETCH)
... ...
src/main/java/com/bsth/service/SectionRouteService.java
... ... @@ -67,5 +67,5 @@ public interface SectionRouteService extends BaseService&lt;SectionRoute, Integer&gt;
67 67  
68 68 void batchUpdate(Integer lineId, String lineCode);
69 69  
70   -
  70 + Map<String,Object> destroy(Integer id);
71 71 }
... ...
src/main/java/com/bsth/service/StationRouteService.java
... ... @@ -92,6 +92,15 @@ public interface StationRouteService extends BaseService&lt;StationRoute, Integer&gt;
92 92 * @return List<Map<String, Object>>
93 93 */
94 94 List<Map<String, Object>> getStationRouteCenterPoints(Map<String, Object> map);
  95 +
  96 + /**
  97 + * @Description :TODO(查询线路某方向下所有站点)
  98 + *
  99 + * @param map <lineId:线路ID; direction:方向>
  100 + *
  101 + * @return List<Map<String, Object>>
  102 + */
  103 + List<Map<String, Object>> getStationRouteList(Map<String, Object> map);
95 104  
96 105 /**
97 106 * @Description :TODO(撤销站点)
... ...
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
... ... @@ -128,7 +128,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
128 128 text += " (放站到"+sch.getMajorStationName()+"带客)";
129 129 }
130 130  
131   - //下发0x01指令 调度指令(闹钟有效)
  131 + //下发0x02指令 调度指令(闹钟有效)
132 132 long t = System.currentTimeMillis() + 1000 * 30,
133 133 alarmTime = sch.getDfsjT() < t?t:sch.getDfsjT();
134 134  
... ... @@ -139,7 +139,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
139 139 int state = 0;//营运状态
140 140 if(dayOfSchedule.emptyService(sch))
141 141 state = 1;
142   - d60 = new DirectiveCreator().createD60_01(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())
  142 + d60 = new DirectiveCreator().createD60_02(sch.getClZbh(), text, Integer.parseInt(sch.getXlDir())
143 143 , state, new Date(alarmTime));
144 144  
145 145 d60.setLineCode(sch.getXlBm());
... ...
src/main/java/com/bsth/service/gps/GpsServiceImpl.java
... ... @@ -5,6 +5,7 @@ import com.bsth.data.BasicData;
5 5 import com.bsth.data.forecast.entity.ArrivalEntity;
6 6 import com.bsth.data.gpsdata_v2.GpsRealData;
7 7 import com.bsth.data.gpsdata_v2.cache.GeoCacheData;
  8 +import com.bsth.data.gpsdata_v2.cache.GpsCacheData;
8 9 import com.bsth.data.gpsdata_v2.entity.GpsEntity;
9 10 import com.bsth.data.gpsdata_v2.utils.GeoUtils;
10 11 import com.bsth.data.pilot80.PilotReport;
... ... @@ -492,6 +493,7 @@ public class GpsServiceImpl implements GpsService {
492 493 try {
493 494  
494 495 gpsRealData.remove(device);
  496 + GpsCacheData.remove(BasicData.deviceId2NbbmMap.get(device));
495 497 rs.put("status", ResponseCode.SUCCESS);
496 498 } catch (Exception e) {
497 499 rs.put("status", ResponseCode.ERROR);
... ...
src/main/java/com/bsth/service/impl/SectionRouteServiceImpl.java
... ... @@ -122,7 +122,7 @@ public class SectionRouteServiceImpl extends BaseServiceImpl&lt;SectionRoute, Integ
122 122 }
123 123  
124 124 /**
125   - * @Description :TODO(查询路段信息)
  125 + * @Description :TODO(查询缓存路段信息)
126 126 *
127 127 * @param map <line.id_eq:线路ID; directions_eq:方向>
128 128 *
... ... @@ -408,4 +408,25 @@ public class SectionRouteServiceImpl extends BaseServiceImpl&lt;SectionRoute, Integ
408 408 public void batchUpdate(Integer lineId, String lineCode) {
409 409 repository.batchUpdate(lineId,lineCode);
410 410 }
  411 +
  412 +
  413 +
  414 + /**
  415 + * @Description : TODO(根据路段路由Id批量撤销路段)
  416 + *
  417 + * @param id <id:路段路由ID>
  418 + */
  419 + @Override
  420 + @Transactional
  421 + public Map<String, Object> destroy(Integer id) {
  422 + Map<String, Object> resultMap = new HashMap<String, Object>();
  423 + try {
  424 + repository.sectionRouteIsDestroyUpdBatch(id);
  425 + resultMap.put("status", ResponseCode.SUCCESS);
  426 + } catch (Exception e) {
  427 + resultMap.put("status", ResponseCode.ERROR);
  428 + logger.error("save erro.", e);
  429 + }
  430 + return resultMap;
  431 + }
411 432 }
412 433 \ No newline at end of file
... ...
src/main/java/com/bsth/service/impl/SectionServiceImpl.java
... ... @@ -453,7 +453,7 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
453 453 if(!sectionsBpoints.equals("")) {
454 454 bsectionVectorS = "LINESTRING(" + sectionsBpoints + ")";
455 455 }
456   - repository.systemSave(sectionCode, sectionName, "", "", "", "", gsectionVector, bsectionVectorS, "", "", "", 0, 0, "", 0, "", 1, sectionId);
  456 + repository.systemSave(sectionCode, sectionName, null, "", "", "", gsectionVector, bsectionVectorS, "", "", "", 0, 0, "", 0, "", 1, sectionId);
457 457  
458 458 routeRepository.sectionUpdSectionRouteCode(lineId, directions,routeCode+i);
459 459 SectionRoute route = new SectionRoute();
... ... @@ -636,7 +636,7 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
636 636 // 原坐标类型
637 637 String dbType = map.get("dbType").equals("") ? "" : map.get("dbType").toString();
638 638 // 说明
639   - String descriptions = map.get("descriptions").equals("") ? "" : map.get("descriptions").toString();
  639 + String descriptions = "";
640 640 // 是否撤销
641 641 Integer destroy = map.get("destroy").equals("") ? null : Integer.parseInt(map.get("destroy").toString());
642 642 // 方向
... ... @@ -662,14 +662,19 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
662 662 // 路段路由
663 663 Integer sectionrouteCode = map.get("sectionrouteCode").equals("") ? null : Integer.valueOf(map.get("sectionrouteCode").toString());
664 664 SectionRoute resultS = routeRepository.findOne(sectionRouteId);
665   -// int old_code = resultS.getSectionrouteCode();
666   - // 如果为空,默认在第一个路段
667   - if(sectionrouteCode!=null) {
668   - sectionrouteCode += 1;
669   - }else {
670   - sectionrouteCode = 1;
671   - }
672   - routeRepository.sectionUpdSectionRouteCode(lineCode, directions,sectionrouteCode);
  665 + int old_code = resultS.getSectionrouteCode();
  666 + // 是否修改路段序号标记
  667 + boolean type = false;
  668 + if(sectionrouteCode!=null) {
  669 + if(++sectionrouteCode == old_code) {
  670 + type = true;
  671 + }
  672 + // 默认是最前面路段
  673 + }else {
  674 + sectionrouteCode = 1;
  675 + }
  676 + if(!type)
  677 + routeRepository.sectionUpdSectionRouteCode(lineCode, directions,sectionrouteCode);
673 678 // 限速
674 679 Double speedLimit = map.get("speedLimit").equals("") ? null : Double.valueOf(map.get("speedLimit").toString());
675 680 // 版本
... ... @@ -709,7 +714,6 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
709 714 route.setDirections(directions);
710 715 route.setVersions(version);
711 716 route.setDestroy(destroy);
712   - route.setDescriptions(descriptions);
713 717 route.setCreateBy(createBy);
714 718 route.setUpdateBy(updateBy);
715 719 route.setLine(line);
... ... @@ -784,17 +788,24 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
784 788 // 路段时长
785 789 Double sectionTime = map.get("sectionTime").equals("") ? null : Double.valueOf(map.get("sectionTime").toString());
786 790 // 路段路由
787   -// Integer sectionrouteCode = map.get("sectionrouteCode").equals("") ? null : Integer.valueOf(map.get("sectionrouteCode").toString());
788   - Integer sectionrouteCode = 1;
  791 + Integer sectionrouteCode = map.get("sectionrouteCode").equals("") ? null : Integer.valueOf(map.get("sectionrouteCode").toString());
  792 +// Integer sectionrouteCode = 1;
789 793 SectionRouteCache resultS = routeCacheRepository.findOne(sectionRouteId);
790 794 int old_code = resultS.getSectionrouteCode();
  795 + // 是否修改路段序号标记
  796 + boolean type = false;
791 797 if(sectionrouteCode!=null) {
792   - sectionrouteCode += 1;
  798 + if(sectionrouteCode == old_code) {
  799 + type = true;
  800 + } else {
  801 + sectionrouteCode += 1;
  802 + }
793 803 // 默认是最前面路段
794 804 }else {
795 805 sectionrouteCode = 1;
796 806 }
797   - routeRepository.sectionUpdSectionRouteCode(lineCode, directions,sectionrouteCode);
  807 + if(!type)
  808 + routeRepository.sectionUpdSectionRouteCode(lineCode, directions,sectionrouteCode);
798 809 // 限速
799 810 Double speedLimit = map.get("speedLimit").equals("") ? null : Double.valueOf(map.get("speedLimit").toString());
800 811 // 版本
... ...
src/main/java/com/bsth/service/impl/StationRouteServiceImpl.java
... ... @@ -196,123 +196,80 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
196 196 List<Map<String, Object>> staitonChildren= new ArrayList<Map<String, Object>>();
197 197  
198 198 if(stationList.size()>0) {
199   -
200 199 for(int i = 0 ; i < stationList.size(); i++) {
201   -
202 200 Map<String, Object> tempM = new HashMap<String, Object>();
203   -
204 201 // 站点路由ID
205 202 tempM.put("stationRouteId", stationList.get(i)[0]);
206   -
207 203 // 站点路由线路ID
208 204 tempM.put("stationRouteLine", stationList.get(i)[1]);
209   -
210 205 // 站点路由站点ID
211 206 tempM.put("stationRouteStation", stationList.get(i)[2]);
212   -
213 207 // 站点路由名称
214   - tempM.put("stationRouteStationName", stationList.get(i)[3]);
215   -
  208 + tempM.put("stationRouteName", stationList.get(i)[3]);
216 209 // 站点路由站点序号
217   - tempM.put("stationRouteStationRouteCode", stationList.get(i)[4]);
218   -
  210 + tempM.put("stationRouteCode", stationList.get(i)[4]);
219 211 // 站点路由线路编码
220 212 tempM.put("stationRouteLineCode", stationList.get(i)[5]);
221   -
222 213 // 站点路由站点类型
223 214 tempM.put("stationRouteStationMark", stationList.get(i)[6]);
224   -
225 215 // 站点路由出站的序号
226 216 tempM.put("stationRouteOutStationNmber", stationList.get(i)[7]);
227   -
228 217 // 站点路由站点方向
229   - tempM.put("stationRouteDirections", stationList.get(i)[8]);
230   -
  218 + tempM.put("stationRoutedirections", stationList.get(i)[8]);
231 219 // 站点路由站点到站距离
232 220 tempM.put("stationRouteDistances", stationList.get(i)[9]);
233   -
234 221 // 站点路由到站时间
235 222 tempM.put("stationRouteToTime", stationList.get(i)[10]);
236   -
237 223 // 站点路由站点首班时间
238 224 tempM.put("stationRouteFirstTime", stationList.get(i)[11]);
239   -
240 225 // 站点路由站点末班时间
241 226 tempM.put("stationRouteEndTime", stationList.get(i)[12]);
242   -
243 227 // 站点路由站点说明
244 228 tempM.put("stationRouteDescriptions", stationList.get(i)[13]);
245   -
246 229 // 站点路由版本
247 230 tempM.put("stationRouteVersions", stationList.get(i)[14]);
248   -
249 231 // 站点ID
250 232 tempM.put("stationId", stationList.get(i)[15]);
251   -
252 233 // 站点编码
253   - tempM.put("stationStationCod", stationList.get(i)[16]);
254   -
  234 + tempM.put("stationCode", stationList.get(i)[16]);
255 235 // 站点名称
256 236 tempM.put("stationStationName", stationList.get(i)[17]);
257   -
258 237 // 路段编码
259 238 tempM.put("stationRoadCoding", stationList.get(i)[18]);
260   -
261 239 // 原坐标类型
262 240 tempM.put("stationDbType", stationList.get(i)[19]);
263   -
264 241 // 中心点(百度坐标)
265   - tempM.put("stationBJwpoints", stationList.get(i)[20]);
266   -
  242 + tempM.put("stationJwpoints", stationList.get(i)[20]);
267 243 // 中心点(WGS经度)
268 244 tempM.put("stationGLonx", stationList.get(i)[21]);
269   -
270 245 // 中心点(WGS纬度)
271 246 tempM.put("stationGLaty", stationList.get(i)[22]);
272   -
273 247 // 城建坐标x
274 248 tempM.put("stationx", stationList.get(i)[23]);
275   -
276 249 // 城建坐标y
277 250 tempM.put("stationy", stationList.get(i)[24]);
278   -
279 251 // 站点图形类型
280 252 tempM.put("stationShapesType", stationList.get(i)[25]);
281   -
282 253 // 站点圆半径
283 254 tempM.put("stationRadius", stationList.get(i)[26]);
284   -
285 255 // 站点图形WGS坐标
286 256 tempM.put("stationGPolygonGrid", stationList.get(i)[27]);
287   -
288 257 // 站点图形百度坐标
289 258 tempM.put("stationBPolygonGrid", stationList.get(i)[28]);
290   -
291 259 // 是否撤销
292 260 tempM.put("stationDestroy", stationList.get(i)[29]);
293   -
294 261 // 站点版本
295 262 tempM.put("stationVersions", stationList.get(i)[30]);
296   -
297 263 // 站点说明
298 264 tempM.put("stationDescriptions", stationList.get(i)[31]);
299   -
300   - tempM.put("name", stationList.get(i)[3]);
301   -
  265 + tempM.put("zdmc", stationList.get(i)[3]);
302 266 tempM.put("text", stationList.get(i)[3]);
303   -
304 267 tempM.put("icon", "fa fa-bus");
305   -
306 268 tempM.put("pId", 200);
307   -
308 269 tempM.put("id", i+1);
309   -
310 270 tempM.put("groupType", "3");
311   -
312 271 tempM.put("chaildredType", "station");
313   -
314 272 tempM.put("enable", true);
315   -
316 273 staitonChildren.add(tempM);
317 274 }
318 275 }
... ... @@ -321,107 +278,87 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
321 278 List<Map<String, Object>> sectionChildren = new ArrayList<Map<String, Object>>();
322 279  
323 280 if(sectionList.size()>0) {
324   -
325 281 for(int i = 0 ; i<sectionList.size() ; i++){
326   -
327 282 Map<String, Object> tempM = new HashMap<String, Object>();
328   -
329 283 // 路段路由ID
330 284 tempM.put("sectionrouteId",sectionList.get(i)[0]);
331   -
332 285 // 路段路由线路ID
333 286 tempM.put("sectionrouteLine",sectionList.get(i)[1]);
334   -
335 287 // 路段路由线路编码
336 288 tempM.put("sectionrouteLineCode",sectionList.get(i)[2]);
337   -
338 289 // 路段路由路段ID
339 290 tempM.put("sectionrouteSection",sectionList.get(i)[3]);
340   -
341 291 // 路段路由路段编码
342 292 tempM.put("sectionrouteSectionCode",sectionList.get(i)[4]);
343   -
344 293 tempM.put("sectionrouteCode",sectionList.get(i)[5]);
345   -
346 294 tempM.put("sectionrouteDirections",sectionList.get(i)[6]);
347   -
348 295 // 路段ID
349 296 tempM.put("sectionId",sectionList.get(i)[7]);
350   -
351 297 // 路段编码
352 298 tempM.put("sectionCode",sectionList.get(i)[8]);
353   -
354 299 // 路段名称
355 300 tempM.put("sectionName",sectionList.get(i)[9]);
356   -
357 301 // 道路编码
358 302 tempM.put("sectionCrosesRoad",sectionList.get(i)[10]);
359   -
360 303 // 终点站
361 304 tempM.put("sectionEndNode",sectionList.get(i)[11]);
362   -
363 305 // 起始节点
364 306 tempM.put("sectionStartNode",sectionList.get(i)[12]);
365   -
366 307 // 中间节点
367 308 tempM.put("sectionMiddleNode",sectionList.get(i)[13]);
368   -
369 309 // 路段类型
370 310 tempM.put("sectionType",sectionList.get(i)[14]);
371   -
372 311 // 路段折线图形城建坐标
373 312 tempM.put("sectionCsectionVector",sectionList.get(i)[15]);
374   -
375 313 // 路段折线图形百度坐标
376 314 tempM.put("sectionBsectionVector",sectionList.get(i)[16]);
377   -
378 315 // 路段折线图形WGS坐标
379 316 tempM.put("sectionGsectionVector",sectionList.get(i)[17]);
380   -
381 317 // 道路编码
382 318 tempM.put("sectionRoadCoding",sectionList.get(i)[18]);
383   -
384 319 // 路段距离
385 320 tempM.put("sectionDistance",sectionList.get(i)[19]);
386   -
387 321 // 路段时间
388 322 tempM.put("sectionTime",sectionList.get(i)[20]);
389   -
390 323 // 路段原坐标类型
391 324 tempM.put("sectiondbType",sectionList.get(i)[21]);
392   -
393 325 // 限速
394 326 tempM.put("sectionSpeedLimet",sectionList.get(i)[22]);
395   -
396 327 // 是否撤销
397 328 tempM.put("destroy",sectionList.get(i)[23]);
398   -
399 329 // 版本号
400 330 tempM.put("versions",sectionList.get(i)[24]);
401   -
402 331 // 说明
403 332 tempM.put("descriptions",sectionList.get(i)[25]);
404 333 // 说明
405 334 tempM.put("isRoadeSpeed",sectionList.get(i)[26]);
406   -
407 335 tempM.put("name", sectionList.get(i)[9]);
408   -
409 336 tempM.put("text", sectionList.get(i)[9]);
410   -
411 337 tempM.put("icon", null);
412   -
413 338 tempM.put("pId", 300);
414   -
415 339 tempM.put("id", (i+1)*1000);
416   -
417 340 tempM.put("groupType", "3");
418   -
419 341 tempM.put("chaildredType", "section");
420   -
421 342 tempM.put("enable", true);
422   -
423 343 sectionChildren.add(tempM);
424   -
  344 + }
  345 + } else {
  346 + if(stationList.size()>0) {
  347 + Map<String, Object> tempM = new HashMap<String, Object>();
  348 + tempM.put("name", "添加路段");
  349 + tempM.put("text", "添加路段");
  350 + tempM.put("lineId", stationList.get(0)[1]);
  351 + tempM.put("lineCode", stationList.get(0)[5]);
  352 + tempM.put("dir", stationList.get(0)[8]);
  353 + tempM.put("versions", stationList.get(0)[14]);
  354 + tempM.put("icon", null);
  355 + tempM.put("pId", 300);
  356 + tempM.put("id", 1000);
  357 + tempM.put("groupType", "3");
  358 + tempM.put("chaildredType", "addSection");
  359 + tempM.put("sectionBsectionVector", "LINESTRING("+stationList.get(0)[20]+")");
  360 + tempM.put("enable", true);
  361 + sectionChildren.add(tempM);
425 362 }
426 363 }
427 364  
... ... @@ -563,98 +500,102 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
563 500 int len = objects.size();
564 501  
565 502 if(objects.size()>0) {
  503 + // 遍历站点
  504 + traversalStation(objects, resultList, len);
  505 + }
  506 + return resultList;
  507 + }
566 508  
567   - for(int i = 0 ; i < len; i++) {
568   - Map<String, Object> tempM = new HashMap<String,Object>();
  509 + private void traversalStation(List<Object[]> objects, List<Map<String, Object>> resultList, int len) {
  510 + for(int i = 0 ; i < len; i++) {
  511 + Map<String, Object> tempM = new HashMap<String,Object>();
569 512  
570   - tempM.put("stationRouteLine", objects.get(i)[0]);
  513 + tempM.put("stationRouteLine", objects.get(i)[0]);
571 514  
572   - tempM.put("stationRouteStation", objects.get(i)[1]);
  515 + tempM.put("stationRouteStation", objects.get(i)[1]);
573 516  
574   - tempM.put("stationRouteCode", objects.get(i)[2]);
  517 + tempM.put("stationRouteCode", objects.get(i)[2]);
575 518  
576   - tempM.put("stationRouteLIneCode", objects.get(i)[3]);
  519 + tempM.put("stationRouteLIneCode", objects.get(i)[3]);
577 520  
578   - tempM.put("stationRouteStationMark", objects.get(i)[4]);
  521 + tempM.put("stationRouteStationMark", objects.get(i)[4]);
579 522  
580   - tempM.put("stationOutStationNmber", objects.get(i)[5]);
  523 + tempM.put("stationOutStationNmber", objects.get(i)[5]);
581 524  
582   - tempM.put("stationRoutedirections", objects.get(i)[6]);
  525 + tempM.put("stationRoutedirections", objects.get(i)[6]);
583 526  
584   - tempM.put("stationRouteDistances", objects.get(i)[7]);
  527 + tempM.put("stationRouteDistances", objects.get(i)[7]);
585 528  
586   - tempM.put("stationRouteToTime", objects.get(i)[8]);
  529 + tempM.put("stationRouteToTime", objects.get(i)[8]);
587 530  
588   - tempM.put("staitonRouteFirstTime", objects.get(i)[9]);
  531 + tempM.put("staitonRouteFirstTime", objects.get(i)[9]);
589 532  
590   - tempM.put("stationRouteEndTime", objects.get(i)[10]);
  533 + tempM.put("stationRouteEndTime", objects.get(i)[10]);
591 534  
592   - tempM.put("stationRouteDescriptions", objects.get(i)[11]);
  535 + tempM.put("stationRouteDescriptions", objects.get(i)[11]);
593 536  
594   - tempM.put("stationRouteDestroy", objects.get(i)[12]);
  537 + tempM.put("stationRouteDestroy", objects.get(i)[12]);
595 538  
596   - tempM.put("stationRouteVersions", objects.get(i)[13]);
  539 + tempM.put("stationRouteVersions", objects.get(i)[13]);
597 540  
598   - tempM.put("stationRouteCreateBy", objects.get(i)[14]);
  541 + tempM.put("stationRouteCreateBy", objects.get(i)[14]);
599 542  
600   - tempM.put("stationRouteCreateDate", objects.get(i)[15]);
  543 + tempM.put("stationRouteCreateDate", objects.get(i)[15]);
601 544  
602   - tempM.put("stationRouteUpdateBy", objects.get(i)[16]);
  545 + tempM.put("stationRouteUpdateBy", objects.get(i)[16]);
603 546  
604   - tempM.put("stationRouteUpdateDate", objects.get(i)[17]);
  547 + tempM.put("stationRouteUpdateDate", objects.get(i)[17]);
605 548  
606   - tempM.put("stationId", objects.get(i)[18]);
  549 + tempM.put("stationId", objects.get(i)[18]);
607 550  
608   - tempM.put("stationCode", objects.get(i)[19]);
  551 + tempM.put("stationCode", objects.get(i)[19]);
609 552  
610   - tempM.put("stationRouteName", objects.get(i)[20]);
  553 + tempM.put("stationRouteName", objects.get(i)[20]);
611 554  
612   - tempM.put("stationRoadCoding", objects.get(i)[21]);
  555 + tempM.put("stationRoadCoding", objects.get(i)[21]);
613 556  
614   - tempM.put("stationDbType", objects.get(i)[22]);
  557 + tempM.put("stationDbType", objects.get(i)[22]);
615 558  
616   - tempM.put("stationJwpoints", objects.get(i)[23]);
  559 + tempM.put("stationJwpoints", objects.get(i)[23]);
617 560  
618   - tempM.put("stationGlonx", objects.get(i)[24]);
  561 + tempM.put("stationGlonx", objects.get(i)[24]);
619 562  
620   - tempM.put("stationGlaty", objects.get(i)[25]);
  563 + tempM.put("stationGlaty", objects.get(i)[25]);
621 564  
622   - tempM.put("stationX", objects.get(i)[26]);
  565 + tempM.put("stationX", objects.get(i)[26]);
623 566  
624   - tempM.put("stationY", objects.get(i)[27]);
  567 + tempM.put("stationY", objects.get(i)[27]);
625 568  
626   - tempM.put("stationBPolyonGrid", objects.get(i)[28]);
  569 + tempM.put("stationBPolyonGrid", objects.get(i)[28]);
627 570  
628   - tempM.put("stationGPloyonGrid", objects.get(i)[29]);
  571 + tempM.put("stationGPloyonGrid", objects.get(i)[29]);
629 572  
630   - tempM.put("stationDestroy", objects.get(i)[30]);
  573 + tempM.put("stationDestroy", objects.get(i)[30]);
631 574  
632   - tempM.put("stationRadius", objects.get(i)[31]);
  575 + tempM.put("stationRadius", objects.get(i)[31]);
633 576  
634   - tempM.put("stationShapesType", objects.get(i)[32]);
  577 + tempM.put("stationShapesType", objects.get(i)[32]);
635 578  
636   - tempM.put("stationVersions", objects.get(i)[33]);
  579 + tempM.put("stationVersions", objects.get(i)[33]);
637 580  
638   - tempM.put("sttationDescriptions", objects.get(i)[34]);
  581 + tempM.put("sttationDescriptions", objects.get(i)[34]);
639 582  
640   - tempM.put("stationCreateBy", objects.get(i)[35]);
  583 + tempM.put("stationCreateBy", objects.get(i)[35]);
641 584  
642   - tempM.put("stationCreateDate", objects.get(i)[36]);
  585 + tempM.put("stationCreateDate", objects.get(i)[36]);
643 586  
644   - tempM.put("stationUpdateBy", objects.get(i)[37]);
  587 + tempM.put("stationUpdateBy", objects.get(i)[37]);
645 588  
646   - tempM.put("stationUpdateDate", objects.get(i)[38]);
  589 + tempM.put("stationUpdateDate", objects.get(i)[38]);
647 590  
648   - tempM.put("stationRouteId", objects.get(i)[39]);
649   - tempM.put("zdmc", objects.get(i)[40]);
  591 + tempM.put("stationRouteId", objects.get(i)[39]);
  592 + tempM.put("zdmc", objects.get(i)[40]);
650 593  
651   - resultList.add(tempM);
652   - }
653   - }
654   - return resultList;
  594 + resultList.add(tempM);
  595 + }
655 596 }
656 597  
657   - /**
  598 + /**
658 599 * @Description :TODO(查询线路某方向下所有站点的中心百度坐标)
659 600 *
660 601 * @param map <lineId:线路ID; direction:方向>
... ... @@ -692,6 +633,29 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
692 633  
693 634 return resultList;
694 635 }
  636 +
  637 + /**
  638 + * @Description :TODO(查询线路某方向下所有站点)
  639 + *
  640 + * @param map <lineId:线路ID; direction:方向>
  641 + *
  642 + * @return List<Map<String, Object>>
  643 + */
  644 + @Override
  645 + public List<Map<String, Object>> getStationRouteList(Map<String, Object> map) {
  646 + Integer lineId = map.get("lineId").equals("") ? null : Integer.parseInt(map.get("lineId").toString());
  647 + Integer direction = map.get("direction").equals("") ? null : Integer.parseInt(map.get("direction").toString());
  648 + List<Object[]> objects = repository.getStationRouteList(lineId, direction);
  649 + List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
  650 +
  651 + int len = objects.size();
  652 +
  653 + if(objects.size()>0) {
  654 + // 遍历站点
  655 + traversalStation(objects, resultList, len);
  656 + }
  657 + return resultList;
  658 + }
695 659  
696 660  
697 661 /**
... ... @@ -774,109 +738,72 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
774 738 */
775 739 @Override
776 740 public Map<String, Object> usingSingle(Map<String, Object> map) {
777   -
778 741 // 返回值map
779 742 Map<String, Object> resultMap = new HashMap<String,Object>();
780   -
781 743 try {
782   -
783 744 // 获取线路ID
784 745 Integer lineId = map.get("lineId").equals("") ? 0 : Integer.parseInt(map.get("lineId").toString());
785   -
786 746 /** 查询线路信息 @param:<lineId:线路ID> */
787 747 Line line = lineRepository.findOne(lineId);
788   -
789 748 /** 查询线路信息下的站点路由信息 @param:<lineId:线路ID> */
790 749 List<Object[]> objects = repository.usingSingle(lineId);
791   -
792 750 if (objects.size()>0) {
793   -
794 751 /** 获取配置文件里的ftp登录参数 */
795 752 Map<String, Object> FTPParamMap = readPropertiesGetFTPParam();
796   -
797 753 // 压缩文件名
798 754 String odlGzFileName = line.getLineCode() + ".txt.gz";
799   -
800 755 // txt文件名
801 756 String textFileName = line.getLineCode() + ".txt";
802   -
803 757 // 创建一个ftp上传实例
804 758 FTPClientUtils clientUtils = new FTPClientUtils();
805   -
806 759 // IP
807 760 String url = FTPParamMap.get("url").toString();
808   -
809 761 // 端口
810 762 int port = Integer.valueOf(FTPParamMap.get("port").toString());
811   -
812 763 // 用户名
813 764 String username = FTPParamMap.get("username").toString();
814   -
815 765 // 密码
816 766 String password = FTPParamMap.get("password").toString();
817   -
818 767 // 相对路径
819 768 String remotePath = FTPParamMap.get("remotePath").toString();
820   -
821 769 /** 如果已存在相同行单文件名则先删除 */
822 770 clientUtils.deleteFtpFile(url, port, username, password, remotePath, odlGzFileName);
823   -
824 771 clientUtils.deleteFtpFile(url, port, username, password, remotePath, textFileName);
825   -
826 772 String textStr = "";
827   -
828   - boolean tempTag = ishxType(objects);
829   -
830   - if(tempTag)
  773 +// boolean tempTag = ishxType(objects);
  774 + Integer linePlayType = line.getLinePlayType() == null ? -1:line.getLinePlayType();
  775 + if(linePlayType == 1)
831 776 textStr = hxTextFileToFtp(objects,lineId);// 环线行单文件内容
832   - else
  777 + else if (linePlayType == 0)
833 778 textStr = newTextFileToFTP(objects,lineId);/** 双向行单文件内容 @param:<objects:站点路由;lineId:线路ID>*/
834   -
835   - /*textStr = line.getName() + "\t" + "2" + "\r" + textStr;*/
836   -
  779 + else
  780 + resultMap.put("status","NOLinePlayType");// 线路无线路规划类型
837 781 textStr = line.getName() + " " + "2" + "\r" + textStr;
838   -
839 782 InputStream input = new ByteArrayInputStream(textStr.getBytes("gbk"));
840   -
841 783 /** 生成txt文件,上传ftp */
842 784 clientUtils.uploadFile(url, port, username, password, remotePath, textFileName, input);
843   -
844 785 // 创建打包实例
845 786 PackTarGZUtils packTarGZUtils= new PackTarGZUtils();
846   -
847 787 /** 获取txt文件 */
848 788 File textFile = clientUtils.GetFtpFile(url, port, username, password, remotePath, textFileName);
849   -
850 789 File target = new File(odlGzFileName);
851   -
852 790 // 将txt文件打包
853 791 File targetFile = PackTarGZUtils.compress(textFile, target);
854   -
855   - /*clientUtils.testUpLoadFromDisk(targetFile,targetFile.getName());*/
856   -
857 792 clientUtils.FTPUpLoadFromDisk(targetFile, targetFile.getName(), url, port, username, password, remotePath);
858   -
859 793 // 删除文件
860 794 textFile.delete();
861 795 targetFile.delete();
862   -
863 796 resultMap.put("status", ResponseCode.SUCCESS);
864   -
865 797 }else {
866   -
867 798 resultMap.put("status","NOTDATA");
868 799 }
869   -
870   -
871 800 } catch (Exception e) {
872   -
873 801 resultMap.put("status", ResponseCode.ERROR);
874   -
875 802 logger.error("save erro.", e);
876   -
877   - }
  803 + }
878 804 return resultMap;
879 805 }
  806 + // 判断线路走向是环线还是双向
880 807 public boolean ishxType(List<Object[]> listObj) {
881 808 boolean tag = true;
882 809 String pointBStr[] = null,pointEStr[] = null;
... ... @@ -889,9 +816,9 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
889 816 if(Integer.valueOf(listObj.get(i)[8].toString())==1)
890 817 numzd++;
891 818 }
892   - Point p1 = new Point(Double.valueOf(pointBStr[0]),Double.valueOf(pointBStr[1]));
  819 + Point p1 = new Point(Double.valueOf(pointBStr[0]),Double.valueOf(pointBStr[1]));
893 820 Point p2 = new Point(Double.valueOf(pointEStr[0]),Double.valueOf(pointEStr[1]));
894   - if(GeoUtils.getDistance(p1, p2)>100 && numzd>2)
  821 + if(GeoUtils.getDistance(p1, p2)>100 && numzd>2)
895 822 tag = false;
896 823 return tag;
897 824 }
... ... @@ -1241,95 +1168,10 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1241 1168 int len = objects.size();
1242 1169  
1243 1170 if(objects.size()>0) {
1244   -
1245   - for(int i = 0 ; i < len; i++) {
1246   - Map<String, Object> tempM = new HashMap<String,Object>();
1247   -
1248   - tempM.put("stationRouteLine", objects.get(i)[0]);
1249   -
1250   - tempM.put("stationRouteStation", objects.get(i)[1]);
1251   -
1252   - tempM.put("stationRouteCode", objects.get(i)[2]);
1253   -
1254   - tempM.put("stationRouteLIneCode", objects.get(i)[3]);
1255   -
1256   - tempM.put("stationRouteStationMark", objects.get(i)[4]);
1257   -
1258   - tempM.put("stationOutStationNmber", objects.get(i)[5]);
1259   -
1260   - tempM.put("stationRoutedirections", objects.get(i)[6]);
1261   -
1262   - tempM.put("stationRouteDistances", objects.get(i)[7]);
1263   -
1264   - tempM.put("stationRouteToTime", objects.get(i)[8]);
1265   -
1266   - tempM.put("staitonRouteFirstTime", objects.get(i)[9]);
1267   -
1268   - tempM.put("stationRouteEndTime", objects.get(i)[10]);
1269   -
1270   - tempM.put("stationRouteDescriptions", objects.get(i)[11]);
1271   -
1272   - tempM.put("stationRouteDestroy", objects.get(i)[12]);
1273   -
1274   - tempM.put("stationRouteVersions", objects.get(i)[13]);
1275   -
1276   - tempM.put("stationRouteCreateBy", objects.get(i)[14]);
1277   -
1278   - tempM.put("stationRouteCreateDate", objects.get(i)[15]);
1279   -
1280   - tempM.put("stationRouteUpdateBy", objects.get(i)[16]);
1281   -
1282   - tempM.put("stationRouteUpdateDate", objects.get(i)[17]);
1283   -
1284   - tempM.put("stationId", objects.get(i)[18]);
1285   -
1286   - tempM.put("stationCode", objects.get(i)[19]);
1287   -
1288   - tempM.put("stationRouteName", objects.get(i)[20]);
1289   -
1290   - tempM.put("stationRoadCoding", objects.get(i)[21]);
1291   -
1292   - tempM.put("stationDbType", objects.get(i)[22]);
1293   -
1294   - tempM.put("stationJwpoints", objects.get(i)[23]);
1295   -
1296   - tempM.put("stationGlonx", objects.get(i)[24]);
1297   -
1298   - tempM.put("stationGlaty", objects.get(i)[25]);
1299   -
1300   - tempM.put("stationX", objects.get(i)[26]);
1301   -
1302   - tempM.put("stationY", objects.get(i)[27]);
1303   -
1304   - tempM.put("stationBPolyonGrid", objects.get(i)[28]);
1305   -
1306   - tempM.put("stationGPloyonGrid", objects.get(i)[29]);
1307   -
1308   - tempM.put("stationDestroy", objects.get(i)[30]);
1309   -
1310   - tempM.put("stationRadius", objects.get(i)[31]);
1311   -
1312   - tempM.put("stationShapesType", objects.get(i)[32]);
1313   -
1314   - tempM.put("stationVersions", objects.get(i)[33]);
1315   -
1316   - tempM.put("sttationDescriptions", objects.get(i)[34]);
1317   -
1318   - tempM.put("stationCreateBy", objects.get(i)[35]);
1319   -
1320   - tempM.put("stationCreateDate", objects.get(i)[36]);
1321   -
1322   - tempM.put("stationUpdateBy", objects.get(i)[37]);
1323   -
1324   - tempM.put("stationUpdateDate", objects.get(i)[38]);
1325   -
1326   - tempM.put("stationRouteId", objects.get(i)[39]);
1327   - tempM.put("zdmc", objects.get(i)[40]);
1328   -
1329   - resultList.add(tempM);
1330   - }
1331   -
1332   - }
  1171 +
  1172 + traversalStation(objects, resultList, len);
  1173 +
  1174 + }
1333 1175  
1334 1176 return resultList;
1335 1177 }
... ...
src/main/java/com/bsth/service/realcontrol/impl/ScheduleRealInfoServiceImpl.java
... ... @@ -698,13 +698,6 @@ public class ScheduleRealInfoServiceImpl extends BaseServiceImpl&lt;ScheduleRealInf
698 698 //数据库删除
699 699 rs = super.delete(id);
700 700 if(rs.get("status").equals(ResponseCode.SUCCESS)){
701   - /*ScheduleRealInfo temp = super.findById(id);
702   - if(temp != null){
703   - rs.put("status", ResponseCode.ERROR);
704   - rs.put("msg", "删除失败,请重试!");
705   - return rs;
706   - }*/
707   -
708 701 dayOfSchedule.delete(sch);
709 702 //更新起点应到时间
710 703 List<ScheduleRealInfo> ts = dayOfSchedule.updateQdzTimePlan(sch);
... ...
src/main/java/com/bsth/service/report/impl/ReportServiceImpl.java
... ... @@ -131,20 +131,22 @@ public class ReportServiceImpl implements ReportService{
131 131 cal.setTime(dates);
132 132 //周数,表分区字段
133 133 int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
134   -
  134 + int weeks_year_next=weeks_year +1;
135 135 Connection conn = null;
136 136 PreparedStatement ps = null;
137 137 ResultSet rs = null;
138 138 String year=date.substring(0,4);
139   - String sql = "select * from bsth_c_arrival_info_"+year+" where device_id=? AND line_id=? AND weeks_year=? AND ts > ? AND ts <=? order by ts";
  139 + String sql = "select * from bsth_c_arrival_info_"+year+" where device_id=? AND line_id=? "
  140 + + " AND weeks_year>=? AND weeks_year<=? AND ts >= ? AND ts <=? order by ts";
140 141 try{
141 142 conn = DBUtils_MS.getConnection();
142 143 ps = conn.prepareStatement(sql);
143 144 ps.setString(1, sbbb);
144 145 ps.setString(2,line);
145 146 ps.setInt(3, weeks_year);
146   - ps.setLong(4, date1);
147   - ps.setLong(5, date2);
  147 + ps.setInt(4, weeks_year_next);
  148 + ps.setLong(5, date1);
  149 + ps.setLong(6, date2);
148 150 rs = ps.executeQuery();
149 151  
150 152 list = resultSet2Set(rs);
... ...
src/main/java/com/bsth/service/schedule/datatools/TTInfoDetailDataToolsImpl.java
... ... @@ -556,15 +556,33 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
556 556 Station station1 = stationService.findById(lpObjList.get(0).getStationRouteId1());
557 557 Station station2 = stationService.findById(lpObjList.get(1).getStationRouteId2());
558 558 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (1),
  559 + "报到", new Color(0x96b9d7));
  560 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (2),
559 561 "出场", new Color(0x96b9d7));
560 562 for (int i = 1; i <= groupCount; i++) {
561   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2),
562   - station1.getStationName(), new Color(0x96b9d7));
563 563 PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2 + 1),
  564 + station1.getStationName(), new Color(0x96b9d7));
  565 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (i * 2 + 2),
564 566 station2.getStationName(), new Color(0x96b9d7));
565 567 }
566   - PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 2),
  568 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 3),
567 569 "进场", new Color(0x96b9d7));
  570 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 4),
  571 + "离场", new Color(0x96b9d7));
  572 +
  573 + // 路牌统计字段
  574 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 5),
  575 + "总公里", new Color(0x96b9d7));
  576 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 6),
  577 + "营业公里", new Color(0x96b9d7));
  578 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 7),
  579 + "空驶公里", new Color(0x96b9d7));
  580 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 8),
  581 + "总工时", new Color(0x96b9d7));
  582 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 9),
  583 + "营业工时", new Color(0x96b9d7));
  584 + PoiUtils.createStringXSSFCell(wb, lpHeadRow, (short) (groupCount * 2 + 10),
  585 + "营运班次", new Color(0x96b9d7));
568 586  
569 587 // 构建每个路牌的班次数据
570 588 for (int i = 0; i < lpObjList.size(); i++) {
... ... @@ -572,34 +590,86 @@ public class TTInfoDetailDataToolsImpl implements DataToolsService, TTInfoDetail
572 590 XSSFRow lpRow = sheet.createRow((short) (i + 1));
573 591 PoiUtils.createStringXSSFCell(wb, lpRow, (short) 0, lpObj.getLpname());
574 592 PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (1));
  593 + PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (2));
575 594 for (int j = 1; j <= groupCount; j++) {
576   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2));
577 595 PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 1));
  596 + PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (j * 2 + 2));
578 597 }
579   - PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 2));
  598 +
  599 + PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 3));
  600 + PoiUtils.createBlankXSSFCell(wb, lpRow, (short) (groupCount * 2 + 4));
580 601  
581 602 for (BcObj bcObj : lpObj.getBcObjList()) {
582 603 if (bcObj.getBcType() == BcType.NORMAL) {
583   - Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 2));
  604 + Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
584 605 cell.setCellValue(bcObj.getFcsj());
  606 +
  607 + } else if (bcObj.getBcType() == BcType.BD) {
  608 + if (bcObj.getGroupNo() == -1) {
  609 + Cell cell = lpRow.getCell((short) 1);
  610 + cell.setCellValue(bcObj.getFcsj());
  611 + } else if (bcObj.getGroupNo() > 0) { // 分班报到
  612 + Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
  613 + cell.setCellValue("报" + bcObj.getFcsj());
  614 +
  615 + }
  616 +
585 617 } else if (bcObj.getBcType() == BcType.OUT) {
586   - Cell cell = lpRow.getCell((short) (1));
587   - cell.setCellValue(bcObj.getFcsj());
  618 + if (bcObj.getGroupNo() == -1) {
  619 + Cell cell = lpRow.getCell((short) (2));
  620 + cell.setCellValue(bcObj.getFcsj());
  621 + } else if (bcObj.getGroupNo() > 0) { // 分班出场
  622 + Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
  623 + cell.setCellValue("出" + bcObj.getFcsj());
  624 + }
  625 +
588 626 } else if (bcObj.getBcType() == BcType.IN) {
589   - Cell cell = lpRow.getCell((short) (groupCount * 2 + 2));
590   - cell.setCellValue(bcObj.getFcsj());
  627 + if (bcObj.getGroupNo() == -2) {
  628 + Cell cell = lpRow.getCell((short) (groupCount * 2 + 3));
  629 + cell.setCellValue(bcObj.getFcsj());
  630 + } else if (bcObj.getGroupNo() > 0) { //分班进场
  631 + Cell cell = lpRow.getCell((short) (bcObj.getGroupNo() * 2 + bcObj.getGroupBcNo() + 3));
  632 + // 停驶用 ※
  633 + cell.setCellValue(bcObj.getFcsj() + "X");
  634 + }
  635 +
  636 + } else if (bcObj.getBcType() == BcType.LC) {
  637 + if (bcObj.getGroupNo() == -2) {
  638 + Cell cell = lpRow.getCell((short) (groupCount * 2 + 4));
  639 + cell.setCellValue(bcObj.getFcsj());
  640 + }
  641 +
591 642 }
592 643 }
  644 +
  645 + // 路牌统计字段
  646 + PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 5), lpObj.getZlc());
  647 + PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 6), lpObj.getYylc());
  648 + PoiUtils.createDoubleXSSFCell(wb, lpRow, (short) (groupCount * 2 + 7), lpObj.getKslc());
  649 + PoiUtils.createStringXSSFCell(wb, lpRow, (short) (groupCount * 2 + 8),
  650 + String.format("%d小时%d分钟", (int) (lpObj.getZgs() / 60), (int) (lpObj.getZgs() % 60)));
  651 + PoiUtils.createStringXSSFCell(wb, lpRow, (short) (groupCount * 2 + 9),
  652 + String.format("%d小时%d分钟", (int) (lpObj.getYygs() / 60), (int) (lpObj.getYygs() % 60)));
  653 + PoiUtils.createIntegerXSSFCell(wb, lpRow, (short) (groupCount * 2 + 10), lpObj.getYybc());
  654 +
593 655 }
594 656  
595 657 // 自适应单元格长宽
596 658 sheet.autoSizeColumn(0);
597 659 sheet.autoSizeColumn(1);
  660 + sheet.autoSizeColumn(2);
598 661 for (int i = 1; i <= groupCount; i++) {
599   - sheet.autoSizeColumn(i * 2);
600 662 sheet.autoSizeColumn(i * 2 + 1);
  663 + sheet.autoSizeColumn(i * 2 + 2);
601 664 }
602   -
  665 + sheet.autoSizeColumn(groupCount * 2 + 3);
  666 + sheet.autoSizeColumn(groupCount * 2 + 4);
  667 + sheet.autoSizeColumn(groupCount * 2 + 5);
  668 + sheet.autoSizeColumn(groupCount * 2 + 6);
  669 + sheet.autoSizeColumn(groupCount * 2 + 7);
  670 + sheet.autoSizeColumn(groupCount * 2 + 8);
  671 + sheet.autoSizeColumn(groupCount * 2 + 9);
  672 + sheet.autoSizeColumn(groupCount * 2 + 10);
603 673 }
604 674  
605 675 @Override
... ...
src/main/java/com/bsth/service/schedule/datatools/TTinfoDetailDynamicData.java
1   -package com.bsth.service.schedule.datatools;
2   -
3   -import com.bsth.service.schedule.exception.ScheduleException;
4   -import com.bsth.service.schedule.utils.DataToolsFile;
5   -import com.fasterxml.jackson.annotation.JsonCreator;
6   -import com.fasterxml.jackson.annotation.JsonValue;
7   -
8   -import java.util.List;
9   -
10   -/**
11   - * 动态时刻表数据。
12   - */
13   -public interface TTinfoDetailDynamicData {
14   -
15   - //---------------------- 生成时刻表用对象(以下) ---------------------//
16   - public static enum BcType { // 班次类型枚举
17   - IN("in"), // 进场
18   - OUT("out"), // 出场
19   - BD("bd"), // 早例保
20   - LC("lc"), // 晚例保
21   - NORMAL("normal"); // 正常
22   - private String flag;
23   -
24   - @JsonCreator
25   - private BcType(String flag) {
26   - this.flag = flag;
27   - }
28   -
29   - @JsonValue
30   - public String getFlag() {
31   - return flag;
32   - }
33   -
34   - public void setFlag(String flag) {
35   - this.flag = flag;
36   - }
37   - }
38   -
39   - public static class BcObj { // 班次对象
40   - /** 班次时间 */
41   - private Integer bcsj;
42   - /** 停站时间 */
43   - private Integer ssj;
44   - /** 吃饭时间 */
45   - private Integer eatsj;
46   -
47   - /** 停车场id */
48   - private Integer tccid;
49   - /** 起点站id */
50   - private Integer qdzid;
51   - /** 终点站id */
52   - private Integer zdzid;
53   -
54   - /** 是否上行 */
55   - private Boolean isUp;
56   -
57   - /** 班次类型 */
58   - private BcType bcType;
59   - /** 发车时刻 */
60   - private String fcsj;
61   - /** 用于统计的发车时间描述(把进出场,保养,吃饭时间写在一起) */
62   - private String fcsjDesc;
63   -
64   - /** 第几圈(从1开始) */
65   - private Integer groupNo;
66   - /** 圈里第几个班次(1或者2) */
67   - private Integer groupBcNo;
68   -
69   - public Integer getBcsj() {
70   - return bcsj;
71   - }
72   -
73   - public void setBcsj(Integer bcsj) {
74   - this.bcsj = bcsj;
75   - }
76   -
77   - public Integer getSsj() {
78   - return ssj;
79   - }
80   -
81   - public void setSsj(Integer ssj) {
82   - this.ssj = ssj;
83   - }
84   -
85   - public Integer getEatsj() {
86   - return eatsj;
87   - }
88   -
89   - public void setEatsj(Integer eatsj) {
90   - this.eatsj = eatsj;
91   - }
92   -
93   - public Integer getTccid() {
94   - return tccid;
95   - }
96   -
97   - public void setTccid(Integer tccid) {
98   - this.tccid = tccid;
99   - }
100   -
101   - public Integer getQdzid() {
102   - return qdzid;
103   - }
104   -
105   - public void setQdzid(Integer qdzid) {
106   - this.qdzid = qdzid;
107   - }
108   -
109   - public Integer getZdzid() {
110   - return zdzid;
111   - }
112   -
113   - public void setZdzid(Integer zdzid) {
114   - this.zdzid = zdzid;
115   - }
116   -
117   - public BcType getBcType() {
118   - return bcType;
119   - }
120   -
121   - public void setBcType(BcType bcType) {
122   - this.bcType = bcType;
123   - }
124   -
125   - public String getFcsj() {
126   - return fcsj;
127   - }
128   -
129   - public void setFcsj(String fcsj) {
130   - this.fcsj = fcsj;
131   - }
132   -
133   - public Boolean getIsUp() {
134   - return isUp;
135   - }
136   -
137   - public void setIsUp(Boolean isUp) {
138   - this.isUp = isUp;
139   - }
140   -
141   - public Integer getGroupNo() {
142   - return groupNo;
143   - }
144   -
145   - public void setGroupNo(Integer groupNo) {
146   - this.groupNo = groupNo;
147   - }
148   -
149   - public Integer getGroupBcNo() {
150   - return groupBcNo;
151   - }
152   -
153   - public void setGroupBcNo(Integer groupBcNo) {
154   - this.groupBcNo = groupBcNo;
155   - }
156   -
157   - public Boolean getUp() {
158   - return isUp;
159   - }
160   -
161   - public void setUp(Boolean up) {
162   - isUp = up;
163   - }
164   -
165   - public String getFcsjDesc() {
166   - return fcsjDesc;
167   - }
168   -
169   - public void setFcsjDesc(String fcsjDesc) {
170   - this.fcsjDesc = fcsjDesc;
171   - }
172   - }
173   -
174   - public static class LpObj { // 路牌对象
175   - /** 路牌名字 */
176   - private String lpname;
177   - /** 每圈的第一个班次是否上行 */
178   - private Boolean isUp;
179   -
180   - /** 第一个班次起点站路由id */
181   - private Integer stationRouteId1;
182   - /** 第二个班次起点站路由id */
183   - private Integer stationRouteId2;
184   -
185   - /** 班次列表 */
186   - private List<BcObj> bcObjList;
187   - /** 总圈数 */
188   - private Integer groupCount;
189   -
190   - /** 总工时 */
191   - private Double zgs;
192   - /** 总班次 */
193   - private Integer zbc;
194   -
195   -
196   - public String getLpname() {
197   - return lpname;
198   - }
199   -
200   - public void setLpname(String lpname) {
201   - this.lpname = lpname;
202   - }
203   -
204   - public Boolean getIsUp() {
205   - return isUp;
206   - }
207   -
208   - public void setIsUp(Boolean isUp) {
209   - this.isUp = isUp;
210   - }
211   -
212   - public List<BcObj> getBcObjList() {
213   - return bcObjList;
214   - }
215   -
216   - public void setBcObjList(List<BcObj> bcObjList) {
217   - this.bcObjList = bcObjList;
218   - }
219   -
220   - public Integer getGroupCount() {
221   - return groupCount;
222   - }
223   -
224   - public void setGroupCount(Integer groupCount) {
225   - this.groupCount = groupCount;
226   - }
227   -
228   - public Double getZgs() {
229   - return zgs;
230   - }
231   -
232   - public void setZgs(Double zgs) {
233   - this.zgs = zgs;
234   - }
235   -
236   - public Integer getZbc() {
237   - return zbc;
238   - }
239   -
240   - public void setZbc(Integer zbc) {
241   - this.zbc = zbc;
242   - }
243   -
244   - public Integer getStationRouteId1() {
245   - return stationRouteId1;
246   - }
247   -
248   - public void setStationRouteId1(Integer stationRouteId1) {
249   - this.stationRouteId1 = stationRouteId1;
250   - }
251   -
252   - public Integer getStationRouteId2() {
253   - return stationRouteId2;
254   - }
255   -
256   - public void setStationRouteId2(Integer stationRouteId2) {
257   - this.stationRouteId2 = stationRouteId2;
258   - }
259   - }
260   -
261   - public static class StatInfo { // 统计数据对象
262   - /** 统计项目 */
263   - private String statItem;
264   - /** 统计值 */
265   - private Double statValue;
266   -
267   - public String getStatItem() {
268   - return statItem;
269   - }
270   -
271   - public void setStatItem(String statItem) {
272   - this.statItem = statItem;
273   - }
274   -
275   - public Double getStatValue() {
276   - return statValue;
277   - }
278   -
279   - public void setStatValue(Double statValue) {
280   - this.statValue = statValue;
281   - }
282   - }
283   -
284   - public static class DTInfos { // 所有数据信息
285   - /** 路牌班次数据列表 */
286   - private List<LpObj> lpObjList;
287   - /** 统计数据列表 */
288   - private List<StatInfo> statInfoList;
289   -
290   - public List<LpObj> getLpObjList() {
291   - return lpObjList;
292   - }
293   -
294   - public void setLpObjList(List<LpObj> lpObjList) {
295   - this.lpObjList = lpObjList;
296   - }
297   -
298   - public List<StatInfo> getStatInfoList() {
299   - return statInfoList;
300   - }
301   -
302   - public void setStatInfoList(List<StatInfo> statInfoList) {
303   - this.statInfoList = statInfoList;
304   - }
305   - }
306   -
307   - //---------------------- 生成时刻表用对象(以上) ---------------------//
308   -
309   - /**
310   - * 导出动态时刻表数据。
311   - * @param dtInfos
312   - * @return
313   - * @throws ScheduleException
314   - */
315   - public DataToolsFile exportDynamicTTinfo(DTInfos dtInfos) throws ScheduleException;
316   -}
  1 +package com.bsth.service.schedule.datatools;
  2 +
  3 +import com.bsth.service.schedule.exception.ScheduleException;
  4 +import com.bsth.service.schedule.utils.DataToolsFile;
  5 +import com.fasterxml.jackson.annotation.JsonCreator;
  6 +import com.fasterxml.jackson.annotation.JsonValue;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * 动态时刻表数据。
  12 + */
  13 +public interface TTinfoDetailDynamicData {
  14 +
  15 + //---------------------- 生成时刻表用对象(以下) ---------------------//
  16 + public static enum BcType { // 班次类型枚举
  17 + IN("in"), // 进场
  18 + OUT("out"), // 出场
  19 + BD("bd"), // 早例保
  20 + LC("lc"), // 晚例保
  21 + NORMAL("normal"); // 正常
  22 + private String flag;
  23 +
  24 + @JsonCreator
  25 + private BcType(String flag) {
  26 + this.flag = flag;
  27 + }
  28 +
  29 + @JsonValue
  30 + public String getFlag() {
  31 + return flag;
  32 + }
  33 +
  34 + public void setFlag(String flag) {
  35 + this.flag = flag;
  36 + }
  37 + }
  38 +
  39 + public static class BcObj { // 班次对象
  40 + /** 班次时间 */
  41 + private Integer bcsj;
  42 + /** 停站时间 */
  43 + private Integer ssj;
  44 + /** 吃饭时间 */
  45 + private Integer eatsj;
  46 +
  47 + /** 停车场id */
  48 + private Integer tccid;
  49 + /** 起点站id */
  50 + private Integer qdzid;
  51 + /** 终点站id */
  52 + private Integer zdzid;
  53 +
  54 + /** 是否上行 */
  55 + private Boolean isUp;
  56 +
  57 + /** 班次类型 */
  58 + private BcType bcType;
  59 + /** 发车时刻 */
  60 + private String fcsj;
  61 + /** 用于统计的发车时间描述(把进出场,保养,吃饭时间写在一起) */
  62 + private String fcsjDesc;
  63 +
  64 + /** 第几圈(从1开始) */
  65 + private Integer groupNo;
  66 + /** 圈里第几个班次(1或者2) */
  67 + private Integer groupBcNo;
  68 +
  69 + public Integer getBcsj() {
  70 + return bcsj;
  71 + }
  72 +
  73 + public void setBcsj(Integer bcsj) {
  74 + this.bcsj = bcsj;
  75 + }
  76 +
  77 + public Integer getSsj() {
  78 + return ssj;
  79 + }
  80 +
  81 + public void setSsj(Integer ssj) {
  82 + this.ssj = ssj;
  83 + }
  84 +
  85 + public Integer getEatsj() {
  86 + return eatsj;
  87 + }
  88 +
  89 + public void setEatsj(Integer eatsj) {
  90 + this.eatsj = eatsj;
  91 + }
  92 +
  93 + public Integer getTccid() {
  94 + return tccid;
  95 + }
  96 +
  97 + public void setTccid(Integer tccid) {
  98 + this.tccid = tccid;
  99 + }
  100 +
  101 + public Integer getQdzid() {
  102 + return qdzid;
  103 + }
  104 +
  105 + public void setQdzid(Integer qdzid) {
  106 + this.qdzid = qdzid;
  107 + }
  108 +
  109 + public Integer getZdzid() {
  110 + return zdzid;
  111 + }
  112 +
  113 + public void setZdzid(Integer zdzid) {
  114 + this.zdzid = zdzid;
  115 + }
  116 +
  117 + public BcType getBcType() {
  118 + return bcType;
  119 + }
  120 +
  121 + public void setBcType(BcType bcType) {
  122 + this.bcType = bcType;
  123 + }
  124 +
  125 + public String getFcsj() {
  126 + return fcsj;
  127 + }
  128 +
  129 + public void setFcsj(String fcsj) {
  130 + this.fcsj = fcsj;
  131 + }
  132 +
  133 + public Boolean getIsUp() {
  134 + return isUp;
  135 + }
  136 +
  137 + public void setIsUp(Boolean isUp) {
  138 + this.isUp = isUp;
  139 + }
  140 +
  141 + public Integer getGroupNo() {
  142 + return groupNo;
  143 + }
  144 +
  145 + public void setGroupNo(Integer groupNo) {
  146 + this.groupNo = groupNo;
  147 + }
  148 +
  149 + public Integer getGroupBcNo() {
  150 + return groupBcNo;
  151 + }
  152 +
  153 + public void setGroupBcNo(Integer groupBcNo) {
  154 + this.groupBcNo = groupBcNo;
  155 + }
  156 +
  157 + public Boolean getUp() {
  158 + return isUp;
  159 + }
  160 +
  161 + public void setUp(Boolean up) {
  162 + isUp = up;
  163 + }
  164 +
  165 + public String getFcsjDesc() {
  166 + return fcsjDesc;
  167 + }
  168 +
  169 + public void setFcsjDesc(String fcsjDesc) {
  170 + this.fcsjDesc = fcsjDesc;
  171 + }
  172 + }
  173 +
  174 + public static class LpObj { // 路牌对象
  175 + /** 路牌名字 */
  176 + private String lpname;
  177 + /** 每圈的第一个班次是否上行 */
  178 + private Boolean isUp;
  179 +
  180 + /** 第一个班次起点站路由id */
  181 + private Integer stationRouteId1;
  182 + /** 第二个班次起点站路由id */
  183 + private Integer stationRouteId2;
  184 +
  185 + /** 班次列表 */
  186 + private List<BcObj> bcObjList;
  187 + /** 总圈数 */
  188 + private Integer groupCount;
  189 +
  190 + //---------------- 路牌统计 ---------------//
  191 + /** 总里程 */
  192 + private Double zlc;
  193 + /** 营运里程 */
  194 + private Double yylc;
  195 + /** 空驶里程 */
  196 + private Double kslc;
  197 + /** 总工时 */
  198 + private Double zgs;
  199 + /** 总班次 */
  200 + private Integer zbc;
  201 + /** 营运工时 */
  202 + private Double yygs;
  203 + /** 营运班次 */
  204 + private Integer yybc;
  205 +
  206 + public String getLpname() {
  207 + return lpname;
  208 + }
  209 +
  210 + public void setLpname(String lpname) {
  211 + this.lpname = lpname;
  212 + }
  213 +
  214 + public Boolean getIsUp() {
  215 + return isUp;
  216 + }
  217 +
  218 + public void setIsUp(Boolean isUp) {
  219 + this.isUp = isUp;
  220 + }
  221 +
  222 + public List<BcObj> getBcObjList() {
  223 + return bcObjList;
  224 + }
  225 +
  226 + public void setBcObjList(List<BcObj> bcObjList) {
  227 + this.bcObjList = bcObjList;
  228 + }
  229 +
  230 + public Integer getGroupCount() {
  231 + return groupCount;
  232 + }
  233 +
  234 + public void setGroupCount(Integer groupCount) {
  235 + this.groupCount = groupCount;
  236 + }
  237 +
  238 + public Integer getStationRouteId1() {
  239 + return stationRouteId1;
  240 + }
  241 +
  242 + public void setStationRouteId1(Integer stationRouteId1) {
  243 + this.stationRouteId1 = stationRouteId1;
  244 + }
  245 +
  246 + public Integer getStationRouteId2() {
  247 + return stationRouteId2;
  248 + }
  249 +
  250 + public void setStationRouteId2(Integer stationRouteId2) {
  251 + this.stationRouteId2 = stationRouteId2;
  252 + }
  253 +
  254 + public Boolean getUp() {
  255 + return isUp;
  256 + }
  257 +
  258 + public void setUp(Boolean up) {
  259 + isUp = up;
  260 + }
  261 +
  262 + public Double getZlc() {
  263 + return zlc;
  264 + }
  265 +
  266 + public void setZlc(Double zlc) {
  267 + this.zlc = zlc;
  268 + }
  269 +
  270 + public Double getYylc() {
  271 + return yylc;
  272 + }
  273 +
  274 + public void setYylc(Double yylc) {
  275 + this.yylc = yylc;
  276 + }
  277 +
  278 + public Double getKslc() {
  279 + return kslc;
  280 + }
  281 +
  282 + public void setKslc(Double kslc) {
  283 + this.kslc = kslc;
  284 + }
  285 +
  286 + public Double getZgs() {
  287 + return zgs;
  288 + }
  289 +
  290 + public void setZgs(Double zgs) {
  291 + this.zgs = zgs;
  292 + }
  293 +
  294 + public Integer getZbc() {
  295 + return zbc;
  296 + }
  297 +
  298 + public void setZbc(Integer zbc) {
  299 + this.zbc = zbc;
  300 + }
  301 +
  302 + public Double getYygs() {
  303 + return yygs;
  304 + }
  305 +
  306 + public void setYygs(Double yygs) {
  307 + this.yygs = yygs;
  308 + }
  309 +
  310 + public Integer getYybc() {
  311 + return yybc;
  312 + }
  313 +
  314 + public void setYybc(Integer yybc) {
  315 + this.yybc = yybc;
  316 + }
  317 + }
  318 +
  319 + public static class StatInfo { // 统计数据对象
  320 + /** 统计项目 */
  321 + private String statItem;
  322 + /** 统计值 */
  323 + private Double statValue;
  324 +
  325 + public String getStatItem() {
  326 + return statItem;
  327 + }
  328 +
  329 + public void setStatItem(String statItem) {
  330 + this.statItem = statItem;
  331 + }
  332 +
  333 + public Double getStatValue() {
  334 + return statValue;
  335 + }
  336 +
  337 + public void setStatValue(Double statValue) {
  338 + this.statValue = statValue;
  339 + }
  340 + }
  341 +
  342 + public static class DTInfos { // 所有数据信息
  343 + /** 路牌班次数据列表 */
  344 + private List<LpObj> lpObjList;
  345 + /** 统计数据列表 */
  346 + private List<StatInfo> statInfoList;
  347 +
  348 + public List<LpObj> getLpObjList() {
  349 + return lpObjList;
  350 + }
  351 +
  352 + public void setLpObjList(List<LpObj> lpObjList) {
  353 + this.lpObjList = lpObjList;
  354 + }
  355 +
  356 + public List<StatInfo> getStatInfoList() {
  357 + return statInfoList;
  358 + }
  359 +
  360 + public void setStatInfoList(List<StatInfo> statInfoList) {
  361 + this.statInfoList = statInfoList;
  362 + }
  363 + }
  364 +
  365 + //---------------------- 生成时刻表用对象(以上) ---------------------//
  366 +
  367 + /**
  368 + * 导出动态时刻表数据。
  369 + * @param dtInfos
  370 + * @return
  371 + * @throws ScheduleException
  372 + */
  373 + public DataToolsFile exportDynamicTTinfo(DTInfos dtInfos) throws ScheduleException;
  374 +}
317 375 \ No newline at end of file
... ...
src/main/java/com/bsth/service/schedule/utils/PoiUtils.java
... ... @@ -82,7 +82,7 @@ public class PoiUtils {
82 82  
83 83 public static XSSFCell createDoubleXSSFCell(
84 84 XSSFWorkbook xssfWorkbook, XSSFRow xssfRow, short column, Double value) {
85   - return createXSSFCell(
  85 + XSSFCell xssfCell = createXSSFCell(
86 86 xssfWorkbook, xssfRow, column,
87 87 value, XSSFCell.CELL_TYPE_NUMERIC,
88 88 HorizontalAlignment.CENTER, VerticalAlignment.CENTER,
... ... @@ -90,6 +90,10 @@ public class PoiUtils {
90 90 (short) 13, new Color(0x2765A7), "宋体",
91 91 new Color(0xffffff), FillPatternType.SOLID_FOREGROUND
92 92 );
  93 +
  94 + DataFormat dataFormat = xssfWorkbook.createDataFormat();
  95 + xssfCell.getCellStyle().setDataFormat(dataFormat.getFormat("0.00"));
  96 + return xssfCell;
93 97 }
94 98  
95 99 public static XSSFCell createIntegerXSSFCell(
... ...
src/main/resources/static/pages/base/carpark/js/carpark-list-table.js
... ... @@ -30,7 +30,7 @@
30 30 var branchMap = new Map();
31 31 initCompanySelect2(function(array) {
32 32 $.each(array, function() {
33   - companyMap[this.businessCode] = this.businessName;
  33 + companyMap[this.businessCode] = this.busi nessName;
34 34 // companyMap.put(this.businessCode.toString(), this.businessName);
35 35 if(this.businessCode != null || this.businessCode !=''){
36 36 /** 查询出所属公司下的分公司名称和相应分公司代码 @param:<upCode_eq:公司代码> */
... ...
src/main/resources/static/pages/base/line/js/line-list-table.js
... ... @@ -357,6 +357,9 @@
357 357 }else if(data.status=='NOTDATA') {
358 358 // 弹出添加成功提示消息
359 359 layer.msg('系统无线路【'+ lineName +'】的站点与路段信息!');
  360 + }else if(data.status=='NOLinePlayType') {
  361 + // 弹出添加成功提示消息
  362 + layer.msg('无法识别【'+ lineName +'】的线路规划类型,请设置为双向/环线!');
360 363 }
361 364 });
362 365 }
... ...
src/main/resources/static/pages/base/lineversions/js/lineversions-list-table.js
... ... @@ -6,8 +6,8 @@
6 6 // 关闭左侧栏
7 7 if (!$('body').hasClass('page-sidebar-closed')) {$('.menu-toggler.sidebar-toggler').click();}
8 8 // 定义 page : 当前页;initPag ; icheckOptions:选择框
9   - var page = 0,
10   - initPag,
  9 + window.page = 0;
  10 + var initPag,
11 11 icheckOptions = {checkboxClass: 'icheckbox_flat-blue',increaseArea: '20%'},
12 12 storage = window.localStorage;
13 13 if(storage.xlName_AgursData!=null && storage.xlName_AgursData !='') {
... ... @@ -301,7 +301,6 @@
301 301 });
302 302 // 线路版本编辑
303 303 $(document).on('click', 'a.update_versions_route_btn', function () {
304   - debugger
305 304 var lineId = $(this).data('lineid');
306 305 swal({
307 306 title: "操作须知",
... ...
src/main/resources/static/pages/base/stationroute/add.html
... ... @@ -360,6 +360,7 @@ $(&#39;#add_station_mobal&#39;).on(&#39;AddStationMobal.show&#39;, function(e, addMap,ajaxd,stao
360 360 ajaxd.getSectionRouteInfo(Line.id,add_direction_v,function(data) {
361 361 fun.linePanlThree(Line.id,data,add_direction_v);
362 362 });
  363 + fun.editMapStatusRemove();
363 364 }
364 365 function hideMoble() {
365 366 // 隐藏mobal
... ...
src/main/resources/static/pages/base/stationroute/add_manual_select.html
... ... @@ -31,8 +31,8 @@
31 31 </form>
32 32 </div>
33 33 <div class="modal-footer">
34   - <button type="button" class="btn default" data-dismiss="modal">取消</button>
35 34 <button type="button" class="btn btn-primary" id="addManualSelectnextButton">下一步</button>
  35 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
36 36 </div>
37 37 </div>
38 38 </div>
... ...
src/main/resources/static/pages/base/stationroute/add_select.html
... ... @@ -38,8 +38,8 @@
38 38 </form>
39 39 </div>
40 40 <div class="modal-footer">
41   - <button type="button" class="btn default" data-dismiss="modal">取消</button>
42 41 <button type="button" class="btn btn-primary" id="addSelectnextButton">下一步</button>
  42 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
43 43 </div>
44 44 </div>
45 45 </div>
... ... @@ -164,12 +164,13 @@ $(&#39;#add_select_mobal&#39;).on(&#39;AddSelectMobal.show&#39;, function(e,map_,drw,ajaxd_,stat
164 164 }
165 165 });
166 166 }else if(baseRes==1) {
167   - map_.clearMarkAndOverlays();
  167 + // map_.clearMarkAndOverlays();
168 168 // 以藏站点新增方式mobal
169 169 $('#add_select_mobal').modal('hide');
170 170 // 打开绘制工具
171 171 drw.openDrawingManager();
172   - map_.localtionPoint(stationName);
  172 + // map_.localtionPoint(stationName);
  173 + fun.editMapStatus();
173 174 }
174 175 // 查询是否存在输入的站点名称
175 176 /* ajaxd_.getLikeStationName(stationName,function(data) {
... ...
src/main/resources/static/pages/base/stationroute/css/bmap_base.css
1 1 #bmap_basic{
2 2 min-width: 100%;
3   - /*width: calc(100% + 26px); */
4 3 margin-top: -10px;
5   - border: 2px solid #fdfdfd;
6   - min-height: 1200px;
7 4 height:100%;
8   - overflow: hidden;
  5 +}
  6 +
  7 +.mian-portlet-body{
  8 + height: 100%;
9 9 }
10 10  
11 11 html,body{
12 12 overflow:hidden;
13   - height: 99%;
  13 + height: calc(100% - 10px);
  14 +}
  15 +
  16 +.protlet-box-layer{
  17 + position: absolute;
  18 + z-index: 900;
  19 + height: 100%;
  20 + width: 100%;
  21 + background: #ffffff85;
  22 + display: none;
14 23 }
15 24  
16 25 .rm3_image {
... ... @@ -19,6 +28,52 @@ html,body{
19 28  
20 29 }
21 30  
  31 +.search_panel{
  32 + position: absolute;
  33 + z-index: 99;
  34 + height: 42px;
  35 + top: 40px;
  36 + left: 500px;
  37 + background: #fff1f0;
  38 + padding: 0px;
  39 + box-shadow: 5px 1px 5px rgba(90, 90, 90, 0.48);
  40 +}
  41 +
  42 +.search_input_panel {
  43 + display: inline;
  44 + height: 42px;
  45 +}
  46 +
  47 +.search_input_panel .search_input {
  48 + width: 200px;
  49 + height: 42px;
  50 + padding:0 20px 0 10px;
  51 + float:left;
  52 + border:none;
  53 + outline: 0px;
  54 +}
  55 +
  56 +.search_input_panel .clear {
  57 + right: 42px;
  58 + position: absolute;
  59 + top: 15px;
  60 + width: 20px;
  61 +}
  62 +
  63 +.search_button_panel{
  64 + height: 42px;
  65 + display: inline;
  66 +}
  67 +
  68 +.search_button {
  69 + width: 42px;
  70 + height: 42px;
  71 + background: #fff;
  72 + border:none;
  73 + top: 0;
  74 + outline: 0px;
  75 +}
  76 +
22 77 /* 隐藏百度地图logo */
23 78 .anchorBL,
24 79 .anchorBL,
... ... @@ -36,8 +91,7 @@ html,body{
36 91 height: auto;
37 92 background:transparent;
38 93 border:0px solid;
39   - box-shadow: 0 12px 15px 0 rgba(204, 204, 204, 0.33),0 17px 50px 0 rgba(204, 204, 204, 0.33);
40   - border-radius: 6px !important;box-shadow: 10px 10px 5px #888888;
  94 + border-radius: 6px !important;box-shadow: 5px 5px 5px rgba(90, 90, 90, 0.48);
41 95 }
42 96  
43 97 .help-block{
... ... @@ -45,47 +99,12 @@ html,body{
45 99 font-size: 15px;
46 100 }
47 101  
48   -/*.BMap_pop div:nth-child(1) ,*/
49   -/*.BMap_pop div:nth-child(2) ,*/
50   -/*.BMap_pop div:nth-child(3) ,*/
51   -/*.BMap_pop div:nth-child(4) ,*/
52   -/*.BMap_pop div:nth-child(5) ,*/
53   -/*.BMap_pop div:nth-child(6) ,*/
54   -/*.BMap_pop div:nth-child(7) {*/
55   - /**/
56   - /*border:0px solid rgb(255, 255, 255) !important;*/
57   - /*background-color:#3B3F51 !important;*/
58   - /**/
59   -/*}*/
60   -
61   -/*.BMap_pop div:nth-child(3){*/
62   - /**/
63   - /*width:23px !important;*/
64   - /**/
65   -/*}*/
66   -
67   -/*.BMap_pop div:nth-child(7) {*/
68   - /**/
69   - /*width:23px !important;*/
70   - /**/
71   - /*height:24px !important;*/
72   - /**/
73   -/*}*/
74   -
75   -/*.BMap_pop div:nth-child(5) {*/
76   - /**/
77   - /*height:24px !important;*/
78   - /**/
79   -/*}*/
80   -
81   -/* 图片以后在弄,先隐藏div */
82   -/*.BMap_pop div:nth-child(8) {*/
83   - /**/
84   - /*height:0px !important;*/
85   - /*!* background:url('/pages/base/stationroute/css/img/iw3-1.png') no-repeat !important; *!*/
86   - /*!* background-image:url('/pages/base/stationroute/css/img/windowinfo_b.jpg') !important; *!*/
87   - /**/
88   -/*}*/
  102 +.info_win_btn {
  103 + background: #ff8355;
  104 + color: #fff;
  105 + font-size: 12px;
  106 + border: 1px solid transparent;
  107 +}
89 108  
90 109 .BMap_pop {
91 110  
... ... @@ -94,36 +113,111 @@ html,body{
94 113 }
95 114  
96 115 .defeat-scroll {
97   -width: 98%;
98   -height:380px;
99   -/* overflow:auto; */
100   -overflow:hidden;
  116 + width: 98%;
  117 + height:380px;
  118 + overflow:hidden;
101 119 }
102 120 .defeat-scroll::-webkit-scrollbar {
103   -width:6px;
104   -height:6px;
  121 + width:6px;
  122 + height:6px;
105 123 }
106 124 .defeat-scroll::-webkit-scrollbar-button {
107   -/* background-color:#FF7677; */
108   -background:rgba(255, 255, 255, 0);
  125 + background:rgba(255, 255, 255, 0);
109 126 }
110 127 .defeat-scroll::-webkit-scrollbar-track {
111   -/* background:#FF66D5; */
112   -background:rgba(255, 255, 255, 0);
  128 + background:rgba(255, 255, 255, 0);
113 129 }
114 130 .defeat-scroll::-webkit-scrollbar-track-piece {
115   -/* background:#ff0000; */
116   -background:rgba(255, 255, 255, 0);
  131 + background:rgba(255, 255, 255, 0);
117 132 }
118 133 .defeat-scroll::-webkit-scrollbar-thumb{
119   -background:rgba(197, 196, 196, 0.81);
120   -border-radius:10px !important;
  134 + background:rgba(197, 196, 196, 0.81);
  135 + border-radius:10px !important;
121 136 }
122 137 .defeat-scroll::-webkit-scrollbar-corner {
123   -/* background:#82AFFF; */
124   -background:rgba(255, 255, 255, 0);
  138 + background:rgba(255, 255, 255, 0);
125 139 }
126   -.defeat-scroll::-webkit-scrollbar-resizer {
127   -/* background:#FF0BEE; */
128   -background:rgba(255, 255, 255, 0);
129   -}
130 140 \ No newline at end of file
  141 +/*.defeat-scroll::-webkit-scrollbar-resizer {
  142 + background:rgba(255, 255, 255, 0);
  143 +}*/
  144 +
  145 +.add_road_search_point_wrap{
  146 + width: 280px;
  147 + height: 120px;
  148 + position: absolute;
  149 + top: 40px;
  150 + left: calc(50% - 100px);
  151 + z-index: 999;
  152 + background: #fdfdfd;
  153 + box-shadow: 5px 5px 15px rgba(90, 90, 90, 0.48);
  154 +}
  155 +
  156 +.buffer_edit_body{
  157 + padding: 5px 0 0 15px;
  158 +}
  159 +
  160 +.buffer_edit_body .form-group{
  161 + margin-top: 10px;
  162 + margin-bottom: 0px;
  163 + white: 240px
  164 +}
  165 +
  166 +.add_road_search_point_wrap ._title {
  167 + padding-right: 18px;
  168 + text-align: center;
  169 + font-size: 17px;
  170 + color: #2b2b2b;
  171 + /*padding: 2px 0 0 0;*/
  172 + font-weight: 600;
  173 +}
  174 +
  175 +.buffer_edit_body .btns{
  176 + text-align: right;
  177 +}
  178 +
  179 +.buffer_edit_body .form-group .inline{
  180 + width: 100px !important;
  181 + height: 30px;
  182 + margin-right: 7px;
  183 + display: inline-block;
  184 + position: relative;
  185 + max-width: 100%;
  186 + vertical-align: middle;
  187 +}
  188 +
  189 +.sbmint-btn {
  190 + padding: 0 15px;
  191 + height: 28px;
  192 + line-height: 28px;
  193 + vertical-align: top;
  194 + margin-top: 2px;
  195 + background-color: #1e87f0;
  196 + color: #fff;
  197 + border: 1px solid transparent;
  198 +}
  199 +.cancel-btn {
  200 + padding: 0 15px;
  201 + height: 28px;
  202 + line-height: 28px;
  203 + vertical-align: top;
  204 + margin-top: 2px;
  205 + background-color: transparent;
  206 + color: #333;
  207 + border: 1px solid #e5e5e5;
  208 +}
  209 +
  210 +.draw_polyline_switch{
  211 + display: inline-block;
  212 + font-size: 12px;
  213 + vertical-align: bottom;
  214 + margin-left: 5px;
  215 +}
  216 +
  217 +.draw_polyline_switch>a{
  218 + color: red;
  219 +}
  220 +
  221 +.buffer_edit_body .form-group input{
  222 + height: 30px;
  223 +}
  224 +
... ...
src/main/resources/static/pages/base/stationroute/delete_select.html
... ... @@ -29,9 +29,9 @@
29 29 </form>
30 30 </div>
31 31 <div class="modal-footer">
32   - <button type="button" class="btn default" data-dismiss="modal">取消</button>
33 32 <button type="button" class="btn btn-primary"
34   - id="deleteSelectnextButton">下一步</button>
  33 + id="deleteSelectnextButton">下一步</button>
  34 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
35 35 </div>
36 36 </div>
37 37 </div>
... ...
src/main/resources/static/pages/base/stationroute/deletesection.html
... ... @@ -139,25 +139,25 @@ $(&#39;#delete_section_mobal&#39;).on(&#39;deleteSectionMobal.show&#39;,function(e, ajaxd, line,
139 139 ids = ids.substr(1, ids.length - 1);
140 140 var params = {};
141 141 params.ids = ids;
142   - $.get('/sectionroute/batchDestroy',params,function(resuntDate) {
143   - if (resuntDate.status == 'SUCCESS') {
144   - // 弹出添加成功提示消息
145   - layer.msg('修改成功...');
146   - /** 通知更新缓存区 */
147   - //$.post('http://192.168.168.171:8800/transport_server/basic/refresh',function(rs) {console.log(rs)})
148   - } else {
149   - // 弹出添加失败提示消息
150   - layer.msg('修改失败...');
151   - }
152   - initSearch();
153   - // 刷新左边树
154   - fun.resjtreeDate(line.id,delBatch.dir);
155   - /** 查询路段信息 @param:<Line.id:线路Id;delBatch.dir:方向> @return:data:路段数据 */
156   - ajaxd.getSectionRouteInfo(line.id,delBatch.dir,function(data) {
157   - /** 在地图上画出线路走向 @param:<Line.id:线路Id;delBatch.dir:方向;data:路段数据> */
158   - fun.linePanlThree(line.id,data,delBatch.dir);
159   - });
160   - });
  142 + $.post('/sectionroute/batchDestroy',params,function(resuntDate) {
  143 + if (resuntDate.status == 'SUCCESS') {
  144 + // 弹出添加成功提示消息
  145 + layer.msg('修改成功...');
  146 + /** 通知更新缓存区 */
  147 + //$.post('http://192.168.168.171:8800/transport_server/basic/refresh',function(rs) {console.log(rs)})
  148 + } else {
  149 + // 弹出添加失败提示消息
  150 + layer.msg('修改失败...');
  151 + }
  152 + initSearch();
  153 + // 刷新左边树
  154 + fun.resjtreeDate(line.id,delBatch.dir);
  155 + /** 查询路段信息 @param:<Line.id:线路Id;delBatch.dir:方向> @return:data:路段数据 */
  156 + ajaxd.getSectionRouteInfo(line.id,delBatch.dir,function(data) {
  157 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;delBatch.dir:方向;data:路段数据> */
  158 + fun.linePanlThree(line.id,data,delBatch.dir);
  159 + });
  160 + });
161 161 } else {
162 162 layer.msg('请选择要删除的路段!!!');
163 163 }
... ...
src/main/resources/static/pages/base/stationroute/deletestation.html
... ... @@ -141,7 +141,7 @@ $(&#39;#delete_station_mobal&#39;).on(&#39;deleteStationMobal.show&#39;,function(e, ajaxd, line,
141 141 ids = ids.substr(1, ids.length - 1);
142 142 var params = {};
143 143 params.ids = ids;
144   - $.get('/stationroute/batchDestroy',params,function(resuntDate) {
  144 + $.post('/stationroute/batchDestroy',params,function(resuntDate) {
145 145 if (resuntDate.status == 'SUCCESS') {
146 146 // 弹出添加成功提示消息
147 147 layer.msg('修改成功...');
... ...
src/main/resources/static/pages/base/stationroute/doublename_road.html
... ... @@ -32,8 +32,8 @@
32 32 </form>
33 33 </div>
34 34 <div class="modal-footer">
35   - <button type="button" class="btn default" data-dismiss="modal">取消</button>
36 35 <button type="button" class="btn btn-primary" id="editSectionButton">提交数据</button>
  36 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
37 37 </div>
38 38 </div>
39 39 </div>
... ... @@ -79,7 +79,7 @@
79 79 });
80 80 function closeMobleSetClean() {
81 81 // 清除地图覆盖物
82   - map_.clearMarkAndOverlays();
  82 + // map_.clearMarkAndOverlays();
83 83 fun.resjtreeDate(lineId,dir);
84 84 fun.editAChangeCssRemoveDisabled();
85 85 ajaxd.getSectionRouteInfo(lineId,dir,function(data) {
... ... @@ -128,12 +128,11 @@
128 128 params.versions = versions;
129 129 // 生成路段
130 130 $.get('/section/doubleName',params,function (resuntDate) {
131   - debugger
132 131 if(resuntDate.status=='SUCCESS') {
133 132 // 弹出添加成功提示消息
134 133 layer.msg('生成成功...');
135 134 } else if (resuntDate.status=='Failure') {
136   - layer.msg('抱歉,选取的路段太短,无法生成双路段!');
  135 + layer.msg('抱歉,您选取的路段基于高德地图的数据无法生成双路段!');
137 136 } else {
138 137 // 弹出添加失败提示消息
139 138 layer.msg('生成失败...');
... ... @@ -141,7 +140,7 @@
141 140 $('#doublename_road_mobal').modal('hide');
142 141 var dir = params.directions;
143 142 // 刷行左边树
144   - fun.resjtreeDate(lineId,dir);
  143 + // fun.resjtreeDate(lineId,dir);
145 144 closeMobleSetClean();
146 145 });
147 146 });
... ...
src/main/resources/static/pages/base/stationroute/edit.html
... ... @@ -21,25 +21,19 @@
21 21 <input type="hidden" name="dbType" id="dbTypeInput" value="b"/>
22 22 <input type="hidden" name="x" id="xInput" value=""/>
23 23 <input type="hidden" name="y" id="yInput" value=""/>
  24 + <input type="hidden" name="zdmc" id="zdmcInput"/>
  25 + <input type="hidden" name="descriptions" id="descriptionsTextarea" />
  26 + <input type="hidden" name="directions" id="stationdirSelect" />
  27 +
  28 + <!-- 站点名称 -->
24 29 <!-- 站点名称 -->
25 30 <div class="form-body">
26 31 <div class="form-group">
27 32 <label class="control-label col-md-3">
28   - <span class="required"> * </span> 站点名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
29   - </label>
30   - <div class="col-md-6">
31   - <input type="text" class="form-control" name="zdmc" id="zdmcInput" placeholder="站点名称" readonly="readonly">
32   - </div>
33   - </div>
34   - </div>
35   - <!-- 站点路由名称 -->
36   - <div class="form-body">
37   - <div class="form-group">
38   - <label class="control-label col-md-3">
39   - <span class="required"> * </span> 站点路由名称:
  33 + <span class="required"> * </span> 站点名称:
40 34 </label>
41 35 <div class="col-md-6">
42   - <input type="text" class="form-control" name="stationName" id="stationNameInput" placeholder="站点路由名称">
  36 + <input type="text" class="form-control" name="stationName" id="stationNameInput" placeholder="站点名称" readonly="readonly">
43 37 </div>
44 38 </div>
45 39 </div>
... ... @@ -54,21 +48,6 @@
54 48 </div>
55 49 </div>
56 50 </div>
57   - <!-- 站点方向 -->
58   - <div class="form-body">
59   - <div class="form-group">
60   - <label class="control-label col-md-3">
61   - <span class="required"> * </span>站点方向&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
62   - </label>
63   - <div class="col-md-6">
64   - <select name="directions" class="form-control" id="stationdirSelect">
65   - <option value="">-- 请选择站点类型 --</option>
66   - <option value="0">上行</option>
67   - <option value="1">下行</option>
68   - </select>
69   - </div>
70   - </div>
71   - </div>
72 51 <!-- 站点序号 -->
73 52 <div class="form-body">
74 53 <div class="form-group">
... ... @@ -175,13 +154,6 @@
175 154 </div>
176 155 </div>
177 156 </div>
178   - <!-- 描述/说明 -->
179   - <div class="form-group">
180   - <label class="control-label col-md-3"> 描述/说明&nbsp;&nbsp;&nbsp;: </label>
181   - <div class="col-md-6">
182   - <textarea class="form-control" rows="3" name="descriptions" id="descriptionsTextarea" placeholder="描述/说明"></textarea>
183   - </div>
184   - </div>
185 157 </form>
186 158 </div>
187 159 <div class="modal-footer">
... ... @@ -198,7 +170,7 @@ $(&#39;#edit_station_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,ajaxd,stati
198 170 var editStationParmasObj = station_.getEitdStation();
199 171 var addLine = Line_.getLineObj();
200 172 fun.setFormValue(editStationParmasObj);
201   - var initzdlyP = {'lineCode_eq':editStationParmasObj.stationRouteLineCode,'destroy_eq':0,'directions_eq':editStationParmasObj.stationRouteDirections};
  173 + var initzdlyP = {'lineCode_eq':editStationParmasObj.stationRouteLIneCode,'destroy_eq':0,'directions_eq':editStationParmasObj.stationRoutedirections};
202 174 initSelect(initzdlyP);
203 175 // 显示mobal
204 176 $('#edit_station_mobal').modal({show : true,backdrop: 'static',keyboard: false});
... ... @@ -217,6 +189,7 @@ $(&#39;#edit_station_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,ajaxd,stati
217 189 ajaxd.getSectionRouteInfo(addLine.id,add_direction_v,function(data) {
218 190 fun.linePanlThree(addLine.id,data,add_direction_v);
219 191 });
  192 + fun.editMapStatusRemove();
220 193 }
221 194 // 编辑表单元素
222 195 var form = $('#edit_station_form');
... ... @@ -283,7 +256,7 @@ $(&#39;#edit_station_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,ajaxd,stati
283 256 var id = addLine.id;
284 257 var dir = params.directions
285 258 // 刷行左边树
286   - fun.resjtreeDate(id,dir);
  259 + // fun.resjtreeDate(id,dir);
287 260 closeMobleSetClean();
288 261 });
289 262 }
... ... @@ -312,7 +285,7 @@ $(&#39;#edit_station_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,ajaxd,stati
312 285 $.each(array, function(i, g){
313 286 // 判断.
314 287 if(g.name!='' || g.name != null) {
315   - if(g.stationRouteCode != editStationParmasObj.stationRouteStationRouteCode) {
  288 + if(g.stationRouteCode != editStationParmasObj.stationRouteCode) {
316 289 // 添加拼音检索下拉框格式数据数组.
317 290 if(editStationParmasObj.stationRouteStationMark=='E' && i == (len_-2)){
318 291 paramsD.push({'id':g.stationRouteCode + '_' + 'E' + '_' + g.directions,
... ... @@ -333,13 +306,13 @@ $(&#39;#edit_station_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,ajaxd,stati
333 306 });
334 307 }
335 308 function setZdlyValue() {
336   - ajaxd.findUpStationRouteCode(editStationParmasObj.stationRouteLine,editStationParmasObj.stationRouteDirections,editStationParmasObj.stationRouteStationRouteCode,function(str) {
  309 + ajaxd.findUpStationRouteCode(editStationParmasObj.stationRouteLine,editStationParmasObj.stationRoutedirections,editStationParmasObj.stationRouteCode,function(str) {
337 310 if(str.length>0){
338 311 var upStationRouteCode;
339 312 if (editStationParmasObj.stationRouteStationMark == 'E') {
340   - upStationRouteCode = str[0].stationRouteCode + '_' + 'E' + '_' + editStationParmasObj.stationRouteDirections;
  313 + upStationRouteCode = str[0].stationRouteCode + '_' + 'E' + '_' + editStationParmasObj.stationRoutedirections;
341 314 } else{
342   - upStationRouteCode = str[0].stationRouteCode + '_' + str[0].stationRouteMarke + '_' + editStationParmasObj.stationRouteDirections;
  315 + upStationRouteCode = str[0].stationRouteCode + '_' + str[0].stationRouteMarke + '_' + editStationParmasObj.stationRoutedirections;
343 316 }
344 317 $('#stationrouteSelect').select2('val',upStationRouteCode);
345 318 }else {
... ... @@ -374,5 +347,5 @@ $(&#39;#edit_station_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,ajaxd,stati
374 347 }
375 348 return tel;
376 349 }, '方向必须一致!');
377   -});
  350 +});
378 351 </script>
379 352 \ No newline at end of file
... ...
src/main/resources/static/pages/base/stationroute/edit_select.html
... ... @@ -19,7 +19,7 @@
19 19 系统无法生成,请选择其他方式新增
20 20 </div>
21 21 <div class="form-group" id="formRequ">
22   - <label class="col-md-3 control-label"><span class="required"> * </span>原始站点名称:</label>
  22 + <label class="col-md-3 control-label"><span class="required"> * </span>站点名称:</label>
23 23 <div class="col-md-9" id="errorInfo">
24 24 <input type="text" class="form-control input-medium" id="stationNamebootbox" name="stationNamebootbox">
25 25 </div>
... ... @@ -40,17 +40,14 @@
40 40 </form>
41 41 </div>
42 42 <div class="modal-footer">
43   - <button type="button" class="btn default" data-dismiss="modal">取消</button>
44 43 <button type="button" class="btn btn-primary" id="editselectStationNextButton">下一步</button>
  44 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
45 45 </div>
46 46 </div>
47 47 </div>
48 48 </div>
49 49 <script type="text/javascript">
50   -$('#edit_select_mobal').on('editSelectMobal_show', function(e, map_,drw,ajaxd,editStationObj,lineObj,fun,dir_){
51   - var sel = fun.getCurrSelNode(dir_);
52   - debugger
53   - var Station = sel[0].original;
  50 +$('#edit_select_mobal').on('editSelectMobal_show', function(e, map_,drw,ajaxd,editStationObj,lineObj,fun,Station){
54 51 // 显示选择修改方式弹出层
55 52 $('#edit_select_mobal').modal({show : true,backdrop: 'static',keyboard: false});
56 53 setTimeout(function(){
... ... @@ -75,7 +72,7 @@ $(&#39;#edit_select_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,drw,ajaxd,ed
75 72 setTimeout(function(){$('.tipso-animation').tipso('hide');},4000);
76 73 },500);
77 74 // 获取站点名称元素并赋值
78   - $('#stationNamebootbox').val(Station.stationStationName);
  75 + $('#stationNamebootbox').val(Station.stationRouteName);
79 76 // 定义站点图形
80 77 var stationShapesTypeV = Station.stationShapesType;
81 78 // 获取表单元素
... ... @@ -118,28 +115,25 @@ $(&#39;#edit_select_mobal&#39;).on(&#39;editSelectMobal_show&#39;, function(e, map_,drw,ajaxd,ed
118 115 var editStationName = params.stationNamebootbox;
119 116  
120 117 if(params.editselect==0){
121   - $('#downLine').addClass('btn disabled');
122   - $('.btn-circle').addClass('disabled');
123   - $('#upLine').addClass('btn disabled');
124 118 editStationObj.setEitdStation(Station);
125 119 editStationObj.setEitdStationName(editStationName);
126 120  
127   - map_.clearMarkAndOverlays();
  121 + // map_.clearMarkAndOverlays();
128 122 // 打开绘制工具
129 123 drw.openDrawingManager();
130   - map_.localtionPoint(editStationName);
  124 + map_.localtionPoint(editStationName+"公交站点");
  125 + fun.editMapStatus();
131 126 }else if(params.editselect==1){
132   - $('#downLine').addClass('btn disabled');
133   - $('.btn-circle').addClass('disabled');
134   - $('#upLine').addClass('btn disabled');
135 127 editStationObj.setEitdStation(Station);
136 128 editStationObj.setEitdStationName(editStationName);
137   -
  129 + map_.clearMark();
138 130 // 弹出添加失败提示消息,2秒关闭(如果不配置,默认是3秒)
139 131 var mindex = layer.msg('编辑完图形后,请双击图形区域保存',{ offset: '126px',
140 132 shift: 0,time: 3000});
141 133 // 编辑图形
142   - map_.editShapes(editStationName,stationShapesTypeV,mindex);
  134 + // map_.editShapes(editStationName,stationShapesTypeV,mindex);
  135 + map_.editShapes(editStationObj);
  136 + fun.editMapStatus();
143 137 }
144 138 }
145 139 });
... ...
src/main/resources/static/pages/base/stationroute/editsection.html
... ... @@ -14,12 +14,17 @@
14 14 <!-- 线路ID -->
15 15 <input type="hidden" name="sectionId" id="sectionIdInput">
16 16 <input type="hidden" name="sectionRouteId" id="sectionRouteIdInput">
  17 + <input type="hidden" name="sectionCode" id="sectionCodeInput">
17 18 <input type="hidden" name="sectionRouteLine" id="sectionRouteLineInput">
18 19 <input type="hidden" name="lineCode" id="lineCodeInput">
19 20 <input type="hidden" name="bsectionVector" id="bsectionVectorInput" />
20 21 <input type="hidden" name="csectionVector" id="csectionVectorInput" value=""/>
21 22 <input type="hidden" name="dbType" id="dbTypeInput" value="b"/>
22 23 <input type="hidden" name="isRoadeSpeed" id="isRoadeSpeedInput"/>
  24 + <input type="hidden" name="directions" id="directionsSection">
  25 + <input type="hidden" name="speedLimit" id="speedLimitInput" >
  26 + <input type="hidden" name="roadCoding" id="roadCodingCodInput"/>
  27 + <input type="hidden" name="versions" id="versionsInput"/>
23 28 <!-- 路段名称 -->
24 29 <div class="form-body">
25 30 <div class="form-group">
... ... @@ -31,17 +36,6 @@
31 36 </div>
32 37 </div>
33 38 </div>
34   - <!-- 路段编码 -->
35   - <div class="form-body">
36   - <div class="form-group">
37   - <label class="control-label col-md-3">
38   - <span class="required"> * </span> 路段编码:
39   - </label>
40   - <div class="col-md-6">
41   - <input type="text" class="form-control" name="sectionCode" id="sectionCodeInput" placeholder="路段编码" readonly="readonly">
42   - </div>
43   - </div>
44   - </div>
45 39 <!-- 路段序号 -->
46 40 <div class="form-body">
47 41 <div class="form-group">
... ... @@ -54,103 +48,20 @@
54 48 </div>
55 49 </div>
56 50 </div>
57   - <!-- 路段方向 -->
58   - <div class="form-body">
59   - <div class="form-group">
60   - <label class="control-label col-md-3">
61   - <span class="required"> * </span>路段方向:
62   - </label>
63   - <div class="col-md-6">
64   - <select name="directions" class="form-control" id="directionsSection">
65   - <option value="">-- 请选择路段类型 --</option>
66   - <option value="0">上行</option>
67   - <option value="1">下行</option>
68   - </select>
69   - </div>
70   - </div>
71   - </div>
72   - <!-- 路段限速 -->
73   - <div class="form-body">
74   - <div class="form-group">
75   - <label class="control-label col-md-3">
76   - <span class="required"> * </span> 路段限速:
77   - </label>
78   - <div class="col-md-6">
79   - <input type="text" class="form-control" name="speedLimit" id="speedLimitInput" placeholder="路段限速">
80   - </div>
81   - </div>
82   - </div>
83   - <!-- 是否撤销 -->
84   - <div class="form-body">
85   - <div class="form-group">
86   - <label class="col-md-3 control-label"><span class="required"> * </span>是否撤销:</label>
87   - <div class="col-md-6">
88   - <select name="destroy" class="form-control" id="destroySelect">
89   - <option value="">-- 请选择撤销类型 --</option>
90   - <option value="0">否</option>
91   - <option value="1">是</option>
92   - </select>
93   - </div>
94   - </div>
95   - </div>
96   - <!-- 道路编码-->
97   - <div class="form-body">
98   - <div class="form-group">
99   - <label class="control-label col-md-3">道路编码:</label>
100   - <div class="col-md-6">
101   - <input type="text" class="form-control" name="roadCoding" id="roadCodingCodInput" placeholder="道路编码">
102   - </div>
103   - </div>
104   - </div>
105   - <!-- 路段长度 -->
106   - <div class="form-body">
107   - <div class="form-group">
108   - <label class="col-md-3 control-label">路段长度:</label>
109   - <div class="col-md-6">
110   - <input type="text" class="form-control" name="sectionDistance" id="sectionDistanceInput" placeholder="路段长度">
111   - <span class="help-block">单位:公里(km)</span>
112   - </div>
113   - </div>
114   - </div>
115   - <!-- 路段历时 -->
116   - <div class="form-body">
117   - <div class="form-group">
118   - <label class="col-md-3 control-label">路段历时:</label>
119   - <div class="col-md-6">
120   - <input type="text" class="form-control" name="sectionTime" id="sectionTimeInput" placeholder="路段历时">
121   - <span class="help-block">单位:分钟(min)</span>
122   - </div>
123   - </div>
124   - </div>
125   - <!-- 版本号 -->
126   - <div class="form-body">
127   - <div class="form-group">
128   - <label class="col-md-3 control-label">版本号&nbsp;&nbsp;&nbsp;:</label>
129   - <div class="col-md-6">
130   - <input type="text" class="form-control" name="versions" id="versionsInput" Readonly>
131   - </div>
132   - </div>
133   - </div>
134   - <!-- 描述/说明 -->
135   - <div class="form-group">
136   - <label class="control-label col-md-3"> 描述/说明: </label>
137   - <div class="col-md-6">
138   - <textarea class="form-control" rows="3" name="descriptions" id="descriptionsTextarea" placeholder="描述/说明"></textarea>
139   - </div>
140   - </div>
  51 +
141 52 </form>
142 53 </div>
143 54 <div class="modal-footer">
144   - <button type="button" class="btn default" data-dismiss="modal">取消</button>
145 55 <button type="button" class="btn btn-primary" id="editSectionButton">提交数据</button>
  56 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
146 57 </div>
147 58 </div>
148 59 </div>
149 60 </div>
150 61 <script type="text/javascript">
151 62  
152   -$('#edit_section_mobal').on('editSectionMobal_show', function(e, map_,ajaxd,section,fun){
153   - var Section = section.getEitdSection();
  63 +$('#edit_section_mobal').on('editSectionMobal_show', function(e, map_,ajaxd,p,fun){
  64 + var Section = p.data;
154 65 fun.setSectionFormValue(Section);
155 66 // 方向
156 67 var dir = Section.sectionrouteDirections;
... ... @@ -159,15 +70,6 @@ $(&#39;#edit_section_mobal&#39;).on(&#39;editSectionMobal_show&#39;, function(e, map_,ajaxd,sect
159 70 ajaxd.getStation(lineId,dir,function(treeData) {
160 71 var array = treeData[0].children[1].children,paramsD =new Array();
161 72 var eq_scetionRouteCode = Section.sectionrouteCode;
162   - /* for(var i = 0 ; i<dArray.length; i++){
163   - var ptions_v = dArray[i].sectionrouteCode;
164   - if(eq_scetionRouteCode == ptions_v){
165   - continue;
166   - }
167   - options += '<option value="'+ ptions_v +'">'+dArray[i].sectionName + ' (' + ptions_v +')'
168   - + ' --' + fun.dirdmToName(dArray[i].sectionrouteDirections) + '</option>' ;
169   - }
170   - $('#sectionrouteCodeSelect').html(options); */
171 73 paramsD.push({'id':'请选择...','text':'将此路段设置位第一个路段'});
172 74 // 遍历.
173 75 $.each(array, function(i, g){
... ... @@ -195,16 +97,14 @@ $(&#39;#edit_section_mobal&#39;).on(&#39;editSectionMobal_show&#39;, function(e, map_,ajaxd,sect
195 97 });
196 98 });
197 99 // 显示mobal
198   - $('#edit_section_mobal').modal({show : true,backdrop: 'static',keyboard: false});
  100 + $('#edit_section_mobal').modal({show : true,backdrop: 'static',keyboard: false});//
199 101 // 当调用 hide 实例方法时触发
200 102 $('#edit_section_mobal').on('hide.bs.modal', function () {
201 103 closeMobleSetClean();
202 104 });
203 105 function closeMobleSetClean() {
204   - // 清除地图覆盖物
205   - map_.clearMarkAndOverlays();
206   - /** 设置修改路段集合对象为空 */
207   - section.setEitdSection({});
  106 + // 清除地图覆盖物
  107 + map_.clearMarkAndOverlays();
208 108 fun.resjtreeDate(lineId,dir);
209 109 fun.editAChangeCssRemoveDisabled();
210 110 ajaxd.getSectionRouteInfo(lineId,dir,function(data) {
... ... @@ -227,14 +127,14 @@ $(&#39;#edit_section_mobal&#39;).on(&#39;editSectionMobal_show&#39;, function(e, map_,ajaxd,sect
227 127 focusInvalid : false,
228 128 rules : {
229 129 'sectionName' : {required : true,maxlength:50},// 路段名称 必填项
230   - 'sectionCode': {required : true,},// 路段编码 必填项
  130 + /*'sectionCode': {required : true,},// 路段编码 必填项
231 131 'directions' : {required : true,},// 路段方向 必填项
232 132 'speedLimit' : {required : true,number : true},// 路段限速 必须输入合法的数字(负数,小数)。
233 133 'destroy' : {required : true,},// 是否撤销 必填项.
234 134 'roadCoding' : {number : true},// 道路编码 必须输入合法的数字(负数,小数)。
235 135 'sectionTime' : {number : true},// 路段时长 必须输入合法的数字(负数,小数)。
236 136 'sectionDistance' : {number : true},// 路段长度 必须输入合法的数字(负数,小数)。
237   - 'descriptions' : {maxlength: 150}// 描述与说明 最大长度.
  137 + 'descriptions' : {maxlength: 150}// 描述与说明 最大长度.*/
238 138 },
239 139 invalidHandler : function(event, validator) {
240 140 error.show();
... ... @@ -250,7 +150,14 @@ $(&#39;#edit_section_mobal&#39;).on(&#39;editSectionMobal_show&#39;, function(e, map_,ajaxd,sect
250 150 label.closest('.form-group').removeClass('has-error');
251 151 },
252 152 submitHandler : function(f) {
  153 + // 获取折线坐标集合
  154 + var editPloyLineArray = p.getPath();
  155 + // 折线坐标集合
  156 + $('#bsectionVectorInput').val(JSON.stringify(editPloyLineArray));
253 157 var params = form.serializeJSON();
  158 + params.destroy=0;
  159 + params.sectionDistance=0;
  160 + params.sectionTime=0;
254 161 error.hide();
255 162 if(params.sectionrouteCode=='请选择...')
256 163 params.sectionrouteCode='';
... ... @@ -264,8 +171,6 @@ $(&#39;#edit_section_mobal&#39;).on(&#39;editSectionMobal_show&#39;, function(e, map_,ajaxd,sect
264 171 }
265 172 $('#edit_section_mobal').modal('hide');
266 173 var dir = params.directions
267   - // 刷行左边树
268   - fun.resjtreeDate(lineId,dir);
269 174 closeMobleSetClean();
270 175 });
271 176 }
... ...
src/main/resources/static/pages/base/stationroute/js/addstationobj.js
... ... @@ -31,7 +31,7 @@ var AddStationObj = function () {
31 31 },
32 32  
33 33 /** 设置新增站点集合对象站点中心点百度坐标属性值 @param:<bJwpoints:中心点百度坐标) */
34   - setAddStationBJwpoints : function(bJwpoints) {
  34 + setAddStationJwpoints : function(bJwpoints) {
35 35  
36 36 station.bJwpoints = bJwpoints;
37 37 },
... ...
src/main/resources/static/pages/base/stationroute/js/drawingManager.js
... ... @@ -68,7 +68,7 @@ var DrawingManagerObj = function () {
68 68  
69 69 var pointE = e;
70 70  
71   - // 多变行质心点
  71 + // 多边行中心点
72 72 var addSttationPoints_ = pointE.getBounds().getCenter().lng+ ' ' + pointE.getBounds().getCenter().lat;
73 73  
74 74 var addPolyGonLen_ = pointE.getPath().length;
... ... @@ -96,7 +96,7 @@ var DrawingManagerObj = function () {
96 96 if(!$.isEmptyObject(add)){
97 97  
98 98 /** 设置新增站点集合对象站点中心点百度坐标属性值 @param:<bJwpoints:中心点百度坐标) */
99   - AddStationObj.setAddStationBJwpoints(addSttationPoints_);
  99 + AddStationObj.setAddStationJwpoints(addSttationPoints_);
100 100  
101 101 /** 设置新增站点集合对象范围图形类型属性值 @param:<shapesType:范围图形类型) */
102 102 AddStationObj.setAddStationShapesType('d');
... ... @@ -119,7 +119,7 @@ var DrawingManagerObj = function () {
119 119 if(!$.isEmptyObject(edit)){
120 120  
121 121 /** 设置修改站点集合对象站点中心点百度坐标属性值 @param:<bJwpoints:中心点百度坐标) */
122   - EditStationObj.setEitdStationBJwpoints(addSttationPoints_);
  122 + EditStationObj.setEitdStationJwpoints(addSttationPoints_);
123 123  
124 124 /** 设置修改站点集合对象范围图形类型属性值 @param:<shapesType:范围图形类型) */
125 125 EditStationObj.setEitdStationShapesType('d');
... ...
src/main/resources/static/pages/base/stationroute/js/editstationobj.js
... ... @@ -31,9 +31,9 @@ var EditStationObj = function () {
31 31 },
32 32  
33 33 /** 设置修改站点集合对象站点中心点百度坐标属性值 @param:<bJwpoints:中心点百度坐标) */
34   - setEitdStationBJwpoints : function(bJwpoints) {
  34 + setEitdStationJwpoints : function(bJwpoints) {
35 35  
36   - station.stationBJwpoints = bJwpoints;
  36 + station.stationJwpoints = bJwpoints;
37 37 },
38 38  
39 39 /** 设置修改站点集合对象范围图形类型属性值 @param:<shapesType:范围图形类型) */
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-ajax-getdata.js
... ... @@ -18,7 +18,9 @@
18 18 * - - - - - -》 stationRouteIsDestroy:撤销站点
19 19 *
20 20 * - - - - - -》 sectionUpdate : 编辑线路走向保存
21   - *
  21 + *
  22 + * - - - - - -》 sectionSave : 生成线路走向
  23 + *
22 24 * - - - - - -》 getIdLineName:获取线路名称
23 25 *
24 26 * - - - - - -》 getSectionRouteInfo:查询路段信息
... ... @@ -54,7 +56,7 @@ var GetAjaxData = function(){
54 56 },
55 57 // 查询线路某方向下所有站点的中心百度坐标
56 58 getStationRoutePoint : function(id_,dir_,callback) {
57   - $get('/stationroute/getStationRouteCenterPoints',{lineId:id_,direction:dir_},function(result) {
  59 + $get('/stationroute/getStationRouteList',{lineId:id_,direction:dir_},function(result) {
58 60 callback && callback(result);
59 61 });
60 62 },
... ... @@ -65,7 +67,7 @@ var GetAjaxData = function(){
65 67 callback && callback(array);
66 68 });
67 69 },
68   -
  70 +
69 71 // 查询站点编码
70 72 getStationCode : function(callback) {
71 73 $get('/station/getStationCode',null,function(stationCode) {
... ... @@ -74,6 +76,12 @@ var GetAjaxData = function(){
74 76 }
75 77 });
76 78 },
  79 + // 查询路段编码
  80 + getSectionCode : function(callback) {
  81 + $get('/section/getSectionCode',null,function(sectionCode) {
  82 + callback && callback(sectionCode);
  83 + });
  84 + },
77 85 findUpStationRouteCode : function(lineId,diraction,stationRouteCode,callback) {
78 86 $get('/stationroute/findUpStationRouteCode',{lineId:lineId,direction:diraction,stationRouteCode:stationRouteCode},function(result) {
79 87 callback && callback(result);
... ... @@ -110,15 +118,17 @@ var GetAjaxData = function(){
110 118  
111 119 // 编辑线路走向保存
112 120 sectionUpdate:function(section,callback) {
113   -
114 121 $post('/section/sectionUpdate',section,function(data) {
115   -
116 122 callback && callback(data);
117   -
118 123 })
119   -
120 124 },
121   -
  125 + // 生成线路走向
  126 + sectionSave:function(section,callback){
  127 + $post('/section/sectionSave',section,function(data) {
  128 + callback && callback(data);
  129 + })
  130 + },
  131 +
122 132 // 获取线路名称
123 133 getIdLineName : function (id,callback) {
124 134  
... ... @@ -143,6 +153,12 @@ var GetAjaxData = function(){
143 153 callback && callback(resultdata);
144 154 });
145 155 },
  156 + // 根据ID查询路段信息.
  157 + getSectionRouteInfoById : function(sectionRouteId,callback){
  158 + $get('/sectionroute/findSectionRouteInfoFormId',{id:sectionRouteId},function(r) {
  159 + return callback && callback(r);
  160 + });
  161 + },
146 162  
147 163 // 手动规划线路保存
148 164 manualSave : function(params,callback) {
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-list-events.js
... ... @@ -97,7 +97,6 @@ $(function(){
97 97 WorldsBMap.clearMarkAndOverlays();
98 98 // 刷新左边树
99 99 PublicFunctions.resjtreeDate(Line.id,0);
100   - PublicFunctions.resjtreeDate(Line.id,1);
101 100 /** 查询上行路段信息 @param:<Line.id:线路Id;0:上行> @return:data:路段数据 */
102 101 GetAjaxData.getSectionRouteInfo(Line.id,0,function(data) {
103 102 /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-list-function.js
... ... @@ -26,548 +26,529 @@
26 26  
27 27 var PublicFunctions = function () {
28 28 var PubFun = {
29   - /** 初始化线路标题与ID */
30   - setTiteText : function(lineId) {
31   - // 根据线路ID获取线路名称
32   - GetAjaxData.getIdLineName(lineId,function(data) {
33   - // 定义线路名称
34   - var lineNameV = data.name;
35   - $('.portlet-title .caption').text(lineNameV);
36   - });
37   - },
38   - /** @param diraction 方向 @return array */
39   - getCurrSelNode : function(diraction){
40   - // 定义Obj
41   - var array = [];
42   - try {
  29 + /** 初始化线路标题与ID */
  30 + setTiteText : function(lineId) {
  31 + // 根据线路ID获取线路名称
  32 + GetAjaxData.getIdLineName(lineId,function(data) {
  33 + // 定义线路名称
  34 + var lineNameV = data.name;
  35 + $('.portlet-title .caption').text(lineNameV);
  36 + });
  37 + },
  38 + /** @param diraction 方向 @return array */
  39 + getCurrSelNode : function(diraction){
  40 + // 定义Obj
  41 + var array = [];
  42 + try {
  43 + // 上行
  44 + if(diraction=='0'){
  45 + // 获取上行选中节点
  46 + array = $.jstree.reference("#station_Up_tree").get_selected(true);
  47 + // 下行
  48 + }else if(diraction=='1'){
  49 + // 获取下行选中节点
  50 + array = $.jstree.reference("#station_Down_tree").get_selected(true);
  51 + }
  52 + } catch (e) {
  53 + console.log(e);
  54 + }
  55 + // 返回Obj
  56 + return array;
  57 + },
  58 + /** @param id:线路ID ;directionData:方向 */
  59 + resjtreeDate : function(id,directionData){
  60 + // 获取树数据
  61 + GetAjaxData.getStation(id,directionData,function(treeDateJson) {
  62 + // 获取数据长度
  63 + var len = treeDateJson[0].children[0].children.length;
  64 + // 上行
  65 + if(directionData==0){
  66 + // 长度大于零
  67 + if(len>0) {
  68 + // 隐藏上行规划
  69 + $('#upToolsMobal').hide();
  70 + // 显示树
  71 + $('#uptreeMobal').show();
  72 + // 刷新树
  73 + StationTreeData.upreloadeTree(treeDateJson);
  74 + }else {
  75 + // 显示上行规划
  76 + $('#upToolsMobal').show();
  77 + // 隐藏上行树
  78 + $('#uptreeMobal').hide();
  79 + }
  80 +
  81 + // 下行
  82 + }else if(directionData==1){
  83 + // 如果长度大于
  84 + if(len>0) {
  85 + // 隐藏下行规划
  86 + $('#downToolsMobal').hide();
  87 + // 显示下行树
  88 + $('#DowntreeMobal').show();
  89 + // 跟新树
  90 + StationTreeData.dwonreloadeTree(treeDateJson);
  91 + }else {
  92 + // 显示下行规划
  93 + $('#downToolsMobal').show();
  94 + // 隐藏下行树
  95 + $('#DowntreeMobal').hide();
  96 + }
  97 + }
  98 + });
  99 + },
  100 +
  101 + /** 修正线路名称 @param:<directionUpValue:方向(0:上行;1:下行)> */
  102 + lineNameIsHaveInterval : function(directionData) {
  103 + // 定义线路名称
  104 + var lineNameV = $('.portlet-title .caption').text();
  105 + // 线路名称是否为区间线路
  106 + if(lineNameV.indexOf('区间')>0){
  107 + // 截去区间
  108 + var lineNameNew = lineNameV.replace('区间','');
  109 + // 是否继续弹出层
  110 + layer.confirm('系统无法生成该线路【'+lineNameV+'】的站点与路段!自动修改为如下线路名称【'+lineNameNew+'】生成', {
  111 + btn : [ '确认提示并提交', '取消' ]
  112 + }, function(index) {
  113 + // 关闭弹出层
  114 + layer.close(index);
  115 + // 线路名称去掉区间
  116 + lineNameV = lineNameNew;
  117 + /** 保存 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行)> */
  118 + PublicFunctions.systemLineStation(lineNameV,directionData);
  119 + },function(){
  120 + // 关闭弹出层
  121 + layer.closeAll();
43 122 // 上行
44   - if(diraction=='0'){
45   - // 获取上行选中节点
46   - array = $.jstree.reference("#station_Up_tree").get_selected(true);
  123 + if(directionData==0){
  124 + // 显示上行规划
  125 + $('#upToolsMobal').show();
47 126 // 下行
48   - }else if(diraction=='1'){
49   - // 获取下行选中节点
50   - array = $.jstree.reference("#station_Down_tree").get_selected(true);
  127 + }else if(directionData==1){
  128 + // 显示下行规划
  129 + $('#downToolsMobal').show();
51 130 }
52   - } catch (e) {
53   - console.log(e);
54   - }
55   - // 返回Obj
56   - return array;
57   - },
58   - /** @param id:线路ID ;directionData:方向 */
59   - resjtreeDate : function(id,directionData){
60   - // 获取树数据
61   - GetAjaxData.getStation(id,directionData,function(treeDateJson) {
62   - // 获取数据长度
63   - var len = treeDateJson[0].children[0].children.length;
  131 + });
  132 +
  133 + // 线路名称是否为定班线路
  134 + }else if(lineNameV.indexOf('定班')>0){
  135 + // 截去定班
  136 + var lineNameNew = lineNameV.replace('定班','');
  137 + // 是否继续弹出层
  138 + layer.confirm('系统无法生成该线路【'+lineNameV+'】的站点与路段!自动修改为如下线路名称【'+lineNameNew+'】生成', {
  139 + btn : [ '确认提示并提交', '取消' ]
  140 + }, function(index) {
  141 + // 关闭弹出层
  142 + layer.close(index);
  143 + // 线路名称去掉区间
  144 + lineNameV = lineNameNew;
  145 + /** 保存 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行)> */
  146 + PublicFunctions.systemLineStation(lineNameV,directionData);
  147 + },function(){
  148 + // 关闭弹出层
  149 + layer.closeAll();
64 150 // 上行
65 151 if(directionData==0){
66   - // 长度大于零
67   - if(len>0) {
68   - // 隐藏上行规划
69   - $('#upToolsMobal').hide();
70   - // 显示树
71   - $('#uptreeMobal').show();
72   - // 刷新树
73   - StationTreeData.upreloadeTree(treeDateJson);
74   - }else {
75   - // 显示上行规划
76   - $('#upToolsMobal').show();
77   - // 隐藏上行树
78   - $('#uptreeMobal').hide();
79   - }
80   -
  152 + // 显示上行规划
  153 + $('#upToolsMobal').show();
81 154 // 下行
82 155 }else if(directionData==1){
83   - // 如果长度大于
84   - if(len>0) {
85   - // 隐藏下行规划
86   - $('#downToolsMobal').hide();
87   - // 显示下行树
88   - $('#DowntreeMobal').show();
89   - // 跟新树
90   - StationTreeData.dwonreloadeTree(treeDateJson);
91   - }else {
92   - // 显示下行规划
93   - $('#downToolsMobal').show();
94   - // 隐藏下行树
95   - $('#DowntreeMobal').hide();
96   - }
  156 + // 显示下行规划
  157 + $('#downToolsMobal').show();
97 158 }
98 159 });
99   - },
100   -
101   - /** 修正线路名称 @param:<directionUpValue:方向(0:上行;1:下行)> */
102   - lineNameIsHaveInterval : function(directionData) {
103   - // 定义线路名称
104   - var lineNameV = $('.portlet-title .caption').text();
105   - // 线路名称是否为区间线路
106   - if(lineNameV.indexOf('区间')>0){
107   - // 截去区间
108   - var lineNameNew = lineNameV.replace('区间','');
109   - // 是否继续弹出层
110   - layer.confirm('系统无法生成该线路【'+lineNameV+'】的站点与路段!自动修改为如下线路名称【'+lineNameNew+'】生成', {
111   - btn : [ '确认提示并提交', '取消' ]
112   - }, function(index) {
113   - // 关闭弹出层
114   - layer.close(index);
115   - // 线路名称去掉区间
116   - lineNameV = lineNameNew;
117   - /** 保存 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行)> */
118   - PublicFunctions.systemLineStation(lineNameV,directionData);
119   - },function(){
120   - // 关闭弹出层
121   - layer.closeAll();
122   - // 上行
123   - if(directionData==0){
124   - // 显示上行规划
125   - $('#upToolsMobal').show();
126   - // 下行
127   - }else if(directionData==1){
128   - // 显示下行规划
129   - $('#downToolsMobal').show();
130   - }
  160 + }else {
  161 + /** 直接保存 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行)> */
  162 + PublicFunctions.systemLineStation(lineNameV,directionData);
  163 + }
  164 +
  165 + },
  166 +
  167 + /** 直接保存 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行)> */
  168 + systemLineStation : function(lineNameV,directionData) {
  169 + /** 从百度地图获取线路信息 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行);callback>*/
  170 + WorldsBMap.lineInfoPanl(lineNameV,directionData,function(BusLine){
  171 + // 如果线路信息不为空
  172 + if(BusLine) {
  173 + // 获取公交线几何对象, 仅当结果自动添加到地图上时有效
  174 + var Polygon = BusLine.getPolyline();
  175 + // 返回多边型的点数组(自1.2新增)
  176 + var polyGonArray = Polygon.getPath();
  177 + // 获取公交站点个数(自 1.2 新增)
  178 + var stationNumber = BusLine.getNumBusStations();
  179 + // 定义线路信息集合
  180 + var stationInfo = [];
  181 + // 遍历
  182 + for(var k = 0 ; k < stationNumber; k++) {
  183 + // 定义线路信息集合
  184 + var tempM = {};
  185 + // 添加站点名称
  186 + tempM.name = BusLine.getBusStation(k).name;
  187 + // 添加站点坐标
  188 + tempM.potion = BusLine.getBusStation(k).position;
  189 + tempM.wgs = {x:'',y:''};
  190 + // 添加
  191 + stationInfo.push(tempM);
  192 + }
  193 + // 获取站点之间的距离与时间
  194 + WorldsBMap.getDistanceAndDuration(stationInfo,function(json) {
  195 + // 设置第一个站的距离
  196 + json[0].distance = '';
  197 + // 设置第一个站的时间
  198 + json[0].duration = '';
  199 + // 定义站点信息JSON字符串
  200 + var stationJSON = JSON.stringify(json);
  201 + // 定义路段信息字符串
  202 + var sectionJSON = JSON.stringify(polyGonArray);
  203 + // 参数集合
  204 + var params = {};
  205 + // 站点信息JSON字符串
  206 + params.stationJSON = stationJSON;
  207 + var addLine = LineObj.getLineObj();
  208 + // 线路ID
  209 + params.lineId = addLine.id;
  210 + // 方向
  211 + params.directions = directionData;
  212 + // 原始坐标类型
  213 + params.dbType = 'b';
  214 + // 圆形半径
  215 + params.radius = '100';
  216 + // 图形类型(r:圆形;p:多边形)
  217 + params.shapesType = 'r';
  218 + // destroy:是否撤销
  219 + params.destroy = '0';
  220 +
  221 + // 路段信息JSON字符串
  222 + params.sectionJSON = sectionJSON;
  223 + // 限速
  224 + params.speedLimit = '60';
  225 + params.baseRes = 'No';
  226 + // 获取版本号后提交添加
  227 + $.get('/lineVersions/findByLineId',{'lineId':addLine.id},function(lineVersions){
  228 + $.each(lineVersions,function(){
  229 + if (this.status == 1) {
  230 + // versions:版本号
  231 + params.versions = this.versions;
  232 + // 保存
  233 + GetAjaxData.collectionSave(params,function(rd) {
  234 + if(rd.status='SUCCESS') {
  235 + // 关闭弹出层
  236 + layer.closeAll();
  237 + layer.msg('保存成功!');
  238 + }else {
  239 + // 保存失败
  240 + layer.msg('保存失败!');
  241 + }
  242 + // 刷新树
  243 + PublicFunctions.resjtreeDate(addLine.id,directionData);
  244 + /** 查询上行路段信息 @param:<Line.id:线路Id;0:上行> @return:data:路段数据 */
  245 + GetAjaxData.getSectionRouteInfo(addLine.id,directionData,function(data) {
  246 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
  247 + PublicFunctions.linePanlThree(addLine.id,data,directionData);
  248 + });
  249 + });
  250 + }
  251 + })
  252 + });
131 253 });
132   -
133   - // 线路名称是否为定班线路
134   - }else if(lineNameV.indexOf('定班')>0){
135   - // 截去定班
136   - var lineNameNew = lineNameV.replace('定班','');
137   - // 是否继续弹出层
138   - layer.confirm('系统无法生成该线路【'+lineNameV+'】的站点与路段!自动修改为如下线路名称【'+lineNameNew+'】生成', {
139   - btn : [ '确认提示并提交', '取消' ]
140   - }, function(index) {
141   - // 关闭弹出层
142   - layer.close(index);
143   - // 线路名称去掉区间
144   - lineNameV = lineNameNew;
145   - /** 保存 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行)> */
146   - PublicFunctions.systemLineStation(lineNameV,directionData);
147   - },function(){
  254 + // 关闭弹出层
  255 + layer.closeAll();
  256 + // 上行
  257 + if(directionData==0){
  258 + $('#stationDown').removeClass('active');
  259 + $('#stationDown').removeClass('in');
  260 + $('#stationDown').addClass('fade');
  261 + $('#stationUp').addClass('active in');
  262 + $('#downLine').parent().removeClass('active');
  263 + $('#upLine').parent().addClass('active');
  264 + // 下行
  265 + }else if(directionData==1){
  266 + $('#stationUp').removeClass('active');
  267 + $('#stationUp').removeClass('in');
  268 + $('#stationUp').addClass('fade');
  269 + $('#stationDown').addClass('active in');
  270 + $('#upLine').parent().removeClass('active');
  271 + $('#downLine').parent().addClass('active');
  272 + }
  273 + } else {
  274 + layer.msg('百度地图中没有此线路,无法系统规划!');
  275 + setTimeout(function() {
148 276 // 关闭弹出层
149 277 layer.closeAll();
150 278 // 上行
151 279 if(directionData==0){
152 280 // 显示上行规划
153 281 $('#upToolsMobal').show();
154   - // 下行
  282 + // 下行
155 283 }else if(directionData==1){
156 284 // 显示下行规划
157 285 $('#downToolsMobal').show();
158 286 }
159   - });
160   - }else {
161   - /** 直接保存 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行)> */
162   - PublicFunctions.systemLineStation(lineNameV,directionData);
  287 + }, 3000);
163 288 }
  289 + });
  290 + },
164 291  
165   - },
166   -
167   - /** 直接保存 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行)> */
168   - systemLineStation : function(lineNameV,directionData) {
169   - /** 从百度地图获取线路信息 @param:<lineNameV:线路名称;directionData:方向(0:上行;1:下行);callback>*/
170   - WorldsBMap.lineInfoPanl(lineNameV,directionData,function(BusLine){
171   - // 如果线路信息不为空
172   - if(BusLine) {
173   - // 获取公交线几何对象, 仅当结果自动添加到地图上时有效
174   - var Polygon = BusLine.getPolyline();
175   - // 返回多边型的点数组(自1.2新增)
176   - var polyGonArray = Polygon.getPath();
177   - // 获取公交站点个数(自 1.2 新增)
178   - var stationNumber = BusLine.getNumBusStations();
179   - // 定义线路信息集合
180   - var stationInfo = [];
181   - // 遍历
182   - for(var k = 0 ; k < stationNumber; k++) {
183   - // 定义线路信息集合
184   - var tempM = {};
185   - // 添加站点名称
186   - tempM.name = BusLine.getBusStation(k).name;
187   - // 添加站点坐标
188   - tempM.potion = BusLine.getBusStation(k).position;
189   - tempM.wgs = {x:'',y:''};
190   - // 添加
191   - stationInfo.push(tempM);
192   - }
193   - // 获取站点之间的距离与时间
194   - WorldsBMap.getDistanceAndDuration(stationInfo,function(json) {
195   - // 设置第一个站的距离
196   - json[0].distance = '';
197   - // 设置第一个站的时间
198   - json[0].duration = '';
199   - // 定义站点信息JSON字符串
200   - var stationJSON = JSON.stringify(json);
201   - // 定义路段信息字符串
202   - var sectionJSON = JSON.stringify(polyGonArray);
203   - // 参数集合
204   - var params = {};
205   - // 站点信息JSON字符串
206   - params.stationJSON = stationJSON;
207   - var addLine = LineObj.getLineObj();
208   - // 线路ID
209   - params.lineId = addLine.id;
210   - // 方向
211   - params.directions = directionData;
212   - // 原始坐标类型
213   - params.dbType = 'b';
214   - // 圆形半径
215   - params.radius = '100';
216   - // 图形类型(r:圆形;p:多边形)
217   - params.shapesType = 'r';
218   - // destroy:是否撤销
219   - params.destroy = '0';
220   -
221   - // 路段信息JSON字符串
222   - params.sectionJSON = sectionJSON;
223   - // 限速
224   - params.speedLimit = '60';
225   - params.baseRes = 'No';
226   - // 获取版本号后提交添加
227   - $.get('/lineVersions/findByLineId',{'lineId':addLine.id},function(lineVersions){
228   - $.each(lineVersions,function(){
229   - if (this.status == 1) {
230   - // versions:版本号
231   - params.versions = this.versions;
232   - // 保存
233   - GetAjaxData.collectionSave(params,function(rd) {
234   - if(rd.status='SUCCESS') {
235   - // 关闭弹出层
236   - layer.closeAll();
237   - layer.msg('保存成功!');
238   - }else {
239   - // 保存失败
240   - layer.msg('保存失败!');
241   - }
242   - // 刷新树
243   - PublicFunctions.resjtreeDate(addLine.id,directionData);
244   - /** 查询上行路段信息 @param:<Line.id:线路Id;0:上行> @return:data:路段数据 */
245   - GetAjaxData.getSectionRouteInfo(addLine.id,directionData,function(data) {
246   - /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
247   - PublicFunctions.linePanlThree(addLine.id,data,directionData);
248   - });
249   - });
250   - }
251   - })
252   - });
253   - });
254   - // 关闭弹出层
255   - layer.closeAll();
256   - // 上行
257   - if(directionData==0){
258   - $('#stationDown').removeClass('active');
259   - $('#stationDown').removeClass('in');
260   - $('#stationDown').addClass('fade');
261   - $('#stationUp').addClass('active in');
262   - $('#downLine').parent().removeClass('active');
263   - $('#upLine').parent().addClass('active');
264   - // 下行
265   - }else if(directionData==1){
266   - $('#stationUp').removeClass('active');
267   - $('#stationUp').removeClass('in');
268   - $('#stationUp').addClass('fade');
269   - $('#stationDown').addClass('active in');
270   - $('#upLine').parent().removeClass('active');
271   - $('#downLine').parent().addClass('active');
272   - }
273   - } else {
274   - layer.msg('百度地图中没有此线路,无法系统规划!');
275   - setTimeout(function() {
276   - // 关闭弹出层
277   - layer.closeAll();
278   - // 上行
279   - if(directionData==0){
280   - // 显示上行规划
281   - $('#upToolsMobal').show();
282   - // 下行
283   - }else if(directionData==1){
284   - // 显示下行规划
285   - $('#downToolsMobal').show();
286   - }
287   - }, 3000);
288   - }
289   - });
290   - },
291   -
292   - /** @param directionV_ :方向 */
293   - stationRevoke : function(directionV_) {
294   - // 获取树选中节点对象
295   - var obj = PublicFunctions.getCurrSelNode(directionV_);
296   - // 是否选中,选中节点是否为站点
297   - if(obj.length == 0 || obj[0].original.chaildredType !='station'){
298   - // 弹出提示层
299   - layer.msg('请先选择要删除的站点!');
300   - return;
301   - }
302   - // 弹出是否撤销提示框
303   - layer.confirm('你确定要撤销【'+obj[0].text+'】站点吗?', {btn : [ '确定撤销','返回' ],icon: 3, title:'提示' }, function(index){
304   - // 站点路由ID
305   - var stationRouteId = obj[0].original.stationRouteId;
306   - // 撤销参数集合
307   - var params = {stationRouteId:stationRouteId,destroy:'1'};
308   - // 方向
309   - var stationRouteDirections = obj[0].original.stationRouteDirections;
310   - // 撤销
311   - GetAjaxData.stationRouteIsDestroy(params,function(result) {
312   - // 关闭弹出框
313   - layer.close(index);
314   - if(result.status=='SUCCESS'){
315   - layer.msg('撤销'+(directionV_==0?"上行":"下行")+'站点【'+obj[0].text+'】成功!');
316   - }else{
317   - layer.msg('撤销'+(directionV_==0?"上行":"下行")+'站点【'+obj[0].text+'】失败!');
318   - }
319   - WorldsBMap.clearMarkAndOverlays();
320   - var Line = LineObj.getLineObj();
321   - // 刷行左边树
322   - PublicFunctions.resjtreeDate(Line.id,stationRouteDirections);
323   - /** 查询上行路段信息 @param:<Line.id:线路Id;0:上行> @return:data:路段数据 */
324   - GetAjaxData.getSectionRouteInfo(Line.id,stationRouteDirections,function(data) {
325   - /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
326   - PublicFunctions.linePanlThree(Line.id,data,stationRouteDirections);
327   - });
  292 + /** @param directionV_ :方向 */
  293 + stationRevoke : function(directionV_) {
  294 + // 获取树选中节点对象
  295 + var obj = PublicFunctions.getCurrSelNode(directionV_);
  296 + // 是否选中,选中节点是否为站点
  297 + if(obj.length == 0 || obj[0].original.chaildredType !='station'){
  298 + // 弹出提示层
  299 + layer.msg('请先选择要删除的站点!');
  300 + return;
  301 + }
  302 + // 弹出是否撤销提示框
  303 + layer.confirm('你确定要撤销【'+obj[0].text+'】站点吗?', {btn : [ '确定撤销','返回' ],icon: 3, title:'提示' }, function(index){
  304 + // 站点路由ID
  305 + var stationRouteId = obj[0].original.stationRouteId;
  306 + // 撤销参数集合
  307 + var params = {stationRouteId:stationRouteId,destroy:'1'};
  308 + // 方向
  309 + var stationRouteDirections = obj[0].original.stationRouteDirections;
  310 + // 撤销
  311 + GetAjaxData.stationRouteIsDestroy(params,function(result) {
  312 + // 关闭弹出框
  313 + layer.close(index);
  314 + if(result.status=='SUCCESS'){
  315 + layer.msg('撤销'+(directionV_==0?"上行":"下行")+'站点【'+obj[0].text+'】成功!');
  316 + }else{
  317 + layer.msg('撤销'+(directionV_==0?"上行":"下行")+'站点【'+obj[0].text+'】失败!');
  318 + }
  319 + WorldsBMap.clearMarkAndOverlays();
  320 + var Line = LineObj.getLineObj();
  321 + // 刷行左边树
  322 + PublicFunctions.resjtreeDate(Line.id,stationRouteDirections);
  323 + /** 查询上行路段信息 @param:<Line.id:线路Id;0:上行> @return:data:路段数据 */
  324 + GetAjaxData.getSectionRouteInfo(Line.id,stationRouteDirections,function(data) {
  325 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
  326 + PublicFunctions.linePanlThree(Line.id,data,stationRouteDirections);
328 327 });
329   - });
330   - },
  328 + });
  329 + });
  330 + },
331 331  
332   - /** @param direction_ :方向 */
333   - editLinePlan : function(direction_) {
334   - var sel = PublicFunctions.getCurrSelNode(direction_);
335   - if(sel.length==0 || sel[0].original.chaildredType !='section'){
336   - if(direction_=='0') {
337   - layer.msg('请先选中要编辑的上行路段!');
338   - }else if(direction_=='1') {
339   - layer.msg('请先选中要编辑的下行路段!');
340   - }
341   - return;
  332 + /** @param direction_ :方向 */
  333 + editLinePlan : function(direction_) {
  334 + var sel = PublicFunctions.getCurrSelNode(direction_);
  335 + if(sel.length==0 || sel[0].original.chaildredType !='section'){
  336 + if(direction_=='0') {
  337 + layer.msg('请先选中要编辑的上行路段!');
  338 + }else if(direction_=='1') {
  339 + layer.msg('请先选中要编辑的下行路段!');
  340 + }
  341 + return;
  342 + }
  343 + $('#downLine').addClass('btn disabled');
  344 + $('.btn-circle').addClass('disabled');
  345 + $('#upLine').addClass('btn disabled');
  346 + var editSectionV = sel[0].original;
  347 + EditSectionObj.setEitdSection(editSectionV);
  348 + // 弹出添加失败提示消息,2秒关闭(如果不配置,默认是3秒)
  349 + var yindex = layer.msg('编辑完线路走向后,请双击线路走向区域保存',{ offset: '126px',shift: 0,time: 10000});
  350 + WorldsBMap.editPolyUpline();
  351 + },
  352 +
  353 + setFormValue : function(editStationParmas) {
  354 + // 站点ID
  355 + $('#stationIdInput').val(editStationParmas.stationId);
  356 + // 站点路由ID
  357 + $('#stationRouteIdInput').val(editStationParmas.stationRouteId);
  358 + // 站点路由线路Id
  359 + $('#stationRouteLineInput').val(editStationParmas.stationRouteLine);
  360 + // 线路编码
  361 + $('#lineCodeInput').val(editStationParmas.stationRouteLIneCode);
  362 + // 百度坐标点图形集合
  363 + $('#bPolygonGridInput').val(editStationParmas.stationBPolygonGrid);
  364 + // 获取站点名称元素设值
  365 + $('#zdmcInput').val(editStationParmas.stationStationName);
  366 + // 获取站点路由名称元素设值
  367 + $('#stationNameInput').val(editStationParmas.stationStationName);
  368 + // 获取站点编码元素设值
  369 + $('#stationCodInput').val(editStationParmas.stationCode);
  370 + // 获取站点类型元素设值
  371 + // $('#stationMarkSelect').val(editStationParmas.stationRouteStationMark);
  372 + // 获取站点方向元素设值
  373 + $('#stationdirSelect').val(editStationParmas.stationRoutedirections);
  374 + // 获取站点道路编码元素设值
  375 + $('#roadCodingCodInput').val(editStationParmas.stationRoadCoding);
  376 + // 百度地图经纬度坐标中心点
  377 + $('#bJwpointsInput').val(editStationParmas.stationJwpoints);
  378 + if(editStationParmas.stationShapesType=='r') {
  379 + // 获取图形类型元素,并添加值
  380 + $('#shapesTypeSelect').val('圆形');
  381 + }else if(editStationParmas.stationShapesType=='d'){
  382 + $('#radiusGroup').hide();
  383 + $('#shapesTypeSelect').val('多边形');
  384 + }
  385 + // 获取半径元素,并添加值
  386 + $('#radiusInput').val(editStationParmas.stationRadius);
  387 + // 是否撤销
  388 + $('#destroySelect').val(editStationParmas.stationDestroy);
  389 + // 到站时间
  390 + $('#toTimeInput').val(editStationParmas.stationRouteToTime);
  391 + // 到站距离
  392 + $('#distancesInput').val(editStationParmas.stationRouteDistances);
  393 + // 线路版本号
  394 + $('#versionsInput').val(editStationParmas.stationRouteVersions);
  395 + // 描述/说明
  396 + $('#descriptionsTextarea').val(editStationParmas.sttationDescriptions);
  397 + },
  398 +
  399 + setSectionFormValue : function(Section) {
  400 + $('#isRoadeSpeedInput').val(Section.isRoadeSpeed);
  401 + // 路段ID
  402 + $('#sectionIdInput').val(Section.sectionId);
  403 + // 路段路由ID
  404 + $('#sectionRouteIdInput').val(Section.sectionrouteId);
  405 + // 线路ID
  406 + $('#sectionRouteLineInput').val(Section.sectionrouteLine);
  407 + // 线路编码
  408 + $('#lineCodeInput').val(Section.sectionrouteLineCode);
  409 + // 折线坐标集合
  410 + $('#bsectionVectorInput').val(Section.sectionBsectionVector);
  411 + // 路段名称
  412 + $('#sectionNameInput').val(Section.sectionName);
  413 + // 路段编码
  414 + $('#sectionCodeInput').val(Section.sectionCode);
  415 + // 路段序号
  416 + $('#sectionrouteCodeSelect').val(Section.sectionrouteCode);
  417 + // 路段方向
  418 + $('#directionsSection').val(Section.sectionrouteDirections);
  419 + // 道路编码
  420 + $('#roadCodingCodInput').val(Section.sectionRoadCoding);
  421 + // 道路限速
  422 + $('#speedLimitInput').val(Section.sectionSpeedLimet);
  423 + // 路段长度
  424 + $('#sectionDistanceInput').val(Section.sectionDistance);
  425 + // 时长
  426 + $('#sectionTimeInput').val(Section.sectionTime);
  427 + // 版本号
  428 + $('#versionsInput').val(Section.versions);
  429 + },
  430 +
  431 + //lineId,data,direction
  432 + treeSectionClick: function(lineId,data,direction){
  433 + /** 获取站点路由信息 @param:<Line.id:线路Id;0:上行> @return:<resultdata:站点路由数据> */
  434 + WorldsBMap.clearMarkAndOverlays();
  435 + // 编辑路段数据
  436 + for(var d= 0; d<data.length;d++){
  437 + // 地图折线坐标点集合
  438 + var polylineArray = [];
  439 + // 获取路段折线坐标字符串
  440 + var sectionBsectionVectorStr = data[d].sectionBsectionVector;
  441 + if(sectionBsectionVectorStr==null) {
  442 + continue;
342 443 }
343   - $('#downLine').addClass('btn disabled');
344   - $('.btn-circle').addClass('disabled');
345   - $('#upLine').addClass('btn disabled');
346   - var editSectionV = sel[0].original;
347   - EditSectionObj.setEitdSection(editSectionV);
348   - // 弹出添加失败提示消息,2秒关闭(如果不配置,默认是3秒)
349   - var yindex = layer.msg('编辑完线路走向后,请双击线路走向区域保存',{ offset: '126px',shift: 0,time: 10000});
350   - WorldsBMap.editPolyUpline();
351   - },
352   -
353   - setFormValue : function(editStationParmas) {
354   - // 站点ID
355   - $('#stationIdInput').val(editStationParmas.stationId);
356   - // 站点路由ID
357   - $('#stationRouteIdInput').val(editStationParmas.stationRouteId);
358   - // 站点路由线路Id
359   - $('#stationRouteLineInput').val(editStationParmas.stationRouteLine);
360   - // 线路编码
361   - $('#lineCodeInput').val(editStationParmas.stationRouteLineCode);
362   - // 百度坐标点图形集合
363   - $('#bPolygonGridInput').val(editStationParmas.stationBPolygonGrid);
364   - // 获取站点名称元素设值
365   - $('#zdmcInput').val(editStationParmas.stationStationName);
366   - // 获取站点路由名称元素设值
367   - $('#stationNameInput').val(editStationParmas.stationRouteStationName);
368   - // 获取站点编码元素设值
369   - $('#stationCodInput').val(editStationParmas.stationStationCod);
370   - // 获取站点类型元素设值
371   - // $('#stationMarkSelect').val(editStationParmas.stationRouteStationMark);
372   - // 获取站点方向元素设值
373   - $('#stationdirSelect').val(editStationParmas.stationRouteDirections);
374   - // 获取站点道路编码元素设值
375   - $('#roadCodingCodInput').val(editStationParmas.stationRoadCoding);
376   - // 百度地图经纬度坐标中心点
377   - $('#bJwpointsInput').val(editStationParmas.stationBJwpoints);
378   - if(editStationParmas.stationShapesType=='r') {
379   - // 获取图形类型元素,并添加值
380   - $('#shapesTypeSelect').val('圆形');
381   - }else if(editStationParmas.stationShapesType=='d'){
382   - $('#radiusGroup').hide();
383   - $('#shapesTypeSelect').val('多边形');
  444 + // 切割段折线坐标字符串
  445 + var tempStr = sectionBsectionVectorStr.substring(11,sectionBsectionVectorStr.length-1);
  446 + // 分割折线坐标字符串
  447 + var lineArray = tempStr.split(',');
  448 + for(var i = 0;i<lineArray.length;i++) {
  449 + polylineArray.push(new BMap.Point(lineArray[i].split(' ')[0],lineArray[i].split(' ')[1]));
384 450 }
385   - // 获取半径元素,并添加值
386   - $('#radiusInput').val(editStationParmas.stationRadius);
387   - // 是否撤销
388   - $('#destroySelect').val(editStationParmas.stationDestroy);
389   - // 到站时间
390   - $('#toTimeInput').val(editStationParmas.stationRouteToTime);
391   - // 到站距离
392   - $('#distancesInput').val(editStationParmas.stationRouteDistances);
393   - // 线路版本号
394   - $('#versionsInput').val(editStationParmas.stationRouteVersions);
395   - // 描述/说明
396   - $('#descriptionsTextarea').val(editStationParmas.stationRouteDescriptions);
397   - },
398   -
399   - setSectionFormValue : function(Section) {
400   - $('#isRoadeSpeedInput').val(Section.isRoadeSpeed);
401   - // 路段ID
402   - $('#sectionIdInput').val(Section.sectionId);
403   - // 路段路由ID
404   - $('#sectionRouteIdInput').val(Section.sectionrouteId);
405   - // 线路ID
406   - $('#sectionRouteLineInput').val(Section.sectionrouteLine);
407   - // 线路编码
408   - $('#lineCodeInput').val(Section.sectionrouteLineCode);
409   - // 折线坐标集合
410   - $('#bsectionVectorInput').val(Section.sectionBsectionVector);
411   - // 路段名称
412   - $('#sectionNameInput').val(Section.sectionName);
413   - // 路段编码
414   - $('#sectionCodeInput').val(Section.sectionCode);
415   - // 路段序号
416   - $('#sectionrouteCodeSelect').val(Section.sectionrouteCode);
417   - // 路段方向
418   - $('#directionsSection').val(Section.sectionrouteDirections);
419   - // 道路编码
420   - $('#roadCodingCodInput').val(Section.sectionRoadCoding);
421   - // 道路限速
422   - $('#speedLimitInput').val(Section.sectionSpeedLimet);
423   - // 路段长度
424   - $('#sectionDistanceInput').val(Section.sectionDistance);
425   - // 时长
426   - $('#sectionTimeInput').val(Section.sectionTime);
427   - // 版本号
428   - $('#versionsInput').val(Section.versions);
429   - // 是否撤销
430   - $('#destroySelect').val(Section.destroy);
431   - // 描述/说明
432   - $('#descriptionsTextarea').val(Section.descriptions);
433   - },
434   -
435   - //lineId,data,direction
436   - treeSectionClick: function(lineId,data,direction){
437   - /** 获取站点路由信息 @param:<Line.id:线路Id;0:上行> @return:<resultdata:站点路由数据> */
  451 + var index = parseInt(polylineArray.length/2);
  452 + var center = polylineArray[index];
  453 + /** 在地图上画出线路走向 @param:<polylineArray:地图折线坐标点集合;resultdata:站点路由数据> */
  454 + WorldsBMap.drawingUpline(polylineArray,center);
  455 + /** 在地图上画点 @param:<point_center:中心坐标点> */
  456 + WorldsBMap.drawingUpStationPoint(data[d], d+1);
  457 + }
  458 + },
  459 +
  460 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
  461 + linePanlThree : function(lineId,data,direction) {
  462 + /** 获取站点路由信息 @param:<Line.id:线路Id;0:上行> @return:<resultdata:站点路由数据> */
  463 + GetAjaxData.getStationRoutePoint(lineId,direction,function(resultdata) {
438 464 WorldsBMap.clearMarkAndOverlays();
439   - // 编辑路段数据
440   - for(var d= 0; d<data.length;d++){
441   - // 地图折线坐标点集合
442   - var polylineArray = [];
443   - // 获取路段折线坐标字符串
444   - var sectionBsectionVectorStr = data[d].sectionBsectionVector;
445   - if(sectionBsectionVectorStr==null) {
446   - continue;
447   - }
448   - // 切割段折线坐标字符串
449   - var tempStr = sectionBsectionVectorStr.substring(11,sectionBsectionVectorStr.length-1);
450   - // 分割折线坐标字符串
451   - var lineArray = tempStr.split(',');
452   - for(var i = 0;i<lineArray.length;i++) {
453   - polylineArray.push(new BMap.Point(lineArray[i].split(' ')[0],lineArray[i].split(' ')[1]));
  465 + var polyline_center;
  466 + // 如果站点路由数据不为空
  467 + if(resultdata.length>0) {
  468 + var ceter_index = Math.round(resultdata.length / 2);
  469 + var ceterPointsStr = resultdata[ceter_index].stationJwpoints;
  470 + var ceterPointsArray = ceterPointsStr.split(' ');
  471 + polyline_center = new BMap.Point(ceterPointsArray[0],ceterPointsArray[1]);
  472 + // 遍历站点路由数据
  473 + for(var s = 0 ; s<resultdata.length;s++) {
  474 + WorldsBMap.drawingUpStationPoint(resultdata[s], s+1);
454 475 }
455   - var index = parseInt(polylineArray.length/2);
456   - var center = polylineArray[index];
457   - /** 在地图上画出线路走向 @param:<polylineArray:地图折线坐标点集合;resultdata:站点路由数据> */
458   - WorldsBMap.drawingUpline(polylineArray,center);
459   - /** 在地图上画点 @param:<point_center:中心坐标点> */
460   - WorldsBMap.drawingUpStationPoint(center,data[d].name,d+1);
  476 +
461 477 }
462   - },
463   -
464   - /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
465   - linePanlThree : function(lineId,data,direction) {
466   - /** 获取站点路由信息 @param:<Line.id:线路Id;0:上行> @return:<resultdata:站点路由数据> */
467   - GetAjaxData.getStationRoutePoint(lineId,direction,function(resultdata) {
468   - WorldsBMap.clearMarkAndOverlays();
469   - var polyline_center;
470   - // 如果站点路由数据不为空
471   - if(resultdata.length>0) {
472   - var ceter_index = Math.round(resultdata.length / 2);
473   - var ceterPointsStr = resultdata[ceter_index].bJwpoints;
474   - var ceterPointsArray = ceterPointsStr.split(' ');
475   - polyline_center = new BMap.Point(ceterPointsArray[0],ceterPointsArray[1]);
476   - // 遍历站点路由数据
477   - for(var s = 0 ; s<resultdata.length;s++) {
478   - // 中心点坐标字符串
479   - var bJwpointsStr = resultdata[s].bJwpoints;
480   - var stationName = resultdata[s].stationName;
481   - // 起个中心点坐标字符串
482   - var bJwpointsArray = bJwpointsStr.split(' ');
483   - // 设置中心点
484   - var point_center = new BMap.Point(bJwpointsArray[0],bJwpointsArray[1]);
485   - /** 在地图上画点 @param:<point_center:中心坐标点> */
486   - WorldsBMap.drawingUpStationPoint(point_center,stationName,s+1);
487   - }
488   -
489   - }
490   - // 路段数据长度
491   - var dataLen = data.length;
492   - // 如果大于零
493   - if(dataLen>0) {
494   - // 编辑路段数据
495   - for(var d= 0; d<dataLen;d++){
496   - // 地图折线坐标点集合
497   - var polylineArray = [];
498   - // 获取路段折线坐标字符串
499   - var sectionBsectionVectorStr = data[d].sectionBsectionVector;
500   - if(sectionBsectionVectorStr==null)
501   - continue;
502   - // 切割段折线坐标字符串
503   - var tempStr = sectionBsectionVectorStr.substring(11,sectionBsectionVectorStr.length-1);
504   - // 分割折线坐标字符串
505   - var lineArray = tempStr.split(',');
506   - for(var i = 0;i<lineArray.length;i++) {
507   - polylineArray.push(new BMap.Point(lineArray[i].split(' ')[0],lineArray[i].split(' ')[1]));
508   - }
509   - /** 在地图上画出线路走向 @param:<polylineArray:地图折线坐标点集合;resultdata:站点路由数据> */
510   - /*WorldsBMap.drawingUpline(polylineArray,polyline_center,data[d]);*/
511   - WorldsBMap.drawingUpline01(polylineArray,polyline_center,data[d]);
512   - }
  478 + // 路段数据长度
  479 + var dataLen = data.length;
  480 + // 如果大于零
  481 + if(dataLen>0) {
  482 + WorldsBMap.drawingUpline01(polyline_center,data);
  483 + }
  484 + });
  485 + },
  486 + /** 加载树 @param:<lineId:线路ID;diraction:方向(0:上行;1:下行)> */
  487 + TreeUpOrDown : function(lineId,diraction) {
  488 + /** 获取树结果数据 @param:<lineId:线路ID;diraction:方向;callback:回调函数> */
  489 + GetAjaxData.getStation(lineId,diraction,function(treeDateJson) {
  490 + // 获取返回数据长度
  491 + var len = treeDateJson[0].children[0].children.length;
  492 + // 上行
  493 + if(diraction == 0) {
  494 + /** 初始化上行树 @param:<treeDateJson:树数据结构> */
  495 + StationTreeData.upInit(treeDateJson);
  496 + if(len>0) {
  497 + $('#upToolsMobal').hide();
  498 + $('#uptreeMobal').show();
  499 + }else {
  500 + $('#upToolsMobal').show();
  501 + $('#uptreeMobal').hide();
513 502 }
514   - });
515   - },
516   - /** 加载树 @param:<lineId:线路ID;diraction:方向(0:上行;1:下行)> */
517   - TreeUpOrDown : function(lineId,diraction) {
518   - /** 获取树结果数据 @param:<lineId:线路ID;diraction:方向;callback:回调函数> */
519   - GetAjaxData.getStation(lineId,diraction,function(treeDateJson) {
520   - // 获取返回数据长度
521   - var len = treeDateJson[0].children[0].children.length;
522   - // 上行
523   - if(diraction == 0) {
524   - /** 初始化上行树 @param:<treeDateJson:树数据结构> */
525   - StationTreeData.upInit(treeDateJson);
526   - if(len>0) {
527   - $('#upToolsMobal').hide();
528   - $('#uptreeMobal').show();
529   - }else {
530   - $('#upToolsMobal').show();
531   - $('#uptreeMobal').hide();
532   - }
533   - // 下行
534   - }else if(diraction ==1) {
535   - /** 出事画下行树 @param:<treeDateJson:树数据结构> */
536   - StationTreeData.downInit(treeDateJson);
537   - if(len>0) {
538   - $('#downToolsMobal').hide();
539   - $('#DowntreeMobal').show();
540   - }else {
541   - $('#downToolsMobal').show();
542   - $('#DowntreeMobal').hide();
543   - }
  503 + // 下行
  504 + }else if(diraction ==1) {
  505 + /** 出事画下行树 @param:<treeDateJson:树数据结构> */
  506 + StationTreeData.downInit(treeDateJson);
  507 + if(len>0) {
  508 + $('#downToolsMobal').hide();
  509 + $('#DowntreeMobal').show();
  510 + }else {
  511 + $('#downToolsMobal').show();
  512 + $('#DowntreeMobal').hide();
544 513 }
545   - });
546   - },
547   - isHaveStationName : function(data) {
548   - if(data.length>0) {
549   - layer.confirm('系统已存在【'+ data[0].stationName +'】该站点位置名称,请选择【系统引用】或者更改站点名称进行新增!', {btn : [ '返回' ],icon: 3, title:'提示' }, function(index){
550   - layer.close(index);
551   - });
552   - return false;
553   - }else {
554   - return true;
555 514 }
556   - },
557   - editAChangeCssRemoveDisabled : function() {
558   - $('#downLine').removeClass('btn disabled');
559   - $('.btn-circle').removeClass('disabled');
560   - $('#upLine').removeClass('btn disabled');
561   - },
562   - // 方向代码转名称.
563   - dirdmToName : function(value){
564   - var srStr = '';
565   - if(value=='0')
566   - srStr = '上行';
567   - else if(value=='1')
568   - srStr = '下行';
569   - return srStr;
570   - },
  515 + });
  516 + },
  517 + isHaveStationName : function(data) {
  518 + if(data.length>0) {
  519 + layer.confirm('系统已存在【'+ data[0].stationName +'】该站点位置名称,请选择【系统引用】或者更改站点名称进行新增!', {btn : [ '返回' ],icon: 3, title:'提示' }, function(index){
  520 + layer.close(index);
  521 + });
  522 + return false;
  523 + }else {
  524 + return true;
  525 + }
  526 + },
  527 + // 地图处于编辑状态
  528 + editMapStatus : function () {
  529 + WorldsBMap.setMap_status(1);
  530 + $('.protlet-box-layer').show();
  531 + },
  532 + // 地图处于编辑状态
  533 + editMapStatusRemove : function () {
  534 + WorldsBMap.setMap_status(0);
  535 + $('.protlet-box-layer').hide();
  536 + },
  537 + // 选项鎖死解除
  538 + editAChangeCssRemoveDisabled : function() {
  539 + $('#downLine').removeClass('btn disabled');
  540 + $('.btn-circle').removeClass('disabled');
  541 + $('#upLine').removeClass('btn disabled');
  542 + },
  543 + // 方向代码转名称.
  544 + dirdmToName : function(value){
  545 + var srStr = '';
  546 + if(value=='0')
  547 + srStr = '上行';
  548 + else if(value=='1')
  549 + srStr = '下行';
  550 + return srStr;
  551 + },
571 552 }
572 553 return PubFun ;
573 554 }();
574 555 \ No newline at end of file
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-list-map.js
1 1 /**
2 2 * 百度地图
3   - *
  3 + *
4 4 * - - - - - -》init:地图初始化
5   - *
  5 + *
6 6 * - - - - - -》lineInfoPanl:从百度地图抓去站点与路段数据
7   - *
  7 + *
8 8 * - - - - - -》getDistanceAndDuration:获取距离与时间
9   - *
  9 + *
10 10 * - - - - - -》pointsPolygon:地图画多边行
11   - *
  11 + *
12 12 * - - - - - -》pointsCircle:画圆
13   - *
  13 + *
14 14 * - - - - - -》localSearchFromAdreesToPoint:根据地理名称获取百度经纬度坐标
15   - *
  15 + *
16 16 * - - - - - -》drawingUpline:在地图上画出上行线路走向
17   - *
  17 + *
18 18 * - - - - - -》stationsNameToPoints:站点名称获取百度坐标(手动规划)
19   - *
  19 + *
20 20 * - - - - - -》getDistanceAndTotime:根据坐标点获取两点之间的时间与距离(手动规划)
21   - *
  21 + *
22 22 * - - - - - -》getSectionListPlonly:根据坐标点获取两点之间的折线路段(手动规划)
23 23 */
24 24  
25 25 window.WorldsBMap = function () {
26   -
27   - /** WorldsBMap 全局变量定义 mapBValue:地图对象;polygon:多边形;polyUpline:走向折线;circle:圆 */
28   - var mapBValue = '';polygon='',polyUpline='',circle='',iseditStatus = false;
29   -
30   - var Bmap = {
31   -
32   - init : function() {
33   -
34   - // 设置中心点,
35   - var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
36   -
37   - // 百度API Key
38   - var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
39   -
40   - // 初始化百度地图
41   - mapBValue = new BMap.Map("bmap_basic");
42   -
43   - //中心点和缩放级别
44   - mapBValue.centerAndZoom(new BMap.Point(CENTER_POINT.lng,CENTER_POINT.lat), 15);
45   -
46   - //启用地图拖拽事件,默认启用(可不写)
47   - mapBValue.enableDragging();
48   -
49   - //启用地图滚轮放大缩小
50   - mapBValue.enableScrollWheelZoom();
51   -
52   - //禁用鼠标双击放大
53   - mapBValue.disableDoubleClickZoom();
54   -
55   - //启用键盘上下左右键移动地图
56   - mapBValue.enableKeyboard();
57   -
58   - return mapBValue;
59   - },
60   -
61   - /** 获取地图对象 @return 地图对象map */
62   - getmapBValue : function() {
63   -
64   - return mapBValue;
65   -
66   - },
67   -
68   - getPolygon : function(){
69   -
70   - return polygon;
71   - },
72   -
73   - getPolyUpline : function() {
74   -
75   - return polyUpline;
76   - },
77   -
78   - getCircle : function() {
79   -
80   - return circle;
81   - },
82   -
83   - getIsEditStatus : function() {
84   - return iseditStatus;
85   - },
86   -
87   - setIsEditStatus : function(v) {
88   - iseditStatus = v ;
89   - },
90   -
91   - initDrawingManager: function(map,styleOptions) {
92   -
93   - },
94   -
95   - getDrawingManagerObj : function() {
96   -
97   - return drawingManagerInitV;
98   - },
99   -
100   - // 从百度地图抓去站点与路段数据
101   - lineInfoPanl : function(lineNameValue,i,cb) {
102   -
103   - /** 根据线路名称与方向从百度地图获取站点与路段 @param lineNameValue:线路名称;i:方向<0:上行;1:下行> */
104   - WorldsBMap.getBmapStationNames(lineNameValue,i,function(BusLine){
105   -
106   - return cb && cb(BusLine);
107   -
108   - });
109   -
110   - },
111   -
112   - /** 获取距离与时间 @param <points:坐标点集合> */
113   - getDistanceAndDuration : function(points,callback){
114   -
115   - // 获取长度
116   - var len = points.length;
117   -
118   - (function(){
119   -
120   - if (!arguments.callee.count) {
121   -
122   - arguments.callee.count = 0;
123   -
124   - }
125   -
126   - arguments.callee.count++;
127   -
128   - var index = parseInt(arguments.callee.count) - 1;
129   -
130   - if (index >= len-1) {
131   -
132   - callback && callback(points);
133   -
134   - return;
135   - }
136   -
137   - // 当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。(当前正在执行的函数。)
138   - var f = arguments.callee;
139   -
140   - // 起点坐标 <坐标格式:40.056878,116.30815>
141   - var origin = points[index].potion.lat + ',' + points[index].potion.lng;
142   -
143   - // 终点坐标 <坐标格式:40.056878,116.30815>
144   - var destination = points[index+1].potion.lat + ',' + points[index+1].potion.lng;
145   -
146   - var region = '上海';
147   -
148   - var origin_region = '上海';
149   -
150   - var destination_region = '上海';
151   -
152   - var output = 'json';
153   -
154   - var ak_My = 'wjlITmXeCek5MxyU3ZUBkTeU8B0o0npk';
155   -
156   - /**
157   - * origin:起点名称或经纬度;
158   - *
159   - * destination:终点名称或经纬度;
160   - *
161   - * origin_region:起始点所在城市,驾车导航时必填。
162   - *
163   - * destination_region:终点所在城市,驾车导航时必填。
164   - *
165   - * output :表示输出类型,可设置为xml或json,默认为xml。
166   - *
167   - **/
168   - var paramsB = {origin:origin,destination:destination,region:region,origin_region:origin_region,destination_region:destination_region,output:output,ak:ak_My};
169   -
170   - /** @description :未认证开发者默认配额为:2000次/天。 */
171   - $.ajax({
172   -
173   - // 百度地图根据坐标获取两点之间的时间与距离
174   - url: 'http://api.map.baidu.com/direction/v1?mode=transit',
175   -
176   - data: paramsB,
177   -
178   - dataType: 'jsonp',
179   -
180   - success: function(r){
181   -
182   - if(r) {
183   -
184   - if(r.message=='ok') {
185   -
186   - if(r.result.taxi==null) {
187   -
188   - // 获取距离(单位:米)
189   - points[index+1].distance = 0;
190   -
191   - // 获取时间(单位:秒)
192   - points[index+1].duration = 0;
193   -
194   - }else {
195   -
196   - // 获取距离(单位:米)
197   - points[index+1].distance = r.result.taxi.distance;
198   -
199   - // 获取时间(单位:秒)
200   - points[index+1].duration = r.result.taxi.duration;
201   -
202   - }
203   -
204   -
205   - }
206   -
207   - }
208   -
209   - f();
210   - }
211   - });
212   -
213   - })();
214   -
215   - },
216   -
217   - // 地图画多边形
218   - pointsPolygon : function(objStation) {
219   -
220   - // 将视图切换到指定的缩放等级,中心点坐标不变。注意:当有信息窗口在地图上打开时,地图缩放将保证信息窗口所在的坐标位置不动。(自1.2新增)
221   - mapBValue.setZoom(15);
222   -
223   - // 如果不为空
224   - if(objStation) {
225   - // 获取中心点坐标字符串
226   - var testpointStr = objStation.stationBJwpoints;
227   - // 按空格切割中心点坐标字符串
228   - var BJwpointsPolygon = testpointStr.split(' ');
229   - // 中心点坐标
230   - var pointPolygon = new BMap.Point(BJwpointsPolygon[0], BJwpointsPolygon[1]);
231   - // 获取多边形坐标字符串
232   - var stationBPolygonGrid = objStation.stationBPolygonGrid;
233   - // 截取多边形坐标字符串
234   - var stationBPolygonGridStr = stationBPolygonGrid.substring(9,stationBPolygonGrid.length-2);
235   - // 按逗号切割
236   - var pointPolygonArray = stationBPolygonGridStr.split(',');
237   - // 多边形坐标集合
238   - var polygonP = [];
239   - for(var v = 0;v<pointPolygonArray.length;v++) {
240   - polygonP.push(new BMap.Point(pointPolygonArray[v].split(" ")[0],pointPolygonArray[v].split(" ")[1]));
241   - }
242   -
243   - // 画多边形
244   - polygon = new BMap.Polygon(polygonP, {
245   - // 线条显色
246   - strokeColor : "blue",
247   - // 边线的宽度,以像素为单位。
248   - strokeWeight : 2,
249   - // 边线透明度,取值范围0 - 1。
250   - strokeOpacity : 0.5
251   - });
252   -
253   - // 增加地图覆盖物多边形
254   - mapBValue.addOverlay(polygon);
255   -
256   - // 信息窗口属性
257   - var opts_polygon = {
258   - // 信息窗口宽度
259   - width : 200,
260   - // 信息窗口高度
261   - height : 300,
262   - // 信息窗位置偏移值。
263   - // offset: new BMap.Size(500,20),
264   - //标题
265   - // title : '<h4 style="color:#FFFFFF">'+objStation.stationStationName+'站详情</h4>',
266   - //设置不允许信窗发送短息
267   - enableMessage : false,
268   - //是否开启点击地图关闭信息窗口
269   - enableCloseOnClick : false
270   - };
271   -
272   - var markTypeStr = '';
273   - if(objStation.stationRouteStationMark=='B') {
274   - markTypeStr='起点站';
275   - }else if(objStation.stationRouteStationMark=='Z') {
276   - markTypeStr ='中途站';
277   - }else if(objStation.stationRouteStationMark=='E') {
278   - markTypeStr='终点站';
279   - }
280   - var point = objStation.stationBJwpoints.split(" ")
281   - var htm = '<span style="color: #ff8355;font-size: 20px;">' + objStation.stationStationName + '</span>' +
282   - '<span class="help-block" >站点编码:' + objStation.stationStationCod + '</span>' +
283   - '<span class="help-block" >站点序号:' + objStation.stationRouteStationRouteCode + '</span>' +
284   - '<span class="help-block" >站点类型:' + markTypeStr + '</span>' +
285   - '<span class="help-block" >经度:&nbsp&nbsp' + point[0] + '</span>' +
286   - '<span class="help-block" >纬度:&nbsp&nbsp' + point[1] + '</span>' +
287   - '<span class="help-block" >到站时间:' + objStation.stationRouteToTime + '&nbsp;分钟</span>' +
288   - '<span class="help-block" >到站距离:' + objStation.stationRouteDistances + '&nbsp;公里</span>' +
289   - '<span class="help-block" >缓冲区形状:' + (objStation.stationShapesType == "r"?"圆形":"多边形") + '</span>' +
290   - '<span class="help-block" >版本号:&nbsp&nbsp' + objStation.stationRouteVersions + '</span>' +
291   - '<div style="">' +
292   - '<button style="float:left; background: #ff8355; color: #fff; padding-bottom:5px; font-size: 9px;" class="btn " ' +
293   - 'id="editStation" onclick="WorldsBMap.editStation('+objStation.stationRouteDirections+')">修改站点</button>' +
294   - '<button style="float:right; background: #ff8355; color: #fff; padding-bottom:5px; font-size: 9px;" class="btn " ' +
295   - 'id="addBetweenStationRoad" onclick="WorldsBMap.addBetweenStationRoad('+objStation.stationRouteId+')">添加站点间路段</button>' +
296   - '</div>';
297   -
298   - // 创建信息窗口
299   - var infoWindow_target = new BMap.InfoWindow(htm, opts_polygon);
300   - // 自定义标注物图片
301   - var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/cz.png',new BMap.Size(20, 20));
302   - // 创建点
303   - marker = new BMap.Marker(pointPolygon,{icon : icon_target});
304   - // 把标注添物加到地图上
305   - mapBValue.addOverlay(marker);
306   - // 是否在平移过程中禁止动画。(自1.2新增)
307   - var PanOptions_ ={noAnimation :true};
308   - // 将地图的中心点更改为给定的点。
309   - mapBValue.panTo(pointPolygon,PanOptions_);
310   - // 将地图在水平位置上移动x像素,垂直位置上移动y像素。
311   - mapBValue.panBy(10,-150,PanOptions_);
312   - //开启信息窗口
313   - mapBValue.openInfoWindow(infoWindow_target,pointPolygon);
314   - }
315   -
316   - },
317   -
318   - editPolyUpline : function() {
319   - // 禁止覆盖物在map.clearOverlays方法中被清除。(自 1.1 新增)
320   - polyUpline.disableMassClear();
321   - WorldsBMap.clearMarkAndOverlays();
322   - // 允许覆盖物在map.clearOverlays方法中被清除。(自 1.1 新增)
323   - polyUpline.enableMassClear();
324   - // 开启线路编辑
325   - polyUpline.enableEditing();
326   - // 添加双击折线保存事件
327   - polyUpline.addEventListener('dblclick',function(e) {
328   - // 关闭
329   - layer.closeAll();
330   - polyUpline.disableEditing();
331   - // 获取折线坐标集合
332   - var editPloyLineArray = polyUpline.getPath();
333   - EditSectionObj.setEitdBsectionVector(JSON.stringify(editPloyLineArray));
334   - polyUpline= '';
335   - // 加载修改路段弹出层mobal页面
336   - $.get('editsection.html', function(m){
337   - $(pjaxContainer).append(m);
338   - $('#edit_section_mobal').trigger('editSectionMobal_show', [WorldsBMap,GetAjaxData,EditSectionObj,PublicFunctions]);
339   - });
340   - });
341   - },
342   -
343   - // 画圆
344   - pointsCircle : function(objStation) {
345   -
346   - // 将视图切换到指定的缩放等级,中心点坐标不变。注意:当有信息窗口在地图上打开时,地图缩放将保证信息窗口所在的坐标位置不动。(自1.2新增)
347   - mapBValue.setZoom(16);
348   -
349   - if(objStation) {
350   -
351   - // 清除地图覆盖物
352   - mapBValue.clearOverlays();
353   -
354   - // 获取中心坐标点字符串分割
355   - var BJwpoints = objStation.stationBJwpoints.split(' ');
356   -
357   - // 中心坐标点
358   - var point = new BMap.Point(BJwpoints[0], BJwpoints[1]);
359   -
360   - //创建圆
361   - circle = new BMap.Circle(point,objStation.stationRadius,{strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5});
362   -
363   - // 允许覆盖物在map.clearOverlays方法中被清除
364   - circle.enableMassClear();
365   -
366   - // 百度地图添加覆盖物圆
367   - mapBValue.addOverlay(circle);
368   -
369   - // 信息窗口参数属性
370   - var opts = {
371   - // 信息窗口宽度
372   - width : 200,
373   - // 信息窗口高度
374   - height : 330,
375   - // 信息窗位置偏移值。
376   - // offset: new BMap.Size(500,120),
377   - //标题
378   - // title : '<h4 style="color:#ff8355">'+objStation.stationStationName+'站详情</h4>',
379   - //设置不允许信窗发送短息
380   - enableMessage : false,
381   - //是否开启点击地图关闭信息窗口
382   - enableCloseOnClick : false,
383   - // 是否开启信息窗口打开时地图自动移动(默认开启)。(自 1.1 新增)
384   - enableAutoPan:false
385   - };
386   -
387   - var markTypeStr = '';
388   - if(objStation.stationRouteStationMark=='B') {
389   - markTypeStr='起点站';
390   - }else if(objStation.stationRouteStationMark=='Z') {
391   - markTypeStr ='中途站';
392   - }else if(objStation.stationRouteStationMark=='E') {
393   - markTypeStr='终点站';
394   - }
395   - var point1 = objStation.stationBJwpoints.split(" ");
396   - var htm = '<span style="color: #ff8355;font-size: 20px;">' + objStation.stationStationName + '</span>' +
397   - '<span class="help-block" >站点编码:' + objStation.stationStationCod + '</span>' +
398   - '<span class="help-block" >站点序号:' + objStation.stationRouteStationRouteCode + '</span>' +
399   - '<span class="help-block" >站点类型:' + markTypeStr + '</span>' +
400   - '<span class="help-block" >经度:&nbsp&nbsp' + point1[0] + '</span>' +
401   - '<span class="help-block" >纬度:&nbsp&nbsp' + point1[1] + '</span>' +
402   - '<span class="help-block" >到站时间:' + objStation.stationRouteToTime + '&nbsp;分钟</span>' +
403   - '<span class="help-block" >到站距离:' + objStation.stationRouteDistances + '&nbsp;公里</span>' +
404   - '<span class="help-block" >缓冲区形状:' + (objStation.stationShapesType == "r"?"圆形":"多边形") + '</span>' +
405   - '<span class="help-block" >半径&nbsp&nbsp:' + objStation.stationRadius + '</span>' +
406   - '<span class="help-block" >版本号&nbsp&nbsp:' + objStation.stationRouteVersions + '</span>' +
407   - '<div style="">' +
408   - '<button style="float:left; background: #ff8355; color: #fff; padding-bottom:5px; font-size: 9px;" class="btn " ' +
409   - 'id="editStation" onclick="WorldsBMap.editStation('+objStation.stationRouteDirections+')">修改站点</button>' +
410   - '<button style="float:right; background: #ff8355; color: #fff; padding-bottom:5px; font-size: 9px;" class="btn " ' +
411   - 'id="addBetweenStationRoad" onclick="WorldsBMap.addBetweenStationRoad('+objStation.stationRouteId+')">添加站点间路段</button>' +
412   - '</div>';
413   -
414   - // 创建信息窗口
415   - var infoWindow_target = new BMap.InfoWindow(htm, opts);
416   - // 自定义标注物图片
417   - var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/cz.png',new BMap.Size(20, 20));
418   -
419   - // 创建点
420   - marker = new BMap.Marker(point,{icon : icon_target});
421   -
422   - // 把标注添物加到地图上
423   - mapBValue.addOverlay(marker);
424   -
425   - setTimeout(function(){
426   - //开启信息窗口
427   - marker.openInfoWindow(infoWindow_target,point);
428   -
429   - },100);
430   -
431   - // 是否在平移过程中禁止动画。(自1.2新增)
432   - var PanOptions_ ={noAnimation :true};
433   -
434   - // 将地图的中心点更改为给定的点。
435   - mapBValue.panTo(point,PanOptions_);
436   -
437   - mapBValue.panBy(10,-200,PanOptions_);
438   -
439   - // 添加标志物监听事件
440   - marker.addEventListener("click",function() {
441   -
442   - //开启信息窗口
443   - marker.openInfoWindow(infoWindow_target,point);
444   -
445   - });
446   -
447   - }
448   -
449   - },
450   -
451   - // 根据地理名称获取百度经纬度坐标
452   - localSearchFromAdreesToPoint: function(Address,callback) {
453   -
454   - // 创建一个搜索类实例
455   - var localSearch = new BMap.LocalSearch(mapBValue);
456   -
457   - // 检索完成后的回调函数。
458   - localSearch.setSearchCompleteCallback(function (searchResult) {
459   -
460   - var resultPoints = '';
461   -
462   - if(searchResult) {
463   -
464   - // 返回索引指定的结果。索引0表示第1条结果
465   - var poi = searchResult.getPoi(0);
466   -
467   - if(poi) {
468   -
469   - //获取经度和纬度
470   - resultPoints = poi.point.lng + ' ' + poi.point.lat;
471   -
472   - callback && callback(resultPoints);
473   -
474   - }else {
475   -
476   - callback && callback(false);
477   -
478   - }
479   -
480   - }else {
481   -
482   - callback && callback(false);
483   - }
484   -
485   - });
486   -
487   - // 根据检索词发起检索。
488   - localSearch.search(Address);
489   -
490   - },
491   -
492   - // 编辑图形
493   - editShapes : function(editStationName,stationShapesTypeV,mindex) {
494   - // 关闭信息窗口
495   - marker.closeInfoWindow();
496   -
497   - // 清除marker
498   - mapBValue.removeOverlay(marker);
499   -
500   - // 编辑圆
501   - if(stationShapesTypeV =='r') {
502   -
503   - // 开启编辑功能
504   - circle.enableEditing();
505   -
506   - // 编辑圆监听事件
507   - circle.addEventListener('dblclick',function() {
508   -
509   - // 关闭提示弹出层
510   - layer.close(mindex);
511   -
512   - // 返回圆形的半径,单位为米。
513   - var newRadius = circle.getRadius();
514   -
515   - // 返回圆形的中心点坐标。
516   - var newCenter = circle.getCenter().lng + ' ' + circle.getCenter().lat;
517   -
518   - var centre_New = [{potion:{lng:circle.getCenter().lng,lat:circle.getCenter().lat}}];
519   -
520   - /** 设置修改站点集合对象站点中心点百度坐标属性值 @param:<bJwpoints:中心点百度坐标) */
521   - EditStationObj.setEitdStationBJwpoints(newCenter);
522   -
523   - /** 设置修改站点集合对象范围图形类型属性值 @param:<shapesType:范围图形类型) */
524   - EditStationObj.setEitdStationShapesType('r');
525   -
526   - /** 设置修改站点集合对象圆形半径属性值 @param:<radius:圆形半径) */
527   - EditStationObj.setEitdStationRadius(Math.round(newRadius));
528   -
529   - /** 设置修改站点集合对象图形百度坐标集合属性值 @param:<bPolygonGrid:图形百度坐标集合) */
530   - EditStationObj.setEitdBPolygonGrid('');
531   -
532   - // 加载编辑页面
533   - $.get('edit.html', function(m){
534   -
535   - $(pjaxContainer).append(m);
536   -
537   - $('#edit_station_mobal').trigger('editSelectMobal_show', [WorldsBMap,GetAjaxData,EditStationObj,LineObj,PublicFunctions]);
538   -
539   - });
540   -
541   - });
542   -
543   - // 编辑多变行
544   - }else if(stationShapesTypeV =='d') {
545   -
546   - // 开启编辑功能(自 1.1 新增)
547   - polygon.enableEditing();
548   -
549   - // 添加多变行编辑事件
550   - polygon.addEventListener('dblclick',function(e) {
551   -
552   - // 获取编辑的多边形对象
553   - var edit_pointE = polygon;
554   -
555   - var edit_bPloygonGrid = "";
556   -
557   - var editPolyGonLen_ = edit_pointE.getPath().length;
558   -
559   - for(var k =0;k<editPolyGonLen_;k++) {
560   -
561   - if(k==0) {
562   -
563   - edit_bPloygonGrid = edit_pointE.getPath()[k].lng + ' ' + edit_pointE.getPath()[k].lat;
564   -
565   - }else {
566   -
567   - edit_bPloygonGrid = edit_bPloygonGrid + ',' + edit_pointE.getPath()[k].lng + ' ' + edit_pointE.getPath()[k].lat;
568   -
569   - }
570   -
571   - }
572   -
573   - edit_bPloygonGrid = edit_bPloygonGrid + ',' + edit_pointE.getPath()[0].lng + ' ' + edit_pointE.getPath()[0].lat;
574   -
575   - // 多边形中心点
576   - var centre_points = edit_pointE.getBounds().getCenter().lng + ' ' + edit_pointE.getBounds().getCenter().lat;
577   -
578   - /** 设置修改站点集合对象站点中心点百度坐标属性值 @param:<bJwpoints:中心点百度坐标) */
579   - EditStationObj.setEitdStationBJwpoints(centre_points);
580   -
581   - /** 设置修改站点集合对象范围图形类型属性值 @param:<shapesType:范围图形类型) */
582   - EditStationObj.setEitdStationShapesType('d');
583   -
584   - /** 设置修改站点集合对象圆形半径属性值 @param:<radius:圆形半径) */
585   - EditStationObj.setEitdStationRadius('');
586   -
587   - /** 设置修改站点集合对象图形百度坐标集合属性值 @param:<bPolygonGrid:图形百度坐标集合) */
588   - EditStationObj.setEitdBPolygonGrid(edit_bPloygonGrid);
589   -
590   - $.get('edit.html', function(m){
591   -
592   - $(pjaxContainer).append(m);
593   -
594   - $('#edit_station_mobal').trigger('editSelectMobal_show', [WorldsBMap,GetAjaxData,EditStationObj,LineObj,PublicFunctions]);
595   -
596   - });
597   -
598   - });
599   -
600   - }
601   -
602   - },
603   -
604   - // 在地图上画出上行线路走向
605   - drawingUpline : function (polylineArray,polyline_center,data) {
606   - /*WorldsBMap.clearMarkAndOverlays();*/
607   - polyUpline = '';
608   - // 创建线路走向
609   - polyUpline = new BMap.Polyline(polylineArray, {strokeColor : "blue",strokeWeight : 6,strokeOpacity : 0.5});
610   - // polyUpline.data = data;
611   - // 把折线添加到地图上
612   - mapBValue.addOverlay(polyUpline);
613   - /*var ceter_index = Math.round(resultdata.length / 2);
614   -
615   - var ceterPointsStr = resultdata[ceter_index].bJwpoints;
616   -
617   - var ceterPointsArray = ceterPointsStr.split(' ');
618   -
619   - var polyline_center = new BMap.Point(ceterPointsArray[0],ceterPointsArray[1]);*/
620   - var PanOptions_ ={noAnimation :true};
621   - mapBValue.reset();
622   - mapBValue.panTo(polyline_center,PanOptions_);
623   - mapBValue.panBy(500,-510,PanOptions_);
624   - mapBValue.setZoom(14);
625   -
626   - // 信息窗口属性
627   - var opts_polygon = {
  26 +
  27 + /** WorldsBMap 全局变量定义 mapBValue:地图对象;polygon:多边形;polyUpline:走向折线;circle:圆; road_win_show_p:信息窗口打开状态的路段,map_status:地图编辑状态,drawingManager:绘画工具*/
  28 + var mapBValue = '',polygon = '', polyUpline = '', circle = '', iseditStatus = false, road_win_show_p = '', editPolyline = '', sectionArray = [], stationArray = new Map(),map_status = 0,
  29 + drawingManager;
  30 + var styleOptions = {
  31 + strokeColor:"blue", //边线颜色。
  32 + fillColor:"blue", //填充颜色。当参数为空时,圆形将没有填充效果。
  33 + strokeWeight: 6, //边线的宽度,以像素为单位。
  34 + strokeOpacity: 0.7, //边线透明度,取值范围0 - 1。
  35 + fillOpacity: 0.6, //填充的透明度,取值范围0 - 1。
  36 + strokeStyle: 'solid' //边线的样式,solid或dashed。
  37 + }
  38 +
  39 + var Bmap = {
  40 +
  41 + init: function () {
  42 + // 设置中心点,
  43 + var CENTER_POINT = {lng: 121.528733, lat: 31.237425};
  44 + // 百度API Key
  45 + var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
  46 + // 初始化百度地图
  47 + mapBValue = new BMap.Map("bmap_basic");
  48 + //中心点和缩放级别
  49 + mapBValue.centerAndZoom(new BMap.Point(CENTER_POINT.lng, CENTER_POINT.lat), 15);
  50 + //启用地图拖拽事件,默认启用(可不写)
  51 + mapBValue.enableDragging();
  52 + //启用地图滚轮放大缩小
  53 + mapBValue.enableScrollWheelZoom();
  54 + //禁用鼠标双击放大
  55 + mapBValue.disableDoubleClickZoom();
  56 + //启用键盘上下左右键移动地图
  57 + mapBValue.enableKeyboard();
  58 + return mapBValue;
  59 + },
  60 +
  61 + /** 获取地图对象 @return 地图对象map */
  62 + getmapBValue: function () {
  63 + return mapBValue;
  64 + },
  65 + getPolygon: function () {
  66 + return polygon;
  67 + },
  68 + getPolyUpline: function () {
  69 + return polyUpline;
  70 + },
  71 + getCircle: function () {
  72 + return circle;
  73 + },
  74 + getIsEditStatus: function () {
  75 + return iseditStatus;
  76 + },
  77 + setMap_status : function (i) {
  78 + map_status = i;
  79 + },
  80 + setIsEditStatus: function (v) {
  81 + iseditStatus = v;
  82 + },
  83 + /*initDrawingManager: function (map, styleOptions) {
  84 + },*/
  85 + getDrawingManagerObj: function () {
  86 + return drawingManagerInitV;
  87 + },
  88 +
  89 + // 从百度地图抓去站点与路段数据
  90 + lineInfoPanl: function (lineNameValue, i, cb) {
  91 +
  92 + /** 根据线路名称与方向从百度地图获取站点与路段 @param lineNameValue:线路名称;i:方向<0:上行;1:下行> */
  93 + WorldsBMap.getBmapStationNames(lineNameValue, i, function (BusLine) {
  94 +
  95 + return cb && cb(BusLine);
  96 +
  97 + });
  98 +
  99 + },
  100 +
  101 + /** 获取距离与时间 @param <points:坐标点集合> */
  102 + getDistanceAndDuration: function (points, callback) {
  103 +
  104 + // 获取长度
  105 + var len = points.length;
  106 +
  107 + (function () {
  108 +
  109 + if (!arguments.callee.count) {
  110 +
  111 + arguments.callee.count = 0;
  112 +
  113 + }
  114 +
  115 + arguments.callee.count++;
  116 +
  117 + var index = parseInt(arguments.callee.count) - 1;
  118 +
  119 + if (index >= len - 1) {
  120 +
  121 + callback && callback(points);
  122 +
  123 + return;
  124 + }
  125 +
  126 + // 当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。(当前正在执行的函数。)
  127 + var f = arguments.callee;
  128 +
  129 + // 起点坐标 <坐标格式:40.056878,116.30815>
  130 + var origin = points[index].potion.lat + ',' + points[index].potion.lng;
  131 +
  132 + // 终点坐标 <坐标格式:40.056878,116.30815>
  133 + var destination = points[index + 1].potion.lat + ',' + points[index + 1].potion.lng;
  134 +
  135 + var region = '上海';
  136 +
  137 + var origin_region = '上海';
  138 +
  139 + var destination_region = '上海';
  140 +
  141 + var output = 'json';
  142 +
  143 + var ak_My = 'wjlITmXeCek5MxyU3ZUBkTeU8B0o0npk';
  144 +
  145 + /**
  146 + * origin:起点名称或经纬度;
  147 + *
  148 + * destination:终点名称或经纬度;
  149 + *
  150 + * origin_region:起始点所在城市,驾车导航时必填。
  151 + *
  152 + * destination_region:终点所在城市,驾车导航时必填。
  153 + *
  154 + * output :表示输出类型,可设置为xml或json,默认为xml。
  155 + *
  156 + **/
  157 + var paramsB = {
  158 + origin: origin,
  159 + destination: destination,
  160 + region: region,
  161 + origin_region: origin_region,
  162 + destination_region: destination_region,
  163 + output: output,
  164 + ak: ak_My
  165 + };
  166 +
  167 + /** @description :未认证开发者默认配额为:2000次/天。 */
  168 + $.ajax({
  169 +
  170 + // 百度地图根据坐标获取两点之间的时间与距离
  171 + url: 'http://api.map.baidu.com/direction/v1?mode=transit',
  172 +
  173 + data: paramsB,
  174 +
  175 + dataType: 'jsonp',
  176 +
  177 + success: function (r) {
  178 +
  179 + if (r) {
  180 +
  181 + if (r.message == 'ok') {
  182 +
  183 + if (r.result.taxi == null) {
  184 +
  185 + // 获取距离(单位:米)
  186 + points[index + 1].distance = 0;
  187 +
  188 + // 获取时间(单位:秒)
  189 + points[index + 1].duration = 0;
  190 +
  191 + } else {
  192 +
  193 + // 获取距离(单位:米)
  194 + points[index + 1].distance = r.result.taxi.distance;
  195 +
  196 + // 获取时间(单位:秒)
  197 + points[index + 1].duration = r.result.taxi.duration;
  198 +
  199 + }
  200 +
  201 +
  202 + }
  203 +
  204 + }
  205 +
  206 + f();
  207 + }
  208 + });
  209 +
  210 + })();
  211 +
  212 + },
  213 + // 打开站点信息窗口
  214 + openStationInfoWin : function (objStation) {
  215 + // 将视图切换到指定的缩放等级,中心点坐标不变。注意:当有信息窗口在地图上打开时,地图缩放将保证信息窗口所在的坐标位置不动。(自1.2新增)
  216 + mapBValue.setZoom(25);
  217 + if (objStation) {
  218 + // 站点形状
  219 + var shapes = objStation.stationShapesType;
  220 + // 获取中心坐标点字符串分割
  221 + var BJwpoints = objStation.stationJwpoints.split(' ');
  222 +
  223 + // 中心坐标点
  224 + var point = new BMap.Point(BJwpoints[0], BJwpoints[1]);
  225 + var width = WorldsBMap.strGetLength(objStation.stationRouteName) * 11;
  226 + // 信息窗口参数属性
  227 + var opts = {
628 228 // 信息窗口宽度
629   - width : 200,
  229 + width: (width < 200 ? 200 : width),
630 230 // 信息窗口高度
631   - height : 300,
  231 + height: shapes=="r" ?330:300,
632 232 // 信息窗位置偏移值。
633   - // offset: new BMap.Size(500,20),
634   - //标题
635   - // title : '<h4 style="color:#FFFFFF">'+objStation.stationStationName+'站详情</h4>',
  233 + offset: new BMap.Size(10,-20),
636 234 //设置不允许信窗发送短息
637   - enableMessage : false,
  235 + enableMessage: false,
638 236 //是否开启点击地图关闭信息窗口
639   - enableCloseOnClick : false
  237 + enableCloseOnClick: false,
  238 + // 是否开启信息窗口打开时地图自动移动(默认开启)。(自 1.1 新增)
  239 + enableAutoPan: false
640 240 };
641 241  
642   - // var markTypeStr = '';
643   - // if(objStation.stationRouteStationMark=='B') {
644   - // markTypeStr='起点站';
645   - // }else if(objStation.stationRouteStationMark=='Z') {
646   - // markTypeStr ='中途站';
647   - // }else if(objStation.stationRouteStationMark=='E') {
648   - // markTypeStr='终点站';
649   - // }
650   - // var point = objStation.stationBJwpoints.split(" ")
651   - // var htm = '<span style="color: #ff8355;font-size: 20px;">' + objStation.stationStationName + '</span>' +
652   - // '<span class="help-block" >站点编码:' + objStation.stationStationCod + '</span>' +
653   - // '<span class="help-block" >站点序号:' + objStation.stationRouteStationRouteCode + '</span>' +
654   - // '<span class="help-block" >站点类型:' + markTypeStr + '</span>' +
655   - // '<span class="help-block" >经度:&nbsp&nbsp' + point[0] + '</span>' +
656   - // '<span class="help-block" >纬度:&nbsp&nbsp' + point[1] + '</span>' +
657   - // '<span class="help-block" >到站时间:' + objStation.stationRouteToTime + '&nbsp;分钟</span>' +
658   - // '<span class="help-block" >到站距离:' + objStation.stationRouteDistances + '&nbsp;公里</span>' +
659   - // '<span class="help-block" >缓冲区形状:' + (objStation.stationShapesType == "r"?"圆形":"多边形") + '</span>' +
660   - // '<span class="help-block" >版本号:&nbsp&nbsp' + objStation.stationRouteVersions + '</span>' +
661   - // '<div style="display: flex">' +
662   - // '<span><button style="background: #ff8355; color: #fff; padding-bottom:5px; font-size: 9px;" class="btn btn-circle" ' +
663   - // 'id="editStation" onclick="WorldsBMap.editStation('+objStation.stationRouteDirections+')">修改站点</button></span>' +
664   - // '<span><button style="background: #ff8355; color: #fff; padding-bottom:5px; font-size: 9px;" class="btn btn-circle" ' +
665   - // 'id="addBetweenStationRoad" onclick="WorldsBMap.addBetweenStationRoad('+objStation.stationRouteId+')">添加站点间路段</button></span>' +
666   - // '</div>';
667   - //
668   - // // 创建信息窗口
669   - // var infoWindow_target = new BMap.InfoWindow(htm, opts_polygon);
670   - // // 自定义标注物图片
671   - // var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/cz.png',new BMap.Size(20, 20));
672   - // // 创建点
673   - // marker = new BMap.Marker(pointPolygon,{icon : icon_target});
674   - // // 把标注添物加到地图上
675   - // mapBValue.addOverlay(marker);
676   - // // 是否在平移过程中禁止动画。(自1.2新增)
677   - // var PanOptions_ ={noAnimation :true};
678   - // // 将地图的中心点更改为给定的点。
679   - // mapBValue.panTo(pointPolygon,PanOptions_);
680   - // // 将地图在水平位置上移动x像素,垂直位置上移动y像素。
681   - // mapBValue.panBy(10,-150,PanOptions_);
682   - // //开启信息窗口
683   - // mapBValue.openInfoWindow(infoWindow_target,pointPolygon);
684   - },
685   -
686   -
687   - // 在地图上画出上行线路走向
688   - drawingUpline01 : function (polylineArray,polyline_center,data) {
689   - var polyUpline01 = 'polyline' + '_' + data.sectionrouteId;
690   - // 创建线路走向
691   - polyUpline01 = new BMap.Polyline(polylineArray, {strokeColor : "blue",strokeWeight : 6,strokeOpacity : 0.5});
692   - polyUpline01.data = data;
693   - // 把折线添加到地图上
694   - mapBValue.addOverlay(polyUpline01);
695   - polyUpline01.addEventListener('click',function(e) {
696   - if(WorldsBMap.getIsEditStatus()) {
697   - layer.msg('请先保存正在编辑的路段信息...');
698   - return false;
699   - }
700   - polyUpline01.enableEditing();
701   - WorldsBMap.setIsEditStatus(true);
702   - });
703   - // 添加双击折线保存事件
704   - polyUpline01.addEventListener('dblclick',function(e) {
705   - WorldsBMap.setIsEditStatus(false);
706   - // 关闭
707   - layer.closeAll();
708   - polyUpline01.disableEditing();
709   - EditSectionObj.setEitdSection(polyUpline01.data);
710   - // 获取折线坐标集合
711   - var editPloyLineArray = polyUpline01.getPath();
712   - EditSectionObj.setEitdBsectionVector(JSON.stringify(editPloyLineArray));
713   - // polyUpline= '';
714   - // 加载修改路段弹出层mobal页面
715   - $.get('editsection.html', function(m){
716   - $(pjaxContainer).append(m);
717   - $('#edit_section_mobal').trigger('editSectionMobal_show', [WorldsBMap,GetAjaxData,EditSectionObj,PublicFunctions]);
718   - });
719   - });
720   - var PanOptions_ ={noAnimation :true};
721   - mapBValue.reset();
722   - mapBValue.panTo(polyline_center,PanOptions_);
723   - mapBValue.panBy(500,-510,PanOptions_);
724   - mapBValue.setZoom(14);
725   - },
726   -
727   - /** 在地图上画点 @param:<point_center:中心坐标点> */
728   - drawingUpStationPoint : function(point_center,stationName,s) {
729   -
730   - // 自定义标注物图片
731   - var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/gjzd.png',new BMap.Size(10, 10));
732   -
733   - var html2 = '<div style="position: absolute; margin: 0pt; padding: 0pt; width: 160px; height: 26px; left: -10px; top: -35px; overflow: hidden;">'
734   - + '<img class="rm3_image" style="border:none;left:0px; top:0px; position:absolute;" src="/pages/base/stationroute/css/img/back160.png">'
735   - + '</div>'
736   - + '<label class=" BMapLabel" unselectable="on" style="position: absolute; -moz-user-select: none; display: inline; cursor: inherit; border: 0px none; padding: 2px 1px 1px; white-space: nowrap; font: 12px arial,simsun; z-index: 80; color: rgb(255, 102, 0); left: 15px; top: -35px;"><span style="float: left; color: #fdfdfd; margin-left: -22px; font-size: 6px;">'+ s+'</span>'+ stationName+'</label>';
737   -
738   -
739   - var myRichMarker1 = new BMapLib.RichMarker(html2, point_center,{
740   - "anchor" : new BMap.Size(-10,8),
741   - "enableDragging" : true});
742   -
743   -
744   - myRichMarker1.disableDragging();
745   - mapBValue.addOverlay(myRichMarker1);
746   -
747   -
748   - // 创建标注物
749   - marker = new BMap.Marker(point_center,{icon : icon_target});
750   -
751   - // 允许覆盖物在map.clearOverlays方法中被清除。
752   - marker.enableMassClear();
753   -
754   - mapBValue.addOverlay(marker);
755   - },
756   -
757   - // 站点名称获取百度坐标(手动规划)
758   - stationsNameToPoints : function(arra,callback) {
759   - // 获取长度
760   - var len = arra.length;
761   - var stationList = [];
762   - (function(){
763   - if (!arguments.callee.count) {
764   - arguments.callee.count = 0;
765   - }
766   - arguments.callee.count++;
767   - var index = parseInt(arguments.callee.count) - 1;
768   - if (index >= len) {
769   - callback && callback(stationList);
770   - return ;
771   - }
772   - var f = arguments.callee;
773   - if(arra[index].name!=''){
774   - var localSearch = new BMap.LocalSearch(mapBValue);
775   - localSearch.search(arra[index].name);
776   - localSearch.setSearchCompleteCallback(function (searchResult) {
777   - var poi = searchResult.getPoi(0);
778   - if(poi) {
779   - stationList.push({name:arra[index].name.replace('公交车站',''),wgs:arra[index].wgs,potion:{lng:poi.point.lng,lat:poi.point.lat}});
780   - }else {
781   - stationList.push({name:arra[index].name.replace('公交车站',''),wgs:arra[index].wgs,potion:{lng:arra[index].wgs.x,lat:arra[index].wgs.y}});
782   - }
783   - f();
784   - });
785   - }else {
786   - f();
787   - }
788   - })();
789   - },
790   -
791   - // 根据坐标点获取两点之间的时间与距离(手动规划)
792   - getDistanceAndTotime : function(stationList,cb) {
793   -
794   - stationList[0].distance = '';
795   -
796   - stationList[0].duration = '';
797   -
798   - // var sectionList = [];
799   -
800   - // 获取长度
801   - var len = stationList.length;
802   -
803   - (function(){
804   -
805   - if (!arguments.callee.count) {
806   -
807   - arguments.callee.count = 0;
808   -
809   - }
810   -
811   - arguments.callee.count++;
812   -
813   - var index = parseInt(arguments.callee.count) - 1;
814   -
815   - if (index >= len-1) {
816   -
817   - // cb && cb(stationList,sectionList);
818   - cb && cb(stationList);
819   - return;
820   - }
821   -
822   - var f = arguments.callee;
823   -
824   - var poiOne = new BMap.Point(stationList[index].potion.lng,stationList[index].potion.lat);
825   -
826   - var poiTwo = new BMap.Point(stationList[index+1].potion.lng,stationList[index+1].potion.lat);
827   -
828   - var transit = new BMap.TransitRoute(mapBValue, {renderOptions: {map: mapBValue},onSearchComplete: searchComplete});
829   -
830   - transit.search(poiOne,poiTwo);
831   -
832   - function searchComplete(results){
833   -
834   - var plan = results.getPlan(0);
835   -
836   - if (transit.getStatus() != BMAP_STATUS_SUCCESS){
837   -
838   - stationList[index+1].distance = '';
839   -
840   - stationList[index+1].duration = '';
841   -
842   - // sectionList.push({sectionName:stationList[index].name+stationList[index+1].name,points:''});
843   -
844   - }else {
845   -
846   - stationList[index+1].distance = plan.getDistance(true);
847   -
848   - stationList[index+1].duration = plan.getDuration(true);
849   -
850   - // var line = plan.getRoute(0);
851   -
852   - // sectionList.push({sectionName:stationList[index].name+stationList[index+1].name,points:line.getPath()});
853   -
854   - }
855   -
856   - f();
857   - }
858   -
859   - })();
860   -
861   - },
862   -
863   - // 根据坐标点获取两点之间的折线路段(手动规划)
864   - getSectionListPlonly : function(stationsPoint,cb) {
865   -
866   - var len = stationsPoint.length;
867   -
868   - var sectionList = [];
869   -
870   - (function(){
871   -
872   - if (!arguments.callee.count) {
873   -
874   - arguments.callee.count = 0;
875   -
876   - }
877   -
878   - arguments.callee.count++;
879   -
880   - var index = parseInt(arguments.callee.count) - 1;
881   -
882   - if (index >= len-1 ) {
883   -
884   - cb && cb(sectionList);
885   - return;
886   - }
887   -
888   - var f = arguments.callee;
889   -
890   - var poiOne = new BMap.Point(stationsPoint[index].potion.lng,stationsPoint[index].potion.lat);
891   -
892   - var poiTwo = new BMap.Point(stationsPoint[index+1].potion.lng,stationsPoint[index+1].potion.lat);
893   -
894   - /* var transit = new BMap.TransitRoute(mapB, {renderOptions: {map: mapB},onPolylinesSet: searchPolylinesSet});*/
895   -
896   - var transit = new BMap.DrivingRoute(mapBValue, {renderOptions: {map: mapBValue},onPolylinesSet: searchPolylinesSet});
897   -
898   - function searchPolylinesSet(results){
899   -
900   - if (transit.getStatus() != BMAP_STATUS_SUCCESS){
901   -
902   -
903   - }else {
904   -
905   - var sectionArrayList = [];
906   - for (i = 0; i < results.length; i++){
907   -
908   - // console.log(results[i].getPolyline().getPath());
909   - sectionArrayList = sectionArrayList.concat(results[i].getPolyline().getPath());
910   -
911   - }
912   -
913   - var sectionName = stationsPoint[index].name + '至' + stationsPoint[index+1].name;
914   -
915   - sectionList.push({sectionName:sectionName,points:sectionArrayList});
916   -
917   - }
918   -
919   - f();
920   - }
921   -
922   - transit.search(poiOne,poiTwo);
923   -
924   - })();
925   -
926   - },
927   -
928   - localtionPoint : function(stationNameV) {
929   -
930   - WorldsBMap.localSearchFromAdreesToPoint(stationNameV,function(Points) {
931   -
932   - if(Points) {
933   -
934   - var BJwpointsArray = Points.split(' ');
935   -
936   - var stationNameChangePoint = new BMap.Point(BJwpointsArray[0], BJwpointsArray[1]);
937   -
938   - var marker_stargt2 = new BMap.Marker(stationNameChangePoint);
939   -
940   - var PanOptions ={noAnimation :true};
941   -
942   - mapBValue.panTo(stationNameChangePoint,PanOptions);
943   -
944   - mapBValue.panBy(0,-100);
945   -
946   - // 将标注添加到地图中
947   - mapBValue.addOverlay(marker_stargt2);
948   -
949   - //跳动的动画
950   - marker_stargt2.setAnimation(BMAP_ANIMATION_BOUNCE);
951   -
952   - }
953   -
954   - });
955   -
956   - },
957   -
958   - /** 系统规划抓去数据 @param lineNameValue:线路名称;i:方向*/
959   - getBmapStationNames : function(lineNameValue,i,callback) {
960   -
961   - var busline = new BMap.BusLineSearch(mapBValue,{
962   -
963   - // 设置公交列表查询后的回调函数。参数:rs: BusListResult类型
964   - onGetBusListComplete:function(BusListResult) {
965   -
966   - // 如果不为空
967   - if(BusListResult){
968   -
969   - //获取第一个公交列表显示到map上
970   - var fstLine = BusListResult.getBusListItem(i);
971   -
972   - /*if(fstLine==undefined){
973   -
974   - layer.confirm('系统无法生成该线路【'+lineNameValue+'】的站点与路段!请点击返回选择其它方式规划', {btn : [ '返回' ],icon: 3, title:'提示' }, function(index){
975   -
976   - layer.closeAll();
977   -
978   - if(i==0){
979   -
980   - $('#upToolsMobal').show();
981   -
982   - }else if(i==1){
983   -
984   - $('#downToolsMobal').show();
985   -
986   - }
987   -
988   - return;
989   - });
990   -
991   - }*/
992   -
993   - if(fstLine==undefined){
994   -
995   -
996   - callback && callback(null);
997   -
998   - }
999   -
1000   - busline.getBusLine(fstLine);
1001   -
1002   - }
1003   -
1004   - },
1005   -
1006   - //设置公交线路查询后的回调函数.参数:rs: BusLine类型
1007   - onGetBusLineComplete: function(BusLine){
1008   -
1009   - // 如果不为空
1010   - if(BusLine){
1011   -
1012   - callback && callback(BusLine);
1013   -
1014   - }
1015   -
1016   - }
1017   -
1018   - });
1019   -
1020   - busline.getBusList(lineNameValue);
1021   -
1022   - },
1023   - editStation : function(dir) {
1024   - // $.get("/stationroute/findStationRouteInfo",{"id":stationRouteId},function (route) {
1025   - $.get('edit_select.html', function(m){
  242 + var markTypeStr = '';
  243 + if (objStation.stationRouteStationMark == 'B') {
  244 + markTypeStr = '起点站';
  245 + } else if (objStation.stationRouteStationMark == 'Z') {
  246 + markTypeStr = '中途站';
  247 + } else if (objStation.stationRouteStationMark == 'E') {
  248 + markTypeStr = '终点站';
  249 + }
  250 + var htm = '<span style="color: #ff8355;font-size: 20px; overflow: hidden; white-space: nowrap; text-overflow:ellipsis;display: -webkit-box; -webkit-box-orient: vertical;">' + objStation.stationRouteName + '</span>' +
  251 + '<span class="help-block" >站点编码:' + objStation.stationCode + '</span>' +
  252 + '<span class="help-block" >站点序号:' + objStation.stationRouteCode + '</span>' +
  253 + '<span class="help-block" >站点类型:' + markTypeStr + '</span>' +
  254 + '<span class="help-block" >经度:&nbsp&nbsp' + BJwpoints[0] + '</span>' +
  255 + '<span class="help-block" >纬度:&nbsp&nbsp' + BJwpoints[1] + '</span>' +
  256 + '<span class="help-block" >到站时间:' + objStation.stationRouteToTime + '&nbsp;分钟</span>' +
  257 + '<span class="help-block" >到站距离:' + objStation.stationRouteDistances + '&nbsp;公里</span>' +
  258 + '<span class="help-block" >缓冲区形状:' + (shapes == "r" ? "圆形" : "多边形") + '</span>' +
  259 + (shapes=="r" ? ("<span class='help-block' >半径&nbsp&nbsp:" + objStation.stationRadius + "</span>") : " ")+
  260 + '<span class="help-block" >版本号&nbsp&nbsp:' + objStation.stationRouteVersions + '</span>' +
  261 + '<div>' +
  262 + '<button class="info_win_btn" id="editStation" onclick="WorldsBMap.editStation(' + objStation.stationRouteId+','+objStation.stationRoutedirections + ')">修改站点</button>' +
  263 + '<button class="info_win_btn" id="addBetweenStationRoad" onclick="WorldsBMap.addBetweenStationRoad(' + objStation.stationRouteId + ')">添加站点间路段</button>' +
  264 + '<button class="info_win_btn" onclick="WorldsBMap.destroyStation('+ objStation.stationRouteId + ','+objStation.stationRouteLine+','+objStation.stationRoutedirections+')">撤销</button>' +
  265 + '</div>';
  266 +
  267 + // 创建信息窗口
  268 + var infoWindow_target = new BMap.InfoWindow(htm, opts);
  269 + setTimeout(function () {
  270 + //开启信息窗口
  271 + mapBValue.openInfoWindow(infoWindow_target, point);
  272 + }, 100);
  273 + // 是否在平移过程中禁止动画。(自1.2新增)
  274 + var PanOptions_ = {noAnimation: true};
  275 + // 将地图的中心点更改为给定的点。
  276 + mapBValue.panTo(point, PanOptions_);
  277 + // mapBValue.panBy(10, -150, PanOptions_);
  278 + }
  279 + },
  280 +
  281 + editPolyUpline: function () {
  282 + // 禁止覆盖物在map.clearOverlays方法中被清除。(自 1.1 新增)
  283 + polyUpline.disableMassClear();
  284 + WorldsBMap.clearMarkAndOverlays();
  285 + // 允许覆盖物在map.clearOverlays方法中被清除。(自 1.1 新增)
  286 + polyUpline.enableMassClear();
  287 + // 开启线路编辑
  288 + polyUpline.enableEditing();
  289 + // 添加双击折线保存事件
  290 + polyUpline.addEventListener('dblclick', function (e) {
  291 + // 关闭
  292 + layer.closeAll();
  293 + polyUpline.disableEditing();
  294 + // 获取折线坐标集合
  295 + var editPloyLineArray = polyUpline.getPath();
  296 + EditSectionObj.setEitdBsectionVector(JSON.stringify(editPloyLineArray));
  297 + polyUpline = '';
  298 + // 加载修改路段弹出层mobal页面
  299 + $.get('editsection.html', function (m) {
  300 + $(pjaxContainer).append(m);
  301 + $('#edit_section_mobal').trigger('editSectionMobal_show', [WorldsBMap, GetAjaxData, EditSectionObj, PublicFunctions]);
  302 + });
  303 + });
  304 + },
  305 +
  306 + // 根据地理名称获取百度经纬度坐标
  307 + localSearchFromAdreesToPoint: function (Address, callback) {
  308 +
  309 + // 创建一个搜索类实例
  310 + var localSearch = new BMap.LocalSearch(mapBValue);
  311 +
  312 + // 检索完成后的回调函数。
  313 + localSearch.setSearchCompleteCallback(function (searchResult) {
  314 +
  315 + var resultPoints = '';
  316 +
  317 + if (searchResult) {
  318 +
  319 + // 返回索引指定的结果。索引0表示第1条结果
  320 + var poi = searchResult.getPoi(0);
  321 +
  322 + if (poi) {
  323 +
  324 + //获取经度和纬度
  325 + resultPoints = poi.point.lng + ' ' + poi.point.lat;
  326 +
  327 + callback && callback(resultPoints);
  328 +
  329 + } else {
  330 +
  331 + callback && callback(false);
  332 +
  333 + }
  334 +
  335 + } else {
  336 +
  337 + callback && callback(false);
  338 + }
  339 +
  340 + });
  341 +
  342 + // 根据检索词发起检索。
  343 + localSearch.search(Address);
  344 +
  345 + },
  346 +
  347 + // 编辑图形
  348 + editShapes: function (obj) {
  349 + // 关闭信息窗口
  350 + mapBValue.closeInfoWindow();
  351 +
  352 + // 清除marker
  353 + // mapBValue.removeOverlay(marker);
  354 + var station = obj.getEitdStation();
  355 + var stationShapesTypeV = station.stationShapesType;
  356 + // 编辑圆
  357 + if (stationShapesTypeV == 'r') {
  358 +
  359 + // 获取中心坐标点字符串分割
  360 + var BJwpoints = station.stationJwpoints.split(' ');
  361 + // 中心坐标点
  362 + var point = new BMap.Point(BJwpoints[0], BJwpoints[1]);
  363 + //创建圆
  364 + circle = new BMap.Circle(point, station.stationRadius, {
  365 + strokeColor: "red",
  366 + strokeWeight: 2,
  367 + strokeOpacity: 0.7
  368 + });
  369 + // 允许覆盖物在map.clearOverlays方法中被清除
  370 + circle.enableMassClear();
  371 + // 百度地图添加覆盖物圆
  372 + mapBValue.addOverlay(circle);
  373 + // 开启编辑功能
  374 + circle.enableEditing();
  375 + // 编辑圆监听事件
  376 + circle.addEventListener('dblclick', function () {
  377 + // 返回圆形的半径,单位为米。
  378 + var newRadius = circle.getRadius();
  379 + // 返回圆形的中心点坐标。
  380 + var newCenter = circle.getCenter().lng + ' ' + circle.getCenter().lat;
  381 + var centre_New = [{potion: {lng: circle.getCenter().lng, lat: circle.getCenter().lat}}];
  382 + /** 设置修改站点集合对象站点中心点百度坐标属性值 @param:<bJwpoints:中心点百度坐标) */
  383 + EditStationObj.setEitdStationJwpoints(newCenter);
  384 + /** 设置修改站点集合对象范围图形类型属性值 @param:<shapesType:范围图形类型) */
  385 + EditStationObj.setEitdStationShapesType('r');
  386 + /** 设置修改站点集合对象圆形半径属性值 @param:<radius:圆形半径) */
  387 + EditStationObj.setEitdStationRadius(Math.round(newRadius));
  388 + /** 设置修改站点集合对象图形百度坐标集合属性值 @param:<bPolygonGrid:图形百度坐标集合) */
  389 + EditStationObj.setEitdBPolygonGrid('');
  390 + // 加载编辑页面
  391 + $.get('edit.html', function (m) {
1026 392 $(pjaxContainer).append(m);
1027   - $('#edit_select_mobal').trigger('editSelectMobal_show', [WorldsBMap,DrawingManagerObj,GetAjaxData,EditStationObj,LineObj,PublicFunctions,dir]);
  393 + $('#edit_station_mobal').trigger('editSelectMobal_show', [WorldsBMap, GetAjaxData, EditStationObj, LineObj, PublicFunctions]);
1028 394 });
1029   - // });
1030   - },
1031   - addBetweenStationRoad : function (stationRouteId) {
1032   - $.get("/stationroute/findStationRouteInfo",{"id":stationRouteId},function (route) {
1033   - var stationRouteBegin = route[0];
1034   - // 查询下一个站点
1035   - $.get("/stationroute/findDownStationRoute",{"lineId":stationRouteBegin.stationRouteLine, "direction":stationRouteBegin.stationRoutedirections, "stationRouteCode":stationRouteBegin.stationRouteCode},function (stationRoute) {
1036   - var stationRouteFinish = stationRoute[0];
1037   -
1038   - if(stationRouteFinish){
1039   - var pointBegin = stationRouteBegin.stationJwpoints.split(" ");
1040   - var pointFinish = stationRouteFinish.stationJwpoints.split(" ")
1041   - console.log(pointFinish);
1042   - var sectionList = [];
1043   - // 两个站点的坐标
1044   - var poiOne = new BMap.Point(pointBegin[0],pointBegin[1]);
1045   - var poiTwo = new BMap.Point(pointFinish[0],pointFinish[1]);
1046   - // 路径规划保存按钮
1047   - var label = new BMap.Label("保存路段", {
1048   - offset: new BMap.Size(13, -53)
  395 + });
  396 +
  397 + // 编辑多变行
  398 + } else if (stationShapesTypeV == 'd') {
  399 + // 获取中心点坐标字符串
  400 + var testpointStr = station.stationJwpoints;
  401 + // 按空格切割中心点坐标字符串
  402 + var BJwpointsPolygon = testpointStr.split(' ');
  403 + // 中心点坐标
  404 + var pointPolygon = new BMap.Point(BJwpointsPolygon[0], BJwpointsPolygon[1]);
  405 + // 获取多边形坐标字符串
  406 + var stationBPolygonGrid = station.stationBPolyonGrid;
  407 + // 截取多边形坐标字符串
  408 + var stationBPolygonGridStr = stationBPolygonGrid.substring(9, stationBPolygonGrid.length - 2);
  409 + // 按逗号切割
  410 + var pointPolygonArray = stationBPolygonGridStr.split(',');
  411 + // 多边形坐标集合
  412 + var polygonP = [];
  413 + for (var v = 0; v < pointPolygonArray.length; v++) {
  414 + polygonP.push(new BMap.Point(pointPolygonArray[v].split(" ")[0], pointPolygonArray[v].split(" ")[1]));
  415 + }
  416 +
  417 + // 画多边形
  418 + polygon = new BMap.Polygon(polygonP, {
  419 + // 线条显色
  420 + strokeColor: "red",
  421 + // 边线的宽度,以像素为单位。
  422 + strokeWeight: 2,
  423 + // 边线透明度,取值范围0 - 1。
  424 + strokeOpacity: 0.7
  425 + });
  426 +
  427 + // 增加地图覆盖物多边形
  428 + mapBValue.addOverlay(polygon);
  429 +
  430 + // 开启编辑功能(自 1.1 新增)
  431 + polygon.enableEditing();
  432 +
  433 + // 添加多变行编辑事件
  434 + polygon.addEventListener('dblclick', function (e) {
  435 +
  436 + // 获取编辑的多边形对象
  437 + var edit_pointE = polygon;
  438 +
  439 + var edit_bPloygonGrid = "";
  440 +
  441 + var editPolyGonLen_ = edit_pointE.getPath().length;
  442 +
  443 + for (var k = 0; k < editPolyGonLen_; k++) {
  444 +
  445 + if (k == 0) {
  446 +
  447 + edit_bPloygonGrid = edit_pointE.getPath()[k].lng + ' ' + edit_pointE.getPath()[k].lat;
  448 +
  449 + } else {
  450 +
  451 + edit_bPloygonGrid = edit_bPloygonGrid + ',' + edit_pointE.getPath()[k].lng + ' ' + edit_pointE.getPath()[k].lat;
  452 +
  453 + }
  454 +
  455 + }
  456 +
  457 + edit_bPloygonGrid = edit_bPloygonGrid + ',' + edit_pointE.getPath()[0].lng + ' ' + edit_pointE.getPath()[0].lat;
  458 +
  459 + // 多边形中心点
  460 + var centre_points = edit_pointE.getBounds().getCenter().lng + ' ' + edit_pointE.getBounds().getCenter().lat;
  461 +
  462 + /** 设置修改站点集合对象站点中心点百度坐标属性值 @param:<bJwpoints:中心点百度坐标) */
  463 + EditStationObj.setEitdStationJwpoints(centre_points);
  464 +
  465 + /** 设置修改站点集合对象范围图形类型属性值 @param:<shapesType:范围图形类型) */
  466 + EditStationObj.setEitdStationShapesType('d');
  467 +
  468 + /** 设置修改站点集合对象圆形半径属性值 @param:<radius:圆形半径) */
  469 + EditStationObj.setEitdStationRadius('');
  470 +
  471 + /** 设置修改站点集合对象图形百度坐标集合属性值 @param:<bPolygonGrid:图形百度坐标集合) */
  472 + EditStationObj.setEitdBPolygonGrid(edit_bPloygonGrid);
  473 +
  474 + $.get('edit.html', function (m) {
  475 +
  476 + $(pjaxContainer).append(m);
  477 +
  478 + $('#edit_station_mobal').trigger('editSelectMobal_show', [WorldsBMap, GetAjaxData, EditStationObj, LineObj, PublicFunctions]);
  479 +
  480 + });
  481 +
  482 + });
  483 +
  484 + }
  485 +
  486 + },
  487 +
  488 + // 在地图上画出上行线路走向
  489 + /*drawingUpline: function (polylineArray, polyline_center, data) {
  490 + /!*WorldsBMap.clearMarkAndOverlays();*!/
  491 + polyUpline = '';
  492 + // 创建线路走向
  493 + polyUpline = new BMap.Polyline(polylineArray, {strokeColor: "red", strokeWeight: 6, strokeOpacity: 0.7});
  494 + // polyUpline.data = data;
  495 + // 把折线添加到地图上
  496 + mapBValue.addOverlay(polyUpline);
  497 + /!*var ceter_index = Math.round(resultdata.length / 2);
  498 +
  499 + var ceterPointsStr = resultdata[ceter_index].bJwpoints;
  500 +
  501 + var ceterPointsArray = ceterPointsStr.split(' ');
  502 +
  503 + var polyline_center = new BMap.Point(ceterPointsArray[0],ceterPointsArray[1]);*!/
  504 + var PanOptions_ = {noAnimation: true};
  505 + mapBValue.reset();
  506 + mapBValue.panTo(polyline_center, PanOptions_);
  507 + mapBValue.panBy(500, -510, PanOptions_);
  508 + mapBValue.setZoom(14);
  509 + },*/
  510 +
  511 +
  512 + // 画路段走向
  513 + drawingUpline01: function (polyline_center, datas) {
  514 + if (polyline_center && datas) {
  515 + // 编辑路段数据
  516 + sectionArray = [];
  517 + for (var d = 0; d < datas.length; d++) {
  518 + var data = datas[d];
  519 + // 地图折线坐标点集合
  520 + var polylineArray = [];
  521 + // 获取路段折线坐标字符串
  522 + var sectionBsectionVectorStr = data.sectionBsectionVector;
  523 + if (sectionBsectionVectorStr == null)
  524 + continue;
  525 + // 切割段折线坐标字符串
  526 + var tempStr = sectionBsectionVectorStr.substring(11, sectionBsectionVectorStr.length - 1);
  527 + // 分割折线坐标字符串
  528 + var lineArray = tempStr.split(',');
  529 + for (var i = 0; i < lineArray.length; i++) {
  530 + polylineArray.push(new BMap.Point(lineArray[i].split(' ')[0], lineArray[i].split(' ')[1]));
  531 + }
  532 + var polyUpline01 = 'polyline' + '_' + data.sectionrouteId;
  533 + // 创建线路走向
  534 + polyUpline01 = new BMap.Polyline(polylineArray, {
  535 + strokeColor: "red",
  536 + strokeWeight: 6,
  537 + strokeOpacity: 0.7
  538 + });
  539 + polyUpline01.data = data;
  540 + polyUpline01.ct_source = '1';
  541 + // 把折线添加到地图上
  542 + mapBValue.addOverlay(polyUpline01);
  543 + // 聚焦事件
  544 + polyUpline01.addEventListener('mousemove', function (e) {
  545 + if (this != editPolyline)
  546 + this.setStrokeColor("#20bd26");
  547 + });
  548 + // 失去焦点
  549 + polyUpline01.addEventListener('mouseout', function (e) {
  550 + if (this != editPolyline && this != road_win_show_p)
  551 + this.setStrokeColor("red");
  552 + });
  553 + // 添加单击事件
  554 + polyUpline01.addEventListener('onclick', function (e) {
  555 + // 打开信息窗口
  556 + if (map_status != 1)
  557 + WorldsBMap.openSectionInfoWin(this);
  558 + });
  559 + sectionArray.push(polyUpline01);
  560 + }
  561 + mapBValue.setCenter(polyline_center);
  562 + mapBValue.setZoom(15);
  563 + // 禁止覆盖物在map.clearOverlays方法中被清除。(自 1.1 新增)
  564 + // polyUpline01.disableMassClear();
  565 + }
  566 + },
  567 +
  568 + /** 在地图上画点 @param:<point_center:中心坐标点> */
  569 + drawingUpStationPoint: function (station, s) {
  570 + // 中心点坐标字符串
  571 + var bJwpointsStr = station.stationJwpoints;
  572 + var stationName = station.stationRouteName;
  573 + // 起个中心点坐标字符串
  574 + var bJwpointsArray = bJwpointsStr.split(' ');
  575 + // 设置中心点
  576 + var point_center = new BMap.Point(bJwpointsArray[0],bJwpointsArray[1]);
  577 + // 自定义标注物图片
  578 + var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/gjzd.png', new BMap.Size(10, 10));
  579 +
  580 + var html2 = '<div style="position: absolute; margin: 0pt; padding: 0pt; width: 160px; height: 26px; left: -10px; top: -35px; overflow: hidden;">'
  581 + + '<img class="rm3_image" style="border:none;left:0px; top:0px; position:absolute;" src="/pages/base/stationroute/css/img/back160.png">'
  582 + + '</div>'
  583 + + '<label class=" BMapLabel" unselectable="on" style="position: absolute; -moz-user-select: none; display: inline; cursor: inherit; border: 0px none; padding: 2px 1px 1px; white-space: nowrap; font: 12px arial,simsun; z-index: 80; color: rgb(255, 102, 0); left: 15px; top: -35px;"><span style="float: left; color: #fdfdfd; margin-left: -22px; font-size: 6px;">' + s + '</span>' + stationName + '</label>';
  584 +
  585 + var myRichMarker1 = new BMapLib.RichMarker(html2, point_center, {
  586 + "title": stationName,
  587 + "anchor": new BMap.Size(-10, 8),
  588 + "enableDragging": true
  589 + });
  590 + myRichMarker1.disableDragging();
  591 + myRichMarker1.ct_source = '1';
  592 + mapBValue.addOverlay(myRichMarker1);
  593 + myRichMarker1.addEventListener('click', function () {
  594 + if(map_status != 1)
  595 + WorldsBMap.openStationInfoWin(station);
  596 + });
  597 + stationArray[station.stationRouteId] = station;
  598 + },
  599 +
  600 + // 站点名称获取百度坐标(手动规划)
  601 + stationsNameToPoints: function (arra, callback) {
  602 + // 获取长度
  603 + var len = arra.length;
  604 + var stationList = [];
  605 + (function () {
  606 + if (!arguments.callee.count) {
  607 + arguments.callee.count = 0;
  608 + }
  609 + arguments.callee.count++;
  610 + var index = parseInt(arguments.callee.count) - 1;
  611 + if (index >= len) {
  612 + callback && callback(stationList);
  613 + return;
  614 + }
  615 + var f = arguments.callee;
  616 + if (arra[index].name != '') {
  617 + var localSearch = new BMap.LocalSearch(mapBValue);
  618 + localSearch.search(arra[index].name);
  619 + localSearch.setSearchCompleteCallback(function (searchResult) {
  620 + var poi = searchResult.getPoi(0);
  621 + if (poi) {
  622 + stationList.push({
  623 + name: arra[index].name.replace('公交车站', ''),
  624 + wgs: arra[index].wgs,
  625 + potion: {lng: poi.point.lng, lat: poi.point.lat}
  626 + });
  627 + } else {
  628 + stationList.push({
  629 + name: arra[index].name.replace('公交车站', ''),
  630 + wgs: arra[index].wgs,
  631 + potion: {lng: arra[index].wgs.x, lat: arra[index].wgs.y}
1049 632 });
1050   - label.setStyle({
1051   - color: '#fff',
1052   - background:"url(/pages/base/stationroute/css/img/bg.png)",
1053   - border: '0px solid',
1054   - textAlign: "center",
1055   - height: "28px",
1056   - lineHeight: "26px",
1057   - width: "80px",
1058   - maxWidth: "none"
  633 + }
  634 + f();
  635 + });
  636 + } else {
  637 + f();
  638 + }
  639 + })();
  640 + },
  641 +
  642 + // 根据坐标点获取两点之间的时间与距离(手动规划)
  643 + getDistanceAndTotime: function (stationList, cb) {
  644 + stationList[0].distance = '';
  645 + stationList[0].duration = '';
  646 + // var sectionList = [];
  647 + // 获取长度
  648 + var len = stationList.length;
  649 + (function () {
  650 + if (!arguments.callee.count) {
  651 + arguments.callee.count = 0;
  652 + }
  653 + arguments.callee.count++;
  654 + var index = parseInt(arguments.callee.count) - 1;
  655 + if (index >= len - 1) {
  656 + // cb && cb(stationList,sectionList);
  657 + cb && cb(stationList);
  658 + return;
  659 + }
  660 + var f = arguments.callee;
  661 + var poiOne = new BMap.Point(stationList[index].potion.lng, stationList[index].potion.lat);
  662 + var poiTwo = new BMap.Point(stationList[index + 1].potion.lng, stationList[index + 1].potion.lat);
  663 + var transit = new BMap.TransitRoute(mapBValue, {
  664 + renderOptions: {map: mapBValue},
  665 + onSearchComplete: searchComplete
  666 + });
  667 +
  668 + transit.search(poiOne, poiTwo);
  669 + function searchComplete(results) {
  670 + var plan = results.getPlan(0);
  671 + if (transit.getStatus() != BMAP_STATUS_SUCCESS) {
  672 + stationList[index + 1].distance = '';
  673 + stationList[index + 1].duration = '';
  674 + // sectionList.push({sectionName:stationList[index].name+stationList[index+1].name,points:''});
  675 + } else {
  676 + stationList[index + 1].distance = plan.getDistance(true);
  677 + stationList[index + 1].duration = plan.getDuration(true);
  678 + // var line = plan.getRoute(0);
  679 + // sectionList.push({sectionName:stationList[index].name+stationList[index+1].name,points:line.getPath()});
  680 + }
  681 + f();
  682 + }
  683 + })();
  684 + },
  685 +
  686 + // 根据坐标点获取两点之间的折线路段(手动规划)
  687 + getSectionListPlonly: function (stationsPoint, cb) {
  688 + var len = stationsPoint.length;
  689 + var sectionList = [];
  690 + (function () {
  691 + if (!arguments.callee.count) {
  692 + arguments.callee.count = 0;
  693 + }
  694 + arguments.callee.count++;
  695 + var index = parseInt(arguments.callee.count) - 1;
  696 + if (index >= len - 1) {
  697 + cb && cb(sectionList);
  698 + return;
  699 + }
  700 + var f = arguments.callee;
  701 + var poiOne = new BMap.Point(stationsPoint[index].potion.lng, stationsPoint[index].potion.lat);
  702 + var poiTwo = new BMap.Point(stationsPoint[index + 1].potion.lng, stationsPoint[index + 1].potion.lat);
  703 + /* var transit = new BMap.TransitRoute(mapB, {renderOptions: {map: mapB},onPolylinesSet: searchPolylinesSet});*/
  704 + var transit = new BMap.DrivingRoute(mapBValue, {
  705 + renderOptions: {map: mapBValue},
  706 + onPolylinesSet: searchPolylinesSet
  707 + });
  708 + function searchPolylinesSet(results) {
  709 + if (transit.getStatus() != BMAP_STATUS_SUCCESS) {
  710 + } else {
  711 + var sectionArrayList = [];
  712 + for (i = 0; i < results.length; i++) {
  713 + // console.log(results[i].getPolyline().getPath());
  714 + sectionArrayList = sectionArrayList.concat(results[i].getPolyline().getPath());
  715 + }
  716 + var sectionName = stationsPoint[index].name + '至' + stationsPoint[index + 1].name;
  717 + sectionList.push({sectionName: sectionName, points: sectionArrayList});
  718 + }
  719 + f();
  720 + }
  721 + transit.search(poiOne, poiTwo);
  722 + })();
  723 + },
  724 +
  725 + localtionPoint: function (stationNameV) {
  726 + // 关闭信息窗口
  727 + mapBValue.closeInfoWindow();
  728 +
  729 + WorldsBMap.localSearchFromAdreesToPoint(stationNameV, function (Points) {
  730 +
  731 + if (Points) {
  732 +
  733 + var BJwpointsArray = Points.split(' ');
  734 +
  735 + var stationNameChangePoint = new BMap.Point(BJwpointsArray[0], BJwpointsArray[1]);
  736 +
  737 + var marker_stargt2 = new BMap.Marker(stationNameChangePoint);
  738 +
  739 + var PanOptions = {noAnimation: true};
  740 +
  741 + mapBValue.panTo(stationNameChangePoint, PanOptions);
  742 +
  743 + mapBValue.panBy(0, -100);
  744 +
  745 + // 将标注添加到地图中
  746 + mapBValue.addOverlay(marker_stargt2);
  747 +
  748 + //跳动的动画
  749 + marker_stargt2.setAnimation(BMAP_ANIMATION_BOUNCE);
  750 +
  751 + }
  752 +
  753 + });
  754 +
  755 + },
  756 +
  757 + /** 系统规划抓去数据 @param lineNameValue:线路名称;i:方向*/
  758 + getBmapStationNames: function (lineNameValue, i, callback) {
  759 +
  760 + var busline = new BMap.BusLineSearch(mapBValue, {
  761 +
  762 + // 设置公交列表查询后的回调函数。参数:rs: BusListResult类型
  763 + onGetBusListComplete: function (BusListResult) {
  764 +
  765 + // 如果不为空
  766 + if (BusListResult) {
  767 +
  768 + //获取第一个公交列表显示到map上
  769 + var fstLine = BusListResult.getBusListItem(i);
  770 +
  771 + /*if(fstLine==undefined){
  772 +
  773 + layer.confirm('系统无法生成该线路【'+lineNameValue+'】的站点与路段!请点击返回选择其它方式规划', {btn : [ '返回' ],icon: 3, title:'提示' }, function(index){
  774 +
  775 + layer.closeAll();
  776 +
  777 + if(i==0){
  778 +
  779 + $('#upToolsMobal').show();
  780 +
  781 + }else if(i==1){
  782 +
  783 + $('#downToolsMobal').show();
  784 +
  785 + }
  786 +
  787 + return;
1059 788 });
1060   - label.addEventListener('click', function () {
1061   - var params = {};
1062   - params.lineId = stationRouteBegin.stationRouteLine;
1063   - params.lineCode = stationRouteBegin.stationRouteLIneCode;
1064   - params.directions = stationRouteBegin.stationRoutedirections;
1065   - params.stationRouteBegin = stationRouteBegin.stationRouteName;
1066   - params.stationRouteFinish = stationRouteFinish.stationRouteName;
  789 +
  790 + }*/
  791 +
  792 + if (fstLine == undefined) {
  793 +
  794 +
  795 + callback && callback(null);
  796 +
  797 + }
  798 +
  799 + busline.getBusLine(fstLine);
  800 +
  801 + }
  802 +
  803 + },
  804 +
  805 + //设置公交线路查询后的回调函数.参数:rs: BusLine类型
  806 + onGetBusLineComplete: function (BusLine) {
  807 +
  808 + // 如果不为空
  809 + if (BusLine) {
  810 +
  811 + callback && callback(BusLine);
  812 +
  813 + }
  814 +
  815 + }
  816 +
  817 + });
  818 +
  819 + busline.getBusList(lineNameValue);
  820 +
  821 + },
  822 + // 修改站点
  823 + editStation: function (stationRouteId) {
  824 + // $.get("/stationroute/findStationRouteInfo",{"id":stationRouteId},function (route) {
  825 + $.get('edit_select.html', function (m) {
  826 + $(pjaxContainer).append(m);
  827 + $('#edit_select_mobal').trigger('editSelectMobal_show', [WorldsBMap, DrawingManagerObj, GetAjaxData, EditStationObj, LineObj, PublicFunctions, stationArray[stationRouteId]]);
  828 + });
  829 + // });
  830 + },
  831 + addBetweenStationRoad: function (stationRouteId) {
  832 + // 关闭信息窗口
  833 + mapBValue.closeInfoWindow();
  834 + $.get("/stationroute/findStationRouteInfo", {"id": stationRouteId}, function (route) {
  835 + var stationRouteBegin = route[0];
  836 + // 查询下一个站点
  837 + $.get("/stationroute/findDownStationRoute", {
  838 + "lineId": stationRouteBegin.stationRouteLine,
  839 + "direction": stationRouteBegin.stationRoutedirections,
  840 + "stationRouteCode": stationRouteBegin.stationRouteCode
  841 + }, function (stationRoute) {
  842 + var stationRouteFinish = stationRoute[0];
  843 +
  844 + if (stationRouteFinish) {
  845 + var pointBegin = stationRouteBegin.stationJwpoints.split(" ");
  846 + var pointFinish = stationRouteFinish.stationJwpoints.split(" ")
  847 + var sectionList = [];
  848 + // 两个站点的坐标
  849 + var poiOne = new BMap.Point(pointBegin[0], pointBegin[1]);
  850 + var poiTwo = new BMap.Point(pointFinish[0], pointFinish[1]);
  851 + // 路径规划保存按钮
  852 + var label = new BMap.Label("保存路段", {
  853 + offset: new BMap.Size(13, -53)
  854 + });
  855 + label.setStyle({
  856 + color: '#fff',
  857 + background: "url(/pages/base/stationroute/css/img/bg.png)",
  858 + border: '0px solid',
  859 + textAlign: "center",
  860 + height: "28px",
  861 + lineHeight: "26px",
  862 + width: "80px",
  863 + maxWidth: "none"
  864 + });
  865 + label.addEventListener('click', function () {
  866 + var params = {};
  867 + params.lineId = stationRouteBegin.stationRouteLine;
  868 + params.lineCode = stationRouteBegin.stationRouteLIneCode;
  869 + params.directions = stationRouteBegin.stationRoutedirections;
  870 + params.stationRouteBegin = stationRouteBegin.stationRouteName;
  871 + params.stationRouteFinish = stationRouteFinish.stationRouteName;
  872 + layer.confirm('确定保存', {
  873 + btn : [ '路段调整好了','继续调整','退出'], icon: 3, title:'提示'
  874 + ,btn3: function(index, layero){
  875 + PublicFunctions.resjtreeDate(params.lineId,params.directions);
  876 + PublicFunctions.editAChangeCssRemoveDisabled();
  877 + GetAjaxData.getSectionRouteInfo(params.lineId,params.directions,function(data) {
  878 + PublicFunctions.linePanlThree(params.lineId,data,params.directions);
  879 + });
  880 + PublicFunctions.editMapStatusRemove();
  881 + }
  882 + }, function(index, layero){
  883 + layer.close(index);
1067 884 params.route = $("#routePlanning").val();
1068   - $.get('doublename_road.html', function(m){
  885 + $.get('doublename_road.html', function (m) {
1069 886 $(pjaxContainer).append(m);
1070   - $('#doublename_road_mobal').trigger('doubleNameRoadMobal_show', [params,WorldsBMap,GetAjaxData,PublicFunctions]);
  887 + $('#doublename_road_mobal').trigger('doubleNameRoadMobal_show', [params, WorldsBMap, GetAjaxData, PublicFunctions]);
1071 888 });
  889 + PublicFunctions.editMapStatusRemove();
1072 890 });
1073   - // 路径规划
1074   - var transit = new BMap.DrivingRoute(mapBValue, {renderOptions: {map: mapBValue,enableDragging : true},onPolylinesSet: searchPolylinesSet});
1075   - function searchPolylinesSet(results){
1076   - if (transit.getStatus() == BMAP_STATUS_SUCCESS){
1077   - var sectionArrayList = [];
1078   - for (i = 0; i < results.length; i++){
1079   - sectionArrayList = sectionArrayList.concat(results[i].getPolyline().getPath());
1080   - }
1081   - sectionList = sectionArrayList;//JSON.stringify()
1082   - $("#routePlanning").val(JSON.stringify(sectionArrayList));
1083   - var pointMap = new Map();
1084   - pointMap = sectionArrayList[sectionArrayList.length-1];
1085   - var pointLabel = new BMap.Point(pointMap.lng,pointMap.lat);
1086   - label.enableMassClear();
1087   - label.setPosition(pointLabel);
1088   - mapBValue.addOverlay(label);
  891 + });
  892 + // 路径规划
  893 + var transit = new BMap.DrivingRoute(mapBValue, {
  894 + renderOptions: {
  895 + map: mapBValue,
  896 + enableDragging: true
  897 + },
  898 + onPolylinesSet: searchPolylinesSet
  899 + });
  900 +
  901 + function searchPolylinesSet(results) {
  902 + if (transit.getStatus() == BMAP_STATUS_SUCCESS) {
  903 + var sectionArrayList = [];
  904 + for (i = 0; i < results.length; i++) {
  905 + sectionArrayList = sectionArrayList.concat(results[i].getPolyline().getPath());
1089 906 }
  907 + sectionList = sectionArrayList;//JSON.stringify()
  908 + $("#routePlanning").val(JSON.stringify(sectionArrayList));
  909 + var pointMap = new Map();
  910 + pointMap = sectionArrayList[sectionArrayList.length - 1];
  911 + var pointLabel = new BMap.Point(pointMap.lng, pointMap.lat);
  912 + label.enableMassClear();
  913 + label.setPosition(pointLabel);
  914 + mapBValue.addOverlay(label);
1090 915 }
1091   - transit.search(poiOne,poiTwo);
1092   - transit.disableAutoViewport();
1093   - } else {
1094   - layer.msg("您选择的站点后没有站点了,不能生成站点间路段!")
1095   - }
  916 + }
  917 + transit.search(poiOne, poiTwo);
  918 + transit.disableAutoViewport();
  919 + // 地图编辑状态
  920 + PublicFunctions.editMapStatus();
  921 + } else {
  922 + layer.msg("您选择的站点后没有站点了,不能生成站点间路段!")
  923 + }
1096 924  
  925 + });
  926 + });
  927 +
  928 + },
  929 + // 定位路段
  930 + focusSection: function(sectionRoudId) {
  931 + for (var i = 0, p; p = sectionArray[i++];) {
  932 + if (p.data.sectionrouteId == sectionRoudId) {
  933 + WorldsBMap.openSectionInfoWin(p);
  934 + break;
  935 + }
  936 + }
  937 + },
  938 + // 编辑路段
  939 + editSection : function(sectionRoudId) {
  940 + layer.confirm('进入编辑状态', {
  941 + btn : [ '确定','返回' ], icon: 3, title:'提示'
  942 + }, function() {
  943 + PublicFunctions.editMapStatus();
  944 + layer.msg('双击保存路段');
  945 + var p;
  946 + for (var i = 0; p = sectionArray[i++];) {
  947 + if (p.data.sectionrouteId == sectionRoudId) {
  948 + mapBValue.closeInfoWindow();//关闭infoWindow
  949 + p.enableEditing();
  950 + p.setStrokeColor('blue');
  951 + editPolyline = p;
  952 + break;
  953 + }
  954 + }
  955 + p.addEventListener('dblclick', function () {
  956 + /** 设置修改路段集合对象为空 */
  957 + editPolyline = '';
  958 + PublicFunctions.editMapStatusRemove();
  959 + $.get('editsection.html', function(m){
  960 + $('body').append(m);
  961 + $('#edit_section_mobal').trigger('editSectionMobal_show', [WorldsBMap,GetAjaxData,p,PublicFunctions]);
  962 + });
  963 + });
  964 + });
  965 + },
  966 + // 添加在路段之后
  967 + addSection : function(stecion) {
  968 + PublicFunctions.editMapStatus();
  969 + // 把数据填充到模版中
  970 + var addSectionHTML = template('add_draw_polyline-temp');
  971 + $('body .mian-portlet-body').append(addSectionHTML);
  972 + //暂停和开始绘制
  973 + $('.draw_polyline_switch>a').on('click', function () {
  974 + var t = $(this).text();
  975 + if(t=='暂停绘制'){
  976 + WorldsBMap.exitDrawStatus();
  977 + $(this).text('开始绘制');
  978 + }
  979 + else{
  980 + WorldsBMap.openDrawStatus();
  981 + $(this).text('暂停绘制');
  982 + }
  983 + });
  984 + // 开启绘制事件
  985 + WorldsBMap.showAddSectionPanel(stecion);
  986 +
  987 + //取消
  988 + $('#addSectionCancelBtn').on('click', function () {
  989 + $('.main_left_panel_m_layer').hide();
  990 + $(this).parents('.buffer_edit_body').parent().remove();
  991 + WorldsBMap.exitDrawStatus();
  992 + PublicFunctions.editMapStatusRemove();
  993 + });
  994 +
  995 + //确定
  996 + $('#addSectionSbmintBtn').on('click', function () {
  997 + var btn = this;
  998 + $('#addSectionSbmintBtn').addClass("disabled");
  999 + var sectionName = $('#sectionNameInput').val();
  1000 + var bsectionVector = $('#bsectionVectorInput').val();
  1001 + var params = {};
  1002 + if(sectionName && bsectionVector) {
  1003 + WorldsBMap.exitDrawStatus();
  1004 + GetAjaxData.getSectionCode(function(sectionCode) {
  1005 + var lineId = stecion.lineId;
  1006 + var dir = stecion.dir;
  1007 + params.lineId = lineId;
  1008 + params.lineCode = stecion.lineCode;
  1009 + params.sectionCode = sectionCode;// 设值路段编码.
  1010 + params.sectionName = sectionName;
  1011 + params.roadCoding = '';
  1012 + params.dbType = 'b';
  1013 + params.bsectionVector = bsectionVector;
  1014 + params.sectionrouteCode = 1;
  1015 + params.sectionTime = 0;
  1016 + params.sectionDistance = 60;
  1017 + params.speedLimit = 0;
  1018 + params.versions = stecion.versions;
  1019 + params.destroy = 0;
  1020 + params.directions = dir;
  1021 + params.descriptions = '';
  1022 + GetAjaxData.sectionSave(params, function (result) {
  1023 + if(result.status =="SUCCESS"){
  1024 + $('.main_left_panel_m_layer').hide();
  1025 + $(btn).parents('.buffer_edit_body').parent().remove();
  1026 + PublicFunctions.editMapStatusRemove();
  1027 + PublicFunctions.resjtreeDate(lineId,dir);
  1028 + PublicFunctions.editAChangeCssRemoveDisabled();
  1029 + GetAjaxData.getSectionRouteInfo(lineId,dir,function(data) {
  1030 + PublicFunctions.linePanlThree(lineId,data,dir);
  1031 + });
  1032 + layer.msg("添加成功!");
  1033 + } else if(result.status =="ERROR") {
  1034 + layer.msg("添加失败!");
  1035 + }
  1036 + });
  1037 + });
  1038 + } else if(sectionName){
  1039 + layer.msg('请填写路段名字!');
  1040 + } else if(bsectionVector){
  1041 + layer.msg('请填先绘制路段!');
  1042 + }
  1043 + setTimeout(function () {
  1044 + $("#addSectionSbmintBtn").removeClass("disabled");
  1045 + },1000);
  1046 + });
  1047 + },
  1048 + // 添加在路段之后
  1049 + addSectionAfter : function(sectionRoudId) {
  1050 + //order = after before;
  1051 + var beforeSection;
  1052 + // 关闭信息窗口
  1053 + mapBValue.closeInfoWindow();
  1054 + PublicFunctions.editMapStatus();
  1055 + // 把数据填充到模版中
  1056 + var addSectionHTML = template('add_draw_polyline-temp',{ 'id': sectionRoudId});
  1057 + $('body .mian-portlet-body').append(addSectionHTML);
  1058 + //暂停和开始绘制
  1059 + $('.draw_polyline_switch>a').on('click', function () {
  1060 + var t = $(this).text();
  1061 + if(t=='暂停绘制'){
  1062 + WorldsBMap.exitDrawStatus();
  1063 + $(this).text('开始绘制');
  1064 + }
  1065 + else{
  1066 + WorldsBMap.openDrawStatus();
  1067 + $(this).text('暂停绘制');
  1068 + }
  1069 + });
  1070 +
  1071 + //取消
  1072 + $('#addSectionCancelBtn').on('click', function () {
  1073 + $('.main_left_panel_m_layer').hide();
  1074 + $(this).parents('.buffer_edit_body').parent().remove();
  1075 + WorldsBMap.exitDrawStatus();
  1076 + PublicFunctions.editMapStatusRemove();
  1077 + });
  1078 + GetAjaxData.getSectionRouteInfoById(sectionRoudId, function(data){
  1079 + WorldsBMap.showAddSectionPanel(data[0]);
  1080 + beforeSection = data[0];
  1081 + });
  1082 +
  1083 + //确定
  1084 + $('#addSectionSbmintBtn').on('click', function () {
  1085 + var btn = this;
  1086 + $('#addSectionSbmintBtn').addClass("disabled");
  1087 + var sectionName = $('#sectionNameInput').val();
  1088 + var params = {};
  1089 + if(sectionName) {
  1090 + WorldsBMap.exitDrawStatus();
  1091 + GetAjaxData.getSectionCode(function(sectionCode) {
  1092 + var lineId = beforeSection.sectionRouteLine
  1093 + var dir = beforeSection.sectionRouteDirections
  1094 + params.lineId = lineId;
  1095 + params.lineCode = beforeSection.sectionRouteLineCode;
  1096 + params.sectionCode = sectionCode;// 设值路段编码.
  1097 + params.sectionName = sectionName;
  1098 + params.roadCoding = '';
  1099 + params.dbType = 'b';
  1100 + params.bsectionVector = $('#bsectionVectorInput').val();
  1101 + params.sectionrouteCode = beforeSection.sectionRouteCode+"_0";
  1102 + params.sectionTime = 0;
  1103 + params.sectionDistance = 60;
  1104 + params.speedLimit = 0;
  1105 + params.versions = beforeSection.sectionVersion;
  1106 + params.destroy = 0;
  1107 + params.directions = dir;
  1108 + params.descriptions = '';
  1109 + GetAjaxData.sectionSave(params, function (result) {
  1110 + if(result.status =="SUCCESS"){
  1111 + $('.main_left_panel_m_layer').hide();
  1112 + $(btn).parents('.buffer_edit_body').parent().remove();
  1113 + PublicFunctions.editMapStatusRemove();
  1114 + PublicFunctions.resjtreeDate(lineId,dir);
  1115 + PublicFunctions.editAChangeCssRemoveDisabled();
  1116 + GetAjaxData.getSectionRouteInfo(lineId,dir,function(data) {
  1117 + PublicFunctions.linePanlThree(lineId,data,dir);
  1118 + });
  1119 + layer.msg("添加成功!");
  1120 + } else if(result.status =="ERROR") {
  1121 + layer.msg("添加失败!");
  1122 + }
  1123 + });
  1124 + });
  1125 + } else {
  1126 + layer.msg('请填写路段名字');
  1127 + }
  1128 + setTimeout(function () {
  1129 + $("#addSectionSbmintBtn").removeClass("disabled");
  1130 + },1000);
  1131 + });
  1132 + },
  1133 + // 撤销站点
  1134 + destroyStation : function(stationRouteId,lineId,dir) {
  1135 + layer.confirm('你确定要撤销此站点吗?', {
  1136 + btn : [ '撤销','返回' ], icon: 3, title:'提示'
  1137 + }, function(){
  1138 + $.post('/stationroute/stationRouteIsDestroy',{'stationRouteId':stationRouteId,destroy:'1'},function(resuntDate) {
  1139 + if (resuntDate.status == 'SUCCESS') {
  1140 + // 弹出添加成功提示消息
  1141 + layer.msg('撤销成功!');
  1142 + } else {
  1143 + // 弹出添加失败提示消息
  1144 + layer.msg('撤销失败!');
  1145 + }
  1146 + // 刷新左边树
  1147 + PublicFunctions.resjtreeDate(lineId,dir);
  1148 + /** 查询路段信息 @param:<Line.id:线路Id;delBatch.dir:方向> @return:data:路段数据 */
  1149 + GetAjaxData.getSectionRouteInfo(lineId,dir,function(data) {
  1150 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;delBatch.dir:方向;data:路段数据> */
  1151 + PublicFunctions.linePanlThree(lineId,data,dir);
  1152 + });
  1153 + });
  1154 + });
  1155 + },
  1156 + // 撤销路段
  1157 + destroySection : function(sectionRoudId,lineId,dir) {
  1158 + layer.confirm('你确定要撤销此路段吗?', {
  1159 + btn : [ '撤销','返回' ], icon: 3, title:'提示'
  1160 + }, function(){
  1161 + $.post('/sectionroute/destroy',{'id': sectionRoudId},function(resuntDate) {
  1162 + if (resuntDate.status == 'SUCCESS') {
  1163 + // 弹出添加成功提示消息
  1164 + layer.msg('撤销成功!');
  1165 + } else {
  1166 + // 弹出添加失败提示消息
  1167 + layer.msg('撤销失败!');
  1168 + }
  1169 + // 刷新左边树
  1170 + PublicFunctions.resjtreeDate(lineId,dir);
  1171 + /** 查询路段信息 @param:<Line.id:线路Id;delBatch.dir:方向> @return:data:路段数据 */
  1172 + GetAjaxData.getSectionRouteInfo(lineId,dir,function(data) {
  1173 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;delBatch.dir:方向;data:路段数据> */
  1174 + PublicFunctions.linePanlThree(lineId,data,dir);
1097 1175 });
1098 1176 });
  1177 + });
  1178 + },
  1179 + // 打开路段信息窗口
  1180 + openSectionInfoWin : function(p) {
  1181 + var section = p.data;
  1182 + var width = WorldsBMap.strGetLength(section.sectionName) * 10;
  1183 + // 信息窗口参数属性
  1184 + var opts = {
  1185 + // 信息窗口宽度
  1186 + width: (width < 200 ? 200 : width),
  1187 + // 信息窗口高度
  1188 + height: 150,
  1189 + //设置不允许信窗发送短息
  1190 + enableMessage: false,
  1191 + //是否开启点击地图关闭信息窗口
  1192 + enableCloseOnClick: false,
  1193 + // 是否开启信息窗口打开时地图自动移动(默认开启)。(自 1.1 新增)
  1194 + enableAutoPan: false
  1195 + };
  1196 + var htm = '<span style="color: #ff8355;font-size: 18px;">' + section.sectionName + '</span>' +
  1197 + '<span class="help-block" >路段编码:' + section.sectionCode + '</span>' +
  1198 + '<span class="help-block" >路段序号:' + section.sectionrouteCode + '</span>' +
  1199 + '<span class="help-block" >版本号&nbsp&nbsp:' + section.versions + '</span>' +
  1200 + '<div >' +
  1201 + '<button class="info_win_btn" id="editStation" onclick="WorldsBMap.editSection(' + section.sectionrouteId + ')">修改</button>' +
  1202 + '<button class="info_win_btn" id="addSectionAfter" onclick="WorldsBMap.addSectionAfter('+section.sectionrouteId+')">添加(之后)</button>' +
  1203 + '<button class="info_win_btn" id="addBetweenStationRoad" onclick="WorldsBMap.destroySection('+ section.sectionrouteId + ','+section.sectionrouteLine+','+section.sectionrouteDirections+')">撤销</button>' +
  1204 + '</div>';
  1205 +
  1206 + // 创建信息窗口
  1207 + var infoWindow_target = new BMap.InfoWindow(htm, opts);
  1208 + // 切割段折线坐标字符串
  1209 + var sectionStr = section.sectionBsectionVector.substring(11, section.sectionBsectionVector.length - 1);
  1210 + // 分割折线坐标字符串
  1211 + var lineArray = sectionStr.split(',');
  1212 + var sectionArray = [];
  1213 + for (var i = 0; i < lineArray.length; i++) {
  1214 + sectionArray.push(new BMap.Point(lineArray[i].split(' ')[0], lineArray[i].split(' ')[1]));
  1215 + }
  1216 + // 计算中间点
  1217 + var index = parseInt(sectionArray.length / 2);
  1218 + var centerPoint = sectionArray[index];
  1219 + //close event
  1220 + infoWindow_target.addEventListener('close', function (e) {
  1221 + p.setStrokeColor("red");
  1222 + road_win_show_p = null;
  1223 + });
  1224 + //open event
  1225 + infoWindow_target.addEventListener('open', function (e) {
  1226 + p.setStrokeColor("#20bd26");
  1227 + road_win_show_p = p;
  1228 + });
  1229 + //开启信息窗口
  1230 + mapBValue.openInfoWindow(infoWindow_target, centerPoint);
  1231 + mapBValue.setZoom(18);
  1232 + mapBValue.setCenter(centerPoint);
  1233 + },
  1234 + /**
  1235 + * 绘制新增路段
  1236 + * @param section
  1237 + */
  1238 + showAddSectionPanel : function (section) {
  1239 + var point;
  1240 + if(section){
  1241 + var sectionBsectionVectorStr = section.sectionBsectionVector;
  1242 + var line = sectionBsectionVectorStr.substring(11, sectionBsectionVectorStr.length - 1),
  1243 + points = line.split(','),
  1244 + pointStr = points[points.length-1].split(' ');
  1245 +
  1246 + point = new BMap.Point(pointStr[0], pointStr[1]);
  1247 + }
  1248 +
  1249 + mapBValue.centerAndZoom(point, 18);
  1250 +
  1251 + //开启鼠标绘制
  1252 + drawingManager = new BMapLib.DrawingManager(mapBValue, {
  1253 + polylineOptions: styleOptions
  1254 + });
  1255 +
  1256 + drawingManager.open();
  1257 + //drawingManager.enableCalculate();
  1258 + drawingManager.setDrawingMode('polyline');
  1259 +
  1260 + //绘制完成
  1261 + drawingManager.addEventListener('polylinecomplete', function (e) {
  1262 + console.log('eee', e, e.getPath());
  1263 + drawingManager.close();
  1264 +
  1265 + var polyline = new BMap.Polyline(e.getPath(), {strokeWeight: 7, strokeColor: 'blue', strokeOpacity: 0.7});
  1266 +
  1267 + mapBValue.removeOverlay(e);
  1268 + mapBValue.addOverlay(polyline);
  1269 + polyline.enableEditing();
  1270 +
  1271 + editPolyline = polyline;
  1272 + var sectionData = e.getPath();// 获取折线坐标集合
  1273 + $('#bsectionVectorInput').val(JSON.stringify(sectionData));
  1274 + });
  1275 + },
  1276 + exitDrawStatus : function () {
  1277 + if (drawingManager) {
  1278 + WorldsBMap.clearOtherOverlay();
  1279 + drawingManager.close();
  1280 + }
  1281 + },
  1282 + openDrawStatus : function () {
  1283 + if (drawingManager) {
  1284 + WorldsBMap.clearOtherOverlay();
  1285 + drawingManager.open();
  1286 + }
  1287 + },
  1288 + /** 清楚无需要的覆盖物(非站点/路段数据源)*/
  1289 + clearOtherOverlay : function () {
  1290 + var all = mapBValue.getOverlays();
  1291 + for (var i = 0, obj; obj = all[i++];) {
  1292 + if (obj.ct_source && obj.ct_source == '1')
  1293 + continue;
  1294 + mapBValue.removeOverlay(obj);
  1295 + }
  1296 + },
  1297 + clearMarkAndOverlays: function () {
  1298 + // 清楚地图覆盖物
  1299 + mapBValue.clearOverlays();
  1300 + mapBValue.removeOverlay();
  1301 + },
  1302 + clearMark: function () {
  1303 + // 清楚地图覆盖物
  1304 + mapBValue.removeOverlay();
  1305 + },
  1306 + strGetLength: function (str) {
  1307 + return str.replace(/[\u0391-\uFFE5]/g, "aa").length; //先把中文替换成两个字节的英文,在计算长度
  1308 + }
  1309 + }
  1310 +
  1311 + return Bmap;
1099 1312  
1100   - },
1101   -
1102   - clearMarkAndOverlays : function() {
1103   -
1104   - // 清楚地图覆盖物
1105   - mapBValue.clearOverlays();
1106   -
1107   - mapBValue.removeOverlay();
1108   -
1109   - }
1110   -
1111   - }
1112   -
1113   - return Bmap;
1114   -
1115 1313 }();
1116 1314 \ No newline at end of file
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-list-reload.js
... ... @@ -80,5 +80,7 @@ $(function(){
80 80 });
81 81  
82 82 }
83   -
  83 + $('.green-seagreen dropdown-toggle').click(function(){
  84 + $('.dropdown-menu').css("display", "block");
  85 + });
84 86 });
85 87 \ No newline at end of file
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-list-treedata.js
... ... @@ -22,44 +22,7 @@ var StationTreeData = function(){
22 22 EditSectionObj.setEitdSection({});
23 23  
24 24 }
25   -
26   - function upIsEidtStauts(shapesTypeT,chaildredType,data) {
27   -
28   - // 关闭弹出层
29   - layer.closeAll();
30   -
31   - // 选中的是站点
32   - if(chaildredType =='station') {
33   -
34   - // 如果是圆
35   - if(shapesTypeT =='r') {
36   -
37   - // 百度地图画圆
38   - WorldsBMap.pointsCircle(data);
39   -
40   - // 如果是多边形
41   - }else if(shapesTypeT == 'd') {
42   -
43   - // 百度地图画多边形
44   - WorldsBMap.pointsPolygon(data);
45   -
46   - }
47   -
48   - // 选中的是路段
49   - }else if(chaildredType =='section'){
50   - // 路段矢量坐标点
51   - var polylineArray = [data];
52   - // 路段方向
53   - var dire_ = data.sectionrouteDirections;
54   - // 线路ID
55   - var Line = LineObj.getLineObj();
56   - /*// 百度地图画路段
57   - PublicFunctions.linePanlThree(Line.id,polylineArray,dire_);*/
58   - // 百度地图画路段
59   - PublicFunctions.treeSectionClick(Line.id,polylineArray,dire_);
60   - }
61   - }
62   -
  25 +
63 26 function TreeOnclickEvent(treeOjb) {
64 27 if(treeOjb==null)
65 28 return;
... ... @@ -70,64 +33,15 @@ var StationTreeData = function(){
70 33 }
71 34 // 获取数据
72 35 var stationData = treeOjb[0].original;
73   - // 站点范围类型
74   - var shapesType_ = stationData.stationShapesType;
75   - // 选中的节点类型
76   - var chaildredType_ = stationData.chaildredType;
77   - // 选中的其它节点
78   - if(chaildredType_ ==null){
79   - return;
80   - }
81   - var edtsta = EditStationObj.getEitdStation();
82   - var edtste = EditSectionObj.getEitdSection();
83   - if(!$.isEmptyObject(edtsta)){
84   - var stationName = edtsta.stationStationName;
85   - var txType = edtsta.stationShapesType;
86   - // 是否继续弹出层
87   - layer.confirm('您正处于站点【'+stationName+'】的编辑状态!是否退出!', {
88   - btn : [ '确认并退出', '返回并继续' ]
89   - }, function(index) {
90   - DrawingManagerObj.closeDrawingManager();
91   - PublicFunctions.editAChangeCssRemoveDisabled();
92   - // 关闭弹出层
93   - layer.close(index);
94   - WorldsBMap.clearMarkAndOverlays();
95   - if(txType=='r'){
96   - WorldsBMap.pointsCircle(edtsta);
97   - }else if(txType=='d') {
98   - // 百度地图画多边形
99   - WorldsBMap.pointsPolygon(edtsta);
100   - }
101   - parmasObj();
102   - },function(){
103   - // 关闭弹出层
104   - layer.closeAll();
105   - return false;
106   - });
107   -
108   - }else if(!$.isEmptyObject(edtste)) {
109   - var sectionName = edtste.sectionName;
110   - // 是否继续弹出层
111   - layer.confirm('您正处于路段【'+sectionName+'】的编辑状态!是否退出!', {
112   - btn : [ '确认并退出', '返回并继续' ]
113   - }, function(index) {
114   - // 关闭弹出层
115   - layer.close(index);
116   - PublicFunctions.editAChangeCssRemoveDisabled();
117   - var polylineArray_ = [edtste];
118   - WorldsBMap.clearMarkAndOverlays();
119   - // 百度地图画路段
120   - PublicFunctions.treeSectionClick(Line.id,polylineArray,dire_);
121   - parmasObj();
122   -
123   - },function(){
124   - // 关闭弹出层
125   - layer.closeAll();
126   - return false;
127   - });
128   - }else {
129   - WorldsBMap.clearMarkAndOverlays();
130   - upIsEidtStauts(shapesType_,chaildredType_,stationData);
  36 + // 选中的节点类型
  37 + var chaildredType_ = stationData.chaildredType;
  38 +
  39 + if(chaildredType_ == "section") {
  40 + WorldsBMap.focusSection(stationData.sectionrouteId);
  41 + } else if(chaildredType_ == "station") {
  42 + WorldsBMap.openStationInfoWin(stationData);
  43 + } else if(chaildredType_ == "addSection") {
  44 + WorldsBMap.addSection(stationData);
131 45 }
132 46 }
133 47 var stationTree = {
... ... @@ -251,7 +165,11 @@ var StationTreeData = function(){
251 165 tree.settings.core.data = treeDateJson;
252 166 // 刷新上行树
253 167 tree.refresh();
254   - },
  168 + // 展开树
  169 + setTimeout(function () {
  170 + tree.open_all();
  171 + },500);
  172 + },
255 173 dwonreloadeTree : function (treeDateJson) {
256 174 // 获取下行树
257 175 var tree = $.jstree.reference('#station_Down_tree');
... ... @@ -259,6 +177,10 @@ var StationTreeData = function(){
259 177 tree.settings.core.data = treeDateJson;
260 178 // 刷行下行树
261 179 tree.refresh();
  180 + // 展开树
  181 + setTimeout(function () {
  182 + tree.open_all();
  183 + },500);
262 184 }
263 185 }
264 186  
... ...
src/main/resources/static/pages/base/stationroute/list.html
1 1 <link href="/pages/base/stationroute/css/bmap_base.css" rel="stylesheet" type="text/css" />
2   -<div class="portlet-body">
  2 +<link rel="stylesheet" href="/assets/plugins/layer-v2.4/layer/skin/layer.css">
  3 +
  4 +<div class="mian-portlet-body">
3 5 <!-- 地图 -->
4 6 <div id="bmap_basic" class="bmaps"></div>
  7 + <!-- 搜索框 -->
  8 +
  9 + <div class="search_panel">
  10 + <div class="search_input_panel">
  11 + <input class="search_input" type="text" placeholder="输入位置搜索" id="searchInput">
  12 + <span class="fa fa-close fa-lg clear hide" aria-hidden="true"></span >
  13 + </div>
  14 + <div class="search_button_panel">
  15 + <button class="fa fa-search fa-lg search_button" >
  16 + </button >
  17 + </div>
  18 + </div>
  19 +
  20 + <div id="searchResultPanel" style="border:1px solid #C0C0C0;width:150px;height:auto; display:none;z-index: 199;"></div>
5 21 <!-- 路径规划路段 -->
6 22 <input class="hand" id="routePlanning" />
7   - <div class="portlet box protlet-box">
8   - <!-- 左边标题栏 -->
  23 + <div class="portlet box protlet-box">
  24 + <div class="protlet-box-layer"></div>
  25 + <!-- 左边标题栏 -->
9 26 <div class="portlet-title" style="background-color:#12527f;">
10 27 <div class="caption">
11 28 <!-- 途径站点 -->
... ... @@ -51,7 +68,7 @@
51 68 <li>
52 69 <a href="javascript:;" id="addUpStation"><i class="fa fa-plus"></i> 添加站点</a>
53 70 </li>
54   - <li class="divider"> </li>
  71 + <!--<li class="divider"> </li>-->
55 72 <!--<li>
56 73 <a href="javascript:;" id="editUpStation"><i class="fa fa-pencil"></i> 修改站点</a>
57 74 </li>-->
... ... @@ -59,7 +76,11 @@
59 76 <li>
60 77 <a href="javascript:;" id="deleteUpStation"><i class="fa fa-close"></i> 撤销站点</a>
61 78 </li>
62   - <li class="divider"> </li>
  79 + <li class="divider"> </li>
  80 + <!--<li>
  81 + <a href="javascript:;" id="addUpSection"><i class="fa fa-plus"></i> 添加路段</a>
  82 + </li>
  83 + <li class="divider"> </li>-->
63 84 <li>
64 85 <a href="javascript:;" id="batchUpDelete"><i class="fa fa-trash-o"></i> 批量撤销</a>
65 86 </li>
... ... @@ -75,10 +96,10 @@
75 96 <li>
76 97 <a href="javascript:;" id="quoteDown"><i class="fa fa-long-arrow-down"></i> 引用下行路段</a>
77 98 </li>
78   - <li class="divider"> </li>
79   - <!-- <li>
80   - <a href="javascript:;" id="editUplineTrend"><i class="fa fa-edit"></i> 编辑走向</a>
81   - </li> -->
  99 + <!-- <li class="divider"> </li>
  100 + <!-- <li>
  101 + <a href="javascript:;" id="editUplineTrend"><i class="fa fa-edit"></i> 编辑走向</a>
  102 + </li> -->
82 103 <!-- <li>
83 104 <a href="javascript:;" id="createUsingSingle"><i class="fa fa-edit"></i> 生成行单</a>
84 105 </li> -->
... ... @@ -151,7 +172,7 @@
151 172 <li>
152 173 <a href="javascript:;" id="addDownStation"><i class="fa fa-plus"></i> 添加站点</a>
153 174 </li>
154   - <li class="divider"> </li>
  175 + <!--<li class="divider"> </li>-->
155 176 <!--<li>
156 177 <a href="javascript:;" id="editDownStation"><i class="fa fa-pencil"></i> 修改站点</a>
157 178 </li>-->
... ... @@ -159,7 +180,11 @@
159 180 <li>
160 181 <a href="javascript:;" id="deleteDownStation"><i class="fa fa-close"></i> 撤销站点</a>
161 182 </li>
162   - <li class="divider"> </li>
  183 + <li class="divider"> </li>
  184 + <!--<li>
  185 + <a href="javascript:;" id="addDownSection"><i class="fa fa-plus"></i> 添加路段</a>
  186 + </li>
  187 + <li class="divider"> </li>-->
163 188 <li>
164 189 <a href="javascript:;" id="batchDownDelete"><i class="fa fa-trash-o"></i> 批量撤销</a>
165 190 </li>
... ... @@ -253,4 +278,111 @@
253 278 <!-- reload事件 -->
254 279 <script src="/pages/base/stationroute/js/stationroute-list-reload.js"></script>
255 280 <!-- 事件监听 -->
256   -<script src="/pages/base/stationroute/js/stationroute-list-events.js"></script>
257 281 \ No newline at end of file
  282 +<script src="/pages/base/stationroute/js/stationroute-list-events.js"></script>
  283 +
  284 +<script id="add_draw_polyline-temp" type="text/html">
  285 + <div class="add_road_search_point_wrap ">
  286 + <div class="buffer_edit_body" >
  287 + <div class="_title">绘制路段</div>
  288 + <div class="form-horizontal" id="add_station_form">
  289 + <input type="hidden" value="{{id}}" name="id">
  290 + <input type="hidden" id="bsectionVectorInput"> <!--路段-->
  291 +
  292 + <div class="form-group">
  293 + <div class="col-md-12">
  294 + <input type="text" class="input-medium" name="sectionName" id="sectionNameInput" placeholder="路段名">
  295 + </div>
  296 + </div>
  297 +
  298 + <div class="form-group">
  299 + <div class="col-md-5">
  300 + <span class="draw_polyline_switch"><a>暂停绘制</a></span>
  301 + </div>
  302 + <div class="col-md-6 btns">
  303 + <button class="sbmint-btn btn-sm" id="addSectionSbmintBtn">确定</button>
  304 + <button class="cancel-btn btn-sm" id="addSectionCancelBtn">取消</button>
  305 + </div>
  306 + </div>
  307 + </div>
  308 + </div>
  309 + </div>
  310 +</script>
  311 +
  312 +<script type="text/javascript">
  313 + setTimeout(function () {
  314 + // 百度地图API功能
  315 + function G(id) {
  316 + return document.getElementById(id);
  317 + }
  318 +
  319 + var myMap = WorldsBMap.getmapBValue();
  320 +
  321 + var ac = new BMap.Autocomplete( //建立一个自动完成的对象
  322 + {"input" : "searchInput"
  323 + ,"location" : myMap
  324 + });
  325 +
  326 + ac.addEventListener("onhighlight", function(e) { //鼠标放在下拉列表上的事件
  327 + var str = "";
  328 + var _value = e.fromitem.value;
  329 + var value = "";
  330 + if (e.fromitem.index > -1) {
  331 + value = _value.province + _value.city + _value.district + _value.street + _value.business;
  332 + }
  333 + str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;
  334 +
  335 + value = "";
  336 + if (e.toitem.index > -1) {
  337 + _value = e.toitem.value;
  338 + value = _value.province + _value.city + _value.district + _value.street + _value.business;
  339 + }
  340 + str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
  341 + G("searchResultPanel").innerHTML = str;
  342 + });
  343 +
  344 + var myValue;
  345 + ac.addEventListener("onconfirm", function(e) { //鼠标点击下拉列表后的事件
  346 + var _value = e.item.value;
  347 + myValue = _value.province + _value.city + _value.district + _value.street + _value.business;
  348 + G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;
  349 +
  350 + setPlace();
  351 + });
  352 +
  353 + function setPlace(){
  354 + // myMap.clearOverlays(); //清除地图上所有覆盖物
  355 + WorldsBMap.clearOtherOverlay();
  356 + function myFun(){
  357 + var pp = local.getResults().getPoi(0) == undefined? null:local.getResults().getPoi(0).point;
  358 + if(pp) {
  359 + myMap.centerAndZoom(pp, 20);
  360 + myMap.addOverlay(new BMap.Marker(pp)); //添加标注
  361 + } else {
  362 + layer.msg('找不到您输入的位置!')
  363 + }
  364 + }
  365 + var local = new BMap.LocalSearch(myMap, { //智能搜索
  366 + onSearchComplete: myFun
  367 + });
  368 + local.search(myValue);
  369 + }
  370 + $("#searchInput").on('input propertychange change', function () {
  371 + if($("#searchInput").val() != null && $("#searchInput").val() != "")
  372 + $('.search_panel .clear').removeClass('hide');
  373 + else {
  374 + WorldsBMap.clearOtherOverlay();
  375 + $('.search_panel .clear').addClass('hide');
  376 + }
  377 + });
  378 +
  379 + $('.search_panel .clear').on('click',function () {
  380 + WorldsBMap.clearOtherOverlay();
  381 + $("#searchInput").val('');
  382 + $("#searchInput").change();
  383 + });
  384 + $('.search_panel .search_button').on('click',function () {
  385 + myValue = $("#searchInput").val();
  386 + setPlace();
  387 + });
  388 + },1000);
  389 +</script>
258 390 \ No newline at end of file
... ...
src/main/resources/static/pages/base/stationroute/station_tabledate.html
... ... @@ -56,8 +56,8 @@
56 56 </div>
57 57 </div>
58 58 <div class="modal-footer">
59   - <button type="button" class="btn default" data-dismiss="modal">取消</button>
60 59 <button type="button" class="btn btn-primary" id="stationTabledatenextButton">确定</button>
  60 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
61 61 </div>
62 62 </div>
63 63 </div>
... ...
src/main/resources/static/pages/base/timesmodel/js/v2/core/InternalScheduleObj.js
1   -/**
2   - * 内部行车计划对象。
3   - * @constructor
4   - */
5   -var InternalScheduleObj = function(paramObj, lpArray, factory) {
6   - // 参数对象
7   - var _paramObj = paramObj;
8   - // 外部的路牌数组
9   - var _lpArray = lpArray;
10   - // 工厂对象
11   - var _factory = factory;
12   -
13   - //------------------ 初始化方法1,以及计算关联的内部变量 -----------------//
14   - var _qIsUp; // 每一圈是上行开始还是下行开始
15   - var _qCount = 0; // 总的圈数
16   - var _internalLpArray = []; // 内部对象数组
17   - var _aBxDesc = [ // 各种班型描述(班型名称,平均工时,平均需要的班次数,平均工时)
18   - {'sType':'六工一休', 'fHoursV':6.66, 'fBcCount': 0, 'fAverTime': 0},
19   - {'sType':'五工一休', 'fHoursV':6.85, 'fBcCount': 0, 'fAverTime': 0},
20   - {'sType':'四工一休', 'fHoursV':7.14, 'fBcCount': 0, 'fAverTime': 0},
21   - {'sType':'三工一休', 'fHoursV':7.61, 'fBcCount': 0, 'fAverTime': 0},
22   - {'sType':'二工一休', 'fHoursV':8.57, 'fBcCount': 0, 'fAverTime': 0},
23   - {'sType':'一工一休', 'fHoursV':11.42, 'fBcCount': 0, 'fAverTime': 0},
24   - {'sType':'五工二休', 'fHoursV':7.99, 'fBcCount': 0, 'fAverTime': 0},
25   - {'sType':'无工休', 'fHoursV':5.43, 'fBcCount': 0, 'fAverTime': 0}
26   - ];
27   -
28   - var _fnInitFun1 = function() { // 初始化方法1
29   - console.log("//---------------- 行车计划,初始化方法1 start ----------------//");
30   -
31   - //----------------------- 1、确定上标线的方向,圈的方向 -------------------//
32   -
33   - // 确定_qIsUp,哪个方向的首班车晚就用哪个
34   - _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore(
35   - _paramObj.getDownFirstDTimeObj()) ? false : true;
36   - // 上标线开始时间,就是方向的首班车时间
37   - var st = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
38   - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
39   - var et;
40   - var et_IsUp;
41   - if (_paramObj.getUpLastDtimeObj().isBefore(
42   - _paramObj.getDownLastDTimeObj())) {
43   - et = _paramObj.getDownLastDTimeObj();
44   - et_IsUp = false;
45   - } else {
46   - et = _paramObj.getUpLastDtimeObj();
47   - et_IsUp = true;
48   - }
49   -
50   - //------------------------ 2、计算总共有多少圈 ------------------------//
51   -
52   - // 以开始时间,结束时间,构造上标线用连班班次发车时间
53   - var bcFcsjArrays = []; // 班次发车时间对象数组
54   - var bcArsjArrays = []; // 班次到达时间对象数组
55   - var isUp = _qIsUp; // 方向
56   - var bcCount = 1; // 班次数
57   -
58   - var _kssj = st; // 开始时间
59   - var _bcsj = paramObj.calcuTravelTime(_kssj, isUp); // 班次历时
60   - var _arrsj = paramObj.addMinute(_kssj, _bcsj); // 到达时间
61   - var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj); // 停站时间
62   -
63   - do {
64   - bcFcsjArrays.push(_kssj);
65   - bcArsjArrays.push(_arrsj);
66   -
67   - _kssj = paramObj.addMinute(_kssj, _bcsj + _stoptime);
68   - _bcsj = paramObj.calcuTravelTime(_kssj, isUp);
69   - _arrsj = paramObj.addMinute(_kssj, _bcsj);
70   - _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj);
71   -
72   - bcCount ++;
73   - isUp = !isUp;
74   - } while(_kssj.isBefore(et));
75   - bcCount--; // 因为先做do,所以总的班次要减1
76   - //if (bcCount > 0 && bcArsjArrays[bcCount - 1].isAfter(et)) {
77   - // // 如果最后一个班次的到达时间超过结束时间,也要去除
78   - // bcFcsjArrays.splice(bcCount - 1, 1);
79   - // bcArsjArrays.splice(bcCount - 1, 1);
80   - // bcCount--;
81   - //}
82   - var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈
83   - var _qCount_p2 = bcCount % 2; // 余下的1个班次也算一圈
84   -
85   - // 利用连班数组计算圈数
86   - _qCount = 1; // 前面加1圈,补中标线的班次
87   - _qCount += _qCount_p1;
88   - _qCount += _qCount_p2;
89   -
90   - // 计算最后是不是还要补一圈
91   - if (_qCount > 1) { // 总的圈数就1圈,没必要加了(其实是不可能的,除非参数里问题)
92   - if (_qCount_p2 == 0) { // 没有余下班次,整数圈数
93   - // 最后一个班次的方向一定和开始的方向相反,如:上-下,上-下,上-下,一共三圈,最后一个班次为下行
94   - // 判定最后一个班次的方向和上标线判定结束时间的班次方向是否一致
95   - if (!_qIsUp == et_IsUp) {
96   - // 一致不用加圈数
97   - } else {
98   - // 不一致需要加圈补最后一个结束时间班次
99   - _qCount ++;
100   - }
101   - } else {
102   - // 有余下的圈数,最后要不补的班次不管上行,下行都在这一圈里
103   - // 不需要在补圈数了
104   - }
105   - }
106   -
107   - //------------------------ 3、根据路牌数,圈数创建路牌对象 ----------------------//
108   -
109   - // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中
110   - var i;
111   - for (i = 0; i < _lpArray.length; i++) {
112   - _internalLpArray.push(new InternalLpObj(_lpArray[i], _qCount, _qIsUp));
113   - }
114   - // 初始化上标线,从第1圈开始
115   - _internalLpArray[0].initDataFromTimeToTime(bcFcsjArrays[0], et, _qIsUp, 1, _paramObj, _factory);
116   -
117   - // 以上标线为基础,计算各种班型工时对应的圈数、班次数
118   - var aBcArray = _internalLpArray[0].getBcArray();
119   - aBcArray[0].fnSetIsFirstBc(true); // 设置首班班次标识
120   -
121   - if (aBcArray.length % 2 != 0) { // 不能整除2,去除一个班次计算
122   - aBcArray.splice(aBcArray.length - 1, 1);
123   - }
124   -
125   - // 午饭吃饭时间
126   - var iLTime = _paramObj.fnGetLunchTime();
127   - // 晚饭吃饭时间
128   - var iDTime = _paramObj.fnGetDinnerTime();
129   - // 出场时间
130   - var iOutTime = _qIsUp ? _paramObj.getUpOutTime() : _paramObj.getDownOutTime();
131   - // 进场时间
132   - var iInTime = _qIsUp ? _paramObj.getDownInTime() : _paramObj.getUpInTime();
133   - // 例保时间
134   - var iBTime = _paramObj.getLbTime();
135   -
136   - var sum = 0; // 总班次时间
137   - for (i = 0; i < aBcArray.length; i++) {
138   - sum += aBcArray[i].getBcTime() + aBcArray[i].getStopTime();
139   - }
140   - sum += iLTime; // 加午饭时间
141   - sum += iDTime; // 加晚饭时间
142   - for (i = 0; i < _aBxDesc.length; i++) {
143   - _aBxDesc[i].fAverTime = sum / (aBcArray.length / 2); // 平均周转时间不算进出场,例保时间
144   -
145   - // 计算5休2的班次数(双进出场,4个例保)
146   - if (i == 6) {
147   - _aBxDesc[i].fQCount =
148   - (_aBxDesc[i].fHoursV * 60 - iOutTime * 2 - iInTime * 2 - iBTime * 4) /
149   - _aBxDesc[i].fAverTime;
150   - _aBxDesc[i].fBcCount = _aBxDesc[i].fQCount * 2;
151   - } else { // 进出场,2个例保
152   - _aBxDesc[i].fQCount =
153   - (_aBxDesc[i].fHoursV * 60 - iOutTime - iInTime - iBTime * 2) /
154   - _aBxDesc[i].fAverTime;
155   - _aBxDesc[i].fBcCount = _aBxDesc[i].fQCount * 2;
156   - }
157   - }
158   -
159   -
160   - // 在第一个班次之前再添加一个模拟班次,用于中标线的作用
161   - // 那一圈必定是低谷,而且圈索引0,班次索引1,暂时标记,最后删除
162   - var iFirstStopTime =
163   - _paramObj.fnCalcuFixedStopNumber(
164   - _paramObj.addMinute(aBcArray[0].getFcTimeObj(), -10),
165   - _qIsUp
166   - );
167   - var iXXTime = _qIsUp ? _paramObj.getDownTroughTime() : _paramObj.getUpTroughTime();
168   - var oFlagBc = _factory.createBcObj( // 标记班次
169   - _internalLpArray[0],
170   - "normal",
171   - !_qIsUp,
172   - 1,
173   - _paramObj.addMinute(aBcArray[0].getFcTimeObj(), -(iFirstStopTime + iXXTime)),
174   - _paramObj
175   - );
176   - oFlagBc.fnSetDelFlag(true); // 标记了删除记号
177   -
178   - _internalLpArray[0].setBc(0, 1, oFlagBc);
179   -
180   - // 在最后一圈也补上一个或者2个模拟班次,暂时标记,最后需要删除
181   - var aMaxBcIndex = _internalLpArray[0].getMaxBcObjPosition();
182   - if (aMaxBcIndex[0] == _qCount - 1) { // 可能加半圈
183   - oFlagBc = _factory.createBcObj( // 标记班次
184   - _internalLpArray[0],
185   - "normal",
186   - !_qIsUp,
187   - 1,
188   - _paramObj.addMinute(
189   - _internalLpArray[0].getBc(_qCount - 1, 0).getArrTimeObj(),
190   - _internalLpArray[0].getBc(_qCount - 1, 0).getStopTime()),
191   - _paramObj
192   - );
193   - oFlagBc.fnSetDelFlag(true); // 标记了删除记号
194   - _internalLpArray[0].setBc(_qCount - 1, 1, oFlagBc);
195   -
196   - } else { // 加完整的一圈
197   - oFlagBc = _factory.createBcObj( // 标记班次
198   - _internalLpArray[0],
199   - "normal",
200   - _qIsUp,
201   - 1,
202   - _paramObj.addMinute(
203   - _internalLpArray[0].getBc(_qCount - 2, 1).getArrTimeObj(),
204   - _internalLpArray[0].getBc(_qCount - 2, 1).getStopTime()),
205   - _paramObj
206   - );
207   - oFlagBc.fnSetDelFlag(true); // 标记了删除记号
208   - _internalLpArray[0].setBc(_qCount - 1, 0, oFlagBc);
209   -
210   - oFlagBc = _factory.createBcObj( // 标记班次
211   - _internalLpArray[0],
212   - "normal",
213   - !_qIsUp,
214   - 1,
215   - _paramObj.addMinute(
216   - _internalLpArray[0].getBc(_qCount - 1, 0).getArrTimeObj(),
217   - _internalLpArray[0].getBc(_qCount - 1, 0).getStopTime()),
218   - _paramObj
219   - );
220   - oFlagBc.fnSetDelFlag(true); // 标记了删除记号
221   - _internalLpArray[0].setBc(_qCount - 1, 1, oFlagBc);
222   -
223   - }
224   -
225   - console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") +
226   - "上行末班车时间:" + _paramObj.getUpLastDtimeObj().format("HH:mm"));
227   - console.log("下行首班车时间:" + _paramObj.getDownFirstDTimeObj().format("HH:mm") +
228   - "下行末班车时间:" + _paramObj.getDownLastDTimeObj().format("HH:mm"));
229   - console.log("总共计算的圈数:" + _qCount);
230   - console.log("圈的方向isUP:" + _qIsUp);
231   - console.log("班型描述(以下):");
232   - console.log(_aBxDesc);
233   - console.log("所有路牌间隔描述(以下):");
234   - for (i = 0; i < _internalLpArray.length; i++) {
235   - console.log(_internalLpArray[i]._$_aVerticalIntervalTime);
236   - }
237   - console.log("//---------------- 行车计划,初始化方法1 end ----------------//");
238   -
239   - };
240   -
241   - //------------------ 初始化方法2,以及计算关联的内部变量 ----------------//
242   - var _approximate_zgfQIndex; // 预估早高峰车辆从第几圈开始全部发出
243   - var _approximate_zgfBIndex; // 预估早高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
244   - var _approximate_wgfQIndex; // 预估晚高峰车辆从第几圈开始全部发出
245   - var _approximate_wgfBIndex; // 预估晚高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
246   -
247   - var _fnInitFun2 = function() { // 初始化方法2
248   - console.log("//---------------- 行车计划,初始化方法2 start ----------------//");
249   -
250   - //------------------------ 1、计算车辆总数 ------------------------//
251   - // 是用高峰上行周转时间除以高峰平均间隔得到的
252   - // 这样算还算合理,车辆不多不少,待以后有新的算法再修正
253   - var iClCount = _paramObj.calcuClzx();
254   -
255   - //------------------------ 2、计算所有路牌的发车在各个圈中的间隔 --------------------//
256   - var i;
257   - var j;
258   - var iBindex = 1;
259   - var iZzsj;
260   - var oLp;
261   - var iC1;
262   - var iC2;
263   -
264   - for (i = 0; i < _qCount - 1; i++) {
265   - while (iBindex <= 1) {
266   - // 每圈每个方向的周转时间不一致,以上标线为主
267   - oLp = _internalLpArray[0];
268   - iZzsj = oLp.getBc(i + 1, iBindex).getFcTimeObj().diff(
269   - oLp.getBc(i, iBindex).getFcTimeObj(), "m"
270   - );
271   -
272   - iC1 = Math.floor(iZzsj / iClCount);
273   - iC2 = iZzsj % iClCount;
274   -
275   - for (j = 0; j < iClCount - iC2; j++) {
276   - oLp = _internalLpArray[j];
277   - oLp.fnSetVerticalIntervalTime(i, iBindex, iC1);
278   - }
279   -
280   - for (j = 0; j < iC2; j++) {
281   - oLp = _internalLpArray[iClCount - iC2 + j];
282   - oLp.fnSetVerticalIntervalTime(i, iBindex, iC1 + 1);
283   - }
284   -
285   - iBindex ++;
286   -
287   - }
288   - iBindex = 0;
289   - }
290   - // 最后一圈没有下一圈的参照,周转时间没发获取,由于都是低谷,所以使用倒数第二圈的间隔最为最后一圈的间隔
291   - for (i = 0; i < _internalLpArray.length; i++) {
292   - oLp = _internalLpArray[i];
293   - oLp.fnSetVerticalIntervalTime(_qCount - 1, 0, oLp.fnGetVerticalIntervalTime(_qCount - 2, 0));
294   - oLp.fnSetVerticalIntervalTime(_qCount - 1, 1, oLp.fnGetVerticalIntervalTime(_qCount - 2, 1));
295   - }
296   -
297   - //------------------------ 3、预估早高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
298   -
299   - // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次
300   - // 以这个班次为早高峰起点,全部出车策略
301   - var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
302   - _paramObj.getMPeakStartTimeObj(), true, true);
303   - var qIndex = qbcIndexArray[0]; // 第几圈
304   - var bIndex = qbcIndexArray[1]; // 第几个班次
305   -
306   - for (i = 1; i < _internalLpArray.length; i++) {
307   - _fnGenerateBcAndSetBc(i, qIndex, bIndex);
308   - }
309   -
310   - _approximate_zgfQIndex = qIndex;
311   - _approximate_zgfBIndex = bIndex;
312   -
313   - //------------------------ 4、预估晚高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
314   -
315   - // 以上标线为标准,查找离晚高峰开始时间最近的班次作为晚高峰开始班次
316   - // 以这个班次为早高峰起点,全部出车策略
317   - qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
318   - _paramObj.getEPeakStartTimeObj(), true, true);
319   - qIndex = qbcIndexArray[0]; // 第几圈
320   - bIndex = qbcIndexArray[1]; // 第几个班次
321   -
322   - for (i = 1; i < _internalLpArray.length; i++) {
323   - _fnGenerateBcAndSetBc(i, qIndex, bIndex);
324   - }
325   -
326   - _approximate_wgfQIndex = qIndex;
327   - _approximate_wgfBIndex = bIndex;
328   -
329   - console.log("早高峰周转时间(固定最大停战时间):" + _paramObj.calcuPeakZzsj() + "分钟");
330   - console.log("早高峰发车时间范围:" + _paramObj.getMPeakMinFcjx() + "分钟 --- " + _paramObj.getMPeakMaxFcjx() + "分钟");
331   - console.log("预估早高峰第" + _approximate_zgfQIndex + "(index)圈,第" + _approximate_zgfBIndex + "(index)班次车辆全部发出");
332   - console.log("预估晚高峰第" + _approximate_wgfQIndex + "(index)圈,第" + _approximate_wgfBIndex + "(index)班次车辆全部发出");
333   - console.log("//---------------- 行车计划,初始化方法2 end ----------------//");
334   - };
335   -
336   - //----------------------- 初始化方法3,计算连班分班的路牌分布 ----------------//
337   - var _iBx_lb_lpcount; // 连班路牌数
338   - var _iBx_5_2_fb_lpcount; // 5休2分班路牌数
339   - var _iBx_other_fb_lpcount; // 其他分班路牌数
340   -
341   - var _fnInitFun3 = function() { // 初始化方法3
342   - console.log("//---------------- 行车计划,初始化方法3 start ----------------//");
343   -
344   - //--------------------- 1、计算分班连班班型车辆分布数 --------------------//
345   - // 总共车辆数(高峰最大车辆数)
346   - var iCls = _paramObj.calcuClzx();
347   - // 低谷最少配车(连班车数量)
348   - var iDgminpc = Math.round(_paramObj.calcuTroughZzsj() / _paramObj.getTroughMaxFcjx());
349   - // 加班车路牌数(做5休2的路牌数)
350   - var i_5_2_lpes = _paramObj.getJBLpes();
351   -
352   - // 做些简单的验证
353   - if (iCls < iDgminpc) {
354   - alert("总配车数小于低谷最小配车");
355   - throw "总配车数小于低谷最小配车";
356   - }
357   - if (iDgminpc < 2) {
358   - alert("连班路牌小于2,办不到啊");
359   - throw "连班路牌小于2,办不到啊";
360   - }
361   - if (iCls - iDgminpc < i_5_2_lpes) {
362   - alert("总分班路牌数小于加班路牌数");
363   - throw "总分班路牌数小于加班路牌数";
364   - }
365   -
366   - //// 修正连班路牌数,班次间隔大于20的,加1,直至班次间隔小于20
367   - //while(_paramObj.calcuPeakZzsj() / iDgminpc > 20) {
368   - // iDgminpc ++;
369   - //}
370   - _iBx_lb_lpcount = iDgminpc;
371   -
372   - _iBx_5_2_fb_lpcount = i_5_2_lpes;
373   - _iBx_other_fb_lpcount = iCls - _iBx_lb_lpcount - i_5_2_lpes;
374   -
375   - //------------------------ 2、利用间隔法计算连班路牌分布 --------------------//
376   - var i;
377   - var j;
378   - var iC1 = Math.floor(_internalLpArray.length / _iBx_lb_lpcount);
379   - var iC2 = _internalLpArray.length % _iBx_lb_lpcount;
380   - var iLpIndex;
381   -
382   - for (i = 0; i < _iBx_lb_lpcount - iC2; i++) {
383   - iLpIndex = i * iC1;
384   - _internalLpArray[iLpIndex].setBxLb(true);
385   - _internalLpArray[iLpIndex].setBxDesc("连班");
386   - }
387   - for (j = 0; j < iC2; j++) {
388   - iLpIndex = i * iC1 + j * (iC1 + 1);
389   - _internalLpArray[iLpIndex].setBxLb(true);
390   - _internalLpArray[iLpIndex].setBxDesc("连班");
391   - }
392   -
393   - //------------------------ 3、利用间隔法计算分班班型路牌分布 --------------------//
394   - // 获取分班路牌索引
395   - var aNotLbIndexes = [];
396   - for (i = 0; i < _internalLpArray.length; i++) {
397   - if (!_internalLpArray[i].isBxLb()) {
398   - aNotLbIndexes.push(i);
399   - }
400   - }
401   - // 先5休2分班
402   - iC1 = Math.floor(aNotLbIndexes.length / _iBx_5_2_fb_lpcount);
403   - iC2 = aNotLbIndexes.length % _iBx_5_2_fb_lpcount;
404   -
405   - for (i = 0; i < _iBx_5_2_fb_lpcount - iC2; i++) {
406   - iLpIndex = aNotLbIndexes[i * iC1];
407   - _internalLpArray[iLpIndex].setBxLb(false);
408   - _internalLpArray[iLpIndex].setBxFb(true);
409   - _internalLpArray[iLpIndex].setBxFb5_2(true);
410   - _internalLpArray[iLpIndex].setBxDesc("5休2分班");
411   - }
412   - for (i = 0; i < iC2; i++) {
413   - iLpIndex = aNotLbIndexes[_iBx_5_2_fb_lpcount - iC2 + i * (iC1 + 1)];
414   - _internalLpArray[iLpIndex].setBxLb(false);
415   - _internalLpArray[iLpIndex].setBxFb(true);
416   - _internalLpArray[iLpIndex].setBxFb5_2(true);
417   - _internalLpArray[iLpIndex].setBxDesc("5休2分班");
418   - }
419   - // 其他分班
420   - for (i = 0; i < aNotLbIndexes.length; i++) {
421   - iLpIndex = aNotLbIndexes[i];
422   - if (!_internalLpArray[iLpIndex].isBxFb5_2()) {
423   - _internalLpArray[iLpIndex].setBxLb(false);
424   - _internalLpArray[iLpIndex].setBxFb(true);
425   - _internalLpArray[iLpIndex].setBxFb5_2(false);
426   - _internalLpArray[iLpIndex].setBxDesc("其他分班");
427   - }
428   - }
429   -
430   - console.log("高峰周转时间:" + _paramObj.calcuPeakZzsj());
431   - console.log("连班路牌数:" + _iBx_lb_lpcount);
432   - console.log("5休2分班路牌数:" + _iBx_5_2_fb_lpcount);
433   - console.log("其他分班路牌数:" + _iBx_other_fb_lpcount);
434   - var aLbIndexes = [];
435   - for (i = 0; i < _internalLpArray.length; i++) {
436   - if (_internalLpArray[i].isBxLb()) {
437   - aLbIndexes.push(i);
438   - }
439   - }
440   - console.log("连班路牌indexes=" + aLbIndexes);
441   - var a_5_2_fbIndexes = [];
442   - for (i = 0; i < _internalLpArray.length; i++) {
443   - if (_internalLpArray[i].isBxFb() && _internalLpArray[i].isBxFb5_2()) {
444   - a_5_2_fbIndexes.push(i);
445   - }
446   - }
447   - console.log("5休2分班路牌indexes=" + a_5_2_fbIndexes);
448   - var a_other_fbIndexes = [];
449   - for (i = 0; i < _internalLpArray.length; i++) {
450   - if (_internalLpArray[i].isBxFb() && !_internalLpArray[i].isBxFb5_2()) {
451   - a_other_fbIndexes.push(i);
452   - }
453   - }
454   - console.log("其他分班路牌indexes=" + a_other_fbIndexes);
455   -
456   - console.log("//---------------- 行车计划,初始化方法3 end ----------------//");
457   - };
458   -
459   - //----------------------- 初始化方法4,计算中标线位置 -------------------------//
460   - var _iZbx_lpIndex; // 中标线对应第几个路牌
461   -
462   - var _fnInitFun4 = function() { // 初始化方法4
463   - console.log("//---------------- 行车计划,初始化方法4 start ----------------//");
464   -
465   - //---------------------------- 1、模拟一个中标线,使用临时路牌 ----------------------//
466   - // 构造中标线
467   - // 中标线开始时间,就是方向的首班车时间
468   - var oSt = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
469   - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
470   - // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
471   - var oEt;
472   - if (_paramObj.getUpLastDtimeObj().isBefore(
473   - _paramObj.getDownLastDTimeObj())) {
474   - oEt = _paramObj.getDownLastDTimeObj();
475   - } else {
476   - oEt = _paramObj.getUpLastDtimeObj();
477   - }
478   -
479   - var oTempLp = new InternalLpObj({lpNo: -999, lpName: "-999"}, _qCount, _qIsUp);
480   - oTempLp.initDataFromTimeToTime(
481   - oSt,
482   - oEt,
483   - !_qIsUp,
484   - 0,
485   - _paramObj,
486   - _factory
487   - );
488   -
489   - //------------------------ 2、找出中标线的早高峰班次,计算应该插在当前路牌数组的那个位置 ----------------//
490   - // 找出中标线对应的早高峰的班次对象
491   - var oZb_gf_bc = oTempLp.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
492   - //alert(oZb_gf_bc.getFcTimeObj().format("HH:mm"));
493   -
494   - // 把所有连班路牌高峰班次重新构造成一个一个的圈数组,计算对应中标线最近的是第几个路牌
495   - // 中标线和上标线一样在连班路牌上
496   - var aTempq = [];
497   - var oTempq;
498   - var oTempb;
499   - var i;
500   - var oLp;
501   -
502   - var aLbIndexes = []; // 连班的路牌索引
503   - for (i = 0; i < _internalLpArray.length; i++) {
504   - if (_internalLpArray[i].isBxLb()) {
505   - aLbIndexes.push(i);
506   - }
507   - }
508   -
509   - for (i = 0; i < aLbIndexes.length; i++) {
510   - oLp = _internalLpArray[aLbIndexes[i]];
511   -
512   - oTempb = oLp.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
513   - if (oTempb.isUp() == _qIsUp) {
514   - oTempq = new InternalGroupObj(oLp, _qIsUp, oTempb, undefined);
515   - } else {
516   - oTempq = new InternalGroupObj(oLp, _qIsUp, undefined, oTempb);
517   - }
518   - aTempq.push(oTempq);
519   -
520   - }
521   -
522   - var aTtindex = oTempLp.fnGetQBcIndexWithFcTimeFromGroupArray( // 找出最接近中标线的路牌索引
523   - oZb_gf_bc.getFcTimeObj(),
524   - aTempq,
525   - true,
526   - true
527   - );
528   -
529   - _iZbx_lpIndex = aLbIndexes[aTtindex[0]]; // 中标线放在第几个路牌
530   -
531   - oTempLp.getMinBcObj().fnSetIsFirstBc(true); // 设置首班班次标识
532   -
533   - if (_iZbx_lpIndex == 0) { // 如果中标线和上标线一致
534   - var oFirstBcIndexes = oTempLp.getMinBcObjPosition();
535   - var oFirstBc = oTempLp.getMinBcObj();
536   - oFirstBc.setLp(_internalLpArray[_iZbx_lpIndex]);
537   - oFirstBc.fnSetDelFlag(false);
538   - _internalLpArray[_iZbx_lpIndex].setBc(oFirstBcIndexes[0], oFirstBcIndexes[1], oFirstBc);
539   - } else {
540   - oTempLp.setLp(_lpArray[_iZbx_lpIndex]); // 设置原始路牌对象
541   - oTempLp._$_aVerticalIntervalTime = _internalLpArray[_iZbx_lpIndex]._$_aVerticalIntervalTime; // 设置纵向最小发车间隔
542   - oTempLp.setBxLb(_internalLpArray[_iZbx_lpIndex].isBxLb());
543   - oTempLp.setBxFb(_internalLpArray[_iZbx_lpIndex].isBxFb());
544   - oTempLp.setBxFb5_2(_internalLpArray[_iZbx_lpIndex].isBxFb5_2());
545   -
546   - // 修正除了第一个班次外,其余其他班次
547   - var iBcindex = 0;
548   - for (i = 1; i < _qCount; i++) {
549   - while (iBcindex <= 1) {
550   - if (oTempLp.getBc(i, iBcindex)) { // 替换存在的班次
551   - oTempLp.setBc(i, iBcindex, _fnGenerateBc(_iZbx_lpIndex, i, iBcindex));
552   - }
553   - iBcindex ++;
554   - }
555   - iBcindex = 0;
556   - }
557   -
558   - _internalLpArray[_iZbx_lpIndex] = oTempLp;
559   - }
560   -
561   - console.log("中标线对应第" + (_iZbx_lpIndex + 1) + "个路牌");
562   -
563   - console.log("//---------------- 行车计划,初始化方法4 end ----------------//");
564   - };
565   -
566   - //-------------------- 重要的内部方法 -----------------------//
567   - /**
568   - * 核心方法,利用路牌间隔纵向生成班次。
569   - * @param iLpindex 路牌索引
570   - * @param iQindex 圈索引
571   - * @param iBcindex 班次索引
572   - * @returns object InternalBcObj,失败 false
573   - */
574   - var _fnGenerateBc = function(iLpindex, iQindex, iBcindex) {
575   - // 以上标线为起始点,使用路牌在不同圈,班次索引的发车间隔,计算班次
576   - // 注意,发车间隔是指下一个班次应该距离当前班次间隔,是从下往上的
577   -
578   - // 1、参数验证
579   - if (iLpindex == 0) { // 上标线的班次不需要生成
580   - return false;
581   - }
582   -
583   - // 2、计算间隔
584   - var i;
585   - var oLp;
586   - var iTime = 0;
587   - for (i = 0; i < iLpindex; i++) {
588   - oLp = _internalLpArray[i];
589   - iTime += oLp.fnGetVerticalIntervalTime(iQindex, iBcindex);
590   - }
591   -
592   - // 3、生成班次
593   - var _oKsbc = _internalLpArray[0].getBc(iQindex, iBcindex);
594   - if (!_oKsbc) {
595   - return false;
596   - }
597   - var _oKssj = _paramObj.addMinute(_oKsbc.getFcTimeObj(), iTime);
598   - var _oBc = _factory.createBcObj(
599   - _internalLpArray[iLpindex],
600   - "normal", _oKsbc.isUp(),
601   - 1, _oKssj, _paramObj);
602   -
603   - return _oBc;
604   -
605   - };
606   -
607   - /**
608   - * 核心方法,在指定位置生成班次并添加到路牌指定位置中。
609   - * @param lpIndex 第几个路牌
610   - * @param qIndex 第几圈
611   - * @param bcIndex 第几个班次
612   - */
613   - var _fnGenerateBcAndSetBc = function(lpIndex, qIndex, bcIndex) {
614   - var _bcObj = _fnGenerateBc(lpIndex, qIndex, bcIndex);
615   - if (_bcObj) {
616   - _internalLpArray[lpIndex].setBc(qIndex, bcIndex, _bcObj);
617   - }
618   - };
619   -
620   - /**
621   - * 获取班次列表。
622   - * @param oIsUp 是否上行
623   - * @param oStartTime 开始时间对象
624   - * @returns [(InternalBcObj)]
625   - */
626   - var _fnGetBcList2 = function(oIsUp, oStartTime) {
627   - var i;
628   - var j;
629   - var oLp;
630   - var oBc;
631   - var aBc = [];
632   -
633   - for (j = 0; j < _qCount; j++) {
634   - for (i = 0; i < _internalLpArray.length; i++) {
635   - oLp = _internalLpArray[i];
636   - oBc = oLp.getBc(
637   - j,
638   - _qIsUp == oIsUp ? 0 : 1
639   - );
640   - if (oBc && oBc.getFcTimeObj().isAfter(oStartTime)) {
641   - aBc.push(oBc);
642   - }
643   - }
644   - }
645   -
646   - var aBcFcTime = [];
647   - for (i = 0; i < aBc.length; i++) {
648   - oBc = aBc[i];
649   - aBcFcTime.push(oBc.getFcTimeObj().format("HH:mm"));
650   - }
651   - console.log((oIsUp ? "上行班次列表:" : "下行班次列表:") + aBcFcTime.join(","));
652   -
653   - return aBc;
654   - };
655   -
656   - /**
657   - * 获取班次列表。
658   - * @param isUp boolean 是否上行
659   - * @returns [(InternalBcObj)]
660   - */
661   - var _fnGetBcList = function(isUp) {
662   - var i;
663   - var j;
664   - var oLp;
665   - var oBc;
666   - var aBc = [];
667   -
668   - for (j = 0; j < _qCount; j++) {
669   - for (i = 0; i < _internalLpArray.length; i++) {
670   - oLp = _internalLpArray[i];
671   - oBc = oLp.getBc(
672   - j,
673   - _qIsUp == isUp ? 0 : 1
674   - );
675   - if (oBc) {
676   - aBc.push(oBc);
677   - }
678   - }
679   - }
680   -
681   - var aBcFcTime = [];
682   - for (i = 0; i < aBc.length; i++) {
683   - oBc = aBc[i];
684   - aBcFcTime.push(oBc.getFcTimeObj().format("HH:mm"));
685   - }
686   - console.log((isUp ? "上行班次列表:" : "下行班次列表:") + aBcFcTime.join(","));
687   -
688   - return aBc;
689   - };
690   -
691   - /**
692   - * 查找离指定时间最近的前面的班次索引信息
693   - * @param timeObj 查找时间
694   - * @param isUp 是否上行
695   - * @returns [{路牌index},{圈index},{班次index}]
696   - */
697   - var _fnFindUpClosedBcIndexWithTime = function(timeObj, isUp) {
698   -
699   - var _lpObj;
700   - var _groupObj;
701   - var _bcObj;
702   - var _i;
703   - var _j;
704   - var timediff; // 时间差取绝对值
705   -
706   - var _lpIndex;
707   - var _up_qIndex;
708   - var _up_bIndex;
709   -
710   - for (_i = 0; _i < _qCount; _i++) {
711   - for (_j = 0; _j < _internalLpArray.length; _j++) {
712   - _lpObj = _internalLpArray[_j];
713   - _groupObj = _lpObj.getGroup(_i);
714   - _bcObj = isUp == _qIsUp ? _groupObj.getBc1() : _groupObj.getBc2();
715   - if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
716   - _bcObj = _fnGenerateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
717   - }
718   - if (_bcObj) {
719   - if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) {
720   - if (!timediff) {
721   - timediff = timeObj.diff(_bcObj.getFcTimeObj());
722   - _lpIndex = _j;
723   - _up_qIndex = _i;
724   - _up_bIndex = isUp == _qIsUp ? 0 : 1;
725   - } else {
726   - if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) {
727   - timediff = timeObj.diff(_bcObj.getFcTimeObj());
728   - _lpIndex = _j;
729   - _up_qIndex = _i;
730   - _up_bIndex = isUp == _qIsUp ? 0 : 1;
731   - }
732   - }
733   - }
734   - }
735   - }
736   - }
737   -
738   - if (_lpIndex == undefined) {
739   - return false;
740   - }
741   -
742   - var bcindex = [];
743   - bcindex.push(_lpIndex);
744   - bcindex.push(_up_qIndex);
745   - bcindex.push(_up_bIndex);
746   -
747   - return bcindex;
748   - };
749   -
750   - /**
751   - * 查找离指定时间最近的后面的班次索引信息
752   - * @param timeObj 查找时间
753   - * @param isUp 是否上行
754   - * @returns [{路牌index},{圈index},{班次index}]
755   - */
756   - var _fnFindDownClosedBcIndexWithTime = function(timeObj, isUp) {
757   - var _lpObj;
758   - var _groupObj;
759   - var _bcObj;
760   - var _i;
761   - var _j;
762   - var timediff; // 时间差取绝对值
763   -
764   - var _lpIndex;
765   - var _down_qIndex;
766   - var _down_bIndex;
767   -
768   - var flag;
769   -
770   - for (_i = 0; _i < _qCount; _i++) {
771   - for (_j = 0; _j < _internalLpArray.length; _j++) {
772   - _lpObj = _internalLpArray[_j];
773   - _groupObj = _lpObj.getGroup(_i);
774   - // TODO:bug
775   - _bcObj = isUp == _qIsUp ? _groupObj.getBc1() : _groupObj.getBc2();
776   - if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
777   - _bcObj = _fnGenerateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
778   - }
779   - if (_bcObj) {
780   - //console.log("timeobj -> bcobj diff flag " +
781   - // timeObj.format("HH:mm") + "->" +
782   - // _bcObj.getFcTimeObj().format("HH:mm") +
783   - // timeObj.diff(_bcObj.getFcTimeObj()) +
784   - // (timeObj.diff(_bcObj.getFcTimeObj()) <= 0)
785   - //);
786   -
787   - flag = (timeObj.diff(_bcObj.getFcTimeObj())) <= 0;
788   -
789   - if (flag) {
790   - if (!timediff) {
791   - timediff = timeObj.diff(_bcObj.getFcTimeObj());
792   - _lpIndex = _j;
793   - _down_qIndex = _i;
794   - _down_bIndex = isUp == _qIsUp ? 0 : 1;
795   - } else {
796   - if ((timeObj.diff(_bcObj.getFcTimeObj())) > timediff) {
797   - timediff = timeObj.diff(_bcObj.getFcTimeObj());
798   - _lpIndex = _j;
799   - _down_qIndex = _i;
800   - _down_bIndex = isUp == _qIsUp ? 0 : 1;
801   - }
802   - }
803   - }
804   - }
805   - }
806   - }
807   -
808   - if (_lpIndex == undefined) {
809   - return false;
810   - }
811   -
812   - var bcindex = [];
813   - bcindex.push(_lpIndex);
814   - bcindex.push(_down_qIndex);
815   - bcindex.push(_down_bIndex);
816   -
817   - return bcindex;
818   - };
819   -
820   - /**
821   - * 获取班次索引。
822   - * @param oBc 班次对象
823   - * @returns [{路牌索引},{圈索引},{班次索引}]
824   - */
825   - var _fnGetBcIndex = function(oBc) {
826   - // 路牌索引
827   - var i;
828   - var iLpIndex;
829   - for (i = 0; i < _internalLpArray.length; i++) {
830   - if (_internalLpArray[i]._$$_orign_lp_obj == oBc._$$_internal_lp_obj._$$_orign_lp_obj) {
831   - iLpIndex = i;
832   - break;
833   - }
834   - }
835   - // 圈索引
836   - var j;
837   - var iGroupIndex;
838   - var bFlag = false;
839   - for (i = 0; i < _internalLpArray.length; i++) {
840   - if (bFlag) {
841   - break;
842   - }
843   - for (j = 0; j < _qCount; j++) {
844   - if (_internalLpArray[i]._$_groupBcArray[j] == oBc._$$_internal_group_obj) {
845   - iGroupIndex = j;
846   - bFlag = true;
847   - break;
848   - }
849   - }
850   - }
851   - // 班次索引
852   - var iBcIndex = _qIsUp == oBc.isUp() ? 0 : 1;
853   -
854   - if (iLpIndex == undefined) {
855   - return null;
856   - } else {
857   - return [].concat(iLpIndex, iGroupIndex, iBcIndex);
858   - }
859   -
860   - };
861   -
862   - return {
863   - //------------- 布局初始化方法 ------------//
864   - /**
865   - * 初始化数据,使用标线初始化
866   - */
867   - fnInitDataWithBxLayout: function() {
868   - // 初始化布局1,构造上标线,计算圈数,把上标线数据放入第一个路牌中
869   - _fnInitFun1();
870   - // 初始化布局2,从上标线的某个班次开始,构造所有路牌的早高峰班次,晚高峰班次,计算路牌在各个圈中的间隔
871   - _fnInitFun2();
872   - // 初始化布局3,计算连班分班路牌分布
873   - _fnInitFun3();
874   - // 初始化布局4,计算中标线位置
875   - _fnInitFun4();
876   -
877   - },
878   -
879   - /**
880   - * 调整高峰班次,
881   - * 初始化生成早高峰,晚高峰班次并不准确,因为根据高峰时间段,并不在一个完整圈内,应该是在两个或多个圈之间
882   - * 当初始化定好布局后(上标线,中标线),然后确定每个路牌的班型(连班,分班,5休2分班)后
883   - * 然后重新计算框在高峰时间段内的班次索引,不足的添加,之前多加的删除(只删除分班路牌上的)
884   - * @param isZgf 是否早高峰
885   - * @param isUp 是否上行
886   - */
887   - fnAdjustGfbc : function(isZgf, isUp) {
888   - var oStartTime; // 开始时间
889   - var oEndTime; // 结束时间
890   - var aStartBcIndex; // 开始班次索引
891   - var aEndBcIndex; // 结束班次索引
892   -
893   - oStartTime = isZgf ? _paramObj.getMPeakStartTimeObj() : _paramObj.getEPeakStartTimeObj();
894   - oEndTime = isZgf ? _paramObj.getMPeakEndTimeObj() : _paramObj.getEPeakEndTimeObj();
895   -
896   - aStartBcIndex = _fnFindUpClosedBcIndexWithTime(oStartTime, isUp);
897   - aEndBcIndex = _fnFindDownClosedBcIndexWithTime(oEndTime, isUp);
898   -
899   - var iLpIndex;
900   - var iQIndex;
901   - var iBcIndex;
902   - var iQInternelCount; // 高峰时间段中间包含的圈数
903   - var i;
904   - var j;
905   -
906   - var oLp;
907   -
908   - if (aStartBcIndex && aEndBcIndex) {
909   - iLpIndex = aStartBcIndex[0];
910   - iQIndex = aStartBcIndex[1];
911   - iBcIndex = aStartBcIndex[2];
912   -
913   - // 处理头
914   - // 删除头部多余班次
915   - for (j = 0; j < iLpIndex; j++) {
916   - oLp = _internalLpArray[j];
917   - if (oLp.isBxFb() && oLp.getBc(iQIndex, iBcIndex)) {
918   - oLp.removeBc(iQIndex, iBcIndex);
919   - }
920   - }
921   -
922   - for (j = iLpIndex; j < _internalLpArray.length; j++) {
923   - oLp = _internalLpArray[j];
924   - if (!oLp.getBc(iQIndex, iBcIndex)) {
925   - _fnGenerateBcAndSetBc(j, iQIndex, iBcIndex);
926   - }
927   - }
928   -
929   - // 处理中间
930   - iQInternelCount = aEndBcIndex[1] - aStartBcIndex[1] - 1;
931   - for (i = 1; i <= iQInternelCount; i++) {
932   - oLp = _internalLpArray[iQIndex + i];
933   -
934   - if (!oLp.getBc(iQIndex + i, iBcIndex)) {
935   - _fnGenerateBcAndSetBc(i, iQIndex + i, iBcIndex);
936   - }
937   - }
938   -
939   - // 处理尾部
940   - iLpIndex = aEndBcIndex[0];
941   - iQIndex = aEndBcIndex[1];
942   - iBcIndex = aEndBcIndex[2];
943   -
944   - // 删除尾部多余的班次
945   - for (j = iLpIndex; j < _internalLpArray.length; j++) {
946   - oLp = _internalLpArray[j];
947   - if (oLp.isBxFb() && oLp.getBc(iQIndex, iBcIndex)) {
948   - oLp.removeBc(iQIndex, iBcIndex);
949   - }
950   - }
951   -
952   - if (aStartBcIndex[1] != aEndBcIndex[1]) { // 指定时间范围跨圈
953   - for (j = 0; j < iLpIndex; j++) {
954   - oLp = _internalLpArray[j];
955   - if (!oLp.getBc(iQIndex, iBcIndex)) {
956   - _fnGenerateBcAndSetBc(j, iQIndex, iBcIndex);
957   - }
958   - }
959   - } else {
960   - // 不跨圈,不用处理,处理头的时候已经加了
961   - }
962   -
963   - }
964   -
965   - },
966   -
967   - /**
968   - * 按照营运时间要求补充班次,
969   - * 早高峰7:45分以前出场运营,
970   - * 晚高峰16:10分以前出场运营
971   - */
972   - fnCalcuLpBc_yy: function() {
973   - // 补班次的时候,针对的是分班班型
974   - var i;
975   - var _oLp;
976   - var _oBc;
977   - var _aMinBcIndex;
978   - var _aMaxBcIndex;
979   -
980   - var _qIndex;
981   - var _bIndex;
982   -
983   - var _zgfCDate = _paramObj.toTimeObj("7:45");
984   - var _wgfCDate = _paramObj.toTimeObj("16:10");
985   - var _ccsj;
986   -
987   - for (i = 0; i < _internalLpArray.length; i++) {
988   - _oLp = _internalLpArray[i];
989   - if (_oLp.isBxFb()) { // 分班路牌
990   - // 早高峰部分
991   - _aMinBcIndex = _oLp.getMinBcObjPosition();
992   - _qIndex = _aMinBcIndex[0];
993   - _bIndex = _aMinBcIndex[1];
994   - _oBc = _oLp.getBc(_qIndex, _bIndex);
995   - if (_qIsUp) {
996   - _ccsj = _bIndex == 0 ?
997   - _paramObj.getUpOutTime() :
998   - _paramObj.getDownOutTime();
999   - } else {
1000   - _ccsj = _bIndex == 0 ?
1001   - _paramObj.getDownOutTime() :
1002   - _paramObj.getUpOutTime();
1003   - }
1004   - if (_zgfCDate.isBefore(_paramObj.addMinute(_oBc.getFcTimeObj(), -_ccsj))) {
1005   - _fnGenerateBcAndSetBc(
1006   - i,
1007   - _bIndex == 0 ? _qIndex - 1 : _qIndex,
1008   - _bIndex == 0 ? 1 : 0
1009   - )
1010   - }
1011   -
1012   - // 晚高峰部分
1013   - _aMaxBcIndex = _oLp.getMaxBcObjPosition();
1014   - _qIndex = _aMaxBcIndex[0];
1015   - _bIndex = _aMaxBcIndex[1];
1016   - _oBc = _oLp.getBc(
1017   - _bIndex == 0 ? _qIndex - 1 : _qIndex,
1018   - _bIndex == 0 ? 1 : 0
1019   - );
1020   - if (!_oBc) { // 前一个班次不存在,再判定加不加
1021   - _oBc = _oLp.getBc(_qIndex, _bIndex);
1022   - if (_qIsUp) {
1023   - _ccsj = _bIndex == 0 ?
1024   - _paramObj.getUpOutTime() :
1025   - _paramObj.getDownOutTime();
1026   - } else {
1027   - _ccsj = _bIndex == 0 ?
1028   - _paramObj.getDownOutTime() :
1029   - _paramObj.getUpOutTime();
1030   - }
1031   - if (_wgfCDate.isBefore(_paramObj.addMinute(_oBc.getFcTimeObj(), -_ccsj))) {
1032   - _fnGenerateBcAndSetBc(
1033   - i,
1034   - _bIndex == 0 ? _qIndex - 1 : _qIndex,
1035   - _bIndex == 0 ? 1 : 0
1036   - )
1037   - }
1038   - }
1039   - }
1040   - }
1041   - },
1042   -
1043   - /**
1044   - * 补充做5休2的班型班次。
1045   - * 1、确认5_2班型大致多少圈(小数点过.7进位)
1046   - * 2、获取当前5_2两端车次链的信息,每段的班次数目,还差几个班次没加
1047   - * 3、如果前面的车次链班次少,则从前面的车次链开始加
1048   - * 4、如果车次链班次数一样,从从后面的车次链开始加
1049   - * 5、加班次时都是往车次链前方加
1050   - * 6、如果前面车次链不能再加班次了,从后面车次链加
1051   - */
1052   - fnCalcuLpBx_5_2: function() {
1053   - // 计算做5休2班型所需的班次数
1054   - var iBxBcount = _aBxDesc[6].fBcCount;
1055   - if (iBxBcount - Math.floor(iBxBcount) > 0.7) {
1056   - iBxBcount = Math.floor(iBxBcount) + 1;
1057   - } else {
1058   - iBxBcount = Math.floor(iBxBcount);
1059   - }
1060   -
1061   - var i;
1062   - var j;
1063   - var oLp;
1064   - var iAddBcCount;
1065   - var oBcChain1;
1066   - var oBcChain2;
1067   - var iQindex;
1068   - var iBindex;
1069   -
1070   - for (i = 0; i < _internalLpArray.length; i++) {
1071   - oLp = _internalLpArray[i];
1072   - if (oLp.isBxFb5_2()) {
1073   - iAddBcCount = iBxBcount - oLp.getBcArray().length; // 需要添加的班次数
1074   - for (j = 1; j <= iAddBcCount; j++) {
1075   - oBcChain1 = oLp.fnGetBcChainInfo(0);
1076   - oBcChain2 = oLp.fnGetBcChainInfo(1);
1077   -
1078   - if (oBcChain1.bcount < oBcChain2.bcount) {
1079   - iQindex = oBcChain1.s_b == 0 ? oBcChain1.s_q - 1 : oBcChain1.s_q;
1080   - iBindex = oBcChain1.s_b == 0 ? 1 : 0;
1081   - // 往车次链往前不能加,就往后加
1082   - if (_fnGenerateBc(i, iQindex, iBindex)) {
1083   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1084   - } else {
1085   - iQindex = oBcChain1.e_b == 0 ? oBcChain1.e_q : oBcChain1.e_q + 1;
1086   - iBindex = oBcChain1.e_b == 0 ? 1 : 0;
1087   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1088   - }
1089   -
1090   - } else if (oBcChain1.bcount > oBcChain2.bcount) {
1091   - iQindex = oBcChain2.s_b == 0 ? oBcChain2.s_q - 1 : oBcChain2.s_q;
1092   - iBindex = oBcChain2.s_b == 0 ? 1 : 0;
1093   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1094   - } else {
1095   - iQindex = oBcChain2.s_b == 0 ? oBcChain2.s_q - 1 : oBcChain2.s_q;
1096   - iBindex = oBcChain2.s_b == 0 ? 1 : 0;
1097   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1098   - }
1099   - }
1100   - }
1101   - }
1102   -
1103   - },
1104   -
1105   - /**
1106   - * 补其他分班班型班次。
1107   - * 从车次链的后面开始加
1108   - */
1109   - fnCalcuLpBx_other: function() {
1110   - // TODO:根据上标线的首班时间确定班型,小于05:59的做一休一,否则做二休一
1111   - var oSt = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
1112   - var iBxIndex = 4;
1113   - if (oSt.isBefore(_paramObj.toTimeObj("05:59"))) {
1114   - iBxIndex = 5;
1115   - }
1116   - // 计算做5休2班型所需的班次数
1117   - var iQBcount = _aBxDesc[iBxIndex].fQCount;
1118   - var iBxBcount = Math.round(iQBcount) * 2;
1119   -
1120   - var i;
1121   - var j;
1122   - var oLp;
1123   - var iAddBcCount;
1124   - var oBcChain1;
1125   - var oBcChain2;
1126   - var iQindex;
1127   - var iBindex;
1128   -
1129   - for (i = 0; i < _internalLpArray.length; i++) {
1130   - oLp = _internalLpArray[i];
1131   - if (oLp.isBxFb() && !oLp.isBxFb5_2()) {
1132   - iAddBcCount = iBxBcount - oLp.getBcArray().length; // 需要添加的班次数
1133   - for (j = 1; j <= iAddBcCount; j++) {
1134   - oBcChain1 = oLp.fnGetBcChainInfo(0);
1135   - oBcChain2 = oLp.fnGetBcChainInfo(1);
1136   -
1137   - if (oBcChain1.bcount < oBcChain2.bcount) {
1138   - iQindex = oBcChain1.e_b == 0 ? oBcChain1.e_q : oBcChain1.e_q + 1;
1139   - iBindex = oBcChain1.e_b == 0 ? 1 : 0;
1140   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1141   - } else if (oBcChain1.bcount > oBcChain2.bcount) {
1142   - iQindex = oBcChain2.e_b == 0 ? oBcChain2.e_q : oBcChain2.e_q + 1;
1143   - iBindex = oBcChain2.e_b == 0 ? 1 : 0;
1144   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1145   - } else {
1146   - iQindex = oBcChain2.e_b == 0 ? oBcChain2.e_q : oBcChain2.e_q + 1;
1147   - iBindex = oBcChain2.e_b == 0 ? 1 : 0;
1148   - _fnGenerateBcAndSetBc(i, iQindex, iBindex);
1149   - }
1150   - }
1151   - }
1152   - }
1153   -
1154   - },
1155   -
1156   - /**
1157   - * 补充连班路牌班次。
1158   - * 1、上标线,中标线中间的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向上标线起始班次靠拢
1159   - * 2、中标线以下的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向中标线起始班次靠拢
1160   - */
1161   - fnCalcuLpBx_lb: function() {
1162   - // 补充连班的班次,参照上标线,中标线补充不足的班次
1163   -
1164   - var aLbLpindexes = []; // 除上标线,中标线的连班路牌索引
1165   - var i;
1166   - for (i = 0; i < _internalLpArray.length; i++) {
1167   - if (_internalLpArray[i].isBxLb() && i != 0 && i != _iZbx_lpIndex) {
1168   - aLbLpindexes.push(i);
1169   - }
1170   - }
1171   -
1172   - var oEndsj = // 结束时间
1173   - _paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj()) ?
1174   - _paramObj.getDownLastDTimeObj() :
1175   - _paramObj.getUpLastDtimeObj();
1176   -
1177   - var oLp;
1178   - var aMinbcPos;
1179   - var oBc;
1180   - var j;
1181   - var iTempBcIndex;
1182   -
1183   - // 1、从最小班次开始,往后补充班次
1184   - for (i = 0; i < aLbLpindexes.length; i++) {
1185   - oLp = _internalLpArray[aLbLpindexes[i]];
1186   -
1187   - // 最小班次索引
1188   - aMinbcPos = oLp.getMinBcObjPosition();
1189   - // 使用纵向分隔补充班次,从最小班次向后补
1190   - iTempBcIndex = aMinbcPos[1] == 0 ? 1 : 0;
1191   - j = iTempBcIndex == 0 ? aMinbcPos[0] + 1 : aMinbcPos[0];
1192   -
1193   - while (j < _qCount) {
1194   - while (iTempBcIndex <= 1) {
1195   - oBc = _fnGenerateBc(aLbLpindexes[i], j, iTempBcIndex);
1196   - if (oBc &&
1197   - oBc.getFcTimeObj().isBefore(oEndsj) ) {
1198   - oLp.setBc(j, iTempBcIndex, oBc);
1199   - }
1200   - iTempBcIndex++;
1201   - }
1202   - iTempBcIndex = 0;
1203   - j++;
1204   - }
1205   -
1206   - }
1207   -
1208   - // 2、上标线中标线之间的路牌,从最小的班次往前补充班次
1209   -
1210   - // 还要补充缺失的班次,差上标线几个班次要往前补上
1211   - var iBccount;
1212   - var iQindex;
1213   - var iBindex;
1214   - // 补上标线到中标线之间的连班路牌的班次
1215   - for (i = 0; i < aLbLpindexes.length; i++) {
1216   - if (aLbLpindexes[i] > 0 && aLbLpindexes[i] < _iZbx_lpIndex) {
1217   - oLp = _internalLpArray[aLbLpindexes[i]];
1218   - aMinbcPos = oLp.getMinBcObjPosition();
1219   - iQindex = aMinbcPos[0];
1220   - iBindex = aMinbcPos[1];
1221   - iBccount = (iQindex - 1) * 2 + iBindex; // 距离上标线起始站点差几个班次
1222   - for (j = 0; j < iBccount; j++) {
1223   - if (iBindex == 0) {
1224   - iQindex --;
1225   - iBindex = 1;
1226   - _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
1227   - } else if (iBindex == 1) {
1228   - iBindex --;
1229   - _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
1230   - }
1231   - }
1232   -
1233   - }
1234   -
1235   - }
1236   -
1237   - // 3、中标线之后的路牌,从最小的班次往前补充班次
1238   -
1239   - // 补中标线以下的连班路牌的班次
1240   - for (i = 0; i < aLbLpindexes.length; i++) {
1241   - if (aLbLpindexes[i] > _iZbx_lpIndex) {
1242   - oLp = _internalLpArray[aLbLpindexes[i]];
1243   - aMinbcPos = oLp.getMinBcObjPosition();
1244   - iQindex = aMinbcPos[0];
1245   - iBindex = aMinbcPos[1];
1246   - iBccount = (iQindex - 0) * 2 + iBindex - 1; // 距离上标线起始站点差几个班次
1247   - for (j = 0; j < iBccount; j++) {
1248   - if (iBindex == 0) {
1249   - iQindex --;
1250   - iBindex = 1;
1251   - _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
1252   - } else if (iBindex == 1) {
1253   - iBindex --;
1254   - _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
1255   - }
1256   - }
1257   - }
1258   - }
1259   -
1260   - },
1261   -
1262   - /**
1263   - * 计算末班车。
1264   - * 1、将上下行拉成上下行两个班次列表(包括标记班次)
1265   - * 2、分别找出离末班车发车时间最近的班次,并替换时间
1266   - * 3、删除之后的班次
1267   - */
1268   - fnCalcuLastBc: function() {
1269   - var i;
1270   - var iTimeDiff;
1271   - var iTempTime;
1272   - var aBc;
1273   - var oLastBcTime;
1274   - var oLastBcIsUp;
1275   - var iModifyIndex;
1276   -
1277   - // 查找末班车早的末班车时间和方向
1278   - if (_paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj())) {
1279   - oLastBcTime = _paramObj.getUpLastDtimeObj();
1280   - oLastBcIsUp = true;
1281   - } else {
1282   - oLastBcTime = _paramObj.getDownLastDTimeObj();
1283   - oLastBcIsUp = false;
1284   - }
1285   -
1286   - // 确定早的末班车时间
1287   - aBc = _fnGetBcList(oLastBcIsUp);
1288   - for (i = 0; i < aBc.length; i++) {
1289   - iTempTime = oLastBcTime.diff(aBc[i].getFcTimeObj(), "m");
1290   - if (iTimeDiff == undefined) {
1291   - iTimeDiff = iTempTime;
1292   - iModifyIndex = i;
1293   - } else if (Math.abs(iTempTime) <= Math.abs(iTimeDiff)) {
1294   - iTimeDiff = iTempTime;
1295   - iModifyIndex = i;
1296   - }
1297   - }
1298   - aBc[iModifyIndex].addMinuteToFcsj(iTimeDiff); // 替换成末班车时间
1299   - aBc[iModifyIndex].fnSetDelFlag(false);
1300   - aBc[iModifyIndex].fnSetIsLastBc(true);
1301   - for (i = iModifyIndex + 1; i < aBc.length; i++) { // 删除多余班次
1302   - _qIsUp == oLastBcIsUp ?
1303   - aBc[i]._$$_internal_group_obj.setBc1(undefined) :
1304   - aBc[i]._$$_internal_group_obj.setBc2(undefined);
1305   - }
1306   -
1307   - // 查找末班车晚的末班车时间和方向
1308   - if (_paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj())) {
1309   - oLastBcTime = _paramObj.getDownLastDTimeObj();
1310   - oLastBcIsUp = false;
1311   - } else {
1312   - oLastBcTime = _paramObj.getUpLastDtimeObj();
1313   - oLastBcIsUp = true;
1314   - }
1315   - // 确定晚的末班车时间
1316   - aBc = _fnGetBcList(oLastBcIsUp);
1317   - var oBc;
1318   - var aBcIndex;
1319   - var iLpIndex;
1320   - var iQIndex;
1321   - var iBcIndex;
1322   -
1323   - iTimeDiff = undefined;
1324   - for (i = 0; i < aBc.length; i++) {
1325   - oBc = aBc[i];
1326   - aBcIndex = _fnGetBcIndex(oBc);
1327   -
1328   - iLpIndex = aBcIndex[0];
1329   - iQIndex = aBcIndex[2] == 0 ? aBcIndex[1] -1 : aBcIndex[1];
1330   - iBcIndex = aBcIndex[2] == 0 ? 1 : 0;
1331   -
1332   - if (!_internalLpArray[iLpIndex].getBc(iQIndex, iBcIndex)) {
1333   - continue;
1334   - }
1335   -
1336   - iTempTime = oLastBcTime.diff(aBc[i].getFcTimeObj(), "m");
1337   - if (iTimeDiff == undefined) {
1338   - iTimeDiff = iTempTime;
1339   - iModifyIndex = i;
1340   - } else if (Math.abs(iTempTime) <= Math.abs(iTimeDiff)) {
1341   - iTimeDiff = iTempTime;
1342   - iModifyIndex = i;
1343   - }
1344   - }
1345   - aBc[iModifyIndex].addMinuteToFcsj(iTimeDiff); // 替换成末班车时间
1346   - aBc[iModifyIndex].fnSetDelFlag(false);
1347   - aBc[iModifyIndex].fnSetIsLastBc(true);
1348   - for (i = iModifyIndex + 1; i < aBc.length; i++) { // 删除多余班次
1349   - _qIsUp == oLastBcIsUp ?
1350   - aBc[i]._$$_internal_group_obj.setBc1(undefined) :
1351   - aBc[i]._$$_internal_group_obj.setBc2(undefined);
1352   - }
1353   -
1354   - },
1355   -
1356   - /**
1357   - * 添加吃饭班次。
1358   - */
1359   - fnCalcuEatBc: function() {
1360   - // 吃午饭时间范围,10:15 到 12:15
1361   - // 吃晚饭时间范围,18:00 到 19:00
1362   -
1363   - if (!_paramObj.fnIsEat()) {
1364   - return;
1365   - }
1366   -
1367   - // 午饭index
1368   - var aLEIndex;
1369   - // 晚饭index
1370   - var aDEIndex;
1371   -
1372   - // 所有吃饭都默认在一个方向,两个方向暂时不考虑
1373   - if (_paramObj.fnIsUpEat()) {
1374   - aLEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("10:15"), true, false);
1375   - aDEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("18:00"), true, false);
1376   - } else {
1377   - aLEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("10:15"), false, true);
1378   - aDEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("18:00"), false, true);
1379   - }
1380   -
1381   - // 午饭第几圈,第几个班次
1382   - var iLEQIndex = aLEIndex[0];
1383   - var iLEBIndex = aLEIndex[1];
1384   - // 晚饭第几圈,第几个班次
1385   - var iDEQIndex = aDEIndex[0];
1386   - var iDEBIndex = aDEIndex[1];
1387   -
1388   - // 注意,本模型只有连班才有吃饭
1389   -
1390   - var i;
1391   - var oLp;
1392   - var aLbIndex = []; // 连班班型的路牌索引
1393   - for (i = 0; i < _internalLpArray.length; i++) {
1394   - oLp = _internalLpArray[i];
1395   - if (oLp.isBxLb()) {
1396   - aLbIndex.push(i);
1397   - }
1398   - }
1399   -
1400   - var iLTime;
1401   - var iDtime;
1402   - var j;
1403   - for (i = 0; i < aLbIndex.length; i++) {
1404   - oLp = _internalLpArray[aLbIndex[i]];
1405   -
1406   - // 午饭
1407   - iLTime = oLp.fnAddEatBc(iLEQIndex, iLEBIndex, _factory, _paramObj);
1408   - // 晚饭
1409   - iDtime = oLp.fnAddEatBc(iDEQIndex, iDEBIndex, _factory, _paramObj);
1410   -
1411   - if (i == aLbIndex.length - 1) {
1412   - for (j = aLbIndex[i]; j < _internalLpArray.length; j++) {
1413   - oLp = _internalLpArray[j];
1414   - if (oLp.isBxFb()) { // 5休2班型不调整
1415   - // 修正午饭之后路牌班次的发车时间
1416   - oLp.fnAddMinuteToBcFcsj(iLEQIndex, iLEBIndex, iLTime);
1417   - oLp.fnAddMinuteToBcFcsj(iDEQIndex, iDEBIndex, iDtime);
1418   - }
1419   - }
1420   - } else {
1421   - for (j = aLbIndex[i]; j < aLbIndex[i + 1]; j++) {
1422   - oLp = _internalLpArray[j];
1423   - if (oLp.isBxFb()) {
1424   - // 修正午饭之后路牌班次的发车时间
1425   - oLp.fnAddMinuteToBcFcsj(iLEQIndex, iLEBIndex, iLTime);
1426   - oLp.fnAddMinuteToBcFcsj(iDEQIndex, iDEBIndex, iDtime);
1427   - }
1428   - }
1429   - }
1430   - }
1431   -
1432   - },
1433   -
1434   - /**
1435   - * 补每个路牌的其他班次(进出场,例保班次)。
1436   - */
1437   - fnCalcuOtherBc_: function() {
1438   - var i;
1439   - var _lpObj;
1440   - var _minBcIndex;
1441   - var _maxBcIndex;
1442   - var _minBc;
1443   - var _maxBc;
1444   - var _otherbc = [];
1445   - var _oFbbc;
1446   -
1447   - for (i = 0; i < _internalLpArray.length; i++) {
1448   - _lpObj = _internalLpArray[i];
1449   - _minBcIndex = _lpObj.getMinBcObjPosition();
1450   - _maxBcIndex = _lpObj.getMaxBcObjPosition();
1451   - _minBc = _lpObj.getBc(_minBcIndex[0], _minBcIndex[1]);
1452   - _maxBc = _lpObj.getBc(_maxBcIndex[0], _maxBcIndex[1]);
1453   -
1454   - _otherbc = [];
1455   - _otherbc.push(_factory.createBcObj(
1456   - _lpObj, "bd", true, 1,
1457   - _minBc.getFcTimeObj(),
1458   - _paramObj
1459   - ));
1460   - _otherbc.push(_factory.createBcObj(
1461   - _lpObj, "out", true, 1,
1462   - _minBc.getFcTimeObj(),
1463   - _paramObj
1464   - ));
1465   -
1466   - _maxBc.setArrTimeObj(_paramObj.addMinute(_maxBc.getFcTimeObj(), _maxBc.getBcTime()));
1467   - _maxBc.setStopTime(0);
1468   - _otherbc.push(_factory.createBcObj(
1469   - _lpObj, "in", true, 1,
1470   - _maxBc.getArrTimeObj(),
1471   - _paramObj
1472   - ));
1473   - _otherbc.push(_factory.createBcObj(
1474   - _lpObj, "lc", true, 1,
1475   - _maxBc.getArrTimeObj(),
1476   - _paramObj
1477   - ));
1478   -
1479   - // 5休2分班出场例保班次
1480   - if (_lpObj.isBxFb5_2()) {
1481   - _oFbbc = _lpObj.getBc(
1482   - _lpObj.fnGetBcChainInfo(1)["s_q"],
1483   - _lpObj.fnGetBcChainInfo(1)["s_b"]
1484   - );
1485   -
1486   - _otherbc.push(_factory.createBcObj(
1487   - _lpObj, "bd", true, 1,
1488   - _oFbbc.getFcTimeObj(),
1489   - _paramObj
1490   - ));
1491   - _otherbc.push(_factory.createBcObj(
1492   - _lpObj, "out", true, 1,
1493   - _oFbbc.getFcTimeObj(),
1494   - _paramObj
1495   - ));
1496   - }
1497   -
1498   - _lpObj.addOtherBcArray(_otherbc);
1499   - }
1500   -
1501   - },
1502   -
1503   - /**
1504   - * 补每个路牌的其他班次(进出场,例保班次)
1505   - * 所有的车次链前后都加进出场、报道班次
1506   - */
1507   - fnCalcuOtherBc: function() {
1508   - var i;
1509   - var j;
1510   - var iBcChainCount;
1511   - var oLp;
1512   - var aOtherBc;
1513   - var oStartBc;
1514   - var oEndBc;
1515   -
1516   - for (i = 0; i < _internalLpArray.length; i++) {
1517   - aOtherBc = [];
1518   - oLp = _internalLpArray[i];
1519   - iBcChainCount = oLp.fnGetBcChainCount();
1520   -
1521   - if (iBcChainCount == 1) { // 只有一个车次链,是连班班型
1522   - // 头部要添加出场,例保班次
1523   - oStartBc = oLp.getBc(
1524   - oLp.fnGetBcChainInfo(0)["s_q"],
1525   - oLp.fnGetBcChainInfo(0)["s_b"]
1526   - );
1527   - aOtherBc.push(_factory.createBcObj(
1528   - oLp, "bd", true, 1,
1529   - oStartBc.getFcTimeObj(),
1530   - _paramObj
1531   - ));
1532   - aOtherBc.push(_factory.createBcObj(
1533   - oLp, "out", true, 1,
1534   - oStartBc.getFcTimeObj(),
1535   - _paramObj
1536   - ));
1537   -
1538   - // 尾部需添加进场,例保班次
1539   - oEndBc = oLp.getBc(
1540   - oLp.fnGetBcChainInfo(0)["e_q"],
1541   - oLp.fnGetBcChainInfo(0)["e_b"]
1542   - );
1543   - aOtherBc.push(_factory.createBcObj(
1544   - oLp, "in", true, 1,
1545   - oEndBc.getArrTimeObj(),
1546   - _paramObj
1547   - ));
1548   - aOtherBc.push(_factory.createBcObj(
1549   - oLp, "lc", true, 1,
1550   - oEndBc.getArrTimeObj(),
1551   - _paramObj
1552   - ));
1553   - } else if (iBcChainCount == 2) { // 两个车次链,是分班班型
1554   - // 第一个车次链开头有出场,报到班次,车次链结尾只有进场班次
1555   - oStartBc = oLp.getBc(
1556   - oLp.fnGetBcChainInfo(0)["s_q"],
1557   - oLp.fnGetBcChainInfo(0)["s_b"]
1558   - );
1559   - aOtherBc.push(_factory.createBcObj(
1560   - oLp, "bd", true, 1,
1561   - oStartBc.getFcTimeObj(),
1562   - _paramObj
1563   - ));
1564   - aOtherBc.push(_factory.createBcObj(
1565   - oLp, "out", true, 1,
1566   - oStartBc.getFcTimeObj(),
1567   - _paramObj
1568   - ));
1569   -
1570   - oEndBc = oLp.getBc(
1571   - oLp.fnGetBcChainInfo(0)["e_q"],
1572   - oLp.fnGetBcChainInfo(0)["e_b"]
1573   - );
1574   - aOtherBc.push(_factory.createBcObj(
1575   - oLp, "in", true, 1,
1576   - oEndBc.getArrTimeObj(),
1577   - _paramObj
1578   - ));
1579   -
1580   - // 第二个车次链开头只有出场班次,车次链结尾有进场,报到班次
1581   - oStartBc = oLp.getBc(
1582   - oLp.fnGetBcChainInfo(1)["s_q"],
1583   - oLp.fnGetBcChainInfo(1)["s_b"]
1584   - );
1585   - aOtherBc.push(_factory.createBcObj(
1586   - oLp, "out", true, 1,
1587   - oStartBc.getFcTimeObj(),
1588   - _paramObj
1589   - ));
1590   -
1591   - oEndBc = oLp.getBc(
1592   - oLp.fnGetBcChainInfo(1)["e_q"],
1593   - oLp.fnGetBcChainInfo(1)["e_b"]
1594   - );
1595   - aOtherBc.push(_factory.createBcObj(
1596   - oLp, "in", true, 1,
1597   - oEndBc.getArrTimeObj(),
1598   - _paramObj
1599   - ));
1600   - aOtherBc.push(_factory.createBcObj(
1601   - oLp, "lc", true, 1,
1602   - oEndBc.getArrTimeObj(),
1603   - _paramObj
1604   - ));
1605   -
1606   -
1607   - } else {
1608   - // 2个车次链以上,暂时没有此班型
1609   - }
1610   -
1611   - oLp.addOtherBcArray(aOtherBc);
1612   - }
1613   - },
1614   -
1615   - /**
1616   - * 祛除上标线开头的删除标记的班次。
1617   - */
1618   - fnRemoveDelFirstFlagBc: function() {
1619   - var oLp = _internalLpArray[0];
1620   - var aMinBcIndex = oLp.getMinBcObjPosition();
1621   - if (oLp.getBc(aMinBcIndex[0], aMinBcIndex[1]).fnIsDelFlag()) {
1622   - oLp.removeBc(aMinBcIndex[0], aMinBcIndex[1]);
1623   - }
1624   - },
1625   - /**
1626   - * 祛除上标线结尾的删除标记的班次。
1627   - */
1628   - fnRemoveDelLastFlagBc: function() {
1629   - var oLp = _internalLpArray[0];
1630   - var aMaxBcIndex = oLp.getMaxBcObjPosition();
1631   - if (oLp.getBc(aMaxBcIndex[0], aMaxBcIndex[1]).fnIsDelFlag()) {
1632   - oLp.removeBc(aMaxBcIndex[0], aMaxBcIndex[1]);
1633   - }
1634   - },
1635   -
1636   - /**
1637   - * 调整路牌班次间隔(核准周转时间,停站时间)。
1638   - * @param iFre int 迭代次数
1639   - */
1640   - fnAdjustLpBcInterval: function(iFre) {
1641   - if (iFre > 0) {
1642   - for (var i = 0; i < _internalLpArray.length; i++) {
1643   - _internalLpArray[i].fnAdjustBcInterval(
1644   - this.fnCalcuAverPeakStopTime(),
1645   - this.fnCalcuAverTroughStopTime(),
1646   - _paramObj);
1647   - }
1648   -
1649   - this.fnAdjustLpBcInterval(iFre - 1);
1650   - }
1651   - },
1652   -
1653   - /**
1654   - * 调整班次间隔。
1655   - * @param bIsUp 是否上行
1656   - * @param oStartTime 开始时间对象
1657   - * @param iFre 迭代次数
1658   - */
1659   - fnAdjustBcInterval2_: function(bIsUp, oStartTime, iFre) {
1660   - if (iFre > 0) {
1661   - var aBc = _fnGetBcList2(bIsUp, oStartTime); // 指定方向的班次列表
1662   - aBc.sort(function(o1, o2) {
1663   - if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
1664   - return -1;
1665   - } else {
1666   - return 1;
1667   - }
1668   - });
1669   - var i;
1670   - var j;
1671   -
1672   - var iBcCountOfGroup = 3; // 3个班次取一次计算
1673   - var aBcOfGroup; // 3个班次列表
1674   - var aBcIntervalOfGroup; // 班次间隔列表,如:3个班次,2个间隔
1675   -
1676   - for (i = 0; i <= aBc.length - iBcCountOfGroup; i++) {
1677   - aBcOfGroup = [];
1678   - aBcIntervalOfGroup = [];
1679   - for (j = i; j < i + iBcCountOfGroup; j++) {
1680   - aBcOfGroup.push(aBc[j]);
1681   - }
1682   -
1683   - for (j = 0; j < aBcOfGroup.length; j++) {
1684   - if (j < aBcOfGroup.length - 1) {
1685   - aBcIntervalOfGroup.push(aBcOfGroup[j + 1].getFcTimeObj().diff(
1686   - aBcOfGroup[j].getFcTimeObj(), "m"));
1687   - }
1688   - }
1689   -
1690   - if (aBcIntervalOfGroup[0] < 19) {
1691   - aBcOfGroup[1].addMinuteToFcsj(1);
1692   - } else if (aBcIntervalOfGroup[0] > 20) {
1693   - aBcOfGroup[1].addMinuteToFcsj(-1);
1694   - } else {
1695   - if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
1696   - //continue;
1697   - } else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
1698   - aBcOfGroup[1].addMinuteToFcsj(-1);
1699   - } else {
1700   - aBcOfGroup[1].addMinuteToFcsj(1);
1701   - }
1702   - }
1703   -
1704   - }
1705   -
1706   - this.fnAdjustBcInterval2(bIsUp, oStartTime, iFre - 1);
1707   - }
1708   - },
1709   -
1710   - /**
1711   - * 调整班次间隔。
1712   - * @param boolean isUp 是否上行
1713   - * @param oStartTime 开始时间对象
1714   - * @param fre int 迭代次数
1715   - */
1716   - fnAdjustBcInterval: function(isUp, oStartTime, fre) {
1717   - if (fre > 0) {
1718   - var aBc = !oStartTime ? _fnGetBcList(isUp) : _fnGetBcList2(isUp, oStartTime); // 指定方向的班次列表
1719   -
1720   - aBc.sort(function(o1, o2) {
1721   - if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
1722   - return -1;
1723   - } else {
1724   - return 1;
1725   - }
1726   - });
1727   -
1728   - var i;
1729   - var j;
1730   -
1731   - var iBcCountOfGroup = 3; // 3个班次取一次计算
1732   - var aBcOfGroup; // 3个班次列表
1733   - var aBcIntervalOfGroup; // 班次间隔列表,如:3个班次,2个间隔
1734   - var oBcFcTime; // 班次发车时间
1735   -
1736   - for (i = 0; i <= aBc.length - iBcCountOfGroup; i++) {
1737   - aBcOfGroup = [];
1738   - aBcIntervalOfGroup = [];
1739   - for (j = i; j < i + iBcCountOfGroup; j++) {
1740   - aBcOfGroup.push(aBc[j]);
1741   - }
1742   -
1743   - for (j = 0; j < aBcOfGroup.length; j++) {
1744   - if (j < aBcOfGroup.length - 1) {
1745   - aBcIntervalOfGroup.push(aBcOfGroup[j + 1].getFcTimeObj().diff(
1746   - aBcOfGroup[j].getFcTimeObj(), "m"));
1747   - }
1748   - }
1749   -
1750   - // 判定规则
1751   - oBcFcTime = aBcOfGroup[1].getFcTimeObj();
1752   -
1753   - // 第一个班次发车时间不动,根据间隔,调整中间一个班次
1754   - // 如果3个班次2个间隔时间差1分钟,不调整
1755   - // 如果第一个间隔大,调整第二个班次往前1分钟
1756   - // 如果第二个间隔大,调整第二个班次往后1分钟
1757   -
1758   - if (_paramObj.isTroughBc(oBcFcTime) &&
1759   - aBcIntervalOfGroup[0] > _paramObj.getTroughMaxFcjx()) {
1760   - aBcOfGroup[1].addMinuteToFcsj(-1);
1761   - }
1762   -
1763   - //else if (_paramObj.isMPeakBc(oBcFcTime) &&
1764   - // aBcIntervalOfGroup[0] < _paramObj.getMPeakMinFcjx()) {
1765   - // aBcOfGroup[1].addMinuteToFcsj(1);
1766   - //} else if (_paramObj.isMPeakBc(oBcFcTime) &&
1767   - // aBcIntervalOfGroup[0] > _paramObj.getMPeakMaxFcjx()) {
1768   - // aBcOfGroup[1].addMinuteToFcsj(-1);
1769   - //} else if (_paramObj.isEPeakBc(oBcFcTime) &&
1770   - // aBcIntervalOfGroup[0] < _paramObj.getEPeakMinFcjx()) {
1771   - // aBcOfGroup[1].addMinuteToFcsj(1);
1772   - //} else if (_paramObj.isEPeakBc(oBcFcTime) &&
1773   - // aBcIntervalOfGroup[0] > _paramObj.getEPeakMaxFcjx()) {
1774   - // aBcOfGroup[1].addMinuteToFcsj(-1);
1775   - //}
1776   -
1777   -
1778   - else {
1779   - if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
1780   - //continue;
1781   - } else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
1782   - aBcOfGroup[1].addMinuteToFcsj(-1);
1783   - } else {
1784   - aBcOfGroup[1].addMinuteToFcsj(1);
1785   - }
1786   - }
1787   -
1788   - //if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
1789   - // //continue;
1790   - //} else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
1791   - // aBcOfGroup[1].addMinuteToFcsj(-1);
1792   - //} else {
1793   - // aBcOfGroup[1].addMinuteToFcsj(1);
1794   - //}
1795   -
1796   -
1797   - }
1798   -
1799   - this.fnAdjustBcInterval(isUp, oStartTime, fre - 1);
1800   - }
1801   -
1802   - },
1803   -
1804   - /**
1805   - * 调整班次间隔(平均间隔)。
1806   - * @param bIsUp 是否上行
1807   - * @param oStartTime 开始时间对象
1808   - */
1809   - fnAdjustBcInterval2_avg: function(bIsUp, oStartTime) {
1810   - var aBc = !oStartTime ? _fnGetBcList(bIsUp) : _fnGetBcList2(bIsUp, oStartTime); // 指定方向的班次列表
1811   - aBc.sort(function(o1, o2) {
1812   - if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
1813   - return -1;
1814   - } else {
1815   - return 1;
1816   - }
1817   - });
1818   -
1819   - var j;
1820   - var iCount = aBc.length - 1;
1821   - var iC1 = Math.floor(aBc[aBc.length - 1].getFcTimeObj().diff(aBc[0].getFcTimeObj(), "m") / iCount);
1822   - var iC2 = aBc[aBc.length - 1].getFcTimeObj().diff(aBc[0].getFcTimeObj(), "m") % iCount;
1823   - var iTempTime;
1824   -
1825   - for (j = 0; j < iCount - iC2; j++) {
1826   - iTempTime = aBc[j + 1].getFcTimeObj().diff(aBc[j].getFcTimeObj(), "m");
1827   - aBc[j + 1].addMinuteToFcsj(iC1 - iTempTime);
1828   - }
1829   - for (j = 0; j < iC2; j++) {
1830   - iTempTime = aBc[iCount - iC2 + j + 1].getFcTimeObj().diff(aBc[iCount - iC2 + j].getFcTimeObj(), "m");
1831   - aBc[iCount - iC2 + j + 1].addMinuteToFcsj(iC1 + 1 - iTempTime);
1832   - }
1833   -
1834   - },
1835   -
1836   - /**
1837   - * 计算高峰平均停站时间。
1838   - */
1839   - fnCalcuAverPeakStopTime: function() {
1840   - var i;
1841   - var j;
1842   - var aBc;
1843   - var iBcCount = 0;
1844   - var iSum = 0;
1845   - for (i = 0; i < _internalLpArray.length; i++) {
1846   - aBc = _internalLpArray[i].getBcArray();
1847   -
1848   - for (j = 0; j < aBc.length; j++) {
1849   - if (!_paramObj.isTroughBc(aBc[j].getArrTimeObj())) {
1850   - iBcCount ++;
1851   - iSum += aBc[j].getStopTime();
1852   - }
1853   - }
1854   - }
1855   -
1856   - return Math.floor(iSum / iBcCount);
1857   - },
1858   -
1859   - /**
1860   - * 计算低谷平均停站时间。
1861   - */
1862   - fnCalcuAverTroughStopTime: function() {
1863   - var i;
1864   - var j;
1865   - var aBc;
1866   - var iBcCount = 0;
1867   - var iSum = 0;
1868   - for (i = 0; i < _internalLpArray.length; i++) {
1869   - aBc = _internalLpArray[i].getBcArray();
1870   - for (j = 0; j < aBc.length; j++) {
1871   - if (_paramObj.isTroughBc(aBc[j].getArrTimeObj())) {
1872   - iBcCount ++;
1873   - iSum += aBc[j].getStopTime();
1874   - }
1875   - }
1876   - }
1877   -
1878   - return Math.floor(iSum / iBcCount);
1879   - },
1880   -
1881   - //------------- 其他方法 -------------//
1882   - /**
1883   - * 返回内部路牌数据列表。
1884   - * @returns {Array}
1885   - */
1886   - fnGetLpArray: function() {
1887   - return _internalLpArray;
1888   - },
1889   -
1890   - /**
1891   - * 内部数据转化成显示用的班次数组。
1892   - */
1893   - fnToGanttBcArray: function() {
1894   - var aAllBc = [];
1895   - var aLpBc = [];
1896   - var aEatBc = [];
1897   - var oLp;
1898   - var i;
1899   - var j;
1900   -
1901   - for (i = 0; i < _internalLpArray.length; i++) {
1902   - oLp = _internalLpArray[i];
1903   - aLpBc = [];
1904   - aLpBc = aLpBc.concat(oLp.getOtherBcArray(), oLp.getBcArray());
1905   -
1906   - aEatBc = [];
1907   - // 根据班次的吃饭时间添加吃饭班次
1908   - for (j = 0; j < aLpBc.length; j++) {
1909   - if (aLpBc[j].fnGetEatTime() > 0) {
1910   - aEatBc.push(_factory.createBcObj(
1911   - oLp,
1912   - "cf",
1913   - !aLpBc[j].isUp(), // 和上一个班次方向相反
1914   - 1,
1915   - _paramObj.addMinute(aLpBc[j].getArrTimeObj(), aLpBc[j].getStopTime()), // 使用上一个班次的到达时间作为开始时间
1916   - _paramObj
1917   - ));
1918   - }
1919   - }
1920   - aLpBc = aLpBc.concat(aEatBc);
1921   -
1922   - // 按照发车时间排序
1923   - aLpBc.sort(function(o1, o2) {
1924   - if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
1925   - return -1;
1926   - } else {
1927   - return 1;
1928   - }
1929   - });
1930   -
1931   - // 重新赋值fcno
1932   - for (j = 0; j < aLpBc.length; j++) {
1933   - aLpBc[j].fnSetFcno(j + 1);
1934   - }
1935   -
1936   - aAllBc = aAllBc.concat(aLpBc);
1937   - }
1938   -
1939   - var aGanttBc = [];
1940   - for (i = 0; i < aAllBc.length; i++) {
1941   - aGanttBc.push(aAllBc[i].toGanttBcObj());
1942   - }
1943   -
1944   - return aGanttBc;
1945   - }
1946   -
1947   - };
1948   -
  1 +/**
  2 + * 内部行车计划对象。
  3 + * @constructor
  4 + */
  5 +var InternalScheduleObj = function(paramObj, lpArray, factory) {
  6 + // 参数对象
  7 + var _paramObj = paramObj;
  8 + // 外部的路牌数组
  9 + var _lpArray = lpArray;
  10 + // 工厂对象
  11 + var _factory = factory;
  12 +
  13 + //------------------ 初始化方法1,以及计算关联的内部变量 -----------------//
  14 + var _qIsUp; // 每一圈是上行开始还是下行开始
  15 + var _qCount = 0; // 总的圈数
  16 + var _internalLpArray = []; // 内部对象数组
  17 + var _aBxDesc = [ // 各种班型描述(班型名称,平均工时,平均需要的班次数,平均工时)
  18 + {'sType':'六工一休', 'fHoursV':6.66, 'fBcCount': 0, 'fAverTime': 0},
  19 + {'sType':'五工一休', 'fHoursV':6.85, 'fBcCount': 0, 'fAverTime': 0},
  20 + {'sType':'四工一休', 'fHoursV':7.14, 'fBcCount': 0, 'fAverTime': 0},
  21 + {'sType':'三工一休', 'fHoursV':7.61, 'fBcCount': 0, 'fAverTime': 0},
  22 + {'sType':'二工一休', 'fHoursV':8.57, 'fBcCount': 0, 'fAverTime': 0},
  23 + {'sType':'一工一休', 'fHoursV':11.42, 'fBcCount': 0, 'fAverTime': 0},
  24 + {'sType':'五工二休', 'fHoursV':7.99, 'fBcCount': 0, 'fAverTime': 0},
  25 + {'sType':'无工休', 'fHoursV':5.43, 'fBcCount': 0, 'fAverTime': 0}
  26 + ];
  27 +
  28 + var _fnInitFun1 = function() { // 初始化方法1
  29 + console.log("//---------------- 行车计划,初始化方法1 start ----------------//");
  30 +
  31 + //----------------------- 1、确定上标线的方向,圈的方向 -------------------//
  32 +
  33 + // 确定_qIsUp,哪个方向的首班车晚就用哪个
  34 + _qIsUp = _paramObj.getUpFirstDTimeObj().isBefore(
  35 + _paramObj.getDownFirstDTimeObj()) ? false : true;
  36 + // 上标线开始时间,就是方向的首班车时间
  37 + var st = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
  38 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  39 + var et;
  40 + var et_IsUp;
  41 + if (_paramObj.getUpLastDtimeObj().isBefore(
  42 + _paramObj.getDownLastDTimeObj())) {
  43 + et = _paramObj.getDownLastDTimeObj();
  44 + et_IsUp = false;
  45 + } else {
  46 + et = _paramObj.getUpLastDtimeObj();
  47 + et_IsUp = true;
  48 + }
  49 +
  50 + //------------------------ 2、计算总共有多少圈 ------------------------//
  51 +
  52 + // 以开始时间,结束时间,构造上标线用连班班次发车时间
  53 + var bcFcsjArrays = []; // 班次发车时间对象数组
  54 + var bcArsjArrays = []; // 班次到达时间对象数组
  55 + var isUp = _qIsUp; // 方向
  56 + var bcCount = 1; // 班次数
  57 +
  58 + var _kssj = st; // 开始时间
  59 + var _bcsj = paramObj.calcuTravelTime(_kssj, isUp); // 班次历时
  60 + var _arrsj = paramObj.addMinute(_kssj, _bcsj); // 到达时间
  61 + var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj); // 停站时间
  62 +
  63 + do {
  64 + bcFcsjArrays.push(_kssj);
  65 + bcArsjArrays.push(_arrsj);
  66 +
  67 + _kssj = paramObj.addMinute(_kssj, _bcsj + _stoptime);
  68 + _bcsj = paramObj.calcuTravelTime(_kssj, isUp);
  69 + _arrsj = paramObj.addMinute(_kssj, _bcsj);
  70 + _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj);
  71 +
  72 + bcCount ++;
  73 + isUp = !isUp;
  74 + } while(_kssj.isBefore(et));
  75 + bcCount--; // 因为先做do,所以总的班次要减1
  76 + //if (bcCount > 0 && bcArsjArrays[bcCount - 1].isAfter(et)) {
  77 + // // 如果最后一个班次的到达时间超过结束时间,也要去除
  78 + // bcFcsjArrays.splice(bcCount - 1, 1);
  79 + // bcArsjArrays.splice(bcCount - 1, 1);
  80 + // bcCount--;
  81 + //}
  82 + var _qCount_p1 = Math.floor(bcCount / 2); // 2个班次一圈
  83 + var _qCount_p2 = bcCount % 2; // 余下的1个班次也算一圈
  84 +
  85 + // 利用连班数组计算圈数
  86 + _qCount = 1; // 前面加1圈,补中标线的班次
  87 + _qCount += _qCount_p1;
  88 + _qCount += _qCount_p2;
  89 +
  90 + // 计算最后是不是还要补一圈
  91 + if (_qCount > 1) { // 总的圈数就1圈,没必要加了(其实是不可能的,除非参数里问题)
  92 + if (_qCount_p2 == 0) { // 没有余下班次,整数圈数
  93 + // 最后一个班次的方向一定和开始的方向相反,如:上-下,上-下,上-下,一共三圈,最后一个班次为下行
  94 + // 判定最后一个班次的方向和上标线判定结束时间的班次方向是否一致
  95 + if (!_qIsUp == et_IsUp) {
  96 + // 一致不用加圈数
  97 + } else {
  98 + // 不一致需要加圈补最后一个结束时间班次
  99 + _qCount ++;
  100 + }
  101 + } else {
  102 + // 有余下的圈数,最后要不补的班次不管上行,下行都在这一圈里
  103 + // 不需要在补圈数了
  104 + }
  105 + }
  106 +
  107 + //------------------------ 3、根据路牌数,圈数创建路牌对象 ----------------------//
  108 +
  109 + // 创建内部的路牌数组,并把之前的连班路牌添加进上标线路牌中
  110 + var i;
  111 + for (i = 0; i < _lpArray.length; i++) {
  112 + _internalLpArray.push(new InternalLpObj(_lpArray[i], _qCount, _qIsUp));
  113 + }
  114 + // 初始化上标线,从第1圈开始
  115 + _internalLpArray[0].initDataFromTimeToTime(bcFcsjArrays[0], et, _qIsUp, 1, _paramObj, _factory);
  116 +
  117 + // 以上标线为基础,计算各种班型工时对应的圈数、班次数
  118 + var aBcArray = _internalLpArray[0].getBcArray();
  119 + aBcArray[0].fnSetIsFirstBc(true); // 设置首班班次标识
  120 +
  121 + if (aBcArray.length % 2 != 0) { // 不能整除2,去除一个班次计算
  122 + aBcArray.splice(aBcArray.length - 1, 1);
  123 + }
  124 +
  125 + // 午饭吃饭时间
  126 + var iLTime = _paramObj.fnGetLunchTime();
  127 + // 晚饭吃饭时间
  128 + var iDTime = _paramObj.fnGetDinnerTime();
  129 + // 出场时间
  130 + var iOutTime = _qIsUp ? _paramObj.getUpOutTime() : _paramObj.getDownOutTime();
  131 + // 进场时间
  132 + var iInTime = _qIsUp ? _paramObj.getDownInTime() : _paramObj.getUpInTime();
  133 + // 例保时间
  134 + var iBTime = _paramObj.getLbTime();
  135 +
  136 + var sum = 0; // 总班次时间
  137 + for (i = 0; i < aBcArray.length; i++) {
  138 + sum += aBcArray[i].getBcTime() + aBcArray[i].getStopTime();
  139 + }
  140 + sum += iLTime; // 加午饭时间
  141 + sum += iDTime; // 加晚饭时间
  142 + for (i = 0; i < _aBxDesc.length; i++) {
  143 + _aBxDesc[i].fAverTime = sum / (aBcArray.length / 2); // 平均周转时间不算进出场,例保时间
  144 +
  145 + // 计算5休2的班次数(双进出场,4个例保)
  146 + if (i == 6) {
  147 + _aBxDesc[i].fQCount =
  148 + (_aBxDesc[i].fHoursV * 60 - iOutTime * 2 - iInTime * 2 - iBTime * 4) /
  149 + _aBxDesc[i].fAverTime;
  150 + _aBxDesc[i].fBcCount = _aBxDesc[i].fQCount * 2;
  151 + } else { // 进出场,2个例保
  152 + _aBxDesc[i].fQCount =
  153 + (_aBxDesc[i].fHoursV * 60 - iOutTime - iInTime - iBTime * 2) /
  154 + _aBxDesc[i].fAverTime;
  155 + _aBxDesc[i].fBcCount = _aBxDesc[i].fQCount * 2;
  156 + }
  157 + }
  158 +
  159 +
  160 + // 在第一个班次之前再添加一个模拟班次,用于中标线的作用
  161 + // 那一圈必定是低谷,而且圈索引0,班次索引1,暂时标记,最后删除
  162 + var iFirstStopTime =
  163 + _paramObj.fnCalcuFixedStopNumber(
  164 + _paramObj.addMinute(aBcArray[0].getFcTimeObj(), -10),
  165 + _qIsUp
  166 + );
  167 + var iXXTime = _qIsUp ? _paramObj.getDownTroughTime() : _paramObj.getUpTroughTime();
  168 + var oFlagBc = _factory.createBcObj( // 标记班次
  169 + _internalLpArray[0],
  170 + "normal",
  171 + !_qIsUp,
  172 + 1,
  173 + _paramObj.addMinute(aBcArray[0].getFcTimeObj(), -(iFirstStopTime + iXXTime)),
  174 + _paramObj
  175 + );
  176 + oFlagBc.fnSetDelFlag(true); // 标记了删除记号
  177 +
  178 + _internalLpArray[0].setBc(0, 1, oFlagBc);
  179 +
  180 + // 在最后一圈也补上一个或者2个模拟班次,暂时标记,最后需要删除
  181 + var aMaxBcIndex = _internalLpArray[0].getMaxBcObjPosition();
  182 + if (aMaxBcIndex[0] == _qCount - 1) { // 可能加半圈
  183 + oFlagBc = _factory.createBcObj( // 标记班次
  184 + _internalLpArray[0],
  185 + "normal",
  186 + !_qIsUp,
  187 + 1,
  188 + _paramObj.addMinute(
  189 + _internalLpArray[0].getBc(_qCount - 1, 0).getArrTimeObj(),
  190 + _internalLpArray[0].getBc(_qCount - 1, 0).getStopTime()),
  191 + _paramObj
  192 + );
  193 + oFlagBc.fnSetDelFlag(true); // 标记了删除记号
  194 + _internalLpArray[0].setBc(_qCount - 1, 1, oFlagBc);
  195 +
  196 + } else { // 加完整的一圈
  197 + oFlagBc = _factory.createBcObj( // 标记班次
  198 + _internalLpArray[0],
  199 + "normal",
  200 + _qIsUp,
  201 + 1,
  202 + _paramObj.addMinute(
  203 + _internalLpArray[0].getBc(_qCount - 2, 1).getArrTimeObj(),
  204 + _internalLpArray[0].getBc(_qCount - 2, 1).getStopTime()),
  205 + _paramObj
  206 + );
  207 + oFlagBc.fnSetDelFlag(true); // 标记了删除记号
  208 + _internalLpArray[0].setBc(_qCount - 1, 0, oFlagBc);
  209 +
  210 + oFlagBc = _factory.createBcObj( // 标记班次
  211 + _internalLpArray[0],
  212 + "normal",
  213 + !_qIsUp,
  214 + 1,
  215 + _paramObj.addMinute(
  216 + _internalLpArray[0].getBc(_qCount - 1, 0).getArrTimeObj(),
  217 + _internalLpArray[0].getBc(_qCount - 1, 0).getStopTime()),
  218 + _paramObj
  219 + );
  220 + oFlagBc.fnSetDelFlag(true); // 标记了删除记号
  221 + _internalLpArray[0].setBc(_qCount - 1, 1, oFlagBc);
  222 +
  223 + }
  224 +
  225 + console.log("上行首班车时间:" + _paramObj.getUpFirstDTimeObj().format("HH:mm") +
  226 + "上行末班车时间:" + _paramObj.getUpLastDtimeObj().format("HH:mm"));
  227 + console.log("下行首班车时间:" + _paramObj.getDownFirstDTimeObj().format("HH:mm") +
  228 + "下行末班车时间:" + _paramObj.getDownLastDTimeObj().format("HH:mm"));
  229 + console.log("总共计算的圈数:" + _qCount);
  230 + console.log("圈的方向isUP:" + _qIsUp);
  231 + console.log("班型描述(以下):");
  232 + console.log(_aBxDesc);
  233 + console.log("所有路牌间隔描述(以下):");
  234 + for (i = 0; i < _internalLpArray.length; i++) {
  235 + console.log(_internalLpArray[i]._$_aVerticalIntervalTime);
  236 + }
  237 + console.log("//---------------- 行车计划,初始化方法1 end ----------------//");
  238 +
  239 + };
  240 +
  241 + //------------------ 初始化方法2,以及计算关联的内部变量 ----------------//
  242 + var _approximate_zgfQIndex; // 预估早高峰车辆从第几圈开始全部发出
  243 + var _approximate_zgfBIndex; // 预估早高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
  244 + var _approximate_wgfQIndex; // 预估晚高峰车辆从第几圈开始全部发出
  245 + var _approximate_wgfBIndex; // 预估晚高峰车辆从第几圈第几个班次开始全部发出(上行或下行)
  246 +
  247 + var _fnInitFun2 = function() { // 初始化方法2
  248 + console.log("//---------------- 行车计划,初始化方法2 start ----------------//");
  249 +
  250 + //------------------------ 1、计算车辆总数 ------------------------//
  251 + // 是用高峰上行周转时间除以高峰平均间隔得到的
  252 + // 这样算还算合理,车辆不多不少,待以后有新的算法再修正
  253 + var iClCount = _paramObj.calcuClzx();
  254 +
  255 + //------------------------ 2、计算所有路牌的发车在各个圈中的间隔 --------------------//
  256 + var i;
  257 + var j;
  258 + var iBindex = 1;
  259 + var iZzsj;
  260 + var oLp;
  261 + var iC1;
  262 + var iC2;
  263 +
  264 + for (i = 0; i < _qCount - 1; i++) {
  265 + while (iBindex <= 1) {
  266 + // 每圈每个方向的周转时间不一致,以上标线为主
  267 + oLp = _internalLpArray[0];
  268 + iZzsj = oLp.getBc(i + 1, iBindex).getFcTimeObj().diff(
  269 + oLp.getBc(i, iBindex).getFcTimeObj(), "m"
  270 + );
  271 +
  272 + iC1 = Math.floor(iZzsj / iClCount);
  273 + iC2 = iZzsj % iClCount;
  274 +
  275 + for (j = 0; j < iClCount - iC2; j++) {
  276 + oLp = _internalLpArray[j];
  277 + oLp.fnSetVerticalIntervalTime(i, iBindex, iC1);
  278 + }
  279 +
  280 + for (j = 0; j < iC2; j++) {
  281 + oLp = _internalLpArray[iClCount - iC2 + j];
  282 + oLp.fnSetVerticalIntervalTime(i, iBindex, iC1 + 1);
  283 + }
  284 +
  285 + iBindex ++;
  286 +
  287 + }
  288 + iBindex = 0;
  289 + }
  290 + // 最后一圈没有下一圈的参照,周转时间没发获取,由于都是低谷,所以使用倒数第二圈的间隔最为最后一圈的间隔
  291 + for (i = 0; i < _internalLpArray.length; i++) {
  292 + oLp = _internalLpArray[i];
  293 + oLp.fnSetVerticalIntervalTime(_qCount - 1, 0, oLp.fnGetVerticalIntervalTime(_qCount - 2, 0));
  294 + oLp.fnSetVerticalIntervalTime(_qCount - 1, 1, oLp.fnGetVerticalIntervalTime(_qCount - 2, 1));
  295 + }
  296 +
  297 + //------------------------ 3、预估早高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
  298 +
  299 + // 以上标线为标准,查找离早高峰开始时间最近的班次作为早高峰开始班次
  300 + // 以这个班次为早高峰起点,全部出车策略
  301 + var qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
  302 + _paramObj.getMPeakStartTimeObj(), true, true);
  303 + var qIndex = qbcIndexArray[0]; // 第几圈
  304 + var bIndex = qbcIndexArray[1]; // 第几个班次
  305 +
  306 + for (i = 1; i < _internalLpArray.length; i++) {
  307 + _fnGenerateBcAndSetBc(i, qIndex, bIndex);
  308 + }
  309 +
  310 + _approximate_zgfQIndex = qIndex;
  311 + _approximate_zgfBIndex = bIndex;
  312 +
  313 + //------------------------ 4、预估晚高峰全部出车第几圈第几个班次全部出车,计算路牌之间的发车间隔 ------------------//
  314 +
  315 + // 以上标线为标准,查找离晚高峰开始时间最近的班次作为晚高峰开始班次
  316 + // 以这个班次为早高峰起点,全部出车策略
  317 + qbcIndexArray = _internalLpArray[0].getQBcIndexWithFcTime(
  318 + _paramObj.getEPeakStartTimeObj(), true, true);
  319 + qIndex = qbcIndexArray[0]; // 第几圈
  320 + bIndex = qbcIndexArray[1]; // 第几个班次
  321 +
  322 + for (i = 1; i < _internalLpArray.length; i++) {
  323 + _fnGenerateBcAndSetBc(i, qIndex, bIndex);
  324 + }
  325 +
  326 + _approximate_wgfQIndex = qIndex;
  327 + _approximate_wgfBIndex = bIndex;
  328 +
  329 + console.log("早高峰周转时间(固定最大停战时间):" + _paramObj.calcuPeakZzsj() + "分钟");
  330 + console.log("早高峰发车时间范围:" + _paramObj.getMPeakMinFcjx() + "分钟 --- " + _paramObj.getMPeakMaxFcjx() + "分钟");
  331 + console.log("预估早高峰第" + _approximate_zgfQIndex + "(index)圈,第" + _approximate_zgfBIndex + "(index)班次车辆全部发出");
  332 + console.log("预估晚高峰第" + _approximate_wgfQIndex + "(index)圈,第" + _approximate_wgfBIndex + "(index)班次车辆全部发出");
  333 + console.log("//---------------- 行车计划,初始化方法2 end ----------------//");
  334 + };
  335 +
  336 + //----------------------- 初始化方法3,计算连班分班的路牌分布 ----------------//
  337 + var _iBx_lb_lpcount; // 连班路牌数
  338 + var _iBx_5_2_fb_lpcount; // 5休2分班路牌数
  339 + var _iBx_other_fb_lpcount; // 其他分班路牌数
  340 +
  341 + var _fnInitFun3 = function() { // 初始化方法3
  342 + console.log("//---------------- 行车计划,初始化方法3 start ----------------//");
  343 +
  344 + //--------------------- 1、计算分班连班班型车辆分布数 --------------------//
  345 + // 总共车辆数(高峰最大车辆数)
  346 + var iCls = _paramObj.calcuClzx();
  347 + // 低谷最少配车(连班车数量)
  348 + var iDgminpc = Math.round(_paramObj.calcuTroughZzsj() / _paramObj.getTroughMaxFcjx());
  349 + // 加班车路牌数(做5休2的路牌数)
  350 + var i_5_2_lpes = _paramObj.getJBLpes();
  351 +
  352 + // 做些简单的验证
  353 + if (iCls < iDgminpc) {
  354 + alert("总配车数小于低谷最小配车");
  355 + throw "总配车数小于低谷最小配车";
  356 + }
  357 + if (iDgminpc < 2) {
  358 + alert("连班路牌小于2,办不到啊");
  359 + throw "连班路牌小于2,办不到啊";
  360 + }
  361 + if (iCls - iDgminpc < i_5_2_lpes) {
  362 + alert("总分班路牌数小于加班路牌数");
  363 + throw "总分班路牌数小于加班路牌数";
  364 + }
  365 +
  366 + //// 修正连班路牌数,班次间隔大于20的,加1,直至班次间隔小于20
  367 + //while(_paramObj.calcuPeakZzsj() / iDgminpc > 20) {
  368 + // iDgminpc ++;
  369 + //}
  370 + _iBx_lb_lpcount = iDgminpc;
  371 +
  372 + _iBx_5_2_fb_lpcount = i_5_2_lpes;
  373 + _iBx_other_fb_lpcount = iCls - _iBx_lb_lpcount - i_5_2_lpes;
  374 +
  375 + //------------------------ 2、利用间隔法计算连班路牌分布 --------------------//
  376 + var i;
  377 + var j;
  378 + var iC1 = Math.floor(_internalLpArray.length / _iBx_lb_lpcount);
  379 + var iC2 = _internalLpArray.length % _iBx_lb_lpcount;
  380 + var iLpIndex;
  381 +
  382 + for (i = 0; i < _iBx_lb_lpcount - iC2; i++) {
  383 + iLpIndex = i * iC1;
  384 + _internalLpArray[iLpIndex].setBxLb(true);
  385 + _internalLpArray[iLpIndex].setBxDesc("连班");
  386 + }
  387 + for (j = 0; j < iC2; j++) {
  388 + iLpIndex = i * iC1 + j * (iC1 + 1);
  389 + _internalLpArray[iLpIndex].setBxLb(true);
  390 + _internalLpArray[iLpIndex].setBxDesc("连班");
  391 + }
  392 +
  393 + //------------------------ 3、利用间隔法计算分班班型路牌分布 --------------------//
  394 + // 获取分班路牌索引
  395 + var aNotLbIndexes = [];
  396 + for (i = 0; i < _internalLpArray.length; i++) {
  397 + if (!_internalLpArray[i].isBxLb()) {
  398 + aNotLbIndexes.push(i);
  399 + }
  400 + }
  401 + // 先5休2分班
  402 + iC1 = Math.floor(aNotLbIndexes.length / _iBx_5_2_fb_lpcount);
  403 + iC2 = aNotLbIndexes.length % _iBx_5_2_fb_lpcount;
  404 +
  405 + for (i = 0; i < _iBx_5_2_fb_lpcount - iC2; i++) {
  406 + iLpIndex = aNotLbIndexes[i * iC1];
  407 + _internalLpArray[iLpIndex].setBxLb(false);
  408 + _internalLpArray[iLpIndex].setBxFb(true);
  409 + _internalLpArray[iLpIndex].setBxFb5_2(true);
  410 + _internalLpArray[iLpIndex].setBxDesc("5休2分班");
  411 + }
  412 + for (i = 0; i < iC2; i++) {
  413 + iLpIndex = aNotLbIndexes[_iBx_5_2_fb_lpcount - iC2 + i * (iC1 + 1)];
  414 + _internalLpArray[iLpIndex].setBxLb(false);
  415 + _internalLpArray[iLpIndex].setBxFb(true);
  416 + _internalLpArray[iLpIndex].setBxFb5_2(true);
  417 + _internalLpArray[iLpIndex].setBxDesc("5休2分班");
  418 + }
  419 + // 其他分班
  420 + for (i = 0; i < aNotLbIndexes.length; i++) {
  421 + iLpIndex = aNotLbIndexes[i];
  422 + if (!_internalLpArray[iLpIndex].isBxFb5_2()) {
  423 + _internalLpArray[iLpIndex].setBxLb(false);
  424 + _internalLpArray[iLpIndex].setBxFb(true);
  425 + _internalLpArray[iLpIndex].setBxFb5_2(false);
  426 + _internalLpArray[iLpIndex].setBxDesc("其他分班");
  427 + }
  428 + }
  429 +
  430 + console.log("高峰周转时间:" + _paramObj.calcuPeakZzsj());
  431 + console.log("连班路牌数:" + _iBx_lb_lpcount);
  432 + console.log("5休2分班路牌数:" + _iBx_5_2_fb_lpcount);
  433 + console.log("其他分班路牌数:" + _iBx_other_fb_lpcount);
  434 + var aLbIndexes = [];
  435 + for (i = 0; i < _internalLpArray.length; i++) {
  436 + if (_internalLpArray[i].isBxLb()) {
  437 + aLbIndexes.push(i);
  438 + }
  439 + }
  440 + console.log("连班路牌indexes=" + aLbIndexes);
  441 + var a_5_2_fbIndexes = [];
  442 + for (i = 0; i < _internalLpArray.length; i++) {
  443 + if (_internalLpArray[i].isBxFb() && _internalLpArray[i].isBxFb5_2()) {
  444 + a_5_2_fbIndexes.push(i);
  445 + }
  446 + }
  447 + console.log("5休2分班路牌indexes=" + a_5_2_fbIndexes);
  448 + var a_other_fbIndexes = [];
  449 + for (i = 0; i < _internalLpArray.length; i++) {
  450 + if (_internalLpArray[i].isBxFb() && !_internalLpArray[i].isBxFb5_2()) {
  451 + a_other_fbIndexes.push(i);
  452 + }
  453 + }
  454 + console.log("其他分班路牌indexes=" + a_other_fbIndexes);
  455 +
  456 + console.log("//---------------- 行车计划,初始化方法3 end ----------------//");
  457 + };
  458 +
  459 + //----------------------- 初始化方法4,计算中标线位置 -------------------------//
  460 + var _iZbx_lpIndex; // 中标线对应第几个路牌
  461 +
  462 + var _fnInitFun4 = function() { // 初始化方法4
  463 + console.log("//---------------- 行车计划,初始化方法4 start ----------------//");
  464 +
  465 + //---------------------------- 1、模拟一个中标线,使用临时路牌 ----------------------//
  466 + // 构造中标线
  467 + // 中标线开始时间,就是方向的首班车时间
  468 + var oSt = !_qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
  469 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  470 + // 上标线结束时间,使用最晚的末班车时间,结束时间的班次方向
  471 + var oEt;
  472 + if (_paramObj.getUpLastDtimeObj().isBefore(
  473 + _paramObj.getDownLastDTimeObj())) {
  474 + oEt = _paramObj.getDownLastDTimeObj();
  475 + } else {
  476 + oEt = _paramObj.getUpLastDtimeObj();
  477 + }
  478 +
  479 + var oTempLp = new InternalLpObj({lpNo: -999, lpName: "-999"}, _qCount, _qIsUp);
  480 + oTempLp.initDataFromTimeToTime(
  481 + oSt,
  482 + oEt,
  483 + !_qIsUp,
  484 + 0,
  485 + _paramObj,
  486 + _factory
  487 + );
  488 +
  489 + //------------------------ 2、找出中标线的早高峰班次,计算应该插在当前路牌数组的那个位置 ----------------//
  490 + // 找出中标线对应的早高峰的班次对象
  491 + var oZb_gf_bc = oTempLp.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
  492 + //alert(oZb_gf_bc.getFcTimeObj().format("HH:mm"));
  493 +
  494 + // 把所有连班路牌高峰班次重新构造成一个一个的圈数组,计算对应中标线最近的是第几个路牌
  495 + // 中标线和上标线一样在连班路牌上
  496 + var aTempq = [];
  497 + var oTempq;
  498 + var oTempb;
  499 + var i;
  500 + var oLp;
  501 +
  502 + var aLbIndexes = []; // 连班的路牌索引
  503 + for (i = 0; i < _internalLpArray.length; i++) {
  504 + if (_internalLpArray[i].isBxLb()) {
  505 + aLbIndexes.push(i);
  506 + }
  507 + }
  508 +
  509 + for (i = 0; i < aLbIndexes.length; i++) {
  510 + oLp = _internalLpArray[aLbIndexes[i]];
  511 +
  512 + oTempb = oLp.getBc(_approximate_zgfQIndex, _approximate_zgfBIndex);
  513 + if (oTempb.isUp() == _qIsUp) {
  514 + oTempq = new InternalGroupObj(oLp, _qIsUp, oTempb, undefined);
  515 + } else {
  516 + oTempq = new InternalGroupObj(oLp, _qIsUp, undefined, oTempb);
  517 + }
  518 + aTempq.push(oTempq);
  519 +
  520 + }
  521 +
  522 + var aTtindex = oTempLp.fnGetQBcIndexWithFcTimeFromGroupArray( // 找出最接近中标线的路牌索引
  523 + oZb_gf_bc.getFcTimeObj(),
  524 + aTempq,
  525 + true,
  526 + true
  527 + );
  528 +
  529 + _iZbx_lpIndex = aLbIndexes[aTtindex[0]]; // 中标线放在第几个路牌
  530 +
  531 + oTempLp.getMinBcObj().fnSetIsFirstBc(true); // 设置首班班次标识
  532 +
  533 + if (_iZbx_lpIndex == 0) { // 如果中标线和上标线一致
  534 + var oFirstBcIndexes = oTempLp.getMinBcObjPosition();
  535 + var oFirstBc = oTempLp.getMinBcObj();
  536 + oFirstBc.setLp(_internalLpArray[_iZbx_lpIndex]);
  537 + oFirstBc.fnSetDelFlag(false);
  538 + _internalLpArray[_iZbx_lpIndex].setBc(oFirstBcIndexes[0], oFirstBcIndexes[1], oFirstBc);
  539 + } else {
  540 + oTempLp.setLp(_lpArray[_iZbx_lpIndex]); // 设置原始路牌对象
  541 + oTempLp._$_aVerticalIntervalTime = _internalLpArray[_iZbx_lpIndex]._$_aVerticalIntervalTime; // 设置纵向最小发车间隔
  542 + oTempLp.setBxLb(_internalLpArray[_iZbx_lpIndex].isBxLb());
  543 + oTempLp.setBxFb(_internalLpArray[_iZbx_lpIndex].isBxFb());
  544 + oTempLp.setBxFb5_2(_internalLpArray[_iZbx_lpIndex].isBxFb5_2());
  545 +
  546 + // 修正除了第一个班次外,其余其他班次
  547 + var iBcindex = 0;
  548 + for (i = 1; i < _qCount; i++) {
  549 + while (iBcindex <= 1) {
  550 + if (oTempLp.getBc(i, iBcindex)) { // 替换存在的班次
  551 + oTempLp.setBc(i, iBcindex, _fnGenerateBc(_iZbx_lpIndex, i, iBcindex));
  552 + }
  553 + iBcindex ++;
  554 + }
  555 + iBcindex = 0;
  556 + }
  557 +
  558 + _internalLpArray[_iZbx_lpIndex] = oTempLp;
  559 + }
  560 +
  561 + console.log("中标线对应第" + (_iZbx_lpIndex + 1) + "个路牌");
  562 +
  563 + console.log("//---------------- 行车计划,初始化方法4 end ----------------//");
  564 + };
  565 +
  566 + //-------------------- 重要的内部方法 -----------------------//
  567 + /**
  568 + * 核心方法,利用路牌间隔纵向生成班次。
  569 + * @param iLpindex 路牌索引
  570 + * @param iQindex 圈索引
  571 + * @param iBcindex 班次索引
  572 + * @returns object InternalBcObj,失败 false
  573 + */
  574 + var _fnGenerateBc = function(iLpindex, iQindex, iBcindex) {
  575 + // 以上标线为起始点,使用路牌在不同圈,班次索引的发车间隔,计算班次
  576 + // 注意,发车间隔是指下一个班次应该距离当前班次间隔,是从下往上的
  577 +
  578 + // 1、参数验证
  579 + if (iLpindex == 0) { // 上标线的班次不需要生成
  580 + return false;
  581 + }
  582 +
  583 + // 2、计算间隔
  584 + var i;
  585 + var oLp;
  586 + var iTime = 0;
  587 + for (i = 0; i < iLpindex; i++) {
  588 + oLp = _internalLpArray[i];
  589 + iTime += oLp.fnGetVerticalIntervalTime(iQindex, iBcindex);
  590 + }
  591 +
  592 + // 3、生成班次
  593 + var _oKsbc = _internalLpArray[0].getBc(iQindex, iBcindex);
  594 + if (!_oKsbc) {
  595 + return false;
  596 + }
  597 + var _oKssj = _paramObj.addMinute(_oKsbc.getFcTimeObj(), iTime);
  598 + var _oBc = _factory.createBcObj(
  599 + _internalLpArray[iLpindex],
  600 + "normal", _oKsbc.isUp(),
  601 + 1, _oKssj, _paramObj);
  602 +
  603 + return _oBc;
  604 +
  605 + };
  606 +
  607 + /**
  608 + * 核心方法,在指定位置生成班次并添加到路牌指定位置中。
  609 + * @param lpIndex 第几个路牌
  610 + * @param qIndex 第几圈
  611 + * @param bcIndex 第几个班次
  612 + */
  613 + var _fnGenerateBcAndSetBc = function(lpIndex, qIndex, bcIndex) {
  614 + var _bcObj = _fnGenerateBc(lpIndex, qIndex, bcIndex);
  615 + if (_bcObj) {
  616 + _internalLpArray[lpIndex].setBc(qIndex, bcIndex, _bcObj);
  617 + }
  618 + };
  619 +
  620 + /**
  621 + * 获取班次列表。
  622 + * @param oIsUp 是否上行
  623 + * @param oStartTime 开始时间对象
  624 + * @returns [(InternalBcObj)]
  625 + */
  626 + var _fnGetBcList2 = function(oIsUp, oStartTime) {
  627 + var i;
  628 + var j;
  629 + var oLp;
  630 + var oBc;
  631 + var aBc = [];
  632 +
  633 + for (j = 0; j < _qCount; j++) {
  634 + for (i = 0; i < _internalLpArray.length; i++) {
  635 + oLp = _internalLpArray[i];
  636 + oBc = oLp.getBc(
  637 + j,
  638 + _qIsUp == oIsUp ? 0 : 1
  639 + );
  640 + if (oBc && oBc.getFcTimeObj().isAfter(oStartTime)) {
  641 + aBc.push(oBc);
  642 + }
  643 + }
  644 + }
  645 +
  646 + var aBcFcTime = [];
  647 + for (i = 0; i < aBc.length; i++) {
  648 + oBc = aBc[i];
  649 + aBcFcTime.push(oBc.getFcTimeObj().format("HH:mm"));
  650 + }
  651 + console.log((oIsUp ? "上行班次列表:" : "下行班次列表:") + aBcFcTime.join(","));
  652 +
  653 + return aBc;
  654 + };
  655 +
  656 + /**
  657 + * 获取班次列表。
  658 + * @param isUp boolean 是否上行
  659 + * @returns [(InternalBcObj)]
  660 + */
  661 + var _fnGetBcList = function(isUp) {
  662 + var i;
  663 + var j;
  664 + var oLp;
  665 + var oBc;
  666 + var aBc = [];
  667 +
  668 + for (j = 0; j < _qCount; j++) {
  669 + for (i = 0; i < _internalLpArray.length; i++) {
  670 + oLp = _internalLpArray[i];
  671 + oBc = oLp.getBc(
  672 + j,
  673 + _qIsUp == isUp ? 0 : 1
  674 + );
  675 + if (oBc) {
  676 + aBc.push(oBc);
  677 + }
  678 + }
  679 + }
  680 +
  681 + var aBcFcTime = [];
  682 + for (i = 0; i < aBc.length; i++) {
  683 + oBc = aBc[i];
  684 + aBcFcTime.push(oBc.getFcTimeObj().format("HH:mm"));
  685 + }
  686 + console.log((isUp ? "上行班次列表:" : "下行班次列表:") + aBcFcTime.join(","));
  687 +
  688 + return aBc;
  689 + };
  690 +
  691 + /**
  692 + * 查找离指定时间最近的前面的班次索引信息
  693 + * @param timeObj 查找时间
  694 + * @param isUp 是否上行
  695 + * @returns [{路牌index},{圈index},{班次index}]
  696 + */
  697 + var _fnFindUpClosedBcIndexWithTime = function(timeObj, isUp) {
  698 +
  699 + var _lpObj;
  700 + var _groupObj;
  701 + var _bcObj;
  702 + var _i;
  703 + var _j;
  704 + var timediff; // 时间差取绝对值
  705 +
  706 + var _lpIndex;
  707 + var _up_qIndex;
  708 + var _up_bIndex;
  709 +
  710 + for (_i = 0; _i < _qCount; _i++) {
  711 + for (_j = 0; _j < _internalLpArray.length; _j++) {
  712 + _lpObj = _internalLpArray[_j];
  713 + _groupObj = _lpObj.getGroup(_i);
  714 + _bcObj = isUp == _qIsUp ? _groupObj.getBc1() : _groupObj.getBc2();
  715 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
  716 + _bcObj = _fnGenerateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
  717 + }
  718 + if (_bcObj) {
  719 + if (timeObj.diff(_bcObj.getFcTimeObj()) >= 0) {
  720 + if (!timediff) {
  721 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  722 + _lpIndex = _j;
  723 + _up_qIndex = _i;
  724 + _up_bIndex = isUp == _qIsUp ? 0 : 1;
  725 + } else {
  726 + if (timeObj.diff(_bcObj.getFcTimeObj()) < timediff) {
  727 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  728 + _lpIndex = _j;
  729 + _up_qIndex = _i;
  730 + _up_bIndex = isUp == _qIsUp ? 0 : 1;
  731 + }
  732 + }
  733 + }
  734 + }
  735 + }
  736 + }
  737 +
  738 + if (_lpIndex == undefined) {
  739 + return false;
  740 + }
  741 +
  742 + var bcindex = [];
  743 + bcindex.push(_lpIndex);
  744 + bcindex.push(_up_qIndex);
  745 + bcindex.push(_up_bIndex);
  746 +
  747 + return bcindex;
  748 + };
  749 +
  750 + /**
  751 + * 查找离指定时间最近的后面的班次索引信息
  752 + * @param timeObj 查找时间
  753 + * @param isUp 是否上行
  754 + * @returns [{路牌index},{圈index},{班次index}]
  755 + */
  756 + var _fnFindDownClosedBcIndexWithTime = function(timeObj, isUp) {
  757 + var _lpObj;
  758 + var _groupObj;
  759 + var _bcObj;
  760 + var _i;
  761 + var _j;
  762 + var timediff; // 时间差取绝对值
  763 +
  764 + var _lpIndex;
  765 + var _down_qIndex;
  766 + var _down_bIndex;
  767 +
  768 + var flag;
  769 +
  770 + for (_i = 0; _i < _qCount; _i++) {
  771 + for (_j = 0; _j < _internalLpArray.length; _j++) {
  772 + _lpObj = _internalLpArray[_j];
  773 + _groupObj = _lpObj.getGroup(_i);
  774 + // TODO:bug
  775 + _bcObj = isUp == _qIsUp ? _groupObj.getBc1() : _groupObj.getBc2();
  776 + if (!_bcObj) { // 没有班次动态生成一个,可能生成不出的
  777 + _bcObj = _fnGenerateBc(_j, _i, isUp == _qIsUp ? 0 : 1);
  778 + }
  779 + if (_bcObj) {
  780 + //console.log("timeobj -> bcobj diff flag " +
  781 + // timeObj.format("HH:mm") + "->" +
  782 + // _bcObj.getFcTimeObj().format("HH:mm") +
  783 + // timeObj.diff(_bcObj.getFcTimeObj()) +
  784 + // (timeObj.diff(_bcObj.getFcTimeObj()) <= 0)
  785 + //);
  786 +
  787 + flag = (timeObj.diff(_bcObj.getFcTimeObj())) <= 0;
  788 +
  789 + if (flag) {
  790 + if (!timediff) {
  791 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  792 + _lpIndex = _j;
  793 + _down_qIndex = _i;
  794 + _down_bIndex = isUp == _qIsUp ? 0 : 1;
  795 + } else {
  796 + if ((timeObj.diff(_bcObj.getFcTimeObj())) > timediff) {
  797 + timediff = timeObj.diff(_bcObj.getFcTimeObj());
  798 + _lpIndex = _j;
  799 + _down_qIndex = _i;
  800 + _down_bIndex = isUp == _qIsUp ? 0 : 1;
  801 + }
  802 + }
  803 + }
  804 + }
  805 + }
  806 + }
  807 +
  808 + if (_lpIndex == undefined) {
  809 + return false;
  810 + }
  811 +
  812 + var bcindex = [];
  813 + bcindex.push(_lpIndex);
  814 + bcindex.push(_down_qIndex);
  815 + bcindex.push(_down_bIndex);
  816 +
  817 + return bcindex;
  818 + };
  819 +
  820 + /**
  821 + * 获取班次索引。
  822 + * @param oBc 班次对象
  823 + * @returns [{路牌索引},{圈索引},{班次索引}]
  824 + */
  825 + var _fnGetBcIndex = function(oBc) {
  826 + // 路牌索引
  827 + var i;
  828 + var iLpIndex;
  829 + for (i = 0; i < _internalLpArray.length; i++) {
  830 + if (_internalLpArray[i]._$$_orign_lp_obj == oBc._$$_internal_lp_obj._$$_orign_lp_obj) {
  831 + iLpIndex = i;
  832 + break;
  833 + }
  834 + }
  835 + // 圈索引
  836 + var j;
  837 + var iGroupIndex;
  838 + var bFlag = false;
  839 + for (i = 0; i < _internalLpArray.length; i++) {
  840 + if (bFlag) {
  841 + break;
  842 + }
  843 + for (j = 0; j < _qCount; j++) {
  844 + if (_internalLpArray[i]._$_groupBcArray[j] == oBc._$$_internal_group_obj) {
  845 + iGroupIndex = j;
  846 + bFlag = true;
  847 + break;
  848 + }
  849 + }
  850 + }
  851 + // 班次索引
  852 + var iBcIndex = _qIsUp == oBc.isUp() ? 0 : 1;
  853 +
  854 + if (iLpIndex == undefined) {
  855 + return null;
  856 + } else {
  857 + return [].concat(iLpIndex, iGroupIndex, iBcIndex);
  858 + }
  859 +
  860 + };
  861 +
  862 + return {
  863 + //------------- 布局初始化方法 ------------//
  864 + /**
  865 + * 初始化数据,使用标线初始化
  866 + */
  867 + fnInitDataWithBxLayout: function() {
  868 + // 初始化布局1,构造上标线,计算圈数,把上标线数据放入第一个路牌中
  869 + _fnInitFun1();
  870 + // 初始化布局2,从上标线的某个班次开始,构造所有路牌的早高峰班次,晚高峰班次,计算路牌在各个圈中的间隔
  871 + _fnInitFun2();
  872 + // 初始化布局3,计算连班分班路牌分布
  873 + _fnInitFun3();
  874 + // 初始化布局4,计算中标线位置
  875 + _fnInitFun4();
  876 +
  877 + },
  878 +
  879 + /**
  880 + * 调整高峰班次,
  881 + * 初始化生成早高峰,晚高峰班次并不准确,因为根据高峰时间段,并不在一个完整圈内,应该是在两个或多个圈之间
  882 + * 当初始化定好布局后(上标线,中标线),然后确定每个路牌的班型(连班,分班,5休2分班)后
  883 + * 然后重新计算框在高峰时间段内的班次索引,不足的添加,之前多加的删除(只删除分班路牌上的)
  884 + * @param isZgf 是否早高峰
  885 + * @param isUp 是否上行
  886 + */
  887 + fnAdjustGfbc : function(isZgf, isUp) {
  888 + var oStartTime; // 开始时间
  889 + var oEndTime; // 结束时间
  890 + var aStartBcIndex; // 开始班次索引
  891 + var aEndBcIndex; // 结束班次索引
  892 +
  893 + oStartTime = isZgf ? _paramObj.getMPeakStartTimeObj() : _paramObj.getEPeakStartTimeObj();
  894 + oEndTime = isZgf ? _paramObj.getMPeakEndTimeObj() : _paramObj.getEPeakEndTimeObj();
  895 +
  896 + aStartBcIndex = _fnFindUpClosedBcIndexWithTime(oStartTime, isUp);
  897 + aEndBcIndex = _fnFindDownClosedBcIndexWithTime(oEndTime, isUp);
  898 +
  899 + var iLpIndex;
  900 + var iQIndex;
  901 + var iBcIndex;
  902 + var iQInternelCount; // 高峰时间段中间包含的圈数
  903 + var i;
  904 + var j;
  905 +
  906 + var oLp;
  907 +
  908 + if (aStartBcIndex && aEndBcIndex) {
  909 + iLpIndex = aStartBcIndex[0];
  910 + iQIndex = aStartBcIndex[1];
  911 + iBcIndex = aStartBcIndex[2];
  912 +
  913 + // 处理头
  914 + // 删除头部多余班次
  915 + for (j = 0; j < iLpIndex; j++) {
  916 + oLp = _internalLpArray[j];
  917 + if (oLp.isBxFb() && oLp.getBc(iQIndex, iBcIndex)) {
  918 + oLp.removeBc(iQIndex, iBcIndex);
  919 + }
  920 + }
  921 +
  922 + for (j = iLpIndex; j < _internalLpArray.length; j++) {
  923 + oLp = _internalLpArray[j];
  924 + if (!oLp.getBc(iQIndex, iBcIndex)) {
  925 + _fnGenerateBcAndSetBc(j, iQIndex, iBcIndex);
  926 + }
  927 + }
  928 +
  929 + // 处理中间
  930 + iQInternelCount = aEndBcIndex[1] - aStartBcIndex[1] - 1;
  931 + for (i = 1; i <= iQInternelCount; i++) {
  932 + oLp = _internalLpArray[iQIndex + i];
  933 +
  934 + if (!oLp.getBc(iQIndex + i, iBcIndex)) {
  935 + _fnGenerateBcAndSetBc(i, iQIndex + i, iBcIndex);
  936 + }
  937 + }
  938 +
  939 + // 处理尾部
  940 + iLpIndex = aEndBcIndex[0];
  941 + iQIndex = aEndBcIndex[1];
  942 + iBcIndex = aEndBcIndex[2];
  943 +
  944 + // 删除尾部多余的班次
  945 + for (j = iLpIndex; j < _internalLpArray.length; j++) {
  946 + oLp = _internalLpArray[j];
  947 + if (oLp.isBxFb() && oLp.getBc(iQIndex, iBcIndex)) {
  948 + oLp.removeBc(iQIndex, iBcIndex);
  949 + }
  950 + }
  951 +
  952 + if (aStartBcIndex[1] != aEndBcIndex[1]) { // 指定时间范围跨圈
  953 + for (j = 0; j < iLpIndex; j++) {
  954 + oLp = _internalLpArray[j];
  955 + if (!oLp.getBc(iQIndex, iBcIndex)) {
  956 + _fnGenerateBcAndSetBc(j, iQIndex, iBcIndex);
  957 + }
  958 + }
  959 + } else {
  960 + // 不跨圈,不用处理,处理头的时候已经加了
  961 + }
  962 +
  963 + }
  964 +
  965 + },
  966 +
  967 + /**
  968 + * 按照营运时间要求补充班次,
  969 + * 早高峰7:45分以前出场运营,
  970 + * 晚高峰16:10分以前出场运营
  971 + */
  972 + fnCalcuLpBc_yy: function() {
  973 + // 补班次的时候,针对的是分班班型
  974 + var i;
  975 + var _oLp;
  976 + var _oBc;
  977 + var _aMinBcIndex;
  978 + var _aMaxBcIndex;
  979 +
  980 + var _qIndex;
  981 + var _bIndex;
  982 +
  983 + var _zgfCDate = _paramObj.toTimeObj("7:45");
  984 + var _wgfCDate = _paramObj.toTimeObj("16:10");
  985 + var _ccsj;
  986 +
  987 + for (i = 0; i < _internalLpArray.length; i++) {
  988 + _oLp = _internalLpArray[i];
  989 + if (_oLp.isBxFb()) { // 分班路牌
  990 + // 早高峰部分
  991 + _aMinBcIndex = _oLp.getMinBcObjPosition();
  992 + _qIndex = _aMinBcIndex[0];
  993 + _bIndex = _aMinBcIndex[1];
  994 + _oBc = _oLp.getBc(_qIndex, _bIndex);
  995 + if (_qIsUp) {
  996 + _ccsj = _bIndex == 0 ?
  997 + _paramObj.getUpOutTime() :
  998 + _paramObj.getDownOutTime();
  999 + } else {
  1000 + _ccsj = _bIndex == 0 ?
  1001 + _paramObj.getDownOutTime() :
  1002 + _paramObj.getUpOutTime();
  1003 + }
  1004 + if (_zgfCDate.isBefore(_paramObj.addMinute(_oBc.getFcTimeObj(), -_ccsj))) {
  1005 + _fnGenerateBcAndSetBc(
  1006 + i,
  1007 + _bIndex == 0 ? _qIndex - 1 : _qIndex,
  1008 + _bIndex == 0 ? 1 : 0
  1009 + )
  1010 + }
  1011 +
  1012 + // 晚高峰部分
  1013 + _aMaxBcIndex = _oLp.getMaxBcObjPosition();
  1014 + _qIndex = _aMaxBcIndex[0];
  1015 + _bIndex = _aMaxBcIndex[1];
  1016 + _oBc = _oLp.getBc(
  1017 + _bIndex == 0 ? _qIndex - 1 : _qIndex,
  1018 + _bIndex == 0 ? 1 : 0
  1019 + );
  1020 + if (!_oBc) { // 前一个班次不存在,再判定加不加
  1021 + _oBc = _oLp.getBc(_qIndex, _bIndex);
  1022 + if (_qIsUp) {
  1023 + _ccsj = _bIndex == 0 ?
  1024 + _paramObj.getUpOutTime() :
  1025 + _paramObj.getDownOutTime();
  1026 + } else {
  1027 + _ccsj = _bIndex == 0 ?
  1028 + _paramObj.getDownOutTime() :
  1029 + _paramObj.getUpOutTime();
  1030 + }
  1031 + if (_wgfCDate.isBefore(_paramObj.addMinute(_oBc.getFcTimeObj(), -_ccsj))) {
  1032 + _fnGenerateBcAndSetBc(
  1033 + i,
  1034 + _bIndex == 0 ? _qIndex - 1 : _qIndex,
  1035 + _bIndex == 0 ? 1 : 0
  1036 + )
  1037 + }
  1038 + }
  1039 + }
  1040 + }
  1041 + },
  1042 +
  1043 + /**
  1044 + * 补充做5休2的班型班次。
  1045 + * 1、确认5_2班型大致多少圈(小数点过.7进位)
  1046 + * 2、获取当前5_2两端车次链的信息,每段的班次数目,还差几个班次没加
  1047 + * 3、如果前面的车次链班次少,则从前面的车次链开始加
  1048 + * 4、如果车次链班次数一样,从从后面的车次链开始加
  1049 + * 5、加班次时都是往车次链前方加
  1050 + * 6、如果前面车次链不能再加班次了,从后面车次链加
  1051 + */
  1052 + fnCalcuLpBx_5_2: function() {
  1053 + // 计算做5休2班型所需的班次数
  1054 + var iBxBcount = _aBxDesc[6].fBcCount;
  1055 + if (iBxBcount - Math.floor(iBxBcount) > 0.7) {
  1056 + iBxBcount = Math.floor(iBxBcount) + 1;
  1057 + } else {
  1058 + iBxBcount = Math.floor(iBxBcount);
  1059 + }
  1060 +
  1061 + var i;
  1062 + var j;
  1063 + var oLp;
  1064 + var iAddBcCount;
  1065 + var oBcChain1;
  1066 + var oBcChain2;
  1067 + var iQindex;
  1068 + var iBindex;
  1069 +
  1070 + for (i = 0; i < _internalLpArray.length; i++) {
  1071 + oLp = _internalLpArray[i];
  1072 + if (oLp.isBxFb5_2()) {
  1073 + iAddBcCount = iBxBcount - oLp.getBcArray().length; // 需要添加的班次数
  1074 + for (j = 1; j <= iAddBcCount; j++) {
  1075 + oBcChain1 = oLp.fnGetBcChainInfo(0);
  1076 + oBcChain2 = oLp.fnGetBcChainInfo(1);
  1077 +
  1078 + if (oBcChain1.bcount < oBcChain2.bcount) {
  1079 + iQindex = oBcChain1.s_b == 0 ? oBcChain1.s_q - 1 : oBcChain1.s_q;
  1080 + iBindex = oBcChain1.s_b == 0 ? 1 : 0;
  1081 + // 往车次链往前不能加,就往后加
  1082 + if (_fnGenerateBc(i, iQindex, iBindex)) {
  1083 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1084 + } else {
  1085 + iQindex = oBcChain1.e_b == 0 ? oBcChain1.e_q : oBcChain1.e_q + 1;
  1086 + iBindex = oBcChain1.e_b == 0 ? 1 : 0;
  1087 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1088 + }
  1089 +
  1090 + } else if (oBcChain1.bcount > oBcChain2.bcount) {
  1091 + iQindex = oBcChain2.s_b == 0 ? oBcChain2.s_q - 1 : oBcChain2.s_q;
  1092 + iBindex = oBcChain2.s_b == 0 ? 1 : 0;
  1093 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1094 + } else {
  1095 + iQindex = oBcChain2.s_b == 0 ? oBcChain2.s_q - 1 : oBcChain2.s_q;
  1096 + iBindex = oBcChain2.s_b == 0 ? 1 : 0;
  1097 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1098 + }
  1099 + }
  1100 + }
  1101 + }
  1102 +
  1103 + },
  1104 +
  1105 + /**
  1106 + * 补其他分班班型班次。
  1107 + * 从车次链的后面开始加
  1108 + */
  1109 + fnCalcuLpBx_other: function() {
  1110 + // TODO:根据上标线的首班时间确定班型,小于05:59的做一休一,否则做二休一
  1111 + var oSt = _qIsUp ? _paramObj.getUpFirstDTimeObj() : _paramObj.getDownFirstDTimeObj();
  1112 + var iBxIndex = 4;
  1113 + if (oSt.isBefore(_paramObj.toTimeObj("05:59"))) {
  1114 + iBxIndex = 5;
  1115 + }
  1116 + // 计算做5休2班型所需的班次数
  1117 + var iQBcount = _aBxDesc[iBxIndex].fQCount;
  1118 + var iBxBcount = Math.round(iQBcount) * 2;
  1119 +
  1120 + var i;
  1121 + var j;
  1122 + var oLp;
  1123 + var iAddBcCount;
  1124 + var oBcChain1;
  1125 + var oBcChain2;
  1126 + var iQindex;
  1127 + var iBindex;
  1128 +
  1129 + for (i = 0; i < _internalLpArray.length; i++) {
  1130 + oLp = _internalLpArray[i];
  1131 + if (oLp.isBxFb() && !oLp.isBxFb5_2()) {
  1132 + iAddBcCount = iBxBcount - oLp.getBcArray().length; // 需要添加的班次数
  1133 + for (j = 1; j <= iAddBcCount; j++) {
  1134 + oBcChain1 = oLp.fnGetBcChainInfo(0);
  1135 + oBcChain2 = oLp.fnGetBcChainInfo(1);
  1136 +
  1137 + if (oBcChain1.bcount < oBcChain2.bcount) {
  1138 + iQindex = oBcChain1.e_b == 0 ? oBcChain1.e_q : oBcChain1.e_q + 1;
  1139 + iBindex = oBcChain1.e_b == 0 ? 1 : 0;
  1140 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1141 + } else if (oBcChain1.bcount > oBcChain2.bcount) {
  1142 + iQindex = oBcChain2.e_b == 0 ? oBcChain2.e_q : oBcChain2.e_q + 1;
  1143 + iBindex = oBcChain2.e_b == 0 ? 1 : 0;
  1144 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1145 + } else {
  1146 + iQindex = oBcChain2.e_b == 0 ? oBcChain2.e_q : oBcChain2.e_q + 1;
  1147 + iBindex = oBcChain2.e_b == 0 ? 1 : 0;
  1148 + _fnGenerateBcAndSetBc(i, iQindex, iBindex);
  1149 + }
  1150 + }
  1151 + }
  1152 + }
  1153 +
  1154 + },
  1155 +
  1156 + /**
  1157 + * 补充连班路牌班次。
  1158 + * 1、上标线,中标线中间的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向上标线起始班次靠拢
  1159 + * 2、中标线以下的连班路牌班次从早高峰班次一直拉到底,从早高峰班次向中标线起始班次靠拢
  1160 + */
  1161 + fnCalcuLpBx_lb: function() {
  1162 + // 补充连班的班次,参照上标线,中标线补充不足的班次
  1163 +
  1164 + var aLbLpindexes = []; // 除上标线,中标线的连班路牌索引
  1165 + var i;
  1166 + for (i = 0; i < _internalLpArray.length; i++) {
  1167 + if (_internalLpArray[i].isBxLb() && i != 0 && i != _iZbx_lpIndex) {
  1168 + aLbLpindexes.push(i);
  1169 + }
  1170 + }
  1171 +
  1172 + var oEndsj = // 结束时间
  1173 + _paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj()) ?
  1174 + _paramObj.getDownLastDTimeObj() :
  1175 + _paramObj.getUpLastDtimeObj();
  1176 +
  1177 + var oLp;
  1178 + var aMinbcPos;
  1179 + var oBc;
  1180 + var j;
  1181 + var iTempBcIndex;
  1182 +
  1183 + // 1、从最小班次开始,往后补充班次
  1184 + for (i = 0; i < aLbLpindexes.length; i++) {
  1185 + oLp = _internalLpArray[aLbLpindexes[i]];
  1186 +
  1187 + // 最小班次索引
  1188 + aMinbcPos = oLp.getMinBcObjPosition();
  1189 + // 使用纵向分隔补充班次,从最小班次向后补
  1190 + iTempBcIndex = aMinbcPos[1] == 0 ? 1 : 0;
  1191 + j = iTempBcIndex == 0 ? aMinbcPos[0] + 1 : aMinbcPos[0];
  1192 +
  1193 + while (j < _qCount) {
  1194 + while (iTempBcIndex <= 1) {
  1195 + oBc = _fnGenerateBc(aLbLpindexes[i], j, iTempBcIndex);
  1196 + if (oBc &&
  1197 + oBc.getFcTimeObj().isBefore(oEndsj) ) {
  1198 + oLp.setBc(j, iTempBcIndex, oBc);
  1199 + }
  1200 + iTempBcIndex++;
  1201 + }
  1202 + iTempBcIndex = 0;
  1203 + j++;
  1204 + }
  1205 +
  1206 + }
  1207 +
  1208 + // 2、上标线中标线之间的路牌,从最小的班次往前补充班次
  1209 +
  1210 + // 还要补充缺失的班次,差上标线几个班次要往前补上
  1211 + var iBccount;
  1212 + var iQindex;
  1213 + var iBindex;
  1214 + // 补上标线到中标线之间的连班路牌的班次
  1215 + for (i = 0; i < aLbLpindexes.length; i++) {
  1216 + if (aLbLpindexes[i] > 0 && aLbLpindexes[i] < _iZbx_lpIndex) {
  1217 + oLp = _internalLpArray[aLbLpindexes[i]];
  1218 + aMinbcPos = oLp.getMinBcObjPosition();
  1219 + iQindex = aMinbcPos[0];
  1220 + iBindex = aMinbcPos[1];
  1221 + iBccount = (iQindex - 1) * 2 + iBindex; // 距离上标线起始站点差几个班次
  1222 + for (j = 0; j < iBccount; j++) {
  1223 + if (iBindex == 0) {
  1224 + iQindex --;
  1225 + iBindex = 1;
  1226 + _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
  1227 + } else if (iBindex == 1) {
  1228 + iBindex --;
  1229 + _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
  1230 + }
  1231 + }
  1232 +
  1233 + }
  1234 +
  1235 + }
  1236 +
  1237 + // 3、中标线之后的路牌,从最小的班次往前补充班次
  1238 +
  1239 + // 补中标线以下的连班路牌的班次
  1240 + for (i = 0; i < aLbLpindexes.length; i++) {
  1241 + if (aLbLpindexes[i] > _iZbx_lpIndex) {
  1242 + oLp = _internalLpArray[aLbLpindexes[i]];
  1243 + aMinbcPos = oLp.getMinBcObjPosition();
  1244 + iQindex = aMinbcPos[0];
  1245 + iBindex = aMinbcPos[1];
  1246 + iBccount = (iQindex - 0) * 2 + iBindex - 1; // 距离上标线起始站点差几个班次
  1247 + for (j = 0; j < iBccount; j++) {
  1248 + if (iBindex == 0) {
  1249 + iQindex --;
  1250 + iBindex = 1;
  1251 + _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
  1252 + } else if (iBindex == 1) {
  1253 + iBindex --;
  1254 + _fnGenerateBcAndSetBc(aLbLpindexes[i], iQindex, iBindex);
  1255 + }
  1256 + }
  1257 + }
  1258 + }
  1259 +
  1260 + },
  1261 +
  1262 + /**
  1263 + * 计算末班车。
  1264 + * 1、将上下行拉成上下行两个班次列表(包括标记班次)
  1265 + * 2、分别找出离末班车发车时间最近的班次,并替换时间
  1266 + * 3、删除之后的班次
  1267 + */
  1268 + fnCalcuLastBc: function() {
  1269 + var i;
  1270 + var iTimeDiff;
  1271 + var iTempTime;
  1272 + var aBc;
  1273 + var oLastBcTime;
  1274 + var oLastBcIsUp;
  1275 + var iModifyIndex;
  1276 +
  1277 + // 查找末班车早的末班车时间和方向
  1278 + if (_paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj())) {
  1279 + oLastBcTime = _paramObj.getUpLastDtimeObj();
  1280 + oLastBcIsUp = true;
  1281 + } else {
  1282 + oLastBcTime = _paramObj.getDownLastDTimeObj();
  1283 + oLastBcIsUp = false;
  1284 + }
  1285 +
  1286 + // 确定早的末班车时间
  1287 + aBc = _fnGetBcList(oLastBcIsUp);
  1288 + for (i = 0; i < aBc.length; i++) {
  1289 + iTempTime = oLastBcTime.diff(aBc[i].getFcTimeObj(), "m");
  1290 + if (iTimeDiff == undefined) {
  1291 + iTimeDiff = iTempTime;
  1292 + iModifyIndex = i;
  1293 + } else if (Math.abs(iTempTime) <= Math.abs(iTimeDiff)) {
  1294 + iTimeDiff = iTempTime;
  1295 + iModifyIndex = i;
  1296 + }
  1297 + }
  1298 + aBc[iModifyIndex].addMinuteToFcsj(iTimeDiff); // 替换成末班车时间
  1299 + aBc[iModifyIndex].fnSetDelFlag(false);
  1300 + aBc[iModifyIndex].fnSetIsLastBc(true);
  1301 + for (i = iModifyIndex + 1; i < aBc.length; i++) { // 删除多余班次
  1302 + _qIsUp == oLastBcIsUp ?
  1303 + aBc[i]._$$_internal_group_obj.setBc1(undefined) :
  1304 + aBc[i]._$$_internal_group_obj.setBc2(undefined);
  1305 + }
  1306 +
  1307 + // 查找末班车晚的末班车时间和方向
  1308 + if (_paramObj.getUpLastDtimeObj().isBefore(_paramObj.getDownLastDTimeObj())) {
  1309 + oLastBcTime = _paramObj.getDownLastDTimeObj();
  1310 + oLastBcIsUp = false;
  1311 + } else {
  1312 + oLastBcTime = _paramObj.getUpLastDtimeObj();
  1313 + oLastBcIsUp = true;
  1314 + }
  1315 + // 确定晚的末班车时间
  1316 + aBc = _fnGetBcList(oLastBcIsUp);
  1317 + var oBc;
  1318 + var aBcIndex;
  1319 + var iLpIndex;
  1320 + var iQIndex;
  1321 + var iBcIndex;
  1322 +
  1323 + iTimeDiff = undefined;
  1324 + for (i = 0; i < aBc.length; i++) {
  1325 + oBc = aBc[i];
  1326 + aBcIndex = _fnGetBcIndex(oBc);
  1327 +
  1328 + iLpIndex = aBcIndex[0];
  1329 + iQIndex = aBcIndex[2] == 0 ? aBcIndex[1] -1 : aBcIndex[1];
  1330 + iBcIndex = aBcIndex[2] == 0 ? 1 : 0;
  1331 +
  1332 + if (!_internalLpArray[iLpIndex].getBc(iQIndex, iBcIndex)) {
  1333 + continue;
  1334 + }
  1335 +
  1336 + iTempTime = oLastBcTime.diff(aBc[i].getFcTimeObj(), "m");
  1337 + if (iTimeDiff == undefined) {
  1338 + iTimeDiff = iTempTime;
  1339 + iModifyIndex = i;
  1340 + } else if (Math.abs(iTempTime) <= Math.abs(iTimeDiff)) {
  1341 + iTimeDiff = iTempTime;
  1342 + iModifyIndex = i;
  1343 + }
  1344 + }
  1345 + aBc[iModifyIndex].addMinuteToFcsj(iTimeDiff); // 替换成末班车时间
  1346 + aBc[iModifyIndex].fnSetDelFlag(false);
  1347 + aBc[iModifyIndex].fnSetIsLastBc(true);
  1348 + for (i = iModifyIndex + 1; i < aBc.length; i++) { // 删除多余班次
  1349 + _qIsUp == oLastBcIsUp ?
  1350 + aBc[i]._$$_internal_group_obj.setBc1(undefined) :
  1351 + aBc[i]._$$_internal_group_obj.setBc2(undefined);
  1352 + }
  1353 +
  1354 + },
  1355 +
  1356 + /**
  1357 + * 添加吃饭班次。
  1358 + */
  1359 + fnCalcuEatBc: function() {
  1360 + // 吃午饭时间范围,10:15 到 12:15
  1361 + // 吃晚饭时间范围,18:00 到 19:00
  1362 +
  1363 + if (!_paramObj.fnIsEat()) {
  1364 + return;
  1365 + }
  1366 +
  1367 + // 午饭index
  1368 + var aLEIndex;
  1369 + // 晚饭index
  1370 + var aDEIndex;
  1371 +
  1372 + // 所有吃饭都默认在一个方向,两个方向暂时不考虑
  1373 + if (_paramObj.fnIsUpEat()) {
  1374 + aLEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("10:15"), true, false);
  1375 + aDEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("18:00"), true, false);
  1376 + } else {
  1377 + aLEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("10:15"), false, true);
  1378 + aDEIndex = _internalLpArray[0].getQBcIndexWithFcTime(_paramObj.toTimeObj("18:00"), false, true);
  1379 + }
  1380 +
  1381 + // 午饭第几圈,第几个班次
  1382 + var iLEQIndex = aLEIndex[0];
  1383 + var iLEBIndex = aLEIndex[1];
  1384 + // 晚饭第几圈,第几个班次
  1385 + var iDEQIndex = aDEIndex[0];
  1386 + var iDEBIndex = aDEIndex[1];
  1387 +
  1388 + // 注意,本模型只有连班才有吃饭
  1389 +
  1390 + var i;
  1391 + var oLp;
  1392 + var aLbIndex = []; // 连班班型的路牌索引
  1393 + for (i = 0; i < _internalLpArray.length; i++) {
  1394 + oLp = _internalLpArray[i];
  1395 + if (oLp.isBxLb()) {
  1396 + aLbIndex.push(i);
  1397 + }
  1398 + }
  1399 +
  1400 + var iLTime;
  1401 + var iDtime;
  1402 + var j;
  1403 + for (i = 0; i < aLbIndex.length; i++) {
  1404 + oLp = _internalLpArray[aLbIndex[i]];
  1405 +
  1406 + // 午饭
  1407 + iLTime = oLp.fnAddEatBc(iLEQIndex, iLEBIndex, _factory, _paramObj);
  1408 + // 晚饭
  1409 + iDtime = oLp.fnAddEatBc(iDEQIndex, iDEBIndex, _factory, _paramObj);
  1410 +
  1411 + if (i == aLbIndex.length - 1) {
  1412 + for (j = aLbIndex[i]; j < _internalLpArray.length; j++) {
  1413 + oLp = _internalLpArray[j];
  1414 + if (oLp.isBxFb()) { // 5休2班型不调整
  1415 + // 修正午饭之后路牌班次的发车时间
  1416 + oLp.fnAddMinuteToBcFcsj(iLEQIndex, iLEBIndex, iLTime);
  1417 + oLp.fnAddMinuteToBcFcsj(iDEQIndex, iDEBIndex, iDtime);
  1418 + }
  1419 + }
  1420 + } else {
  1421 + for (j = aLbIndex[i]; j < aLbIndex[i + 1]; j++) {
  1422 + oLp = _internalLpArray[j];
  1423 + if (oLp.isBxFb()) {
  1424 + // 修正午饭之后路牌班次的发车时间
  1425 + oLp.fnAddMinuteToBcFcsj(iLEQIndex, iLEBIndex, iLTime);
  1426 + oLp.fnAddMinuteToBcFcsj(iDEQIndex, iDEBIndex, iDtime);
  1427 + }
  1428 + }
  1429 + }
  1430 + }
  1431 +
  1432 + },
  1433 +
  1434 + /**
  1435 + * 补每个路牌的其他班次(进出场,例保班次)。
  1436 + */
  1437 + fnCalcuOtherBc_: function() {
  1438 + var i;
  1439 + var _lpObj;
  1440 + var _minBcIndex;
  1441 + var _maxBcIndex;
  1442 + var _minBc;
  1443 + var _maxBc;
  1444 + var _otherbc = [];
  1445 + var _oFbbc;
  1446 +
  1447 + for (i = 0; i < _internalLpArray.length; i++) {
  1448 + _lpObj = _internalLpArray[i];
  1449 + _minBcIndex = _lpObj.getMinBcObjPosition();
  1450 + _maxBcIndex = _lpObj.getMaxBcObjPosition();
  1451 + _minBc = _lpObj.getBc(_minBcIndex[0], _minBcIndex[1]);
  1452 + _maxBc = _lpObj.getBc(_maxBcIndex[0], _maxBcIndex[1]);
  1453 +
  1454 + _otherbc = [];
  1455 + _otherbc.push(_factory.createBcObj(
  1456 + _lpObj, "bd", true, 1,
  1457 + _minBc.getFcTimeObj(),
  1458 + _paramObj
  1459 + ));
  1460 + _otherbc.push(_factory.createBcObj(
  1461 + _lpObj, "out", true, 1,
  1462 + _minBc.getFcTimeObj(),
  1463 + _paramObj
  1464 + ));
  1465 +
  1466 + _maxBc.setArrTimeObj(_paramObj.addMinute(_maxBc.getFcTimeObj(), _maxBc.getBcTime()));
  1467 + _maxBc.setStopTime(0);
  1468 + _otherbc.push(_factory.createBcObj(
  1469 + _lpObj, "in", true, 1,
  1470 + _maxBc.getArrTimeObj(),
  1471 + _paramObj
  1472 + ));
  1473 + _otherbc.push(_factory.createBcObj(
  1474 + _lpObj, "lc", true, 1,
  1475 + _maxBc.getArrTimeObj(),
  1476 + _paramObj
  1477 + ));
  1478 +
  1479 + // 5休2分班出场例保班次
  1480 + if (_lpObj.isBxFb5_2()) {
  1481 + _oFbbc = _lpObj.getBc(
  1482 + _lpObj.fnGetBcChainInfo(1)["s_q"],
  1483 + _lpObj.fnGetBcChainInfo(1)["s_b"]
  1484 + );
  1485 +
  1486 + _otherbc.push(_factory.createBcObj(
  1487 + _lpObj, "bd", true, 1,
  1488 + _oFbbc.getFcTimeObj(),
  1489 + _paramObj
  1490 + ));
  1491 + _otherbc.push(_factory.createBcObj(
  1492 + _lpObj, "out", true, 1,
  1493 + _oFbbc.getFcTimeObj(),
  1494 + _paramObj
  1495 + ));
  1496 + }
  1497 +
  1498 + _lpObj.addOtherBcArray(_otherbc);
  1499 + }
  1500 +
  1501 + },
  1502 +
  1503 + /**
  1504 + * 补每个路牌的其他班次(进出场,例保班次)
  1505 + * 所有的车次链前后都加进出场、报道班次
  1506 + */
  1507 + fnCalcuOtherBc: function() {
  1508 + var i;
  1509 + var j;
  1510 + var iBcChainCount;
  1511 + var oLp;
  1512 + var aOtherBc;
  1513 + var oStartBc;
  1514 + var oEndBc;
  1515 +
  1516 + for (i = 0; i < _internalLpArray.length; i++) {
  1517 + aOtherBc = [];
  1518 + oLp = _internalLpArray[i];
  1519 + iBcChainCount = oLp.fnGetBcChainCount();
  1520 +
  1521 + if (iBcChainCount == 1) { // 只有一个车次链,是连班班型
  1522 + // 头部要添加出场,例保班次
  1523 + oStartBc = oLp.getBc(
  1524 + oLp.fnGetBcChainInfo(0)["s_q"],
  1525 + oLp.fnGetBcChainInfo(0)["s_b"]
  1526 + );
  1527 + aOtherBc.push(_factory.createBcObj(
  1528 + oLp, "bd", true, 1,
  1529 + oStartBc.getFcTimeObj(),
  1530 + _paramObj
  1531 + ));
  1532 + aOtherBc.push(_factory.createBcObj(
  1533 + oLp, "out", true, 1,
  1534 + oStartBc.getFcTimeObj(),
  1535 + _paramObj
  1536 + ));
  1537 +
  1538 + // 尾部需添加进场,例保班次
  1539 + oEndBc = oLp.getBc(
  1540 + oLp.fnGetBcChainInfo(0)["e_q"],
  1541 + oLp.fnGetBcChainInfo(0)["e_b"]
  1542 + );
  1543 + aOtherBc.push(_factory.createBcObj(
  1544 + oLp, "in", true, 1,
  1545 + oEndBc.getArrTimeObj(),
  1546 + _paramObj
  1547 + ));
  1548 + aOtherBc.push(_factory.createBcObj(
  1549 + oLp, "lc", true, 1,
  1550 + oEndBc.getArrTimeObj(),
  1551 + _paramObj
  1552 + ));
  1553 + } else if (iBcChainCount == 2) { // 两个车次链,是分班班型
  1554 + // 第一个车次链开头有出场,报到班次,车次链结尾只有进场班次
  1555 + oStartBc = oLp.getBc(
  1556 + oLp.fnGetBcChainInfo(0)["s_q"],
  1557 + oLp.fnGetBcChainInfo(0)["s_b"]
  1558 + );
  1559 + aOtherBc.push(_factory.createBcObj(
  1560 + oLp, "bd", true, 1,
  1561 + oStartBc.getFcTimeObj(),
  1562 + _paramObj
  1563 + ));
  1564 + aOtherBc.push(_factory.createBcObj(
  1565 + oLp, "out", true, 1,
  1566 + oStartBc.getFcTimeObj(),
  1567 + _paramObj
  1568 + ));
  1569 +
  1570 + oEndBc = oLp.getBc(
  1571 + oLp.fnGetBcChainInfo(0)["e_q"],
  1572 + oLp.fnGetBcChainInfo(0)["e_b"]
  1573 + );
  1574 + aOtherBc.push(_factory.createBcObj(
  1575 + oLp, "in", true, 1,
  1576 + oEndBc.getArrTimeObj(),
  1577 + _paramObj
  1578 + ));
  1579 +
  1580 + // 第二个车次链开头有出场,报到班次,车次链结尾有进场,报到班次
  1581 + oStartBc = oLp.getBc(
  1582 + oLp.fnGetBcChainInfo(1)["s_q"],
  1583 + oLp.fnGetBcChainInfo(1)["s_b"]
  1584 + );
  1585 + aOtherBc.push(_factory.createBcObj(
  1586 + oLp, "bd", true, 1,
  1587 + oStartBc.getFcTimeObj(),
  1588 + _paramObj
  1589 + ));
  1590 + aOtherBc.push(_factory.createBcObj(
  1591 + oLp, "out", true, 1,
  1592 + oStartBc.getFcTimeObj(),
  1593 + _paramObj
  1594 + ));
  1595 +
  1596 + oEndBc = oLp.getBc(
  1597 + oLp.fnGetBcChainInfo(1)["e_q"],
  1598 + oLp.fnGetBcChainInfo(1)["e_b"]
  1599 + );
  1600 + aOtherBc.push(_factory.createBcObj(
  1601 + oLp, "in", true, 1,
  1602 + oEndBc.getArrTimeObj(),
  1603 + _paramObj
  1604 + ));
  1605 + aOtherBc.push(_factory.createBcObj(
  1606 + oLp, "lc", true, 1,
  1607 + oEndBc.getArrTimeObj(),
  1608 + _paramObj
  1609 + ));
  1610 +
  1611 +
  1612 + } else {
  1613 + // 2个车次链以上,暂时没有此班型
  1614 + }
  1615 +
  1616 + oLp.addOtherBcArray(aOtherBc);
  1617 + }
  1618 + },
  1619 +
  1620 + /**
  1621 + * 祛除上标线开头的删除标记的班次。
  1622 + */
  1623 + fnRemoveDelFirstFlagBc: function() {
  1624 + var oLp = _internalLpArray[0];
  1625 + var aMinBcIndex = oLp.getMinBcObjPosition();
  1626 + if (oLp.getBc(aMinBcIndex[0], aMinBcIndex[1]).fnIsDelFlag()) {
  1627 + oLp.removeBc(aMinBcIndex[0], aMinBcIndex[1]);
  1628 + }
  1629 + },
  1630 + /**
  1631 + * 祛除上标线结尾的删除标记的班次。
  1632 + */
  1633 + fnRemoveDelLastFlagBc: function() {
  1634 + var oLp = _internalLpArray[0];
  1635 + var aMaxBcIndex = oLp.getMaxBcObjPosition();
  1636 + if (oLp.getBc(aMaxBcIndex[0], aMaxBcIndex[1]).fnIsDelFlag()) {
  1637 + oLp.removeBc(aMaxBcIndex[0], aMaxBcIndex[1]);
  1638 + }
  1639 + },
  1640 +
  1641 + /**
  1642 + * 调整路牌班次间隔(核准周转时间,停站时间)。
  1643 + * @param iFre int 迭代次数
  1644 + */
  1645 + fnAdjustLpBcInterval: function(iFre) {
  1646 + if (iFre > 0) {
  1647 + for (var i = 0; i < _internalLpArray.length; i++) {
  1648 + _internalLpArray[i].fnAdjustBcInterval(
  1649 + this.fnCalcuAverPeakStopTime(),
  1650 + this.fnCalcuAverTroughStopTime(),
  1651 + _paramObj);
  1652 + }
  1653 +
  1654 + this.fnAdjustLpBcInterval(iFre - 1);
  1655 + }
  1656 + },
  1657 +
  1658 + /**
  1659 + * 调整班次间隔。
  1660 + * @param bIsUp 是否上行
  1661 + * @param oStartTime 开始时间对象
  1662 + * @param iFre 迭代次数
  1663 + */
  1664 + fnAdjustBcInterval2_: function(bIsUp, oStartTime, iFre) {
  1665 + if (iFre > 0) {
  1666 + var aBc = _fnGetBcList2(bIsUp, oStartTime); // 指定方向的班次列表
  1667 + aBc.sort(function(o1, o2) {
  1668 + if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
  1669 + return -1;
  1670 + } else {
  1671 + return 1;
  1672 + }
  1673 + });
  1674 + var i;
  1675 + var j;
  1676 +
  1677 + var iBcCountOfGroup = 3; // 3个班次取一次计算
  1678 + var aBcOfGroup; // 3个班次列表
  1679 + var aBcIntervalOfGroup; // 班次间隔列表,如:3个班次,2个间隔
  1680 +
  1681 + for (i = 0; i <= aBc.length - iBcCountOfGroup; i++) {
  1682 + aBcOfGroup = [];
  1683 + aBcIntervalOfGroup = [];
  1684 + for (j = i; j < i + iBcCountOfGroup; j++) {
  1685 + aBcOfGroup.push(aBc[j]);
  1686 + }
  1687 +
  1688 + for (j = 0; j < aBcOfGroup.length; j++) {
  1689 + if (j < aBcOfGroup.length - 1) {
  1690 + aBcIntervalOfGroup.push(aBcOfGroup[j + 1].getFcTimeObj().diff(
  1691 + aBcOfGroup[j].getFcTimeObj(), "m"));
  1692 + }
  1693 + }
  1694 +
  1695 + if (aBcIntervalOfGroup[0] < 19) {
  1696 + aBcOfGroup[1].addMinuteToFcsj(1);
  1697 + } else if (aBcIntervalOfGroup[0] > 20) {
  1698 + aBcOfGroup[1].addMinuteToFcsj(-1);
  1699 + } else {
  1700 + if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
  1701 + //continue;
  1702 + } else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
  1703 + aBcOfGroup[1].addMinuteToFcsj(-1);
  1704 + } else {
  1705 + aBcOfGroup[1].addMinuteToFcsj(1);
  1706 + }
  1707 + }
  1708 +
  1709 + }
  1710 +
  1711 + this.fnAdjustBcInterval2(bIsUp, oStartTime, iFre - 1);
  1712 + }
  1713 + },
  1714 +
  1715 + /**
  1716 + * 调整班次间隔。
  1717 + * @param boolean isUp 是否上行
  1718 + * @param oStartTime 开始时间对象
  1719 + * @param fre int 迭代次数
  1720 + */
  1721 + fnAdjustBcInterval: function(isUp, oStartTime, fre) {
  1722 + if (fre > 0) {
  1723 + var aBc = !oStartTime ? _fnGetBcList(isUp) : _fnGetBcList2(isUp, oStartTime); // 指定方向的班次列表
  1724 +
  1725 + aBc.sort(function(o1, o2) {
  1726 + if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
  1727 + return -1;
  1728 + } else {
  1729 + return 1;
  1730 + }
  1731 + });
  1732 +
  1733 + var i;
  1734 + var j;
  1735 +
  1736 + var iBcCountOfGroup = 3; // 3个班次取一次计算
  1737 + var aBcOfGroup; // 3个班次列表
  1738 + var aBcIntervalOfGroup; // 班次间隔列表,如:3个班次,2个间隔
  1739 + var oBcFcTime; // 班次发车时间
  1740 +
  1741 + for (i = 0; i <= aBc.length - iBcCountOfGroup; i++) {
  1742 + aBcOfGroup = [];
  1743 + aBcIntervalOfGroup = [];
  1744 + for (j = i; j < i + iBcCountOfGroup; j++) {
  1745 + aBcOfGroup.push(aBc[j]);
  1746 + }
  1747 +
  1748 + for (j = 0; j < aBcOfGroup.length; j++) {
  1749 + if (j < aBcOfGroup.length - 1) {
  1750 + aBcIntervalOfGroup.push(aBcOfGroup[j + 1].getFcTimeObj().diff(
  1751 + aBcOfGroup[j].getFcTimeObj(), "m"));
  1752 + }
  1753 + }
  1754 +
  1755 + // 判定规则
  1756 + oBcFcTime = aBcOfGroup[1].getFcTimeObj();
  1757 +
  1758 + // 第一个班次发车时间不动,根据间隔,调整中间一个班次
  1759 + // 如果3个班次2个间隔时间差1分钟,不调整
  1760 + // 如果第一个间隔大,调整第二个班次往前1分钟
  1761 + // 如果第二个间隔大,调整第二个班次往后1分钟
  1762 +
  1763 + if (_paramObj.isTroughBc(oBcFcTime) &&
  1764 + aBcIntervalOfGroup[0] > _paramObj.getTroughMaxFcjx()) {
  1765 + aBcOfGroup[1].addMinuteToFcsj(-1);
  1766 + }
  1767 +
  1768 + //else if (_paramObj.isMPeakBc(oBcFcTime) &&
  1769 + // aBcIntervalOfGroup[0] < _paramObj.getMPeakMinFcjx()) {
  1770 + // aBcOfGroup[1].addMinuteToFcsj(1);
  1771 + //} else if (_paramObj.isMPeakBc(oBcFcTime) &&
  1772 + // aBcIntervalOfGroup[0] > _paramObj.getMPeakMaxFcjx()) {
  1773 + // aBcOfGroup[1].addMinuteToFcsj(-1);
  1774 + //} else if (_paramObj.isEPeakBc(oBcFcTime) &&
  1775 + // aBcIntervalOfGroup[0] < _paramObj.getEPeakMinFcjx()) {
  1776 + // aBcOfGroup[1].addMinuteToFcsj(1);
  1777 + //} else if (_paramObj.isEPeakBc(oBcFcTime) &&
  1778 + // aBcIntervalOfGroup[0] > _paramObj.getEPeakMaxFcjx()) {
  1779 + // aBcOfGroup[1].addMinuteToFcsj(-1);
  1780 + //}
  1781 +
  1782 +
  1783 + else {
  1784 + if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
  1785 + //continue;
  1786 + } else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
  1787 + aBcOfGroup[1].addMinuteToFcsj(-1);
  1788 + } else {
  1789 + aBcOfGroup[1].addMinuteToFcsj(1);
  1790 + }
  1791 + }
  1792 +
  1793 + //if (Math.abs(aBcIntervalOfGroup[0] - aBcIntervalOfGroup[1]) <= 1) {
  1794 + // //continue;
  1795 + //} else if (aBcIntervalOfGroup[0] > aBcIntervalOfGroup[1]) {
  1796 + // aBcOfGroup[1].addMinuteToFcsj(-1);
  1797 + //} else {
  1798 + // aBcOfGroup[1].addMinuteToFcsj(1);
  1799 + //}
  1800 +
  1801 +
  1802 + }
  1803 +
  1804 + this.fnAdjustBcInterval(isUp, oStartTime, fre - 1);
  1805 + }
  1806 +
  1807 + },
  1808 +
  1809 + /**
  1810 + * 调整班次间隔(平均间隔)。
  1811 + * @param bIsUp 是否上行
  1812 + * @param oStartTime 开始时间对象
  1813 + */
  1814 + fnAdjustBcInterval2_avg: function(bIsUp, oStartTime) {
  1815 + var aBc = !oStartTime ? _fnGetBcList(bIsUp) : _fnGetBcList2(bIsUp, oStartTime); // 指定方向的班次列表
  1816 + aBc.sort(function(o1, o2) {
  1817 + if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
  1818 + return -1;
  1819 + } else {
  1820 + return 1;
  1821 + }
  1822 + });
  1823 +
  1824 + var j;
  1825 + var iCount = aBc.length - 1;
  1826 + var iC1 = Math.floor(aBc[aBc.length - 1].getFcTimeObj().diff(aBc[0].getFcTimeObj(), "m") / iCount);
  1827 + var iC2 = aBc[aBc.length - 1].getFcTimeObj().diff(aBc[0].getFcTimeObj(), "m") % iCount;
  1828 + var iTempTime;
  1829 +
  1830 + for (j = 0; j < iCount - iC2; j++) {
  1831 + iTempTime = aBc[j + 1].getFcTimeObj().diff(aBc[j].getFcTimeObj(), "m");
  1832 + aBc[j + 1].addMinuteToFcsj(iC1 - iTempTime);
  1833 + }
  1834 + for (j = 0; j < iC2; j++) {
  1835 + iTempTime = aBc[iCount - iC2 + j + 1].getFcTimeObj().diff(aBc[iCount - iC2 + j].getFcTimeObj(), "m");
  1836 + aBc[iCount - iC2 + j + 1].addMinuteToFcsj(iC1 + 1 - iTempTime);
  1837 + }
  1838 +
  1839 + },
  1840 +
  1841 + /**
  1842 + * 计算高峰平均停站时间。
  1843 + */
  1844 + fnCalcuAverPeakStopTime: function() {
  1845 + var i;
  1846 + var j;
  1847 + var aBc;
  1848 + var iBcCount = 0;
  1849 + var iSum = 0;
  1850 + for (i = 0; i < _internalLpArray.length; i++) {
  1851 + aBc = _internalLpArray[i].getBcArray();
  1852 +
  1853 + for (j = 0; j < aBc.length; j++) {
  1854 + if (!_paramObj.isTroughBc(aBc[j].getArrTimeObj())) {
  1855 + iBcCount ++;
  1856 + iSum += aBc[j].getStopTime();
  1857 + }
  1858 + }
  1859 + }
  1860 +
  1861 + return Math.floor(iSum / iBcCount);
  1862 + },
  1863 +
  1864 + /**
  1865 + * 计算低谷平均停站时间。
  1866 + */
  1867 + fnCalcuAverTroughStopTime: function() {
  1868 + var i;
  1869 + var j;
  1870 + var aBc;
  1871 + var iBcCount = 0;
  1872 + var iSum = 0;
  1873 + for (i = 0; i < _internalLpArray.length; i++) {
  1874 + aBc = _internalLpArray[i].getBcArray();
  1875 + for (j = 0; j < aBc.length; j++) {
  1876 + if (_paramObj.isTroughBc(aBc[j].getArrTimeObj())) {
  1877 + iBcCount ++;
  1878 + iSum += aBc[j].getStopTime();
  1879 + }
  1880 + }
  1881 + }
  1882 +
  1883 + return Math.floor(iSum / iBcCount);
  1884 + },
  1885 +
  1886 + //------------- 其他方法 -------------//
  1887 + /**
  1888 + * 返回内部路牌数据列表。
  1889 + * @returns {Array}
  1890 + */
  1891 + fnGetLpArray: function() {
  1892 + return _internalLpArray;
  1893 + },
  1894 +
  1895 + /**
  1896 + * 内部数据转化成显示用的班次数组。
  1897 + */
  1898 + fnToGanttBcArray: function() {
  1899 + var aAllBc = [];
  1900 + var aLpBc = [];
  1901 + var aEatBc = [];
  1902 + var oLp;
  1903 + var i;
  1904 + var j;
  1905 +
  1906 + for (i = 0; i < _internalLpArray.length; i++) {
  1907 + oLp = _internalLpArray[i];
  1908 + aLpBc = [];
  1909 + aLpBc = aLpBc.concat(oLp.getOtherBcArray(), oLp.getBcArray());
  1910 +
  1911 + aEatBc = [];
  1912 + // 根据班次的吃饭时间添加吃饭班次
  1913 + for (j = 0; j < aLpBc.length; j++) {
  1914 + if (aLpBc[j].fnGetEatTime() > 0) {
  1915 + aEatBc.push(_factory.createBcObj(
  1916 + oLp,
  1917 + "cf",
  1918 + !aLpBc[j].isUp(), // 和上一个班次方向相反
  1919 + 1,
  1920 + _paramObj.addMinute(aLpBc[j].getArrTimeObj(), aLpBc[j].getStopTime()), // 使用上一个班次的到达时间作为开始时间
  1921 + _paramObj
  1922 + ));
  1923 + }
  1924 + }
  1925 + aLpBc = aLpBc.concat(aEatBc);
  1926 +
  1927 + // 按照发车时间排序
  1928 + aLpBc.sort(function(o1, o2) {
  1929 + if (o1.getFcTimeObj().isBefore(o2.getFcTimeObj())) {
  1930 + return -1;
  1931 + } else {
  1932 + return 1;
  1933 + }
  1934 + });
  1935 +
  1936 + // 重新赋值fcno
  1937 + for (j = 0; j < aLpBc.length; j++) {
  1938 + aLpBc[j].fnSetFcno(j + 1);
  1939 + }
  1940 +
  1941 + aAllBc = aAllBc.concat(aLpBc);
  1942 + }
  1943 +
  1944 + var aGanttBc = [];
  1945 + for (i = 0; i < aAllBc.length; i++) {
  1946 + aGanttBc.push(aAllBc[i].toGanttBcObj());
  1947 + }
  1948 +
  1949 + return aGanttBc;
  1950 + }
  1951 +
  1952 + };
  1953 +
1949 1954 };
1950 1955 \ No newline at end of file
... ...
src/main/resources/static/pages/base/timesmodel/js/v2/main_v2.js
1   -/**
2   - * 主类。
3   - */
4   -var Main_v2 = function() {
5   -
6   - // 内部工厂类
7   - var _factoryFun = function() {
8   - return {
9   - // 创建参数
10   - createParameterObj: function(formMap, dataMap) {
11   - var paramObj = ParameterObj();
12   - paramObj.wrap(formMap, dataMap);
13   - return paramObj;
14   - },
15   - // 创建班次对象
16   - createBcObj: function(lpObj, bcType, isUp, fcno, fcTimeObj, paramObj) {
17   - var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType);
18   - var _fcsj = fcTimeObj;
19   - var _bcsj = paramObj.calcuTravelTime(_fcsj, isUp);
20   - var _arrsj = paramObj.addMinute(_fcsj, _bcsj);
21   - //var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj);
22   - var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, undefined);
23   - var _tccid = paramObj.getTTinfoId();
24   - var _ttinfoid = paramObj.getTTinfoId();
25   - var _xl = paramObj.getXlId();
26   - var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;
27   - var _zdz = isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;
28   -
29   - if (bcType == "bd") { // 早例保,传过来的发车时间是第一个班次的发车时间
30   - if (isUp) { // 上行
31   - _fcsj = paramObj.addMinute(
32   - _fcsj,
33   - -(paramObj.getUpOutTime() + paramObj.getLbTime()));
34   - _bcsj = paramObj.getLbTime();
35   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
36   - _stoptime = 0;
37   - } else { // 下行
38   - _fcsj = paramObj.addMinute(
39   - _fcsj,
40   - -(paramObj.getDownOutTime() + paramObj.getLbTime()));
41   - _bcsj = paramObj.getLbTime();
42   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
43   - _stoptime = 0;
44   - }
45   - } else if (bcType == "lc") { // 晚例保,传过来的发车时间是最后一个班次的到达时间
46   - if (isUp) { // 上行
47   - _fcsj = paramObj.addMinute(
48   - _fcsj,
49   - paramObj.getUpInTime());
50   - _bcsj = paramObj.getLbTime();
51   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
52   - _stoptime = 0;
53   - } else { // 下行
54   - _fcsj = paramObj.addMinute(
55   - _fcsj,
56   - paramObj.getDownInTime());
57   - _bcsj = paramObj.getLbTime();
58   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
59   - _stoptime = 0;
60   - }
61   - } else if (bcType == "out") { // 出场,传过来的发车时间是第一个班次的发车时间
62   - if (isUp) { // 上行
63   - _fcsj = paramObj.addMinute(
64   - _fcsj,
65   - -paramObj.getUpOutTime());
66   - _bcsj = paramObj.getUpOutTime();
67   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
68   - _stoptime = 0;
69   - } else { // 下行
70   - _fcsj = paramObj.addMinute(
71   - _fcsj,
72   - -paramObj.getDownOutTime());
73   - _bcsj = paramObj.getDownOutTime();
74   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
75   - _stoptime = 0;
76   - }
77   - } else if (bcType == "in") { // 进场,传过来的发车时间是最后一个班次的到达时间
78   - if (isUp) { // 上行
79   - _bcsj = paramObj.getUpInTime();
80   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
81   - _stoptime = 0;
82   - } else { // 下行
83   - _bcsj = paramObj.getDownInTime();
84   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
85   - _stoptime = 0;
86   - }
87   - } else if (bcType == "cf") { // 吃饭班次
88   - // 以13:00为分界,之前的为午饭,之后的为晚饭
89   - if (fcTimeObj.isBefore(paramObj.toTimeObj("13:00"))) {
90   - _bcsj = paramObj.fnGetLunchTime();
91   - } else {
92   - _bcsj = paramObj.fnGetDinnerTime();
93   - }
94   - _arrsj = paramObj.addMinute(_fcsj, _bcsj);
95   - _stoptime = 0;
96   - }
97   -
98   - var bcParamObj = {};
99   - bcParamObj.bcType = bcType; // 班次类型(normal,in_,out, bd, lc, cf等)
100   - bcParamObj.isUp = isUp; // boolean是否上下行
101   - bcParamObj.fcno = fcno; // 发车顺序号
102   - bcParamObj.fcTimeObj = _fcsj; // 发车时间对象
103   - bcParamObj.bclc = _bclc; // 班次里程
104   - bcParamObj.bcsj = _bcsj; // 班次历时
105   - bcParamObj.arrtime = _arrsj; // 到达时间对象
106   - bcParamObj.stoptime = _stoptime; // 停站时间
107   - bcParamObj.tccid = _tccid; // 停车场id
108   - bcParamObj.ttinfoid = _ttinfoid; // 时刻表id
109   - bcParamObj.xl = _xl; // 线路id
110   - bcParamObj.qdzid = _qdz; // 起点站id
111   - bcParamObj.zdzid = _zdz; // 终点站id
112   -
113   - return new InternalBcObj(lpObj, bcParamObj);
114   - }
115   - };
116   - };
117   - var _factory = _factoryFun();
118   -
119   - // 所有的时间使用moment.js计算
120   -
121   - var _paramObj; // 参数对象
122   -
123   - var _bxDesc = [ // 班型描述
124   - {'type':'六工一休','hoursV':6.66, 'minueV':'6:40', 'qcount': 0, 'avertime': 0},
125   - {'type':'五工一休','hoursV':6.85, 'minueV':'6:51', 'qcount': 0, 'avertime': 0},
126   - {'type':'四工一休','hoursV':7.14, 'minueV':'7:08', 'qcount': 0, 'avertime': 0},
127   - {'type':'三工一休','hoursV':7.61, 'minueV':'7:37', 'qcount': 0, 'avertime': 0},
128   - {'type':'二工一休','hoursV':8.57, 'minueV':'8:34', 'qcount': 0, 'avertime': 0},
129   - {'type':'一工一休','hoursV':11.42, 'minueV':'11:25', 'qcount': 0, 'avertime': 0},
130   - {'type':'五工二休','hoursV':7.99, 'minueV':'8:00', 'qcount': 0, 'avertime': 0},
131   - {'type':'无工休', 'hoursV':5.43, 'minueV':'5:43', 'qcount': 0, 'avertime': 0}
132   - ];
133   -
134   - var _funCalcuExportData_lpObjList = function(aInternalLpObj) {
135   - // 构造路牌对象
136   - var aLpObj = [];
137   - var i;
138   - var j;
139   - var z;
140   - var oInternalLp;
141   - var oInternalBc;
142   - var oInternalBc_temp;
143   - var oLp;
144   - var iZbc;
145   - var iZgs;
146   - for (i = 0; i < aInternalLpObj.length; i++) {
147   - oInternalLp = aInternalLpObj[i];
148   - iZbc = 0;
149   - iZgs = 0;
150   - oLp = {
151   - "lpname": oInternalLp.getLpName(), // 路牌名字
152   - "isUp": oInternalLp.isUp(), // 每圈的第一个班次是否上行
153   - "bcObjList": [], // 班次列表
154   - "groupCount": oInternalLp.fnGetGroupCount(), // 总圈数
155   - "zgs": 0, // 总工时
156   - "zbc": 0, // 总班次
157   - "stationRouteId1": 0, // 第一个班次起点站路由id
158   - "stationRouteId2": 0 // 第二个班次起点站路由id
159   - };
160   -
161   - // 将报到班次,进出场班次加到班次的时间上
162   - var iBcChainCount;
163   - var oStartBc;
164   - var oEndBc;
165   - var oTempBc;
166   - var aFcsj = [];
167   -
168   - iBcChainCount = oInternalLp.fnGetBcChainCount();
169   - if (iBcChainCount == 1) { // 单一车次链,连班班型
170   - oStartBc = oInternalLp.getBc(
171   - oInternalLp.fnGetBcChainInfo(0)["s_q"],
172   - oInternalLp.fnGetBcChainInfo(0)["s_b"]
173   - );
174   - oTempBc = _factory.createBcObj(
175   - oLp, "bd", true, 1,
176   - oStartBc.getFcTimeObj(),
177   - _paramObj
178   - );
179   - aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
180   - oTempBc = _factory.createBcObj(
181   - oLp, "out", true, 1,
182   - oStartBc.getFcTimeObj(),
183   - _paramObj
184   - );
185   - aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
186   - aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
187   - oStartBc._$_fcsj_desc = aFcsj.join("");
188   -
189   - oLp.bcObjList.push({ // 出场班次
190   - "bcsj": oTempBc.getBcTime(), // 班次时间
191   - "ssj": oTempBc.getStopTime(), // 停站时间
192   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
193   -
194   - "tccid": oTempBc._$_tccid, // 停车场id
195   - "qdzid": oTempBc._$_qdzid, // 起点站id
196   - "zdzid": oTempBc._$_zdzid, // 终点站id
197   -
198   - "isUp": oTempBc._$_isUp, // 是否上行
199   -
200   - "bcType": oTempBc._$_bcType, // 班次类型
201   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
202   -
203   - "groupNo": -1, // 第几圈
204   - "groupBcNo": -1 // 圈里第几个班次
205   -
206   - });
207   -
208   - aFcsj = [];
209   -
210   - oEndBc = oInternalLp.getBc(
211   - oInternalLp.fnGetBcChainInfo(0)["e_q"],
212   - oInternalLp.fnGetBcChainInfo(0)["e_b"]
213   - );
214   - aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
215   - oTempBc = _factory.createBcObj(
216   - oLp, "in", true, 1,
217   - oEndBc.getArrTimeObj(),
218   - _paramObj
219   - );
220   - aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
221   -
222   - oLp.bcObjList.push({ // 进场班次
223   - "bcsj": oTempBc.getBcTime(), // 班次时间
224   - "ssj": oTempBc.getStopTime(), // 停站时间
225   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
226   -
227   - "tccid": oTempBc._$_tccid, // 停车场id
228   - "qdzid": oTempBc._$_qdzid, // 起点站id
229   - "zdzid": oTempBc._$_zdzid, // 终点站id
230   -
231   - "isUp": oTempBc._$_isUp, // 是否上行
232   -
233   - "bcType": oTempBc._$_bcType, // 班次类型
234   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
235   -
236   - "groupNo": -2, // 第几圈
237   - "groupBcNo": -2 // 圈里第几个班次
238   -
239   - });
240   -
241   - oTempBc = _factory.createBcObj(
242   - oLp, "lc", true, 1,
243   - oEndBc.getArrTimeObj(),
244   - _paramObj
245   - );
246   - aFcsj.push("(离" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
247   - oEndBc._$_fcsj_desc = aFcsj.join("");
248   -
249   - } else if (iBcChainCount == 2) { // 两个车次链,分班班型
250   - oStartBc = oInternalLp.getBc(
251   - oInternalLp.fnGetBcChainInfo(0)["s_q"],
252   - oInternalLp.fnGetBcChainInfo(0)["s_b"]
253   - );
254   - oTempBc = _factory.createBcObj(
255   - oLp, "bd", true, 1,
256   - oStartBc.getFcTimeObj(),
257   - _paramObj
258   - );
259   - aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
260   - oTempBc = _factory.createBcObj(
261   - oLp, "out", true, 1,
262   - oStartBc.getFcTimeObj(),
263   - _paramObj
264   - );
265   - aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
266   - aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
267   - oStartBc._$_fcsj_desc = aFcsj.join("");
268   -
269   - oLp.bcObjList.push({ // 出场班次
270   - "bcsj": oTempBc.getBcTime(), // 班次时间
271   - "ssj": oTempBc.getStopTime(), // 停站时间
272   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
273   -
274   - "tccid": oTempBc._$_tccid, // 停车场id
275   - "qdzid": oTempBc._$_qdzid, // 起点站id
276   - "zdzid": oTempBc._$_zdzid, // 终点站id
277   -
278   - "isUp": oTempBc._$_isUp, // 是否上行
279   -
280   - "bcType": oTempBc._$_bcType, // 班次类型
281   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
282   -
283   - "groupNo": -1, // 第几圈
284   - "groupBcNo": -1 // 圈里第几个班次
285   -
286   - });
287   -
288   - aFcsj = [];
289   -
290   - oEndBc = oInternalLp.getBc(
291   - oInternalLp.fnGetBcChainInfo(0)["e_q"],
292   - oInternalLp.fnGetBcChainInfo(0)["e_b"]
293   - );
294   - aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
295   - oTempBc = _factory.createBcObj(
296   - oLp, "in", true, 1,
297   - oEndBc.getArrTimeObj(),
298   - _paramObj
299   - );
300   - aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
301   - oTempBc = _factory.createBcObj(
302   - oLp, "lc", true, 1,
303   - oEndBc.getArrTimeObj(),
304   - _paramObj
305   - );
306   - oEndBc._$_fcsj_desc = aFcsj.join("");
307   -
308   - aFcsj = [];
309   -
310   - oStartBc = oInternalLp.getBc(
311   - oInternalLp.fnGetBcChainInfo(1)["s_q"],
312   - oInternalLp.fnGetBcChainInfo(1)["s_b"]
313   - );
314   - oTempBc = _factory.createBcObj(
315   - oLp, "out", true, 1,
316   - oStartBc.getFcTimeObj(),
317   - _paramObj
318   - );
319   - aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
320   - aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
321   - oStartBc._$_fcsj_desc = aFcsj.join("");
322   -
323   - aFcsj = [];
324   -
325   - oEndBc = oInternalLp.getBc(
326   - oInternalLp.fnGetBcChainInfo(1)["e_q"],
327   - oInternalLp.fnGetBcChainInfo(1)["e_b"]
328   - );
329   - aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
330   - oTempBc = _factory.createBcObj(
331   - oLp, "in", true, 1,
332   - oEndBc.getArrTimeObj(),
333   - _paramObj
334   - );
335   - aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
336   -
337   - oLp.bcObjList.push({ // 进场班次
338   - "bcsj": oTempBc.getBcTime(), // 班次时间
339   - "ssj": oTempBc.getStopTime(), // 停站时间
340   - "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
341   -
342   - "tccid": oTempBc._$_tccid, // 停车场id
343   - "qdzid": oTempBc._$_qdzid, // 起点站id
344   - "zdzid": oTempBc._$_zdzid, // 终点站id
345   -
346   - "isUp": oTempBc._$_isUp, // 是否上行
347   -
348   - "bcType": oTempBc._$_bcType, // 班次类型
349   - "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
350   -
351   - "groupNo": -2, // 第几圈
352   - "groupBcNo": -2 // 圈里第几个班次
353   -
354   - });
355   -
356   - oTempBc = _factory.createBcObj(
357   - oLp, "lc", true, 1,
358   - oEndBc.getArrTimeObj(),
359   - _paramObj
360   - );
361   - aFcsj.push("(离" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
362   - oEndBc._$_fcsj_desc = aFcsj.join("");
363   -
364   - }
365   -
366   - for (j = 0; j < oInternalLp.fnGetGroupCount(); j++) {
367   - for (z = 0; z < 2; z++) {
368   - oInternalBc = oInternalLp.getBc(j, z);
369   - if (oInternalBc) {
370   - if (oInternalBc.fnGetEatTime() > 0) {
371   - // 吃饭班次是下一个班次开始吃,和本班次方向相反
372   - oInternalBc_temp = oInternalLp.getBc(
373   - z == 1 ? j + 1 : j,
374   - z == 1 ? 0 : 1);
375   -
376   - oInternalBc_temp._$_fcsj_desc = "(吃" + oInternalBc_temp.getFcTimeObj().format("HH:mm") + ")";
377   - }
378   -
379   - oLp.bcObjList.push({
380   - "bcsj": oInternalBc.getBcTime(), // 班次时间
381   - "ssj": oInternalBc.getStopTime(), // 停站时间
382   - "eatsj": oInternalBc.fnGetEatTime(), // 吃饭时间
383   -
384   - "tccid": oInternalBc._$_tccid, // 停车场id
385   - "qdzid": oInternalBc._$_qdzid, // 起点站id
386   - "zdzid": oInternalBc._$_zdzid, // 终点站id
387   -
388   - "isUp": oInternalBc._$_isUp, // 是否上行
389   -
390   - "bcType": oInternalBc._$_bcType, // 班次类型
391   - "fcsj": oInternalBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
392   - "fcsjDesc" : oInternalBc._$_fcsj_desc || oInternalBc._$_fcsjObj.format("HH:mm"),
393   -
394   - "groupNo": j, // 第几圈
395   - "groupBcNo": z // 圈里第几个班次
396   -
397   - });
398   -
399   - iZgs = iZgs +
400   - oInternalBc.getBcTime() + // 班次时间
401   - oInternalBc.getStopTime() + // 停站时间
402   - oInternalBc.fnGetEatTime(); // 吃饭时间
403   - iZbc = iZbc + 1;
404   -
405   - // 设置圈站点路由id
406   - if (oInternalBc.isUp() == oInternalLp.isUp()) { // 第一个班次
407   - if (oLp.stationRouteId1 == 0) {
408   - oLp.stationRouteId1 = oInternalBc._$_qdzid;
409   - }
410   - } else { // 第二个班次
411   - if (oLp.stationRouteId2 == 0) {
412   - oLp.stationRouteId2 = oInternalBc._$_qdzid;
413   - }
414   - }
415   -
416   - }
417   - }
418   -
419   - }
420   -
421   - for (z = 0; z < oInternalLp.getOtherBcArray().length; z++) {
422   - oInternalBc = oInternalLp.getOtherBcArray()[z];
423   - iZgs = iZgs +
424   - oInternalBc.getBcTime() + // 班次时间
425   - oInternalBc.getStopTime(); // 停站时间
426   - if (oInternalBc._$_bcType != "bd" &&
427   - oInternalBc._$_bcType != "lc" &&
428   - oInternalBc._$_bcType != "cf") {
429   - iZbc = iZbc + 1;
430   - }
431   - }
432   -
433   - oLp.zgs = iZgs;
434   - oLp.zbc = iZbc;
435   - aLpObj.push(oLp);
436   - }
437   -
438   - return aLpObj;
439   - };
440   -
441   - var _funCalcuExportData_statInfoList = function(aInternalLpObj) {
442   - var countBc = 0, // 总班次
443   - serviceBc = 0, // 营运班次
444   - jcbc = 0, // 进场总班次.
445   - ccbc = 0, // 出场总班次.
446   - cfbc = 0, // 吃饭总班次.
447   - zwlbbc = 0, // 早晚例保总班次.
448   - countGs = 0.0, // 总工时
449   - servicesj = 0, // 营运班次总时间
450   - jcsj = 0.0, // 进场总时间.
451   - ccsj = 0.0, // 出场总时间.
452   - cfsj = 0.0, // 吃饭总时间.
453   - zwlbsj = 0.0, // 早晚例保总时间.
454   - ksBc = 0, // 空驶班次
455   - serviceLc = 0.0, // 营运里程
456   - ksLc = 0.0, // 空驶里程
457   - avgTzjx = 0.0, // 平均停站间隙
458   - gfServiceBc = 0, // 高峰营运班次
459   - dgServiceBc = 0, // 低谷营运班次
460   - gfAvgTzjx = 0.0, // 高峰平均停站间隙
461   - dgAvgTzjx = 0.0; // 低谷平均停站间隙
462   -
463   - var aAllBc = [];
464   - var oLp;
465   - var oBc;
466   - var i;
467   - var j;
468   -
469   - for (i = 0; i < aInternalLpObj.length; i++) {
470   - oLp = aInternalLpObj[i];
471   - for (j = 0; j < oLp.getBcArray().length; j++) {
472   - aAllBc.push(oLp.getBcArray()[j]);
473   - }
474   - for (j = 0; j < oLp.getOtherBcArray().length; j++) {
475   - aAllBc.push(oLp.getOtherBcArray()[j]);
476   - }
477   - }
478   -
479   - for (i = 0; i < aAllBc.length; i++) {
480   - oBc = aAllBc[i];
481   -
482   - if (oBc.getBcTime() > 0) {
483   - countBc = countBc + 1;
484   - countGs = countGs + oBc.getStopTime() + oBc.getBcTime();
485   - if (_paramObj.isTroughBc(oBc.getFcTimeObj())) {
486   - if (oBc._$_bcType == "normal") {
487   - dgServiceBc = dgServiceBc + 1;
488   - dgAvgTzjx = dgAvgTzjx + oBc.getStopTime();
489   - }
490   - } else {
491   - if (oBc._$_bcType == "normal") {
492   - gfServiceBc = gfServiceBc + 1;
493   - gfAvgTzjx = gfAvgTzjx + oBc.getStopTime();
494   - }
495   - }
496   -
497   - if (oBc._$_bcType == "normal") {
498   - serviceBc = serviceBc + 1;
499   - serviceLc = serviceLc + oBc._$_bclc;
500   - servicesj = servicesj + oBc.getBcTime();
501   - avgTzjx = avgTzjx + oBc.getStopTime();
502   -
503   - if (oBc.fnGetEatTime() > 0) {
504   - cfbc = cfbc + 1;
505   - cfsj = cfsj + oBc.fnGetEatTime();
506   - }
507   - } else if (oBc._$_bcType == "in") {
508   - jcbc = jcbc + 1;
509   - jcsj = jcsj + oBc.getBcTime();
510   - } else if (oBc._$_bcType == "out") {
511   - ccbc = ccbc + 1;
512   - ccsj = ccsj + oBc.getBcTime();
513   - } else if (oBc._$_bcType == "bd") {
514   - zwlbbc = zwlbbc + 1;
515   - zwlbsj = zwlbsj + oBc.getBcTime();
516   - } else if (oBc._$_bcType == "lc") {
517   - zwlbbc = zwlbbc + 1;
518   - zwlbsj = zwlbsj + oBc.getBcTime();
519   - }
520   - }
521   - }
522   -
523   - dgAvgTzjx = dgAvgTzjx / dgServiceBc;
524   - gfAvgTzjx = gfAvgTzjx / gfServiceBc;
525   - avgTzjx = avgTzjx / dgServiceBc;
526   -
527   - return [
528   - {'statItem': '总班次(包括进出场、吃饭时间、早晚例保、营运且班次时间大于零的班次)', 'statValue': countBc},
529   - {'statItem': '进场总班次(包括进场且班次时间大于零的班次)', 'statValue': jcbc},
530   - {'statItem': '出场总班次(包括进场且班次时间大于零的班次)', 'statValue': ccbc},
531   - {'statItem': '吃饭总班次(包括吃饭且班次时间大于零的班次)', 'statValue': cfbc},
532   - {'statItem': '早晚例保总班次(包括早晚例保且时间大于零的班次)', 'statValue': zwlbbc},
533   - {'statItem': '营运总班次(包括正常、区间、放大站且班次时间大于零班次)','statValue': serviceBc},
534   - {'statItem': '进场总时间(包括进场班次且班次时间大于零)', 'statValue': jcsj/60},
535   - {'statItem': '出场总时间(包括进场班次且班次时间大于零)', 'statValue': ccsj/60},
536   - {'statItem': '吃饭总时间(包括吃饭班次且班次时间大于零)', 'statValue': cfsj/60},
537   - {'statItem': '早晚例保总时间(包括早晚例保班次且时间大于零的)', 'statValue': zwlbsj/60},
538   - {'statItem': '营运班次总时间(包括正常、区间、放大站且班次时间大于零)', 'statValue': servicesj/60},
539   - {'statItem': '总工时(包括进出场、吃饭时间、早晚例保、营运班次时间)', 'statValue': countGs/60},
540   - {'statItem': '空驶班次(包括直放班次)', 'statValue': ksBc},
541   - {'statItem': '营运里程(包括正常、区间、放大站里程)', 'statValue': serviceLc},
542   - {'statItem': '空驶里程(包括直放里程)', 'statValue': ksLc},
543   - {'statItem': '平均停站时间(营运班次停站时间总和/营运总班次)', 'statValue': avgTzjx},
544   - {'statItem': '高峰营运班次(包括早晚高峰时段的正常、区间、放大站班次)', 'statValue': gfServiceBc},
545   - {'statItem': '低谷营运班次(包括低谷时段的正常、区间、放大站班次)', 'statValue': dgServiceBc},
546   - {'statItem': '高峰平均停站间隙(高峰营运班次停站时间总和/高峰营运班次总和)', 'statValue': gfAvgTzjx},
547   - {'statItem': '低谷平均停站间隙(低谷营运班次停站时间总和/低谷营运班次总和)', 'statValue': dgAvgTzjx},
548   - {'statItem': '综合评估', 'statValue': 3}
549   - ];
550   -
551   - };
552   -
553   - return {
554   - /**
555   - * 工厂对象,创建不同的对象。
556   - * @returns {{createParameterObj, createBcObj}}
557   - */
558   - getFactory: function() {
559   - return _factory;
560   - },
561   -
562   - /**
563   - * 使用发车间隔策略生成时刻表。
564   - * @param paramObj 参数对象
565   - * @param lpArray 路牌数组
566   - * @constructor
567   - */
568   - BXPplaceClassesTime03 : function(paramObj, lpArray) {
569   - // 参数对象
570   - _paramObj = paramObj;
571   -
572   - // 1、初始化行车计划
573   - var schedule = new InternalScheduleObj(_paramObj, lpArray, _factory);
574   - schedule.fnInitDataWithBxLayout();
575   - // 2、将连班路牌的班次补足
576   - schedule.fnCalcuLpBx_lb();
577   -
578   - // 3、修正针对初始化时生成的高峰班次,之前不足的补上,多余的删除
579   - schedule.fnAdjustGfbc(true, true); // 修正上行早高峰
580   - schedule.fnAdjustGfbc(true, false); // 修正下行早高峰
581   - schedule.fnAdjustGfbc(false, true); // 修正上行晚高峰
582   - schedule.fnAdjustGfbc(false, false); // 修正下行晚高峰
583   -
584   - // 6、补吃饭班次
585   - schedule.fnCalcuEatBc();
586   -
587   - // 4、按照车辆投入运营要求补充班次
588   - schedule.fnCalcuLpBc_yy();
589   -
590   - // 5、根据班型补充所有的不足班次
591   - schedule.fnCalcuLpBx_5_2();
592   - schedule.fnCalcuLpBx_other();
593   -
594   - // 7、祛除上标线开头有删除标记的班次
595   - schedule.fnRemoveDelFirstFlagBc();
596   -
597   - // TODO:8、调整路牌班次间隔
598   - schedule.fnAdjustLpBcInterval(1);
599   -
600   - // TODO:9、调整纵向班次间隔
601   - schedule.fnAdjustBcInterval(true, false, 10);
602   - schedule.fnAdjustBcInterval(false, false, 10);
603   -
604   - // 10、确定末班车
605   - schedule.fnCalcuLastBc();
606   -
607   - // 11、祛除上标线结尾有删除标记的班次
608   - schedule.fnRemoveDelLastFlagBc();
609   -
610   - // TODO:12、平均化指定时间后的班次列表间隔
611   - schedule.fnAdjustBcInterval2_avg(true, _paramObj.toTimeObj("19:50"));
612   - schedule.fnAdjustBcInterval2_avg(false, _paramObj.toTimeObj("19:50"));
613   -
614   - // 10、补进出场例保班次
615   - schedule.fnCalcuOtherBc();
616   -
617   - //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
618   - // TODO:班型再议
619   - return {
620   - 'json':schedule.fnToGanttBcArray(),'bxrcgs':null,
621   - 'aInternalLpObj': schedule.fnGetLpArray()
622   - };
623   -
624   - },
625   - /**
626   - * 导出时刻表配置。
627   - * @param aInternalLpObj 内部路牌对象列表
628   - */
629   - exportDataConfig: function(aInternalLpObj) {
630   - $('.exportAdd').on('click',function() {
631   - var aInfos = {
632   - "lpObjList": _funCalcuExportData_lpObjList(aInternalLpObj), // 路牌班次信息列表
633   - "statInfoList": _funCalcuExportData_statInfoList(aInternalLpObj) // 统计项目列表
634   - };
635   -
636   - console.log(aInfos);
637   -
638   - $(".exportAdd").addClass("disabled");
639   - $(".exportAdd").html("<i class=\"fa fa-spinner\" aria-hidden=\"true\"></i>" + " 正在导出...");
640   -
641   - // 提交
642   - $.ajax({
643   - type: 'POST',
644   - url: "/tidc/exportDTDFile",
645   - dataType: 'binary',
646   - contentType: "application/json",
647   - data: JSON.stringify(aInfos),
648   - success: function(data){
649   - Main_v2.downloadFile(data, "application/octet-stream", "时刻表信息.xls");
650   -
651   - $(".exportAdd").removeClass("disabled");
652   - $(".exportAdd").html("<i class=\"fa fa-file-excel-o\"></i>" + " 导出数据");
653   - },
654   - error: function(xhr, type){
655   - alert('错误:TODO');
656   -
657   - $(".exportAdd").removeClass("disabled");
658   - $(".exportAdd").html("<i class=\"fa fa-file-excel-o\"></i>" + " 导出数据");
659   - }
660   - });
661   -
662   - });
663   - },
664   -
665   - downloadFile: function (data, mimeType, fileName) {
666   - var success = false;
667   - var blob = new Blob([data], { type: mimeType });
668   - try {
669   - if (navigator.msSaveBlob)
670   - navigator.msSaveBlob(blob, fileName);
671   - else {
672   - // Try using other saveBlob implementations, if available
673   - var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
674   - if (saveBlob === undefined) throw "Not supported";
675   - saveBlob(blob, fileName);
676   - }
677   - success = true;
678   - } catch (ex) {
679   - console.log("saveBlob method failed with the following exception:");
680   - console.log(ex);
681   - }
682   -
683   - if (!success) {
684   - // Get the blob url creator
685   - var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
686   - if (urlCreator) {
687   - // Try to use a download link
688   - var link = document.createElement('a');
689   - if ('download' in link) {
690   - // Try to simulate a click
691   - try {
692   - // Prepare a blob URL
693   - var url = urlCreator.createObjectURL(blob);
694   - link.setAttribute('href', url);
695   -
696   - // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
697   - link.setAttribute("download", fileName);
698   -
699   - // Simulate clicking the download link
700   - var event = document.createEvent('MouseEvents');
701   - event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
702   - link.dispatchEvent(event);
703   - success = true;
704   -
705   - } catch (ex) {
706   - console.log("Download link method with simulated click failed with the following exception:");
707   - console.log(ex);
708   - }
709   - }
710   -
711   - if (!success) {
712   - // Fallback to window.location method
713   - try {
714   - // Prepare a blob URL
715   - // Use application/octet-stream when using window.location to force download
716   - var url = urlCreator.createObjectURL(blob);
717   - window.location = url;
718   - console.log("Download link method with window.location succeeded");
719   - success = true;
720   - } catch (ex) {
721   - console.log("Download link method with window.location failed with the following exception:");
722   - console.log(ex);
723   - }
724   - }
725   - }
726   - }
727   -
728   - if (!success) {
729   - // Fallback to window.open method
730   - console.log("No methods worked for saving the arraybuffer, using last resort window.open");
731   - window.open("", '_blank', '');
732   - }
733   - }
734   -
735   - };
736   -
737   -}();
  1 +/**
  2 + * 主类。
  3 + */
  4 +var Main_v2 = function() {
  5 +
  6 + // 内部工厂类
  7 + var _factoryFun = function() {
  8 + return {
  9 + // 创建参数
  10 + createParameterObj: function(formMap, dataMap) {
  11 + var paramObj = ParameterObj();
  12 + paramObj.wrap(formMap, dataMap);
  13 + return paramObj;
  14 + },
  15 + // 创建班次对象
  16 + createBcObj: function(lpObj, bcType, isUp, fcno, fcTimeObj, paramObj) {
  17 + var _bclc = paramObj.calcuTravelLcNumber(isUp, bcType);
  18 + var _fcsj = fcTimeObj;
  19 + var _bcsj = paramObj.calcuTravelTime(_fcsj, isUp);
  20 + var _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  21 + //var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, _bcsj);
  22 + var _stoptime = paramObj.fnCalcuFixedStopNumber(_arrsj, !isUp, undefined);
  23 + var _tccid = paramObj.getTTinfoId();
  24 + var _ttinfoid = paramObj.getTTinfoId();
  25 + var _xl = paramObj.getXlId();
  26 + var _qdz = isUp ? paramObj.getUpQdzObj().id : paramObj.getDownQdzObj().id;
  27 + var _zdz = isUp ? paramObj.getUpZdzObj().id : paramObj.getDownZdzObj().id;
  28 +
  29 + if (bcType == "bd") { // 早例保,传过来的发车时间是第一个班次的发车时间
  30 + if (isUp) { // 上行
  31 + _fcsj = paramObj.addMinute(
  32 + _fcsj,
  33 + -(paramObj.getUpOutTime() + paramObj.getLbTime()));
  34 + _bcsj = paramObj.getLbTime();
  35 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  36 + _stoptime = 0;
  37 + } else { // 下行
  38 + _fcsj = paramObj.addMinute(
  39 + _fcsj,
  40 + -(paramObj.getDownOutTime() + paramObj.getLbTime()));
  41 + _bcsj = paramObj.getLbTime();
  42 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  43 + _stoptime = 0;
  44 + }
  45 + } else if (bcType == "lc") { // 晚例保,传过来的发车时间是最后一个班次的到达时间
  46 + if (isUp) { // 上行
  47 + _fcsj = paramObj.addMinute(
  48 + _fcsj,
  49 + paramObj.getUpInTime());
  50 + _bcsj = paramObj.getLbTime();
  51 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  52 + _stoptime = 0;
  53 + } else { // 下行
  54 + _fcsj = paramObj.addMinute(
  55 + _fcsj,
  56 + paramObj.getDownInTime());
  57 + _bcsj = paramObj.getLbTime();
  58 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  59 + _stoptime = 0;
  60 + }
  61 + } else if (bcType == "out") { // 出场,传过来的发车时间是第一个班次的发车时间
  62 + if (isUp) { // 上行
  63 + _fcsj = paramObj.addMinute(
  64 + _fcsj,
  65 + -paramObj.getUpOutTime());
  66 + _bcsj = paramObj.getUpOutTime();
  67 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  68 + _stoptime = 0;
  69 + } else { // 下行
  70 + _fcsj = paramObj.addMinute(
  71 + _fcsj,
  72 + -paramObj.getDownOutTime());
  73 + _bcsj = paramObj.getDownOutTime();
  74 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  75 + _stoptime = 0;
  76 + }
  77 + } else if (bcType == "in") { // 进场,传过来的发车时间是最后一个班次的到达时间
  78 + if (isUp) { // 上行
  79 + _bcsj = paramObj.getUpInTime();
  80 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  81 + _stoptime = 0;
  82 + } else { // 下行
  83 + _bcsj = paramObj.getDownInTime();
  84 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  85 + _stoptime = 0;
  86 + }
  87 + } else if (bcType == "cf") { // 吃饭班次
  88 + // 以13:00为分界,之前的为午饭,之后的为晚饭
  89 + if (fcTimeObj.isBefore(paramObj.toTimeObj("13:00"))) {
  90 + _bcsj = paramObj.fnGetLunchTime();
  91 + } else {
  92 + _bcsj = paramObj.fnGetDinnerTime();
  93 + }
  94 + _arrsj = paramObj.addMinute(_fcsj, _bcsj);
  95 + _stoptime = 0;
  96 + }
  97 +
  98 + var bcParamObj = {};
  99 + bcParamObj.bcType = bcType; // 班次类型(normal,in_,out, bd, lc, cf等)
  100 + bcParamObj.isUp = isUp; // boolean是否上下行
  101 + bcParamObj.fcno = fcno; // 发车顺序号
  102 + bcParamObj.fcTimeObj = _fcsj; // 发车时间对象
  103 + bcParamObj.bclc = _bclc; // 班次里程
  104 + bcParamObj.bcsj = _bcsj; // 班次历时
  105 + bcParamObj.arrtime = _arrsj; // 到达时间对象
  106 + bcParamObj.stoptime = _stoptime; // 停站时间
  107 + bcParamObj.tccid = _tccid; // 停车场id
  108 + bcParamObj.ttinfoid = _ttinfoid; // 时刻表id
  109 + bcParamObj.xl = _xl; // 线路id
  110 + bcParamObj.qdzid = _qdz; // 起点站id
  111 + bcParamObj.zdzid = _zdz; // 终点站id
  112 +
  113 + return new InternalBcObj(lpObj, bcParamObj);
  114 + }
  115 + };
  116 + };
  117 + var _factory = _factoryFun();
  118 +
  119 + // 所有的时间使用moment.js计算
  120 +
  121 + var _paramObj; // 参数对象
  122 +
  123 + var _bxDesc = [ // 班型描述
  124 + {'type':'六工一休','hoursV':6.66, 'minueV':'6:40', 'qcount': 0, 'avertime': 0},
  125 + {'type':'五工一休','hoursV':6.85, 'minueV':'6:51', 'qcount': 0, 'avertime': 0},
  126 + {'type':'四工一休','hoursV':7.14, 'minueV':'7:08', 'qcount': 0, 'avertime': 0},
  127 + {'type':'三工一休','hoursV':7.61, 'minueV':'7:37', 'qcount': 0, 'avertime': 0},
  128 + {'type':'二工一休','hoursV':8.57, 'minueV':'8:34', 'qcount': 0, 'avertime': 0},
  129 + {'type':'一工一休','hoursV':11.42, 'minueV':'11:25', 'qcount': 0, 'avertime': 0},
  130 + {'type':'五工二休','hoursV':7.99, 'minueV':'8:00', 'qcount': 0, 'avertime': 0},
  131 + {'type':'无工休', 'hoursV':5.43, 'minueV':'5:43', 'qcount': 0, 'avertime': 0}
  132 + ];
  133 +
  134 + var _funCalcuExportData_lpObjList = function(aInternalLpObj) {
  135 + // 构造路牌对象
  136 + var aLpObj = [];
  137 + var i;
  138 + var j;
  139 + var z;
  140 + var oInternalLp;
  141 + var oInternalBc;
  142 + var oInternalBc_temp;
  143 + var oLp;
  144 + var iZlc;
  145 + var iYylc;
  146 + var iKslc;
  147 + var iZbc;
  148 + var iZgs;
  149 + var iYygs;
  150 + var iYybc;
  151 + for (i = 0; i < aInternalLpObj.length; i++) {
  152 + oInternalLp = aInternalLpObj[i];
  153 + iZlc = 0;
  154 + iYylc = 0;
  155 + iKslc = 0;
  156 + iZgs = 0;
  157 + iZbc = 0;
  158 + iYygs = 0;
  159 + iYybc = 0;
  160 + oLp = {
  161 + "lpname": oInternalLp.getLpName(), // 路牌名字
  162 + "isUp": oInternalLp.isUp(), // 每圈的第一个班次是否上行
  163 + "bcObjList": [], // 班次列表
  164 + "groupCount": oInternalLp.fnGetGroupCount(), // 总圈数
  165 + "zlc": 0, // 总里程
  166 + "yylc": 0, // 营运里程
  167 + "kslc": 0, // 空驶里程
  168 + "zgs": 0, // 总工时
  169 + "zbc": 0, // 总班次
  170 + "yygs": 0, // 营运工时
  171 + "yybc": 0, // 营运班次
  172 + "stationRouteId1": 0, // 第一个班次起点站路由id
  173 + "stationRouteId2": 0 // 第二个班次起点站路由id
  174 + };
  175 +
  176 + // 将报到班次,进出场班次加到班次的时间上
  177 + var iBcChainCount;
  178 + var oStartBc;
  179 + var oEndBc;
  180 + var oTempBc;
  181 + var aFcsj = [];
  182 +
  183 + iBcChainCount = oInternalLp.fnGetBcChainCount();
  184 + if (iBcChainCount == 1) { // 单一车次链,连班班型
  185 + oStartBc = oInternalLp.getBc(
  186 + oInternalLp.fnGetBcChainInfo(0)["s_q"],
  187 + oInternalLp.fnGetBcChainInfo(0)["s_b"]
  188 + );
  189 + oTempBc = _factory.createBcObj(
  190 + oLp, "bd", true, 1,
  191 + oStartBc.getFcTimeObj(),
  192 + _paramObj
  193 + );
  194 + aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  195 + oLp.bcObjList.push({ // 报到班次
  196 + "bcsj": oTempBc.getBcTime(), // 班次时间
  197 + "ssj": oTempBc.getStopTime(), // 停站时间
  198 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  199 +
  200 + "tccid": oTempBc._$_tccid, // 停车场id
  201 + "qdzid": oTempBc._$_qdzid, // 起点站id
  202 + "zdzid": oTempBc._$_zdzid, // 终点站id
  203 +
  204 + "isUp": oTempBc._$_isUp, // 是否上行
  205 +
  206 + "bcType": oTempBc._$_bcType, // 班次类型
  207 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  208 +
  209 + "groupNo": -1, // 第几圈
  210 + "groupBcNo": -1 // 圈里第几个班次
  211 +
  212 + });
  213 +
  214 + oTempBc = _factory.createBcObj(
  215 + oLp, "out", true, 1,
  216 + oStartBc.getFcTimeObj(),
  217 + _paramObj
  218 + );
  219 + aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  220 + aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
  221 + oStartBc._$_fcsj_desc = aFcsj.join("");
  222 +
  223 + oLp.bcObjList.push({ // 出场班次
  224 + "bcsj": oTempBc.getBcTime(), // 班次时间
  225 + "ssj": oTempBc.getStopTime(), // 停站时间
  226 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  227 +
  228 + "tccid": oTempBc._$_tccid, // 停车场id
  229 + "qdzid": oTempBc._$_qdzid, // 起点站id
  230 + "zdzid": oTempBc._$_zdzid, // 终点站id
  231 +
  232 + "isUp": oTempBc._$_isUp, // 是否上行
  233 +
  234 + "bcType": oTempBc._$_bcType, // 班次类型
  235 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  236 +
  237 + "groupNo": -1, // 第几圈
  238 + "groupBcNo": -2 // 圈里第几个班次
  239 +
  240 + });
  241 +
  242 + aFcsj = [];
  243 +
  244 + oEndBc = oInternalLp.getBc(
  245 + oInternalLp.fnGetBcChainInfo(0)["e_q"],
  246 + oInternalLp.fnGetBcChainInfo(0)["e_b"]
  247 + );
  248 + aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
  249 + oTempBc = _factory.createBcObj(
  250 + oLp, "in", true, 1,
  251 + oEndBc.getArrTimeObj(),
  252 + _paramObj
  253 + );
  254 + aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  255 +
  256 + oLp.bcObjList.push({ // 进场班次
  257 + "bcsj": oTempBc.getBcTime(), // 班次时间
  258 + "ssj": oTempBc.getStopTime(), // 停站时间
  259 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  260 +
  261 + "tccid": oTempBc._$_tccid, // 停车场id
  262 + "qdzid": oTempBc._$_qdzid, // 起点站id
  263 + "zdzid": oTempBc._$_zdzid, // 终点站id
  264 +
  265 + "isUp": oTempBc._$_isUp, // 是否上行
  266 +
  267 + "bcType": oTempBc._$_bcType, // 班次类型
  268 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  269 +
  270 + "groupNo": -2, // 第几圈
  271 + "groupBcNo": -3 // 圈里第几个班次
  272 +
  273 + });
  274 +
  275 + oTempBc = _factory.createBcObj(
  276 + oLp, "lc", true, 1,
  277 + oEndBc.getArrTimeObj(),
  278 + _paramObj
  279 + );
  280 + aFcsj.push("(离" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  281 + oLp.bcObjList.push({ // 离场班次
  282 + "bcsj": oTempBc.getBcTime(), // 班次时间
  283 + "ssj": oTempBc.getStopTime(), // 停站时间
  284 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  285 +
  286 + "tccid": oTempBc._$_tccid, // 停车场id
  287 + "qdzid": oTempBc._$_qdzid, // 起点站id
  288 + "zdzid": oTempBc._$_zdzid, // 终点站id
  289 +
  290 + "isUp": oTempBc._$_isUp, // 是否上行
  291 +
  292 + "bcType": oTempBc._$_bcType, // 班次类型
  293 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  294 +
  295 + "groupNo": -2, // 第几圈
  296 + "groupBcNo": -4 // 圈里第几个班次
  297 +
  298 + });
  299 +
  300 + oEndBc._$_fcsj_desc = aFcsj.join("");
  301 +
  302 + } else if (iBcChainCount == 2) { // 两个车次链,分班班型
  303 + oStartBc = oInternalLp.getBc(
  304 + oInternalLp.fnGetBcChainInfo(0)["s_q"],
  305 + oInternalLp.fnGetBcChainInfo(0)["s_b"]
  306 + );
  307 + oTempBc = _factory.createBcObj(
  308 + oLp, "bd", true, 1,
  309 + oStartBc.getFcTimeObj(),
  310 + _paramObj
  311 + );
  312 + aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  313 + oLp.bcObjList.push({ // 报到班次
  314 + "bcsj": oTempBc.getBcTime(), // 班次时间
  315 + "ssj": oTempBc.getStopTime(), // 停站时间
  316 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  317 +
  318 + "tccid": oTempBc._$_tccid, // 停车场id
  319 + "qdzid": oTempBc._$_qdzid, // 起点站id
  320 + "zdzid": oTempBc._$_zdzid, // 终点站id
  321 +
  322 + "isUp": oTempBc._$_isUp, // 是否上行
  323 +
  324 + "bcType": oTempBc._$_bcType, // 班次类型
  325 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  326 +
  327 + "groupNo": -1, // 第几圈
  328 + "groupBcNo": -1 // 圈里第几个班次
  329 +
  330 + });
  331 +
  332 + oTempBc = _factory.createBcObj(
  333 + oLp, "out", true, 1,
  334 + oStartBc.getFcTimeObj(),
  335 + _paramObj
  336 + );
  337 + aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  338 + aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
  339 + oStartBc._$_fcsj_desc = aFcsj.join("");
  340 +
  341 + oLp.bcObjList.push({ // 出场班次
  342 + "bcsj": oTempBc.getBcTime(), // 班次时间
  343 + "ssj": oTempBc.getStopTime(), // 停站时间
  344 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  345 +
  346 + "tccid": oTempBc._$_tccid, // 停车场id
  347 + "qdzid": oTempBc._$_qdzid, // 起点站id
  348 + "zdzid": oTempBc._$_zdzid, // 终点站id
  349 +
  350 + "isUp": oTempBc._$_isUp, // 是否上行
  351 +
  352 + "bcType": oTempBc._$_bcType, // 班次类型
  353 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  354 +
  355 + "groupNo": -1, // 第几圈
  356 + "groupBcNo": -2 // 圈里第几个班次
  357 +
  358 + });
  359 +
  360 + aFcsj = [];
  361 +
  362 + oEndBc = oInternalLp.getBc(
  363 + oInternalLp.fnGetBcChainInfo(0)["e_q"],
  364 + oInternalLp.fnGetBcChainInfo(0)["e_b"]
  365 + );
  366 + aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
  367 + oTempBc = _factory.createBcObj(
  368 + oLp, "in", true, 1,
  369 + oEndBc.getArrTimeObj(),
  370 + _paramObj
  371 + );
  372 + aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  373 + oLp.bcObjList.push({ // 进场班次
  374 + "bcsj": oTempBc.getBcTime(), // 班次时间
  375 + "ssj": oTempBc.getStopTime(), // 停站时间
  376 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  377 +
  378 + "tccid": oTempBc._$_tccid, // 停车场id
  379 + "qdzid": oTempBc._$_qdzid, // 起点站id
  380 + "zdzid": oTempBc._$_zdzid, // 终点站id
  381 +
  382 + "isUp": oTempBc._$_isUp, // 是否上行
  383 +
  384 + "bcType": oTempBc._$_bcType, // 班次类型
  385 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  386 +
  387 + "groupNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ?
  388 + oInternalLp.fnGetBcChainInfo(0)["e_q"] :
  389 + oInternalLp.fnGetBcChainInfo(0)["e_q"] + 1, // 第几圈
  390 + "groupBcNo": oInternalLp.fnGetBcChainInfo(0)["e_b"] == 0 ? 1 : 0 // 圈里第几个班次
  391 +
  392 + });
  393 + oEndBc._$_fcsj_desc = aFcsj.join("");
  394 +
  395 + aFcsj = [];
  396 +
  397 + oStartBc = oInternalLp.getBc(
  398 + oInternalLp.fnGetBcChainInfo(1)["s_q"],
  399 + oInternalLp.fnGetBcChainInfo(1)["s_b"]
  400 + );
  401 + oTempBc = _factory.createBcObj(
  402 + oLp, "bd", true, 1,
  403 + oStartBc.getFcTimeObj(),
  404 + _paramObj
  405 + );
  406 + aFcsj.push("(到" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  407 + oLp.bcObjList.push({ // 报到班次
  408 + "bcsj": oTempBc.getBcTime(), // 班次时间
  409 + "ssj": oTempBc.getStopTime(), // 停站时间
  410 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  411 +
  412 + "tccid": oTempBc._$_tccid, // 停车场id
  413 + "qdzid": oTempBc._$_qdzid, // 起点站id
  414 + "zdzid": oTempBc._$_zdzid, // 终点站id
  415 +
  416 + "isUp": oTempBc._$_isUp, // 是否上行
  417 +
  418 + "bcType": oTempBc._$_bcType, // 班次类型
  419 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  420 +
  421 + "groupNo": oInternalLp.fnGetBcChainInfo(1)["s_q"] - 1, // 第几圈
  422 + "groupBcNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] // 圈里第几个班次
  423 +
  424 + });
  425 +
  426 + oTempBc = _factory.createBcObj(
  427 + oLp, "out", true, 1,
  428 + oStartBc.getFcTimeObj(),
  429 + _paramObj
  430 + );
  431 + oLp.bcObjList.push({ // 出场班次
  432 + "bcsj": oTempBc.getBcTime(), // 班次时间
  433 + "ssj": oTempBc.getStopTime(), // 停站时间
  434 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  435 +
  436 + "tccid": oTempBc._$_tccid, // 停车场id
  437 + "qdzid": oTempBc._$_qdzid, // 起点站id
  438 + "zdzid": oTempBc._$_zdzid, // 终点站id
  439 +
  440 + "isUp": oTempBc._$_isUp, // 是否上行
  441 +
  442 + "bcType": oTempBc._$_bcType, // 班次类型
  443 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  444 +
  445 + "groupNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] == 0 ?
  446 + oInternalLp.fnGetBcChainInfo(1)["s_q"] - 1 :
  447 + oInternalLp.fnGetBcChainInfo(1)["s_q"], // 第几圈
  448 + "groupBcNo": oInternalLp.fnGetBcChainInfo(1)["s_b"] == 0 ? 1 : 0 // 圈里第几个班次
  449 +
  450 + });
  451 + aFcsj.push("(出" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  452 + aFcsj.push("(" + oStartBc.getFcTimeObj().format("HH:mm") + ")");
  453 + oStartBc._$_fcsj_desc = aFcsj.join("");
  454 +
  455 + aFcsj = [];
  456 +
  457 + oEndBc = oInternalLp.getBc(
  458 + oInternalLp.fnGetBcChainInfo(1)["e_q"],
  459 + oInternalLp.fnGetBcChainInfo(1)["e_b"]
  460 + );
  461 + aFcsj.push("(" + oEndBc.getFcTimeObj().format("HH:mm") + ")");
  462 + oTempBc = _factory.createBcObj(
  463 + oLp, "in", true, 1,
  464 + oEndBc.getArrTimeObj(),
  465 + _paramObj
  466 + );
  467 + aFcsj.push("(进" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  468 +
  469 + oLp.bcObjList.push({ // 进场班次
  470 + "bcsj": oTempBc.getBcTime(), // 班次时间
  471 + "ssj": oTempBc.getStopTime(), // 停站时间
  472 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  473 +
  474 + "tccid": oTempBc._$_tccid, // 停车场id
  475 + "qdzid": oTempBc._$_qdzid, // 起点站id
  476 + "zdzid": oTempBc._$_zdzid, // 终点站id
  477 +
  478 + "isUp": oTempBc._$_isUp, // 是否上行
  479 +
  480 + "bcType": oTempBc._$_bcType, // 班次类型
  481 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  482 +
  483 + "groupNo": -2, // 第几圈
  484 + "groupBcNo": -3 // 圈里第几个班次
  485 +
  486 + });
  487 +
  488 + oTempBc = _factory.createBcObj(
  489 + oLp, "lc", true, 1,
  490 + oEndBc.getArrTimeObj(),
  491 + _paramObj
  492 + );
  493 +
  494 + oLp.bcObjList.push({ // 离场班次
  495 + "bcsj": oTempBc.getBcTime(), // 班次时间
  496 + "ssj": oTempBc.getStopTime(), // 停站时间
  497 + "eatsj": oTempBc.fnGetEatTime(), // 吃饭时间
  498 +
  499 + "tccid": oTempBc._$_tccid, // 停车场id
  500 + "qdzid": oTempBc._$_qdzid, // 起点站id
  501 + "zdzid": oTempBc._$_zdzid, // 终点站id
  502 +
  503 + "isUp": oTempBc._$_isUp, // 是否上行
  504 +
  505 + "bcType": oTempBc._$_bcType, // 班次类型
  506 + "fcsj": oTempBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  507 +
  508 + "groupNo": -2, // 第几圈
  509 + "groupBcNo": -4 // 圈里第几个班次
  510 +
  511 + });
  512 +
  513 + aFcsj.push("(离" + oTempBc.getFcTimeObj().format("HH:mm") + ")");
  514 + oEndBc._$_fcsj_desc = aFcsj.join("");
  515 +
  516 + }
  517 +
  518 + for (j = 0; j < oInternalLp.fnGetGroupCount(); j++) {
  519 + for (z = 0; z < 2; z++) {
  520 + oInternalBc = oInternalLp.getBc(j, z);
  521 + if (oInternalBc) {
  522 + if (oInternalBc.fnGetEatTime() > 0) {
  523 + // 吃饭班次是下一个班次开始吃,和本班次方向相反
  524 + oInternalBc_temp = oInternalLp.getBc(
  525 + z == 1 ? j + 1 : j,
  526 + z == 1 ? 0 : 1);
  527 +
  528 + oInternalBc_temp._$_fcsj_desc = "(吃" + oInternalBc_temp.getFcTimeObj().format("HH:mm") + ")";
  529 + }
  530 +
  531 + oLp.bcObjList.push({
  532 + "bcsj": oInternalBc.getBcTime(), // 班次时间
  533 + "ssj": oInternalBc.getStopTime(), // 停站时间
  534 + "eatsj": oInternalBc.fnGetEatTime(), // 吃饭时间
  535 +
  536 + "tccid": oInternalBc._$_tccid, // 停车场id
  537 + "qdzid": oInternalBc._$_qdzid, // 起点站id
  538 + "zdzid": oInternalBc._$_zdzid, // 终点站id
  539 +
  540 + "isUp": oInternalBc._$_isUp, // 是否上行
  541 +
  542 + "bcType": oInternalBc._$_bcType, // 班次类型
  543 + "fcsj": oInternalBc._$_fcsjObj.format("HH:mm"), // 发车时间描述
  544 + "fcsjDesc" : oInternalBc._$_fcsj_desc || oInternalBc._$_fcsjObj.format("HH:mm"),
  545 +
  546 + "groupNo": j, // 第几圈
  547 + "groupBcNo": z // 圈里第几个班次
  548 +
  549 + });
  550 +
  551 + // iZlc = 0;
  552 + // iYylc = 0;
  553 + // iKslc = 0;
  554 + // iZgs = 0;
  555 + // iZbc = 0;
  556 + // iYygs = 0;
  557 + // iYybc = 0;
  558 +
  559 + iZlc = iZlc +
  560 + oInternalBc._$_bclc; // 里程
  561 + iYylc = iYylc +
  562 + oInternalBc._$_bclc; // 里程
  563 + iYygs = iYygs +
  564 + oInternalBc.getBcTime() + // 班次时间
  565 + oInternalBc.getStopTime() + // 停站时间
  566 + oInternalBc.fnGetEatTime(); // 吃饭时间
  567 + iYybc = iYybc + 1;
  568 +
  569 + iZgs = iZgs +
  570 + oInternalBc.getBcTime() + // 班次时间
  571 + oInternalBc.getStopTime() + // 停站时间
  572 + oInternalBc.fnGetEatTime(); // 吃饭时间
  573 + iZbc = iZbc + 1;
  574 +
  575 + // 设置圈站点路由id
  576 + if (oInternalBc.isUp() == oInternalLp.isUp()) { // 第一个班次
  577 + if (oLp.stationRouteId1 == 0) {
  578 + oLp.stationRouteId1 = oInternalBc._$_qdzid;
  579 + }
  580 + } else { // 第二个班次
  581 + if (oLp.stationRouteId2 == 0) {
  582 + oLp.stationRouteId2 = oInternalBc._$_qdzid;
  583 + }
  584 + }
  585 +
  586 + }
  587 + }
  588 +
  589 + }
  590 +
  591 + for (z = 0; z < oInternalLp.getOtherBcArray().length; z++) {
  592 + oInternalBc = oInternalLp.getOtherBcArray()[z];
  593 + iKslc = iKslc +
  594 + oInternalBc._$_bclc; // 里程
  595 + iZlc = iZlc +
  596 + oInternalBc._$_bclc; // 里程
  597 + iZgs = iZgs +
  598 + oInternalBc.getBcTime() + // 班次时间
  599 + oInternalBc.getStopTime(); // 停站时间
  600 + if (oInternalBc._$_bcType != "bd" &&
  601 + oInternalBc._$_bcType != "lc" &&
  602 + oInternalBc._$_bcType != "cf") {
  603 + iZbc = iZbc + 1;
  604 + }
  605 + }
  606 +
  607 + oLp.zlc = iZlc;
  608 + oLp.yylc = iYylc;
  609 + oLp.kslc = iKslc;
  610 + oLp.zgs = iZgs;
  611 + oLp.zbc = iZbc;
  612 + oLp.yygs = iYygs;
  613 + oLp.yybc = iYybc;
  614 + aLpObj.push(oLp);
  615 + }
  616 +
  617 + return aLpObj;
  618 + };
  619 +
  620 + var _funCalcuExportData_statInfoList = function(aInternalLpObj) {
  621 + var countBc = 0, // 总班次
  622 + serviceBc = 0, // 营运班次
  623 + jcbc = 0, // 进场总班次.
  624 + ccbc = 0, // 出场总班次.
  625 + cfbc = 0, // 吃饭总班次.
  626 + zwlbbc = 0, // 早晚例保总班次.
  627 + countGs = 0.0, // 总工时
  628 + servicesj = 0, // 营运班次总时间
  629 + jcsj = 0.0, // 进场总时间.
  630 + ccsj = 0.0, // 出场总时间.
  631 + cfsj = 0.0, // 吃饭总时间.
  632 + zwlbsj = 0.0, // 早晚例保总时间.
  633 + ksBc = 0, // 空驶班次
  634 + serviceLc = 0.0, // 营运里程
  635 + ksLc = 0.0, // 空驶里程
  636 + avgTzjx = 0.0, // 平均停站间隙
  637 + gfServiceBc = 0, // 高峰营运班次
  638 + dgServiceBc = 0, // 低谷营运班次
  639 + gfAvgTzjx = 0.0, // 高峰平均停站间隙
  640 + dgAvgTzjx = 0.0; // 低谷平均停站间隙
  641 +
  642 + var aAllBc = [];
  643 + var oLp;
  644 + var oBc;
  645 + var i;
  646 + var j;
  647 +
  648 + for (i = 0; i < aInternalLpObj.length; i++) {
  649 + oLp = aInternalLpObj[i];
  650 + for (j = 0; j < oLp.getBcArray().length; j++) {
  651 + aAllBc.push(oLp.getBcArray()[j]);
  652 + }
  653 + for (j = 0; j < oLp.getOtherBcArray().length; j++) {
  654 + aAllBc.push(oLp.getOtherBcArray()[j]);
  655 + }
  656 + }
  657 +
  658 + for (i = 0; i < aAllBc.length; i++) {
  659 + oBc = aAllBc[i];
  660 +
  661 + if (oBc.getBcTime() > 0) {
  662 + countBc = countBc + 1;
  663 + countGs = countGs + oBc.getStopTime() + oBc.getBcTime();
  664 + if (_paramObj.isTroughBc(oBc.getFcTimeObj())) {
  665 + if (oBc._$_bcType == "normal") {
  666 + dgServiceBc = dgServiceBc + 1;
  667 + dgAvgTzjx = dgAvgTzjx + oBc.getStopTime();
  668 + }
  669 + } else {
  670 + if (oBc._$_bcType == "normal") {
  671 + gfServiceBc = gfServiceBc + 1;
  672 + gfAvgTzjx = gfAvgTzjx + oBc.getStopTime();
  673 + }
  674 + }
  675 +
  676 + if (oBc._$_bcType == "normal") {
  677 + serviceBc = serviceBc + 1;
  678 + serviceLc = serviceLc + oBc._$_bclc;
  679 + servicesj = servicesj + oBc.getBcTime();
  680 + avgTzjx = avgTzjx + oBc.getStopTime();
  681 +
  682 + if (oBc.fnGetEatTime() > 0) {
  683 + cfbc = cfbc + 1;
  684 + cfsj = cfsj + oBc.fnGetEatTime();
  685 + }
  686 + } else if (oBc._$_bcType == "in") {
  687 + jcbc = jcbc + 1;
  688 + jcsj = jcsj + oBc.getBcTime();
  689 + } else if (oBc._$_bcType == "out") {
  690 + ccbc = ccbc + 1;
  691 + ccsj = ccsj + oBc.getBcTime();
  692 + } else if (oBc._$_bcType == "bd") {
  693 + zwlbbc = zwlbbc + 1;
  694 + zwlbsj = zwlbsj + oBc.getBcTime();
  695 + } else if (oBc._$_bcType == "lc") {
  696 + zwlbbc = zwlbbc + 1;
  697 + zwlbsj = zwlbsj + oBc.getBcTime();
  698 + }
  699 + }
  700 + }
  701 +
  702 + dgAvgTzjx = dgAvgTzjx / dgServiceBc;
  703 + gfAvgTzjx = gfAvgTzjx / gfServiceBc;
  704 + avgTzjx = avgTzjx / dgServiceBc;
  705 +
  706 + return [
  707 + {'statItem': '总班次(包括进出场、吃饭时间、早晚例保、营运且班次时间大于零的班次)', 'statValue': countBc},
  708 + {'statItem': '进场总班次(包括进场且班次时间大于零的班次)', 'statValue': jcbc},
  709 + {'statItem': '出场总班次(包括进场且班次时间大于零的班次)', 'statValue': ccbc},
  710 + {'statItem': '吃饭总班次(包括吃饭且班次时间大于零的班次)', 'statValue': cfbc},
  711 + {'statItem': '早晚例保总班次(包括早晚例保且时间大于零的班次)', 'statValue': zwlbbc},
  712 + {'statItem': '营运总班次(包括正常、区间、放大站且班次时间大于零班次)','statValue': serviceBc},
  713 + {'statItem': '进场总时间(包括进场班次且班次时间大于零)', 'statValue': jcsj/60},
  714 + {'statItem': '出场总时间(包括进场班次且班次时间大于零)', 'statValue': ccsj/60},
  715 + {'statItem': '吃饭总时间(包括吃饭班次且班次时间大于零)', 'statValue': cfsj/60},
  716 + {'statItem': '早晚例保总时间(包括早晚例保班次且时间大于零的)', 'statValue': zwlbsj/60},
  717 + {'statItem': '营运班次总时间(包括正常、区间、放大站且班次时间大于零)', 'statValue': servicesj/60},
  718 + {'statItem': '总工时(包括进出场、吃饭时间、早晚例保、营运班次时间)', 'statValue': countGs/60},
  719 + {'statItem': '空驶班次(包括直放班次)', 'statValue': ksBc},
  720 + {'statItem': '营运里程(包括正常、区间、放大站里程)', 'statValue': serviceLc},
  721 + {'statItem': '空驶里程(包括直放里程)', 'statValue': ksLc},
  722 + {'statItem': '平均停站时间(营运班次停站时间总和/营运总班次)', 'statValue': avgTzjx},
  723 + {'statItem': '高峰营运班次(包括早晚高峰时段的正常、区间、放大站班次)', 'statValue': gfServiceBc},
  724 + {'statItem': '低谷营运班次(包括低谷时段的正常、区间、放大站班次)', 'statValue': dgServiceBc},
  725 + {'statItem': '高峰平均停站间隙(高峰营运班次停站时间总和/高峰营运班次总和)', 'statValue': gfAvgTzjx},
  726 + {'statItem': '低谷平均停站间隙(低谷营运班次停站时间总和/低谷营运班次总和)', 'statValue': dgAvgTzjx},
  727 + {'statItem': '综合评估', 'statValue': 3}
  728 + ];
  729 +
  730 + };
  731 +
  732 + return {
  733 + /**
  734 + * 工厂对象,创建不同的对象。
  735 + * @returns {{createParameterObj, createBcObj}}
  736 + */
  737 + getFactory: function() {
  738 + return _factory;
  739 + },
  740 +
  741 + /**
  742 + * 使用发车间隔策略生成时刻表。
  743 + * @param paramObj 参数对象
  744 + * @param lpArray 路牌数组
  745 + * @constructor
  746 + */
  747 + BXPplaceClassesTime03 : function(paramObj, lpArray) {
  748 + // 参数对象
  749 + _paramObj = paramObj;
  750 +
  751 + // 1、初始化行车计划
  752 + var schedule = new InternalScheduleObj(_paramObj, lpArray, _factory);
  753 + schedule.fnInitDataWithBxLayout();
  754 + // 2、将连班路牌的班次补足
  755 + schedule.fnCalcuLpBx_lb();
  756 +
  757 + // 3、修正针对初始化时生成的高峰班次,之前不足的补上,多余的删除
  758 + schedule.fnAdjustGfbc(true, true); // 修正上行早高峰
  759 + schedule.fnAdjustGfbc(true, false); // 修正下行早高峰
  760 + schedule.fnAdjustGfbc(false, true); // 修正上行晚高峰
  761 + schedule.fnAdjustGfbc(false, false); // 修正下行晚高峰
  762 +
  763 + // 6、补吃饭班次
  764 + schedule.fnCalcuEatBc();
  765 +
  766 + // 4、按照车辆投入运营要求补充班次
  767 + schedule.fnCalcuLpBc_yy();
  768 +
  769 + // 5、根据班型补充所有的不足班次
  770 + schedule.fnCalcuLpBx_5_2();
  771 + schedule.fnCalcuLpBx_other();
  772 +
  773 + // 7、祛除上标线开头有删除标记的班次
  774 + schedule.fnRemoveDelFirstFlagBc();
  775 +
  776 + // TODO:8、调整路牌班次间隔
  777 + schedule.fnAdjustLpBcInterval(1);
  778 +
  779 + // TODO:9、调整纵向班次间隔
  780 + schedule.fnAdjustBcInterval(true, false, 10);
  781 + schedule.fnAdjustBcInterval(false, false, 10);
  782 +
  783 + // 10、确定末班车
  784 + schedule.fnCalcuLastBc();
  785 +
  786 + // 11、祛除上标线结尾有删除标记的班次
  787 + schedule.fnRemoveDelLastFlagBc();
  788 +
  789 + // TODO:12、平均化指定时间后的班次列表间隔
  790 + schedule.fnAdjustBcInterval2_avg(true, _paramObj.toTimeObj("19:50"));
  791 + schedule.fnAdjustBcInterval2_avg(false, _paramObj.toTimeObj("19:50"));
  792 +
  793 + // 10、补进出场例保班次
  794 + schedule.fnCalcuOtherBc();
  795 +
  796 + //-------------------- 输出ganut图上的班次,班型描述 ----------------------//
  797 + // TODO:班型再议
  798 + return {
  799 + 'json':schedule.fnToGanttBcArray(),'bxrcgs':null,
  800 + 'aInternalLpObj': schedule.fnGetLpArray()
  801 + };
  802 +
  803 + },
  804 + /**
  805 + * 导出时刻表配置。
  806 + * @param aInternalLpObj 内部路牌对象列表
  807 + */
  808 + exportDataConfig: function(aInternalLpObj) {
  809 + $('.exportAdd').on('click',function() {
  810 + var aInfos = {
  811 + "lpObjList": _funCalcuExportData_lpObjList(aInternalLpObj), // 路牌班次信息列表
  812 + "statInfoList": _funCalcuExportData_statInfoList(aInternalLpObj) // 统计项目列表
  813 + };
  814 +
  815 + console.log(aInfos);
  816 +
  817 + $(".exportAdd").addClass("disabled");
  818 + $(".exportAdd").html("<i class=\"fa fa-spinner\" aria-hidden=\"true\"></i>" + " 正在导出...");
  819 +
  820 + // 提交
  821 + $.ajax({
  822 + type: 'POST',
  823 + url: "/tidc/exportDTDFile",
  824 + dataType: 'binary',
  825 + contentType: "application/json",
  826 + data: JSON.stringify(aInfos),
  827 + success: function(data){
  828 + Main_v2.downloadFile(data, "application/octet-stream", "时刻表信息.xls");
  829 +
  830 + $(".exportAdd").removeClass("disabled");
  831 + $(".exportAdd").html("<i class=\"fa fa-file-excel-o\"></i>" + " 导出数据");
  832 + },
  833 + error: function(xhr, type){
  834 + alert('错误:TODO');
  835 +
  836 + $(".exportAdd").removeClass("disabled");
  837 + $(".exportAdd").html("<i class=\"fa fa-file-excel-o\"></i>" + " 导出数据");
  838 + }
  839 + });
  840 +
  841 + });
  842 + },
  843 +
  844 + downloadFile: function (data, mimeType, fileName) {
  845 + var success = false;
  846 + var blob = new Blob([data], { type: mimeType });
  847 + try {
  848 + if (navigator.msSaveBlob)
  849 + navigator.msSaveBlob(blob, fileName);
  850 + else {
  851 + // Try using other saveBlob implementations, if available
  852 + var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
  853 + if (saveBlob === undefined) throw "Not supported";
  854 + saveBlob(blob, fileName);
  855 + }
  856 + success = true;
  857 + } catch (ex) {
  858 + console.log("saveBlob method failed with the following exception:");
  859 + console.log(ex);
  860 + }
  861 +
  862 + if (!success) {
  863 + // Get the blob url creator
  864 + var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
  865 + if (urlCreator) {
  866 + // Try to use a download link
  867 + var link = document.createElement('a');
  868 + if ('download' in link) {
  869 + // Try to simulate a click
  870 + try {
  871 + // Prepare a blob URL
  872 + var url = urlCreator.createObjectURL(blob);
  873 + link.setAttribute('href', url);
  874 +
  875 + // Set the download attribute (Supported in Chrome 14+ / Firefox 20+)
  876 + link.setAttribute("download", fileName);
  877 +
  878 + // Simulate clicking the download link
  879 + var event = document.createEvent('MouseEvents');
  880 + event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
  881 + link.dispatchEvent(event);
  882 + success = true;
  883 +
  884 + } catch (ex) {
  885 + console.log("Download link method with simulated click failed with the following exception:");
  886 + console.log(ex);
  887 + }
  888 + }
  889 +
  890 + if (!success) {
  891 + // Fallback to window.location method
  892 + try {
  893 + // Prepare a blob URL
  894 + // Use application/octet-stream when using window.location to force download
  895 + var url = urlCreator.createObjectURL(blob);
  896 + window.location = url;
  897 + console.log("Download link method with window.location succeeded");
  898 + success = true;
  899 + } catch (ex) {
  900 + console.log("Download link method with window.location failed with the following exception:");
  901 + console.log(ex);
  902 + }
  903 + }
  904 + }
  905 + }
  906 +
  907 + if (!success) {
  908 + // Fallback to window.open method
  909 + console.log("No methods worked for saving the arraybuffer, using last resort window.open");
  910 + window.open("", '_blank', '');
  911 + }
  912 + }
  913 +
  914 + };
  915 +
  916 +}();
... ...
src/main/resources/static/pages/report/inoutstation.html
... ... @@ -389,6 +389,14 @@
389 389 var id=params[0].split("\\")[0];
390 390 var fcsj = $('.in_carpark_fcsj[data-id='+id+']', '#forms').html();
391 391 var ddsj= $('.in_carpark_zdsj[data-id='+id+']', '#forms').html();
  392 + var d1 = new Date(fcsj+":00");
  393 + var d2 = new Date(ddsj+":00");
  394 + console.log(parseInt(d1 - d2) / 1000 / 60);//两个时间相差的分钟数
  395 + if(parseInt(d1 - d2)>0){
  396 + d2.setDate(d2.getDate()+1);//设置天数 -1 天
  397 + ddsj = d2.getFullYear() + '-' + (d2.getMonth() + 1) + '-' + d2.getDate() + ' ' + d2.getHours() + ':' + d2.getMinutes();
  398 + }
  399 +
392 400 if(!(typeof(fcsj)=='undefined'|| typeof(ddsj)=='undefined')){
393 401 $get('/report/queryListZdxx',{clzbh:nbbm,date:rq,line:line,fcsj:fcsj,ddsj:ddsj},function(result){
394 402 var xlmc="线路: "+$("#select2-line-container").html();
... ... @@ -396,8 +404,8 @@
396 404 var rqmc="日期: "+rq;
397 405 var bcmc="班次: "+fcsj+"-"+ddsj;
398 406 $("#dlzmx").html("到离站详细 "+xlmc+" "+clmc+" "+rqmc+" "+bcmc);
399   - $("#fcsj_xx").val(fcsj);
400   - $("#ddsj_xx").val(ddsj);
  407 + $("#fcsj_xx").val(fcsj);
  408 + $("#ddsj_xx").val(ddsj);
401 409 var ludan_ll_1 = template('ludan_ll_1',{list:result});
402 410 // 把渲染好的模版html文本追加到表格中
403 411 $('#forms1 .ludan_ll_1').html(ludan_ll_1);
... ... @@ -419,7 +427,7 @@
419 427 layer.msg("请选择时间");
420 428 }else if(zdlx=="" || zdlx==null){
421 429 layer.msg("请选择方向");
422   - }else if(zd=="" || zd==null){
  430 + }else if(zd=="" || zd==null||zd==" "){
423 431 layer.msg("请选择站点");
424 432 }else{
425 433 var xlmc="线路: "+$("#select2-line-container").html();
... ...
src/main/resources/static/real_control_v2/alone_page/map/alone_wrap.html
... ... @@ -110,6 +110,7 @@
110 110 <!-- jquery.serializejson JSON序列化插件 -->
111 111 <script src="/assets/plugins/jquery.serializejson.js" merge="uikit_js"></script>
112 112  
  113 +<script src="/assets/plugins/pinyin.js" merge="plugins"></script>
113 114 </body>
114 115 <script>
115 116 gb_data_gps.fixedTimeRefresh();
... ...
src/main/resources/static/real_control_v2/fragments/north/nav/all_devices.html
... ... @@ -36,6 +36,7 @@
36 36 <div class="uk-autocomplete uk-form " >
37 37 <select name="abnormalStatus">
38 38 <option value="">全部</option>
  39 + <option value="timeError">时间戳异常</option>
39 40 <option value="outBounds">越界</option>
40 41 <option value="overspeed">超速</option>
41 42 <option value="offline">离线</option>
... ... @@ -58,11 +59,11 @@
58 59 <th style="width: 14%;">站点</th>
59 60 <th style="width: 11%;">车辆</th>
60 61 <th style="width: 11%;">设备号</th>
61   - <th style="width: 9%;">走向/营运</th>
  62 + <th style="width: 12%;">走向/营运</th>
62 63 <th style="width: 9%;">程序版本</th>
63 64 <th>最后GPS时间</th>
64   - <th style="width: 9%;">状态</th>
65   - <th style="width: 8%;">来源</th>
  65 + <th style="width: 8%;">状态</th>
  66 + <th style="width: 6%;">源</th>
66 67 </tr>
67 68 </thead>
68 69 <tbody>
... ... @@ -81,7 +82,11 @@
81 82 <td>{{gps.stationName}}</td>
82 83 <td>{{gps.nbbm}}</td>
83 84 <td>{{gps.deviceId}}</td>
84   - <td>{{gps.upDown}}/{{gps.state}}</td>
  85 + <td>{{gps.upDown}}/{{gps.state}}
  86 + {{if gps.origStateStr!=null}}
  87 + (<span style="color: #fe6262;">{{gps.origStateStr}}</span>)
  88 + {{/if}}
  89 + </td>
85 90 <td>{{gps.version}}</td>
86 91 <td>{{gps.timeStr}}</td>
87 92 <td>
... ... @@ -95,18 +100,14 @@
95 100 <span class="sm-red">GPS (0,0)</span>
96 101 {{else if gps.abnormalStatus=='offline'}}
97 102 <span>离线</span>
  103 + {{else if gps.abnormalStatus=='timeError'}}
  104 + <span class="sm-red" title="设备时间戳异常,尝试以服务器时间修正">time_ex</span>
98 105 {{else}}
99 106 ...
100 107 {{/if}}
101 108 </td>
102 109 <td>
103   - {{if gps.source==1}}
104   - <span style="color: #1e1ef5;" title="已切换至新网关">网关</span>
105   - {{else if gps.source==0}}
106   - <span style="color: #8e8e8e;" title="转接的数据,无法下发指令">转发</span>
107   - {{else}}
108   - <span class="sm-grey">未知</span>
109   - {{/if}}
  110 + <span class="sm-grey">{{gps.source}}</span>
110 111 </td>
111 112 </tr>
112 113 {{/each}}
... ...