Commit c7218aacb19d52f81c427f80d4b6f5703f2bdeb2

Authored by 徐烜
2 parents 488f06a0 28d4ebbe

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

Showing 50 changed files with 3851 additions and 191 deletions

Too many changes to show.

To preserve performance only 50 of 54 files are displayed.

... ... @@ -299,6 +299,11 @@
299 299 <version>3.3.0</version>
300 300 </dependency>
301 301  
  302 + <dependency>
  303 + <groupId>com.github.stuxuhai</groupId>
  304 + <artifactId>jpinyin</artifactId>
  305 + <version>1.1.8</version>
  306 + </dependency>
302 307 </dependencies>
303 308  
304 309 <dependencyManagement>
... ...
src/main/java/com/bsth/XDApplication.java
... ... @@ -129,7 +129,7 @@ public class XDApplication implements CommandLineRunner {
129 129  
130 130 //运管处静态数据提交
131 131 log.info(timeDiff / 1000 / 60 + "分钟之后提交到运管处");
132   - sexec.scheduleAtFixedRate(submitToTrafficManage, timeDiff / 1000, 60 * 60 * 24, TimeUnit.SECONDS);
  132 + sexec.scheduleAtFixedRate(submitToTrafficManage, timeDiff / 1000 + 60 * 60 * 5, 60 * 60 * 24, TimeUnit.SECONDS);
133 133 //计算油、公里加注
134 134 sexec.scheduleAtFixedRate(calcOilThread, timeDiff / 1000, 60 * 60 * 24, TimeUnit.SECONDS);
135 135  
... ...
src/main/java/com/bsth/controller/PersonnelController.java
1 1 package com.bsth.controller;
2 2  
  3 +import com.bsth.common.Constants;
  4 +import com.bsth.data.pinyin.PersionPinYin;
  5 +import com.bsth.data.pinyin.PersionPinYinBuffer;
3 6 import com.bsth.entity.Personnel;
  7 +import com.bsth.entity.sys.CompanyAuthority;
4 8 import com.bsth.service.PersonnelService;
5 9 import org.springframework.beans.factory.annotation.Autowired;
6 10 import org.springframework.web.bind.annotation.RequestMapping;
... ... @@ -8,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
8 12 import org.springframework.web.bind.annotation.RequestParam;
9 13 import org.springframework.web.bind.annotation.RestController;
10 14  
  15 +import javax.servlet.http.HttpServletRequest;
11 16 import java.util.List;
12 17 import java.util.Map;
13 18  
... ... @@ -21,8 +26,22 @@ public class PersonnelController extends BaseController&lt;Personnel, Integer&gt; {
21 26 @Autowired
22 27 private PersonnelService service;
23 28  
  29 + @Autowired
  30 + PersionPinYinBuffer persionPinYinBuffer;
  31 +
24 32 @RequestMapping(value = "/sreachPersonnel", method = RequestMethod.GET)
25 33 public List<Map<String, String>> sreachPersonnel(@RequestParam String jobCode) {
26 34 return service.sreachPersonnel(jobCode);
27 35 }
  36 +
  37 + @RequestMapping(value = "/all_py", method = RequestMethod.GET)
  38 + public List<PersionPinYin> findAll_PY(){
  39 + return persionPinYinBuffer.getAll();
  40 + }
  41 +
  42 + @RequestMapping(value = "/list_py", method = RequestMethod.GET)
  43 + public List<PersionPinYin> findByCurrUser_PY(HttpServletRequest request){
  44 + List<CompanyAuthority> auths = (List<CompanyAuthority>) request.getSession().getAttribute(Constants.COMPANY_AUTHORITYS);
  45 + return persionPinYinBuffer.getAll(auths);
  46 + }
28 47 }
... ...
src/main/java/com/bsth/controller/SectionController.java
... ... @@ -60,6 +60,26 @@ public class SectionController extends BaseController&lt;Section, Integer&gt; {
60 60 *
61 61 * @return Map<String, Object> <SUCCESS ; ERROR>
62 62 */
  63 + @RequestMapping(value="sectionCut" , method = RequestMethod.POST)
  64 + public Map<String, Object> sectionCut(@RequestParam Map<String, Object> map) {
  65 +
  66 + map.put("updateBy", "");
  67 +
  68 + map.put("createBy", "");
  69 +
  70 + map.put("createDate", "");
  71 +
  72 + return service.sectionCut(map);
  73 +
  74 + }
  75 +
  76 + /**
  77 + * @Description :TODO(编辑线路走向)
  78 + *
  79 + * @param map <sectionId:路段ID; sectionJSON:路段信息>
  80 + *
  81 + * @return Map<String, Object> <SUCCESS ; ERROR>
  82 + */
63 83 @RequestMapping(value="sectionUpdate" , method = RequestMethod.POST)
64 84 public Map<String, Object> sectionUpdate(@RequestParam Map<String, Object> map) {
65 85  
... ... @@ -74,6 +94,22 @@ public class SectionController extends BaseController&lt;Section, Integer&gt; {
74 94 }
75 95  
76 96 /**
  97 + * @Description :TODO(编辑缓存线路走向)
  98 + */
  99 + @RequestMapping(value="sectionCacheUpdate" , method = RequestMethod.POST)
  100 + public Map<String, Object> sectionCacheUpdate(@RequestParam Map<String, Object> map) {
  101 +
  102 + map.put("updateBy", "");
  103 +
  104 + map.put("createBy", "");
  105 +
  106 + map.put("createDate", "");
  107 +
  108 + return service.sectionCacheUpdate(map);
  109 +
  110 + }
  111 +
  112 + /**
77 113 * @Description :TODO(查询路段编码)
78 114 *
79 115 * @return int <sectionCode路段编码>
... ...
src/main/java/com/bsth/controller/SectionRouteController.java
... ... @@ -70,6 +70,18 @@ public class SectionRouteController extends BaseController&lt;SectionRoute, Integer
70 70  
71 71  
72 72 /**
  73 + * @Description :TODO(查询路段信息)
  74 + *
  75 + * @param map <line.id_eq:线路ID; directions_eq:方向>
  76 + *
  77 + * @return Map<String, Object>
  78 + */
  79 + @RequestMapping(value = "/findSectionCache" , method = RequestMethod.GET)
  80 + public List<Map<String, Object>> findPointsCache(@RequestParam Map<String, Object> map) {
  81 + return routeService.getSectionRouteCache(map);
  82 + }
  83 +
  84 + /**
73 85 * @Description : TODO(根据路段路由Id查询详情)
74 86 *
75 87 * @param map <id:路段路由ID>
... ...
src/main/java/com/bsth/controller/StationController.java
... ... @@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
8 8 import org.springframework.web.bind.annotation.RequestParam;
9 9 import org.springframework.web.bind.annotation.RestController;
10 10  
  11 +import antlr.collections.List;
  12 +
11 13 import com.bsth.entity.Station;
12 14 import com.bsth.service.StationService;
13 15 import com.bsth.util.GetUIDAndCode;
... ... @@ -36,6 +38,17 @@ public class StationController extends BaseController&lt;Station, Integer&gt; {
36 38 private StationService service;
37 39  
38 40 /**
  41 + * @Description :TODO(根据坐标点匹配数据库中的站点)
  42 + *
  43 + * @param map: <point:坐标点; name:站点名>
  44 + *
  45 + */
  46 + @RequestMapping(value="matchStation" , method = RequestMethod.GET)
  47 + public Map<String, Object> matchStation(@RequestParam Map<String, Object> map) {
  48 + return service.matchStation(map);
  49 + }
  50 +
  51 + /**
39 52 * @Description :TODO(系统规划保存数据)
40 53 *
41 54 * @param map <stationJSON:站点信息;
... ... @@ -68,6 +81,11 @@ public class StationController extends BaseController&lt;Station, Integer&gt; {
68 81 return service.manualSave(map);
69 82 }
70 83  
  84 + @RequestMapping(value="cacheSave" , method = RequestMethod.POST)
  85 + public Map<String, Object> cacheSave(@RequestParam Map<String, Object> map) {
  86 + return service.cacheSave(map);
  87 + }
  88 +
71 89 /**
72 90 * @Description :TODO(新增站点保存)
73 91 *
... ...
src/main/java/com/bsth/controller/StationRouteController.java
... ... @@ -99,6 +99,18 @@ public class StationRouteController extends BaseController&lt;StationRoute, Integer
99 99 }
100 100  
101 101 /**
  102 + * @Description :TODO(查询线路某方向下所有站点的中心百度坐标)
  103 + *
  104 + * @param map <lineId:线路ID; direction:方向>
  105 + *
  106 + * @return List<Map<String, Object>>
  107 + */
  108 + @RequestMapping(value = "/getStationRouteCacheCenterPoints" , method = RequestMethod.GET)
  109 + public List<Map<String, Object>> getStationRouteCacheCenterPoints(@RequestParam Map<String, Object> map) {
  110 + return service.getStationRouteCacheCenterPoints(map);
  111 + }
  112 +
  113 + /**
102 114 * @Description :TODO(撤销站点)
103 115 *
104 116 * @param map <lineId:线路ID; destroy:是否撤销(0:否;1:是)>
... ...
src/main/java/com/bsth/controller/realcontrol/BasicDataController.java
1 1 package com.bsth.controller.realcontrol;
2 2  
3   -import com.alibaba.fastjson.JSON;
4 3 import com.alibaba.fastjson.serializer.PropertyFilter;
5 4 import com.bsth.common.ResponseCode;
6 5 import com.bsth.data.BasicData;
... ... @@ -60,16 +59,16 @@ public class BasicDataController {
60 59 return rs;
61 60 }
62 61  
63   - @RequestMapping("/personnel")
  62 + /*@RequestMapping("/personnel")
64 63 public Map<String, Object> findPersonnelInfo(){
65 64 Map<String, Object> rs = new HashMap<>();
66 65 PersonnelFieldFilter filter=new PersonnelFieldFilter();
67 66 //驾驶员
68 67 rs.put("jsy", JSON.parse(JSON.toJSONString(BasicData.jsyMap.values(), filter)));
69 68 //售票员
70   - rs.put("spy", JSON.parse(JSON.toJSONString(BasicData.spyMap.values(), filter)));
  69 + rs.put("spy", JSON.parse(JSON.toJSONString(BasicData.spyMap.values(), filter)));*//*
71 70 return rs;
72   - }
  71 + }*/
73 72  
74 73 @RequestMapping("/all_personnel")
75 74 public Map<String, String> all_personnel(){
... ... @@ -179,15 +178,12 @@ public class BasicDataController {
179 178 map.put("lineCode", line.getLineCode());
180 179 rs.add(map);
181 180 }
182   - //listMultimap.put(line.getName(), nbbm);
183 181 }
184   - //return listMultimap.asMap();
185   -
186 182 return rs;
187 183 }
188 184  
189 185 /**
190   - * 获取站点和停车场对照表
  186 + * 获取站点和停车场历时公里对照表
191 187 * @param idx
192 188 * @return
193 189 */
... ...
src/main/java/com/bsth/controller/report/ReportController.java
... ... @@ -269,9 +269,11 @@ public class ReportController {
269 269  
270 270 @RequestMapping(value="/countBusMileage")
271 271 public List<Map<String,Object>> countBusMileage(@RequestParam Map<String, Object> map){
272   -
273 272 return service.countByBusList(map);
274 273 }
275 274  
276   -
  275 + @RequestMapping(value="/countDjg")
  276 + public List<Map<String, Object>> countDjg(@RequestParam Map<String, Object> map){
  277 + return service.countDjg(map);
  278 + }
277 279 }
... ...
src/main/java/com/bsth/data/BasicData.java
... ... @@ -2,6 +2,7 @@ package com.bsth.data;
2 2  
3 3 import com.bsth.Application;
4 4 import com.bsth.data.gpsdata.arrival.GeoCacheData;
  5 +import com.bsth.data.pinyin.PersionPinYinBuffer;
5 6 import com.bsth.entity.*;
6 7 import com.bsth.entity.schedule.CarConfigInfo;
7 8 import com.bsth.repository.*;
... ... @@ -64,10 +65,10 @@ public class BasicData implements CommandLineRunner {
64 65 //线路Code和shangHaiLinecode 对照
65 66 public static Map<String, String> lineCode2ShangHaiCodeMap;
66 67  
67   - //驾驶员工号 和 personnel 对象映射
  68 + /*//驾驶员工号 和 personnel 对象映射
68 69 public static Map<String, Personnel> jsyMap;
69 70 //售票员工号 和 personnel 对象映射
70   - public static Map<String, Personnel> spyMap;
  71 + public static Map<String, Personnel> spyMap;*/
71 72 //所以员工和personnerl 对象映射
72 73 public static Map<String, Personnel> perMap;
73 74 //全量员工 工号和姓名对照
... ... @@ -137,6 +138,9 @@ public class BasicData implements CommandLineRunner {
137 138 @Autowired
138 139 Station2ParkBuffer station2ParkBuffer;
139 140  
  141 + @Autowired
  142 + PersionPinYinBuffer persionPinYinBuffer;
  143 +
140 144  
141 145 @Override
142 146 public void run() {
... ... @@ -165,6 +169,8 @@ public class BasicData implements CommandLineRunner {
165 169 geoCacheData.loadData();
166 170 station2ParkBuffer.saveAll();
167 171 logger.info("加载基础数据成功!,");
  172 + //人员拼音转换
  173 + persionPinYinBuffer.refresh();
168 174 } catch (Exception e) {
169 175 logger.error("加载基础数据时出现异常,", e);
170 176 }
... ... @@ -321,7 +327,7 @@ public class BasicData implements CommandLineRunner {
321 327 public void loadPersonnelInfo() {
322 328 Iterator<Personnel> iterator = personnelRepository.findAll().iterator();
323 329  
324   - Map<String, Personnel> jsyTempMap = new HashMap<>(), spyTempMap = new HashMap<>(),perTempMap=new HashMap<>();
  330 + Map<String, Personnel> /*jsyTempMap = new HashMap<>(), spyTempMap = new HashMap<>(),*/perTempMap=new HashMap<>();
325 331 Map<String, String> allPersonMap = new HashMap<>();
326 332  
327 333 Personnel p;
... ... @@ -333,20 +339,20 @@ public class BasicData implements CommandLineRunner {
333 339 if (StringUtils.isEmpty(jobCode))
334 340 continue;
335 341  
336   - if (p.getPosts() != null) {
  342 + /*if (p.getPosts() != null) {
337 343 if (p.getPosts().equals("1"))
338 344 jsyTempMap.put(jobCode, p);
339 345 else if (p.getPosts().equals("2"))
340 346 spyTempMap.put(jobCode, p);
341   - }
  347 + }*/
342 348  
343 349 perTempMap.put(jobCode, p);
344 350  
345 351 allPersonMap.put(jobCode, p.getPersonnelName());
346 352 }
347 353  
348   - jsyMap = jsyTempMap;
349   - spyMap = spyTempMap;
  354 + //jsyMap = jsyTempMap;
  355 + //spyMap = spyTempMap;
350 356 allPerson = allPersonMap;
351 357 perMap = perTempMap;
352 358 }
... ...
src/main/java/com/bsth/data/gpsdata/arrival/utils/SignalSchPlanMatcher.java
... ... @@ -40,8 +40,8 @@ public class SignalSchPlanMatcher {
40 40 return;
41 41  
42 42 long dt = fbFirst.getDfsjT();
43   - //前5后10 -执行分班的首个营运
44   - if(dt - t < 1000 * 60 * 5 || t - dt < 1000 * 60 * 10){
  43 + //晚于待发前4分钟 -执行分班的首个营运
  44 + if(dt - t < 1000 * 60 * 4){
45 45 dayOfSchedule.addExecPlan(fbFirst);
46 46 return;
47 47 }
... ...
src/main/java/com/bsth/data/pinyin/PersionPinYin.java 0 → 100644
  1 +package com.bsth.data.pinyin;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonIgnore;
  4 +
  5 +/**
  6 + * 人员拼音映射
  7 + * Created by panzhao on 2017/7/19.
  8 + */
  9 +public class PersionPinYin {
  10 +
  11 + /**
  12 + * 工号
  13 + */
  14 + private String workId;
  15 +
  16 + /**
  17 + * 姓名
  18 + */
  19 + private String name;
  20 +
  21 + /**
  22 + * 全拼
  23 + */
  24 + private String fullChars;
  25 +
  26 + /**
  27 + * 简便
  28 + */
  29 + private String camelChars;
  30 +
  31 + /**
  32 + * 所属公司编码
  33 + */
  34 + @JsonIgnore
  35 + private String companyId;
  36 +
  37 + /**
  38 + * 所属分公司编码
  39 + */
  40 + @JsonIgnore
  41 + private String fgsCompanyId;
  42 +
  43 + public String getWorkId() {
  44 + return workId;
  45 + }
  46 +
  47 + public void setWorkId(String workId) {
  48 + this.workId = workId;
  49 + }
  50 +
  51 + public String getName() {
  52 + return name;
  53 + }
  54 +
  55 + public void setName(String name) {
  56 + this.name = name;
  57 + }
  58 +
  59 + public String getFullChars() {
  60 + return fullChars;
  61 + }
  62 +
  63 + public void setFullChars(String fullChars) {
  64 + this.fullChars = fullChars;
  65 + }
  66 +
  67 + public String getCamelChars() {
  68 + return camelChars;
  69 + }
  70 +
  71 + public void setCamelChars(String camelChars) {
  72 + this.camelChars = camelChars;
  73 + }
  74 +
  75 + public String getCompanyId() {
  76 + return companyId;
  77 + }
  78 +
  79 + public void setCompanyId(String companyId) {
  80 + this.companyId = companyId;
  81 + }
  82 +
  83 + public String getFgsCompanyId() {
  84 + return fgsCompanyId;
  85 + }
  86 +
  87 + public void setFgsCompanyId(String fgsCompanyId) {
  88 + this.fgsCompanyId = fgsCompanyId;
  89 + }
  90 +}
... ...
src/main/java/com/bsth/data/pinyin/PersionPinYinBuffer.java 0 → 100644
  1 +package com.bsth.data.pinyin;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +import com.bsth.entity.Personnel;
  5 +import com.bsth.entity.sys.CompanyAuthority;
  6 +import com.github.stuxuhai.jpinyin.PinyinException;
  7 +import com.github.stuxuhai.jpinyin.PinyinFormat;
  8 +import com.github.stuxuhai.jpinyin.PinyinHelper;
  9 +import com.google.common.collect.ArrayListMultimap;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.stereotype.Component;
  13 +
  14 +import java.util.ArrayList;
  15 +import java.util.Collection;
  16 +import java.util.List;
  17 +
  18 +/**
  19 + * 人员拼音数据映射缓存
  20 + * Created by panzhao on 2017/7/19.
  21 + */
  22 +@Component
  23 +public class PersionPinYinBuffer {
  24 +
  25 + static ArrayListMultimap<String, PersionPinYin> listMultimap = ArrayListMultimap.create();
  26 + static List<PersionPinYin> all = new ArrayList<>();
  27 +
  28 + Logger log = LoggerFactory.getLogger(this.getClass());
  29 +
  30 +
  31 + public void refresh(){
  32 + ArrayListMultimap<String, PersionPinYin> listMultimapCopy = ArrayListMultimap.create();
  33 + List<PersionPinYin> allCopy = new ArrayList<>();
  34 + PersionPinYin ppy;
  35 +
  36 + Collection<Personnel> list = BasicData.perMap.values();
  37 + for(Personnel p : list){
  38 + ppy = new PersionPinYin();
  39 + ppy.setCompanyId(p.getCompanyCode());
  40 + ppy.setFgsCompanyId(p.getBrancheCompanyCode());
  41 + ppy.setName(p.getPersonnelName());
  42 + ppy.setWorkId(p.getJobCode());
  43 + try {
  44 + ppy.setFullChars(PinyinHelper.convertToPinyinString(ppy.getName(), "" , PinyinFormat.WITHOUT_TONE));
  45 + ppy.setCamelChars(PinyinHelper.getShortPinyin(ppy.getName()));
  46 + }catch (PinyinException pye){
  47 + log.error("拼音转换出现异常," + ppy.getName(), pye);
  48 + continue;
  49 + }
  50 +
  51 + listMultimapCopy.put(ppy.getCompanyId() + "_" + ppy.getFgsCompanyId(), ppy);
  52 + allCopy.add(ppy);
  53 + }
  54 +
  55 + if(allCopy.size() > 0){
  56 + all = allCopy;
  57 + listMultimap = listMultimapCopy;
  58 + }
  59 + }
  60 +
  61 + public List<PersionPinYin> getAll(){
  62 + return all;
  63 + }
  64 +
  65 + public List<PersionPinYin> getAll(List<CompanyAuthority> auths){
  66 + List<PersionPinYin> rs = new ArrayList<>();
  67 + for(CompanyAuthority ca : auths){
  68 + rs.addAll(listMultimap.get(ca.getCompanyCode() + "_" + ca.getSubCompanyCode()));
  69 + }
  70 + return rs;
  71 + }
  72 +}
... ...
src/main/java/com/bsth/data/schedule/DayOfSchedule.java
... ... @@ -7,6 +7,7 @@ import com.bsth.common.ResponseCode;
7 7 import com.bsth.data.LineConfigData;
8 8 import com.bsth.data.gpsdata.GpsRealData;
9 9 import com.bsth.data.gpsdata.recovery.GpsDataRecovery;
  10 +import com.bsth.data.schedule.f_a_l.FirstAndLastHandler;
10 11 import com.bsth.entity.realcontrol.LineConfig;
11 12 import com.bsth.entity.realcontrol.ScheduleRealInfo;
12 13 import com.bsth.entity.schedule.SchedulePlanInfo;
... ... @@ -176,6 +177,8 @@ public class DayOfSchedule {
176 177 //添加到缓存
177 178 putAll(list);
178 179  
  180 + //标记首末班
  181 + FirstAndLastHandler.marks(list);
179 182  
180 183 Set<String> lps = searchAllLP(list);
181 184 for (String lp : lps) {
... ...
src/main/java/com/bsth/data/schedule/f_a_l/FirstAndLastHandler.java 0 → 100644
  1 +package com.bsth.data.schedule.f_a_l;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +import com.bsth.data.schedule.DayOfSchedule;
  5 +import com.bsth.data.schedule.ScheduleComparator;
  6 +import com.bsth.data.schedule.f_a_l.entity.ToGateway;
  7 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  8 +import com.bsth.util.db.DBUtils_MS;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.jdbc.core.BatchPreparedStatementSetter;
  13 +import org.springframework.jdbc.core.JdbcTemplate;
  14 +import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  15 +import org.springframework.stereotype.Component;
  16 +import org.springframework.transaction.TransactionDefinition;
  17 +import org.springframework.transaction.TransactionStatus;
  18 +import org.springframework.transaction.support.DefaultTransactionDefinition;
  19 +
  20 +import java.sql.PreparedStatement;
  21 +import java.sql.SQLException;
  22 +import java.util.ArrayList;
  23 +import java.util.Collections;
  24 +import java.util.List;
  25 +import java.util.concurrent.ConcurrentHashMap;
  26 +
  27 +/**
  28 + * 首末班处理程序
  29 + * Created by panzhao on 2017/7/19.
  30 + */
  31 +@Component
  32 +public class FirstAndLastHandler {
  33 +
  34 + static ConcurrentHashMap<String, ToGateway> maps = new ConcurrentHashMap<>();
  35 +
  36 + static Logger log = LoggerFactory.getLogger(FirstAndLastHandler.class);
  37 +
  38 + static boolean flag;
  39 +
  40 + @Autowired
  41 + DayOfSchedule dayOfSchedule;
  42 +
  43 + public void marks(String lineCode){
  44 + marks(dayOfSchedule.findByLineCode(lineCode));
  45 + }
  46 +
  47 + /**
  48 + * 标记首末班
  49 + * @param list
  50 + */
  51 + public static void marks(List<ScheduleRealInfo> list){
  52 + try{
  53 + Collections.sort(list, new ScheduleComparator.FCSJ());
  54 + //按上下行分组
  55 + List<ScheduleRealInfo> ups = new ArrayList<>(),
  56 + downs = new ArrayList<>();
  57 +
  58 + for(ScheduleRealInfo sch : list){
  59 + if(sch.getXlDir().equals("0"))
  60 + ups.add(sch);
  61 + else
  62 + downs.add(sch);
  63 + }
  64 +
  65 + markOneWay(ups);
  66 + markOneWay(downs);
  67 + }catch (Exception e){
  68 + log.error("", e);
  69 + }
  70 + }
  71 +
  72 + /**
  73 + * 标记单程,上行或下行
  74 + * @param list
  75 + */
  76 + private static void markOneWay(List<ScheduleRealInfo> list){
  77 + ScheduleRealInfo first = null, last = null;
  78 +
  79 + for(ScheduleRealInfo sch: list){
  80 + if(sch._isInout() || sch.getBcType().equals("region")
  81 + || sch.getBcType().equals("venting"))
  82 + continue;
  83 +
  84 + if(first == null)
  85 + first = sch;
  86 +
  87 + last = sch;
  88 + }
  89 +
  90 + put(first, last);
  91 + }
  92 +
  93 + private static void put(ScheduleRealInfo first, ScheduleRealInfo last){
  94 + if(first == null || last == null)
  95 + return;
  96 +
  97 + ToGateway tg = new ToGateway();
  98 + tg.setLineCode(first.getXlBm());
  99 + tg.setUpDown(Integer.parseInt(first.getXlDir()));
  100 + tg.setsDeviceId(BasicData.deviceId2NbbmMap.inverse().get(first.getClZbh()));
  101 + tg.setSt(first.getDfsjT());
  102 +
  103 + tg.setRq(first.getScheduleDateStr());
  104 +
  105 + tg.seteDeviceId(BasicData.deviceId2NbbmMap.inverse().get(last.getClZbh()));
  106 + tg.setEt(last.getDfsjT());
  107 +
  108 + maps.put(tg.getLineCode() + "_" + tg.getUpDown(), tg);
  109 + flag = true;
  110 + }
  111 +
  112 + public static void saveAll(){
  113 + if(!flag)
  114 + return;
  115 +
  116 + final List<ToGateway> pstList = new ArrayList<>(maps.values());
  117 + if(pstList == null || pstList.size() == 0)
  118 + return;
  119 +
  120 + flag = false;
  121 + JdbcTemplate jdbcTemp = new JdbcTemplate(DBUtils_MS.getDataSource());
  122 + //编程式事务
  123 + DataSourceTransactionManager tran = new DataSourceTransactionManager(jdbcTemp.getDataSource());
  124 + DefaultTransactionDefinition def = new DefaultTransactionDefinition();
  125 + def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
  126 + TransactionStatus status = tran.getTransaction(def);
  127 +
  128 + try{
  129 + //删除
  130 + jdbcTemp.update("delete from bsth_t_first_last");
  131 + //重新写入
  132 + jdbcTemp.batchUpdate("insert into bsth_t_first_last(line_code, s_device_id, st, e_device_id, et, up_down, rq) VALUES(?, ?, ?, ?, ?, ?, ?)", new BatchPreparedStatementSetter() {
  133 + @Override
  134 + public void setValues(PreparedStatement ps, int i) throws SQLException {
  135 + ToGateway tg = pstList.get(i);
  136 + ps.setString(1, tg.getLineCode());
  137 + ps.setString(2, tg.getsDeviceId());
  138 + ps.setLong(3, tg.getSt());
  139 + ps.setString(4, tg.geteDeviceId());
  140 + ps.setLong(5, tg.getEt());
  141 + ps.setInt(6, tg.getUpDown());
  142 + ps.setString(7, tg.getRq());
  143 + }
  144 +
  145 + @Override
  146 + public int getBatchSize() {
  147 + return pstList.size();
  148 + }
  149 + });
  150 +
  151 + log.info("首末班数据入库," + pstList.size());
  152 + tran.commit(status);
  153 + }catch (Exception e){
  154 + log.error("", e);
  155 + tran.rollback(status);
  156 + }
  157 + }
  158 +}
... ...
src/main/java/com/bsth/data/schedule/f_a_l/entity/ToGateway.java 0 → 100644
  1 +package com.bsth.data.schedule.f_a_l.entity;
  2 +
  3 +/**
  4 + * 发送给网关的首末班数据格式
  5 + * Created by panzhao on 2017/7/19.
  6 + */
  7 +public class ToGateway {
  8 +
  9 + /** 线路 */
  10 + private String lineCode;
  11 +
  12 + /** 上下行 */
  13 + private int upDown;
  14 +
  15 + /** 首班设备号 */
  16 + private String sDeviceId;
  17 +
  18 + /** 首班时间 */
  19 + private Long st;
  20 +
  21 + /** 末班设备号 */
  22 + private String eDeviceId;
  23 +
  24 + /** 末班时间 */
  25 + private Long et;
  26 +
  27 + /** 班次日期 */
  28 + private String rq;
  29 +
  30 +
  31 + public String getLineCode() {
  32 + return lineCode;
  33 + }
  34 +
  35 + public void setLineCode(String lineCode) {
  36 + this.lineCode = lineCode;
  37 + }
  38 +
  39 + public Long getSt() {
  40 + return st;
  41 + }
  42 +
  43 + public void setSt(Long st) {
  44 + this.st = st;
  45 + }
  46 +
  47 + public Long getEt() {
  48 + return et;
  49 + }
  50 +
  51 + public void setEt(Long et) {
  52 + this.et = et;
  53 + }
  54 +
  55 + public String getRq() {
  56 + return rq;
  57 + }
  58 +
  59 + public void setRq(String rq) {
  60 + this.rq = rq;
  61 + }
  62 +
  63 + public int getUpDown() {
  64 + return upDown;
  65 + }
  66 +
  67 + public void setUpDown(int upDown) {
  68 + this.upDown = upDown;
  69 + }
  70 +
  71 + public String getsDeviceId() {
  72 + return sDeviceId;
  73 + }
  74 +
  75 + public void setsDeviceId(String sDeviceId) {
  76 + this.sDeviceId = sDeviceId;
  77 + }
  78 +
  79 + public String geteDeviceId() {
  80 + return eDeviceId;
  81 + }
  82 +
  83 + public void seteDeviceId(String eDeviceId) {
  84 + this.eDeviceId = eDeviceId;
  85 + }
  86 +}
... ...
src/main/java/com/bsth/data/schedule/thread/ScheduleRefreshThread.java
... ... @@ -5,6 +5,7 @@ import com.bsth.data.LineConfigData;
5 5 import com.bsth.data.directive.DayOfDirectives;
6 6 import com.bsth.data.pilot80.PilotReport;
7 7 import com.bsth.data.schedule.DayOfSchedule;
  8 +import com.bsth.data.schedule.f_a_l.FirstAndLastHandler;
8 9 import com.bsth.entity.realcontrol.LineConfig;
9 10 import org.slf4j.Logger;
10 11 import org.slf4j.LoggerFactory;
... ... @@ -69,7 +70,9 @@ public class ScheduleRefreshThread extends Thread{
69 70 logger.info(lineCode + "翻班完成, " + currSchDate + " -班次数量:" + dayOfSchedule.findByLineCode(lineCode).size());
70 71 }
71 72 }
72   -
  73 +
  74 + //首末班入库(给网关用的数据)
  75 + FirstAndLastHandler.saveAll();
73 76 } catch (Exception e) {
74 77 logger.error("", e);
75 78 }
... ...
src/main/java/com/bsth/entity/SectionRouteCache.java 0 → 100644
  1 +package com.bsth.entity;
  2 +
  3 +import java.util.Date;
  4 +
  5 +import javax.persistence.Column;
  6 +import javax.persistence.Entity;
  7 +import javax.persistence.GeneratedValue;
  8 +import javax.persistence.GenerationType;
  9 +import javax.persistence.Id;
  10 +import javax.persistence.ManyToOne;
  11 +import javax.persistence.OneToOne;
  12 +import javax.persistence.Table;
  13 +
  14 +
  15 +/**
  16 + *
  17 + * @ClassName : SectionRoute(路段路由缓存实体类)
  18 + *
  19 + * @Author : bsth@lq
  20 + *
  21 + * @Description : TODO(路段路由)
  22 + *
  23 + * @Data :2016-04-21
  24 + *
  25 + * @Version 公交调度系统BS版 0.1
  26 + *
  27 + */
  28 +
  29 +@Entity
  30 +@Table(name = "bsth_c_sectionroute_cache")
  31 +public class SectionRouteCache {
  32 +
  33 + @Id
  34 + @GeneratedValue(strategy = GenerationType.IDENTITY)
  35 + private Integer id;
  36 +
  37 + // 路段路由序号
  38 + private Integer sectionrouteCode;
  39 +
  40 + // 线路编号
  41 + private String lineCode;
  42 +
  43 + // 路段编号
  44 + private String sectionCode;
  45 +
  46 + // 路段路由方向
  47 + private Integer directions;
  48 +
  49 + // 版本号
  50 + private Integer versions;
  51 +
  52 + // 是否撤销
  53 + private Integer destroy;
  54 +
  55 + /** 是否有路段限速数据 <0:分段;1:未分段>*/
  56 + private Integer isRoadeSpeed;
  57 +
  58 + // 描述
  59 + private String descriptions;
  60 +
  61 + // 创建人
  62 + private Integer createBy;
  63 +
  64 + // 修改人
  65 + private Integer updateBy;
  66 +
  67 + // 创建日期
  68 + @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
  69 + private Date createDate;
  70 +
  71 + // 修改日期
  72 + @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
  73 + private Date updateDate;
  74 +
  75 + // 路段信息
  76 + @OneToOne
  77 + private Section section;
  78 +
  79 + // 线路信息
  80 + @ManyToOne
  81 + private Line line;
  82 +
  83 + public Integer getIsRoadeSpeed() {
  84 + return isRoadeSpeed;
  85 + }
  86 +
  87 + public void setIsRoadeSpeed(Integer isRoadeSpeed) {
  88 + this.isRoadeSpeed = isRoadeSpeed;
  89 + }
  90 +
  91 + public Integer getId() {
  92 + return id;
  93 + }
  94 +
  95 + public void setId(Integer id) {
  96 + this.id = id;
  97 + }
  98 +
  99 + public Integer getSectionrouteCode() {
  100 + return sectionrouteCode;
  101 + }
  102 +
  103 + public void setSectionrouteCode(Integer sectionrouteCode) {
  104 + this.sectionrouteCode = sectionrouteCode;
  105 + }
  106 +
  107 + public String getLineCode() {
  108 + return lineCode;
  109 + }
  110 +
  111 + public void setLineCode(String lineCode) {
  112 + this.lineCode = lineCode;
  113 + }
  114 +
  115 + public String getSectionCode() {
  116 + return sectionCode;
  117 + }
  118 +
  119 + public void setSectionCode(String sectionCode) {
  120 + this.sectionCode = sectionCode;
  121 + }
  122 +
  123 + public Integer getDirections() {
  124 + return directions;
  125 + }
  126 +
  127 + public void setDirections(Integer directions) {
  128 + this.directions = directions;
  129 + }
  130 +
  131 + public Integer getVersions() {
  132 + return versions;
  133 + }
  134 +
  135 + public void setVersions(Integer versions) {
  136 + this.versions = versions;
  137 + }
  138 +
  139 + public Integer getDestroy() {
  140 + return destroy;
  141 + }
  142 +
  143 + public void setDestroy(Integer destroy) {
  144 + this.destroy = destroy;
  145 + }
  146 +
  147 + public String getDescriptions() {
  148 + return descriptions;
  149 + }
  150 +
  151 + public void setDescriptions(String descriptions) {
  152 + this.descriptions = descriptions;
  153 + }
  154 +
  155 + public Integer getCreateBy() {
  156 + return createBy;
  157 + }
  158 +
  159 + public void setCreateBy(Integer createBy) {
  160 + this.createBy = createBy;
  161 + }
  162 +
  163 + public Integer getUpdateBy() {
  164 + return updateBy;
  165 + }
  166 +
  167 + public void setUpdateBy(Integer updateBy) {
  168 + this.updateBy = updateBy;
  169 + }
  170 +
  171 + public Date getCreateDate() {
  172 + return createDate;
  173 + }
  174 +
  175 + public void setCreateDate(Date createDate) {
  176 + this.createDate = createDate;
  177 + }
  178 +
  179 + public Date getUpdateDate() {
  180 + return updateDate;
  181 + }
  182 +
  183 + public void setUpdateDate(Date updateDate) {
  184 + this.updateDate = updateDate;
  185 + }
  186 +
  187 + public Section getSection() {
  188 + return section;
  189 + }
  190 +
  191 + public void setSection(Section section) {
  192 + this.section = section;
  193 + }
  194 +
  195 + public Line getLine() {
  196 + return line;
  197 + }
  198 +
  199 + public void setLine(Line line) {
  200 + this.line = line;
  201 + }
  202 +}
... ...
src/main/java/com/bsth/entity/StationRouteCache.java 0 → 100644
  1 +package com.bsth.entity;
  2 +
  3 +import javax.persistence.*;
  4 +
  5 +import java.util.Date;
  6 +
  7 +/**
  8 + *
  9 + * @ClassName : StationRouteCache(站点路由缓存实体类)
  10 + *
  11 + * @Author : bsth@lq
  12 + *
  13 + * @Description : TODO(站点路由)
  14 + *
  15 + * @Data :2016-04-19
  16 + *
  17 + * @Version 公交调度系统BS版 0.1
  18 + *
  19 + */
  20 +
  21 +@Entity
  22 +@Table(name = "bsth_c_stationroute_cache")
  23 +@NamedEntityGraphs({
  24 + @NamedEntityGraph(name = "stationRoute_station_cache", attributeNodes = {
  25 + @NamedAttributeNode("station"),
  26 + @NamedAttributeNode("line")
  27 + })
  28 +})
  29 +public class StationRouteCache {
  30 +
  31 + //站点路由ID
  32 + @Id
  33 + @GeneratedValue(strategy = GenerationType.IDENTITY)
  34 + private Integer id;
  35 +
  36 + // 站点路由序号
  37 + private Integer stationRouteCode;
  38 +
  39 + // 站点编码
  40 + private String stationCode;
  41 +
  42 + // 站点名称
  43 + private String stationName;
  44 +
  45 + // 线路编码
  46 + private String lineCode;
  47 +
  48 + /**
  49 + * 站点类型
  50 + *
  51 + * ------ B:起点站
  52 + *
  53 + * ------ Z:中途站
  54 + *
  55 + * ------ E:终点站
  56 + *
  57 + * ------ T:停车场
  58 + *
  59 + */
  60 + private String stationMark;
  61 +
  62 + // 站点路由出站序号
  63 + private Integer outStationNmber;
  64 +
  65 + // 站点路由到站距离
  66 + private Double distances;
  67 +
  68 + // 站点路由到站时间
  69 + private Double toTime;
  70 +
  71 + // 首班时间
  72 + private String firstTime;
  73 +
  74 + // 末班时间
  75 + private String endTime;
  76 +
  77 + // 站点路由方向
  78 + private Integer directions;
  79 +
  80 + // 版本号
  81 + private Integer versions;
  82 +
  83 + // 是否撤销
  84 + private Integer destroy;
  85 +
  86 + // 描述
  87 + private String descriptions;
  88 +
  89 + // 创建人
  90 + private Integer createBy;
  91 +
  92 + // 修改人
  93 + private Integer updateBy;
  94 +
  95 + // 创建日期
  96 + @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
  97 + private Date createDate;
  98 +
  99 + // 修改日期
  100 + @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
  101 + private Date updateDate;
  102 +
  103 + // 站点信息
  104 + @ManyToOne(fetch = FetchType.LAZY)
  105 + private Station station;
  106 +
  107 + // 线路信息
  108 + @ManyToOne
  109 + private Line line;
  110 +
  111 + public Integer getId() {
  112 + return id;
  113 + }
  114 +
  115 + public void setId(Integer id) {
  116 + this.id = id;
  117 + }
  118 +
  119 + public Integer getStationRouteCode() {
  120 + return stationRouteCode;
  121 + }
  122 +
  123 + public void setStationRouteCode(Integer stationRouteCode) {
  124 + this.stationRouteCode = stationRouteCode;
  125 + }
  126 +
  127 + public String getStationCode() {
  128 + return stationCode;
  129 + }
  130 +
  131 + public void setStationCode(String stationCode) {
  132 + this.stationCode = stationCode;
  133 + }
  134 +
  135 + public String getStationName() {
  136 + return stationName;
  137 + }
  138 +
  139 + public void setStationName(String stationName) {
  140 + this.stationName = stationName;
  141 + }
  142 +
  143 + public String getLineCode() {
  144 + return lineCode;
  145 + }
  146 +
  147 + public void setLineCode(String lineCode) {
  148 + this.lineCode = lineCode;
  149 + }
  150 +
  151 + public String getStationMark() {
  152 + return stationMark;
  153 + }
  154 +
  155 + public void setStationMark(String stationMark) {
  156 + this.stationMark = stationMark;
  157 + }
  158 +
  159 + public Integer getOutStationNmber() {
  160 + return outStationNmber;
  161 + }
  162 +
  163 + public void setOutStationNmber(Integer outStationNmber) {
  164 + this.outStationNmber = outStationNmber;
  165 + }
  166 +
  167 + public Double getDistances() {
  168 + return distances;
  169 + }
  170 +
  171 + public void setDistances(Double distances) {
  172 + this.distances = distances;
  173 + }
  174 +
  175 + public Double getToTime() {
  176 + return toTime;
  177 + }
  178 +
  179 + public void setToTime(Double toTime) {
  180 + this.toTime = toTime;
  181 + }
  182 +
  183 + public String getFirstTime() {
  184 + return firstTime;
  185 + }
  186 +
  187 + public void setFirstTime(String firstTime) {
  188 + this.firstTime = firstTime;
  189 + }
  190 +
  191 + public String getEndTime() {
  192 + return endTime;
  193 + }
  194 +
  195 + public void setEndTime(String endTime) {
  196 + this.endTime = endTime;
  197 + }
  198 +
  199 + public Integer getDirections() {
  200 + return directions;
  201 + }
  202 +
  203 + public void setDirections(Integer directions) {
  204 + this.directions = directions;
  205 + }
  206 +
  207 + public Integer getVersions() {
  208 + return versions;
  209 + }
  210 +
  211 + public void setVersions(Integer versions) {
  212 + this.versions = versions;
  213 + }
  214 +
  215 + public Integer getDestroy() {
  216 + return destroy;
  217 + }
  218 +
  219 + public void setDestroy(Integer destroy) {
  220 + this.destroy = destroy;
  221 + }
  222 +
  223 + public String getDescriptions() {
  224 + return descriptions;
  225 + }
  226 +
  227 + public void setDescriptions(String descriptions) {
  228 + this.descriptions = descriptions;
  229 + }
  230 +
  231 + public Integer getCreateBy() {
  232 + return createBy;
  233 + }
  234 +
  235 + public void setCreateBy(Integer createBy) {
  236 + this.createBy = createBy;
  237 + }
  238 +
  239 + public Integer getUpdateBy() {
  240 + return updateBy;
  241 + }
  242 +
  243 + public void setUpdateBy(Integer updateBy) {
  244 + this.updateBy = updateBy;
  245 + }
  246 +
  247 + public Date getCreateDate() {
  248 + return createDate;
  249 + }
  250 +
  251 + public void setCreateDate(Date createDate) {
  252 + this.createDate = createDate;
  253 + }
  254 +
  255 + public Date getUpdateDate() {
  256 + return updateDate;
  257 + }
  258 +
  259 + public void setUpdateDate(Date updateDate) {
  260 + this.updateDate = updateDate;
  261 + }
  262 +
  263 + public Station getStation() {
  264 + return station;
  265 + }
  266 +
  267 + public void setStation(Station station) {
  268 + this.station = station;
  269 + }
  270 +
  271 + public Line getLine() {
  272 + return line;
  273 + }
  274 +
  275 + public void setLine(Line line) {
  276 + this.line = line;
  277 + }
  278 +}
0 279 \ No newline at end of file
... ...
src/main/java/com/bsth/repository/SectionRouteCacheRepository.java 0 → 100644
  1 +package com.bsth.repository;
  2 +
  3 +import java.util.List;
  4 +
  5 +import org.springframework.data.jpa.repository.Modifying;
  6 +import org.springframework.data.jpa.repository.Query;
  7 +import org.springframework.stereotype.Repository;
  8 +import org.springframework.transaction.annotation.Transactional;
  9 +
  10 +import com.bsth.entity.SectionRoute;
  11 +import com.bsth.entity.SectionRouteCache;
  12 +
  13 +/**
  14 + *
  15 + * @Interface: SectionRouteRepository(路段路由Repository数据持久层接口)
  16 + *
  17 + * @Extends : BaseRepository
  18 + *
  19 + * @Description: TODO(路段路由Repository数据持久层接口)
  20 + *
  21 + * @Author bsth@lq
  22 + *
  23 + * @Date 2016年05月03日 上午9:21:17
  24 + *
  25 + * @Version 公交调度系统BS版 0.1
  26 + *
  27 + */
  28 +
  29 +@Repository
  30 +public interface SectionRouteCacheRepository extends BaseRepository<SectionRouteCache, Integer> {
  31 +
  32 + /**
  33 + * @Description :TODO(查询路段信息)
  34 + *
  35 + * @param map <lineId:线路ID; directions:方向>
  36 + *
  37 + * @return List<Object[]>
  38 + */
  39 + @Query(value ="SELECT a.sectionrouteId," +
  40 + "a.sectionrouteLine," +
  41 + " a.sectionrouteLineCode," +
  42 + " a.sectionrouteSection," +
  43 + " a.sectionrouteSectionCode," +
  44 + " a.sectionrouteCode," +
  45 + " a.sectionrouteDirections," +
  46 + " b.id AS sectionId," +
  47 + " b.section_code AS sectionCode," +
  48 + " b.section_name AS sectionName," +
  49 + " b.croses_road AS sectionRoad," +
  50 + " b.end_node AS sectionEndNode," +
  51 + " b.start_node AS sectionStartNode," +
  52 + " b.middle_node AS sectionMiddleNode," +
  53 + " b.section_type AS sectionType," +
  54 + " b.csection_vector AS sectionCsectionVector," +
  55 + " ST_AsText(b.bsection_vector) AS sectionBsectionVector," +
  56 + " ST_AsText(b.gsection_vector) AS sectionGsectionVector," +
  57 + " b.road_coding AS sectionRoadCoding," +
  58 + " b.section_distance AS sectionDistance," +
  59 + " b.section_time AS sectionTime," +
  60 + " b.db_type AS sectiondbType," +
  61 + " b.speed_limit AS sectionSpeedLimet ,a.destroy,a.versions,a.descriptions,a.isRoadeSpeed FROM (" +
  62 + "SELECT r.id AS sectionrouteId," +
  63 + "r.line AS sectionrouteLine," +
  64 + "r.line_code AS sectionrouteLineCode," +
  65 + "r.section AS sectionrouteSection," +
  66 + "r.section_code AS sectionrouteSectionCode," +
  67 + "r.sectionroute_code AS sectionrouteCode," +
  68 + "r.directions AS sectionrouteDirections," +
  69 + "r.destroy AS destroy," +
  70 + "r.versions AS versions," +
  71 + "r.descriptions AS descriptions, r.is_roade_speed AS isRoadeSpeed" +
  72 + " FROM bsth_c_sectionroute_cache r where r.line = ?1 and r.directions = ?2 and r.destroy=0 ) a " +
  73 + " LEFT JOIN bsth_c_section b ON a.sectionrouteSection = b.id order by a.sectionrouteCode asc", nativeQuery=true)
  74 + List<Object[]> getSectionRouteCache(int lineId, int directions);
  75 +
  76 +
  77 + /**
  78 + * @Description :TODO(查询路段信息)
  79 + *
  80 + * @param map <id:路段路由ID>
  81 + *
  82 + * @return List<Object[]>
  83 + */
  84 + @Query(value ="SELECT a.sectionRouteId," +
  85 + "a.sectionRouteLineCode," +
  86 + "a.sectionRouteCode," +
  87 + "a.sectionRouteDirections," +
  88 + "a.sectionRouteLine," +
  89 + "a.sectionRouteSection," +
  90 + "a.sectionRouteDescriptions," +
  91 + "a.sectionRouteCreateBy," +
  92 + "a.sectionRouteCreateDate," +
  93 + "a.sectionRouteUpdateBy," +
  94 + "a.sectionRouteUpdateDate," +
  95 + "a.sectionRouteVersions," +
  96 + "a.sectionRouteDestroy," +
  97 + "b.id AS sectionId," +
  98 + "b.section_code AS sectionCode," +
  99 + "b.section_name AS sectionName," +
  100 + "b.road_coding AS sectionRoadCoding," +
  101 + "b.end_node AS sectionEndCode," +
  102 + "b.start_node AS sectionStartNode," +
  103 + "b.middle_node AS sectionMiddleNode," +
  104 + "b.section_type AS sectionType," +
  105 + "ST_AsText(b.csection_vector) AS sectionCsectionVector," +
  106 + "ST_AsText(b.bsection_vector) AS sectionBsectionVector," +
  107 + "ST_AsText(b.gsection_vector) AS sectionGsectionVector," +
  108 + "b.section_distance AS sectionDistance," +
  109 + "b.section_time AS sectionTime," +
  110 + "b.db_type AS sectionDbtype," +
  111 + "b.speed_limit AS sectionSpeedLimit," +
  112 + "b.descriptions AS sectionDescriptions," +
  113 + "b.create_by AS sectionCreateBy," +
  114 + "b.create_date AS sectionCreateDate," +
  115 + "b.update_by AS sectionUpdateBy," +
  116 + "b.update_date AS sectionUpdateDate," +
  117 + "b.versions AS sectionVersion , a.isRoadeSpeed FROM (" +
  118 + " SELECT s.id AS sectionRouteId," +
  119 + "s.line_code AS sectionRouteLineCode," +
  120 + "s.sectionroute_code AS sectionRouteCode," +
  121 + "s.directions AS sectionRouteDirections," +
  122 + "s.line AS sectionRouteLine," +
  123 + "s.section AS sectionRouteSection," +
  124 + "s.descriptions AS sectionRouteDescriptions," +
  125 + "s.create_by AS sectionRouteCreateBy," +
  126 + "s.create_date AS sectionRouteCreateDate," +
  127 + "s.update_by AS sectionRouteUpdateBy," +
  128 + "s.update_date AS sectionRouteUpdateDate," +
  129 + "s.versions AS sectionRouteVersions," +
  130 + "s.destroy AS sectionRouteDestroy, s.is_roade_speed AS isRoadeSpeed " +
  131 + " FROM bsth_c_sectionroute s where s.id =?1) a " +
  132 + " LEFT JOIN bsth_c_section b on a.sectionRouteSection = b.id", nativeQuery=true)
  133 + List<Object[]> findSectionRouteInfoFormId(int id);
  134 +
  135 + /**
  136 + * 更新路线删除线路缓存路段
  137 + *
  138 + * @param line
  139 + * @param dir
  140 + */
  141 + @Modifying
  142 + @Query(value="delete from bsth_c_sectionroute_cache where line = ?1 and directions = ?2", nativeQuery=true)
  143 + public void sectionRouteCacheDel(Integer line,Integer dir);
  144 +}
... ...
src/main/java/com/bsth/repository/SectionRouteRepository.java
... ... @@ -177,7 +177,17 @@ public interface SectionRouteRepository extends BaseRepository&lt;SectionRoute, Int
177 177  
178 178 @Modifying
179 179 @Query(value="UPDATE bsth_c_sectionroute set destroy = 1 where id = ?1", nativeQuery=true)
180   - public void sectionRouteIsDestroyUpdBatch(Integer ids);
  180 + public void sectionRouteIsDestroyUpdBatch(Integer id);
  181 +
  182 + /**
  183 + * 更新路线前撤销线路原有路段
  184 + *
  185 + * @param line
  186 + * @param dir
  187 + */
  188 + @Modifying
  189 + @Query(value="UPDATE bsth_c_sectionroute set destroy = 1 where line = ?1 and directions = ?2", nativeQuery=true)
  190 + public void sectionRouteUpdDestroy(Integer line,Integer dir);
181 191  
182 192 @Modifying
183 193 @Query(value="update bsth_c_sectionroute set directions = case directions when 1 then 0 when 0 then 1 end where line_code = ?1 ", nativeQuery=true)
... ...
src/main/java/com/bsth/repository/StationRepository.java
... ... @@ -40,17 +40,10 @@ public interface StationRepository extends BaseRepository&lt;Station, Integer&gt; {
40 40 /*@Query(value = "SELECT s.b_jwpoints,s.id FROM bsth_c_station s where s.station_name like ?1"
41 41 , nativeQuery=true)
42 42 List<Object[]> findStationName(String stationName);*/
43   - /*@Query(value = " SELECT t.b_jwpoints,t.id FROM (" +
44   - " SELECT b.id,b.b_jwpoints,b.station_name,a.directions FROM (" +
45   - " SELECT s.station,s.station_name,s.directions FROM bsth_c_stationroute s where s.destroy = 0 and s.directions = ?1) a " +
46   - " LEFT JOIN bsth_c_station b on a.station = b. id) t where t.station_name LIKE ?2"
47   - , nativeQuery=true)*/
48 43 @Query(value = " SELECT t.b_jwpoints,t.id FROM (" +
49 44 " SELECT b.id,b.b_jwpoints,b.station_name,a.directions FROM (" +
50 45 " SELECT s.station,s.station_name,s.directions FROM bsth_c_stationroute s where s.destroy = 0 and s.directions = ?1) a " +
51   - " LEFT JOIN " +
52   - " (SELECT r.id,r.b_jwpoints,r.station_name from bsth_c_station r where r.destroy = 0 and r.station_name LIKE ?2 ) " +
53   - " b on a.station = b. id) t where t.station_name LIKE ?2 "
  46 + " LEFT JOIN bsth_c_station b on a.station = b. id) t where t.station_name LIKE ?2"
54 47 , nativeQuery=true)
55 48 List<Object[]> findStationName(Integer dir , String stationName);
56 49  
... ... @@ -108,24 +101,18 @@ public interface StationRepository extends BaseRepository&lt;Station, Integer&gt; {
108 101 "y = ?9 , " +
109 102 "b_polygon_grid = ST_GeomFromText(?10) , " +
110 103 "g_polygon_grid = ST_GeomFromText(?11) , " +
111   - /*"destroy = ?12 , " +*/
112   - "radius = ?12 , " +
113   - "shapes_type = ?13 , " +
114   - "versions = ?14 , " +
115   - "descriptions = ?15 " +
116   - " WHERE id = ?16 ", nativeQuery=true)
  104 + "destroy = ?12 , " +
  105 + "radius = ?13 , " +
  106 + "shapes_type = ?14 , " +
  107 + "versions = ?15 , " +
  108 + "descriptions = ?16 " +
  109 + " WHERE id = ?17 ", nativeQuery=true)
117 110 public void stationUpdate(String stationCod,String stationName,String roadCoding,String dbType,String bJwpoints,
118   -
119   - Float gLonx,Float gLaty,Float x,Float y, String bPolygonGrid,String gPolygonGrid,
120   -
121   - Integer radius,String shapesType, Integer versions,String descriptions,Integer stationId);
122   -
123   - /*public void stationUpdate(String stationCod,String stationName,String roadCoding,String dbType,String bJwpoints,
124 111  
125 112 Float gLonx,Float gLaty,Float x,Float y, String bPolygonGrid,String gPolygonGrid,
126 113  
127 114 Integer destroy, Integer radius,String shapesType, Integer versions,String descriptions,Integer stationId);
128   - */
  115 +
129 116  
130 117 @Query(value = "select st_astext(g_polygon_grid) as g_polygon_grid, shapes_type,concat(g_lonx, ' ', g_laty) as g_center_point ,radius, station_cod,station_name from bsth_c_station where station_cod=?1", nativeQuery = true)
131 118 public Object[][] bufferAera(String stationCode);
... ...
src/main/java/com/bsth/repository/StationRouteCacheRepository.java 0 → 100644
  1 +package com.bsth.repository;
  2 +
  3 +import java.util.List;
  4 +import java.util.Map;
  5 +
  6 +import org.springframework.data.domain.Page;
  7 +import org.springframework.data.domain.Pageable;
  8 +import org.springframework.data.domain.Sort;
  9 +import org.springframework.data.jpa.domain.Specification;
  10 +import org.springframework.data.jpa.repository.EntityGraph;
  11 +import org.springframework.data.jpa.repository.Modifying;
  12 +import org.springframework.data.jpa.repository.Query;
  13 +import org.springframework.stereotype.Repository;
  14 +import org.springframework.transaction.annotation.Transactional;
  15 +
  16 +import com.bsth.entity.Line;
  17 +import com.bsth.entity.StationRoute;
  18 +import com.bsth.entity.StationRouteCache;
  19 +
  20 +/**
  21 + *
  22 + * @Interface: StationRouteRepository(站点路由Repository数据持久层接口)
  23 + *
  24 + * @Extends : BaseRepository
  25 + *
  26 + * @Description: TODO(站点路由Repository数据持久层接口)
  27 + *
  28 + * @Author bsth@lq
  29 + *
  30 + * @Date 2016年5月03日 上午9:21:17
  31 + *
  32 + * @Version 公交调度系统BS版 0.1
  33 + *
  34 + */
  35 +
  36 +@Repository
  37 +public interface StationRouteCacheRepository extends BaseRepository<StationRouteCache, Integer> {
  38 +
  39 + /**
  40 + * @Description :TODO(站点中心点坐标查询)
  41 + *
  42 + * @param map <lineId:线路ID; direction:方向>
  43 + *
  44 + * @return List<Object[]>
  45 + */
  46 + /*@Query(value = "SELECT s.b_jwpoints,s.station_name FROM (" +
  47 + "SELECT b.station FROM bsth_c_stationroute b where b.line =?1 and b.directions = ?2 and b.destroy=0) r " +
  48 + "LEFT JOIN bsth_c_station s on r.station = s.id", nativeQuery=true)*/
  49 + @Query(value = "SELECT s.b_jwpoints,r.station_name,r.station_route_code FROM (" +
  50 + "SELECT b.station,b.station_route_code,b.station_name FROM bsth_c_stationroute_cache b where b.line =?1 and b.directions = ?2 and b.destroy=0) r " +
  51 + "LEFT JOIN bsth_c_station s on r.station = s.id order by r.station_route_code asc", nativeQuery=true)
  52 + List<Object[]> getSelectStationRouteCenterPoints(Integer lineId,Integer direction);
  53 +
  54 + /**
  55 + * 查询站点路由
  56 + */
  57 + @Query("select r from StationRouteCache r where r.lineCode=?1 and r.directions=?2 and r.destroy=0 order by r.stationRouteCode")
  58 + public List<StationRouteCache> findstationRoute(String lineCode,Integer dir);
  59 +
  60 + /**
  61 + * 更新路线删除线路缓存站点
  62 + *
  63 + * @param line
  64 + * @param dir
  65 + */
  66 + @Modifying
  67 + @Query(value="delete from bsth_c_stationroute_cache where line = ?1 and directions = ?2 ", nativeQuery=true)
  68 + public void stationRouteCacheDel(Integer line,Integer dir);
  69 +
  70 +}
... ...
src/main/java/com/bsth/repository/StationRouteRepository.java
... ... @@ -266,6 +266,7 @@ public interface StationRouteRepository extends BaseRepository&lt;StationRoute, Int
266 266 "StationRoute s " +
267 267 "WHERE " +
268 268 "s.destroy = 0 " +
  269 + "and s.lineCode in(select lineCode from Line where inUse = 1) " +
269 270 "ORDER BY " +
270 271 "lineCode,directions,stationRouteCode")
271 272 List<Map<String, String>> findAllLineWithYgc();
... ... @@ -282,7 +283,27 @@ public interface StationRouteRepository extends BaseRepository&lt;StationRoute, Int
282 283 @Query(value="UPDATE bsth_c_stationroute set station_route_code = (station_route_code+10) where line = ?1 and directions = ?2 and station_route_code >=?3 and destroy = 0", nativeQuery=true)
283 284 public void stationUpdStationRouteCode(Integer line,Integer dir,Integer routeCod);
284 285  
  286 + /**
  287 + * 更新路线前撤销线路原有站点
  288 + *
  289 + * @param line
  290 + * @param dir
  291 + */
  292 + @Modifying
  293 + @Query(value="UPDATE bsth_c_stationroute set destroy = 1 where line = ?1 and directions = ?2", nativeQuery=true)
  294 + public void stationRouteUpdDestroy(Integer line,Integer dir);
  295 +
285 296 @Modifying
286 297 @Query(value="UPDATE bsth_c_stationroute set destroy = 1 where id = ?1", nativeQuery=true)
287 298 public void stationRouteIsDestroyUpdBatch(Integer ids);
  299 +
  300 + /**
  301 + * 更新路线前撤销线路原有站点
  302 + *
  303 + * @param line
  304 + * @param dir
  305 + */
  306 + @Modifying
  307 + @Query(value="insert into (select * from bsth_c_stationroute_cache where line = ?1 and directions = ?2) bsth_c_stationroute", nativeQuery=true)
  308 + public void stationRouteUpdate(Integer line,Integer dir);
288 309 }
... ...
src/main/java/com/bsth/repository/realcontrol/ScheduleRealInfoRepository.java
... ... @@ -147,16 +147,20 @@ public interface ScheduleRealInfoRepository extends BaseRepository&lt;ScheduleRealI
147 147 List<ScheduleRealInfo> scheduleByDateAndLineQp(String line,String date);
148 148  
149 149 @EntityGraph(value = "scheduleRealInfo_cTasks", type = EntityGraph.EntityGraphType.FETCH)
  150 + @Query(value="select DISTINCT s from ScheduleRealInfo s where gsBm like %?1% and fgsBm like %?2% and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?3 and s.bcType not in ('in','out','ldks') order by s.xlDir,s.realExecDate,s.dfsj, (s.lpName+1)")
  151 + List<ScheduleRealInfo> scheduleByDateAndLineByGs(String gsdm,String fgsdm,String date);
  152 +
  153 + @EntityGraph(value = "scheduleRealInfo_cTasks", type = EntityGraph.EntityGraphType.FETCH)
150 154 @Query(value="select DISTINCT s from ScheduleRealInfo s where s.xlBm = ?1 and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2 order by s.xlDir,s.realExecDate,s.dfsj, (s.lpName+1)")
151 155 List<ScheduleRealInfo> scheduleByDateAndLineQp2(String line,String date);
152 156  
153 157 @EntityGraph(value = "scheduleRealInfo_cTasks", type = EntityGraph.EntityGraphType.FETCH)
154   - @Query(value="select DISTINCT s from ScheduleRealInfo s where s.xlBm = ?1 and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2 and s.bcType not in ('in','out') order by s.xlBm,s.adjustExps,s.fcsj")
  158 + @Query(value="select DISTINCT s from ScheduleRealInfo s where s.xlBm = ?1 and DATE_FORMAT(s.scheduleDate,'%Y-%m-%d') = ?2 and s.bcType not in ('in','out','ldks') order by s.xlBm,s.adjustExps,s.fcsj")
155 159 List<ScheduleRealInfo> scheduleByDateAndLine2(String line,String date);
156 160  
157 161 //按月统计
158 162 @EntityGraph(value = "scheduleRealInfo_cTasks", type = EntityGraph.EntityGraphType.FETCH)
159   - @Query(value="select DISTINCT s from ScheduleRealInfo s where s.xlBm like %?1% and DATE_FORMAT(s.scheduleDate,'%Y-%m') = ?2 and s.bcType not in ('in','out') order by s.xlBm")
  163 + @Query(value="select DISTINCT s from ScheduleRealInfo s where s.xlBm like %?1% and DATE_FORMAT(s.scheduleDate,'%Y-%m') = ?2 and s.bcType not in ('in','out','ldks') order by s.xlBm")
160 164 List<ScheduleRealInfo> scheduleByDateAndLine3(String line,String date);
161 165  
162 166 //按照时间段统计
... ...
src/main/java/com/bsth/service/SectionRouteService.java
... ... @@ -32,6 +32,8 @@ public interface SectionRouteService extends BaseService&lt;SectionRoute, Integer&gt;
32 32  
33 33 List<Map<String, Object>> getSectionRoute(Map<String, Object> map);
34 34  
  35 + List<Map<String, Object>> getSectionRouteCache(Map<String, Object> map);
  36 +
35 37 /**
36 38 * @Description : TODO(根据路段路由Id批量撤销路段)
37 39 *
... ... @@ -60,4 +62,5 @@ public interface SectionRouteService extends BaseService&lt;SectionRoute, Integer&gt;
60 62 List<Map<String, Object>> findUpSectionRouteCode(Map<String, Object> map);
61 63  
62 64 Map<String, Object> quoteSection(Map<String, Object> map);
  65 +
63 66 }
... ...
src/main/java/com/bsth/service/SectionService.java
... ... @@ -31,4 +31,8 @@ public interface SectionService extends BaseService&lt;Section, Integer&gt; {
31 31 Map<String, Object> sectionUpdate(Map<String, Object> map);
32 32  
33 33 Map<String, Object> sectionSave(Map<String, Object> map);
  34 +
  35 + Map<String, Object> sectionCut(Map<String, Object> map);
  36 +
  37 + Map<String, Object> sectionCacheUpdate(Map<String, Object> map);
34 38 }
... ...
src/main/java/com/bsth/service/StationRouteService.java
... ... @@ -77,6 +77,9 @@ public interface StationRouteService extends BaseService&lt;StationRoute, Integer&gt;
77 77 */
78 78 Map<String, Object> stationRouteIsDestroy(Map<String, Object> map);
79 79  
  80 +
  81 + List<Map<String, Object>> getStationRouteCacheCenterPoints(Map<String, Object> map);
  82 +
80 83 /**
81 84 * @Description : TODO(根据线路ID生成行单)
82 85 *
... ... @@ -102,4 +105,5 @@ public interface StationRouteService extends BaseService&lt;StationRoute, Integer&gt;
102 105  
103 106 Map<String, Object> upddis(Map<String, Object> map);
104 107  
  108 +
105 109 }
... ...
src/main/java/com/bsth/service/StationService.java
... ... @@ -69,4 +69,17 @@ public interface StationService extends BaseService&lt;Station, Integer&gt; {
69 69 */
70 70 Map<String, Object> stationUpdate(Map<String, Object> map);
71 71  
  72 + /**
  73 + * @Description :TODO(根据坐标点匹配数据库中的站点)
  74 + *
  75 + * @param map: <point:坐标点; name:站点名>
  76 + *
  77 + */
  78 + Map<String, Object> matchStation(Map<String, Object> map);
  79 +
  80 + /**
  81 + * 上传的GPS点生成的路线保存在缓存表
  82 + */
  83 + Map<String, Object> cacheSave(Map<String, Object> map);
  84 +
72 85 }
... ...
src/main/java/com/bsth/service/impl/SectionRouteServiceImpl.java
... ... @@ -22,6 +22,7 @@ import com.bsth.entity.SectionRoute;
22 22 import com.bsth.entity.search.CustomerSpecs;
23 23 import com.bsth.repository.LineRepository;
24 24 import com.bsth.repository.SectionRepository;
  25 +import com.bsth.repository.SectionRouteCacheRepository;
25 26 import com.bsth.repository.SectionRouteRepository;
26 27 import com.bsth.service.SectionRouteService;
27 28 import com.bsth.util.GetUIDAndCode;
... ... @@ -49,6 +50,9 @@ public class SectionRouteServiceImpl extends BaseServiceImpl&lt;SectionRoute, Integ
49 50 SectionRouteRepository repository;
50 51  
51 52 @Autowired
  53 + SectionRouteCacheRepository Cacherepository;
  54 +
  55 + @Autowired
52 56 SectionRepository repository2;
53 57  
54 58 @Autowired
... ... @@ -117,7 +121,55 @@ public class SectionRouteServiceImpl extends BaseServiceImpl&lt;SectionRoute, Integ
117 121 return resultList;
118 122 }
119 123  
120   -
  124 + /**
  125 + * @Description :TODO(查询路段信息)
  126 + *
  127 + * @param map <line.id_eq:线路ID; directions_eq:方向>
  128 + *
  129 + * @return Map<String, Object>
  130 + */
  131 + @Transactional
  132 + @Override
  133 + public List<Map<String, Object>> getSectionRouteCache(Map<String, Object> map) {
  134 + int lineId = map.get("line.id_eq").equals("") ? 0 : Integer.parseInt(map.get("line.id_eq").toString());
  135 + int directions = map.get("directions_eq").equals("") ? 0 : Integer.parseInt(map.get("directions_eq").toString());
  136 + List<Object[]> listObjArray = Cacherepository.getSectionRouteCache(lineId, directions);
  137 + List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
  138 + if(listObjArray.size()>0) {
  139 + for(int i = 0 ; i<listObjArray.size() ; i++){
  140 + Map<String, Object> tempM = new HashMap<String, Object>();
  141 + tempM.put("sectionrouteId",listObjArray.get(i)[0]);
  142 + tempM.put("sectionrouteLine",listObjArray.get(i)[1]);
  143 + tempM.put("sectionrouteLineCode",listObjArray.get(i)[2]);
  144 + tempM.put("sectionrouteSection",listObjArray.get(i)[3]);
  145 + tempM.put("sectionrouteSectionCode",listObjArray.get(i)[4]);
  146 + tempM.put("sectionrouteCode",listObjArray.get(i)[5]);
  147 + tempM.put("sectionrouteDirections",listObjArray.get(i)[6]);
  148 + tempM.put("sectionId",listObjArray.get(i)[7]);
  149 + tempM.put("sectionCode",listObjArray.get(i)[8]);
  150 + tempM.put("sectionName",listObjArray.get(i)[9]);
  151 + tempM.put("sectionCrosesRoad",listObjArray.get(i)[10]);
  152 + tempM.put("sectionEndNode",listObjArray.get(i)[11]);
  153 + tempM.put("sectionStartNode",listObjArray.get(i)[12]);
  154 + tempM.put("sectionMiddleNode",listObjArray.get(i)[13]);
  155 + tempM.put("sectionType",listObjArray.get(i)[14]);
  156 + tempM.put("sectionCsectionVector",listObjArray.get(i)[15]);
  157 + tempM.put("sectionBsectionVector",listObjArray.get(i)[16]);
  158 + tempM.put("sectionGsectionVector",listObjArray.get(i)[17]);
  159 + tempM.put("sectionRoadCoding",listObjArray.get(i)[18]);
  160 + tempM.put("sectionDistance",listObjArray.get(i)[19]);
  161 + tempM.put("sectionTime",listObjArray.get(i)[20]);
  162 + tempM.put("sectiondbType",listObjArray.get(i)[21]);
  163 + tempM.put("sectionSpeedLimet",listObjArray.get(i)[22]);
  164 + tempM.put("destroy",listObjArray.get(i)[23]);
  165 + tempM.put("versions",listObjArray.get(i)[24]);
  166 + tempM.put("descriptions",listObjArray.get(i)[25]);
  167 + tempM.put("isRoadeSpeed",listObjArray.get(i)[26]);
  168 + resultList.add(tempM);
  169 + }
  170 + }
  171 + return resultList;
  172 + }
121 173  
122 174  
123 175 /**
... ... @@ -239,7 +291,6 @@ public class SectionRouteServiceImpl extends BaseServiceImpl&lt;SectionRoute, Integ
239 291 if(reslutList.get(0)!=null) {
240 292 for(int i = 0 ; i <reslutList.size() ;i++){
241 293 Map<String, Object> tempM = new HashMap<String, Object>();
242   - System.out.println(reslutList.get(i));
243 294 tempM.put("sectionrouteCode", reslutList.get(i));
244 295 list.add(tempM);
245 296 }
... ... @@ -325,13 +376,7 @@ public class SectionRouteServiceImpl extends BaseServiceImpl&lt;SectionRoute, Integ
325 376 //int i = 0;
326 377 String[] idsStr = map.get("ids").toString().split(",") ;
327 378 for (String id : idsStr) {
328   - /* entityManager.persist(Integer.parseInt(id));*/
329 379 repository.sectionRouteIsDestroyUpdBatch(Integer.parseInt(id));
330   -/* i++;
331   - if (i % batchSize == 0) {
332   - entityManager.flush();
333   - entityManager.clear();
334   - }*/
335 380 }
336 381 resultMap.put("status", ResponseCode.SUCCESS);
337 382 } catch (Exception e) {
... ...
src/main/java/com/bsth/service/impl/SectionServiceImpl.java
1 1 package com.bsth.service.impl;
2 2  
3 3 import java.text.SimpleDateFormat;
  4 +import java.util.ArrayList;
4 5 import java.util.Date;
5 6 import java.util.HashMap;
  7 +import java.util.List;
6 8 import java.util.Map;
7 9  
  10 +import org.mozilla.javascript.ObjArray;
8 11 import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.data.jpa.domain.Specification;
9 13 import org.springframework.stereotype.Service;
10 14 import org.springframework.transaction.annotation.Transactional;
11 15  
12 16 import com.alibaba.fastjson.JSONArray;
  17 +import com.alibaba.fastjson.JSONObject;
13 18 import com.bsth.common.ResponseCode;
14 19 import com.bsth.entity.Line;
15 20 import com.bsth.entity.Section;
16 21 import com.bsth.entity.SectionRoute;
  22 +import com.bsth.entity.SectionRouteCache;
  23 +import com.bsth.entity.StationRoute;
  24 +import com.bsth.entity.StationRouteCache;
17 25 import com.bsth.repository.LineRepository;
18 26 import com.bsth.repository.SectionRepository;
  27 +import com.bsth.repository.SectionRouteCacheRepository;
19 28 import com.bsth.repository.SectionRouteRepository;
  29 +import com.bsth.repository.StationRouteCacheRepository;
  30 +import com.bsth.repository.StationRouteRepository;
20 31 import com.bsth.service.SectionService;
  32 +import com.bsth.util.GetUIDAndCode;
21 33 import com.bsth.util.TransGPS;
22 34 import com.bsth.util.TransGPS.Location;
  35 +import com.bsth.util.Geo.GeoUtils;
  36 +import com.bsth.util.Geo.Point;
  37 +import com.google.gson.JsonObject;
23 38  
24 39 /**
25 40 *
... ... @@ -49,6 +64,265 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
49 64 @Autowired
50 65 SectionRouteRepository routeRepository;
51 66  
  67 + @Autowired
  68 + SectionRouteCacheRepository routeCacheRepository;
  69 +
  70 + @Autowired
  71 + StationRouteRepository stationRouteRepository;
  72 +
  73 + @Autowired
  74 + StationRouteCacheRepository stationRouteCacheRepository;
  75 +
  76 + /**
  77 + * @Description :TODO(生成新的线路走向)
  78 + *
  79 + * @param map <sectionId:路段ID; sectionJSON:路段信息>
  80 + *
  81 + * @return Map<String, Object> <SUCCESS ; ERROR>
  82 + */
  83 + @Override
  84 + @Transactional
  85 + public Map<String, Object> sectionCut(Map<String, Object> map) {
  86 + Map<String, Object> resultMap = new HashMap<String, Object>();
  87 + try {
  88 + // 路段点List
  89 + List<Point> bPointsList = new ArrayList<>();
  90 + // 截取路段点List
  91 + List<Point> bPointsCutList = new ArrayList<>();
  92 + // 截取后的路段
  93 + List<Map<String, String>> sectionArrayList = new ArrayList<>();
  94 + String bsectionVector = map.get("sectionBsectionVector").equals("") ? "" :map.get("sectionBsectionVector").toString();
  95 + String bsectionVectorCutList = map.get("cutSectionList").equals("") ? "" :map.get("cutSectionList").toString();
  96 + if(!bsectionVector.equals("")) {
  97 + // 转换成JSON数组
  98 + JSONArray sectionsArray = JSONArray.parseArray(bsectionVector);
  99 + // 遍历
  100 + for(int s = 0 ;s<sectionsArray.size();s++) {
  101 + String pointsLngStr = sectionsArray.getJSONObject(s).get("lng").toString();
  102 + String pointsLatStr = sectionsArray.getJSONObject(s).get("lat").toString();
  103 + bPointsList.add(new Point(Double.parseDouble(pointsLngStr), Double.parseDouble(pointsLatStr)));
  104 + }
  105 + }
  106 + if(!bsectionVectorCutList.equals("")) {
  107 + // 转换成JSON数组
  108 + JSONArray sectionsArrayList = JSONArray.parseArray(bsectionVectorCutList);
  109 + // 截取路段在总路段中的下表
  110 + int firstTemp = 0;
  111 + int lastTemp = 0;
  112 + // 每个截取的路段去总路段中获取
  113 + for (int i = 0; i < sectionsArrayList.size(); i++) {
  114 + // 切点列表
  115 + JSONObject sectionsArray = sectionsArrayList.getJSONObject(i);
  116 + String sectionName = sectionsArray.get("name").toString();
  117 + JSONArray sectionPoints = sectionsArray.getJSONArray("section");
  118 + // 用两个坐标点去截取总路段
  119 + if (i == 0) {
  120 + for(int s = 0 ;s<sectionPoints.size();s++) {
  121 + String bpointsLngStr = sectionPoints.getJSONObject(s).get("lng").toString();
  122 + String bpointsLatStr = sectionPoints.getJSONObject(s).get("lat").toString();
  123 + Point bPointcut = new Point(Double.parseDouble(bpointsLngStr), Double.parseDouble(bpointsLatStr));
  124 + double distance = 0;
  125 + // 寻找最近点
  126 + for (int index = firstTemp; index < bPointsList.size(); index++) {
  127 + if (index == firstTemp) {
  128 + distance = GeoUtils.getDistance(bPointcut,bPointsList.get(index));
  129 + } else {
  130 + double distanceTemp = GeoUtils.getDistance(bPointcut,bPointsList.get(index));
  131 + if(distance > distanceTemp) {
  132 + distance = distanceTemp;
  133 + lastTemp = index;
  134 + }
  135 + }
  136 + }
  137 + if (s == 0) {
  138 + // 第一个点作为路段的起点
  139 + firstTemp = lastTemp;
  140 + }
  141 + // 用切点替换最近点
  142 + if(lastTemp == firstTemp) {
  143 + bPointsList.add(++lastTemp, bPointcut);
  144 + } else {
  145 + bPointsList.set(lastTemp, bPointcut);
  146 + }
  147 + }
  148 + } else {
  149 + String bpointsLngStr = sectionPoints.getJSONObject(1).get("lng").toString();
  150 + String bpointsLatStr = sectionPoints.getJSONObject(1).get("lat").toString();
  151 + Point bPointcut = new Point(Double.parseDouble(bpointsLngStr), Double.parseDouble(bpointsLatStr));
  152 + double distance = 0;
  153 + // 寻找最近点
  154 + for (int index = firstTemp; index < bPointsList.size(); index++) {
  155 + if (index == firstTemp) {
  156 + distance = GeoUtils.getDistance(bPointcut,bPointsList.get(index));
  157 + } else {
  158 + double distanceTemp = GeoUtils.getDistance(bPointcut,bPointsList.get(index));
  159 + if(distance > distanceTemp) {
  160 + distance = distanceTemp;
  161 + lastTemp = index;
  162 + }
  163 + }
  164 + }
  165 + // 用切点替换最近点
  166 + if(lastTemp == firstTemp) {
  167 + bPointsList.add(++lastTemp, bPointcut);
  168 + } else {
  169 + bPointsList.set(lastTemp, bPointcut);
  170 + }
  171 + }
  172 + // 切路段
  173 + if (sectionName != "" && sectionName != null ) {
  174 + // 原始线状图形坐标集合
  175 + String sectionsBpoints = "";
  176 + // WGS线状图形坐标集合
  177 + String sectionsWJPpoints = "";
  178 + for (int j = firstTemp; j <= lastTemp; j++) {
  179 + Point point = bPointsList.get(j);
  180 + String pointsLngStr = String.valueOf(point.getLon());
  181 + String pointsLatStr = String.valueOf(point.getLat());
  182 + /** to WGS坐标 */
  183 + Location resultPoint = FromBDPointToWGSPoint(pointsLngStr,pointsLatStr);
  184 + String WGSLngStr = String.valueOf(resultPoint.getLng());
  185 + String WGSLatStr = String.valueOf(resultPoint.getLat());
  186 + if(j == firstTemp) {
  187 + sectionsBpoints = pointsLngStr + " " + pointsLatStr;
  188 + sectionsWJPpoints = WGSLngStr + " " + WGSLatStr;
  189 + }else {
  190 + sectionsBpoints = sectionsBpoints + "," + pointsLngStr + " " + pointsLatStr;
  191 + sectionsWJPpoints = sectionsWJPpoints + "," + WGSLngStr + " " + WGSLatStr;
  192 + }
  193 + }
  194 + Map<String, String> sectionCutMap = new HashMap<String, String>();
  195 + sectionCutMap.put("sectionName", sectionName);
  196 + sectionCutMap.put("sectionsBpoints", sectionsBpoints);
  197 + sectionCutMap.put("sectionsWJPpoints", sectionsWJPpoints);
  198 + sectionArrayList.add(sectionCutMap);
  199 + }
  200 + // 上一个路段的终点作为下一个路段的起点
  201 + firstTemp = lastTemp;
  202 + }
  203 + }
  204 +
  205 + // 原坐标类型
  206 + String dbType = map.get("sectiondbType").equals("") ? "" : map.get("sectiondbType").toString();
  207 + // 说明
  208 + String descriptions = map.get("descriptions").equals("") ? "" : map.get("descriptions").toString();
  209 + // 是否撤销
  210 + Integer destroy = map.get("destroy").equals("") ? null : Integer.parseInt(map.get("destroy").toString());
  211 + // 方向
  212 + Integer directions = map.get("sectionrouteDirections").equals("") ? null : Integer.parseInt(map.get("sectionrouteDirections").toString());
  213 + // 线路ID
  214 + Integer sectionRouteLine = map.get("sectionrouteLine").equals("") ? null : Integer.parseInt(map.get("sectionrouteLine").toString());
  215 + // 道路编码
  216 + String roadCoding = map.get("sectionRoadCoding").equals("") ? "" : map.get("sectionRoadCoding").toString();
  217 + // 路段长度
  218 + Double sectionDistance = 0.0;
  219 + // 路段路由Id
  220 + Integer sectionRouteId = map.get("sectionrouteId").equals("") ? null : Integer.valueOf(map.get("sectionrouteId").toString());
  221 + // 线路编码
  222 + String lineCode =map.get("sectionrouteLineCode").equals("") ? "" : map.get("sectionrouteLineCode").toString();
  223 + // 路段时长
  224 + Double sectionTime = 0.0;
  225 + // 路段路由
  226 + Integer sectionrouteCode = map.get("sectionrouteCode").equals("") ? null : Integer.valueOf(map.get("sectionrouteCode").toString());
  227 + // 限速
  228 + Double speedLimit = map.get("sectionSpeedLimet").equals("") ? null : Double.valueOf(map.get("sectionSpeedLimet").toString());
  229 + // 版本
  230 + Integer version = map.get("versions").equals("") ? null : Integer.valueOf(map.get("versions").toString());
  231 +
  232 + Integer createBy = map.get("createBy").equals("") ? null : Integer.valueOf(map.get("createBy").toString());
  233 + String createDate = map.get("createDate").equals("") ? null : map.get("createDate").toString();
  234 + Integer updateBy = map.get("updateBy").equals("") ?null : Integer.valueOf(map.get("updateBy").toString());
  235 + Integer isRoadeSpeed = map.get("isRoadeSpeed").equals("") ? null : Integer.valueOf(map.get("isRoadeSpeed").toString());
  236 + SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
  237 + Date date = new Date();
  238 + // 修改日期
  239 + String updateDate = formatter.format(date);
  240 + String crosesRoad="";
  241 + String endNode="";
  242 + String startNode="";
  243 + String middleNode="";
  244 + String sectionType="";
  245 + String csectionVector="";
  246 + // 撤销原有路段
  247 + routeRepository.sectionRouteUpdDestroy(Integer.parseInt(lineCode),directions);
  248 + // 路段保存
  249 + for (int i = 0; i < sectionArrayList.size(); i++) {
  250 + long sectionMaxId = GetUIDAndCode.getSectionId();
  251 + // 路段编码
  252 + String sectionCode = String.valueOf(sectionMaxId);
  253 + // 路段ID
  254 + int sectionId = (int)sectionMaxId;
  255 + String sectionName = sectionArrayList.get(i).get("sectionName").toString();
  256 + String sectionsBpoints = sectionArrayList.get(i).get("sectionsBpoints").toString();
  257 + String sectionsWJPpoints = sectionArrayList.get(i).get("sectionsWJPpoints").toString();
  258 + // WGS坐标点集合
  259 + String gsectionVector = null;
  260 + if(!sectionsWJPpoints.equals(""))
  261 + gsectionVector = "LINESTRING(" + sectionsWJPpoints +")";
  262 + // 原坐标点集合
  263 + String bsectionVectorS = null;
  264 + if(!sectionsBpoints.equals(""))
  265 + bsectionVectorS = "LINESTRING(" + sectionsBpoints + ")";
  266 + repository.systemSave(sectionCode, sectionName, crosesRoad, endNode, startNode, middleNode, gsectionVector, bsectionVectorS, sectionType, csectionVector, roadCoding, sectionDistance, sectionTime, dbType, speedLimit, descriptions, version, sectionId);
  267 + SectionRoute route = new SectionRoute();
  268 + Line line = lineRepository.findOne(sectionRouteLine);
  269 + Section section = repository.findOne(sectionId);
  270 + route.setSectionrouteCode(sectionrouteCode+i*100);
  271 + route.setLineCode(lineCode);
  272 + route.setSectionCode(sectionCode);
  273 + route.setDirections(directions);
  274 + route.setVersions(version);
  275 + route.setDestroy(destroy);
  276 + route.setDescriptions(descriptions);
  277 + route.setCreateBy(createBy);
  278 + route.setUpdateBy(updateBy);
  279 + route.setLine(line);
  280 + route.setSection(section);
  281 + route.setIsRoadeSpeed(isRoadeSpeed);
  282 + routeRepository.save(route);
  283 + }
  284 + // 删除缓存路段
  285 + routeCacheRepository.sectionRouteCacheDel(Integer.parseInt(lineCode),directions);
  286 + // 撤销原有站点
  287 + stationRouteRepository.stationRouteUpdDestroy(Integer.parseInt(lineCode),directions);
  288 + // 站点保存
  289 + List<StationRouteCache> stationRouteList = stationRouteCacheRepository.findstationRoute(lineCode,directions);
  290 + for(int i=0; i < stationRouteList.size(); i++) {
  291 + StationRouteCache stationRouteCache = stationRouteList.get(i);
  292 + StationRoute stationRoute = new StationRoute();
  293 + stationRoute.setLine(stationRouteCache.getLine());
  294 + stationRoute.setStation(stationRouteCache.getStation());
  295 + stationRoute.setStationName(stationRouteCache.getStationName());
  296 + stationRoute.setStationRouteCode(stationRouteCache.getStationRouteCode());
  297 + stationRoute.setLineCode(stationRouteCache.getLineCode());
  298 + stationRoute.setStationCode(stationRouteCache.getStationCode());
  299 + stationRoute.setStationMark(stationRouteCache.getStationMark());
  300 + stationRoute.setOutStationNmber(stationRouteCache.getOutStationNmber());
  301 + stationRoute.setDirections(stationRouteCache.getDirections());
  302 + stationRoute.setDistances(stationRouteCache.getDistances());
  303 + stationRoute.setToTime(stationRouteCache.getToTime());
  304 + stationRoute.setFirstTime(stationRouteCache.getFirstTime());
  305 + stationRoute.setEndTime(stationRouteCache.getEndTime());
  306 + stationRoute.setDescriptions(stationRouteCache.getDescriptions());
  307 + stationRoute.setDestroy(stationRouteCache.getDestroy());
  308 + stationRoute.setVersions(stationRouteCache.getVersions());
  309 + stationRoute.setCreateBy(stationRouteCache.getCreateBy());
  310 + stationRoute.setCreateDate(stationRouteCache.getCreateDate());
  311 + stationRoute.setUpdateBy(stationRouteCache.getCreateBy());
  312 + stationRoute.setUpdateDate(stationRouteCache.getUpdateDate());
  313 + stationRouteRepository.save(stationRoute);
  314 + }
  315 + // 删除缓存站点
  316 + stationRouteCacheRepository.stationRouteCacheDel(Integer.parseInt(lineCode),directions);
  317 +
  318 + resultMap.put("status", ResponseCode.SUCCESS);
  319 + } catch (Exception e) {
  320 + resultMap.put("status", ResponseCode.ERROR);
  321 + logger.error("save erro.", e);
  322 + }
  323 + return resultMap;
  324 + }
  325 +
52 326 /**
53 327 * @Description :TODO(编辑线路走向)
54 328 *
... ... @@ -177,6 +451,130 @@ public class SectionServiceImpl extends BaseServiceImpl&lt;Section, Integer&gt; implem
177 451 return resultMap;
178 452 }
179 453  
  454 + /**
  455 + * @Description :TODO(编辑缓存线路走向)
  456 + */
  457 + @Override
  458 + public Map<String, Object> sectionCacheUpdate(Map<String, Object> map) {
  459 + Map<String, Object> resultMap = new HashMap<String, Object>();
  460 + try {
  461 + String bsectionVector = map.get("bsectionVector").equals("") ? "" :map.get("bsectionVector").toString();
  462 + // 原始线状图形坐标集合
  463 + String sectionsBpoints = "";
  464 + // WGS线状图形坐标集合
  465 + String sectionsWJPpoints = "";
  466 + if(!bsectionVector.equals("")) {
  467 + // 转换成JSON数组
  468 + JSONArray sectionsArray = JSONArray.parseArray(bsectionVector);
  469 + // 遍历
  470 + for(int s = 0 ;s<sectionsArray.size();s++) {
  471 + String pointsLngStr = sectionsArray.getJSONObject(s).get("lng").toString();
  472 + String pointsLatStr = sectionsArray.getJSONObject(s).get("lat").toString();
  473 + /** to WGS坐标 */
  474 + Location resultPoint = FromBDPointToWGSPoint(pointsLngStr,pointsLatStr);
  475 + String WGSLngStr = String.valueOf(resultPoint.getLng());
  476 + String WGSLatStr = String.valueOf(resultPoint.getLat());
  477 + if(s==0) {
  478 + sectionsBpoints = pointsLngStr + " " + pointsLatStr;
  479 + sectionsWJPpoints = WGSLngStr + " " + WGSLatStr;
  480 + }else {
  481 + sectionsBpoints = sectionsBpoints + "," + pointsLngStr + " " + pointsLatStr;
  482 + sectionsWJPpoints = sectionsWJPpoints + "," + WGSLngStr + " " + WGSLatStr;
  483 + }
  484 + }
  485 + }
  486 + // 原坐标类型
  487 + String dbType = map.get("dbType").equals("") ? "" : map.get("dbType").toString();
  488 + // 说明
  489 + String descriptions = map.get("descriptions").equals("") ? "" : map.get("descriptions").toString();
  490 + // 是否撤销
  491 + Integer destroy = map.get("destroy").equals("") ? null : Integer.parseInt(map.get("destroy").toString());
  492 + // 方向
  493 + Integer directions = map.get("directions").equals("") ? null : Integer.parseInt(map.get("directions").toString());
  494 + // 线路ID
  495 + Integer sectionRouteLine = map.get("sectionRouteLine").equals("") ? null : Integer.parseInt(map.get("sectionRouteLine").toString());
  496 + // 道路编码
  497 + String roadCoding = map.get("roadCoding").equals("") ? "" : map.get("roadCoding").toString();
  498 + // 路段编码
  499 + String sectionCode = map.get("sectionCode").equals("") ? "" : map.get("sectionCode").toString();
  500 + // 路段长度
  501 + Double sectionDistance = map.get("sectionDistance").equals("") ? null : Double.valueOf(map.get("sectionDistance").toString());
  502 + // 路段ID
  503 + Integer sectionId = map.get("sectionId").equals("") ? 0 : Integer.parseInt(map.get("sectionId").toString());
  504 + // 路段名称
  505 + String sectionName = map.get("sectionName").equals("") ? "" : map.get("sectionName").toString();
  506 + // 路段路由Id
  507 + Integer sectionRouteId = map.get("sectionRouteId").equals("") ? null : Integer.valueOf(map.get("sectionRouteId").toString());
  508 + // 线路编码
  509 + String lineCode =map.get("lineCode").equals("") ? "" : map.get("lineCode").toString();
  510 + // 路段时长
  511 + Double sectionTime = map.get("sectionTime").equals("") ? null : Double.valueOf(map.get("sectionTime").toString());
  512 + // 路段路由
  513 + Integer sectionrouteCode = map.get("sectionrouteCode").equals("") ? null : Integer.valueOf(map.get("sectionrouteCode").toString());
  514 + SectionRouteCache resultS = routeCacheRepository.findOne(sectionRouteId);
  515 + int old_code = resultS.getSectionrouteCode();
  516 + if(sectionrouteCode!=null) {
  517 + int new_code = sectionrouteCode+100;
  518 + if(new_code==old_code){
  519 + sectionrouteCode = new_code;
  520 + }else {
  521 + sectionrouteCode = new_code-100+1;
  522 + }
  523 + }else {
  524 + sectionrouteCode = old_code;
  525 + }
  526 + // 限速
  527 + Double speedLimit = map.get("speedLimit").equals("") ? null : Double.valueOf(map.get("speedLimit").toString());
  528 + // 版本
  529 + Integer version = map.get("versions").equals("") ? null : Integer.valueOf(map.get("versions").toString());
  530 + // WGS坐标点集合
  531 + String gsectionVector = null;
  532 + if(!sectionsWJPpoints.equals(""))
  533 + gsectionVector = "LINESTRING(" + sectionsWJPpoints +")";
  534 + // 原坐标点集合
  535 + String bsectionVectorS = null;
  536 + if(!sectionsBpoints.equals(""))
  537 + bsectionVectorS = "LINESTRING(" + sectionsBpoints + ")";
  538 + Integer createBy = map.get("createBy").equals("") ? null : Integer.valueOf(map.get("createBy").toString());
  539 + String createDate = map.get("createDate").equals("") ? null : map.get("createDate").toString();
  540 + Integer updateBy = map.get("updateBy").equals("") ?null : Integer.valueOf(map.get("updateBy").toString());
  541 + Integer isRoadeSpeed = map.get("isRoadeSpeed").equals("") ? null : Integer.valueOf(map.get("isRoadeSpeed").toString());
  542 + SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
  543 + Date date = new Date();
  544 + // 修改日期
  545 + String updateDate = formatter.format(date);
  546 + String crosesRoad="";
  547 + String endNode="";
  548 + String startNode="";
  549 + String middleNode="";
  550 + String sectionType="";
  551 + // 更新
  552 + repository.sectionUpdate(sectionId, gsectionVector, bsectionVectorS, sectionCode, sectionName, crosesRoad, endNode, startNode, middleNode, sectionType, roadCoding, sectionDistance, sectionTime, dbType, speedLimit, descriptions, version, createBy, createDate, updateBy, updateDate);
  553 + SectionRouteCache route = new SectionRouteCache();
  554 + Line line = lineRepository.findOne(sectionRouteLine);
  555 + Section section = repository.findOne(sectionId);
  556 + route.setId(sectionRouteId);
  557 + route.setSectionrouteCode(sectionrouteCode);
  558 + route.setLineCode(lineCode);
  559 + route.setSectionCode(sectionCode);
  560 + route.setDirections(directions);
  561 + route.setVersions(version);
  562 + route.setDestroy(destroy);
  563 + route.setDescriptions(descriptions);
  564 + route.setCreateBy(createBy);
  565 + route.setUpdateBy(updateBy);
  566 + route.setLine(line);
  567 + route.setSection(section);
  568 + route.setIsRoadeSpeed(isRoadeSpeed);
  569 + routeCacheRepository.save(route);
  570 + resultMap.put("status", ResponseCode.SUCCESS);
  571 + } catch (Exception e) {
  572 + resultMap.put("status", ResponseCode.ERROR);
  573 + logger.error("save erro.", e);
  574 + }
  575 + return resultMap;
  576 + }
  577 +
180 578 /** 百度坐标转WGS坐标 */
181 579 public Location FromBDPointToWGSPoint(String bLonx,String bLatx) {
182 580  
... ...
src/main/java/com/bsth/service/impl/StationRouteServiceImpl.java
... ... @@ -8,6 +8,7 @@ import com.bsth.entity.search.CustomerSpecs;
8 8 import com.bsth.repository.LineRepository;
9 9 import com.bsth.repository.SectionRouteRepository;
10 10 import com.bsth.repository.StationRepository;
  11 +import com.bsth.repository.StationRouteCacheRepository;
11 12 import com.bsth.repository.StationRouteRepository;
12 13 import com.bsth.service.StationRouteService;
13 14 import com.bsth.util.FTPClientUtils;
... ... @@ -51,6 +52,9 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
51 52 private StationRouteRepository repository;
52 53  
53 54 @Autowired
  55 + private StationRouteCacheRepository cacheRepository;
  56 +
  57 + @Autowired
54 58 private SectionRouteRepository routeRepository;
55 59  
56 60 @Autowired
... ... @@ -493,6 +497,46 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
493 497 return resultList;
494 498 }
495 499  
  500 +
  501 + /**
  502 + * @Description :TODO(查询线路某方向下所有站点的中心百度坐标)
  503 + *
  504 + * @param map <lineId:线路ID; direction:方向>
  505 + *
  506 + * @return List<Map<String, Object>>
  507 + */
  508 + @Override
  509 + public List<Map<String, Object>> getStationRouteCacheCenterPoints(Map<String, Object> map) {
  510 +
  511 + List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
  512 +
  513 + // 线路ID
  514 + Integer lineId = map.get("lineId").equals("") ? null : Integer.parseInt(map.get("lineId").toString());
  515 +
  516 + // 方向
  517 + Integer direction = map.get("direction").equals("") ? null : Integer.parseInt(map.get("direction").toString());
  518 +
  519 + List<Object[]> list = cacheRepository.getSelectStationRouteCenterPoints(lineId, direction);
  520 +
  521 + if(list.size()>0) {
  522 +
  523 + for(int i = 0;i<list.size();i++) {
  524 +
  525 + Map<String, Object> tempM = new HashMap<String,Object>();
  526 +
  527 + tempM.put("bJwpoints", list.get(i)[0]);
  528 +
  529 + tempM.put("stationName", list.get(i)[1]);
  530 +
  531 + resultList.add(tempM);
  532 +
  533 + }
  534 +
  535 + }
  536 +
  537 + return resultList;
  538 + }
  539 +
496 540 /**
497 541 * @Description :TODO(撤销站点)
498 542 *
... ... @@ -668,6 +712,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
668 712 * @return String
669 713 */
670 714 public String newTextFileToFTP(List<Object[]> objects,Integer lineId) {
  715 +
671 716 // 返回值String
672 717 String stationRStr = "";
673 718 // windows下的文本文件换行符
... ... @@ -771,6 +816,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
771 816  
772 817 }
773 818 return stationRStr;
  819 +
774 820 }
775 821  
776 822 public String hxTextFileToFtp(List<Object[]> objects,Integer lineId) {
... ...
src/main/java/com/bsth/service/impl/StationServiceImpl.java
... ... @@ -2,6 +2,7 @@ package com.bsth.service.impl;
2 2  
3 3 import java.math.BigDecimal;
4 4 import java.util.HashMap;
  5 +import java.util.Iterator;
5 6 import java.util.List;
6 7 import java.util.Map;
7 8  
... ... @@ -20,18 +21,23 @@ import com.bsth.entity.Line;
20 21 import com.bsth.entity.LineInformation;
21 22 import com.bsth.entity.Section;
22 23 import com.bsth.entity.SectionRoute;
  24 +import com.bsth.entity.SectionRouteCache;
23 25 import com.bsth.entity.Station;
24 26 import com.bsth.entity.StationRoute;
  27 +import com.bsth.entity.StationRouteCache;
25 28 import com.bsth.repository.LineInformationRepository;
26 29 import com.bsth.repository.LineRepository;
27 30 import com.bsth.repository.SectionRepository;
  31 +import com.bsth.repository.SectionRouteCacheRepository;
28 32 import com.bsth.repository.SectionRouteRepository;
29 33 import com.bsth.repository.StationRepository;
  34 +import com.bsth.repository.StationRouteCacheRepository;
30 35 import com.bsth.repository.StationRouteRepository;
31 36 import com.bsth.service.StationService;
32 37 import com.bsth.util.GetUIDAndCode;
33 38 import com.bsth.util.TransGPS;
34 39 import com.bsth.util.TransGPS.Location;
  40 +import com.bsth.util.Geo.Circle;
35 41 import com.bsth.util.Geo.GeoUtils;
36 42 import com.bsth.util.Geo.Point;
37 43  
... ... @@ -61,6 +67,9 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
61 67 private StationRouteRepository routeRepository;
62 68  
63 69 @Autowired
  70 + private StationRouteCacheRepository routeCacheRepository;
  71 +
  72 + @Autowired
64 73 private LineInformationRepository informationRepository;
65 74  
66 75 @Autowired
... ... @@ -72,6 +81,11 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
72 81 @Autowired
73 82 private SectionRouteRepository sectionRouteRepository;
74 83  
  84 + @Autowired
  85 + private SectionRouteCacheRepository sectionRouteCacheRepository;
  86 +
  87 + private GeoUtils geoUtils;
  88 +
75 89 Logger logger = LoggerFactory.getLogger(this.getClass());
76 90  
77 91 /**
... ... @@ -118,6 +132,8 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
118 132 Map<String, Object> resultSaveMapm = new HashMap<String,Object>();
119 133 String baseRes = map.get("baseRes").equals("") ? "" : map.get("baseRes").toString();
120 134 if(!stationJSON.equals("")) {
  135 + // 保存前先撤销原有站点
  136 +
121 137 // 保存站点与站点路由信息
122 138 resultSaveMapm = savaStationAndStationRouteInfo( stationJSON, sectionDistance, sectionDuration, dbType,radius, shapesType, destroy, versions, sumUpOrDownMileage, directions, resultLine,baseRes);
123 139 }
... ... @@ -930,8 +946,7 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
930 946 Float x = map.get("x").equals("") ? null : Float.parseFloat(map.get("x").toString());
931 947 Float y = map.get("y").equals("") ? null : Float.parseFloat(map.get("y").toString());
932 948 // 更新
933   - /*repository.stationUpdate(stationCod, zdmc, roadCoding, dbType, bJwpoints, gLonx, gLaty, x, y, bPloygonGrid, gPloygonGrid, destroy, radius, shapesType, versions, descriptions, stationId);*/
934   - repository.stationUpdate(stationCod, zdmc, roadCoding, dbType, bJwpoints, gLonx, gLaty, x, y, bPloygonGrid, gPloygonGrid, radius, shapesType, versions, descriptions, stationId);
  949 + repository.stationUpdate(stationCod, zdmc, roadCoding, dbType, bJwpoints, gLonx, gLaty, x, y, bPloygonGrid, gPloygonGrid, destroy, radius, shapesType, versions, descriptions, stationId);
935 950 // 站点路由Id
936 951 Integer stationRouteId = map.get("stationRouteId").equals("") ? null : Integer.parseInt(map.get("stationRouteId").toString());
937 952 StationRoute resultS = routeRepository.findOne(stationRouteId);
... ... @@ -1000,7 +1015,7 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
1000 1015  
1001 1016 }
1002 1017  
1003   -
  1018 + @Transactional
1004 1019 @Override
1005 1020 public Map<String, Object> manualSave(Map<String, Object> map) {
1006 1021 Map<String, Object> resultMap = new HashMap<String,Object>();
... ... @@ -1073,6 +1088,8 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
1073 1088 Integer destroy,Integer directions) {
1074 1089 // 转换成JSON数组
1075 1090 JSONArray sectionsArray = JSONArray.parseArray(sectionJSON);
  1091 + // 更新路线前撤销线路原有路段
  1092 + sectionRouteRepository.sectionRouteUpdDestroy(Integer.parseInt(resultLine.getLineCode()),directions);
1076 1093 // 遍历
1077 1094 for(int s = 0 ;s<sectionsArray.size();s++) {
1078 1095 // 站点名称
... ... @@ -1093,11 +1110,9 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
1093 1110 if(p==pointsArray.size()-1){
1094 1111 sectionsBpoints = sectionsBpoints + pointsLngStr + " " + pointsLatStr;
1095 1112 sectionsWJPpoints = sectionsWJPpoints + WGSLngStr + " " + WGSLatStr;
1096   - // sectionsWJPpoints = sectionsWJPpoints + pointsArray.getJSONObject(p).getJSONObject("WGSpotion").get("Lng") + " " +pointsArray.getJSONObject(p).getJSONObject("WGSpotion").get("Lat");
1097 1113 }else {
1098 1114 sectionsBpoints = sectionsBpoints + pointsArray.getJSONObject(p).get("lng").toString() + " " +pointsArray.getJSONObject(p).get("lat").toString()+",";
1099 1115 sectionsWJPpoints = sectionsWJPpoints + WGSLngStr + " " + WGSLatStr + ",";
1100   - // sectionsWJPpoints = sectionsWJPpoints + pointsArray.getJSONObject(p).getJSONObject("WGSpotion").get("Lng") + " " +pointsArray.getJSONObject(p).getJSONObject("WGSpotion").get("Lat") +",";
1101 1116 }
1102 1117 }
1103 1118 }
... ... @@ -1150,10 +1165,369 @@ public class StationServiceImpl extends BaseServiceImpl&lt;Station, Integer&gt; implem
1150 1165 sectionRoute.setVersions(versions);
1151 1166 sectionRoute.setDestroy(destroy);
1152 1167 // 方向
1153   - sectionRoute.setDirections(directions);
  1168 + sectionRoute.setDirections(directions);
  1169 + // 保存路段
1154 1170 sectionRouteRepository.save(sectionRoute);
1155 1171 }
1156 1172  
1157 1173 }
1158 1174  
  1175 + /**
  1176 + * @Description :TODO(根据坐标点匹配数据库中的站点)
  1177 + *
  1178 + * @param map: <point:坐标点; name:站点名>
  1179 + *
  1180 + */
  1181 + @Override
  1182 + @Transactional
  1183 + public Map<String, Object> matchStation(Map<String, Object> map) {
  1184 + boolean isMatch = false;
  1185 + double lat = Double.parseDouble(map.get("potion[lat]").toString());
  1186 + double lon = Double.parseDouble(map.get("potion[lng]").toString());
  1187 + Point point = new Point(lon, lat);
  1188 + Iterable<Station> Stations = repository.findAll();
  1189 + for (Station s : Stations) {
  1190 + String libraryPointstr = s.getbJwpoints();
  1191 + String points[] = libraryPointstr.toString().split(" ");
  1192 + Point center = new Point(Double.parseDouble(points[0]), Double.parseDouble(points[1]));
  1193 + // 在100m内认为是同一个站点
  1194 + Circle circle = new Circle(center, 100);
  1195 + // 匹配到了用数据库中的点替换
  1196 + if (geoUtils.isPointInCircle(point, circle)) {
  1197 + map.put("name", s.getStationName().toString());
  1198 + map.put("potion_lng", points[0]);
  1199 + map.put("potion_lat", points[1]);
  1200 + map.put("isHave", "true");
  1201 + map.put("id", s.getId());
  1202 + isMatch = true;
  1203 + break;
  1204 + }
  1205 + }
  1206 + // 如果没有匹配到站点就用这个点
  1207 + if (!isMatch) {
  1208 + map.put("potion_lng", lon);
  1209 + map.put("potion_lat", lat);
  1210 + map.put("isHave", "false");
  1211 + map.put("id", "");
  1212 + }
  1213 + return map;
  1214 + }
  1215 +
  1216 + /**
  1217 + * @Description :TODO(把上传Gps生成的路线放到缓存表中)
  1218 + *
  1219 + * @param map: 站点和坐标
  1220 + *
  1221 + */
  1222 + @Transactional
  1223 + @Override
  1224 + public Map<String, Object> cacheSave(Map<String, Object> map) {
  1225 + Map<String, Object> resultMap = new HashMap<String,Object>();
  1226 + try {
  1227 + // 站点信息字符传
  1228 + String stationJSON = map.get("stationJSON").equals("") ? "" : map.get("stationJSON").toString();
  1229 + // 路段信息字符串
  1230 + String sectionJSON = map.get("sectionJSON").equals("") ? "" : map.get("sectionJSON").toString();
  1231 + // 方向
  1232 + int directions = Integer.parseInt(map.get("directions").toString());
  1233 + // 是否撤销
  1234 + int destroy = map.get("destroy").equals("") ? 0 : Integer.parseInt(map.get("destroy").toString());
  1235 + // 版本
  1236 + int versions = map.get("versions").equals("") ? 0 : Integer.parseInt(map.get("versions").toString());
  1237 + // 坐标类型
  1238 + String dbType = map.get("dbType").equals("") ? "" : map.get("dbType").toString();
  1239 + // 限速
  1240 + String speedLimitStr = map.get("speedLimit").equals("") ? "" : map.get("speedLimit").toString();
  1241 + // 线路ID
  1242 + int lineId = map.get("lineId").equals("") ? 0 : Integer.parseInt(map.get("lineId").toString());
  1243 + // 半径
  1244 + int radius = map.get("radius").equals("") ? 0 : Integer.parseInt(map.get("radius").toString());
  1245 + // 图形类型
  1246 + String shapesType = map.get("shapesType").equals("") ? "" : map.get("shapesType").toString();
  1247 + // 线路信息
  1248 + Line resultLine = lineRepository.findOne(lineId);
  1249 + // 路段距离
  1250 + Double sectionDistance = 0.0d;
  1251 + // 路段时长
  1252 + Double sectionDuration = 0.0d;
  1253 + // 里程(上或者下)
  1254 + double sumUpOrDownMileage = 0.0d;
  1255 + Map<String, Object> resultSaveMapm = new HashMap<String,Object>();
  1256 + String baseRes = map.get("baseRes").equals("") ? "" : map.get("baseRes").toString();
  1257 +
  1258 + if(!stationJSON.equals("")) {
  1259 + // 保存站点与站点路由信息
  1260 + resultSaveMapm = savaStationAndStationRouteCacheInfo( stationJSON, sectionDistance, sectionDuration, dbType,radius, shapesType, destroy, versions, sumUpOrDownMileage, directions, resultLine,baseRes);
  1261 + }
  1262 + // 路段长度
  1263 + sectionDistance = Double.valueOf(resultSaveMapm.get("sectionDistance").toString());
  1264 + // 路段时长
  1265 + sectionDuration = Double.valueOf(resultSaveMapm.get("sectionDuration").toString());
  1266 + // 如果路段信息JSON字符串不为空
  1267 + if(!sectionJSON.equals("")) {
  1268 + SaveSectionAndSectionRouteCache(sectionJSON, speedLimitStr, sectionDistance, sectionDuration, dbType, versions, resultLine, destroy, directions);
  1269 + }
  1270 + // 里程
  1271 + sumUpOrDownMileage = Double.valueOf(resultSaveMapm.get("sumUpOrDownMileage").toString());
  1272 + BigDecimal s = new BigDecimal(sumUpOrDownMileage);
  1273 + sumUpOrDownMileage = s.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
  1274 + // 更新里程
  1275 + // updateLineInfoUpOrDownMileage( resultLine , directions, sumUpOrDownMileage);
  1276 + if(directions==0) {
  1277 + // lineUpdateStationName(resultLine);
  1278 + }
  1279 + resultMap.put("status", ResponseCode.SUCCESS);
  1280 + resultMap.put("stationData", resultSaveMapm.get("stationdata"));
  1281 + } catch (Exception e) {
  1282 + resultMap.put("status", ResponseCode.ERROR);
  1283 + logger.error("save erro.", e);
  1284 + }
  1285 +
  1286 + return resultMap;
  1287 + }
  1288 +
  1289 + /**
  1290 + * @param isHaveId 存在站点的id
  1291 + * @param isHave 是否存在站点
  1292 + * @Description :TODO(保存站点和缓存站点路由信息)
  1293 + *
  1294 + */
  1295 + public Map<String, Object> savaStationAndStationRouteCacheInfo(String stationJSON,double sectionDistance,double sectionDuration,String dbType,
  1296 + int radius,String shapesType,int destroy,int versions,double sumUpOrDownMileage,int directions,Line resultLine,String baseRes) throws Exception{
  1297 + Map<String, Object> paramsMeleageAndDistncDura = new HashMap<String,Object>();
  1298 + JSONArray stationsArray = JSONArray.parseArray(stationJSON);
  1299 + if(stationsArray.size()>0) {
  1300 + // 更新路线前删除线路缓存站点
  1301 + routeCacheRepository.stationRouteCacheDel(Integer.parseInt(resultLine.getLineCode()),directions);
  1302 + for(int i = 0;i <stationsArray.size();i++) {
  1303 + // 站点名称
  1304 + String stationName = stationsArray.getJSONObject(i).equals("") ? "" : stationsArray.getJSONObject(i).get("name").toString();
  1305 + Double distance = stationsArray.getJSONObject(i).get("distance").equals("") ? 0.0d : Double.parseDouble(stationsArray.getJSONObject(i).get("distance").toString());
  1306 + // 转成公里
  1307 + distance = distance/1000;
  1308 + BigDecimal d = new BigDecimal(distance);
  1309 + distance = d.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
  1310 + sectionDistance= distance + sectionDistance;
  1311 + Double duration = stationsArray.getJSONObject(i).get("duration").equals("") ? 0.0d : Double.parseDouble(stationsArray.getJSONObject(i).get("duration").toString());
  1312 + // 转成分钟
  1313 + duration = duration/60;
  1314 + BigDecimal t = new BigDecimal(duration);
  1315 + duration = t.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
  1316 + sectionDuration = duration + sectionDuration;
  1317 + // 百度经纬度坐标
  1318 + String bJwpoints = "";
  1319 + // 百度坐标经度
  1320 + String bLonx = JSONObject.parseObject(stationsArray.getJSONObject(i).get("potion").toString()).get("lng").toString();
  1321 + bLonx = bLonx==null || bLonx.equals("") ? "0" : bLonx;
  1322 + // 百度坐标纬度
  1323 + String bLatx = JSONObject.parseObject(stationsArray.getJSONObject(i).get("potion").toString()).get("lat").toString();
  1324 + bLatx = bLatx==null || bLatx.equals("") ? "0" : bLatx;
  1325 + List<Object[]> stationNameList = repository.findStationName(directions,stationName);
  1326 + //Map<String, Object> isHaveMap = isHaveStationname(bLonx,bLatx,stationNameList);
  1327 + // 初始化站点对象
  1328 + Station arg0 = new Station();
  1329 + // 存在的点就不添加到数据库
  1330 + if(Boolean.parseBoolean(stationsArray.getJSONObject(i).get("isHave").toString())) {
  1331 + Integer stationId = Integer.parseInt(stationsArray.getJSONObject(i).get("id").toString());
  1332 + arg0 = repository.findOne(stationId);
  1333 + }else {
  1334 + // 站点编码
  1335 + long stationCode = GetUIDAndCode.getStationId();
  1336 + arg0.setStationCod(String.valueOf(stationCode));
  1337 + arg0.setId((int)stationCode);
  1338 + arg0.setStationName(stationName);
  1339 + // 原坐标类型
  1340 + arg0.setDbType(dbType);
  1341 + String gLonxStr = JSONObject.parseObject(stationsArray.getJSONObject(i).get("wgs").toString()).get("x").equals("") ? null : JSONObject.parseObject(stationsArray.getJSONObject(i).get("wgs").toString()).get("x").toString();
  1342 + String gLatyStr = JSONObject.parseObject(stationsArray.getJSONObject(i).get("wgs").toString()).get("y").equals("") ? null : JSONObject.parseObject(stationsArray.getJSONObject(i).get("wgs").toString()).get("y").toString();
  1343 + float gLonx = 0.0f;
  1344 + float gLaty = 0.0f;
  1345 + Location resultPoint = null;
  1346 + if(baseRes.equals("No")){
  1347 + /** BD to WGS坐标 */
  1348 + resultPoint = FromBDPointToWGSPoint(bLonx,bLatx);
  1349 + if(gLonxStr==null)
  1350 + gLonx = (float)resultPoint.getLng();
  1351 + else
  1352 + gLonx = Float.valueOf(gLonxStr);
  1353 + if(gLatyStr==null)
  1354 + gLaty = (float)resultPoint.getLat();
  1355 + else
  1356 + gLaty = Float.valueOf(gLatyStr);
  1357 + arg0.setgLonx(gLonx);
  1358 + arg0.setgLaty(gLaty);
  1359 + // 百度经纬度
  1360 + bJwpoints = bLonx + " " + bLatx;
  1361 + arg0.setbJwpoints(bJwpoints);
  1362 + }else if(baseRes.equals("GCJ02")){
  1363 + Location bdLoc = TransGPS.LocationMake(Double.valueOf(gLonxStr), Double.valueOf(gLatyStr));
  1364 + Location location = TransGPS.bd_encrypt(bdLoc);
  1365 + String GCJLng = String.valueOf(location.getLng());
  1366 + String GCJLat = String.valueOf(location.getLat());
  1367 + resultPoint = FromBDPointToWGSPoint(GCJLng,GCJLat);
  1368 + bJwpoints = GCJLng + " " +GCJLat;
  1369 + arg0.setgLonx((float)location.getLng());
  1370 + arg0.setgLaty((float)location.getLat());
  1371 + arg0.setbJwpoints(bJwpoints);
  1372 + }else if(baseRes.equals("BD09")){
  1373 + resultPoint = FromBDPointToWGSPoint(gLonxStr, gLatyStr);
  1374 + bJwpoints = gLonxStr+ " " + gLatyStr;
  1375 + arg0.setgLonx((float)resultPoint.getLng());
  1376 + arg0.setgLaty((float)resultPoint.getLat());
  1377 + }else if(baseRes.equals("WGS84")){
  1378 + Location bdLoc = TransGPS.LocationMake(Double.valueOf(gLonxStr), Double.valueOf(gLatyStr));
  1379 + Location gcjLoc = TransGPS.transformFromWGSToGCJ(bdLoc);
  1380 + Location bdEn = TransGPS.bd_encrypt(gcjLoc);
  1381 + bJwpoints = String.valueOf(bdEn.getLng()) + " " + String.valueOf(bdEn.getLat());
  1382 + arg0.setbJwpoints(bJwpoints);
  1383 + arg0.setgLonx(Float.valueOf(gLonxStr));
  1384 + arg0.setgLaty(Float.valueOf(gLatyStr));
  1385 + }
  1386 + arg0.setRadius(radius);
  1387 + arg0.setShapesType(shapesType);
  1388 + // 是否想撤销
  1389 + arg0.setDestroy(destroy);
  1390 + // 版本号
  1391 + arg0.setVersions(versions);
  1392 + arg0.setbJwpoints(bJwpoints);
  1393 + // 插入站点信息
  1394 + repository.save(arg0);
  1395 +
  1396 + }
  1397 + // 站点路由对象
  1398 + StationRouteCache route = new StationRouteCache();
  1399 + // 站点名称
  1400 + route.setStationName(stationName);
  1401 + route.setDistances(distance);
  1402 + sumUpOrDownMileage = sumUpOrDownMileage + distance;
  1403 + route.setToTime(duration);
  1404 + // 站点编码
  1405 + route.setStationCode(arg0.getStationCod());
  1406 + // 站点序号
  1407 + route.setStationRouteCode((i+1)*100);
  1408 + // 站点类型
  1409 + if(i==0) {
  1410 + // 起始站
  1411 + route.setStationMark("B");
  1412 + }else if(i==stationsArray.size()-1) {
  1413 + // 终点站
  1414 + route.setStationMark("E");
  1415 + }else {
  1416 + // 中途站
  1417 + route.setStationMark("Z");
  1418 + }
  1419 + // 版本号
  1420 + route.setVersions(versions);
  1421 + // 站点ID
  1422 + route.setStation(arg0);
  1423 + // 方向
  1424 + route.setDirections(directions);
  1425 + // 线路ID
  1426 + route.setLine(resultLine);
  1427 + // 线路编码
  1428 + route.setLineCode(resultLine.getLineCode());
  1429 + route.setDestroy(destroy);
  1430 + // 插入站点路由信息
  1431 + routeCacheRepository.save(route);
  1432 +
  1433 + }
  1434 + paramsMeleageAndDistncDura.put("sumUpOrDownMileage", sumUpOrDownMileage);
  1435 + paramsMeleageAndDistncDura.put("sectionDistance", sectionDistance);
  1436 + paramsMeleageAndDistncDura.put("sectionDuration", sectionDuration);
  1437 + paramsMeleageAndDistncDura.put("stationdata",stationsArray);
  1438 + }
  1439 + return paramsMeleageAndDistncDura;
  1440 + }
  1441 +
  1442 + /**
  1443 + * @Description :TODO(保存路段和缓存路段路由信息)
  1444 + *
  1445 + */
  1446 + public void SaveSectionAndSectionRouteCache(String sectionJSON,String speedLimitStr,double sectionDistance, double sectionTime,
  1447 + String dbType,Integer versions,Line resultLine,Integer destroy,Integer directions) {
  1448 + // 转换成JSON数组
  1449 + JSONArray sectionsArray = JSONArray.parseArray(sectionJSON);
  1450 + // 更新路线前删除线路缓存路段
  1451 + sectionRouteCacheRepository.sectionRouteCacheDel(Integer.parseInt(resultLine.getLineCode()),directions);
  1452 + // 遍历
  1453 + for(int s = 0 ;s<sectionsArray.size();s++) {
  1454 + // 站点名称
  1455 + String sectionName = sectionsArray.getJSONObject(s).equals("") ? "" : sectionsArray.getJSONObject(s).get("sectionName").toString();
  1456 + String pointsStr = sectionsArray.getJSONObject(s).equals("") ? "" : sectionsArray.getJSONObject(s).get("points").toString();
  1457 + // 原始线状图形坐标集合
  1458 + String sectionsBpoints = "";
  1459 + // WGS线状图形坐标集合
  1460 + String sectionsWJPpoints = "";
  1461 + if(!pointsStr.equals("")){
  1462 + JSONArray pointsArray = JSONArray.parseArray(pointsStr);
  1463 + for(int p =0;p<pointsArray.size();p++){
  1464 + String pointsLngStr = pointsArray.getJSONObject(p).get("lng").toString();
  1465 + String pointsLatStr = pointsArray.getJSONObject(p).get("lat").toString();
  1466 + Location resultPoint = FromBDPointToWGSPoint(pointsLngStr,pointsLatStr);
  1467 + String WGSLngStr = String.valueOf(resultPoint.getLng());
  1468 + String WGSLatStr = String.valueOf(resultPoint.getLat());
  1469 + if(p==pointsArray.size()-1){
  1470 + sectionsBpoints = sectionsBpoints + pointsLngStr + " " + pointsLatStr;
  1471 + sectionsWJPpoints = sectionsWJPpoints + WGSLngStr + " " + WGSLatStr;
  1472 + }else {
  1473 + sectionsBpoints = sectionsBpoints + pointsArray.getJSONObject(p).get("lng").toString() + " " +pointsArray.getJSONObject(p).get("lat").toString()+",";
  1474 + sectionsWJPpoints = sectionsWJPpoints + WGSLngStr + " " + WGSLatStr + ",";
  1475 + }
  1476 + }
  1477 + }
  1478 + long sectionMaxId = GetUIDAndCode.getSectionId();
  1479 + String sectionCode = String.valueOf(sectionMaxId);
  1480 + int sectionId = (int) (sectionMaxId);
  1481 + // 交出路
  1482 + String crosesRoad = "";
  1483 + // 终止节点
  1484 + String endNode = "";
  1485 + // 开始节点
  1486 + String startNode = "";
  1487 + // 中间节点
  1488 + String middleNode = "";
  1489 + // WGS坐标点集合
  1490 + String gsectionVector = "LINESTRING(" + sectionsWJPpoints +")";
  1491 + // 原坐标点集合
  1492 + String bsectionVector = "LINESTRING(" + sectionsBpoints + ")";
  1493 + // 城建坐标点集合
  1494 + String csectionVector = "";
  1495 + // 路段类型
  1496 + String sectionType = "";
  1497 + // 道路编码
  1498 + String roadCoding = "";
  1499 + // 限速
  1500 + double speedLimit = Double.parseDouble(speedLimitStr);
  1501 + // 说明
  1502 + String descriptions = "";
  1503 + sectionRepository.systemSave(sectionCode, sectionName, crosesRoad, endNode, startNode,
  1504 +
  1505 + middleNode, gsectionVector, bsectionVector, sectionType, csectionVector,
  1506 +
  1507 + roadCoding, sectionDistance, sectionTime, dbType, speedLimit,
  1508 +
  1509 + descriptions, versions,sectionId);
  1510 + Section section = sectionRepository.findOne(Integer.parseInt(sectionCode));
  1511 + // 路段路由
  1512 + SectionRouteCache sectionRoute = new SectionRouteCache();
  1513 + // 路段序号
  1514 + sectionRoute.setSectionrouteCode((s+1)*100);
  1515 + // 线路编码
  1516 + sectionRoute.setLineCode(resultLine.getLineCode());
  1517 + // 路段ID
  1518 + sectionRoute.setSection(section);
  1519 + // 线路ID
  1520 + sectionRoute.setLine(resultLine);
  1521 + // 路段编码
  1522 + sectionRoute.setSectionCode(sectionCode);
  1523 + // 版本
  1524 + sectionRoute.setVersions(versions);
  1525 + sectionRoute.setDestroy(destroy);
  1526 + // 方向
  1527 + sectionRoute.setDirections(directions);
  1528 + // 保存路段
  1529 + sectionRouteCacheRepository.save(sectionRoute);
  1530 + }
  1531 +
  1532 + }
1159 1533 }
... ...
src/main/java/com/bsth/service/report/ReportService.java
... ... @@ -46,4 +46,6 @@ public interface ReportService {
46 46 List<Map<String, Object>> countByList(Map<String, Object> map);
47 47  
48 48 List<Map<String, Object>> countByBusList(Map<String, Object> map);
  49 +
  50 + List<Map<String, Object>> countDjg(Map<String, Object> map);
49 51 }
... ...
src/main/java/com/bsth/service/report/impl/ReportServiceImpl.java
... ... @@ -8,15 +8,19 @@ import com.bsth.entity.oil.Dlb;
8 8 import com.bsth.entity.oil.Ylb;
9 9 import com.bsth.entity.realcontrol.ChildTaskPlan;
10 10 import com.bsth.entity.realcontrol.ScheduleRealInfo;
  11 +import com.bsth.entity.sys.Interval;
11 12 import com.bsth.repository.LineRepository;
12 13 import com.bsth.repository.StationRouteRepository;
13 14 import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
14 15 import com.bsth.service.report.CulateMileageService;
15 16 import com.bsth.service.report.ReportService;
16 17 import com.bsth.util.Arith;
  18 +import com.bsth.util.ComparableChild;
17 19 import com.bsth.util.ComparableJob;
18 20 import com.bsth.util.ReportUtils;
19 21 import com.bsth.util.db.DBUtils_MS;
  22 +import com.google.protobuf.StringValue;
  23 +
20 24 import org.apache.commons.lang.StringUtils;
21 25 import org.slf4j.Logger;
22 26 import org.slf4j.LoggerFactory;
... ... @@ -57,6 +61,7 @@ public class ReportServiceImpl implements ReportService{
57 61 LineRepository lineRepository;
58 62 @Autowired
59 63 StationRouteRepository stationRouteRepository;
  64 +
60 65 @Override
61 66 public List<ScheduleRealInfo> queryListBczx(String line, String date,String clzbh) {
62 67 // TODO Auto-generated method stub
... ... @@ -2221,5 +2226,244 @@ public class ReportServiceImpl implements ReportService{
2221 2226 }
2222 2227 return lMap;
2223 2228 }
  2229 + @Override
  2230 + public List<Map<String, Object>> countDjg(Map<String, Object> map) {
  2231 + // TODO Auto-generated method stub
  2232 + List<Map<String, Object>> lMap=new ArrayList<Map<String,Object>>();
  2233 + String line=map.get("line").toString().trim();
  2234 + String date=map.get("date").toString();
  2235 + String gsbm=map.get("gsbm").toString();
  2236 + String fgsbm=map.get("fgsbm").toString();
  2237 + List<ScheduleRealInfo> list=new ArrayList<ScheduleRealInfo>();
  2238 + if(line.equals("")){
  2239 + list=scheduleRealInfoRepository.scheduleByDateAndLineByGs(gsbm, fgsbm, date);
  2240 +
  2241 + }else{
  2242 + list=scheduleRealInfoRepository.scheduleByDateAndLine2(line, date);
  2243 + }
  2244 + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
  2245 +// Collections.sort(listInfo,new ComparableAcuals());
  2246 + //查询所有线路
  2247 + String xlSql="select line_code,spac_grade from bsth_c_line ";
  2248 + if(line.equals("")){
  2249 + xlSql +=" where company ='"+gsbm+"'";
  2250 + }else{
  2251 + xlSql +=" where line_code ='"+line+"'";
  2252 + }
  2253 +
  2254 + List<Map<String, Object>> xlList=jdbcTemplate.query(xlSql, new RowMapper<Map<String, Object>>() {
  2255 + @Override
  2256 + public Map<String, Object> mapRow(ResultSet arg0, int arg1) throws SQLException {
  2257 + Map<String, Object> map=new HashMap<String,Object>();
  2258 + map.put("line",arg0.getString("line_code"));
  2259 + map.put("grade", arg0.getString("spac_grade"));
  2260 + return map;
  2261 + }
  2262 + });
  2263 + //查询大间隔时间
  2264 + String djgSql="select * from bsth_c_interval";
  2265 + List<Interval> djgList=jdbcTemplate.query(djgSql, new RowMapper<Interval>() {
  2266 + @Override
  2267 + public Interval mapRow(ResultSet arg0, int arg1) throws SQLException {
  2268 + Interval m=new Interval();
  2269 + m.setLevel(arg0.getString("level"));
  2270 + m.setPeak(arg0.getInt("peak"));
  2271 + m.setTrough(arg0.getInt("trough"));
  2272 + return m;
  2273 + }
  2274 + });
  2275 +
  2276 +
  2277 + for (int i = 0; i < xlList.size(); i++) {
  2278 + String lineCode=xlList.get(i).get("line").toString();
  2279 + String grade =xlList.get(i).get("grade").toString();
  2280 + int peak=0;
  2281 + int trough=0;
  2282 + for (int j = 0; j < djgList.size(); j++) {
  2283 + Interval il=djgList.get(j);
  2284 + if(il.getLevel().equals(grade)){
  2285 + peak=il.getPeak();
  2286 + trough=il.getTrough();
  2287 + continue;
  2288 + }
  2289 + }
  2290 + List<ScheduleRealInfo> list_=new ArrayList<ScheduleRealInfo>();
  2291 + List<ScheduleRealInfo> listInfo=new ArrayList<ScheduleRealInfo>();
  2292 + for (int j = 0; j < list.size(); j++) {
  2293 + ScheduleRealInfo sinfo=list.get(j);
  2294 + try {
  2295 + if(sinfo.getXlBm().equals(lineCode)){
  2296 + list_.add(sinfo);
  2297 + ScheduleRealInfo s=checkBc(sinfo);
  2298 + String fcsj=s.getFcsjActual()==null?"":s.getFcsjActual();
  2299 + if(!fcsj.equals("")){
  2300 + Long fcsjAcual = sdf.parse(s.getRealExecDate() + " " + s.getFcsjActual()).getTime();
  2301 + s.setFcsjActualTime(fcsjAcual);
  2302 + s.setFcsjActual(fcsj);
  2303 + listInfo.add(s);
  2304 + }
  2305 +
  2306 + }
  2307 + } catch (ParseException e) {
  2308 + // TODO Auto-generated catch block
  2309 + e.printStackTrace();
  2310 + }
  2311 + }
  2312 + if(listInfo.size()>0){
  2313 + int sjbcs=culateService.culateSjbc(list_, "")+culateService.culateLjbc(list_, "");
  2314 + Map<String, Object> m=listDjg(gsbm,fgsbm,lineCode,sjbcs,peak,trough,listInfo,grade);
  2315 + lMap.add(m);
  2316 + }
  2317 +
  2318 + }
  2319 + return lMap;
  2320 + }
2224 2321  
  2322 + public ScheduleRealInfo checkBc(ScheduleRealInfo s){
  2323 + //如果班次有子任务 且 子任务中有属于营运的。把该子任务的发车时间设置成班次的发车时间
  2324 + String fcsj=s.getFcsjActual()==null?"":s.getFcsjActual();
  2325 + if(fcsj.equals("")){
  2326 + Set<ChildTaskPlan> childTaskPlans = s.getcTasks();
  2327 + if(!childTaskPlans.isEmpty()){
  2328 + List<ChildTaskPlan> listit=new ArrayList<ChildTaskPlan>(childTaskPlans);
  2329 + Collections.sort(listit, new ComparableChild());
  2330 + for (int i = 0; i < listit.size(); i++) {
  2331 + ChildTaskPlan c=listit.get(i);
  2332 + if(!c.isDestroy()){
  2333 + if(c.getMileageType().equals("service")){
  2334 + s.setFcsjActual(c.getStartDate());
  2335 + break;
  2336 + }
  2337 +
  2338 + }
  2339 + }
  2340 + }
  2341 + }
  2342 + return s;
  2343 + }
  2344 +
  2345 + public Map<String, Object> listDjg(String gsdm,String fgsdm,String line,int sjbcs,int peak,int trough,List<ScheduleRealInfo> listInfo,String grade){
  2346 + DecimalFormat df = new DecimalFormat("#0.00");
  2347 + Collections.sort(listInfo,new ComparableAcuals());
  2348 + List<ScheduleRealInfo> listInfo0=new ArrayList<ScheduleRealInfo>();
  2349 + List<ScheduleRealInfo> listInfo1=new ArrayList<ScheduleRealInfo>();
  2350 + for (int i = 0; i < listInfo.size(); i++) {
  2351 + ScheduleRealInfo s=listInfo.get(i);
  2352 + if(s.getXlDir().equals("0")){
  2353 + listInfo0.add(s);
  2354 + }else{
  2355 + listInfo0.add(s);
  2356 + }
  2357 +
  2358 + }
  2359 + Map<String, Object> map=new HashMap<String, Object>();
  2360 + map.put("line", line);
  2361 + map.put("xlName", BasicData.lineCode2NameMap.get(line));
  2362 + map.put("fgsname", BasicData.businessFgsCodeNameMap.get(fgsdm+"_"+gsdm));
  2363 + map.put("bcs", sjbcs);
  2364 + map.put("djgde", grade);
  2365 + int djgcs=0;
  2366 + List<Map<String, Object>> mapList=new ArrayList<Map<String, Object>>();
  2367 + for (int i = 0; i < listInfo0.size(); i++) {
  2368 + ScheduleRealInfo s=listInfo.get(i);
  2369 + Long fcsjTime=s.getFcsjActualTime();
  2370 + String time=s.getFcsjActual();
  2371 + String[] fcsjStr = time.split(":");
  2372 + long fcsj= Long.parseLong(fcsjStr[0])*60+Long.parseLong(fcsjStr[1]);
  2373 + if(i<listInfo.size()-1){
  2374 + Long djg=0l;
  2375 + Long fscjNext=listInfo.get(i+1).getFcsjActualTime();
  2376 + if((fcsj>=zgf1&&fcsj<=zgf2)||(fcsj>=wgf1&&fcsj<=wgf2)){
  2377 + djg = (long) (peak*60*1000);
  2378 + if(fscjNext-fcsjTime>djg){
  2379 + djgcs ++;
  2380 + Map<String, Object> m=new HashMap<String,Object>();
  2381 + m.put("xlName", BasicData.lineCode2NameMap.get(line));
  2382 + m.put("fgsname", BasicData.businessFgsCodeNameMap.get(fgsdm+"_"+gsdm));
  2383 + m.put("djgde", grade);
  2384 + m.put("qJh", s.getFcsj());
  2385 + m.put("qSj", time);
  2386 + m.put("hJh", listInfo.get(i+1).getFcsj());
  2387 + m.put("hSj", listInfo.get(i+1).getFcsjActual());
  2388 + mapList.add(m);
  2389 + }
  2390 + }else{
  2391 + djg = (long) (trough*60*1000);
  2392 + if(fscjNext-fcsjTime>djg){
  2393 + djgcs ++;
  2394 + Map<String, Object> m=new HashMap<String,Object>();
  2395 + m.put("xlName", BasicData.lineCode2NameMap.get(line));
  2396 + m.put("fgsname", BasicData.businessFgsCodeNameMap.get(fgsdm+"_"+gsdm));
  2397 + m.put("djgde", grade);
  2398 + m.put("qJh", s.getFcsj());
  2399 + m.put("qSj", time);
  2400 + m.put("hJh", listInfo.get(i+1).getFcsj());
  2401 + m.put("hSj", listInfo.get(i+1).getFcsjActual());
  2402 + mapList.add(m);
  2403 + }
  2404 + }
  2405 + }
  2406 + }
  2407 +
  2408 + for (int i = 0; i < listInfo1.size(); i++) {
  2409 + ScheduleRealInfo s=listInfo.get(i);
  2410 + Long fcsjTime=s.getFcsjActualTime();
  2411 + String time=s.getFcsjActual();
  2412 + String[] fcsjStr = time.split(":");
  2413 + long fcsj= Long.parseLong(fcsjStr[0])*60+Long.parseLong(fcsjStr[1]);
  2414 + if(i<listInfo.size()-1){
  2415 + Long djg=0l;
  2416 + Long fscjNext=listInfo.get(i+1).getFcsjActualTime();
  2417 + if((fcsj>=zgf1&&fcsj<=zgf2)||(fcsj>=wgf1&&fcsj<=wgf2)){
  2418 + djg = (long) (peak*60*1000);
  2419 + if(fscjNext-fcsjTime>djg){
  2420 + djgcs ++;
  2421 + Map<String, Object> m=new HashMap<String,Object>();
  2422 + m.put("xlName", BasicData.lineCode2NameMap.get(line));
  2423 + m.put("fgsname", BasicData.businessFgsCodeNameMap.get(fgsdm+"_"+gsdm));
  2424 + m.put("djgde", grade);
  2425 + m.put("qJh", s.getFcsj());
  2426 + m.put("qSj", time);
  2427 + m.put("hJh", listInfo.get(i+1).getFcsj());
  2428 + m.put("hSj", listInfo.get(i+1).getFcsjActual());
  2429 + mapList.add(m);
  2430 + }
  2431 + }else{
  2432 + djg = (long) (trough*60*1000);
  2433 + if(fscjNext-fcsjTime>djg){
  2434 + djgcs ++;
  2435 + Map<String, Object> m=new HashMap<String,Object>();
  2436 + m.put("xlName", BasicData.lineCode2NameMap.get(line));
  2437 + m.put("fgsname", BasicData.businessFgsCodeNameMap.get(fgsdm+"_"+gsdm));
  2438 + m.put("djgde", grade);
  2439 + m.put("qJh", s.getFcsj());
  2440 + m.put("qSj", time);
  2441 + m.put("hJh", listInfo.get(i+1).getFcsj());
  2442 + m.put("hSj", listInfo.get(i+1).getFcsjActual());
  2443 + mapList.add(m);
  2444 + }
  2445 + }
  2446 + }
  2447 + }
  2448 + double fsl=0.0;
  2449 + if(sjbcs>0){
  2450 + fsl=Arith.div(djgcs,sjbcs, 2)*100;
  2451 + }
  2452 +
  2453 + map.put("djgcs", djgcs);
  2454 + map.put("fsl", df.format(fsl)+"%");
  2455 + map.put("djgxx", mapList);
  2456 + return map;
  2457 + }
  2458 +
  2459 +}
  2460 +
  2461 +class ComparableAcuals implements Comparator<ScheduleRealInfo>{
  2462 +
  2463 + @Override
  2464 + public int compare(ScheduleRealInfo o1, ScheduleRealInfo o2) {
  2465 + // TODO Auto-generated method stub
  2466 + return o1.getFcsjActualTime().compareTo(o2.getFcsjActualTime());
  2467 + }
  2468 +
2225 2469 }
... ...
src/main/resources/static/pages/base/line/details.html
... ... @@ -191,46 +191,7 @@
191 191 <!-- 是否撤销 START -->
192 192 </div>
193 193 <!-- 表单分组组件 form-group END -->
194   - <!-- 表单分组组件 form-group START -->
195   - <div class="form-group">
196   - <!-- 是否营运START (因为options值基本固定,所以在页面固定。【以后可以根具需求修改成使用字典表实现】) -->
197   - <div class="col-md-6">
198   - <label class="control-label col-md-5">
199   - <span class="required"> * </span>是否营运线路&nbsp;&nbsp;&nbsp;&nbsp;:
200   - </label>
201   - <div class="col-md-4">
202   - <div class="md-radio-inline">
203   - <div class="md-radio">
204   - <input type="radio" id="radio18" name="sfyy" class="md-radiobtn" value="1" data-title="是" checked="checked" >
205   - <label for="radio18">
206   - <span></span>
207   - <span class="check"></span>
208   - <span class="box"></span> 是
209   - </label>
210   - </div>
211   - <div class="md-radio has-error">
212   - <input type="radio" id="radio19" name="sfyy" class="md-radiobtn" value="0" data-title="否" >
213   - <label for="radio19" style="color:#FFC0CB">
214   - <span></span>
215   - <span class="check"></span>
216   - <span class="box"></span> 否
217   - </label>
218   - </div>
219   - </div>
220   - </div>
221   - </div>
222   - <!-- 是否营运 END -->
223   - <!-- 权证车辆数 START -->
224   - <div class="col-md-6">
225   - <label class="control-label col-md-5"> 权证车辆数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
226   - <div class="col-md-4">
227   - <input type="text" class="form-control" name="warrantCar" id="warrantCarInput" placeholder="权证车辆数">
228   - </div>
229   - </div>
230   - <!-- 权证车辆数 END -->
231   -
232   - </div>
233   - <!-- 表单分组组件 form-group END -->
  194 +
234 195 <!-- 表单分组组件 form-group START -->
235 196 <div class="form-group">
236 197 <!-- 起始站名称 START (该字段值会在规划线路站点操作时会去验证是否有值。如果为空,则用线路规划站点的起点站。默认使用该字段填写值) -->
... ... @@ -321,20 +282,14 @@
321 282 </div>
322 283 <!-- 线路规划类型 (* 必填项) END -->
323 284  
324   - <!--大间隔等级 START -->
  285 + <!-- 开辟日期 START -->
325 286 <div class="col-md-6">
326   - <label class="control-label col-md-5"> 大间隔等级&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
  287 + <label class="control-label col-md-5"> 开辟日期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
327 288 <div class="col-md-4">
328   - <select name="spacGrade" class="form-control" id="spacGradeSelect">
329   - <option value="">-- 请选择大间隔等级 --</option>
330   - <option value="1">一级</option>
331   - <option value="2">二级</option>
332   - <option value="3">三级</option>
333   - <option value="4">四级</option>
334   - </select>
  289 + <input type="text" class="form-control" name="openDate" id="openDateInput" placeholder="开辟日期">
335 290 </div>
336 291 </div>
337   - <!-- 大间隔等级END -->
  292 + <!-- 开辟日期 END -->
338 293 </div>
339 294 <!-- 表单分组组件 form-group START -->
340 295  
... ... @@ -436,15 +391,6 @@
436 391 </div>
437 392 </div>
438 393 <!-- 空调车辆数 END -->
439   -
440   - <!-- 开辟日期 START -->
441   - <div class="col-md-6">
442   - <label class="control-label col-md-5"> 开辟日期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
443   - <div class="col-md-4">
444   - <input type="text" class="form-control" name="openDate" id="openDateInput" placeholder="开辟日期">
445   - </div>
446   - </div>
447   - <!-- 开辟日期 END -->
448 394 </div>
449 395 <!-- 表单分组组件 form-group END -->
450 396  
... ...
src/main/resources/static/pages/base/line/edit.html
... ... @@ -43,7 +43,7 @@
43 43 <!-- 表单内容 START -->
44 44 <div class="form-body">
45 45 <input type="hidden" name="id" id="lineId">
46   - <input type="hidden" name="inUse" id="inUse">
  46 +
47 47 <!-- 表单分组组件 form-group START -->
48 48 <div class="form-group">
49 49 <!-- 线路编码 (* 必填项) START -->
... ... @@ -199,46 +199,7 @@
199 199 <!-- 是否撤销 START -->
200 200 </div>
201 201 <!-- 表单分组组件 form-group END -->
202   - <!-- 表单分组组件 form-group START -->
203   - <div class="form-group">
204   - <!-- 是否营运START (因为options值基本固定,所以在页面固定。【以后可以根具需求修改成使用字典表实现】) -->
205   - <div class="col-md-6">
206   - <label class="control-label col-md-5">
207   - <span class="required"> * </span>是否营运线路&nbsp;&nbsp;&nbsp;&nbsp;:
208   - </label>
209   - <div class="col-md-4">
210   - <div class="md-radio-inline">
211   - <div class="md-radio">
212   - <input type="radio" id="radio18" name="sfyy" class="md-radiobtn" value="1" data-title="是" checked="checked" >
213   - <label for="radio18">
214   - <span></span>
215   - <span class="check"></span>
216   - <span class="box"></span> 是
217   - </label>
218   - </div>
219   - <div class="md-radio has-error">
220   - <input type="radio" id="radio19" name="sfyy" class="md-radiobtn" value="0" data-title="否" >
221   - <label for="radio19" style="color:#FFC0CB">
222   - <span></span>
223   - <span class="check"></span>
224   - <span class="box"></span> 否
225   - </label>
226   - </div>
227   - </div>
228   - </div>
229   - </div>
230   - <!-- 是否营运 END -->
231   -
232   - <!-- 权证车辆数 START -->
233   - <div class="col-md-6">
234   - <label class="control-label col-md-5"> 权证车辆数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
235   - <div class="col-md-4">
236   - <input type="text" class="form-control" name="warrantCar" id="warrantCarInput" placeholder="权证车辆数">
237   - </div>
238   - </div>
239   - <!-- 权证车辆数 END -->
240   - </div>
241   - <!-- 表单分组组件 form-group END -->
  202 +
242 203 <!-- 表单分组组件 form-group START -->
243 204 <div class="form-group">
244 205 <!-- 起始站名称 START (该字段值会在规划线路站点操作时会去验证是否有值。如果为空,则用线路规划站点的起点站。默认使用该字段填写值) -->
... ... @@ -329,20 +290,14 @@
329 290 </div>
330 291 <!-- 线路规划类型 (* 必填项) END -->
331 292  
332   - <!--大间隔等级 START -->
  293 + <!-- 开辟日期 START -->
333 294 <div class="col-md-6">
334   - <label class="control-label col-md-5"> 大间隔等级&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
  295 + <label class="control-label col-md-5"> 开辟日期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
335 296 <div class="col-md-4">
336   - <select name="spacGrade" class="form-control" id="spacGradeSelect">
337   - <option value="">-- 请选择大间隔等级 --</option>
338   - <option value="1">一级</option>
339   - <option value="2">二级</option>
340   - <option value="3">三级</option>
341   - <option value="4">四级</option>
342   - </select>
  297 + <input type="text" class="form-control" name="openDate" id="openDateInput" placeholder="开辟日期">
343 298 </div>
344 299 </div>
345   - <!-- 大间隔等级END -->
  300 + <!-- 开辟日期 END -->
346 301 </div>
347 302 <!-- 表单分组组件 form-group START -->
348 303  
... ... @@ -444,15 +399,6 @@
444 399 </div>
445 400 </div>
446 401 <!-- 空调车辆数 END -->
447   -
448   - <!-- 开辟日期 START -->
449   - <div class="col-md-6">
450   - <label class="control-label col-md-5"> 开辟日期&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
451   - <div class="col-md-4">
452   - <input type="text" class="form-control" name="openDate" id="openDateInput" placeholder="开辟日期">
453   - </div>
454   - </div>
455   - <!-- 开辟日期 END -->
456 402 </div>
457 403 <!-- 表单分组组件 form-group END -->
458 404  
... ...
src/main/resources/static/pages/base/line/editRoute.html 0 → 100644
  1 +<!-- 手动添加站点 -->
  2 +<div class="modal fade" id="edit_route_mobal" tabindex="-1" role="basic" aria-hidden="true">
  3 +
  4 + <div class="modal-dialog">
  5 +
  6 + <div class="modal-content">
  7 +
  8 + <div class="modal-header">
  9 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
  10 + <h4 class="modal-title">生成路线(站点和路段)</h4>
  11 + </div>
  12 +
  13 + <div class="modal-body">
  14 +
  15 + <form class="form-horizontal" role="form" id="save_route_template_form" action="" method="">
  16 +
  17 + <div class="alert alert-danger display-hide"> <button class="close" data-close="alert"></button>
  18 + 您的输入有误,请检查下面的输入项
  19 + </div>
  20 +
  21 + <!-- 站点名称 -->
  22 + <div class="form-body">
  23 +
  24 + <div class="form-group">
  25 + <label class="control-label col-md-2">
  26 + <span class="required"> * </span> 坐标:
  27 + </label>
  28 + <div class="col-md-10">
  29 + <textarea class="form-control" rows="12" name="points" id="pointInput" placeholder="坐标点"></textarea>
  30 + </div>
  31 + </div>
  32 + </div>
  33 + <div class="form-group">
  34 + <label class="col-md-3 control-label">选择方向:</label>
  35 + <div class="col-md-9">
  36 + <div class="icheck-list">
  37 + <label>
  38 + <input type="radio" class="icheck" name="dirCheck" value='0' checked> 上行
  39 + </label>
  40 + <label>
  41 + <input type="radio" class="icheck" name="dirCheck" value='1' > 下行
  42 + </label>
  43 + </div>
  44 + </div>
  45 + </div>
  46 + <div class="form-group">
  47 + <div class="alert alert-info font-blue-chambray" style="background-color: #2C3E50">
  48 + <h5 class="block"><span class="help-block" style="color:#1bbc9b;"> * 坐标生成路线规划说明: </span></h5>
  49 + <p>
  50 + <span class="help-block" style="color:#1bbc9b;">
  51 + &nbsp;请在文本域中按顺序依次输坐标点(如果是站点,请将在坐标后面用【Tab】键隔开后加(站点名/stop);没有(站点名/stop)默认是路段点),每输入完一个坐标时请按回车键【Enter】换行.
  52 + 例如:<br>
  53 + 121.715623 31.224058 042408.000<br>
  54 + 121.715623 31.224065 042409.000 Stop<br>
  55 + 121.715623 31.224065 042410.000<br>
  56 + </span>
  57 + </p>
  58 + </div>
  59 + </div>
  60 + </form>
  61 + </div>
  62 + <div class="modal-footer">
  63 + <button type="button" class="btn default" data-dismiss="modal" id="addMobalHiden">取消</button>
  64 + <button type="button" class="btn btn-primary" id="templateSaveData">提交数据</button>
  65 + </div>
  66 + </div>
  67 + </div>
  68 +</div>
  69 +<script type="text/javascript">
  70 +
  71 +$('#edit_route_mobal').on('editRouteMobal.show', function(e,transGPS,editRoute,map,dra,ajaxd,fun){
  72 + // 延迟加载显示mobal
  73 + setTimeout(function(){$('#edit_route_mobal').modal({show : true,backdrop: 'static', keyboard: false});},200);
  74 + // 获取表单元素
  75 + var form = $('#save_route_template_form');
  76 +
  77 + // 获取错误提示信息元素
  78 + var error = $('.alert-danger', form);
  79 +
  80 + // 提交数据点击事件
  81 + $('.modal-footer #templateSaveData').on('click',function() {
  82 + form.submit();
  83 + });
  84 + // 表单验证
  85 + form.validate({
  86 +
  87 + errorElement : 'span',
  88 +
  89 + errorClass : 'help-block help-block-error',
  90 +
  91 + focusInvalid : false,
  92 +
  93 + rules : {
  94 +
  95 + 'points' : {
  96 +
  97 + required : true,
  98 +
  99 + }
  100 +
  101 + },
  102 +
  103 + invalidHandler : function(event, validator) {
  104 +
  105 + error.show();
  106 +
  107 + App.scrollTo(error, -200);
  108 +
  109 + },
  110 +
  111 + highlight : function(element) {
  112 +
  113 + $(element).closest('.form-group').addClass('has-error');
  114 +
  115 + },
  116 +
  117 + unhighlight : function(element) {
  118 +
  119 + $(element).closest('.form-group').removeClass('has-error');
  120 +
  121 + },
  122 +
  123 + success : function(label) {
  124 +
  125 + label.closest('.form-group').removeClass('has-error');
  126 +
  127 + },
  128 + submitHandler : function(f) {
  129 + // 隐藏手动规划弹出层
  130 + $('#edit_route_mobal').modal('hide');
  131 + // 获取线路对象
  132 + var line = editRoute.getLineObj();
  133 + // 原坐标类型
  134 + var baseRes = "WGS84";
  135 + // 定义线路名称
  136 + var lineNameV = $('.portlet-title .caption').text();
  137 + var dirStr = '';
  138 + // 路线方向
  139 + var directionData = $("input[name='dirCheck']:checked").val();
  140 + editRoute.setLineDir(directionData);
  141 + // 弹出正在加载层
  142 + var i = layer.load(0,{offset:['200px', '280px']});
  143 + // 表单序列化
  144 + var paramsForm = form.serializeJSON();
  145 + // 切割坐标点
  146 + var array = paramsForm.points.split('\r\n');
  147 + // 把坐标点转换为站点或路段
  148 + var arrayFormat = inputStationValueFormat(array);
  149 + var stationList = arrayFormat.stationList;
  150 + var sectionListTemp = arrayFormat.sectionList;
  151 + var sectionList = [];
  152 + // 隔50个取一个点(相当于50s)
  153 + for(var i = 0; i*40 < sectionListTemp.length; i++) {
  154 + sectionList[i] = sectionListTemp[i*40];
  155 + }
  156 +
  157 + var sectionListFinal = [];
  158 + sectionListFinal.push({sectionName : lineNameV, points : sectionList});
  159 + // 根据站点名称获取百度坐标
  160 + map.stationsPointsToLibraryPoint(stationList,function(resultJson) {
  161 + // 根据坐标点获取两点之间的时间与距离
  162 + map.getDistanceAndDuration(resultJson,function(stationdataList) {
  163 + // 设置第一个站的距离
  164 + stationdataList[0].distance = '';
  165 + // 设置第一个站的时间
  166 + stationdataList[0].duration = '';
  167 + // 定义站点信息JSON字符串
  168 + var stationJSON = JSON.stringify(stationdataList);
  169 + // 参数集合
  170 + var params = {};
  171 + params.baseRes = baseRes;
  172 + // 是否添加该站点
  173 +
  174 + // 站点信息JSON字符串
  175 + params.stationJSON = stationJSON;
  176 + // 线路ID
  177 + params.lineId = line.id;
  178 + // 方向
  179 + params.directions = directionData;
  180 + // 原始坐标类型
  181 + params.dbType = 'b';
  182 + // 圆形半径
  183 + params.radius = '100';
  184 + // 限速
  185 + params.speedLimit = '60';
  186 + // 图形类型(r:圆形;p:多边形)
  187 + params.shapesType = 'r';
  188 + // destroy:是否撤销
  189 + params.destroy = '0';
  190 + // versions:版本号
  191 + params.versions = '1';
  192 + // 定义路段信息字符串
  193 + var sectionJSON = JSON.stringify(sectionListFinal);
  194 + // 路段信息JSON字符串
  195 + params.sectionJSON = sectionJSON;
  196 + addSave(params,line.id,directionData);
  197 + });
  198 +
  199 + });
  200 + },
  201 +
  202 + });
  203 +
  204 + function inputStationValueFormat(paramsStationsArray) {
  205 + var stationList = [];
  206 + var sectionList = [];
  207 + var routeList = {"stationList":stationList, "sectionList":sectionList};
  208 + var len = paramsStationsArray.length;
  209 + // 处理相同站点判断值
  210 + var isPush = true;
  211 + for(var k =0;k<len;k++) {
  212 + if(paramsStationsArray[k]=="")
  213 + continue;
  214 + var tempStr = paramsStationsArray[k].split('\t');
  215 + var tempPoint = transGpsLoc(tempStr[0],tempStr[1]);
  216 + var point = {lng:tempPoint.lng, lat:tempPoint.lat};
  217 + if(tempStr.length < 4){
  218 + sectionList[k] = point;
  219 + isPush = true;
  220 + }else {
  221 + if(isPush) {
  222 + sectionList[k] = point;
  223 + stationList.push({name:tempStr[3], potion:{lng:tempPoint.lng, lat:tempPoint.lat} , wgs:{x:tempStr[0], y:tempStr[1]}});
  224 + }
  225 + isPush = false;
  226 + }
  227 + }
  228 + for(var i = 0 ;i<sectionList.length;i++) {
  229 + if(sectionList[i] == "" || typeof(sectionList[i]) == "undefined" || sectionList[i] == null) {
  230 + sectionList.splice(i,1);
  231 + i= i-1;
  232 + }
  233 +
  234 + }
  235 + return routeList;
  236 + }
  237 +
  238 + function transGpsLoc(lng,lat) {
  239 + var bdLoc = transGPS.locationMake(lng, lat);
  240 + var gcjLoc = transGPS.transformFromWGSToGCJ(bdLoc);
  241 + var bdEn = transGPS.bd_encrypt(gcjLoc);
  242 + return bdEn;
  243 + }
  244 +
  245 + function addSave(params,lineid,directionData) {
  246 + // 保存
  247 + $post("/station/cacheSave",params,function(rd) {
  248 + // 关闭弹出层
  249 + layer.closeAll();
  250 + if(rd.status='SUCCESS') {
  251 + layer.msg('生成路线成功!');
  252 + var stationD = rd.stationData,isNullStr = '';
  253 + for(var t = 0 ;t<stationD.length;t++) {
  254 + if(stationD[t].potion.lat =='' || stationD[t].potion.lat ==null ||
  255 + stationD[t].potion.lng =='' || stationD[t].potion.lng ==null)
  256 + isNullStr = isNullStr + stationD[t].name + ' , ';
  257 + }
  258 + if(isNullStr!='') {
  259 + layer.open({
  260 + title: '提示',
  261 + content:'【' + isNullStr + '】' + '地址系统无法解析!,请手动调整位置!'
  262 + });
  263 + }
  264 + // 清除地图覆盖物
  265 + map.clearMarkAndOverlays();
  266 + // 查询路段信息
  267 + $get('/sectionroute/findSectionCache',{'line.id_eq' : lineid , 'directions_eq' : directionData},function(data) {
  268 + // 在地图上画出线路走向
  269 + fun.linePanlThree(lineid,data,directionData);
  270 + });
  271 + $('#cutSection').removeClass('hidden');
  272 + $('#Undo').removeClass('hidden');
  273 + $('#uploadRoute').addClass('hidden');
  274 + layer.msg('请先编辑路段,然后放大地图切点,不然数据可能会有误差!!!');
  275 + }else {
  276 + layer.msg('生成路线失败!');
  277 + }
  278 + });
  279 + }
  280 +});
  281 +</script>
0 282 \ No newline at end of file
... ...
src/main/resources/static/pages/base/line/editsection.html 0 → 100644
  1 +<!-- 编辑路段 -->
  2 +<div class="modal fade" id="edit_section_mobal_cache" role="basic" aria-hidden="true">
  3 + <div class="modal-dialog">
  4 + <div class="modal-content">
  5 + <div class="modal-header">
  6 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
  7 + <h4 class="modal-title">路段修改</h4>
  8 + </div>
  9 + <div class="modal-body">
  10 + <form class="form-horizontal" role="form" id="edit_section_form_cache" action="" method="post">
  11 + <div class="alert alert-danger display-hide"> <button class="close" data-close="alert"></button>
  12 + 您的输入有误,请检查下面的输入项
  13 + </div>
  14 + <!-- 线路ID -->
  15 + <input type="hidden" name="sectionId" id="sectionIdInput">
  16 + <input type="hidden" name="sectionRouteId" id="sectionRouteIdInput">
  17 + <input type="hidden" name="sectionRouteLine" id="sectionRouteLineInput">
  18 + <input type="hidden" name="lineCode" id="lineCodeInput">
  19 + <input type="hidden" name="bsectionVector" id="bsectionVectorInput" />
  20 + <input type="hidden" name="csectionVector" id="csectionVectorInput" value=""/>
  21 + <input type="hidden" name="dbType" id="dbTypeInput" value="b"/>
  22 + <input type="hidden" name="isRoadeSpeed" id="isRoadeSpeedInput"/>
  23 + <!-- 路段名称 -->
  24 + <div class="form-body">
  25 + <div class="form-group">
  26 + <label class="control-label col-md-3">
  27 + <span class="required"> * </span> 路段名称:
  28 + </label>
  29 + <div class="col-md-6">
  30 + <input type="text" class="form-control" name="sectionName" id="sectionNameInput" placeholder="路段名称">
  31 + </div>
  32 + </div>
  33 + </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 + <!-- 路段序号 -->
  46 + <div class="form-body">
  47 + <div class="form-group">
  48 + <label class="control-label col-md-3">
  49 + 上一路段:
  50 + </label>
  51 + <div class="col-md-6">
  52 + <select name="sectionrouteCode" class="form-control" id="sectionrouteCodeSelect" style="width:100%"></select>
  53 + <span class="help-block">说明:选择的路段将作为本站序号的参考,成为选择路段的下一个路段。 </span>
  54 + </div>
  55 + </div>
  56 + </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>
  141 + </form>
  142 + </div>
  143 + <div class="modal-footer">
  144 + <button type="button" class="btn default" data-dismiss="modal">取消</button>
  145 + <button type="button" class="btn btn-primary" id="editSectionCacheButton">提交数据</button>
  146 + </div>
  147 + </div>
  148 + </div>
  149 +</div>
  150 +<script type="text/javascript">
  151 +
  152 +$('#edit_section_mobal_cache').on('editSectionMobalCache_show', function(e, map_,ajaxd,section,fun){
  153 + var Section = section.getEitdSection();
  154 + fun.setSectionFormValue(Section);
  155 + // 方向
  156 + var dir = Section.sectionrouteDirections;
  157 + var lineId = Section.sectionrouteLine;
  158 + // 获取路段号元素,并添加下拉属性值
  159 + ajaxd.getStation(lineId,dir,function(treeData) {
  160 + var array = treeData[0].children[1].children,paramsD =new Array();
  161 + var eq_scetionRouteCode = Section.sectionrouteCode;
  162 + paramsD.push({'id':'请选择...','text':'请选择...'});
  163 + // 遍历.
  164 + $.each(array, function(i, g){
  165 + // 判断.
  166 + if(g.sectionName!='' || g.sectionName != null) {
  167 + var ptions_v = g.sectionrouteCode;
  168 + if(eq_scetionRouteCode != ptions_v){
  169 + // 添加拼音检索下拉框格式数据数组.
  170 + paramsD.push({'id':ptions_v,
  171 + 'text':g.sectionName + '(' + ptions_v + ')' + ' --' + fun.dirdmToName(g.sectionrouteDirections)});
  172 + }
  173 + }
  174 + });
  175 + // 初始化上一个路段拼音检索下拉框.
  176 + initPinYinSelect2($('#sectionrouteCodeSelect'),paramsD,function(selector) {
  177 + $('#sectionDirSelect').val('');// 设值方向.
  178 + ajaxd.findUpSectionRouteCode(lineId,dir,eq_scetionRouteCode,function(str) {
  179 + if(str.length>0){
  180 + var upStationRouteCode = str[0].sectionrouteCode;
  181 + $('#sectionrouteCodeSelect').select2('val',upStationRouteCode);
  182 + }else {
  183 + $('#sectionrouteCodeSelect').select2('val','请选择...');
  184 + }
  185 + });
  186 + });
  187 + });
  188 + // 显示mobal
  189 + $('#edit_section_mobal_cache').modal({show : true,backdrop: 'static',keyboard: false});
  190 + // 当调用 hide 实例方法时触发
  191 + $('#edit_section_mobal_cache').on('hide.bs.modal', function () {
  192 + closeMobleSetClean();
  193 + });
  194 + function closeMobleSetClean() {
  195 + // 清除地图覆盖物
  196 + map_.clearMarkAndOverlays();
  197 + /** 设置修改路段集合对象为空 */
  198 + section.setEitdSection({});
  199 + // fun.editAChangeCssRemoveDisabled();
  200 + $get('/sectionroute/findSectionCache',{'line.id_eq' : lineId , 'directions_eq' : dir},function(data) {
  201 + fun.linePanlThree(lineId,data,dir);
  202 + });
  203 + }
  204 +
  205 + // 编辑表单元素
  206 + var form = $('#edit_section_form_cache');
  207 + // 获取错误提示元素
  208 + var error = $('.alert-danger', form);
  209 + // 提交数据按钮事件
  210 + $('#editSectionCacheButton').on('click', function() {
  211 + // 表单提交
  212 + form.submit();
  213 + });
  214 + // 表单验证
  215 + form.validate({
  216 + errorElement : 'span',
  217 + errorClass : 'help-block help-block-error',
  218 + focusInvalid : false,
  219 + rules : {
  220 + 'sectionName' : {required : true,maxlength:50},// 路段名称 必填项
  221 + 'sectionCode': {required : true,},// 路段编码 必填项
  222 + 'directions' : {required : true,},// 路段方向 必填项
  223 + 'speedLimit' : {required : true,number : true},// 路段限速 必须输入合法的数字(负数,小数)。
  224 + 'destroy' : {required : true,},// 是否撤销 必填项.
  225 + 'roadCoding' : {number : true},// 道路编码 必须输入合法的数字(负数,小数)。
  226 + 'sectionTime' : {number : true},// 路段时长 必须输入合法的数字(负数,小数)。
  227 + 'sectionDistance' : {number : true},// 路段长度 必须输入合法的数字(负数,小数)。
  228 + 'descriptions' : {maxlength: 150}// 描述与说明 最大长度.
  229 + },
  230 + invalidHandler : function(event, validator) {
  231 + error.show();
  232 + App.scrollTo(error, -200);
  233 + },
  234 + highlight : function(element) {
  235 + $(element).closest('.form-group').addClass('has-error');
  236 + },
  237 + unhighlight : function(element) {
  238 + $(element).closest('.form-group').removeClass('has-error');
  239 + },
  240 + success : function(label) {
  241 + label.closest('.form-group').removeClass('has-error');
  242 + },
  243 + submitHandler : function(f) {
  244 + var params = form.serializeJSON();
  245 + error.hide();
  246 + if(params.sectionrouteCode=='请选择...') {
  247 + params.sectionrouteCode='';
  248 + }
  249 + $post('/section/sectionCacheUpdate',params,function(resuntDate) {
  250 + if(resuntDate.status=='SUCCESS') {
  251 + // 弹出添加成功提示消息
  252 + layer.msg('修改成功...');
  253 + }else {
  254 + // 弹出添加失败提示消息
  255 + layer.msg('修改失败...');
  256 + }
  257 + $('#edit_section_mobal_cache').modal('hide');
  258 + closeMobleSetClean();
  259 + });
  260 + }
  261 + });
  262 +});
  263 +</script>
0 264 \ No newline at end of file
... ...
src/main/resources/static/pages/base/line/js/editRoute.js 0 → 100644
  1 +/** 生成路线类 */
  2 +var EditRoute = function(){
  3 +
  4 + var line={};
  5 +
  6 + /** 定义修改线路对象 */
  7 +
  8 + var editRoute = {
  9 + getLineObj : function() {
  10 + return line;
  11 + },
  12 + setLineId : function(id) {
  13 + line.id = id;
  14 + },
  15 + setLineDir : function(dir) {
  16 +
  17 + line.dir = dir;
  18 + },
  19 + };
  20 +
  21 + return editRoute;
  22 +}();
... ...
src/main/resources/static/pages/base/line/js/line-add-form.js
... ... @@ -94,7 +94,7 @@ $(function(){
94 94 // 需要验证的表单元素
95 95 rules : {
96 96 'name' : {required : true,maxlength: 30},// 线路名称 必填项、 最大长度.
97   - 'lineCode' : {required : true,maxlength: 30},// 线路编码 必填项、最大长度.
  97 + 'lineCode' : {required : true,maxlength: 6},// 线路编码 必填项、最大长度.
98 98 'company' : {required : true,maxlength: 30},// 所属公司 必填项、最大长度.
99 99 'brancheCompany' : {required : true,maxlength: 30},// 所属分公司 必填项、最大长度.
100 100 'level' : {required : true,maxlength: 30},// 线路等级 必填项、最大长度.
... ... @@ -116,7 +116,6 @@ $(function(){
116 116 'carSumNumber' : {number : true,digits : true,maxlength: 8},// 车辆总数 必须输入合法的数字(负数,小数)。必须输入整数。最大长度.
117 117 'hvacCarNumber' : {number : true,digits : true,maxlength: 8},// 空调车辆数 必须输入合法的数字(负数,小数)。 必须输入整数。 最大长度.
118 118 'ordCarNumber' : {number : true,digits : true,maxlength: 8},// 普通车辆数 必须输入合法的数字(负数,小数)。 必须输入整数。最大长度.
119   - 'warrantCar' : {number : true,digits : true,maxlength: 8},
120 119 'history' : {maxlength: 200},// 线路沿革 输入长度最多是 200 的字符串(汉字算一个字符)。
121 120 'descriptions' : {maxlength: 200}// 描述/说明 输入长度最多是 200 的字符串(汉字算一个字符)。
122 121 },
... ...
src/main/resources/static/pages/base/line/js/line-edit-form.js
... ... @@ -149,7 +149,7 @@
149 149 // 需要验证的表单元素
150 150 rules : {
151 151 'name' : {required : true,maxlength: 30},// 线路名称 必填项、 最大长度.
152   - 'lineCode' : {required : true,maxlength: 30},// 线路编码 必填项、最大长度.
  152 + 'lineCode' : {required : true,maxlength: 6},// 线路编码 必填项、最大长度.
153 153 'company' : {required : true,maxlength: 30},// 所属公司 必填项、最大长度.
154 154 'brancheCompany' : {required : true,maxlength: 30},// 所属分公司 必填项、最大长度.
155 155 'level' : {required : true,maxlength: 30},// 线路等级 必填项、最大长度.
... ... @@ -171,7 +171,6 @@
171 171 'carSumNumber' : {number : true,digits : true,maxlength: 8},// 车辆总数 必须输入合法的数字(负数,小数)。必须输入整数。最大长度.
172 172 'hvacCarNumber' : {number : true,digits : true,maxlength: 8},// 空调车辆数 必须输入合法的数字(负数,小数)。 必须输入整数。 最大长度.
173 173 'ordCarNumber' : {number : true,digits : true,maxlength: 8},// 普通车辆数 必须输入合法的数字(负数,小数)。 必须输入整数。最大长度.
174   - 'warrantCar' : {number : true,digits : true,maxlength: 8},
175 174 'history' : {maxlength: 200},// 线路沿革 输入长度最多是 200 的字符串(汉字算一个字符)。
176 175 'descriptions' : {maxlength: 200}// 描述/说明 输入长度最多是 200 的字符串(汉字算一个字符)。
177 176 },
... ...
src/main/resources/static/pages/base/line/js/line-list-function.js 0 → 100644
  1 +var PublicFunctions = function () {
  2 + var PubFun = {
  3 + /** 初始化线路标题与ID */
  4 + setTiteText : function(lineId) {
  5 + // 根据线路ID获取线路名称
  6 + GetAjaxData.getIdLineName(lineId,function(data) {
  7 + // 定义线路名称
  8 + var lineNameV = data.name;
  9 + $('.portlet-title .caption').text(lineNameV);
  10 + });
  11 + },
  12 + setSectionFormValue : function(Section) {
  13 + $('#isRoadeSpeedInput').val(Section.isRoadeSpeed);
  14 + // 路段ID
  15 + $('#sectionIdInput').val(Section.sectionId);
  16 + // 路段路由ID
  17 + $('#sectionRouteIdInput').val(Section.sectionrouteId);
  18 + // 线路ID
  19 + $('#sectionRouteLineInput').val(Section.sectionrouteLine);
  20 + // 线路编码
  21 + $('#lineCodeInput').val(Section.sectionrouteLineCode);
  22 + // 折线坐标集合
  23 + $('#bsectionVectorInput').val(Section.sectionBsectionVector);
  24 + // 路段名称
  25 + $('#sectionNameInput').val(Section.sectionName);
  26 + // 路段编码
  27 + $('#sectionCodeInput').val(Section.sectionCode);
  28 + // 路段序号
  29 + $('#sectionrouteCodeSelect').val(Section.sectionrouteCode);
  30 + // 路段方向
  31 + $('#directionsSection').val(Section.sectionrouteDirections);
  32 + // 道路编码
  33 + $('#roadCodingCodInput').val(Section.sectionRoadCoding);
  34 + // 道路限速
  35 + $('#speedLimitInput').val(Section.sectionSpeedLimet);
  36 + // 路段长度
  37 + $('#sectionDistanceInput').val(Section.sectionDistance);
  38 + // 时长
  39 + $('#sectionTimeInput').val(Section.sectionTime);
  40 + // 版本号
  41 + $('#versionsInput').val(Section.versions);
  42 + // 是否撤销
  43 + $('#destroySelect').val(Section.destroy);
  44 + // 描述/说明
  45 + $('#descriptionsTextarea').val(Section.descriptions);
  46 + },
  47 + /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
  48 + linePanlThree : function(lineId,data,direction) {
  49 + /** 获取站点路由信息 @param:<Line.id:线路Id;0:上行> @return:<resultdata:站点路由数据> */
  50 + $get('/stationroute/getStationRouteCacheCenterPoints',{lineId:lineId,direction:direction},function(resultdata) {
  51 + WorldsBMapLine.clearMarkAndOverlays();
  52 + var polyline_center;
  53 + // 如果站点路由数据不为空
  54 + if(resultdata.length>0) {
  55 + var ceter_index = Math.floor(resultdata.length / 2);
  56 + var ceterPointsStr = resultdata[ceter_index].bJwpoints;
  57 + var ceterPointsArray = ceterPointsStr.split(' ');
  58 + polyline_center = new BMap.Point(ceterPointsArray[0],ceterPointsArray[1]);
  59 + // 遍历站点路由数据
  60 + for(var s = 0 ; s<resultdata.length;s++) {
  61 + // 中心点坐标字符串
  62 + var bJwpointsStr = resultdata[s].bJwpoints;
  63 + var stationName = resultdata[s].stationName;
  64 + // 起个中心点坐标字符串
  65 + var bJwpointsArray = bJwpointsStr.split(' ');
  66 + // 设置中心点
  67 + var point_center = new BMap.Point(bJwpointsArray[0],bJwpointsArray[1]);
  68 + /** 在地图上画点 @param:<point_center:中心坐标点> */
  69 + WorldsBMapLine.drawingUpStationPoint(point_center,stationName,s+1);
  70 + }
  71 +
  72 + }
  73 + // 路段数据长度
  74 + var dataLen = data.length;
  75 + //debugger;
  76 + // 如果大于零
  77 + if(dataLen>0) {
  78 + // 编辑路段数据
  79 + for(var d= 0; d<dataLen;d++){
  80 + // 地图折线坐标点集合
  81 + var polylineArray = [];
  82 + // 获取路段折线坐标字符串
  83 + var sectionBsectionVectorStr = data[d].sectionBsectionVector;
  84 + if(sectionBsectionVectorStr==null)
  85 + continue;
  86 + // 切割段折线坐标字符串
  87 + var tempStr = sectionBsectionVectorStr.substring(11,sectionBsectionVectorStr.length-1);
  88 + // 分割折线坐标字符串
  89 + var lineArray = tempStr.split(',');
  90 + for(var i = 0;i<lineArray.length;i++) {
  91 + polylineArray.push(new BMap.Point(lineArray[i].split(' ')[0],lineArray[i].split(' ')[1]));
  92 + }
  93 + /** 在地图上画出线路走向 @param:<polylineArray:地图折线坐标点集合;resultdata:站点路由数据> */
  94 + WorldsBMapLine.drawingUpline01(polylineArray,polyline_center,data[d]);
  95 + }
  96 + }
  97 + });
  98 + },
  99 + // 方向代码转名称.
  100 + dirdmToName : function(value){
  101 + var srStr = '';
  102 + if(value=='0')
  103 + srStr = '上行';
  104 + else if(value=='1')
  105 + srStr = '下行';
  106 + return srStr;
  107 + },
  108 +// editAChangeCssRemoveDisabled : function() {
  109 +// $('#downLine').removeClass('btn disabled');
  110 +// $('.btn-circle').removeClass('disabled');
  111 +// $('#upLine').removeClass('btn disabled');
  112 +// },
  113 + }
  114 + return PubFun ;
  115 +}();
0 116 \ No newline at end of file
... ...
src/main/resources/static/pages/base/line/js/line-list-map.js 0 → 100644
  1 +/**
  2 + * 百度地图
  3 + *
  4 + * - - - - - -》init:地图初始化
  5 + *
  6 + * - - - - - -》getDistanceAndDuration:获取距离与时间
  7 + *
  8 + * - - - - - -》drawingUpline:在地图上画出上行线路走向
  9 + *
  10 + * - - - - - -》stationsPointsToLibraryPoint:根据站点坐标匹配库中的公交站点(手动规划)
  11 + */
  12 +
  13 +var WorldsBMapLine = function () {
  14 +
  15 + /** WorldsBMapLine 全局变量定义 mapBValue:地图对象;polyUpline:走向折线;sectionList:截取过的路段 ;pointIndex:计算路段被切的次数;
  16 + * firstPoint:截取路段的第一个点;iseditStatus:路段是否在编辑状态;isCutSection : 获取路段是否在截取状态*/
  17 + var mapBValue = '', polyUpline='', sectionList = [], pointIndex = 0, iseditStatus = false, firstPoint = {}, isCutSection = false;
  18 +
  19 + var Bmap = {
  20 +
  21 + init : function() {
  22 +
  23 + // 设置中心点,
  24 + var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
  25 +
  26 + // 百度API Key
  27 + var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
  28 +
  29 + // 初始化百度地图
  30 + mapBValue = new BMap.Map("bmap_basic");
  31 +
  32 + //中心点和缩放级别
  33 + mapBValue.centerAndZoom(new BMap.Point(CENTER_POINT.lng,CENTER_POINT.lat), 15);
  34 +
  35 + //启用地图拖拽事件,默认启用(可不写)
  36 + mapBValue.enableDragging();
  37 +
  38 + //启用地图滚轮放大缩小
  39 + mapBValue.enableScrollWheelZoom();
  40 +
  41 + //禁用鼠标双击放大
  42 + mapBValue.disableDoubleClickZoom();
  43 +
  44 + //启用键盘上下左右键移动地图
  45 + mapBValue.enableKeyboard();
  46 +
  47 + return mapBValue;
  48 + },
  49 + /** 获取第一个切路段的点 @return Point*/
  50 + getFirstPoint : function() {
  51 + return firstPoint;
  52 + },
  53 + /** 获取地图对象 @return 地图对象map */
  54 + getmapBValue : function() {
  55 +
  56 + return mapBValue;
  57 +
  58 + },
  59 +
  60 + getPolyUpline : function() {
  61 +
  62 + return polyUpline;
  63 + },
  64 +
  65 + /** 获取截取过的路段 @return 路段对象List */
  66 + getSectionList : function() {
  67 +
  68 + return sectionList;
  69 +
  70 + },
  71 + setSectionList : function(list) {
  72 +
  73 + sectionList = list;
  74 + },
  75 + initCutSectionPoint : function() {
  76 + sectionList = [];
  77 + var tbodyHtml = template('section_list',{list : sectionList});
  78 + $('#section_table tbody').html(tbodyHtml);
  79 + },
  80 + /** 获取切路段的点下标 @return int*/
  81 + setPointIndex : function(index) {
  82 + pointIndex = index;
  83 + },
  84 + getPointIndex : function() {
  85 +
  86 + return pointIndex;
  87 +
  88 + },
  89 + /** 获取路段是否在编辑状态 @return boolean*/
  90 + getIsEditStatus : function() {
  91 + return iseditStatus;
  92 + },
  93 + setIsEditStatus : function(v) {
  94 + iseditStatus = v ;
  95 + },
  96 +
  97 + /** 获取路段是否在截取状态 @return boolean*/
  98 + getIsCutSection : function() {
  99 + return isCutSection;
  100 + },
  101 + setIsCutSection : function(v) {
  102 + isCutSection = v ;
  103 + },
  104 +
  105 + /** 获取距离与时间 @param <points:坐标点集合> */
  106 + getDistanceAndDuration : function(points,callback){
  107 +
  108 + // 获取长度
  109 + var len = points.length;
  110 + (function(){
  111 +
  112 + if (!arguments.callee.count) {
  113 +
  114 + arguments.callee.count = 0;
  115 +
  116 + }
  117 +
  118 + arguments.callee.count++;
  119 +
  120 + var index = parseInt(arguments.callee.count) - 1;
  121 +
  122 + if (index >= len-1) {
  123 +
  124 + callback && callback(points);
  125 +
  126 + return;
  127 + }
  128 +
  129 + // 当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。(当前正在执行的函数。)
  130 + var f = arguments.callee;
  131 + // 起点坐标 <坐标格式:40.056878,116.30815>
  132 + var origin = points[index].potion.lat + ',' + points[index].potion.lng;
  133 +
  134 + // 终点坐标 <坐标格式:40.056878,116.30815>
  135 + var destination = points[index+1].potion.lat + ',' + points[index+1].potion.lng;
  136 + var region = '上海';
  137 +
  138 + var origin_region = '上海';
  139 +
  140 + var destination_region = '上海';
  141 +
  142 + var output = 'json';
  143 +
  144 + var ak_My = 'wjlITmXeCek5MxyU3ZUBkTeU8B0o0npk';
  145 +
  146 + /**
  147 + * origin:起点名称或经纬度;
  148 + *
  149 + * destination:终点名称或经纬度;
  150 + *
  151 + * origin_region:起始点所在城市,驾车导航时必填。
  152 + *
  153 + * destination_region:终点所在城市,驾车导航时必填。
  154 + *
  155 + * output :表示输出类型,可设置为xml或json,默认为xml。
  156 + *
  157 + **/
  158 + var paramsB = {origin:origin,destination:destination,region:region,origin_region:origin_region,destination_region:destination_region,output:output,ak:ak_My};
  159 +
  160 + /** @description :未认证开发者默认配额为:2000次/天。 */
  161 + $.ajax({
  162 +
  163 + // 百度地图根据坐标获取两点之间的时间与距离
  164 + url: 'http://api.map.baidu.com/direction/v1?mode=transit',
  165 +
  166 + data: paramsB,
  167 +
  168 + dataType: 'jsonp',
  169 +
  170 + success: function(r){
  171 +
  172 + if(r) {
  173 +
  174 + if(r.message=='ok') {
  175 +
  176 + if(r.result.taxi==null) {
  177 +
  178 + // 获取距离(单位:米)
  179 + points[index+1].distance = 0;
  180 +
  181 + // 获取时间(单位:秒)
  182 + points[index+1].duration = 0;
  183 +
  184 + }else {
  185 +
  186 + // 获取距离(单位:米)
  187 + points[index+1].distance = r.result.taxi.distance;
  188 +
  189 + // 获取时间(单位:秒)
  190 + points[index+1].duration = r.result.taxi.duration;
  191 +
  192 + }
  193 +
  194 +
  195 + }
  196 +
  197 + }
  198 +
  199 + f();
  200 + }
  201 + });
  202 +
  203 + })();
  204 +
  205 + },
  206 + // 在地图上画出上行线路走向
  207 + drawingUpline01 : function (polylineArray,polyline_center,data) {
  208 + var polyUpline01 = 'polyline' + '_' + data.sectionrouteId;
  209 + // 创建线路走向
  210 + polyUpline01 = new BMap.Polyline(polylineArray, {strokeColor : "blue",strokeWeight : 6,strokeOpacity : 0.5});
  211 + polyUpline01.data = data;
  212 + // 把折线添加到地图上
  213 + mapBValue.addOverlay(polyUpline01);
  214 + var sectionPoint = [];
  215 + // 线路单击事件
  216 + polyUpline01.addEventListener('click',function(e) {
  217 + if(WorldsBMapLine.getIsEditStatus()) {
  218 + layer.msg('请先保存正在编辑的路段信息...');
  219 + return false;
  220 + }
  221 + if(WorldsBMapLine.getIsCutSection()) {
  222 + layer.msg('请先撤销所有切路段的点...');
  223 + return false;
  224 + }
  225 + polyUpline01.enableEditing();
  226 + WorldsBMapLine.setIsEditStatus(true);
  227 + });
  228 +
  229 + // 添加路段双击事件
  230 + polyUpline01.addEventListener("dblclick",function(e){
  231 + if(WorldsBMapLine.getIsCutSection()) {
  232 + layer.msg('请先撤销所有切路段的点...');
  233 + return false;
  234 + }
  235 + WorldsBMapLine.setIsEditStatus(false);
  236 + // 关闭
  237 + layer.closeAll();
  238 + polyUpline01.disableEditing();
  239 + EditSectionObj.setEitdSection(polyUpline01.data);
  240 + // 获取折线坐标集合
  241 + var editPloyLineArray = polyUpline01.getPath();
  242 + EditSectionObj.setEitdBsectionVector(JSON.stringify(editPloyLineArray));
  243 + sectionList = [];
  244 + var tbodyHtml = template('section_list',{list : sectionList});
  245 + // 截取路段
  246 + $('#section_table tbody').html(tbodyHtml);
  247 + // 加载修改路段弹出层mobal页面
  248 + $.get('editsection.html', function(m){
  249 + $(pjaxContainer).append(m);
  250 + $('#edit_section_mobal_cache').trigger('editSectionMobalCache_show', [WorldsBMapLine,GetAjaxData,EditSectionObj,PublicFunctions]);
  251 + });
  252 + });
  253 +
  254 + // 路段右击事件
  255 + var editSection = function(e,ee,marker){
  256 + if(WorldsBMapLine.getIsEditStatus()) {
  257 + layer.msg('请先保存正在编辑的路段信息...');
  258 + return false;
  259 + }
  260 + var lng = e.lng;
  261 + var lat = e.lat;
  262 + var sectionName = null;
  263 + var marker = new BMap.Marker(new BMap.Point(lng, lat)); // 创建点
  264 + marker.isFlag = true;
  265 + if(pointIndex == 0) {
  266 + sectionPoint[pointIndex] = {lng:lng , lat:lat};
  267 + layer.msg('进入切路段状态,请选择本路段的终点!');
  268 + mapBValue.addOverlay(marker);// 添加覆盖物
  269 + firstPoint = {lng:lng, lat:lat};
  270 + pointIndex++;
  271 + EditSectionObj.setEitdSection(polyUpline01.data);
  272 + // 获取折线坐标集合
  273 + var editPloyLineArray = polyUpline01.getPath();
  274 + EditSectionObj.setEitdBsectionVector(JSON.stringify(editPloyLineArray));
  275 + } else if (pointIndex > 0) {
  276 + layer.prompt({title: '请输入路段名!'}, function(sectionName, index){
  277 + pointList = [];
  278 + sectionPoint[pointIndex] = {lng:lng , lat:lat};
  279 + pointList[0] = sectionPoint[pointIndex-1];
  280 + pointList[1] = sectionPoint[pointIndex];
  281 + sectionList.push({name:sectionName, section:pointList});
  282 + layer.close(index);
  283 + layer.msg('路段截取成功,请选择下一个路段的终点');
  284 + mapBValue.addOverlay(marker);// 添加覆盖物
  285 + var tbodyHtml = template('section_list',{list : sectionList});
  286 + // 截取路段
  287 + $('#section_table tbody').html(tbodyHtml);
  288 + pointIndex++;
  289 + });
  290 + }
  291 + WorldsBMapLine.setIsCutSection(true);
  292 + }
  293 + var markerMenu=new BMap.ContextMenu();
  294 + markerMenu.addItem(new BMap.MenuItem('切路段',editSection.bind(polyUpline01)));
  295 + polyUpline01.addContextMenu(markerMenu);
  296 +
  297 +
  298 + var PanOptions_ ={noAnimation :true};
  299 + mapBValue.reset();
  300 + mapBValue.panTo(polyline_center,PanOptions_);
  301 + mapBValue.panBy(500,-510,PanOptions_);
  302 + mapBValue.setZoom(14);
  303 + },
  304 + // 删除点刷新cutSectionTable
  305 + refreshCutSectionTable : function() {
  306 + var tbodyHtml = template('section_list',{list : sectionList});
  307 + $('#section_table tbody').html(tbodyHtml);
  308 + },
  309 + // 删除点刷新覆盖物
  310 + deleteCutSectionPoint : function(point) {
  311 + var lng = point.lng;
  312 + var lat = point.lat;
  313 + var allOverlay = mapBValue.getOverlays();
  314 + // 删除最后一个点
  315 + for (var i = 0; i < allOverlay.length -1; i++){
  316 + if(allOverlay[i].isFlag) {
  317 + if(allOverlay[i].point.lng == lng && allOverlay[i].point.lat == lat){
  318 + mapBValue.removeOverlay(allOverlay[i]);
  319 + break;
  320 + }
  321 + }
  322 + }
  323 + },
  324 + /** 在地图上画点 @param:<point_center:中心坐标点> */
  325 + drawingUpStationPoint : function(point_center,stationName,s) {
  326 +
  327 + // 自定义标注物图片
  328 + var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/gjzd.png',new BMap.Size(10, 10));
  329 +
  330 + var html2 = '<div style="position: absolute; margin: 0pt; padding: 0pt; width: 160px; height: 26px; left: -10px; top: -35px; overflow: hidden;">'
  331 + + '<img class="rm3_image" style="border:none;left:0px; top:0px; position:absolute;" src="/pages/base/stationroute/css/img/back160.png">'
  332 + + '</div>'
  333 + + '<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>';
  334 +
  335 +
  336 + var myRichMarker1 = new BMapLib.RichMarker(html2, point_center,{
  337 + "anchor" : new BMap.Size(-10,8),
  338 + "enableDragging" : true});
  339 +
  340 +
  341 + myRichMarker1.disableDragging();
  342 + mapBValue.addOverlay(myRichMarker1);
  343 +
  344 +
  345 + // 创建标注物
  346 + marker = new BMap.Marker(point_center,{icon : icon_target});
  347 +
  348 + // 允许覆盖物在map.clearOverlays方法中被清除。
  349 + marker.enableMassClear();
  350 +
  351 + mapBValue.addOverlay(marker);
  352 + },
  353 +
  354 + // 根据站点坐标匹配库中的公交站点(手动规划)
  355 + stationsPointsToLibraryPoint : function(arra,callback) {
  356 + // 获取长度
  357 + var len = arra.length;
  358 + var station = {};
  359 + var stationList = [];
  360 + (function(){
  361 + if (!arguments.callee.count) {
  362 + arguments.callee.count = 0;
  363 + }
  364 + arguments.callee.count++;
  365 + var index = parseInt(arguments.callee.count) - 1;
  366 + if (index >= len) {
  367 + callback && callback(stationList);
  368 + return ;
  369 + }
  370 + var f = arguments.callee;
  371 + station = arra[index];
  372 + if(arra[index].name!=''){
  373 +
  374 + $.get('/station/matchStation',station,function(resultStation) {
  375 + stationList.push({name:resultStation.name ,wgs:arra[index].wgs,potion:{lng:resultStation.potion_lng, lat:resultStation.potion_lat}, isHave:resultStation.isHave , id:resultStation.id});
  376 + f();
  377 + });
  378 + }else {
  379 + f();
  380 + }
  381 + })()
  382 + },
  383 + clearMarkAndOverlays : function() {
  384 +
  385 + // 清楚地图覆盖物
  386 + mapBValue.clearOverlays();
  387 +
  388 + mapBValue.removeOverlay();
  389 +
  390 + }
  391 +
  392 + }
  393 +
  394 + return Bmap;
  395 +
  396 +}();
0 397 \ No newline at end of file
... ...
src/main/resources/static/pages/base/line/js/line-list-table.js
... ... @@ -116,7 +116,7 @@
116 116 }
117 117 function getComp(cb) {
118 118 $.get('/user/companyData',null,function(rs) {
119   - return cb && cb(rs);
  119 + return cb && cb(rs);
120 120 });
121 121 }
122 122 function getParams() {
... ... @@ -330,4 +330,44 @@
330 330 });
331 331 }
332 332 });
  333 + /** 生成路线(路段和站点) */
  334 + $('#datatable_ajax_tools #editRoute').on('click', function() {
  335 + // 获取选中行.
  336 + var arrChk = $("input[type='checkbox']:checked");
  337 + var len = arrChk.length;
  338 + // 选中行ID与线路名称
  339 + var id = '', lineName = '';
  340 + if(len>1) {
  341 + // 弹出添加成功提示消息
  342 + layer.msg('存在多选,请只选中一行!');
  343 + return ;
  344 + }else if(len==0) {
  345 + // 弹出添加成功提示消息
  346 + layer.msg('请选中一条线路!');
  347 + return ;
  348 + }else {
  349 + id = arrChk.data('id');
  350 + /*$('#uploadRoute').on('click', function() {
  351 + EditRoute.setLineId(id);
  352 + EditRoute.setLineDir(direction);
  353 + $.get('editRoute.html', function(m){
  354 + $(pjaxContainer).append(m);
  355 + $('#edit_route_mobal').trigger('editRouteMobal.show',[TransGPS,EditRoute,WorldsBMapLine,DrawingManagerObj,GetAjaxData,PublicFunctions]);
  356 + });
  357 + // 更新section_table 和缓存中的一切过的点数
  358 + WorldsBMapLine.initCutSectionPoint();
  359 + WorldsBMapLine.setPointIndex(0);
  360 + });*/
  361 + // 设置路线的线路id
  362 + //var a = EditRoute.setLineId(id);
  363 + // 显示地图
  364 + /*var param = {};
  365 + var list = [1,2,3];
  366 + param.id = id;
  367 + param.list = list;
  368 +
  369 + $get('/pages/base/line/map.html',param);*/
  370 + window.location.href = "/pages/base/line/map.html?no="+id;
  371 + }
  372 + });
333 373 })();
334 374 \ No newline at end of file
... ...
src/main/resources/static/pages/base/line/js/transGPS.js 0 → 100644
  1 +/** 转换坐标点工具 */
  2 +var TransGPS = function () {
  3 +
  4 + var location = {lng:'', lat:''};
  5 +
  6 + var pi = 3.14159265358979324;
  7 +
  8 + var a = 6378245.0;
  9 + var ee = 0.00669342162296594323;
  10 +
  11 + var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  12 +
  13 + var transGPS = {
  14 + getLocation : function(){
  15 + return location;
  16 + },
  17 + locationMake : function(lng, lat) {
  18 + var loc = transGPS.getLocation();
  19 + loc.lng = lng;
  20 + loc.lat = lat;
  21 + return loc;
  22 + },
  23 + outOfChina : function(lat,lng) {
  24 + if (lng < 72.004 || lng > 137.8347)
  25 + return 1;
  26 + if (lat < 0.8293 || lat > 55.8271)
  27 + return 1;
  28 + return 0;
  29 + },
  30 + transformLat : function(x, y) {
  31 + var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(x > 0 ? x : -x);
  32 + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  33 + ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
  34 + ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
  35 + return ret;
  36 + },
  37 + transformlng : function(x, y) {
  38 + var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(x > 0 ? x : -x);
  39 + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  40 + ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
  41 + ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
  42 + return ret;
  43 + },
  44 + transformFromWGSToGCJ : function(wgLoc) {
  45 + var mgLoc = {};
  46 + if (1 == transGPS.outOfChina(wgLoc.lat, wgLoc.lng)) {
  47 + mgLoc = wgLoc;
  48 + return mgLoc;
  49 + }
  50 + var dLat = transGPS.transformLat(wgLoc.lng - 105.0, wgLoc.lat - 35.0);
  51 + var dlng = transGPS.transformlng(wgLoc.lng - 105.0, wgLoc.lat - 35.0);
  52 + var radLat = wgLoc.lat / 180.0 * pi;
  53 + var magic = Math.sin(radLat);
  54 + magic = 1 - ee * magic * magic;
  55 + var sqrtMagic = Math.sqrt(magic);
  56 + dLat = parseFloat((dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi));
  57 + dlng = parseFloat((dlng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi)) ;
  58 + mgLoc.lat = parseFloat(wgLoc.lat) + dLat;
  59 + mgLoc.lng = parseFloat(wgLoc.lng) + dlng;
  60 +
  61 + return mgLoc;
  62 + },
  63 + bd_encrypt : function(gcLoc) {
  64 + var x = gcLoc.lng, y = gcLoc.lat;
  65 + var z = Math.sqrt((x*x)+(y*y)) + 0.00002 * Math.sin((y * x_pi));
  66 + var theta = Math.atan2(y, x) + 0.000003 * Math.cos((x * x_pi));
  67 + var lng = (z*Math.cos(theta)+0.0065);
  68 + var lat = (z*Math.sin(theta)+0.006);
  69 + return transGPS.locationMake(lng, lat);
  70 + },
  71 + /*bd_decrypt : function(bdLoc) {
  72 + var x = bdLoc.lng - 0.0065, y = bdLoc.lat - 0.006;
  73 + var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
  74 + var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
  75 + return transGPS.locationMake(z * Math.cos(theta), z * Math.sin(theta));
  76 + }*/
  77 + }
  78 +
  79 + return transGPS;
  80 +
  81 +}();
... ...
src/main/resources/static/pages/base/line/list.html
... ... @@ -37,6 +37,9 @@
37 37 <li>
38 38 <a href="javascript:;" data-action="0" id="createUsingSingle" class="tool-action"> <i class="fa fa-file-zip-o"></i> 生成路单文件</a>
39 39 </li>
  40 + <li>
  41 + <a href="javascript:;" data-action="1" id="editRoute" class="tool-action"> <i class="fa fa-level-up"></i>上传GPS生成路线</a>
  42 + </li>
40 43 <!-- <li><a href="javascript:;" data-action="0" class="tool-action"> <i class="fa fa-print"></i> 打印
41 44 </a></li>
42 45 <li><a href="javascript:;" data-action="1" class="tool-action"> <i class="fa fa-copy"></i> 复制
... ... @@ -353,6 +356,5 @@
353 356 </tr>
354 357 {{/if}}
355 358 </script>
356   -<!-- <script src="/pages/base/line/js/tipso.js"></script> -->
357 359 <!-- 线路信息片段JS模块 -->
358 360 <script src="/pages/base/line/js/line-list-table.js"></script>
359 361 \ No newline at end of file
... ...
src/main/resources/static/pages/base/line/map.html 0 → 100644
  1 +< <link href="/pages/base/stationroute/css/bmap_base.css" rel="stylesheet" type="text/css" />
  2 +<div class="portlet-body">
  3 + <!-- 地图 -->
  4 + <div id="bmap_basic" class="bmaps"></div>
  5 + <!-- 右边添加栏 -->
  6 + <div class="portlet box protlet-box" style="top:20px;border-radius: 6px !important;box-shadow: 10px 10px 5px #888888;float:right;">
  7 + <div class="portlet-title" style="background-color:#12527f;">
  8 + <div class="caption">
  9 + <!-- 途径站点 -->
  10 + </div>
  11 + <div class="tools">
  12 + <a href="javascript:;" class="collapse" data-original-title="" title=""> </a>
  13 + </div>
  14 + </div>
  15 + <!-- 左边栏 -->
  16 + <div class="portlet-body" id="scrllmouseEvent" style="border: 1px solid rgb(255, 255, 255); display: block;min-height: 300px">
  17 + <div class="row">
  18 + <div class="portlet-body">
  19 + <div class="table-toolbar" style="text-align:center;">
  20 + <button class="btn btn-circle blue" id="uploadRoute" ><i class="fa fa-plus"></i> 生成路线 </button>
  21 + <button class="btn btn-circle blue hidden" id="cutSection"><i class="fa fa-level-up"></i> 提交路段</button>
  22 + <button class="btn btn-circle blue hidden" id="Undo"><i class="fa fa-remove"></i> 撤销切点</button>
  23 + </div>
  24 + <div class="portlet-body" >
  25 + <div class="defeat-scroll" style="height: auto;max-height: 400px;overflow-y:auto;">
  26 + <table class="table table-striped table-bordered table-hover table-checkable " id="section_table">
  27 + <thead>
  28 + <tr role="row" class="heading">
  29 + <th >截取路段</th>
  30 + </tr>
  31 + </thead>
  32 + <tbody ></tbody>
  33 + </table>
  34 + </div>
  35 + </div>
  36 + </div>
  37 + </div>
  38 + </div>
  39 + </div>
  40 +</div>
  41 +<script type="text/html" id="section_list">
  42 + {{each list as obj i }}
  43 + <tr>
  44 + <td style="vertical-align: middle;">
  45 + {{obj.name}}:[{{obj.section[0].lng}},{{obj.section[0].lat}}],[{{obj.section[1].lng}},{{obj.section[1].lat}}]
  46 + </td>
  47 + {{/each}}
  48 + {{if list.length == 0}}
  49 + <tr>
  50 + <td colspan=13><h6 class="muted">你还没有对路段进行截取</h6></td>
  51 + </tr>
  52 + {{/if}}
  53 +</script>
  54 +<!--上传GPS坐标生成路线监听事件 -->
  55 +<<script type="text/javascript">
  56 +$(function(){
  57 + // 关闭左侧栏
  58 + if (!$('body').hasClass('page-sidebar-closed')) {$('.menu-toggler.sidebar-toggler').click();}
  59 + // 线路id
  60 + var id = $.url().param('no');
  61 + // 方向 (0:上行;1:下行)默认上行
  62 + var direction = 0;
  63 + // 如果线路ID不为空
  64 + if(id) {
  65 + var styleOptions = {
  66 + strokeColor : "blue",//边线颜色。
  67 + fillColor : "blue",//填充颜色。当参数为空时,圆形将没有填充效果。
  68 + strokeWeight : 3,//边线的宽度,以像素为单位。
  69 + strokeOpacity : 0.8,//边线透明度,取值范围0 - 1。
  70 + fillOpacity : 0.6,//填充的透明度,取值范围0 - 1。
  71 + strokeStyle : 'solid' //边线的样式,solid或dashed。
  72 + };
  73 +
  74 + // 等候500毫秒执行
  75 + setTimeout(function(){
  76 +
  77 + /** 初始化线路标题 @param:<id:线路ID> */
  78 + PublicFunctions.setTiteText(id);
  79 +
  80 + /** 初始化地图对象map @return:Map对象 */
  81 + var map_ = WorldsBMapLine.init();
  82 +
  83 + /** 初始化绘图工具类 @param:<map_:map对象;styleOptions:绘图样式对象> @return:DrawingManager对象 */
  84 + DrawingManagerObj.init(map_,styleOptions);
  85 +
  86 + layer.msg('请生成路线!!!');
  87 +
  88 + },500);
  89 + }else {
  90 +
  91 + // 缺少ID
  92 + layer.confirm('【ID缺失,请点击返回,重新进行操作】', {btn : [ '返回' ],icon: 3, title:'提示' }, function(index){
  93 +
  94 + // 关闭提示弹出层
  95 + layer.close(index);
  96 +
  97 + // 返回线路list页面
  98 + loadPage('/pages/base/line/list.html');
  99 +
  100 + });
  101 +
  102 + }
  103 +
  104 + // 上传GPS坐标生成路线事件
  105 + $('#uploadRoute').on('click', function() {
  106 + EditRoute.setLineId(id);
  107 + EditRoute.setLineDir(direction);
  108 + $.get('editRoute.html', function(m){
  109 + $(pjaxContainer).append(m);
  110 + $('#edit_route_mobal').trigger('editRouteMobal.show',[TransGPS,EditRoute,WorldsBMapLine,DrawingManagerObj,GetAjaxData,PublicFunctions]);
  111 + });
  112 + // 更新section_table 和缓存中的一切过的点数
  113 + WorldsBMapLine.initCutSectionPoint();
  114 + WorldsBMapLine.setPointIndex(0);
  115 + });
  116 +
  117 + // 提交截取事件
  118 + $('#cutSection').on('click', function() {
  119 + layer.confirm('提交会把原有的站点和路段覆盖,您确定要提交吗?', {
  120 + btn: ['提交','取消'] //按钮
  121 + }, function(){
  122 + if(WorldsBMapLine.getPointIndex() > 0) {
  123 + var sectionList = WorldsBMapLine.getSectionList();
  124 + var data = {};
  125 + var section = EditSectionObj.getEitdSection();
  126 + var josnSectionList = JSON.stringify(sectionList);
  127 + section.cutSectionList = josnSectionList;
  128 + $.post('/section/sectionCut', section, function(resuntDate){
  129 + if(resuntDate.status=='SUCCESS') {
  130 + // 弹出添加成功提示消息
  131 + layer.msg('提交成功,跳转到线路详情页面!');
  132 + window.location.href = "/pages/base/stationroute/list.html?no="+id+","+EditRoute.getLineObj().dir;
  133 + WorldsBMapLine.initCutSectionPoint();
  134 + WorldsBMapLine.setPointIndex(0);
  135 + }else {
  136 + // 弹出添加失败提示消息
  137 + layer.msg('提交失败...');
  138 + }
  139 + });
  140 + } else {
  141 + layer.msg("请截取路段!!!");
  142 + }
  143 + });
  144 + });
  145 +
  146 + // 删除最后一个路段
  147 + $('#Undo').on('click', function() {
  148 + if(WorldsBMapLine.getPointIndex() > 1) {
  149 + // 点总数-1
  150 + var pointIndex = WorldsBMapLine.getPointIndex() - 1;
  151 + WorldsBMapLine.setPointIndex(pointIndex);
  152 + // 截取的路段list
  153 + var sectionList = WorldsBMapLine.getSectionList();
  154 + var sectionListLen = sectionList.length;
  155 + // 要删除的点
  156 + var point = sectionList[sectionListLen-1].section[1];
  157 + sectionList.splice(sectionListLen-1,1);
  158 + WorldsBMapLine.setSectionList(sectionList);
  159 + WorldsBMapLine.deleteCutSectionPoint(point);
  160 + WorldsBMapLine.refreshCutSectionTable();
  161 + } else if(WorldsBMapLine.getPointIndex() == 1 ) {
  162 + // 点总数-1
  163 + var pointIndex = WorldsBMapLine.getPointIndex() - 1;
  164 + WorldsBMapLine.setPointIndex(pointIndex);
  165 + var firstPoint = WorldsBMapLine.getFirstPoint();
  166 + WorldsBMapLine.deleteCutSectionPoint(firstPoint);
  167 + WorldsBMapLine.setIsCutSection(false);
  168 + } else {
  169 + layer.msg("没有截取路段,不可以删除!!!");
  170 + }
  171 + });
  172 +});
  173 +</script>
  174 +<!--编辑路线类 -->
  175 +<script src="/pages/base/line/js/editRoute.js"></script>
  176 + <!--坐标转换类 -->
  177 +<script src="/pages/base/line/js/transGPS.js"></script>
  178 +<!-- 地图类 -->
  179 +<script src="/pages/base/line/js/line-list-map.js"></script>
  180 +<!-- 函数与方法 -->
  181 +<script src="/pages/base/line/js/line-list-function.js"></script>
  182 +<!-- 修改路段对象类 -->
  183 +<script src="/pages/base/stationroute/js/editsection.js"></script>
  184 +<!-- 绘图类 -->
  185 +<script src="/pages/base/stationroute/js/drawingManager.js"></script>
  186 +<!-- ajax请求类 -->
  187 +<script src="/pages/base/stationroute/js/stationroute-ajax-getdata.js"></script>
0 188 \ No newline at end of file
... ...
src/main/resources/static/pages/base/stationroute/js/stationroute-list-reload.js
... ... @@ -9,7 +9,23 @@ $(function(){
9 9 // 关闭左侧栏
10 10 if (!$('body').hasClass('page-sidebar-closed')) {$('.menu-toggler.sidebar-toggler').click();}
11 11 // 获取参数线路ID
12   - var id = $.url().param('no');
  12 + var idAndDir = $.url().param('no');
  13 + var param = idAndDir.split(",");
  14 + var dir = 0, id;
  15 + if(param.length == 1){
  16 + id = param[0];
  17 + } else {
  18 + id = param[0];
  19 + dir = param[1];
  20 + }
  21 + if(dir==1) {
  22 + $('#stationUp').removeClass('active');
  23 + $('#stationUp').removeClass('in');
  24 + $('#stationUp').addClass('fade');
  25 + $('#stationDown').addClass('active in');
  26 + $('#upLine').parent().removeClass('active');
  27 + $('#downLine').parent().addClass('active');
  28 + }
13 29 // 如果线路ID不为空
14 30 if(id) {
15 31 var styleOptions = {
... ... @@ -39,13 +55,13 @@ $(function(){
39 55 /** 初始化上行树 @param:<Line.id:线路Id;0:上行> */
40 56 PublicFunctions.TreeUpOrDown(Line.id,'0');
41 57  
42   - /** 初始化下行树 @param:<Line.id:线路Id;0:下行> */
  58 + /** 初始化下行树 @param:<Line.id:线路Id;1:下行> */
43 59 PublicFunctions.TreeUpOrDown(Line.id,'1');
44 60  
45   - /** 查询路段信息 @param:<Line.id:线路Id;0:上行> @return:data:路段数据 */
46   - GetAjaxData.getSectionRouteInfo(Line.id,'0',function(data) {
  61 + /** 查询路段信息 @param:<Line.id:线路Id;dir:方向> @return:data:路段数据 */
  62 + GetAjaxData.getSectionRouteInfo(Line.id,dir,function(data) {
47 63 /** 在地图上画出线路走向 @param:<Line.id:线路Id;0:上行;data:路段数据> */
48   - PublicFunctions.linePanlThree(Line.id,data,'0');
  64 + PublicFunctions.linePanlThree(Line.id,data,dir);
49 65  
50 66 });
51 67  
... ...
src/main/resources/static/pages/excep/speedingListmh.html
... ... @@ -181,7 +181,7 @@ $(function(){
181 181  
182 182 var endTime = dateTime-week*24*3600*1000;//上周末、格式为时间戳。
183 183 var startTime = endTime-6*24*3600*1000;//上周一、格式为时间戳。
184   -
  184 + debugger;
185 185 var endDate = timeToData(endTime);
186 186 var startDate = timeToData(startTime);
187 187 //表单默认选择上周一到上周日的超速信息。
... ... @@ -210,7 +210,7 @@ $(function(){
210 210 var date = new Date(time);
211 211 var year = date.getFullYear();
212 212 var Month = date.getMonth()+1>10?date.getMonth()+1:"0"+(date.getMonth()+1);
213   - var Day = date.getDate()>10?date.getDate():"0"+date.getDate();
  213 + var Day = date.getDate()>9?date.getDate():"0"+date.getDate();
214 214 return year+"-"+Month+"-"+Day;
215 215 }
216 216  
... ...