Commit ec375259214b18c8bba1c519a84c8a159b40982a

Authored by 王通
1 parent 44c30450

1.百度地图key替换

2.区间子线路+线路文件、报站文件生成的完善,以及线调的处理变化
3.js打包兼容es6
Showing 35 changed files with 2287 additions and 2149 deletions
src/main/java/com/bsth/controller/directive/DirectiveController.java
1   -package com.bsth.controller.directive;
2   -
3   -import com.alibaba.fastjson.JSON;
4   -import com.alibaba.fastjson.JSONObject;
5   -import com.bsth.entity.directive.D80;
6   -import com.bsth.entity.directive.DC0_A3;
7   -import com.bsth.entity.sys.SysUser;
8   -import com.bsth.security.util.SecurityUtils;
9   -import com.bsth.service.directive.DirectiveService;
10   -import org.apache.commons.lang3.StringEscapeUtils;
11   -import org.springframework.beans.factory.annotation.Autowired;
12   -import org.springframework.web.bind.annotation.RequestMapping;
13   -import org.springframework.web.bind.annotation.RequestMethod;
14   -import org.springframework.web.bind.annotation.RequestParam;
15   -import org.springframework.web.bind.annotation.RestController;
16   -
17   -import java.util.List;
18   -import java.util.Map;
19   -
20   -/**
21   - *
22   - * @ClassName: DirectiveController
23   - * @Description: TODO(页面下发调度指令) .0
24   - * @author PanZhao
25   - * @date 2016年6月8日 上午9:34:51
26   - *
27   - */
28   -@RestController
29   -@RequestMapping("/directive")
30   -public class DirectiveController {
31   -
32   - @Autowired
33   - DirectiveService directiveService;
34   -
35   - /**
36   - *
37   - * @Title: send60
38   - * @Description: TODO(60协议短语下发)
39   - * @throws
40   - */
41   - @RequestMapping(value = "/phrase", method = RequestMethod.POST)
42   - public int send60Phrase(@RequestParam String nbbm, @RequestParam String text){
43   - SysUser user = SecurityUtils.getCurrentUser();
44   - return directiveService.send60Phrase(nbbm, text, user.getUserName());
45   - }
46   -
47   - /**
48   - *
49   - * @Title: send60Dispatch
50   - * @Description: TODO(班次信息下发)
51   - * @param @param id
52   - * @throws
53   - */
54   - @RequestMapping(value = "/dispatch", method = RequestMethod.POST)
55   - public int send60Dispatch(@RequestParam Long id){
56   - SysUser user = SecurityUtils.getCurrentUser();
57   - return directiveService.send60Dispatch(id, user.getUserName());
58   - }
59   -
60   - /**
61   - *
62   - * @Title: lineChange
63   - * @Description: TODO(切换线路)
64   - * @param @param nbbm 车辆内部编码
65   - * @param @param lineId 新线路编码
66   - * @throws
67   - */
68   - @RequestMapping(value = "/lineChnage", method = RequestMethod.POST)
69   - public int lineChange(@RequestParam String nbbm, @RequestParam String lineId){
70   - SysUser user = SecurityUtils.getCurrentUser();
71   - return directiveService.lineChange(nbbm, lineId, user.getUserName());
72   - }
73   -
74   - /**
75   - *
76   - * @Title: lineChangeByDevice
77   - * @Description: TODO(切换线路)
78   - * @param @param deviceId 设备编码
79   - * @param @param lineId 新线路编码
80   - * @throws
81   - */
82   - @RequestMapping(value = "/lineChangeByDevice", method = RequestMethod.POST)
83   - public int lineChangeByDevice(@RequestParam String deviceId, @RequestParam String lineId){
84   - SysUser user = SecurityUtils.getCurrentUser();
85   - return directiveService.lineChangeByDeviceId(deviceId, lineId, user.getUserName());
86   - }
87   -
88   - /**
89   - * 刷新线路文件
90   - * @param deviceId 设备号
91   - * @return
92   - */
93   - @RequestMapping(value = "/refreshLineFile", method = RequestMethod.POST)
94   - public int refreshLineFile(@RequestParam String deviceId){
95   - return directiveService.refreshLineFile(deviceId);
96   - }
97   -
98   - /**
99   - *
100   - * @Title: upDownChange
101   - * @Description: TODO(上下行切换)
102   - * @param @param nbbm 车辆内部编码
103   - * @param @param upDon
104   - * @throws
105   - */
106   - @RequestMapping(value = "/upDownChange", method = RequestMethod.POST)
107   - public int upDownChange(@RequestParam String nbbm, @RequestParam Integer upDown){
108   - SysUser user = SecurityUtils.getCurrentUser();
109   - return directiveService.send60Operation(nbbm, 0, upDown, user.getUserName());
110   - }
111   -
112   - /**
113   - *
114   - * @Title: upDownChange
115   - * @Description: TODO(状态切换,营运状态 和 上下行)
116   - * @param @param nbbm 车辆内部编码
117   - * @param @param upDon
118   - * @throws
119   - */
120   - @RequestMapping(value = "/stateChange", method = RequestMethod.POST)
121   - public int stateChange(@RequestParam String nbbm, @RequestParam Integer upDown, @RequestParam Integer state){
122   - SysUser user = SecurityUtils.getCurrentUser();
123   - return directiveService.send60Operation(nbbm, state, upDown, user.getUserName());
124   - }
125   -
126   - /**
127   - *
128   - * @Title: findNoCofm80
129   - * @Description: TODO(根据线路获取未确认的80驾驶员上报数据)
130   - * @throws
131   - */
132   - @RequestMapping(value = "/findNoCofm80", method = RequestMethod.GET)
133   - public Map<String, List<D80>> findNoCofm80(@RequestParam String lineCodes){
134   - return directiveService.findNoCofm80(lineCodes);
135   - }
136   -
137   - @RequestMapping(value = "/findAll80", method = RequestMethod.GET)
138   - public Map<String, Object> findAll80(@RequestParam Map<String, Object> map,
139   - @RequestParam(defaultValue = "0") int page,
140   - @RequestParam(defaultValue = "12") int size){
141   -
142   - return directiveService.findAll80(map, page,size);
143   - }
144   -
145   - /**
146   - *
147   - * @Title: reply80
148   - * @Description: TODO(回复80)
149   - * @param @param reply 0:同意 -1:不同意
150   - * @throws
151   - */
152   - @RequestMapping(value = "/reply80", method = RequestMethod.POST)
153   - public Map<String, Object> reply80(@RequestParam int id, @RequestParam int reply){
154   - return directiveService.reply80(id, reply);
155   - }
156   -
157   - /**
158   - *
159   - * @Title: findDirective
160   - * @Description: TODO(查询调度指令)
161   - * @param @param nbbm 车辆
162   - * @param @param dType 类型
163   - * @param @param page 页号
164   - * @param @param size 每页数量
165   - * @throws
166   - */
167   - @RequestMapping(value = "/list", method = RequestMethod.GET)
168   - public Map<String, Object> findDirective(String nbbms,@RequestParam int dType
169   - , @RequestParam(defaultValue = "0") int page,
170   - @RequestParam(defaultValue = "10") int size){
171   -
172   - return directiveService.findDirective(nbbms, dType, page, size);
173   - }
174   -
175   - @RequestMapping(value = "/c0a4", method = RequestMethod.POST)
176   - public Map<String, Object> c0a4(@RequestParam String nbbm){
177   - return directiveService.sendC0A4(nbbm);
178   - }
179   -
180   - @RequestMapping(value = "/c0a3", method = RequestMethod.POST)
181   - public int c0a3(String json){
182   - json = StringEscapeUtils.unescapeHtml4(json);
183   - DC0_A3 c0a3 = JSON.toJavaObject(JSONObject.parseObject(json), DC0_A3.class);
184   - return directiveService.sendC0A3(c0a3);
185   - }
186   -
187   - @RequestMapping(value = "/c0a5", method = RequestMethod.POST)
188   - public int c0a5(String json){
189   - json = StringEscapeUtils.unescapeHtml4(json);
190   - return directiveService.sendC0A5(json);
191   - }
192   -
193   - /**
194   - * 设备参数查询
195   - * @return
196   - */
197   - @RequestMapping(value = "/deviceCofigList", method = RequestMethod.GET)
198   - public Map<String, Object> deviceCofigList(
199   - @RequestParam Map<String, String> map,
200   - @RequestParam(defaultValue = "0") int page,
201   - @RequestParam(defaultValue = "10") int size){
202   - return directiveService.deviceCofigList(map, page, size);
203   - }
204   -}
  1 +package com.bsth.controller.directive;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.bsth.entity.directive.D80;
  6 +import com.bsth.entity.directive.DC0_A3;
  7 +import com.bsth.entity.sys.SysUser;
  8 +import com.bsth.security.util.SecurityUtils;
  9 +import com.bsth.service.directive.DirectiveService;
  10 +import org.apache.commons.lang3.StringEscapeUtils;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.web.bind.annotation.RequestMapping;
  13 +import org.springframework.web.bind.annotation.RequestMethod;
  14 +import org.springframework.web.bind.annotation.RequestParam;
  15 +import org.springframework.web.bind.annotation.RestController;
  16 +
  17 +import javax.servlet.http.HttpServletRequest;
  18 +import java.util.List;
  19 +import java.util.Map;
  20 +
  21 +/**
  22 + *
  23 + * @ClassName: DirectiveController
  24 + * @Description: TODO(页面下发调度指令) .0
  25 + * @author PanZhao
  26 + * @date 2016年6月8日 上午9:34:51
  27 + *
  28 + */
  29 +@RestController
  30 +@RequestMapping("/directive")
  31 +public class DirectiveController {
  32 +
  33 + @Autowired
  34 + DirectiveService directiveService;
  35 +
  36 + /**
  37 + *
  38 + * @Title: send60
  39 + * @Description: TODO(60协议短语下发)
  40 + * @throws
  41 + */
  42 + @RequestMapping(value = "/phrase", method = RequestMethod.POST)
  43 + public int send60Phrase(@RequestParam String nbbm, @RequestParam String text){
  44 + SysUser user = SecurityUtils.getCurrentUser();
  45 + return directiveService.send60Phrase(nbbm, text, user.getUserName());
  46 + }
  47 +
  48 + /**
  49 + *
  50 + * @Title: send60Dispatch
  51 + * @Description: TODO(班次信息下发)
  52 + * @param @param id
  53 + * @throws
  54 + */
  55 + @RequestMapping(value = "/dispatch", method = RequestMethod.POST)
  56 + public int send60Dispatch(@RequestParam Long id){
  57 + SysUser user = SecurityUtils.getCurrentUser();
  58 + return directiveService.send60Dispatch(id, user.getUserName());
  59 + }
  60 +
  61 + /**
  62 + *
  63 + * @Title: lineChange
  64 + * @Description: TODO(切换线路)
  65 + * @param @param nbbm 车辆内部编码
  66 + * @param @param lineId 新线路编码
  67 + * @throws
  68 + */
  69 + @RequestMapping(value = "/lineChnage", method = RequestMethod.POST)
  70 + public int lineChange(@RequestParam String nbbm, @RequestParam String lineId){
  71 + SysUser user = SecurityUtils.getCurrentUser();
  72 + return directiveService.lineChange(nbbm, lineId, user.getUserName());
  73 + }
  74 +
  75 + /**
  76 + *
  77 + * @Title: lineChangeByDevice
  78 + * @Description: TODO(切换线路)
  79 + * @param @param deviceId 设备编码
  80 + * @param @param lineId 新线路编码
  81 + * @throws
  82 + */
  83 + @RequestMapping(value = "/lineChangeByDevice", method = RequestMethod.POST)
  84 + public int lineChangeByDevice(@RequestParam String deviceId, @RequestParam String lineId, HttpServletRequest request){
  85 + SysUser user = SecurityUtils.getCurrentUser();
  86 + int seq = 0;
  87 + if (request.getParameter("seq") != null) {
  88 + seq = Integer.parseInt(request.getParameter("seq"));
  89 + }
  90 + return directiveService.lineChangeByDeviceId(deviceId, lineId, user.getUserName(), seq);
  91 + }
  92 +
  93 + /**
  94 + * 刷新线路文件
  95 + * @param deviceId 设备号
  96 + * @return
  97 + */
  98 + @RequestMapping(value = "/refreshLineFile", method = RequestMethod.POST)
  99 + public int refreshLineFile(@RequestParam String deviceId){
  100 + return directiveService.refreshLineFile(deviceId);
  101 + }
  102 +
  103 + /**
  104 + *
  105 + * @Title: upDownChange
  106 + * @Description: TODO(上下行切换)
  107 + * @param @param nbbm 车辆内部编码
  108 + * @param @param upDon
  109 + * @throws
  110 + */
  111 + @RequestMapping(value = "/upDownChange", method = RequestMethod.POST)
  112 + public int upDownChange(@RequestParam String nbbm, @RequestParam Integer upDown){
  113 + SysUser user = SecurityUtils.getCurrentUser();
  114 + return directiveService.send60Operation(nbbm, 0, upDown, user.getUserName());
  115 + }
  116 +
  117 + /**
  118 + *
  119 + * @Title: upDownChange
  120 + * @Description: TODO(状态切换,营运状态 和 上下行)
  121 + * @param @param nbbm 车辆内部编码
  122 + * @param @param upDon
  123 + * @throws
  124 + */
  125 + @RequestMapping(value = "/stateChange", method = RequestMethod.POST)
  126 + public int stateChange(@RequestParam String nbbm, @RequestParam Integer upDown, @RequestParam Integer state){
  127 + SysUser user = SecurityUtils.getCurrentUser();
  128 + return directiveService.send60Operation(nbbm, state, upDown, user.getUserName());
  129 + }
  130 +
  131 + /**
  132 + *
  133 + * @Title: findNoCofm80
  134 + * @Description: TODO(根据线路获取未确认的80驾驶员上报数据)
  135 + * @throws
  136 + */
  137 + @RequestMapping(value = "/findNoCofm80", method = RequestMethod.GET)
  138 + public Map<String, List<D80>> findNoCofm80(@RequestParam String lineCodes){
  139 + return directiveService.findNoCofm80(lineCodes);
  140 + }
  141 +
  142 + @RequestMapping(value = "/findAll80", method = RequestMethod.GET)
  143 + public Map<String, Object> findAll80(@RequestParam Map<String, Object> map,
  144 + @RequestParam(defaultValue = "0") int page,
  145 + @RequestParam(defaultValue = "12") int size){
  146 +
  147 + return directiveService.findAll80(map, page,size);
  148 + }
  149 +
  150 + /**
  151 + *
  152 + * @Title: reply80
  153 + * @Description: TODO(回复80)
  154 + * @param @param reply 0:同意 -1:不同意
  155 + * @throws
  156 + */
  157 + @RequestMapping(value = "/reply80", method = RequestMethod.POST)
  158 + public Map<String, Object> reply80(@RequestParam int id, @RequestParam int reply){
  159 + return directiveService.reply80(id, reply);
  160 + }
  161 +
  162 + /**
  163 + *
  164 + * @Title: findDirective
  165 + * @Description: TODO(查询调度指令)
  166 + * @param @param nbbm 车辆
  167 + * @param @param dType 类型
  168 + * @param @param page 页号
  169 + * @param @param size 每页数量
  170 + * @throws
  171 + */
  172 + @RequestMapping(value = "/list", method = RequestMethod.GET)
  173 + public Map<String, Object> findDirective(String nbbms,@RequestParam int dType
  174 + , @RequestParam(defaultValue = "0") int page,
  175 + @RequestParam(defaultValue = "10") int size){
  176 +
  177 + return directiveService.findDirective(nbbms, dType, page, size);
  178 + }
  179 +
  180 + @RequestMapping(value = "/c0a4", method = RequestMethod.POST)
  181 + public Map<String, Object> c0a4(@RequestParam String nbbm){
  182 + return directiveService.sendC0A4(nbbm);
  183 + }
  184 +
  185 + @RequestMapping(value = "/c0a3", method = RequestMethod.POST)
  186 + public int c0a3(String json){
  187 + json = StringEscapeUtils.unescapeHtml4(json);
  188 + DC0_A3 c0a3 = JSON.toJavaObject(JSONObject.parseObject(json), DC0_A3.class);
  189 + return directiveService.sendC0A3(c0a3);
  190 + }
  191 +
  192 + @RequestMapping(value = "/c0a5", method = RequestMethod.POST)
  193 + public int c0a5(String json){
  194 + json = StringEscapeUtils.unescapeHtml4(json);
  195 + return directiveService.sendC0A5(json);
  196 + }
  197 +
  198 + /**
  199 + * 设备参数查询
  200 + * @return
  201 + */
  202 + @RequestMapping(value = "/deviceCofigList", method = RequestMethod.GET)
  203 + public Map<String, Object> deviceCofigList(
  204 + @RequestParam Map<String, String> map,
  205 + @RequestParam(defaultValue = "0") int page,
  206 + @RequestParam(defaultValue = "10") int size){
  207 + return directiveService.deviceCofigList(map, page, size);
  208 + }
  209 +}
... ...
src/main/java/com/bsth/controller/realcontrol/AdminUtilsController.java
... ... @@ -4,6 +4,7 @@ import ch.qos.logback.classic.Level;
4 4 import ch.qos.logback.classic.LoggerContext;
5 5 import com.bsth.common.ResponseCode;
6 6 import com.bsth.data.BasicData;
  7 +import com.bsth.data.LineConfigData;
7 8 import com.bsth.data.SystemParamCache;
8 9 import com.bsth.data.directive.DayOfDirectives;
9 10 import com.bsth.data.directive.DirectivesPstThread;
... ... @@ -98,6 +99,9 @@ public class AdminUtilsController {
98 99 @Autowired
99 100 private SsoConfig ssoConfig;
100 101  
  102 + @Autowired
  103 + private LineConfigData lineConfigData;
  104 +
101 105 /**
102 106 * 出现重复班次的车辆
103 107 *
... ... @@ -312,6 +316,19 @@ public class AdminUtilsController {
312 316 return "error";
313 317 }
314 318  
  319 + @RequestMapping("/reload-line-config")
  320 + public String reloadLineConfig() {
  321 + Map<String, Object> result = new HashMap<>();
  322 + try {
  323 + lineConfigData.reload();
  324 + return "success";
  325 + } catch (Exception e) {
  326 + e.printStackTrace();
  327 + }
  328 +
  329 + return "error";
  330 + }
  331 +
315 332 @RequestMapping("/setInjectStr")
316 333 public String setInjectStr(@RequestParam String injectStr) {
317 334 Map<String, Object> result = new HashMap<>();
... ...
src/main/java/com/bsth/data/LineConfigData.java
1   -package com.bsth.data;
2   -
3   -import com.bsth.Application;
4   -import com.bsth.entity.Line;
5   -import com.bsth.entity.realcontrol.LineConfig;
6   -import com.bsth.entity.realcontrol.ScheduleRealInfo;
7   -import com.bsth.service.LineService;
8   -import com.bsth.service.realcontrol.LineConfigService;
9   -import org.slf4j.Logger;
10   -import org.slf4j.LoggerFactory;
11   -import org.springframework.beans.factory.annotation.Autowired;
12   -import org.springframework.boot.CommandLineRunner;
13   -import org.springframework.core.annotation.Order;
14   -import org.springframework.stereotype.Component;
15   -
16   -import java.util.*;
17   -import java.util.concurrent.TimeUnit;
18   -
19   -/**
20   - * @author PanZhao
21   - * @ClassName: LineConfigData
22   - * @Description: TODO(线路配置数据管理)
23   - * @date 2016年8月15日 下午2:50:19
24   - */
25   -@Component
26   -@Order(value = 2)
27   -public class LineConfigData implements CommandLineRunner {
28   -
29   - static Logger logger = LoggerFactory.getLogger(LineConfigData.class);
30   -
31   - // 线路编码和配置
32   - private Map<String, LineConfig> lineConfMap;
33   -
34   - @Autowired
35   - LineConfigService lineConfigService;
36   -
37   - @Autowired
38   - LineService lineService;
39   -
40   - //入库缓冲
41   - static LinkedList<LineConfig> saveBuffers = new LinkedList<>();
42   -
43   - @Autowired
44   - LineConfigPersistThread configPersistThread;
45   -
46   - @Override
47   - public void run(String... arg0) throws Exception {
48   - lineConfMap = new HashMap<>();
49   -
50   - Iterator<LineConfig> itr = lineConfigService.findAll().iterator();
51   - while (itr.hasNext())
52   - setBuffer(itr.next());
53   -
54   - //异步入库
55   - Application.mainServices.scheduleWithFixedDelay(configPersistThread, 60, 60, TimeUnit.SECONDS);
56   - }
57   -
58   - /**
59   - * 起点发出,应用缓冲区设置参数
60   - * @param sch
61   - * @param timestamp
62   - * @return
63   - */
64   - public long applyOut(ScheduleRealInfo sch, Long timestamp) {
65   - LineConfig config = lineConfMap.get(sch.getXlBm());
66   - int diff = sch.getXlDir().equals("0")?config.getUpOutDiff():config.getDownOutDiff();
67   - return timestamp - (diff * 1000);
68   - }
69   -
70   - /**
71   - * 终点到达,应用缓冲区设置参数
72   - * @param sch
73   - * @param timestamp
74   - * @return
75   - */
76   - public long applyIn(ScheduleRealInfo sch, Long timestamp){
77   - LineConfig config = lineConfMap.get(sch.getXlBm());
78   - int diff = sch.getXlDir().equals("0")?config.getUpInDiff():config.getDownInDiff();
79   - return timestamp + (diff * 1000);
80   - }
81   -
82   - @Component
83   - private static class LineConfigPersistThread extends Thread {
84   -
85   - @Autowired
86   - LineConfigService lineConfigService;
87   -
88   - @Override
89   - public void run() {
90   - LineConfig config;
91   - for (int i = 0; i < 800; i++) {
92   - config = saveBuffers.poll();
93   - if (config == null)
94   - break;
95   -
96   - try {
97   - lineConfigService.save(config);
98   - }catch (Exception e){
99   - logger.error("", e);
100   - }
101   - }
102   - }
103   - }
104   -
105   - public LineConfig get(String lineCode) {
106   - return lineConfMap.get(lineCode);
107   - }
108   -
109   - public Collection<LineConfig> getAll() {
110   - return lineConfMap.values();
111   - }
112   -
113   - public void set(LineConfig conf) {
114   - //lineConfigService.save(conf);
115   - saveBuffers.add(conf);
116   - setBuffer(conf);
117   - }
118   -
119   - public void setBuffer(LineConfig conf) {
120   - lineConfMap.put(conf.getLine().getLineCode(), conf);
121   - }
122   -
123   - /**
124   - * @Title: init
125   - * @Description: TODO(初始化配置信息)
126   - */
127   - public void init(String lineCode) throws Exception {
128   - LineConfig conf = new LineConfig();
129   - //线路
130   - Line line = lineService.findByLineCode(lineCode);
131   - if (null == line)
132   - throw new NullPointerException("异常的lineCode");
133   -
134   - conf.setReadReverse(true);
135   - conf.setLine(line);
136   - //开始运营时间
137   - conf.setStartOpt("02:00");
138   - //出场时间类型
139   - conf.setOutConfig(0);
140   - //调度指令模板
141   - conf.setSchDirectiveTemp("");
142   -
143   - //应急停靠默认值
144   - conf.setYjtkStart("00:00");
145   - conf.setYjtkEnd("23:59");
146   -
147   - set(conf);
148   - }
149   -}
  1 +package com.bsth.data;
  2 +
  3 +import com.bsth.Application;
  4 +import com.bsth.entity.Line;
  5 +import com.bsth.entity.realcontrol.LineConfig;
  6 +import com.bsth.entity.realcontrol.ScheduleRealInfo;
  7 +import com.bsth.service.LineService;
  8 +import com.bsth.service.realcontrol.LineConfigService;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.boot.CommandLineRunner;
  13 +import org.springframework.core.annotation.Order;
  14 +import org.springframework.stereotype.Component;
  15 +
  16 +import java.util.*;
  17 +import java.util.concurrent.TimeUnit;
  18 +
  19 +/**
  20 + * @author PanZhao
  21 + * @ClassName: LineConfigData
  22 + * @Description: TODO(线路配置数据管理)
  23 + * @date 2016年8月15日 下午2:50:19
  24 + */
  25 +@Component
  26 +@Order(value = 2)
  27 +public class LineConfigData implements CommandLineRunner {
  28 +
  29 + static Logger logger = LoggerFactory.getLogger(LineConfigData.class);
  30 +
  31 + // 线路编码和配置
  32 + private Map<String, LineConfig> lineConfMap;
  33 +
  34 + @Autowired
  35 + LineConfigService lineConfigService;
  36 +
  37 + @Autowired
  38 + LineService lineService;
  39 +
  40 + //入库缓冲
  41 + static LinkedList<LineConfig> saveBuffers = new LinkedList<>();
  42 +
  43 + @Autowired
  44 + LineConfigPersistThread configPersistThread;
  45 +
  46 + @Override
  47 + public void run(String... arg0) throws Exception {
  48 + lineConfMap = new HashMap<>();
  49 +
  50 + Iterator<LineConfig> itr = lineConfigService.findAll().iterator();
  51 + while (itr.hasNext())
  52 + setBuffer(itr.next());
  53 +
  54 + //异步入库
  55 + Application.mainServices.scheduleWithFixedDelay(configPersistThread, 60, 60, TimeUnit.SECONDS);
  56 + }
  57 +
  58 + /**
  59 + * 起点发出,应用缓冲区设置参数
  60 + * @param sch
  61 + * @param timestamp
  62 + * @return
  63 + */
  64 + public long applyOut(ScheduleRealInfo sch, Long timestamp) {
  65 + LineConfig config = lineConfMap.get(sch.getXlBm());
  66 + int diff = sch.getXlDir().equals("0")?config.getUpOutDiff():config.getDownOutDiff();
  67 + return timestamp - (diff * 1000);
  68 + }
  69 +
  70 + /**
  71 + * 终点到达,应用缓冲区设置参数
  72 + * @param sch
  73 + * @param timestamp
  74 + * @return
  75 + */
  76 + public long applyIn(ScheduleRealInfo sch, Long timestamp){
  77 + LineConfig config = lineConfMap.get(sch.getXlBm());
  78 + int diff = sch.getXlDir().equals("0")?config.getUpInDiff():config.getDownInDiff();
  79 + return timestamp + (diff * 1000);
  80 + }
  81 +
  82 + @Component
  83 + private static class LineConfigPersistThread extends Thread {
  84 +
  85 + @Autowired
  86 + LineConfigService lineConfigService;
  87 +
  88 + @Override
  89 + public void run() {
  90 + LineConfig config;
  91 + for (int i = 0; i < 800; i++) {
  92 + config = saveBuffers.poll();
  93 + if (config == null)
  94 + break;
  95 +
  96 + try {
  97 + lineConfigService.save(config);
  98 + }catch (Exception e){
  99 + logger.error("", e);
  100 + }
  101 + }
  102 + }
  103 + }
  104 +
  105 + public LineConfig get(String lineCode) {
  106 + return lineConfMap.get(lineCode);
  107 + }
  108 +
  109 + public Collection<LineConfig> getAll() {
  110 + return lineConfMap.values();
  111 + }
  112 +
  113 + public void set(LineConfig conf) {
  114 + //lineConfigService.save(conf);
  115 + saveBuffers.add(conf);
  116 + setBuffer(conf);
  117 + }
  118 +
  119 + public void setBuffer(LineConfig conf) {
  120 + lineConfMap.put(conf.getLine().getLineCode(), conf);
  121 + }
  122 +
  123 + /**
  124 + * @Title: init
  125 + * @Description: TODO(初始化配置信息)
  126 + */
  127 + public void init(String lineCode) throws Exception {
  128 + LineConfig conf = new LineConfig();
  129 + //线路
  130 + Line line = lineService.findByLineCode(lineCode);
  131 + if (null == line)
  132 + throw new NullPointerException("异常的lineCode");
  133 +
  134 + conf.setReadReverse(true);
  135 + conf.setLine(line);
  136 + //开始运营时间
  137 + conf.setStartOpt("02:00");
  138 + //出场时间类型
  139 + conf.setOutConfig(0);
  140 + //调度指令模板
  141 + conf.setSchDirectiveTemp("");
  142 +
  143 + //应急停靠默认值
  144 + conf.setYjtkStart("00:00");
  145 + conf.setYjtkEnd("23:59");
  146 +
  147 + set(conf);
  148 + }
  149 +
  150 + /**
  151 + * 重新从数据库加载
  152 + */
  153 + public void reload() {
  154 + Iterator<LineConfig> itr = lineConfigService.findAll().iterator();
  155 + while (itr.hasNext())
  156 + setBuffer(itr.next());
  157 + }
  158 +}
... ...
src/main/java/com/bsth/data/directive/DayOfDirectives.java
... ... @@ -142,10 +142,6 @@ public class DayOfDirectives {
142 142 logger.warn("64响应 data is null ,json: " + json);
143 143 else {
144 144 logger.info(d64.getDeviceId() + "_" + d64.getData().getLineId() + "响应:" + data.getShort("requestAck"));
145   - ScheduleRealInfo sch = d64.getSch();
146   - if (sch != null) {
147   - sch.setRegionSwitchState(1);
148   - }
149 145 /*d64.setRespAck(data.getShort("requestAck"));
150 146 // 持久化*/
151 147 //64 响应不入库了...
... ...
src/main/java/com/bsth/data/directive/DirectiveCreator.java
... ... @@ -136,7 +136,7 @@ public class DirectiveCreator {
136 136 return create64(deviceId, lineCode, t);
137 137 }*/
138 138  
139   - public D64 create64(String deviceId, String lineCode, ScheduleRealInfo sch, long t){
  139 + public D64 create64(String deviceId, String lineCode, long t, int seq){
140 140 D64 change = new D64();
141 141 D64Data data = new D64Data();
142 142 data.setCityCode(cityCode);
... ... @@ -145,20 +145,12 @@ public class DirectiveCreator {
145 145 //线路编码补满6位数
146 146 String lineCodeStr = padLeft(lineCode, 6, '0');
147 147 data.setLineId(lineCodeStr);
148   - int seq = 0;
149   - if (sch != null) {
150   - String regionId = sch.getLineRegion();
151   - if (StringUtils.hasText(regionId)) {
152   - seq = Integer.parseInt(regionId.split("_")[1]);
153   - }
154   - }
155 148 data.setSeq(seq);
156 149  
157 150 change.setDeviceId(deviceId);
158 151 change.setOperCode((short) 0X64);
159 152 change.setTimestamp(t);
160 153 change.setData(data);
161   - change.setSch(sch);
162 154  
163 155 return change;
164 156 }
... ... @@ -169,9 +161,10 @@ public class DirectiveCreator {
169 161 * @Description: TODO(线路刷新指令(用于切换线路后,要求设置重新下载线路文件))
170 162 * @param @param deviceId 设备编号
171 163 * @param @param lineId 线路ID
  164 + * @param seq 子线路
172 165 * @throws
173 166 */
174   - public String createDeviceRefreshData(String deviceId, String lineCode) {
  167 + public String createDeviceRefreshData(String deviceId, String lineCode, int seq) {
175 168 Long t = System.currentTimeMillis();
176 169 Map<String, Object> param = new HashMap<>();
177 170 param.put("deviceId", deviceId);
... ... @@ -189,7 +182,7 @@ public class DirectiveCreator {
189 182 String lineCodeStr = padLeft(lineCode, 6, '0');
190 183  
191 184 data.put("lineId", lineCodeStr);
192   - data.put("lineVersion", 0);
  185 + data.put("lineVersion", seq);
193 186 data.put("carparkDataVersion", 0);
194 187 param.put("data", data);
195 188  
... ...
src/main/java/com/bsth/data/forecast/ArrivalDataLoader.java
1   -package com.bsth.data.forecast;
2   -
3   -import com.bsth.data.BasicData;
4   -import com.bsth.data.LineConfigData;
5   -import com.bsth.data.forecast.entity.ArrivalEntity;
6   -import com.bsth.util.db.DBUtils_MS;
7   -import org.slf4j.Logger;
8   -import org.slf4j.LoggerFactory;
9   -import org.springframework.beans.factory.annotation.Autowired;
10   -import org.springframework.stereotype.Component;
11   -
12   -import java.sql.Connection;
13   -import java.sql.PreparedStatement;
14   -import java.sql.ResultSet;
15   -import java.sql.SQLException;
16   -import java.util.ArrayList;
17   -import java.util.Calendar;
18   -import java.util.List;
19   -
20   -/**
21   - *
22   - * @ClassName: DataLoader
23   - * @Description: TODO(从数据库加载进出站数据)
24   - * @author PanZhao
25   - * @date 2016年8月19日 上午9:59:21
26   - *
27   - */
28   -@Component
29   -public class ArrivalDataLoader {
30   -
31   - private static Long prveLoadTime;
32   -
33   - private final static long DAY_TIME = 1000 * 60 * 60 * 24;
34   -
35   - private Logger logger = LoggerFactory.getLogger(this.getClass());
36   -
37   - @Autowired
38   - LineConfigData lineConfigData;
39   -
40   - /**
41   - *
42   - * @Title: load
43   - * @Description: TODO(根据上次加载时间,查询之后的增量数据)
44   -
45   - public List<ArrivalEntity> load(){
46   - List<ArrivalEntity> list = null;
47   -
48   - if(null == prveLoadTime)
49   - list = recovery();
50   - else{
51   - Calendar cal = Calendar.getInstance();
52   - //周数,表分区字段
53   - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
54   -
55   - Connection conn = null;
56   - PreparedStatement ps = null;
57   - ResultSet rs = null;
58   -
59   - String sql = "select * from bsth_c_arrival_info where weeks_year=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by create_date";
60   - try{
61   - long t = System.currentTimeMillis();
62   -
63   - conn = DBUtils_MS.getConnection();
64   - ps = conn.prepareStatement(sql);
65   - ps.setInt(1, weeks_year);
66   - ps.setLong(2, prveLoadTime);
67   - ps.setLong(3, t);
68   - rs = ps.executeQuery();
69   -
70   - list = resultSet2Set(rs);
71   -
72   - prveLoadTime = t;
73   - }catch(Exception e){
74   - logger.error("", e);
75   - }finally {
76   - DBUtils_MS.close(rs, ps, conn);
77   - }
78   - }
79   - return list;
80   - }*/
81   -
82   - /**
83   - *
84   - * @Title: recovery
85   - * @Description: TODO(从数据库恢复数据,按照线路的开始运营时间恢复)
86   -
87   - public List<ArrivalEntity> recovery(){
88   - Collection<LineConfig> confs = lineConfigData.getAll();
89   - long t = System.currentTimeMillis()
90   - ,st;
91   -
92   - List<ArrivalEntity> all = new ArrayList<>();
93   - for(LineConfig conf : confs){
94   - st = conf.getCurrStartTime();
95   - if(t < st)
96   - st = st - DAY_TIME;
97   - try{
98   - all.addAll(loadByLineAndTime(conf.getLine().getLineCode(), st, t));
99   - }catch(Exception e){
100   - logger.error("", e);
101   - }
102   - }
103   -
104   - prveLoadTime = t;
105   - return all;
106   - }*/
107   -
108   - /**
109   - *
110   - * @Title: loadByLineAndStartTime
111   - * @Description: TODO(根据线路和时间戳加载数据)
112   - */
113   - public List<ArrivalEntity> loadByLineAndTime(String lineCode, long st, long et){
114   - Calendar cal = Calendar.getInstance();
115   - cal.setTimeInMillis(st);
116   - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
117   -
118   - Connection conn = null;
119   - PreparedStatement ps = null;
120   - ResultSet rs = null;
121   -
122   - List<ArrivalEntity> list = new ArrayList<>();
123   - String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts";
124   - try{
125   - conn = DBUtils_MS.getConnection();
126   - ps = conn.prepareStatement(sql);
127   - ps.setInt(1, weeks_year);
128   - ps.setString(2, lineCode);
129   - ps.setLong(3, st);
130   - ps.setLong(4, et);
131   - rs = ps.executeQuery();
132   -
133   - list = resultSet2Set(rs);
134   - }catch(Exception e){
135   - logger.error("", e);
136   - }finally {
137   - DBUtils_MS.close(rs, ps, conn);
138   - }
139   - return list;
140   - }
141   -
142   - /**
143   - *
144   - * @Title: loadByLineAndStartTime
145   - * @Description: TODO(根据线路,走向和时间戳加载数据)
146   - */
147   - public List<ArrivalEntity> loadByLineAndTime(String lineCode, int updown, long st, long et){
148   - Calendar cal = Calendar.getInstance();
149   - cal.setTimeInMillis(st);
150   - int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
151   -
152   - Connection conn = null;
153   - PreparedStatement ps = null;
154   - ResultSet rs = null;
155   -
156   - List<ArrivalEntity> list = new ArrayList<>();
157   - String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? and up_down=? and in_out=0 AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts";
158   - try{
159   - conn = DBUtils_MS.getConnection();
160   - ps = conn.prepareStatement(sql);
161   - ps.setInt(1, weeks_year);
162   - ps.setString(2, lineCode);
163   - ps.setInt(3, updown);
164   - ps.setLong(4, st);
165   - ps.setLong(5, et);
166   - rs = ps.executeQuery();
167   -
168   - list = resultSet2Set(rs);
169   - }catch(Exception e){
170   - logger.error("", e);
171   - }finally {
172   - DBUtils_MS.close(rs, ps, conn);
173   - }
174   - return list;
175   - }
176   -
177   - public List<ArrivalEntity> resultSet2Set(ResultSet rs) throws SQLException{
178   - List<ArrivalEntity> list = new ArrayList<>();
179   -
180   - ArrivalEntity arr;
181   - while(rs.next()){
182   - arr = new ArrivalEntity();
183   - arr.setDeviceId(rs.getString("device_id"));
184   - arr.setNbbm(BasicData.deviceId2NbbmMap.get(arr.getDeviceId()));
185   - if(null == arr.getNbbm()){
186   - logger.warn("未注册的设备号," + arr.getDeviceId());
187   - continue;
188   - }
189   -
190   - arr.setTs(rs.getLong("ts"));
191   - arr.setLineCode(rs.getString("line_id"));
192   - arr.setUpDown(rs.getInt("up_down"));
193   - arr.setStopNo(rs.getString("stop_no"));
194   - arr.setStopName(BasicData.stationCode2NameMap.get(arr.getStopNo()));
195   - arr.setInOut(rs.getInt("in_out"));
196   - arr.setCreateDate(rs.getLong("create_timestamp"));
197   - arr.setWeeksYear(rs.getInt("weeks_year"));
198   - arr.setEnable(true);
199   -
200   - list.add(arr);
201   - }
202   - return list;
203   - }
204   -
205   - public static void setPrveLoadTime(long t){
206   - prveLoadTime = t;
207   - }
208   -}
  1 +package com.bsth.data.forecast;
  2 +
  3 +import com.bsth.data.BasicData;
  4 +import com.bsth.data.LineConfigData;
  5 +import com.bsth.data.forecast.entity.ArrivalEntity;
  6 +import com.bsth.util.db.DBUtils_MS;
  7 +import org.joda.time.DateTime;
  8 +import org.slf4j.Logger;
  9 +import org.slf4j.LoggerFactory;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.stereotype.Component;
  12 +
  13 +import java.sql.Connection;
  14 +import java.sql.PreparedStatement;
  15 +import java.sql.ResultSet;
  16 +import java.sql.SQLException;
  17 +import java.util.ArrayList;
  18 +import java.util.Calendar;
  19 +import java.util.List;
  20 +
  21 +/**
  22 + *
  23 + * @ClassName: DataLoader
  24 + * @Description: TODO(从数据库加载进出站数据)
  25 + * @author PanZhao
  26 + * @date 2016年8月19日 上午9:59:21
  27 + *
  28 + */
  29 +@Component
  30 +public class ArrivalDataLoader {
  31 +
  32 + private static Long prveLoadTime;
  33 +
  34 + private final static long DAY_TIME = 1000 * 60 * 60 * 24;
  35 +
  36 + private Logger logger = LoggerFactory.getLogger(this.getClass());
  37 +
  38 + @Autowired
  39 + LineConfigData lineConfigData;
  40 +
  41 + /**
  42 + *
  43 + * @Title: load
  44 + * @Description: TODO(根据上次加载时间,查询之后的增量数据)
  45 +
  46 + public List<ArrivalEntity> load(){
  47 + List<ArrivalEntity> list = null;
  48 +
  49 + if(null == prveLoadTime)
  50 + list = recovery();
  51 + else{
  52 + Calendar cal = Calendar.getInstance();
  53 + //周数,表分区字段
  54 + int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
  55 +
  56 + Connection conn = null;
  57 + PreparedStatement ps = null;
  58 + ResultSet rs = null;
  59 +
  60 + String sql = "select * from bsth_c_arrival_info where weeks_year=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by create_date";
  61 + try{
  62 + long t = System.currentTimeMillis();
  63 +
  64 + conn = DBUtils_MS.getConnection();
  65 + ps = conn.prepareStatement(sql);
  66 + ps.setInt(1, weeks_year);
  67 + ps.setLong(2, prveLoadTime);
  68 + ps.setLong(3, t);
  69 + rs = ps.executeQuery();
  70 +
  71 + list = resultSet2Set(rs);
  72 +
  73 + prveLoadTime = t;
  74 + }catch(Exception e){
  75 + logger.error("", e);
  76 + }finally {
  77 + DBUtils_MS.close(rs, ps, conn);
  78 + }
  79 + }
  80 + return list;
  81 + }*/
  82 +
  83 + /**
  84 + *
  85 + * @Title: recovery
  86 + * @Description: TODO(从数据库恢复数据,按照线路的开始运营时间恢复)
  87 +
  88 + public List<ArrivalEntity> recovery(){
  89 + Collection<LineConfig> confs = lineConfigData.getAll();
  90 + long t = System.currentTimeMillis()
  91 + ,st;
  92 +
  93 + List<ArrivalEntity> all = new ArrayList<>();
  94 + for(LineConfig conf : confs){
  95 + st = conf.getCurrStartTime();
  96 + if(t < st)
  97 + st = st - DAY_TIME;
  98 + try{
  99 + all.addAll(loadByLineAndTime(conf.getLine().getLineCode(), st, t));
  100 + }catch(Exception e){
  101 + logger.error("", e);
  102 + }
  103 + }
  104 +
  105 + prveLoadTime = t;
  106 + return all;
  107 + }*/
  108 +
  109 + /**
  110 + *
  111 + * @Title: loadByLineAndStartTime
  112 + * @Description: TODO(根据线路和时间戳加载数据)
  113 + */
  114 + public List<ArrivalEntity> loadByLineAndTime(String lineCode, long st, long et){
  115 + Calendar cal = Calendar.getInstance();
  116 + cal.setTimeInMillis(st);
  117 + int weeks_year = cal.get(Calendar.WEEK_OF_YEAR);
  118 +
  119 + Connection conn = null;
  120 + PreparedStatement ps = null;
  121 + ResultSet rs = null;
  122 +
  123 + List<ArrivalEntity> list = new ArrayList<>();
  124 + String sql = "select * from bsth_c_arrival_info where weeks_year=? and line_id=? AND create_timestamp > ? AND create_timestamp <=? AND ABS(create_timestamp - ts) < 3600000 order by ts";
  125 + try{
  126 + conn = DBUtils_MS.getConnection();
  127 + ps = conn.prepareStatement(sql);
  128 + ps.setInt(1, weeks_year);
  129 + ps.setString(2, lineCode);
  130 + ps.setLong(3, st);
  131 + ps.setLong(4, et);
  132 + rs = ps.executeQuery();
  133 +
  134 + list = resultSet2Set(rs);
  135 + }catch(Exception e){
  136 + logger.error("", e);
  137 + }finally {
  138 + DBUtils_MS.close(rs, ps, conn);
  139 + }
  140 + return list;
  141 + }
  142 +
  143 + /**
  144 + *
  145 + * @Title: loadByLineAndStartTime
  146 + * @Description: TODO(根据线路,走向和时间戳加载数据)
  147 + */
  148 + public List<ArrivalEntity> loadByLineAndTime(String lineCode, int updown, long st, long et){
  149 + DateTime start = new DateTime(st), end = new DateTime(et);
  150 + if (start.getYear() != end.getYear()) {
  151 + throw new IllegalArgumentException("请选择同一年");
  152 + }
  153 + if (et - st > 14 * 24 * 60 * 60 * 1000) {
  154 + throw new IllegalArgumentException("时间区间过长");
  155 + }
  156 + Calendar cal = Calendar.getInstance();
  157 + cal.setTimeInMillis(st);
  158 + int weeksYear1 = cal.get(Calendar.WEEK_OF_YEAR), weeksYear2 = cal.get(Calendar.WEEK_OF_YEAR);
  159 +
  160 + Connection conn = null;
  161 + PreparedStatement ps = null;
  162 + ResultSet rs = null;
  163 +
  164 + List<ArrivalEntity> list = new ArrayList<>();
  165 + String sql = "select * from bsth_c_arrival_info_" + start.getYear() + " where weeks_year between ? and ? and line_id=? and up_down=? and in_out=0 AND create_timestamp BETWEEN ? AND ? AND ABS(create_timestamp - ts) < 3600000 order by ts";
  166 + try{
  167 + conn = DBUtils_MS.getConnection();
  168 + ps = conn.prepareStatement(sql);
  169 + ps.setInt(1, weeksYear1);
  170 + ps.setInt(2, weeksYear2);
  171 + ps.setString(3, lineCode);
  172 + ps.setInt(4, updown);
  173 + ps.setLong(5, st);
  174 + ps.setLong(6, et);
  175 + rs = ps.executeQuery();
  176 +
  177 + list = resultSet2Set(rs);
  178 + }catch(Exception e){
  179 + logger.error("", e);
  180 + }finally {
  181 + DBUtils_MS.close(rs, ps, conn);
  182 + }
  183 + return list;
  184 + }
  185 +
  186 + public List<ArrivalEntity> resultSet2Set(ResultSet rs) throws SQLException{
  187 + List<ArrivalEntity> list = new ArrayList<>();
  188 +
  189 + ArrivalEntity arr;
  190 + while(rs.next()){
  191 + arr = new ArrivalEntity();
  192 + arr.setDeviceId(rs.getString("device_id"));
  193 + arr.setNbbm(BasicData.deviceId2NbbmMap.get(arr.getDeviceId()));
  194 + if(null == arr.getNbbm()){
  195 + logger.warn("未注册的设备号," + arr.getDeviceId());
  196 + continue;
  197 + }
  198 +
  199 + arr.setTs(rs.getLong("ts"));
  200 + arr.setLineCode(rs.getString("line_id"));
  201 + arr.setUpDown(rs.getInt("up_down"));
  202 + arr.setStopNo(rs.getString("stop_no"));
  203 + arr.setStopName(BasicData.stationCode2NameMap.get(arr.getStopNo()));
  204 + arr.setInOut(rs.getInt("in_out"));
  205 + arr.setCreateDate(rs.getLong("create_timestamp"));
  206 + arr.setWeeksYear(rs.getInt("weeks_year"));
  207 + arr.setEnable(true);
  208 +
  209 + list.add(arr);
  210 + }
  211 + return list;
  212 + }
  213 +
  214 + public static void setPrveLoadTime(long t){
  215 + prveLoadTime = t;
  216 + }
  217 +}
... ...
src/main/java/com/bsth/data/gpsdata_v2/entity/GpsEntity.java
... ... @@ -20,6 +20,11 @@ public class GpsEntity implements Cloneable{
20 20 /** 线路编码 */
21 21 private String lineId;
22 22  
  23 + /**
  24 + * 子线路ID
  25 + */
  26 + private int subLineId;
  27 +
23 28 /** 设备编码 */
24 29 private String deviceId;
25 30  
... ... @@ -228,6 +233,14 @@ public class GpsEntity implements Cloneable{
228 233 this.lineId = lineId;
229 234 }
230 235  
  236 + public int getSubLineId() {
  237 + return subLineId;
  238 + }
  239 +
  240 + public void setSubLineId(int subLineId) {
  241 + this.subLineId = subLineId;
  242 + }
  243 +
231 244 public Long getSchId() {
232 245 return schId;
233 246 }
... ...
src/main/java/com/bsth/data/gpsdata_v2/handlers/GpsStateProcess.java
... ... @@ -75,7 +75,12 @@ public class GpsStateProcess {
75 75 }
76 76  
77 77 // 线路编码不一致或者未接收到切换区间线的响应
78   - if (!sch.getXlBm().equals(gps.getLineId()) || StringUtils.hasText(sch.getLineRegion()) && sch.getRegionSwitchState() == 0) {
  78 + String regionId = sch.getLineRegion();
  79 + int seq = 0;
  80 + if (!StringUtils.isEmpty(regionId)) {
  81 + seq = Integer.parseInt(regionId.split("_")[1]);
  82 + }
  83 + if (!sch.getXlBm().equals(gps.getLineId()) || gps.getSubLineId() != seq) {
79 84 //切换车载的 线路编码
80 85 gpsStatusManager.changeLine(gps.getNbbm(), sch, "同步@系统");
81 86 }
... ...
src/main/java/com/bsth/data/msg_queue/DirectivePushQueue.java
... ... @@ -159,7 +159,7 @@ public class DirectivePushQueue implements ApplicationContextAware {
159 159 log.info("directive 60_03 nbbm: " + qd.getNbbm());
160 160 }
161 161 else if(code.equals("64")){
162   - directiveService.lineChange(qd.getNbbm(), qd.getLineCode(), qd.getSch(), qd.getSender());
  162 + directiveService.lineChange(qd.getNbbm(), qd.getLineCode(), qd.getSender(), qd.getSch().getLineRegion());
163 163 log.info("directive 64 nbbm: " + qd.getNbbm() + " lineCode: " + qd.getLineCode());
164 164 }
165 165  
... ...
src/main/java/com/bsth/entity/directive/D64.java
... ... @@ -29,10 +29,6 @@ public class D64 extends Directive{
29 29  
30 30 private D64Data data;
31 31  
32   - @Transient
33   - @JsonIgnore
34   - private ScheduleRealInfo sch;
35   -
36 32 @Embeddable
37 33 public static class D64Data {
38 34  
... ... @@ -115,14 +111,6 @@ public class D64 extends Directive{
115 111 this.respAck = respAck;
116 112 }
117 113  
118   - public ScheduleRealInfo getSch() {
119   - return sch;
120   - }
121   -
122   - public void setSch(ScheduleRealInfo sch) {
123   - this.sch = sch;
124   - }
125   -
126 114 @Override
127 115 public void setDeviceId(String deviceId) {
128 116 if(this.data != null)
... ...
src/main/java/com/bsth/entity/realcontrol/ScheduleRealInfo.java
... ... @@ -268,12 +268,6 @@ public class ScheduleRealInfo implements Cloneable{
268 268 private String blockStations;
269 269  
270 270 /**
271   - * 区间切换状态 0 未发或未成功 1 成功
272   - */
273   - @Transient
274   - private int regionSwitchState;
275   -
276   - /**
277 271 *大客流进度 0下发驾驶员,1下发车辆,2,班次就位
278 272 */
279 273 @Transient
... ... @@ -1102,14 +1096,6 @@ public class ScheduleRealInfo implements Cloneable{
1102 1096 this.blockStations = blockStations;
1103 1097 }
1104 1098  
1105   - public int getRegionSwitchState() {
1106   - return regionSwitchState;
1107   - }
1108   -
1109   - public void setRegionSwitchState(int regionSwitchState) {
1110   - this.regionSwitchState = regionSwitchState;
1111   - }
1112   -
1113 1099 @Override
1114 1100 public ScheduleRealInfo clone() throws CloneNotSupportedException {
1115 1101 ScheduleRealInfo cloned = (ScheduleRealInfo) super.clone();
... ...
src/main/java/com/bsth/service/directive/DirectiveService.java
... ... @@ -60,11 +60,11 @@ public interface DirectiveService extends BaseService&lt;D60, Integer&gt;{
60 60 */
61 61 int lineChange(String nbbm, String lineId, String sender);
62 62  
63   - int lineChange(String nbbm, String lineId, ScheduleRealInfo sch, String sender);
  63 + int lineChange(String nbbm, String lineId, String sender, String lineRegion);
64 64  
65 65 int lineChangeByDeviceId(String deviceId, String lineCode, String sender);
66 66  
67   - int lineChangeByDeviceId(String deviceId, String lineCode, ScheduleRealInfo sch, String sender);
  67 + int lineChangeByDeviceId(String deviceId, String lineCode, String sender, int seq);
68 68  
69 69 /**
70 70 *
... ...
src/main/java/com/bsth/service/directive/DirectiveServiceImpl.java
... ... @@ -388,28 +388,32 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
388 388  
389 389 @Override
390 390 public int lineChange(String nbbm, String lineCode, String sender) {
391   - return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, null, sender);
  391 + return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, sender, 0);
392 392 }
393 393  
394 394 /**
395 395 * 线路切换
396 396 */
397 397 @Override
398   - public int lineChange(String nbbm, String lineCode, ScheduleRealInfo sch, String sender) {
399   - return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, sch, sender);
  398 + public int lineChange(String nbbm, String lineCode, String sender, String lineRegion) {
  399 + int seq = 0;
  400 + if (lineRegion != null) {
  401 + seq = Integer.parseInt(lineRegion.split("_")[1]);
  402 + }
  403 + return lineChangeByDeviceId(BasicData.deviceId2NbbmMap.inverse().get(nbbm), lineCode, sender, seq);
400 404 }
401 405  
402 406 @Override
403 407 public int lineChangeByDeviceId(String deviceId, String lineCode, String sender) {
404   - return lineChangeByDeviceId(deviceId, lineCode, null, sender);
  408 + return lineChangeByDeviceId(deviceId, lineCode, sender, 0);
405 409 }
406 410  
407 411 @Override
408   - public int lineChangeByDeviceId(String deviceId, String lineCode, ScheduleRealInfo sch, String sender) {
  412 + public int lineChangeByDeviceId(String deviceId, String lineCode, String sender, int seq) {
409 413 DirectiveCreator crt = new DirectiveCreator();
410 414 Long t = System.currentTimeMillis();
411 415 //生成64数据包
412   - D64 d64 = crt.create64(deviceId, lineCode, sch, t);
  416 + D64 d64 = crt.create64(deviceId, lineCode, t, seq);
413 417  
414 418 if (null != sender)
415 419 d64.setSender(sender);
... ... @@ -425,10 +429,10 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
425 429 }
426 430 // 入库
427 431 d64.setHttpCode(code);
428   - d64.getData().setTxtContent("切换线路[" + BasicData.lineCode2NameMap.get(lineCode) + "]");
  432 + d64.getData().setTxtContent("切换线路[" + BasicData.lineCode2NameMap.get(lineCode) + "]" + (seq != 0 ? "[" + seq + "]" : ""));
429 433 // 通知设备刷新线路文件,忽略结果
430 434 if (code == 0)
431   - GatewayHttpUtils.postJson(crt.createDeviceRefreshData(deviceId, lineCode));
  435 + GatewayHttpUtils.postJson(crt.createDeviceRefreshData(deviceId, lineCode, seq));
432 436 else
433 437 d64.setErrorText(" 网关通讯失败, code: " + code);
434 438  
... ... @@ -699,7 +703,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl&lt;D60, Integer&gt; implemen
699 703 if (gps == null)
700 704 return -1;
701 705  
702   - return GatewayHttpUtils.postJson(new DirectiveCreator().createDeviceRefreshData(deviceId, gps.getLineId()));
  706 + return GatewayHttpUtils.postJson(new DirectiveCreator().createDeviceRefreshData(deviceId, gps.getLineId(), 0));
703 707 }
704 708  
705 709 /* @Override
... ...
src/main/java/com/bsth/service/impl/StationRouteServiceImpl.java
... ... @@ -26,19 +26,19 @@ import java.util.zip.ZipEntry;
26 26 import java.util.zip.ZipOutputStream;
27 27  
28 28 /**
29   - *
  29 + *
30 30 * @ClassName: StationRouteServiceImpl(站点路由service业务层实现类)
31   - *
  31 + *
32 32 * @Extends : BaseService
33   - *
  33 + *
34 34 * @Description: TODO(站点路由service业务层)
35   - *
  35 + *
36 36 * @Author bsth@lq
37   - *
  37 + *
38 38 * @Date 2016年5月03日 上午9:21:17
39 39 *
40 40 * @Version 公交调度系统BS版 0.1
41   - *
  41 + *
42 42 */
43 43  
44 44 @Service
... ... @@ -49,16 +49,16 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
49 49  
50 50 @Value("${path.speech.line}")
51 51 private String linePathPattern;
52   -
  52 +
53 53 @Autowired
54 54 private StationRouteRepository stationRouteRepository;
55   -
  55 +
56 56 @Autowired
57 57 private SectionRouteRepository sectionRouteRepository;
58   -
  58 +
59 59 @Autowired
60 60 private LineRepository lineRepository;
61   -
  61 +
62 62 @Autowired
63 63 private StationRepository stationRepository;
64 64  
... ... @@ -84,7 +84,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
84 84  
85 85 return stationRouteRepository.findAll(new CustomerSpecs<>(map), Sort.by(orders));
86 86 }
87   -
  87 +
88 88 @Override
89 89 public Map<String, Object> getSectionRouteExport(Integer id, HttpServletResponse resp) {
90 90 Map<String, Object> resultMap = new HashMap<String, Object>();
... ... @@ -136,12 +136,12 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
136 136 }
137 137 return resultMap;
138 138 }
139   -
  139 +
140 140 /**
141 141 * @Description :TODO(查询树站点与路段数据)
142   - *
  142 + *
143 143 * @param map <line.id_eq:线路ID; directions_eq:方向>
144   - *
  144 + *
145 145 * @return List<Map<String, Object>>
146 146 */
147 147 @Override
... ... @@ -155,26 +155,26 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
155 155  
156 156 return result;
157 157 }
158   -
  158 +
159 159 @Override
160 160 public Map<String, Object> systemQuote(Map<String, Object> map) {
161 161 Map<String, Object> resultmap = new HashMap<>();
162 162 try{
163   -
  163 +
164 164 StationRoute route = new StationRoute();
165   -
  165 +
166 166 Integer lineId = map.get("lineId").equals("") ? null : Integer.parseInt(map.get("lineId").toString());
167   -
  167 +
168 168 Integer stationId = map.get("stationId").equals("") ? null : Integer.parseInt(map.get("stationId").toString());
169   -
  169 +
170 170 Line line = lineRepository.findById(lineId).get();
171   -
  171 +
172 172 Station station = stationRepository.findById(stationId).get();
173   -
  173 +
174 174 route.setLine(line);
175   -
  175 +
176 176 route.setStation(station);
177   -
  177 +
178 178 //baseRepository.save(t);
179 179 resultmap.put("status", ResponseCode.SUCCESS);
180 180 }catch(Exception e){
... ... @@ -183,13 +183,13 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
183 183 }
184 184 return resultmap;
185 185 }
186   -
  186 +
187 187 /**
188 188 * @Description :TODO(查询线路某方向下的站点序号与类型)
189   - *
  189 + *
190 190 * @param map <lineId:线路ID; direction:方向;stationRouteCode:站点编码>
191   - *
192   - * @return List<Map<String, Object>>
  191 + *
  192 + * @return List<Map<String, Object>>
193 193 */
194 194 @Override
195 195 public List<Map<String, Object>> findUpStationRouteCode(Map<String, Object> map) {
... ... @@ -304,40 +304,40 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
304 304  
305 305 /**
306 306 * @Description :TODO(查询线路某方向下所有站点的中心百度坐标)
307   - *
  307 + *
308 308 * @param map <lineId:线路ID; direction:方向>
309   - *
310   - * @return List<Map<String, Object>>
  309 + *
  310 + * @return List<Map<String, Object>>
311 311 */
312 312 @Override
313 313 public List<Map<String, Object>> getStationRouteCenterPoints(Map<String, Object> map) {
314   -
  314 +
315 315 List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>();
316   -
  316 +
317 317 // 线路ID
318 318 Integer lineId = map.get("lineId").equals("") ? null : Integer.parseInt(map.get("lineId").toString());
319   -
  319 +
320 320 // 方向
321 321 Integer direction = map.get("direction").equals("") ? null : Integer.parseInt(map.get("direction").toString());
322   -
  322 +
323 323 List<Object[]> list = stationRouteRepository.getSelectStationRouteCenterPoints(lineId, direction);
324   -
  324 +
325 325 if(list.size()>0) {
326   -
  326 +
327 327 for(int i = 0;i<list.size();i++) {
328   -
  328 +
329 329 Map<String, Object> tempM = new HashMap<String,Object>();
330   -
  330 +
331 331 tempM.put("bJwpoints", list.get(i)[0]);
332   -
  332 +
333 333 tempM.put("stationName", list.get(i)[1]);
334   -
  334 +
335 335 resultList.add(tempM);
336   -
  336 +
337 337 }
338   -
  338 +
339 339 }
340   -
  340 +
341 341 return resultList;
342 342 }
343 343  
... ... @@ -355,7 +355,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
355 355 }
356 356 map.put("destroy_eq", 0);
357 357 List<LsStationRoute> stationRoutes = lsStationRouteRepository.findAll(new CustomerSpecs<>(map), Sort.by(Direction.ASC, "stationRouteCode"));
358   -
  358 +
359 359 List<Map<String, Object>> resultList = new ArrayList<>();
360 360  
361 361 int len = stationRoutes.size();
... ... @@ -366,44 +366,44 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
366 366 }
367 367 return resultList;
368 368 }
369   -
  369 +
370 370 /**
371 371 * @Description :TODO(撤销站点)
372   - *
  372 + *
373 373 * @param map <lineId:线路ID; destroy:是否撤销(0:否;1:是)>
374   - *
  374 + *
375 375 * @return Map<String, Object> <SUCCESS ; ERROR>
376 376 */
377 377 @Override
378 378 public Map<String, Object> stationRouteIsDestroy(Map<String, Object> map) {
379 379 Map<String, Object> resultMap = new HashMap<String,Object>();
380   -
  380 +
381 381 try {
382   -
  382 +
383 383 Integer stationRouteId = map.get("stationRouteId").equals("") ? 0 : Integer.parseInt(map.get("stationRouteId").toString());
384   -
  384 +
385 385 Integer destroy = map.get("destroy").equals("") ? 0 : Integer.parseInt(map.get("destroy").toString());
386 386  
387 387 lsStationRouteRepository.deleteById(stationRouteId);
388 388  
389 389 resultMap.put("status", ResponseCode.SUCCESS);
390   -
  390 +
391 391 } catch (Exception e) {
392   -
  392 +
393 393 resultMap.put("status", ResponseCode.ERROR);
394   -
  394 +
395 395 logger.error("save erro.", e);
396   -
  396 +
397 397 }
398   -
  398 +
399 399 return resultMap;
400 400 }
401   -
  401 +
402 402 /**
403 403 * @Description : TODO(根据线路ID生成行单)
404   - *
  404 + *
405 405 * @param map <lineId:线路ID>
406   - *
  406 + *
407 407 * @return Map<String, Object> <SUCCESS ; ERROR ; NOTDATA>
408 408 */
409 409 @Override
... ... @@ -440,7 +440,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
440 440 languages.add("cn");
441 441 languages.add("sh");
442 442 languages.add("en");
443   - InputStream tts = ttsAndZip(objects, line, languages);
  443 + ttsAndZip(objects, line, languages, lineRegions);
444 444 /** 获取配置文件里的ftp登录参数 */
445 445 Map<String, Object> FTPParamMap = readPropertiesGetFTPParam();
446 446 // 压缩文件名
... ... @@ -505,23 +505,26 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
505 505  
506 506 input = new ByteArrayInputStream(textStr.getBytes("gbk"));
507 507  
  508 + // 线路文件上传(全程)
508 509 clientUtils.uploadFile(url, port, username, password, remotePath + "/voice/", textFileName, input);
  510 + String linePath = String.format(linePathPattern, lineId), voicePath = String.format("%s%s.zip", linePath, lineId);
  511 + // 报站文件上传(全程)
  512 + clientUtils.deleteFtpFile(url, port, username, password, remotePath + "/voice/", String.format("%s.zip", line.getLineCode()));
  513 + clientUtils.FTPUpLoadFromDisk(new File(voicePath), String.format("%s.zip", line.getLineCode()), url, port, username, password, remotePath + "/voice/");
509 514  
510   -// textFile.delete();
511 515 // 线路区间
512 516 if (lineRegions.size() > 0) {
513 517 FTPClientUtils.deleteFileByPrefix(String.format("%s-", line.getLineCode()), url, port, username, password, String.format("%s/voice/", remotePath));
514 518 for (LineRegion lineRegion : lineRegions) {
  519 + voicePath = String.format("%s%s-%d.zip", linePath, lineId, lineRegion.getSeq());
515 520 textStr = String.format("%s\r\n%s", head, subLine2Ftp(lineRegion));
516 521 input = new ByteArrayInputStream(textStr.getBytes("gbk"));
517 522 clientUtils.uploadFile(url, port, username, password, remotePath + "/voice/", String.format("%s-%d.txt", line.getLineCode(), lineRegion.getSeq()), input);
  523 + clientUtils.deleteFtpFile(url, port, username, password, remotePath + "/voice/", String.format("%s-%d.zip", line.getLineCode(), lineRegion.getSeq()));
  524 + clientUtils.FTPUpLoadFromDisk(new File(voicePath), String.format("%s-%d.zip", line.getLineCode(), lineRegion.getSeq()), url, port, username, password, remotePath + "/voice/");
518 525 }
519 526 }
520 527  
521   -
522   - clientUtils.deleteFtpFile(url, port, username, password, remotePath + "/voice/", String.format("%s.zip", line.getLineCode()));
523   - clientUtils.uploadFile(url, port, username, password, remotePath + "/voice/", String.format("%s.zip", line.getLineCode()), tts);
524   -
525 528 resultMap.put("status", ResponseCode.SUCCESS);
526 529 }else {
527 530 resultMap.put("status","NOTDATA");
... ... @@ -533,22 +536,22 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
533 536 return resultMap;
534 537 }
535 538 }
536   -
  539 +
537 540 /**
538 541 * @Description : TODO(形成行单文件内容)
539   - *
  542 + *
540 543 * @param objects :站点路由信息
541   - *
  544 + *
542 545 * {[0]:g_lonx(GPS经度);[1]:g_laty(GPS纬度);[2]:b_jwpoints(百度经纬度坐标)
543   - *
  546 + *
544 547 * [3]:station_mark(站点类型);[4]:station_route_code(站点序号);[5]:station_cod(站点编码);
545   - *
  548 + *
546 549 * [6]:distances(站点距离);[7]:station_name(站点名称);[8]:directions(方向)}
547   - *
  550 + *
548 551 * @param lineId :线路ID
549   - *
  552 + *
550 553 * @return String
551   - */
  554 + */
552 555 public String newTextFileToFTP(List<Object[]> objects,Integer lineId) {
553 556  
554 557 // 返回值String
... ... @@ -563,34 +566,34 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
563 566 defaultZdxh ++ ;
564 567 // 经度
565 568 String lng = objects.get(i)[0].equals("") ? "0" : objects.get(i)[0].toString();
566   -
  569 +
567 570 // 纬度
568 571 String lat = objects.get(i)[1].equals("") ? "0" : objects.get(i)[1].toString();
569   -
  572 +
570 573 Point point = new Point(Double.valueOf(lng), Double.valueOf(lat));
571   -
  574 +
572 575 lat = "\t" + lat;
573   -
  576 +
574 577 // 站点类型
575 578 String stationMakeStr = objects.get(i)[3].equals("") ? "" : objects.get(i)[3].toString();
576   -
  579 +
577 580 String stationMake = "";
578   -
  581 +
579 582 if(stationMakeStr.equals("E")) {
580 583 stationMake = "\t2";
581 584 }else {
582 585 stationMake ="\t1";
583 586 }
584   -
585   - // 站点序号
  587 +
  588 + // 站点序号
586 589 // String stationNo = objects.get(i)[4].equals("") ? "" : objects.get(i)[4].toString();
587 590 String stationNo = String.valueOf(defaultZdxh);
588   -
  591 +
589 592 stationNo = "\t" + stationNo;
590   -
  593 +
591 594 // 站点编码
592 595 String stationCode = objects.get(i)[5].equals("") ? "" : objects.get(i)[5].toString();
593   -
  596 +
594 597 int len = stationCode.length();
595 598 if(len<8) {
596 599 int dx = 8 - len;
... ... @@ -602,24 +605,24 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
602 605 }else if(len>8){
603 606 stationCode = stationCode.substring(8);
604 607 }
605   -
  608 +
606 609 stationCode = "\t" +stationCode;
607   -
  610 +
608 611 double dis = objects.get(i)[6]==null ? 0.0 : Double.parseDouble(objects.get(i)[6].toString())*1000;
609   -
  612 +
610 613 String tempDistc = String.valueOf((int) dis);
611   -
  614 +
612 615 // 站点距离
613 616 String staitondistance = "\t" + tempDistc;
614   -
  617 +
615 618 // 站点名称
616 619 String stationName = objects.get(i)[7].equals("") ? "" : objects.get(i)[7].toString();
617   -
  620 +
618 621 stationName = "\t" +stationName;
619   -
  622 +
620 623 // 限速
621 624 // String sleepStr = " " + "60";
622   -
  625 +
623 626 // 限速
624 627 String sleepStr = "";
625 628 // 方向
... ... @@ -649,16 +652,16 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
649 652 }
650 653 }
651 654 }
652   - if(sleepStr.equals(""))
  655 + if(sleepStr.equals(""))
653 656 sleepStr = "\t" + "60";
654 657 stationRStr = stationRStr + lng + lat + stationMake + stationNo + stationCode + staitondistance + sleepStr + stationName + enterStr;
655 658 }
656   -
  659 +
657 660 }
658 661 return stationRStr;
659   -
  662 +
660 663 }
661   -
  664 +
662 665 public String newTextVoiceFileToFTP(List<Object[]> objects,Integer lineId) {
663 666  
664 667 // 返回值String
... ... @@ -673,34 +676,34 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
673 676 defaultZdxh ++ ;
674 677 // 经度
675 678 String lng = objects.get(i)[0].equals("") ? "0" : objects.get(i)[0].toString();
676   -
  679 +
677 680 // 纬度
678 681 String lat = objects.get(i)[1].equals("") ? "0" : objects.get(i)[1].toString();
679   -
  682 +
680 683 Point point = new Point(Double.valueOf(lng), Double.valueOf(lat));
681   -
  684 +
682 685 lat = "\t" + lat;
683   -
  686 +
684 687 // 站点类型
685 688 String stationMakeStr = objects.get(i)[3].equals("") ? "" : objects.get(i)[3].toString();
686   -
  689 +
687 690 String stationMake = "";
688   -
  691 +
689 692 if(stationMakeStr.equals("E")) {
690 693 stationMake = "\t2";
691 694 }else {
692 695 stationMake ="\t1";
693 696 }
694   -
695   - // 站点序号
  697 +
  698 + // 站点序号
696 699 // String stationNo = objects.get(i)[4].equals("") ? "" : objects.get(i)[4].toString();
697 700 String stationNo = String.valueOf(defaultZdxh);
698   -
  701 +
699 702 stationNo = "\t" + stationNo;
700   -
  703 +
701 704 // 站点编码
702 705 String stationCode = objects.get(i)[5].equals("") ? "" : objects.get(i)[5].toString();
703   -
  706 +
704 707 int len = stationCode.length();
705 708 if(len<8) {
706 709 int dx = 8 - len;
... ... @@ -712,31 +715,31 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
712 715 }else if(len>8){
713 716 stationCode = stationCode.substring(8);
714 717 }
715   -
  718 +
716 719 stationCode = "\t" +stationCode;
717   -
  720 +
718 721 double dis = objects.get(i)[6]==null ? 0.0 : Double.parseDouble(objects.get(i)[6].toString())*1000;
719   -
  722 +
720 723 String tempDistc = String.valueOf((int) dis);
721   -
  724 +
722 725 // 站点距离
723 726 String staitondistance = "\t" + tempDistc;
724   -
  727 +
725 728 // 站点名称
726 729 String stationName = objects.get(i)[7].equals("") ? " " : objects.get(i)[7].toString();
727   -
  730 +
728 731 String stationNameEn = " ";
729 732 if(objects.get(i)[9] != null){
730 733 stationNameEn = objects.get(i)[9].equals("") ? " " : objects.get(i)[9].toString();
731 734 }
732   -
733   -
  735 +
  736 +
734 737 stationName = "\t" +stationName;
735 738 stationNameEn = "\t" +stationNameEn;
736   -
  739 +
737 740 // 限速
738 741 // String sleepStr = " " + "60";
739   -
  742 +
740 743 // 限速
741 744 String sleepStr = "";
742 745 // 方向
... ... @@ -769,16 +772,16 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
769 772 }
770 773 }
771 774 }
772   - if(sleepStr.equals(""))
  775 + if(sleepStr.equals(""))
773 776 sleepStr = "\t" + "60";
774 777 stationRStr = stationRStr + lng + lat + stationMake + stationNo + stationCode + staitondistance + sleepStr + stationName + stationNameEn + enterStr;
775 778 }
776   -
  779 +
777 780 }
778 781 return stationRStr;
779   -
  782 +
780 783 }
781   -
  784 +
782 785 public String hxTextFileToFtp(List<Object[]> objects,Integer lineId) {
783 786 String restStr = "";
784 787 // windows下的文本文件换行符
... ... @@ -791,10 +794,10 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
791 794 if(Integer.valueOf(objects.get(i)[8].toString())==0) {
792 795 // 经度
793 796 String lng = objects.get(i)[0].equals("") ? "0" : objects.get(i)[0].toString();
794   -
  797 +
795 798 // 纬度
796 799 String lat = objects.get(i)[1].equals("") ? "0" : objects.get(i)[1].toString();
797   -
  800 +
798 801 Point point = new Point(Double.valueOf(lng), Double.valueOf(lat));
799 802 lat = "\t" + lat;
800 803 // 站点类型
... ... @@ -805,7 +808,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
805 808 }else {
806 809 stationMake ="\t1";
807 810 }
808   - // 站点序号
  811 + // 站点序号
809 812 // String stationNo = objects.get(i)[4].equals("") ? "" : objects.get(i)[4].toString();
810 813 String stationNo = "\t" + xh;
811 814 // 站点编码
... ... @@ -861,7 +864,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
861 864 }
862 865 }
863 866 }
864   - if(sleepStr.equals(""))
  867 + if(sleepStr.equals(""))
865 868 sleepStr = "\t" + "60";
866 869 xh++;
867 870 restStr = restStr + lng + lat + stationMake + stationNo + stationCode + staitondistance + sleepStr + stationName + enterStr;
... ... @@ -871,70 +874,70 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
871 874 System.out.println(restStr);
872 875 return restStr;
873 876 }
874   -
  877 +
875 878 public boolean isPointOnPolyline (Map<String, Object> point, List<Map<String, Object>> listMap ){
876   -
  879 +
877 880 boolean success = false;
878   -
  881 +
879 882 for(int l = 0; l < listMap.size() - 1; l ++){
880   -
  883 +
881 884 Map<String, Object> tempM = listMap.get(l);
882   -
  885 +
883 886 Map<String, Object> nextTempM = listMap.get(l+1);
884   -
  887 +
885 888 if (Double.valueOf(point.get("lng").toString())>= Math.min(Double.valueOf(tempM.get("lng").toString()), Double.valueOf(nextTempM.get("lng").toString())) && Double.valueOf(point.get("lng").toString()) <= Math.max(Double.valueOf(tempM.get("lng").toString()), Double.valueOf(nextTempM.get("lng").toString())) &&
886 889 Double.valueOf(point.get("lat").toString()) >= Math.min(Double.valueOf(tempM.get("lat").toString()), Double.valueOf(nextTempM.get("lat").toString())) && Double.valueOf(point.get("lat").toString()) <= Math.max(Double.valueOf(tempM.get("lat").toString()), Double.valueOf(nextTempM.get("lat").toString()))){
887   -
888   -
889   - double precision = (Double.valueOf(tempM.get("lng").toString()) - Double.valueOf(point.get("lng").toString())) * (Double.valueOf(nextTempM.get("lat").toString()) - Double.valueOf(point.get("lat").toString())) -
  890 +
  891 +
  892 + double precision = (Double.valueOf(tempM.get("lng").toString()) - Double.valueOf(point.get("lng").toString())) * (Double.valueOf(nextTempM.get("lat").toString()) - Double.valueOf(point.get("lat").toString())) -
890 893 (Double.valueOf(nextTempM.get("lng").toString()) - Double.valueOf(tempM.get("lng").toString())) * (Double.valueOf(tempM.get("lat").toString()) - Double.valueOf(nextTempM.get("lat").toString()));
891   -
  894 +
892 895 if(precision < 2e-10 && precision > -2e-10){
893   -
  896 +
894 897 //实质判断是否接近0
895 898 success = true;
896   -
897   - }
898   -
  899 +
  900 + }
  901 +
899 902 }
900   -
  903 +
901 904 }
902   -
  905 +
903 906 return success;
904 907 }
905   -
  908 +
906 909 /**
907 910 * @Description:TOOD(获取FTP登录参数) 这里暂时只做一个map值返回,以后可以作为ftp登录类提出来
908   - *
  911 + *
909 912 * @return : Map<String, Object> <url:IP;port:端口;username:用户名;password:密码;remotePath:相对路径>
910 913 */
911 914 public Map<String, Object> readPropertiesGetFTPParam(){
912   -
  915 +
913 916 // 返回值map
914 917 Map<String, Object> resultMap = new HashMap<String, Object>();
915   -
  918 +
916 919 Properties env = new Properties();
917   -
  920 +
918 921 try {
919   -
  922 +
920 923 env.load(DBUtils_MS.class.getClassLoader().getResourceAsStream("ftp.properties"));
921   -
  924 +
922 925 resultMap.put("url", env.getProperty("ftp.url"));
923   -
  926 +
924 927 resultMap.put("port", env.getProperty("ftp.port"));
925   -
  928 +
926 929 resultMap.put("username", env.getProperty("ftp.username"));
927   -
  930 +
928 931 resultMap.put("password", env.getProperty("ftp.password"));
929   -
  932 +
930 933 resultMap.put("remotePath", env.getProperty("ftp.path"));
931   -
  934 +
932 935 } catch (Exception e) {
933 936  
934 937 e.printStackTrace();
935   -
  938 +
936 939 }
937   -
  940 +
938 941 return resultMap ;
939 942 }
940 943  
... ... @@ -961,7 +964,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
961 964 }
962 965 //过滤部分字段
963 966 /*String jsonStr = JSON.toJSONString(list, new PropertyFilter() {
964   -
  967 +
965 968 @Override
966 969 public boolean apply(Object object, String name, Object value) {
967 970 if(name.equals("line"))
... ... @@ -969,14 +972,14 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
969 972 return true;
970 973 }
971 974 });*/
972   -
  975 +
973 976 rs.put("status", ResponseCode.SUCCESS);
974 977 rs.put("list", list);
975 978 }catch(Exception e){
976 979 logger.error("", e);
977 980 rs.put("status", ResponseCode.ERROR);
978 981 }
979   -
  982 +
980 983 return rs;
981 984 }
982 985  
... ... @@ -1065,7 +1068,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1065 1068 * @param line
1066 1069 * @param languages 语言 如:cn、en、sh
1067 1070 */
1068   - private InputStream ttsAndZip(List<Object[]> objects, Line line, Set<String> languages) throws Exception {
  1071 + private void ttsAndZip(List<Object[]> objects, Line line, Set<String> languages, List<LineRegion> lineRegions) throws Exception {
1069 1072 String lineId = line.getLineCode();
1070 1073 StringBuilder cnBuilder = new StringBuilder(line.getName()).append("[p1000]"), enBuilder = new StringBuilder("Hello[p1000]");
1071 1074 int ups = 0, downs = 0;
... ... @@ -1094,75 +1097,116 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1094 1097 downs++;
1095 1098 }
1096 1099 }
1097   - cnBuilder.delete(cnBuilder.length() - 8, cnBuilder.length() - 1);
1098   - enBuilder.delete(enBuilder.length() - 8, enBuilder.length() - 1);
  1100 + cnBuilder.delete(cnBuilder.length() - 7, cnBuilder.length());
  1101 + enBuilder.delete(enBuilder.length() - 7, enBuilder.length());
1099 1102  
1100 1103 // 文本转语音并进行分割
1101 1104 // 音频存放及压缩文件路径
1102 1105 String linePath = String.format(linePathPattern, lineId), voicePath = String.format("%s%s.zip", linePath, lineId);
1103   - try {
1104   - String path = String.format("%scn.mp3", linePath);
1105   - IFlyUtils.textToSpeechCn(cnBuilder.toString(), path);
1106   - AudioOperationUtils.splitBySilence(path, String.format("%scn", linePath), 500, -40);
1107   - } catch (Exception e) {
1108   - throw new RuntimeException(e);
1109   - }
1110   - if (languages.contains("sh")) {
1111   - try {
1112   - String path = String.format("%ssh.mp3", linePath);
1113   - IFlyUtils.textToSpeechSh(cnBuilder.toString(), path);
1114   - AudioOperationUtils.splitBySilence(path, String.format("%ssh", linePath), 500, -40);
1115   - } catch (Exception e) {
1116   - throw new RuntimeException(e);
1117   - }
1118   - }
1119   - if (languages.contains("en")) {
  1106 + // 先清理历史生成的文件
  1107 + cleanHistoryAudio(new File(linePath));
  1108 + for (String language : languages) {
1120 1109 try {
1121   - String path = String.format("%sen.mp3", linePath);
1122   - IFlyUtils.textToSpeechEn(enBuilder.toString(), path);
1123   - AudioOperationUtils.splitBySilence(path, String.format("%sen", linePath), 500, -40);
  1110 + String path = String.format("%s%s.mp3", linePath, language);
  1111 + if ("cn".equals(language) || "sh".equals(language)) {
  1112 + IFlyUtils.textToSpeech(cnBuilder.toString(), language, path);
  1113 + } else if ("en".equals(language)) {
  1114 + IFlyUtils.textToSpeech(enBuilder.toString(), language, path);
  1115 + }
  1116 + AudioOperationUtils.splitBySilence(path, String.format("%s%s", linePath, language), 500, -40);
1124 1117 } catch (Exception e) {
1125 1118 throw new RuntimeException(e);
1126 1119 }
1127 1120 }
1128   - // 删除原线路音频
1129   - File file = new File(linePath);
1130   - for (File f : file.listFiles()) {
1131   - if (f.isFile() && f.getName().endsWith(".mp3")) {
1132   - file.delete();
  1121 +
  1122 + // 合并每站起步、到达语音(全程)
  1123 + int seq = 1;
  1124 + List<SeqStationLevel> seqs = new ArrayList<>();
  1125 + for (int i = seq;i <= ups;i++) {
  1126 + seqs.add(new SeqStationLevel(i, i));
  1127 + }
  1128 + seq = merge(lineId, "0", seq, seqs, languages);
  1129 + if (line.getLinePlayType() != 1) {
  1130 + seqs.clear();
  1131 + for (int i = seq;i < ups + downs;i++) {
  1132 + seqs.add(new SeqStationLevel(i, i + 1, 1));
  1133 + }
  1134 + merge(lineId, "0", seq, seqs, languages);
  1135 + }
  1136 + zipAudio(String.format("%s%s/", linePath, "0"), voicePath, lineId);
  1137 +
  1138 + // 线路区间
  1139 + Map<String, List<SeqStationLevel>> region2map = new HashMap<>();
  1140 + for (LineRegion lineRegion : lineRegions) {
  1141 + for (int i = 0;i < objects.size();i++) {
  1142 + Object[] objArr = objects.get(i);
  1143 + String stationCode = (String) objArr[5];
  1144 + int direction = (int) objArr[8];
  1145 + if (lineRegion.getDirection() == direction) {
  1146 + for (int j = 0;j < lineRegion.getStationRoutes().size();j++) {
  1147 + LsStationRoute stationRoute = lineRegion.getStationRoutes().get(j);
  1148 + if (stationCode.equals(stationRoute.getStationCode())) {
  1149 + List<SeqStationLevel> map = region2map.get(lineRegion.getSeq().toString());
  1150 + if (map == null) {
  1151 + map = new ArrayList<>();
  1152 + region2map.put(lineRegion.getSeq().toString(), map);
  1153 + }
  1154 + map.add(new SeqStationLevel(j + 1, i + 1, direction));
  1155 + break;
  1156 + }
  1157 + }
  1158 + }
1133 1159 }
1134 1160 }
  1161 + for (Map.Entry<String, List<SeqStationLevel>> entry : region2map.entrySet()) {
  1162 + String subLineId = entry.getKey();
  1163 + List<SeqStationLevel> map = entry.getValue();
  1164 + seq = 1;
  1165 + merge(lineId, subLineId, seq, map, languages);
  1166 + zipAudio(String.format("%s%s/", linePath, subLineId), String.format("%s%s-%s.zip", linePath, lineId, subLineId), String.format("%s-%s", lineId, subLineId));
  1167 + }
  1168 + }
1135 1169  
1136   - // 合并每站起步、到达语音
1137   - int seq = 1, startSeq = 1, direction = 0;
1138   - seq = merge(lineId, seq, startSeq, direction, ups, languages);
1139   - startSeq = ups + 1;
1140   - direction = 1;
1141   - merge(lineId, seq, startSeq, direction, ups + downs, languages);
  1170 + private void cleanHistoryAudio(File file) throws Exception {
  1171 + if (file.isDirectory()) {
  1172 + File[] files = file.listFiles();
  1173 + for (File f : files) {
  1174 + cleanHistoryAudio(f);
  1175 + }
  1176 + } else {
  1177 + if (file.getName().endsWith(".mp3") || file.getName().endsWith(".zip")) {
  1178 + file.delete();
  1179 + }
  1180 + }
  1181 + }
1142 1182  
1143   - // 压缩音频到zip
  1183 + /**
  1184 + * 压缩音频到zip
  1185 + * @param subLinePath 子线路文件夹
  1186 + * @param voicePath 语音报站文件压缩包路径
  1187 + */
  1188 + private void zipAudio(String subLinePath, String voicePath, String zipFolder) throws Exception {
  1189 + File file = new File(subLinePath);
1144 1190 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(voicePath));
1145 1191 for (File f : file.listFiles()) {
1146 1192 if (f.isFile() && f.getName().endsWith(".mp3")) {
1147   - addFileToZip(zos, f);
  1193 + addFileToZip(zos, f, zipFolder);
1148 1194 }
1149 1195 }
1150 1196 // Key打头音频
1151 1197 file = new File(commonPath);
1152 1198 for (File f : file.listFiles()) {
1153 1199 if (f.isFile() && f.getName().startsWith("Key-")) {
1154   - addFileToZip(zos, f);
  1200 + addFileToZip(zos, f, zipFolder);
1155 1201 }
1156 1202 }
1157 1203 zos.flush();
1158 1204 zos.close();
1159   -
1160   - return new FileInputStream(voicePath);
1161 1205 }
1162 1206  
1163   - private static void addFileToZip(ZipOutputStream zos, File file) throws IOException {
  1207 + private static void addFileToZip(ZipOutputStream zos, File file, String zipFolder) throws IOException {
1164 1208 FileInputStream fis = new FileInputStream(file);
1165   - ZipEntry zipEntry = new ZipEntry(file.getName());
  1209 + ZipEntry zipEntry = new ZipEntry(String.format("%s/%s", zipFolder, file.getName()));
1166 1210 zos.putNextEntry(zipEntry);
1167 1211  
1168 1212 byte[] bytes = new byte[4096];
... ... @@ -1175,21 +1219,32 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1175 1219 fis.close();
1176 1220 }
1177 1221  
1178   - private int merge(String lineId, int seq, int startSeq, int direction, int terminal, Set<String> languages) throws Exception {
1179   - for (int i = startSeq;i <= terminal;i++) {
1180   - if (i > startSeq) {
1181   - if (i == startSeq + 1) {
  1222 + /**
  1223 + *
  1224 + * @param lineId 线路编码
  1225 + * @param seq 线路站级序号(全局)
  1226 + * @param seqs 当前方向站级序号
  1227 + * @param languages 语种
  1228 + * @return
  1229 + * @throws Exception
  1230 + */
  1231 + private int merge(String lineId, String subLineId, int seq, List<SeqStationLevel> seqs, Set<String> languages) throws Exception {
  1232 + SeqStationLevel startSeq = seqs.get(0), terminal = seqs.get(seqs.size() - 1);
  1233 + for (int i = 0;i < seqs.size();i++) {
  1234 + SeqStationLevel current = seqs.get(i);
  1235 + if (current.getStationLevel() > startSeq.getStationLevel()) {
  1236 + if (i == 1) {
1182 1237 // 生成首站
1183   - mergeOriginStart(lineId, seq, i, direction, terminal, languages);
1184   - mergeNormalArrive(lineId, seq, i, direction, terminal, languages);
1185   - } else if (i == terminal) {
  1238 + mergeOriginStart(lineId, subLineId, seq, current, terminal, languages);
  1239 + mergeNormalArrive(lineId, subLineId, seq, current, terminal, languages);
  1240 + } else if (current.getStationLevel() == terminal.getStationLevel()) {
1186 1241 // 生成终点站
1187   - mergeNormalStart(lineId, seq, i, direction, terminal, languages);
1188   - mergeTerminalArrive(lineId, seq, i, direction, terminal, languages);
  1242 + mergeNormalStart(lineId, subLineId, seq, current, terminal, languages);
  1243 + mergeTerminalArrive(lineId, subLineId, seq, current, terminal, languages);
1189 1244 } else {
1190 1245 // 生成中途站
1191   - mergeNormalStart(lineId, seq, i, direction, terminal, languages);
1192   - mergeNormalArrive(lineId, seq, i, direction, terminal, languages);
  1246 + mergeNormalStart(lineId, subLineId, seq, current, terminal, languages);
  1247 + mergeNormalArrive(lineId, subLineId, seq, current, terminal, languages);
1193 1248 }
1194 1249 seq++;
1195 1250 }
... ... @@ -1198,9 +1253,12 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1198 1253 return seq;
1199 1254 }
1200 1255  
1201   - private void mergeOriginStart(String lineId, int seq, int stationLevel, int direction, int terminal, Set<String> languages) throws Exception {
  1256 + private void mergeOriginStart(String lineId, String subLineId, int seq, SeqStationLevel current, SeqStationLevel terminal, Set<String> languages) throws Exception {
  1257 + // 子线路路径
1202 1258 String linePath = String.format(linePathPattern, lineId);
1203   - List<String> arr = Arrays.asList(commonPath + "cn_origin_1.mp3", linePath + String.format("cn/%03d.mp3", 0), commonPath + "cn_origin_2.mp3", linePath + String.format("cn/%03d.mp3", terminal), commonPath + "sh_origin_1.mp3", linePath + String.format("sh/%03d.mp3", 0), commonPath + "sh_origin_2.mp3", linePath + String.format("cn/%03d.mp3", terminal), commonPath + "cn_start_1.mp3", linePath + String.format("cn/%03d.mp3", stationLevel), commonPath + "cn_start_2.mp3", commonPath + "sh_start_1.mp3", linePath + String.format("sh/%03d.mp3", stationLevel), commonPath + "sh_start_2.mp3", commonPath + "en_1.mp3", linePath + String.format("en/%03d.mp3", stationLevel), commonPath + "cn_start_3.mp3", commonPath + "sh_start_3.mp3");
  1259 + String subLinePath = String.format("%s%s/", linePath, subLineId);
  1260 + int direction = current.getDirection();
  1261 + List<String> arr = Arrays.asList(commonPath + "cn_origin_1.mp3", linePath + String.format("cn/%03d.mp3", 0), commonPath + "cn_origin_2.mp3", linePath + String.format("cn/%03d.mp3", terminal.getStationLevel()), commonPath + "sh_origin_1.mp3", linePath + String.format("sh/%03d.mp3", 0), commonPath + "sh_origin_2.mp3", linePath + String.format("cn/%03d.mp3", terminal.getStationLevel()), commonPath + "cn_start_1.mp3", linePath + String.format("cn/%03d.mp3", current.getStationLevel()), commonPath + "cn_start_2.mp3", commonPath + "sh_start_1.mp3", linePath + String.format("sh/%03d.mp3", current.getStationLevel()), commonPath + "sh_start_2.mp3", commonPath + "en_1.mp3", linePath + String.format("en/%03d.mp3", current.getStationLevel()), commonPath + "cn_start_3.mp3", commonPath + "sh_start_3.mp3");
1204 1262 List<String> inputPaths = new ArrayList<>();
1205 1263 for (String path : arr) {
1206 1264 for (String lang : languages) {
... ... @@ -1210,12 +1268,14 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1210 1268 }
1211 1269 }
1212 1270 }
1213   - AudioOperationUtils.merge(inputPaths, String.format("%s%03da%s-%03d-%s-Start.mp3", linePath, seq, direction == 0 ? "u" : "d", direction == 0 ? stationLevel : terminal - stationLevel + 1, direction == 0 ? "Up" : "Dn"));
  1271 + AudioOperationUtils.merge(inputPaths, String.format("%s%03da%s-%03d-%s-Start.mp3", subLinePath, seq, direction == 0 ? "u" : "d", direction == 0 ? current.getSeq() : terminal.getSeq() - current.getSeq() + 1, direction == 0 ? "Up" : "Dn"));
1214 1272 }
1215 1273  
1216   - private void mergeNormalStart(String lineId, int seq, int stationLevel, int direction, int terminal, Set<String> languages) throws Exception {
  1274 + private void mergeNormalStart(String lineId, String subLineId, int seq, SeqStationLevel current, SeqStationLevel terminal, Set<String> languages) throws Exception {
1217 1275 String linePath = String.format(linePathPattern, lineId);
1218   - List<String> arr = Arrays.asList(commonPath + "cn_start.mp3", linePath + String.format("cn/%03d.mp3", stationLevel), commonPath + "cn_start_2.mp3", commonPath + "sh_start_1.mp3", linePath + String.format("sh/%03d.mp3", stationLevel), commonPath + "sh_start_2.mp3", commonPath + "en_1.mp3", linePath + String.format("en/%03d.mp3", stationLevel), commonPath + "cn_start_3.mp3", commonPath + "sh_start_3.mp3");
  1276 + String subLinePath = String.format("%s%s/", linePath, subLineId);
  1277 + int direction = current.getDirection();
  1278 + List<String> arr = Arrays.asList(commonPath + "cn_start.mp3", linePath + String.format("cn/%03d.mp3", current.getStationLevel()), commonPath + "cn_start_2.mp3", commonPath + "sh_start_1.mp3", linePath + String.format("sh/%03d.mp3", current.getStationLevel()), commonPath + "sh_start_2.mp3", commonPath + "en_1.mp3", linePath + String.format("en/%03d.mp3", current.getStationLevel()), commonPath + "cn_start_3.mp3", commonPath + "sh_start_3.mp3");
1219 1279 List<String> inputPaths = new ArrayList<>();
1220 1280 for (String path : arr) {
1221 1281 for (String lang : languages) {
... ... @@ -1225,26 +1285,28 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1225 1285 }
1226 1286 }
1227 1287 }
1228   - AudioOperationUtils.merge(inputPaths, String.format("%s%03da%s-%03d-%s-Start.mp3", linePath, seq, direction == 0 ? "u" : "d", direction == 0 ? stationLevel : terminal - stationLevel + 1, direction == 0 ? "Up" : "Dn"));
  1288 + AudioOperationUtils.merge(inputPaths, String.format("%s%03da%s-%03d-%s-Start.mp3", subLinePath, seq, direction == 0 ? "u" : "d", direction == 0 ? current.getSeq() : terminal.getSeq() - current.getSeq() + 1, direction == 0 ? "Up" : "Dn"));
1229 1289 }
1230 1290  
1231   - private void mergeNormalArrive(String lineId, int seq, int stationLevel, int direction, int terminal, Set<String> languages) throws Exception {
  1291 + private void mergeNormalArrive(String lineId, String subLineId, int seq, SeqStationLevel current, SeqStationLevel terminal, Set<String> languages) throws Exception {
1232 1292 String linePath = String.format(linePathPattern, lineId);
1233   - List<String> arr = new ArrayList<>(Arrays.asList(commonPath + "cn_arrive.mp3", linePath + String.format("cn/%03d.mp3", stationLevel), commonPath + "cn_arrive_1.mp3", linePath + String.format("sh/%03d.mp3", stationLevel), commonPath + "sh_arrive_1.mp3", commonPath + "en_2.mp3", linePath + String.format("en/%03d.mp3", stationLevel)));
  1293 + String subLinePath = String.format("%s%s/", linePath, subLineId);
  1294 + int direction = current.getDirection();
  1295 + List<String> arr = new ArrayList<>(Arrays.asList(commonPath + "cn_arrive.mp3", linePath + String.format("cn/%03d.mp3", current.getStationLevel()), commonPath + "cn_arrive_1.mp3", linePath + String.format("sh/%03d.mp3", current.getStationLevel()), commonPath + "sh_arrive_1.mp3", commonPath + "en_2.mp3", linePath + String.format("en/%03d.mp3", current.getStationLevel())));
1234 1296 List<String> inputPaths = new ArrayList<>();
1235 1297 if (languages.contains("sh")) {
1236 1298 for (int i = 0;i < 3;i++) {
1237 1299 arr.add(linePath + String.format("cn/%03d.mp3", 0));
1238 1300 arr.add(commonPath + "cn_origin_2.mp3");
1239   - arr.add(linePath + String.format("cn/%03d.mp3", terminal));
  1301 + arr.add(linePath + String.format("cn/%03d.mp3", terminal.getStationLevel()));
1240 1302 arr.add(linePath + String.format("sh/%03d.mp3", 0));
1241 1303 arr.add(commonPath + "sh_origin_2.mp3");
1242   - arr.add(linePath + String.format("sh/%03d.mp3", terminal));
  1304 + arr.add(linePath + String.format("sh/%03d.mp3", terminal.getStationLevel()));
1243 1305 }
1244 1306 } else {
1245 1307 arr.add(linePath + String.format("cn/%03d.mp3", 0));
1246 1308 arr.add(commonPath + "cn_origin_2.mp3");
1247   - arr.add(linePath + String.format("cn/%03d.mp3", terminal));
  1309 + arr.add(linePath + String.format("cn/%03d.mp3", terminal.getStationLevel()));
1248 1310 }
1249 1311 for (String path : arr) {
1250 1312 for (String lang : languages) {
... ... @@ -1254,12 +1316,14 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1254 1316 }
1255 1317 }
1256 1318 }
1257   - AudioOperationUtils.merge(inputPaths, String.format("%s%03db%s-%03d-%s-Arrive.mp3", linePath, seq, direction == 0 ? "u" : "d", direction == 0 ? stationLevel : terminal - stationLevel + 1, direction == 0 ? "Up" : "Dn"));
  1319 + AudioOperationUtils.merge(inputPaths, String.format("%s%03db%s-%03d-%s-Arrive.mp3", subLinePath, seq, direction == 0 ? "u" : "d", direction == 0 ? current.getSeq() : terminal.getSeq() - current.getSeq() + 1, direction == 0 ? "Up" : "Dn"));
1258 1320 }
1259 1321  
1260   - private void mergeTerminalArrive(String lineId, int seq, int stationLevel, int direction, int terminal, Set<String> languages) throws Exception {
  1322 + private void mergeTerminalArrive(String lineId, String subLineId, int seq, SeqStationLevel current, SeqStationLevel terminal, Set<String> languages) throws Exception {
1261 1323 String linePath = String.format(linePathPattern, lineId);
1262   - List<String> arr = Arrays.asList(commonPath + "cn_terminal.mp3", linePath + String.format("cn/%03d.mp3", stationLevel), commonPath + "cn_arrive_1.mp3", commonPath + "sh_terminal.mp3", linePath + String.format("sh/%03d.mp3", stationLevel), commonPath + "sh_arrive_1.mp3", commonPath + "en_3.mp3", linePath + String.format("en/%03d.mp3", stationLevel), commonPath + "terminal_music.mp3");
  1324 + String subLinePath = String.format("%s%s/", linePath, subLineId);
  1325 + int direction = current.getDirection();
  1326 + List<String> arr = Arrays.asList(commonPath + "cn_terminal.mp3", linePath + String.format("cn/%03d.mp3", current.getStationLevel()), commonPath + "cn_arrive_1.mp3", commonPath + "sh_terminal.mp3", linePath + String.format("sh/%03d.mp3", current.getStationLevel()), commonPath + "sh_arrive_1.mp3", commonPath + "en_3.mp3", linePath + String.format("en/%03d.mp3", current.getStationLevel()), commonPath + "terminal_music.mp3");
1263 1327 List<String> inputPaths = new ArrayList<>();
1264 1328 for (String path : arr) {
1265 1329 for (String lang : languages) {
... ... @@ -1269,7 +1333,7 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1269 1333 }
1270 1334 }
1271 1335 }
1272   - AudioOperationUtils.merge(inputPaths, String.format("%s%03db%s-%03d-%s-Arrive.mp3", linePath, seq, direction == 0 ? "u" : "d", direction == 0 ? stationLevel : terminal - stationLevel + 1, direction == 0 ? "Up" : "Dn"));
  1336 + AudioOperationUtils.merge(inputPaths, String.format("%s%03db%s-%03d-%s-Arrive.mp3", subLinePath, seq, direction == 0 ? "u" : "d", direction == 0 ? current.getSeq() : terminal.getSeq() - current.getSeq() + 1, direction == 0 ? "Up" : "Dn"));
1273 1337 }
1274 1338  
1275 1339 private void description() {
... ... @@ -1294,4 +1358,50 @@ public class StationRouteServiceImpl extends BaseServiceImpl&lt;StationRoute, Integ
1294 1358 // 终点站(沪) (sh_terminal.mp3)
1295 1359 // 终点音乐 (terminal_music.mp3)
1296 1360 }
  1361 +
  1362 + /**
  1363 + * 站序和站级的映射,全程和区间时会不一致
  1364 + */
  1365 + private final static class SeqStationLevel {
  1366 +
  1367 + private Integer seq;
  1368 +
  1369 + private Integer stationLevel;
  1370 +
  1371 + private int direction;
  1372 +
  1373 + private SeqStationLevel(Integer seq, Integer stationLevel) {
  1374 + this(seq, stationLevel, 0);
  1375 + }
  1376 +
  1377 + private SeqStationLevel(Integer seq, Integer stationLevel, int direction) {
  1378 + this.seq = seq;
  1379 + this.stationLevel = stationLevel;
  1380 + this.direction = direction;
  1381 + }
  1382 +
  1383 + public Integer getSeq() {
  1384 + return seq;
  1385 + }
  1386 +
  1387 + public void setSeq(Integer seq) {
  1388 + this.seq = seq;
  1389 + }
  1390 +
  1391 + public Integer getStationLevel() {
  1392 + return stationLevel;
  1393 + }
  1394 +
  1395 + public void setStationLevel(Integer stationLevel) {
  1396 + this.stationLevel = stationLevel;
  1397 + }
  1398 +
  1399 + public int getDirection() {
  1400 + return direction;
  1401 + }
  1402 +
  1403 + public void setDirection(int direction) {
  1404 + this.direction = direction;
  1405 + }
  1406 + }
1297 1407 }
... ...
src/main/java/com/bsth/util/IFlyUtils.java
... ... @@ -31,71 +31,37 @@ public class IFlyUtils {
31 31  
32 32 private final static String appId = "b4b21ad4";
33 33  
34   - /**
35   - * 生成普通话语音
36   - * text以","进行分割
37   - * @param text
38   - */
39   - public static void textToSpeechCn(String text, String outputPath) throws Exception {
40   - File file = new File(outputPath);
41   - if (!file.getParentFile().exists()) {
42   - file.getParentFile().mkdirs();
43   - }
44   - String wsUrl = getAuthUrl("https://tts-api.xfyun.cn/v2/tts", apiKey, apiSecret).replace("https://", "wss://");
45   - SpeechRequest request = new SpeechRequest();
46   - request.getCommon().put("app_id", appId);
47   - request.getBusiness().put("aue", "lame");
48   - request.getBusiness().put("sfl", 1);
49   - request.getBusiness().put("vcn", "x4_lingxiaoshan_profnews");
50   - request.getData().put("text", Base64.getEncoder().encodeToString(text.replace(",", "[p1000]").getBytes("GBK")));
51   - request.getData().put("status", 2);
52   - websocketWork(wsUrl, request, new FileOutputStream(file));
53   - while (!request.isCompleted()) {
54   - Thread.sleep(500);
55   - }
  34 + private static Map<String, String> language2vcn = new HashMap<>();
  35 +
  36 + static {
  37 + language2vcn.put("cn", "x4_lingxiaoshan_profnews");
  38 + language2vcn.put("sh", "x3_ziling");
  39 + language2vcn.put("en", "x4_enus_luna_assist");
56 40 }
57 41  
58   - /**
59   - * 生成上海话语音
60   - * text以","进行分割
61   - * @param text
62   - */
63   - public static void textToSpeechSh(String text, String outputPath) throws Exception {
  42 + public static void textToSpeech(String text, String language, String outputPath) throws Exception {
64 43 File file = new File(outputPath);
65 44 if (!file.getParentFile().exists()) {
66 45 file.getParentFile().mkdirs();
67 46 }
  47 + String vcn = language2vcn.get(language);
  48 + if (vcn == null) {
  49 + throw new IllegalArgumentException("Language is not supported: " + language);
  50 + }
68 51 String wsUrl = getAuthUrl("https://tts-api.xfyun.cn/v2/tts", apiKey, apiSecret).replace("https://", "wss://");
69 52 SpeechRequest request = new SpeechRequest();
70 53 request.getCommon().put("app_id", appId);
71 54 request.getBusiness().put("aue", "lame");
72 55 request.getBusiness().put("sfl", 1);
73   - request.getBusiness().put("vcn", "x3_ziling");
74   - request.getData().put("text", Base64.getEncoder().encodeToString(text.replace(",", "[p1000]").getBytes("GBK")));
75   - request.getData().put("status", 2);
76   - websocketWork(wsUrl, request, new FileOutputStream(file));
77   - while (!request.isCompleted()) {
78   - Thread.sleep(500);
  56 + request.getBusiness().put("vcn", vcn);
  57 + String charset = "GBK";
  58 + if ("en".equals(language)) {
  59 + charset = "UTF-8";
79 60 }
80   - }
81   -
82   - /**
83   - * 生成英语语音
84   - * text以","进行分割
85   - * @param text
86   - */
87   - public static void textToSpeechEn(String text, String outputPath) throws Exception {
88   - File file = new File(outputPath);
89   - if (!file.getParentFile().exists()) {
90   - file.getParentFile().mkdirs();
  61 + if ("en".equals(language) || "sh".equals(language)) {
  62 + request.getBusiness().put("volume", 100);
91 63 }
92   - String wsUrl = getAuthUrl("https://tts-api.xfyun.cn/v2/tts", apiKey, apiSecret).replace("https://", "wss://");
93   - SpeechRequest request = new SpeechRequest();
94   - request.getCommon().put("app_id", appId);
95   - request.getBusiness().put("aue", "lame");
96   - request.getBusiness().put("sfl", 1);
97   - request.getBusiness().put("vcn", "x4_enus_luna_assist");
98   - request.getData().put("text", Base64.getEncoder().encodeToString(text.replace(",", "[p1000]").getBytes(StandardCharsets.UTF_8)));
  64 + request.getData().put("text", Base64.getEncoder().encodeToString(text.replace(",", "[p1000]").getBytes(charset)));
99 65 request.getData().put("status", 2);
100 66 websocketWork(wsUrl, request, new FileOutputStream(file));
101 67 while (!request.isCompleted()) {
... ... @@ -183,8 +149,8 @@ public class IFlyUtils {
183 149 String authorization = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha);
184 150 StringBuilder sb = new StringBuilder(hostUrl);
185 151 sb.append("?authorization=").append(Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8)))
186   - .append("&date=").append(URLEncoder.encode(date))
187   - .append("&host=").append(URLEncoder.encode(url.getHost()));
  152 + .append("&date=").append(URLEncoder.encode(date))
  153 + .append("&host=").append(URLEncoder.encode(url.getHost()));
188 154 // // 拼接地址
189 155 // HttpUrl httpUrl = Objects.requireNonNull(HttpUrl.parse("https://" + url.getHost() + url.getPath())).newBuilder().//
190 156 // addQueryParameter("authorization", Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8))).//
... ... @@ -194,4 +160,4 @@ public class IFlyUtils {
194 160  
195 161 return sb.toString();
196 162 }
197 163 -}
  164 +}
198 165 \ No newline at end of file
... ...
src/main/resources/fatso/handle_real_ctl.js
1   -/**
2   - * 处理线调文件
3   - */
4   -var fs = require('fs')
5   - , cheerio = require('cheerio')
6   - , minifier = require('./minifier')
7   - , crypto = require("crypto")
8   - , CleanCSS = require('clean-css')
9   - , UglifyJS = require("uglify-js");
10   -;
11   -
12   -var platform = process.platform;
13   -var iswin = platform=='win32';
14   -var sp = platform=='win32'?'\\':'/';
15   -//不参与的目录
16   -var pName = 'bsth_control'
17   - , path = process.cwd()
18   - //根目录
19   - , root = path.substr(0, path.indexOf(sp + 'src'+sp+'main'))
20   - , workspace = root.substr(0, root.lastIndexOf(sp + pName))
21   - //临时目录
22   - , dest = (workspace + sp + pName + '@fatso_copy')//.replace(/\//g, '\\')
23   - , _static = sp + 'src'+sp+'main'+sp+'resources'+sp+'static';
24   -
25   -
26   -var mainFile = dest + _static + sp + 'real_control_v2'+sp+'main.html';
27   -var aloneMapWrapFile = dest + _static + sp + 'real_control_v2'+sp+'alone_page'+sp+'map'+sp+'alone_wrap.html';
28   -var aloneHomeWrapFile = dest + _static + sp + 'real_control_v2'+sp+'alone_page'+sp+'home'+sp+'home_wrap.html';
29   -var mapFile = dest + _static + sp + 'real_control_v2'+sp+'mapmonitor'+sp+'real.html';
30   -var realCtl = {
31   - /**
32   - * 处理线调首页
33   - */
34   - handleMain: function (cb) {
35   - //处理main.html
36   - var data = fs.readFileSync(mainFile, 'utf-8'),
37   - $ = cheerio.load(data);
38   - handleCss($, function () {
39   - handleJs($, mainFile, cb);
40   - });
41   -
42   -
43   - },
44   - /**
45   - * 处理地图模块
46   - * @param cb
47   - */
48   - handleMap: function (cb) {
49   - //读取文件
50   - var data = fs.readFileSync(mapFile, 'utf-8')
51   - , $ = cheerio.load(data);
52   -
53   - handleCss($, function () {
54   - handleJs($, mapFile, cb);
55   - });
56   - },
57   - /**
58   - * 处理单屏地图页面
59   - * @param cb
60   - */
61   - handleAlonePage: function (cb) {
62   - var data = fs.readFileSync(aloneMapWrapFile, 'utf-8');
63   - var $ = cheerio.load(data);
64   - handleCss($, function () {
65   - handleJs($, aloneMapWrapFile, cb);
66   - });
67   - },
68   - /**
69   - * 处理单屏主页
70   - * @param cb
71   - */
72   - handleAloneHomePage: function (cb) {
73   - var data = fs.readFileSync(aloneHomeWrapFile, 'utf-8');
74   - var $ = cheerio.load(data);
75   - handleCss($, function () {
76   - handleJs($, aloneHomeWrapFile, cb);
77   - });
78   - }
79   -
80   -};
81   -
82   -/**
83   - * 处理css
84   - * @type {any}
85   - */
86   -var handleCss = function ($, cb) {
87   - var cssArray = $('link[rel=stylesheet][merge]');
88   - //按 merge 值分组
89   - var cssMap = {}, mergeName;
90   - for (var i = 0, c; c = cssArray[i++];) {
91   - mergeName = $(c).attr('merge');
92   - if (!cssMap[mergeName])
93   - cssMap[mergeName] = [];
94   - cssMap[mergeName].push(dest + _static + $(c).attr('href'));
95   - //remove
96   - $(c).remove();
97   - }
98   - //按 merge 合并压缩css
99   - var ks = get_keys(cssMap), index = 0;
100   - (function () {
101   - if (index >= ks.length) {
102   - cb && cb();
103   - return;
104   - }
105   - var k = ks[index];
106   - index++;
107   - var f = arguments.callee;
108   - //合并css
109   - new CleanCSS().minify(cssMap[k], function (error, out) {
110   - var data = out.styles;
111   - var fName = (k + '_' + md5(data)) + '.css';
112   - //写入 assets css 目录下
113   - var descFile = dest + _static + sp + 'real_control_v2'+sp+'assets'+sp+'css' + sp + fName;
114   - fs.open(descFile, 'a', function (err, fd) {
115   -
116   - fs.write(fd, data, function () {
117   - var tag = '<link rel="stylesheet" href="/real_control_v2/assets/css/' + fName + '"/>';
118   - if ($('head').length > 0)
119   - $('head').append(tag);
120   - else {
121   - if($('link').length > 0)
122   - $('link').last().before(tag);
123   - else
124   - $('div').first().before(tag);
125   - }
126   - console.log(k + ' css', '结束,下一个');
127   - f();
128   - });
129   - });
130   - });
131   - })();
132   -};
133   -
134   -/**
135   - * 处理js
136   - */
137   -var handleJs = function ($, file, cb) {
138   - var scriptArray = $('script[merge]');
139   - //按 merge 值分组
140   - var jsMap = {}, mergeName;
141   - for (var i = 0, s; s = scriptArray[i++];) {
142   - mergeName = $(s).attr('merge');
143   - if (!jsMap[mergeName])
144   - jsMap[mergeName] = [];
145   - jsMap[mergeName].push(dest + _static + $(s).attr('src'));
146   - //remove
147   - $(s).remove();
148   - }
149   -
150   - //按 merge 合并压缩js
151   - var ks = get_keys(jsMap), index = 0;
152   - (function () {
153   - if (index >= ks.length) {
154   - write(file, $.html());
155   - console.log(file + ' 结束'.green);
156   - cb && cb();
157   - return;
158   - }
159   - var k = ks[index];
160   - index++;
161   - var f = arguments.callee;
162   - //合并压缩js
163   - var result = UglifyJS.minify(jsMap[k]);
164   - var data = result.code;
165   - var fName = (k + '_' + md5(data)) + '.js';
166   - //写入 assets js 目录下
167   - var descFile = dest + _static + sp + 'real_control_v2'+sp+'assets'+sp+'js' + sp + fName;
168   - fs.open(descFile, 'a', function (err, fd) {
169   -
170   - fs.write(fd, data, function () {
171   - var tag = '<script src="/real_control_v2/assets/js/' + fName + '"></script>';
172   - if ($('body').length > 0)
173   - $('body').append(tag);
174   - else {
175   - //没有body 就写在尾部
176   - $('*').last().after(tag);
177   - }
178   - console.log(k + ' js', '结束,下一个');
179   - f();
180   - });
181   - });
182   - })();
183   -};
184   -
185   -var get_keys = function (json) {
186   - var array = [];
187   - for (var key in json) {
188   - array.push(key);
189   - }
190   - return array;
191   -};
192   -
193   -function md5(text) {
194   - return crypto.createHash("md5").update(text).digest("hex");
195   -}
196   -
197   -function write(file, text) {
198   - fs.writeFile(file, text, function (err) {
199   - if (err) {
200   - console.log(err.toString().red);
201   - process.exit();
202   - }
203   - console.log(file.green);
204   - });
205   -}
206   -
  1 +/**
  2 + * 处理线调文件
  3 + */
  4 +var fs = require('fs')
  5 + , cheerio = require('cheerio')
  6 + , minifier = require('./minifier')
  7 + , crypto = require("crypto")
  8 + , CleanCSS = require('clean-css');
  9 +;
  10 +
  11 +var platform = process.platform;
  12 +var iswin = platform=='win32';
  13 +var sp = platform=='win32'?'\\':'/';
  14 +//不参与的目录
  15 +var pName = 'bsth_control'
  16 + , path = process.cwd()
  17 + //根目录
  18 + , root = path.substr(0, path.indexOf(sp + 'src'+sp+'main'))
  19 + , workspace = root.substr(0, root.lastIndexOf(sp + pName))
  20 + //临时目录
  21 + , dest = (workspace + sp + pName + '@fatso_copy')//.replace(/\//g, '\\')
  22 + , _static = sp + 'src'+sp+'main'+sp+'resources'+sp+'static';
  23 +
  24 +
  25 +var mainFile = dest + _static + sp + 'real_control_v2'+sp+'main.html';
  26 +var aloneMapWrapFile = dest + _static + sp + 'real_control_v2'+sp+'alone_page'+sp+'map'+sp+'alone_wrap.html';
  27 +var aloneHomeWrapFile = dest + _static + sp + 'real_control_v2'+sp+'alone_page'+sp+'home'+sp+'home_wrap.html';
  28 +var mapFile = dest + _static + sp + 'real_control_v2'+sp+'mapmonitor'+sp+'real.html';
  29 +var realCtl = {
  30 + /**
  31 + * 处理线调首页
  32 + */
  33 + handleMain: function (cb) {
  34 + //处理main.html
  35 + var data = fs.readFileSync(mainFile, 'utf-8'),
  36 + $ = cheerio.load(data);
  37 + handleCss($, function () {
  38 + handleJs($, mainFile, cb);
  39 + });
  40 +
  41 +
  42 + },
  43 + /**
  44 + * 处理地图模块
  45 + * @param cb
  46 + */
  47 + handleMap: function (cb) {
  48 + //读取文件
  49 + var data = fs.readFileSync(mapFile, 'utf-8')
  50 + , $ = cheerio.load(data);
  51 +
  52 + handleCss($, function () {
  53 + handleJs($, mapFile, cb);
  54 + });
  55 + },
  56 + /**
  57 + * 处理单屏地图页面
  58 + * @param cb
  59 + */
  60 + handleAlonePage: function (cb) {
  61 + var data = fs.readFileSync(aloneMapWrapFile, 'utf-8');
  62 + var $ = cheerio.load(data);
  63 + handleCss($, function () {
  64 + handleJs($, aloneMapWrapFile, cb);
  65 + });
  66 + },
  67 + /**
  68 + * 处理单屏主页
  69 + * @param cb
  70 + */
  71 + handleAloneHomePage: function (cb) {
  72 + var data = fs.readFileSync(aloneHomeWrapFile, 'utf-8');
  73 + var $ = cheerio.load(data);
  74 + handleCss($, function () {
  75 + handleJs($, aloneHomeWrapFile, cb);
  76 + });
  77 + }
  78 +
  79 +};
  80 +
  81 +/**
  82 + * 处理css
  83 + * @type {any}
  84 + */
  85 +var handleCss = function ($, cb) {
  86 + var cssArray = $('link[rel=stylesheet][merge]');
  87 + //按 merge 值分组
  88 + var cssMap = {}, mergeName;
  89 + for (var i = 0, c; c = cssArray[i++];) {
  90 + mergeName = $(c).attr('merge');
  91 + if (!cssMap[mergeName])
  92 + cssMap[mergeName] = [];
  93 + cssMap[mergeName].push(dest + _static + $(c).attr('href'));
  94 + //remove
  95 + $(c).remove();
  96 + }
  97 + //按 merge 合并压缩css
  98 + var ks = get_keys(cssMap), index = 0;
  99 + (function () {
  100 + if (index >= ks.length) {
  101 + cb && cb();
  102 + return;
  103 + }
  104 + var k = ks[index];
  105 + index++;
  106 + var f = arguments.callee;
  107 + //合并css
  108 + new CleanCSS().minify(cssMap[k], function (error, out) {
  109 + var data = out.styles;
  110 + var fName = (k + '_' + md5(data)) + '.css';
  111 + //写入 assets css 目录下
  112 + var descFile = dest + _static + sp + 'real_control_v2'+sp+'assets'+sp+'css' + sp + fName;
  113 + fs.open(descFile, 'a', function (err, fd) {
  114 +
  115 + fs.write(fd, data, function () {
  116 + var tag = '<link rel="stylesheet" href="/real_control_v2/assets/css/' + fName + '"/>';
  117 + if ($('head').length > 0)
  118 + $('head').append(tag);
  119 + else {
  120 + if($('link').length > 0)
  121 + $('link').last().before(tag);
  122 + else
  123 + $('div').first().before(tag);
  124 + }
  125 + console.log(k + ' css', '结束,下一个');
  126 + f();
  127 + });
  128 + });
  129 + });
  130 + })();
  131 +};
  132 +
  133 +/**
  134 + * 处理js
  135 + */
  136 +var handleJs = function ($, file, cb) {
  137 + var scriptArray = $('script[merge]');
  138 + //按 merge 值分组
  139 + var jsMap = {}, mergeName;
  140 + for (var i = 0, s; s = scriptArray[i++];) {
  141 + mergeName = $(s).attr('merge');
  142 + if (!jsMap[mergeName])
  143 + jsMap[mergeName] = [];
  144 + jsMap[mergeName].push(dest + _static + $(s).attr('src'));
  145 + //remove
  146 + $(s).remove();
  147 + }
  148 +
  149 + //按 merge 合并压缩js
  150 + var ks = get_keys(jsMap), index = 0;
  151 + (function () {
  152 + if (index >= ks.length) {
  153 + write(file, $.html());
  154 + console.log(file + ' 结束'); // 移除.green调用
  155 + cb && cb();
  156 + return;
  157 + }
  158 + var k = ks[index];
  159 + index++;
  160 + var f = arguments.callee;
  161 + //合并压缩js
  162 + try {
  163 + // 先合并文件内容
  164 + let code = '';
  165 + for(let j = 0; j < jsMap[k].length; j++) {
  166 + code += fs.readFileSync(jsMap[k][j], 'utf8') + '\n';
  167 + }
  168 + // 使用Terser压缩
  169 + var data = minifier.mini(code);
  170 + if (code !== '' && data === '') {
  171 + console.error('压缩出错')
  172 + process.exit();
  173 + }
  174 + var fName = (k + '_' + md5(data)) + '.js';
  175 + //写入 assets js 目录下
  176 + var descFile = dest + _static + sp + 'real_control_v2'+sp+'assets'+sp+'js' + sp + fName;
  177 + fs.open(descFile, 'a', function (err, fd) {
  178 + fs.write(fd, data, function () {
  179 + var tag = '<script src="/real_control_v2/assets/js/' + fName + '"></script>';
  180 + if ($('body').length > 0)
  181 + $('body').append(tag);
  182 + else {
  183 + //没有body 就写在尾部
  184 + $('*').last().after(tag);
  185 + }
  186 + console.log(k + ' js', '结束,下一个');
  187 + f();
  188 + });
  189 + });
  190 + } catch (e) {
  191 + console.error('合并压缩错误:', e);
  192 + process.exit();
  193 + }
  194 + })();
  195 +};
  196 +
  197 +var get_keys = function (json) {
  198 + var array = [];
  199 + for (var key in json) {
  200 + array.push(key);
  201 + }
  202 + return array;
  203 +};
  204 +
  205 +function md5(text) {
  206 + return crypto.createHash("md5").update(text).digest("hex");
  207 +}
  208 +
  209 +function write(file, text) {
  210 + fs.writeFile(file, text, function (err) {
  211 + if (err) {
  212 + console.log(err.toString()); // 移除.red调用
  213 + process.exit();
  214 + }
  215 + console.log(file); // 移除.green调用
  216 + });
  217 +}
  218 +
207 219 module.exports = realCtl;
208 220 \ No newline at end of file
... ...
src/main/resources/fatso/minifier.js
1   -/**
2   - * @author PanZhao
3   - * @date 2016年3月17日 下午12:44:06
4   - */
5   -var fs = require('fs');
6   -var UglifyJS = require("uglify-js");
7   -
8   -var platform = process.platform;
9   -var iswin = platform=='win32';
10   -var separator = platform=='win32'?'\\':'/';
11   -var minifier = {
12   -
13   - mergeAndMini: function(fileArray,scriptString, root, file){
14   - var len = fileArray.length;
15   - for(var i = 0; i < len; i ++){
16   - fileArray[i] = root + fileArray[i].split('/').join(separator);
17   - }
18   -
19   - var result, indoorRs;
20   -
21   - try {
22   - if(fileArray && len > 0)
23   - result = UglifyJS.minify(fileArray);
24   -
25   - if(scriptString)
26   - indoorRs = UglifyJS.minify(scriptString, {fromString: true});
27   - } catch (e) {
28   - console.log(e);
29   - console.log(file.red);
30   - process.exit();
31   - }
32   -
33   - return {outside: result?result.code:'', inside: indoorRs?indoorRs.code:''};
34   - },
35   - mini: function(file){
36   - return UglifyJS.minify(file).code;
37   - }
38   -}
39   -
  1 +var fs = require('fs');
  2 +var Terser = require('terser');
  3 +
  4 +var platform = process.platform;
  5 +var iswin = platform=='win32';
  6 +var separator = platform=='win32'?'\\':'/';
  7 +var minifier = {
  8 +
  9 + mergeAndMini: function(fileArray, scriptString, root, file) {
  10 + var len = fileArray.length;
  11 + for(var i = 0; i < len; i ++){
  12 + fileArray[i] = root + fileArray[i].split('/').join(separator);
  13 + }
  14 +
  15 + var result, indoorRs;
  16 +
  17 + try {
  18 + if(fileArray && len > 0) {
  19 + // Terser可以直接接受文件路径数组
  20 + result = Terser.minify_sync(fs.readFileSync(fileArray[0], 'utf8'));
  21 + // 如果有多个文件,需要先合并内容
  22 + if(len > 1) {
  23 + let code = '';
  24 + for(let j = 0; j < len; j++) {
  25 + code += fs.readFileSync(fileArray[j], 'utf8') + '\n';
  26 + }
  27 + result = Terser.minify_sync(code);
  28 + }
  29 + }
  30 +
  31 + if(scriptString) {
  32 + // Terser不需要fromString选项,直接传递代码字符串
  33 + indoorRs = Terser.minify_sync(scriptString);
  34 + }
  35 + } catch (e) {
  36 + console.log(e);
  37 + console.log(file); // 移除.red调用,除非有chalk等库
  38 + process.exit();
  39 + }
  40 +
  41 + return {outside: result && !result.error ? result.code : '', inside: indoorRs && !indoorRs.error ? indoorRs.code : ''};
  42 + },
  43 +
  44 + mini: function(file) {
  45 + try {
  46 + // 检查file是文件路径还是代码字符串
  47 + if(typeof file === 'string' && fs.existsSync(file)) {
  48 + const code = fs.readFileSync(file, 'utf8');
  49 + const result = Terser.minify_sync(code);
  50 + return result && !result.error ? result.code : '';
  51 + } else {
  52 + // 假设是代码字符串
  53 + const result = Terser.minify_sync(file);
  54 + return result && !result.error ? result.code : '';
  55 + }
  56 + } catch (e) {
  57 + console.log(e);
  58 + return '';
  59 + }
  60 + }
  61 +};
  62 +
40 63 module.exports = minifier;
41 64 \ No newline at end of file
... ...
src/main/resources/fatso/package.json
1   -{
2   - "name": "fatso",
3   - "version": "1.0.0",
4   - "description": "子页面js检查、合并、压缩等处理",
5   - "main": "start.js",
6   - "scripts": {
7   - "test": "echo \"Error: no test specified\" && exit 1"
8   - },
9   - "author": "panzhaov5",
10   - "license": "ISC",
11   - "dependencies": {
12   - "cheerio": "^0.20.0",
13   - "clean-css": "^4.0.12",
14   - "colors": "^1.3.3",
15   - "eventproxy": "^0.3.5",
16   - "uglify-js": "^2.6.2"
17   - }
18   -}
  1 +{
  2 + "name": "fatso",
  3 + "version": "1.0.0",
  4 + "description": "子页面js检查、合并、压缩等处理",
  5 + "main": "start.js",
  6 + "scripts": {
  7 + "test": "echo \"Error: no test specified\" && exit 1"
  8 + },
  9 + "author": "panzhaov5",
  10 + "license": "ISC",
  11 + "dependencies": {
  12 + "cheerio": "^0.20.0",
  13 + "clean-css": "^4.0.12",
  14 + "colors": "^1.3.3",
  15 + "eventproxy": "^0.3.4",
  16 + "terser": "^5.44.0",
  17 + "uglify-js": "^2.6.2"
  18 + }
  19 +}
... ...
src/main/resources/static/gpsTest/test.html
... ... @@ -84,7 +84,7 @@ form .item select {
84 84 <script src="/metronic_v4.5.4/plugins/jquery.min.js"></script>
85 85 <script src="/assets/plugins/jquery.serializejson.js"></script>
86 86 <script
87   - src="//api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script>
  87 + src="//api.map.baidu.com/api?v=2.0&ak=1TgEKvYqohJyeGXnN6yHSSTb4psOarQw"></script>
88 88 <script type="text/javascript"
89 89 src="//api.map.baidu.com/library/DistanceTool/1.2/src/DistanceTool_min.js"></script>
90 90 <!-- moment.js 日期处理类库 -->
... ...
src/main/resources/static/pages/base/carpark/add.html
1   -<link href="/pages/base/carpark/css/carpark-add.css" rel="stylesheet" type="text/css" />
2   -<div class="page-head">
3   - <div class="page-title">
4   - <h1>添加停车场</h1>
5   - </div>
6   -</div>
7   -
8   -<ul class="page-breadcrumb breadcrumb">
9   - <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li>
10   - <li><span class="active">基础信息</span> <i class="fa fa-circle"></i></li>
11   - <li><a href="/pages/base/carpark/list.html" data-pjax>停车场信息</a> <i class="fa fa-circle"></i></li>
12   - <li><span class="active">添加停车场</span></li>
13   -</ul>
14   -
15   -<div class="portlet light bordered" id="form-wizard-info">
16   - <div class="portlet-title">
17   - <div class="caption">
18   - <i class="icon-equalizer font-red-sunglo"></i>
19   - <span class="caption-subject font-red-sunglo bold uppercase">添加停车场
20   - <span class="step-title"> 1 - 4 </span>
21   - <i class="fa fa-question-circle tipso-animation" style="color: rgba(158, 158, 158, 0.49);"></i>
22   - </span>
23   - </div>
24   -
25   - <div class="actions">
26   - <div class="btn-group btn-group-devided" data-toggle="buttons">
27   - <a class="btn btn-circle default" href="/pages/base/carpark/list.html" style="float: right;padding: 4px 23px;" data-pjax=""><i class="fa fa-reply"></i> 退出</a>
28   - </div>
29   - </div>
30   - </div>
31   - <div class="portlet-body form">
32   -
33   - <!-- START FORM -->
34   - <form class="form-horizontal" id="submit_carpark_form" action="/" method="POST" novalidate="novalidate">
35   - <div class="form-wizard">
36   - <div class="form-body">
37   - <ul class="nav nav-pills nav-justified steps">
38   - <li class="active">
39   - <a href="#tab1" data-toggle="tab" class="step" aria-expanded="true">
40   - <span class="number"> 1 </span>
41   - <span class="desc">
42   - <i class="fa fa-check"></i> 获取停车场位置方式 </span>
43   - </a>
44   - </li>
45   - <li>
46   - <a href="#tab2" data-toggle="tab" class="step">
47   - <span class="number"> 2 </span>
48   - <span class="desc">
49   - <i class="fa fa-check"></i> 确定停车场位置 </span>
50   - </a>
51   - </li>
52   - <li>
53   - <a href="#tab3" data-toggle="tab" class="step active">
54   - <span class="number"> 3 </span>
55   - <span class="desc">
56   - <i class="fa fa-check"></i> 填写停车场信息 </span>
57   - </a>
58   - </li>
59   - <li>
60   - <a href="#tab4" data-toggle="tab" class="step">
61   - <span class="number"> 4 </span>
62   - <span class="desc">
63   - <i class="fa fa-check"></i> 确认并提交 </span>
64   - </a>
65   - </li>
66   - </ul>
67   -
68   - <!-- 进度条 -->
69   - <div id="bar" class="progress progress-striped" role="progressbar">
70   - <div class="progress-bar progress-bar-success" style="width: 25%;"></div>
71   - </div>
72   -
73   - <div class="tab-content">
74   - <div class="alert alert-danger display-hide">
75   - <button class="close" data-close="alert"></button>
76   - 您的输入有误,请检查下面的输入项
77   - </div>
78   - <div class="alert alert-success display-none">
79   - <button class="close" data-dismiss="alert"></button>
80   - Your form validation is successful!
81   - </div>
82   -
83   - <!-- 选择添加站点方式 -->
84   - <div class="tab-pane active" id="tab1">
85   - <h3 class="block"> 获取停车场位置方式 </h3>
86   - <!--停车场名称 -->
87   - <div class="form-group" id="formRequ">
88   - <label class="col-md-3 control-label"><span class="required"> * </span>停车场名称&nbsp;&nbsp;&nbsp;:</label>
89   - <div class="col-md-9">
90   - <input type="text" class="form-control input-medium" id="parkNamebooxtInput" name="parkNamebooxt" placeholder="请输入停车场名称">
91   - </div>
92   - </div>
93   - <!-- 新增方式 -->
94   - <div class="form-group">
95   - <label class="col-md-3 control-label"><span class="required"> * </span>选择获取方式:</label>
96   - <div class="col-md-9">
97   - <div class="icheck-list">
98   - <label>
99   - <input type="radio" class="icheck" name="baseRes" value=0 checked> 系统生成
100   - </label>
101   - <label >
102   - <input type="radio" class="icheck" name="baseRes" value=1 > 手动绘制
103   - </label>
104   - </div>
105   - </div>
106   - </div>
107   - </div>
108   - <!--停车场位置 -->
109   - <div class="tab-pane" id="tab2">
110   - <h3 class="block"> 停车场位置 </h3>
111   - <div id="addCarParkbmap_basic"></div>
112   - <div class="leftUtils">
113   - <div class="btn-group" style="left: 100px;">
114   - <a class="btn btn-sm green-seagreen dropdown-toggle" style="width: 98px;" href="javascript:;" data-toggle="dropdown" aria-expanded="false"> 绘制工具
115   - <i class="fa fa-angle-down"></i>
116   - </a>
117   - <ul class="dropdown-menu pull-right" style="min-width:100px">
118   - <li>
119   - <a href="javascript:;" id="oppenDrawingManager"><i class="fa fa-pencil"></i> 打开 </a>
120   - </li>
121   - <li>
122   - <a href="javascript:;" id = "closeDrawingManager"> <i class="fa fa-reply"></i> 关闭 </a>
123   - </li>
124   -
125   - </ul>
126   - </div>
127   - </div>
128   - </div>
129   - <!--停车场信息 -->
130   - <div class="tab-pane" id="tab3">
131   - <h3 class="block"> 停车场信息 </h3>
132   - <input type="hidden" name="bParkPoint" id="bParkPointInput" />
133   - <input type="hidden" name="gParkPoint" id="gParkPointInput" />
134   - <input type="hidden" name="dbType" id="dbTypeInput" value="b"/>
135   - <!-- 停车场名称 -->
136   - <div class="form-body">
137   - <div class="form-group">
138   - <label class="control-label col-md-3">
139   - <span class="required"> * </span> 停车场名称&nbsp;&nbsp;&nbsp; :
140   - </label>
141   - <div class="col-md-6">
142   - <input type="text" class="form-control" name="parkName" id="parkNameInput" placeholder="请输入站点名称" readonly="readonly">
143   - </div>
144   - </div>
145   - </div>
146   - <!-- 停车场编码 -->
147   - <div class="form-body">
148   - <div class="form-group">
149   - <label class="control-label col-md-3">
150   - <span class="required"> * </span>停车场编码&nbsp;&nbsp;&nbsp;:
151   - </label>
152   - <div class="col-md-6">
153   - <input type="text" class="form-control" name="parkCode" id="parkCodeInput" placeholder="请输入停车场编码">
154   - </div>
155   - </div>
156   - </div>
157   - <!-- 经纬度坐标点 -->
158   - <div class="form-body">
159   - <div class="form-group">
160   - <label class="col-md-3 control-label"><span class="required"> * </span>经纬度坐标点:</label>
161   - <div class="col-md-6">
162   - <input type="text" class="form-control" name="bCenterPoint" id="bCenterPointInput" readonly="readonly" placeholder="请输入经纬度坐标点">
163   - </div>
164   - </div>
165   - </div>
166   -
167   - <!-- 几何图形类型 -->
168   - <div class="form-body">
169   - <div class="form-group">
170   - <label class="col-md-3 control-label"><span class="required"> * </span>几何图形类型:</label>
171   - <div class="col-md-6">
172   - <input type="text" class="form-control" name="shapesType" id="shapesTypeSelect" readonly="readonly" placeholder="请输入几何图形类型">
173   - </div>
174   - </div>
175   - </div>
176   - <!-- 圆形半径 -->
177   - <div class="form-body" id="radiusGroup">
178   - <div class="form-group">
179   - <label class="col-md-3 control-label"><span class="required"> * </span> 圆形半径&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
180   - <div class="col-md-6">
181   - <input type="text" class="form-control" name="radius" id="radiusInput" placeholder="请输入圆形半径">
182   - </div>
183   - </div>
184   - </div>
185   - <!-- 是否撤销 -->
186   - <div class="form-body">
187   - <div class="form-group">
188   - <label class="col-md-3 control-label"><span class="required"> * </span>是否撤销&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
189   - <div class="col-md-6">
190   - <select name="destroy" class="form-control" id="destroySelect">
191   - <option value="">-- 请选择撤销类型 --</option>
192   - <option value="0">否</option>
193   - <option value="1">是</option>
194   - </select>
195   - </div>
196   - </div>
197   - </div>
198   - <!-- 面积 -->
199   - <div class="form-body">
200   - <div class="form-group">
201   - <label class="col-md-3 control-label">面积&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
202   - <div class="col-md-6">
203   - <input type="text" class="form-control" name="area" id="areaInput" placeholder="请输入面积">
204   - <span class="help-block">单位:平方米(㎡)</span>
205   - </div>
206   - </div>
207   - </div>
208   - <!-- 所属公司 -->
209   - <div class="form-body">
210   - <div class="form-group">
211   - <label class="col-md-3 control-label"><span class="required"> * </span>所属公司&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
212   - <div class="col-md-6">
213   - <select name="company" class="form-control" style="width:100%" id="companySelect"></select>
214   - </div>
215   - </div>
216   - </div>
217   - <!-- 所属分公司 -->
218   - <div class="form-body">
219   - <div class="form-group">
220   - <label class="col-md-3 control-label"><span class="required"> * </span>所属分公司&nbsp;&nbsp;&nbsp;:</label>
221   - <div class="col-md-6">
222   - <select name="brancheCompany" class="form-control" style="width:100%" id="brancheCompanySelect">
223   - </select>
224   - </div>
225   - </div>
226   - </div>
227   - <!-- 版本号 -->
228   - <div class="form-body">
229   - <div class="form-group">
230   - <label class="col-md-3 control-label">版本号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
231   - <div class="col-md-6">
232   - <input type="text" class="form-control" name="versions" value='1' Readonly placeholder="请输入版本号">
233   - </div>
234   - </div>
235   - </div>
236   - <!-- 描述/说明 -->
237   - <div class="form-group">
238   - <label class="control-label col-md-3"> 描述/说明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
239   - <div class="col-md-6">
240   - <textarea class="form-control" rows="3" name="descriptions" id="descriptionsTextarea" placeholder="请输入描述/说明"></textarea>
241   - </div>
242   - </div>
243   -
244   - </div>
245   - <!-- 确定提交资料信息 -->
246   - <div class="tab-pane" id="tab4">
247   - <h3 class="block"> 确认您提交的停车场信息 </h3>
248   - <h4 class="form-section"> 地理位置 </h4>
249   - <div class="form-group">
250   - <label class="control-label col-md-3"> 几何图形类型: </label>
251   - <div class="col-md-4">
252   - <p class="form-control-static" data-display="shapesType"> </p>
253   - </div>
254   - </div>
255   - <div class="form-group">
256   - <label class="control-label col-md-3"> 圆形半径&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
257   - <div class="col-md-4">
258   - <p class="form-control-static" data-display="radius"> </p>
259   - </div>
260   - </div>
261   -
262   - <div class="form-group">
263   - <label class="control-label col-md-3"> 经纬度坐标点: </label>
264   - <div class="col-md-4">
265   - <p class="form-control-static" data-display="bCenterPoint"> </p>
266   - </div>
267   - </div>
268   - <h4 class="form-section"> 停车场信息 </h4>
269   - <div class="form-group">
270   - <label class="control-label col-md-3">停车场名称&nbsp;&nbsp;&nbsp;:</label>
271   - <div class="col-md-4">
272   - <p class="form-control-static" data-display="parkName"> </p>
273   - </div>
274   - </div>
275   - <div class="form-group">
276   - <label class="control-label col-md-3">停车场编码&nbsp;&nbsp;&nbsp;:</label>
277   - <div class="col-md-4">
278   - <p class="form-control-static" data-display="parkCode"> </p>
279   - </div>
280   - </div>
281   - <div class="form-group">
282   - <label class="control-label col-md-3">是否撤销&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
283   - <div class="col-md-4">
284   - <p class="form-control-static" data-display="destroy"> </p>
285   - </div>
286   - </div>
287   - <div class="form-group">
288   - <label class="control-label col-md-3">面积&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
289   - <div class="col-md-4">
290   - <p class="form-control-static" data-display="area"> </p>
291   - </div>
292   - </div>
293   - <div class="form-group">
294   - <label class="control-label col-md-3">所属公司&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
295   - <div class="col-md-4">
296   - <p class="form-control-static" data-display="company"> </p>
297   - </div>
298   - </div>
299   - <div class="form-group">
300   - <label class="control-label col-md-3">分公司&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
301   - <div class="col-md-4">
302   - <p class="form-control-static" data-display="brancheCompany"> </p>
303   - </div>
304   - </div>
305   - <div class="form-group">
306   - <label class="control-label col-md-3">版本号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
307   - <div class="col-md-4">
308   - <p class="form-control-static" data-display="versions"> </p>
309   - </div>
310   - </div>
311   - <div class="form-group">
312   - <label class="control-label col-md-3">描述/说明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
313   - <div class="col-md-4">
314   - <p class="form-control-static" data-display="descriptions"> </p>
315   - </div>
316   - </div>
317   - </div>
318   - </div>
319   - </div>
320   - <div class="form-actions">
321   - <div class="row">
322   - <div class="col-md-offset-3 col-md-9">
323   - <a href="javascript:;" class="btn default button-previous disabled" style="display: none;">
324   - <i class="fa fa-angle-left"></i> 返回 </a>
325   - <a href="javascript:;" class="btn btn-outline green button-next"> 下一步
326   - <i class="fa fa-angle-right"></i>
327   - </a>
328   - <a href="javascript:;" class="btn green button-submit" style="display: none;" id="submintBtn"> 提交
329   - <i class="fa fa-check"></i>
330   - </a>
331   - </div>
332   - </div>
333   - </div>
334   - </div>
335   - </form>
336   - <!-- END FORM-->
337   - </div>
338   -</div>
339   -<!-- 函数方法JS类库 -->
340   -<script src="/pages/base/carpark/js/add-input-function.js"></script>
341   -<!-- 表单向导JS类库 -->
342   -<script src="/pages/base/carpark/js/add-form-wizard.js"></script>
343   -<!-- reload事件 -->
344   -<script src="/pages/base/carpark/js/add-form-reload.js"></script>
345   -<!-- 地图JS类库 -->
346   -<script src="/pages/base/carpark/js/add-vmap-world.js"></script>
347   -<!-- 表单元素事件JS类库 -->
  1 +<link href="/pages/base/carpark/css/carpark-add.css" rel="stylesheet" type="text/css" />
  2 +<div class="page-head">
  3 + <div class="page-title">
  4 + <h1>添加停车场</h1>
  5 + </div>
  6 +</div>
  7 +
  8 +<ul class="page-breadcrumb breadcrumb">
  9 + <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li>
  10 + <li><span class="active">基础信息</span> <i class="fa fa-circle"></i></li>
  11 + <li><a href="/pages/base/carpark/list.html" data-pjax>场站信息</a> <i class="fa fa-circle"></i></li>
  12 + <li><span class="active">添加停车场</span></li>
  13 +</ul>
  14 +
  15 +<div class="portlet light bordered" id="form-wizard-info">
  16 + <div class="portlet-title">
  17 + <div class="caption">
  18 + <i class="icon-equalizer font-red-sunglo"></i>
  19 + <span class="caption-subject font-red-sunglo bold uppercase">添加停车场
  20 + <span class="step-title"> 1 - 4 </span>
  21 + <i class="fa fa-question-circle tipso-animation" style="color: rgba(158, 158, 158, 0.49);"></i>
  22 + </span>
  23 + </div>
  24 +
  25 + <div class="actions">
  26 + <div class="btn-group btn-group-devided" data-toggle="buttons">
  27 + <a class="btn btn-circle default" href="/pages/base/carpark/list.html" style="float: right;padding: 4px 23px;" data-pjax=""><i class="fa fa-reply"></i> 退出</a>
  28 + </div>
  29 + </div>
  30 + </div>
  31 + <div class="portlet-body form">
  32 +
  33 + <!-- START FORM -->
  34 + <form class="form-horizontal" id="submit_carpark_form" action="/" method="POST" novalidate="novalidate">
  35 + <div class="form-wizard">
  36 + <div class="form-body">
  37 + <ul class="nav nav-pills nav-justified steps">
  38 + <li class="active">
  39 + <a href="#tab1" data-toggle="tab" class="step" aria-expanded="true">
  40 + <span class="number"> 1 </span>
  41 + <span class="desc">
  42 + <i class="fa fa-check"></i> 获取停车场位置方式 </span>
  43 + </a>
  44 + </li>
  45 + <li>
  46 + <a href="#tab2" data-toggle="tab" class="step">
  47 + <span class="number"> 2 </span>
  48 + <span class="desc">
  49 + <i class="fa fa-check"></i> 确定停车场位置 </span>
  50 + </a>
  51 + </li>
  52 + <li>
  53 + <a href="#tab3" data-toggle="tab" class="step active">
  54 + <span class="number"> 3 </span>
  55 + <span class="desc">
  56 + <i class="fa fa-check"></i> 填写场站信息 </span>
  57 + </a>
  58 + </li>
  59 + <li>
  60 + <a href="#tab4" data-toggle="tab" class="step">
  61 + <span class="number"> 4 </span>
  62 + <span class="desc">
  63 + <i class="fa fa-check"></i> 确认并提交 </span>
  64 + </a>
  65 + </li>
  66 + </ul>
  67 +
  68 + <!-- 进度条 -->
  69 + <div id="bar" class="progress progress-striped" role="progressbar">
  70 + <div class="progress-bar progress-bar-success" style="width: 25%;"></div>
  71 + </div>
  72 +
  73 + <div class="tab-content">
  74 + <div class="alert alert-danger display-hide">
  75 + <button class="close" data-close="alert"></button>
  76 + 您的输入有误,请检查下面的输入项
  77 + </div>
  78 + <div class="alert alert-success display-none">
  79 + <button class="close" data-dismiss="alert"></button>
  80 + Your form validation is successful!
  81 + </div>
  82 +
  83 + <!-- 选择添加站点方式 -->
  84 + <div class="tab-pane active" id="tab1">
  85 + <h3 class="block"> 获取停车场位置方式 </h3>
  86 + <!--停车场名称 -->
  87 + <div class="form-group" id="formRequ">
  88 + <label class="col-md-3 control-label"><span class="required"> * </span>停车场名称&nbsp;&nbsp;&nbsp;:</label>
  89 + <div class="col-md-9">
  90 + <input type="text" class="form-control input-medium" id="parkNamebooxtInput" name="parkNamebooxt" placeholder="请输入停车场名称">
  91 + </div>
  92 + </div>
  93 + <!-- 新增方式 -->
  94 + <div class="form-group">
  95 + <label class="col-md-3 control-label"><span class="required"> * </span>选择获取方式:</label>
  96 + <div class="col-md-9">
  97 + <div class="icheck-list">
  98 + <label>
  99 + <input type="radio" class="icheck" name="baseRes" value=0 checked> 系统生成
  100 + </label>
  101 + <label >
  102 + <input type="radio" class="icheck" name="baseRes" value=1 > 手动绘制
  103 + </label>
  104 + </div>
  105 + </div>
  106 + </div>
  107 + </div>
  108 + <!--停车场位置 -->
  109 + <div class="tab-pane" id="tab2">
  110 + <h3 class="block"> 停车场位置 </h3>
  111 + <div id="addCarParkbmap_basic"></div>
  112 + <div class="leftUtils">
  113 + <div class="btn-group" style="left: 100px;">
  114 + <a class="btn btn-sm green-seagreen dropdown-toggle" style="width: 98px;" href="javascript:;" data-toggle="dropdown" aria-expanded="false"> 绘制工具
  115 + <i class="fa fa-angle-down"></i>
  116 + </a>
  117 + <ul class="dropdown-menu pull-right" style="min-width:100px">
  118 + <li>
  119 + <a href="javascript:;" id="oppenDrawingManager"><i class="fa fa-pencil"></i> 打开 </a>
  120 + </li>
  121 + <li>
  122 + <a href="javascript:;" id = "closeDrawingManager"> <i class="fa fa-reply"></i> 关闭 </a>
  123 + </li>
  124 +
  125 + </ul>
  126 + </div>
  127 + </div>
  128 + </div>
  129 + <!--场站信息 -->
  130 + <div class="tab-pane" id="tab3">
  131 + <h3 class="block"> 场站信息 </h3>
  132 + <input type="hidden" name="bParkPoint" id="bParkPointInput" />
  133 + <input type="hidden" name="gParkPoint" id="gParkPointInput" />
  134 + <input type="hidden" name="dbType" id="dbTypeInput" value="b"/>
  135 + <!-- 停车场名称 -->
  136 + <div class="form-body">
  137 + <div class="form-group">
  138 + <label class="control-label col-md-3">
  139 + <span class="required"> * </span> 停车场名称&nbsp;&nbsp;&nbsp; :
  140 + </label>
  141 + <div class="col-md-6">
  142 + <input type="text" class="form-control" name="parkName" id="parkNameInput" placeholder="请输入站点名称" readonly="readonly">
  143 + </div>
  144 + </div>
  145 + </div>
  146 + <!-- 停车场编码 -->
  147 + <div class="form-body">
  148 + <div class="form-group">
  149 + <label class="control-label col-md-3">
  150 + <span class="required"> * </span>停车场编码&nbsp;&nbsp;&nbsp;:
  151 + </label>
  152 + <div class="col-md-6">
  153 + <input type="text" class="form-control" name="parkCode" id="parkCodeInput" placeholder="请输入停车场编码">
  154 + </div>
  155 + </div>
  156 + </div>
  157 + <!-- 经纬度坐标点 -->
  158 + <div class="form-body">
  159 + <div class="form-group">
  160 + <label class="col-md-3 control-label"><span class="required"> * </span>经纬度坐标点:</label>
  161 + <div class="col-md-6">
  162 + <input type="text" class="form-control" name="bCenterPoint" id="bCenterPointInput" readonly="readonly" placeholder="请输入经纬度坐标点">
  163 + </div>
  164 + </div>
  165 + </div>
  166 +
  167 + <!-- 几何图形类型 -->
  168 + <div class="form-body">
  169 + <div class="form-group">
  170 + <label class="col-md-3 control-label"><span class="required"> * </span>几何图形类型:</label>
  171 + <div class="col-md-6">
  172 + <input type="text" class="form-control" name="shapesType" id="shapesTypeSelect" readonly="readonly" placeholder="请输入几何图形类型">
  173 + </div>
  174 + </div>
  175 + </div>
  176 + <!-- 圆形半径 -->
  177 + <div class="form-body" id="radiusGroup">
  178 + <div class="form-group">
  179 + <label class="col-md-3 control-label"><span class="required"> * </span> 圆形半径&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  180 + <div class="col-md-6">
  181 + <input type="text" class="form-control" name="radius" id="radiusInput" placeholder="请输入圆形半径">
  182 + </div>
  183 + </div>
  184 + </div>
  185 + <!-- 是否撤销 -->
  186 + <div class="form-body">
  187 + <div class="form-group">
  188 + <label class="col-md-3 control-label"><span class="required"> * </span>是否撤销&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  189 + <div class="col-md-6">
  190 + <select name="destroy" class="form-control" id="destroySelect">
  191 + <option value="">-- 请选择撤销类型 --</option>
  192 + <option value="0">否</option>
  193 + <option value="1">是</option>
  194 + </select>
  195 + </div>
  196 + </div>
  197 + </div>
  198 + <!-- 面积 -->
  199 + <div class="form-body">
  200 + <div class="form-group">
  201 + <label class="col-md-3 control-label">面积&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  202 + <div class="col-md-6">
  203 + <input type="text" class="form-control" name="area" id="areaInput" placeholder="请输入面积">
  204 + <span class="help-block">单位:平方米(㎡)</span>
  205 + </div>
  206 + </div>
  207 + </div>
  208 + <!-- 所属公司 -->
  209 + <div class="form-body">
  210 + <div class="form-group">
  211 + <label class="col-md-3 control-label"><span class="required"> * </span>所属公司&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  212 + <div class="col-md-6">
  213 + <select name="company" class="form-control" style="width:100%" id="companySelect"></select>
  214 + </div>
  215 + </div>
  216 + </div>
  217 + <!-- 所属分公司 -->
  218 + <div class="form-body">
  219 + <div class="form-group">
  220 + <label class="col-md-3 control-label"><span class="required"> * </span>所属分公司&nbsp;&nbsp;&nbsp;:</label>
  221 + <div class="col-md-6">
  222 + <select name="brancheCompany" class="form-control" style="width:100%" id="brancheCompanySelect">
  223 + </select>
  224 + </div>
  225 + </div>
  226 + </div>
  227 + <!-- 版本号 -->
  228 + <div class="form-body">
  229 + <div class="form-group">
  230 + <label class="col-md-3 control-label">版本号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  231 + <div class="col-md-6">
  232 + <input type="text" class="form-control" name="versions" value='1' Readonly placeholder="请输入版本号">
  233 + </div>
  234 + </div>
  235 + </div>
  236 + <!-- 描述/说明 -->
  237 + <div class="form-group">
  238 + <label class="control-label col-md-3"> 描述/说明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
  239 + <div class="col-md-6">
  240 + <textarea class="form-control" rows="3" name="descriptions" id="descriptionsTextarea" placeholder="请输入描述/说明"></textarea>
  241 + </div>
  242 + </div>
  243 +
  244 + </div>
  245 + <!-- 确定提交资料信息 -->
  246 + <div class="tab-pane" id="tab4">
  247 + <h3 class="block"> 确认您提交的场站信息 </h3>
  248 + <h4 class="form-section"> 地理位置 </h4>
  249 + <div class="form-group">
  250 + <label class="control-label col-md-3"> 几何图形类型: </label>
  251 + <div class="col-md-4">
  252 + <p class="form-control-static" data-display="shapesType"> </p>
  253 + </div>
  254 + </div>
  255 + <div class="form-group">
  256 + <label class="control-label col-md-3"> 圆形半径&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </label>
  257 + <div class="col-md-4">
  258 + <p class="form-control-static" data-display="radius"> </p>
  259 + </div>
  260 + </div>
  261 +
  262 + <div class="form-group">
  263 + <label class="control-label col-md-3"> 经纬度坐标点: </label>
  264 + <div class="col-md-4">
  265 + <p class="form-control-static" data-display="bCenterPoint"> </p>
  266 + </div>
  267 + </div>
  268 + <h4 class="form-section"> 场站信息 </h4>
  269 + <div class="form-group">
  270 + <label class="control-label col-md-3">停车场名称&nbsp;&nbsp;&nbsp;:</label>
  271 + <div class="col-md-4">
  272 + <p class="form-control-static" data-display="parkName"> </p>
  273 + </div>
  274 + </div>
  275 + <div class="form-group">
  276 + <label class="control-label col-md-3">停车场编码&nbsp;&nbsp;&nbsp;:</label>
  277 + <div class="col-md-4">
  278 + <p class="form-control-static" data-display="parkCode"> </p>
  279 + </div>
  280 + </div>
  281 + <div class="form-group">
  282 + <label class="control-label col-md-3">是否撤销&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  283 + <div class="col-md-4">
  284 + <p class="form-control-static" data-display="destroy"> </p>
  285 + </div>
  286 + </div>
  287 + <div class="form-group">
  288 + <label class="control-label col-md-3">面积&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  289 + <div class="col-md-4">
  290 + <p class="form-control-static" data-display="area"> </p>
  291 + </div>
  292 + </div>
  293 + <div class="form-group">
  294 + <label class="control-label col-md-3">所属公司&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  295 + <div class="col-md-4">
  296 + <p class="form-control-static" data-display="company"> </p>
  297 + </div>
  298 + </div>
  299 + <div class="form-group">
  300 + <label class="control-label col-md-3">分公司&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  301 + <div class="col-md-4">
  302 + <p class="form-control-static" data-display="brancheCompany"> </p>
  303 + </div>
  304 + </div>
  305 + <div class="form-group">
  306 + <label class="control-label col-md-3">版本号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  307 + <div class="col-md-4">
  308 + <p class="form-control-static" data-display="versions"> </p>
  309 + </div>
  310 + </div>
  311 + <div class="form-group">
  312 + <label class="control-label col-md-3">描述/说明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</label>
  313 + <div class="col-md-4">
  314 + <p class="form-control-static" data-display="descriptions"> </p>
  315 + </div>
  316 + </div>
  317 + </div>
  318 + </div>
  319 + </div>
  320 + <div class="form-actions">
  321 + <div class="row">
  322 + <div class="col-md-offset-3 col-md-9">
  323 + <a href="javascript:;" class="btn default button-previous disabled" style="display: none;">
  324 + <i class="fa fa-angle-left"></i> 返回 </a>
  325 + <a href="javascript:;" class="btn btn-outline green button-next"> 下一步
  326 + <i class="fa fa-angle-right"></i>
  327 + </a>
  328 + <a href="javascript:;" class="btn green button-submit" style="display: none;" id="submintBtn"> 提交
  329 + <i class="fa fa-check"></i>
  330 + </a>
  331 + </div>
  332 + </div>
  333 + </div>
  334 + </div>
  335 + </form>
  336 + <!-- END FORM-->
  337 + </div>
  338 +</div>
  339 +<!-- 函数方法JS类库 -->
  340 +<script src="/pages/base/carpark/js/add-input-function.js"></script>
  341 +<!-- 表单向导JS类库 -->
  342 +<script src="/pages/base/carpark/js/add-form-wizard.js"></script>
  343 +<!-- reload事件 -->
  344 +<script src="/pages/base/carpark/js/add-form-reload.js"></script>
  345 +<!-- 地图JS类库 -->
  346 +<script src="/pages/base/carpark/js/add-vmap-world.js"></script>
  347 +<!-- 表单元素事件JS类库 -->
348 348 <script src="/pages/base/carpark/js/add-form-events.js"></script>
349 349 \ No newline at end of file
... ...
src/main/resources/static/pages/base/carpark/edit.html
... ... @@ -145,7 +145,7 @@
145 145 <script type="text/javascript">
146 146  
147 147 $('#editPoitsions_carpark_mobal').on('editCarParkMobal_show', function(e, map,fun,carP,ajaxd){
148   - /** 获取停车场信息对象 */
  148 + /** 获取场站信息对象 */
149 149 var CarParkObj = carP.getEitdCarPark();
150 150 // 获取修改停车场对象ID
151 151 var carParkId = CarParkObj.carParkId;
... ...
src/main/resources/static/pages/base/carpark/js/add-vmap-world.js
1   -var addCarParkVmapWorlds = function() {
2   - var mapB = '', circle = '', drawingManager = '',circle='',marker='';
3   - var Bmap = {
4   - init : function() {
5   - // 设置中心点,
6   - var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
7   - // 百度API Key
8   - var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
9   - // 初始化百度地图
10   - mapB = new BMap.Map("addCarParkbmap_basic");
11   - //中心点和缩放级别
12   - mapB.centerAndZoom(new BMap.Point(CENTER_POINT.lng,CENTER_POINT.lat), 15);
13   - //启用地图拖拽事件,默认启用(可不写)
14   - mapB.enableDragging();
15   - //启用地图滚轮放大缩小
16   - mapB.enableScrollWheelZoom();
17   - //禁用鼠标双击放大
18   - mapB.disableDoubleClickZoom();
19   - //启用键盘上下左右键移动地图
20   - mapB.enableKeyboard();
21   - var styleOptions = {
22   - //边线颜色。
23   - strokeColor : "blue",
24   - //填充颜色。当参数为空时,圆形将没有填充效果。
25   - fillColor : "blue",
26   - //边线的宽度,以像素为单位。
27   - strokeWeight : 3,
28   - //边线透明度,取值范围0 - 1。
29   - strokeOpacity : 0.8,
30   - //填充的透明度,取值范围0 - 1。
31   - fillOpacity : 0.6,
32   - //边线的样式,solid或dashed。
33   - strokeStyle : 'solid'
34   - };
35   - // 创建鼠标绘制管理类
36   - drawingManager = new BMapLib.DrawingManager(mapB, {
37   - //是否开启绘制模式
38   - isOpen : false,
39   - //是否显示工具栏
40   - enableDrawingTool : false,
41   - drawingToolOptions : {
42   - //位置
43   - anchor : BMAP_ANCHOR_TOP_RIGHT,
44   - //偏离值
45   - offset : new BMap.Size(5, 5),
46   - //工具栏缩放比例
47   - scale : 0.8
48   - },
49   - //线的样式
50   - polygonOptions : styleOptions
51   - });
52   - // 添加绘画完成事件
53   - drawingManager.addEventListener('polygoncomplete', function(e) {
54   - drawingManager.close();
55   - if (e.getPath().length <= 2) {
56   - // 弹出提示消息
57   - layer.msg('坐标点不能小于等于两个...');
58   - // 清除地图覆盖物
59   - mapB.clearOverlays();
60   - drawingManager.open();
61   - return false;
62   - }else {
63   - var pointE = e;
64   - // 多变行质心点
65   - var addSttationPoints_ = pointE.getBounds().getCenter().lng+ ' ' + pointE.getBounds().getCenter().lat;
66   - var addPolyGonLen_ = pointE.getPath().length;
67   - for(var k =0;k<addPolyGonLen_;k++) {
68   - if(k==0) {
69   - bPloygonGrid = pointE.getPath()[k].lng + ' ' + pointE.getPath()[k].lat;
70   - }else {
71   - bPloygonGrid = bPloygonGrid + ',' + pointE.getPath()[k].lng + ' ' + pointE.getPath()[k].lat;
72   - }
73   - }
74   - bPloygonGrid = bPloygonGrid + ',' + pointE.getPath()[0].lng + ' ' + pointE.getPath()[0].lat;
75   - PublicFunctions.setFormInputValue(addSttationPoints_,bPloygonGrid,'d','');
76   - }
77   - });
78   - return mapB;
79   - },
80   - // 根据地理名称获取百度经纬度坐标
81   - localSearchFromAdreesToPoint: function(Address,cb) {
82   - // 创建一个搜索类实例
83   - var localSearch = new BMap.LocalSearch(mapB);
84   - // 检索完成后的回调函数。
85   - localSearch.setSearchCompleteCallback(function (searchResult) {
86   - var resultPoints = '';
87   - if(searchResult) {
88   - // 返回索引指定的结果。索引0表示第1条结果
89   - var poi = searchResult.getPoi(0);
90   - if(poi) {
91   - //获取经度和纬度
92   - var stationNameChangePoint = new BMap.Point( poi.point.lng, poi.point.lat);
93   - marker = new BMap.Marker(stationNameChangePoint);
94   - var PanOptions ={noAnimation :true};
95   - mapB.panTo(stationNameChangePoint,PanOptions);
96   - // 将视图切换到指定的缩放等级,中心点坐标不变。注意:当有信息窗口在地图上打开时,地图缩放将保证信息窗口所在的坐标位置不动。(自1.2新增)
97   - mapB.setZoom(18);
98   - mapB.panBy(0,-80);
99   - // 将标注添加到地图中
100   - mapB.addOverlay(marker);
101   - //跳动的动画
102   - marker.setAnimation(BMAP_ANIMATION_BOUNCE);
103   - cb && cb(stationNameChangePoint);
104   - }else {
105   - // 弹出添加成功提示消息
106   - layer.msg('无法获取停车场【'+Address+'】地理位置!');
107   - cb && cb(false);
108   - }
109   - }else {
110   - // 弹出添加成功提示消息
111   - layer.msg('无法获取停车场【'+Address+'】地理位置!');
112   - cb && cb(false);
113   - }
114   - });
115   - // 根据检索词发起检索。
116   - localSearch.search(Address);
117   - },
118   -
119   - // 画圆
120   - pointsCircle : function(stationNameChangePoint) {
121   - //创建圆
122   - circle = new BMap.Circle(stationNameChangePoint,100,{strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5});
123   - // 百度地图添加覆盖物圆
124   - mapB.addOverlay(circle);
125   - // 开启编辑功能
126   - circle.enableEditing();
127   - // 编辑圆监听事件
128   - circle.addEventListener('remove',function() {
129   - // 清除marker
130   - mapB.removeOverlay(marker);
131   - // 返回圆形的半径,单位为米。
132   - var newRadius = circle.getRadius();
133   - // 返回圆形的中心点坐标。
134   - var newCenter = circle.getCenter().lng + ' ' + circle.getCenter().lat;
135   - var centre_New = [{potion:{lng:circle.getCenter().lng,lat:circle.getCenter().lat}}];
136   - circle = '';
137   - PublicFunctions.setFormInputValue(newCenter,'','r',Math.round(newRadius));
138   - });
139   - },
140   - // 打开绘画工具
141   - drawingManagerOpen : function() {
142   - // 打开鼠标绘画工具
143   - drawingManager.open();
144   - // 设置属性
145   - drawingManager.setDrawingMode(BMAP_DRAWING_POLYGON);
146   - },
147   - drawingManagerClose : function() {
148   - drawingManager.close();
149   - },
150   - clearMarkAndOverlays : function() {
151   - // 清楚地图覆盖物
152   - mapB.clearOverlays();
153   - }
154   - }
155   - return Bmap;
  1 +var addCarParkVmapWorlds = function() {
  2 + var mapB = '', circle = '', drawingManager = '',circle='',marker='';
  3 + var Bmap = {
  4 + init : function() {
  5 + // 设置中心点,
  6 + var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
  7 + // 百度API Key
  8 + var bdKey = '1TgEKvYqohJyeGXnN6yHSSTb4psOarQw';
  9 + // 初始化百度地图
  10 + mapB = new BMap.Map("addCarParkbmap_basic");
  11 + //中心点和缩放级别
  12 + mapB.centerAndZoom(new BMap.Point(CENTER_POINT.lng,CENTER_POINT.lat), 15);
  13 + //启用地图拖拽事件,默认启用(可不写)
  14 + mapB.enableDragging();
  15 + //启用地图滚轮放大缩小
  16 + mapB.enableScrollWheelZoom();
  17 + //禁用鼠标双击放大
  18 + mapB.disableDoubleClickZoom();
  19 + //启用键盘上下左右键移动地图
  20 + mapB.enableKeyboard();
  21 + var styleOptions = {
  22 + //边线颜色。
  23 + strokeColor : "blue",
  24 + //填充颜色。当参数为空时,圆形将没有填充效果。
  25 + fillColor : "blue",
  26 + //边线的宽度,以像素为单位。
  27 + strokeWeight : 3,
  28 + //边线透明度,取值范围0 - 1。
  29 + strokeOpacity : 0.8,
  30 + //填充的透明度,取值范围0 - 1。
  31 + fillOpacity : 0.6,
  32 + //边线的样式,solid或dashed。
  33 + strokeStyle : 'solid'
  34 + };
  35 + // 创建鼠标绘制管理类
  36 + drawingManager = new BMapLib.DrawingManager(mapB, {
  37 + //是否开启绘制模式
  38 + isOpen : false,
  39 + //是否显示工具栏
  40 + enableDrawingTool : false,
  41 + drawingToolOptions : {
  42 + //位置
  43 + anchor : BMAP_ANCHOR_TOP_RIGHT,
  44 + //偏离值
  45 + offset : new BMap.Size(5, 5),
  46 + //工具栏缩放比例
  47 + scale : 0.8
  48 + },
  49 + //线的样式
  50 + polygonOptions : styleOptions
  51 + });
  52 + // 添加绘画完成事件
  53 + drawingManager.addEventListener('polygoncomplete', function(e) {
  54 + drawingManager.close();
  55 + if (e.getPath().length <= 2) {
  56 + // 弹出提示消息
  57 + layer.msg('坐标点不能小于等于两个...');
  58 + // 清除地图覆盖物
  59 + mapB.clearOverlays();
  60 + drawingManager.open();
  61 + return false;
  62 + }else {
  63 + var pointE = e;
  64 + // 多变行质心点
  65 + var addSttationPoints_ = pointE.getBounds().getCenter().lng+ ' ' + pointE.getBounds().getCenter().lat;
  66 + var addPolyGonLen_ = pointE.getPath().length;
  67 + for(var k =0;k<addPolyGonLen_;k++) {
  68 + if(k==0) {
  69 + bPloygonGrid = pointE.getPath()[k].lng + ' ' + pointE.getPath()[k].lat;
  70 + }else {
  71 + bPloygonGrid = bPloygonGrid + ',' + pointE.getPath()[k].lng + ' ' + pointE.getPath()[k].lat;
  72 + }
  73 + }
  74 + bPloygonGrid = bPloygonGrid + ',' + pointE.getPath()[0].lng + ' ' + pointE.getPath()[0].lat;
  75 + PublicFunctions.setFormInputValue(addSttationPoints_,bPloygonGrid,'d','');
  76 + }
  77 + });
  78 + return mapB;
  79 + },
  80 + // 根据地理名称获取百度经纬度坐标
  81 + localSearchFromAdreesToPoint: function(Address,cb) {
  82 + // 创建一个搜索类实例
  83 + var localSearch = new BMap.LocalSearch(mapB);
  84 + // 检索完成后的回调函数。
  85 + localSearch.setSearchCompleteCallback(function (searchResult) {
  86 + var resultPoints = '';
  87 + if(searchResult) {
  88 + // 返回索引指定的结果。索引0表示第1条结果
  89 + var poi = searchResult.getPoi(0);
  90 + if(poi) {
  91 + //获取经度和纬度
  92 + var stationNameChangePoint = new BMap.Point( poi.point.lng, poi.point.lat);
  93 + marker = new BMap.Marker(stationNameChangePoint);
  94 + var PanOptions ={noAnimation :true};
  95 + mapB.panTo(stationNameChangePoint,PanOptions);
  96 + // 将视图切换到指定的缩放等级,中心点坐标不变。注意:当有信息窗口在地图上打开时,地图缩放将保证信息窗口所在的坐标位置不动。(自1.2新增)
  97 + mapB.setZoom(18);
  98 + mapB.panBy(0,-80);
  99 + // 将标注添加到地图中
  100 + mapB.addOverlay(marker);
  101 + //跳动的动画
  102 + marker.setAnimation(BMAP_ANIMATION_BOUNCE);
  103 + cb && cb(stationNameChangePoint);
  104 + }else {
  105 + // 弹出添加成功提示消息
  106 + layer.msg('无法获取停车场【'+Address+'】地理位置!');
  107 + cb && cb(false);
  108 + }
  109 + }else {
  110 + // 弹出添加成功提示消息
  111 + layer.msg('无法获取停车场【'+Address+'】地理位置!');
  112 + cb && cb(false);
  113 + }
  114 + });
  115 + // 根据检索词发起检索。
  116 + localSearch.search(Address);
  117 + },
  118 +
  119 + // 画圆
  120 + pointsCircle : function(stationNameChangePoint) {
  121 + //创建圆
  122 + circle = new BMap.Circle(stationNameChangePoint,100,{strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5});
  123 + // 百度地图添加覆盖物圆
  124 + mapB.addOverlay(circle);
  125 + // 开启编辑功能
  126 + circle.enableEditing();
  127 + // 编辑圆监听事件
  128 + circle.addEventListener('remove',function() {
  129 + // 清除marker
  130 + mapB.removeOverlay(marker);
  131 + // 返回圆形的半径,单位为米。
  132 + var newRadius = circle.getRadius();
  133 + // 返回圆形的中心点坐标。
  134 + var newCenter = circle.getCenter().lng + ' ' + circle.getCenter().lat;
  135 + var centre_New = [{potion:{lng:circle.getCenter().lng,lat:circle.getCenter().lat}}];
  136 + circle = '';
  137 + PublicFunctions.setFormInputValue(newCenter,'','r',Math.round(newRadius));
  138 + });
  139 + },
  140 + // 打开绘画工具
  141 + drawingManagerOpen : function() {
  142 + // 打开鼠标绘画工具
  143 + drawingManager.open();
  144 + // 设置属性
  145 + drawingManager.setDrawingMode(BMAP_DRAWING_POLYGON);
  146 + },
  147 + drawingManagerClose : function() {
  148 + drawingManager.close();
  149 + },
  150 + clearMarkAndOverlays : function() {
  151 + // 清楚地图覆盖物
  152 + mapB.clearOverlays();
  153 + }
  154 + }
  155 + return Bmap;
156 156 }();
157 157 \ No newline at end of file
... ...
src/main/resources/static/pages/base/carpark/js/carpark-positions-ajax.js
1   -/**
2   - * GetAjaxData :ajax异步请求
3   - *
4   - */
5   -var GetAjaxData = function(){
6   - var ajaxData = {
7   - // 查询停车场信息
8   - getCarParkInfo : function(carParkId,callback){
9   - $get('/carpark/findCarParkInfoFormId',{id:carParkId},function(r) {
10   - return callback && callback(r);
11   - });
12   - },
13   - carParkUpdate : function(params,callback){
14   - $post('/carpark/carParkUpdate',params,function(data) {
15   - callback && callback(data);
16   - });
17   - }
18   - }
19   - return ajaxData;
  1 +/**
  2 + * GetAjaxData :ajax异步请求
  3 + *
  4 + */
  5 +var GetAjaxData = function(){
  6 + var ajaxData = {
  7 + // 查询场站信息
  8 + getCarParkInfo : function(carParkId,callback){
  9 + $get('/carpark/findCarParkInfoFormId',{id:carParkId},function(r) {
  10 + return callback && callback(r);
  11 + });
  12 + },
  13 + carParkUpdate : function(params,callback){
  14 + $post('/carpark/carParkUpdate',params,function(data) {
  15 + callback && callback(data);
  16 + });
  17 + }
  18 + }
  19 + return ajaxData;
20 20 }();
21 21 \ No newline at end of file
... ...
src/main/resources/static/pages/base/carpark/js/carpark-positions-function.js
... ... @@ -5,15 +5,15 @@
5 5  
6 6 var PublicFunctions = function () {
7 7 var PubFun = {
8   - /** 停车场信息初始化 @param:<id:停车场ID> */
  8 + /** 场站信息初始化 @param:<id:停车场ID> */
9 9 initCarPark : function(id) {
10   - /** 获取停车场信息 @param:<id:停车场Id> */
  10 + /** 获取场站信息 @param:<id:停车场Id> */
11 11 GetAjaxData.getCarParkInfo(id,function(r) {
12 12 // 获取返回数据长度
13 13 var len = r.length;
14 14 // 如果大于零
15 15 if(len>0) {
16   - // 获取停车场信息数据
  16 + // 获取场站信息数据
17 17 var carParkObj = r[0];
18 18 /** 设置停车场对象值 @param:<carParkObj:停车场对象值> */
19 19 EditCarParkObj.setEitdCarPark(carParkObj);
... ... @@ -133,10 +133,10 @@ var PublicFunctions = function () {
133 133 enableAutoPan:true
134 134 };
135 135 if(stationShapesType == 'r') {
136   - /** 画圆 @param:<r:停车场信息;point:中心点;htm:信息窗口html文本;pots:信息窗口参数属性> */
  136 + /** 画圆 @param:<r:场站信息;point:中心点;htm:信息窗口html文本;pots:信息窗口参数属性> */
137 137 CarParkPWorldsBMap.pointsCircle(r,point,htm,opts);
138 138 }else if(stationShapesType == 'd'){
139   - /** 画多边形 @param:<r:停车场信息;point:中心点;htm:信息窗口html文本;pots:信息窗口参数属性> */
  139 + /** 画多边形 @param:<r:场站信息;point:中心点;htm:信息窗口html文本;pots:信息窗口参数属性> */
140 140 CarParkPWorldsBMap.pointsPolygon(r,point,htm,opts);
141 141 }
142 142 }
... ...
src/main/resources/static/pages/base/carpark/js/carpark-positions-map.js
1   -/**
2   - * 百度地图
3   - *
4   - */
5   -
6   -var CarParkPWorldsBMap = function () {
7   -
8   - var mapValue='',drawingManager='',marker='',circle='',polygon='';
9   -
10   - var Bmap = {
11   - init : function() {
12   - // 设置中心点,
13   - var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
14   - // 百度API Key
15   - var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
16   - // 初始化百度地图
17   - mapValue = new BMap.Map("carParkbmap_basic");
18   - //中心点和缩放级别
19   - mapValue.centerAndZoom(new BMap.Point(CENTER_POINT.lng,CENTER_POINT.lat), 15);
20   - //启用地图拖拽事件,默认启用(可不写)
21   - mapValue.enableDragging();
22   - //启用地图滚轮放大缩小
23   - mapValue.enableScrollWheelZoom();
24   - //禁用鼠标双击放大
25   - mapValue.disableDoubleClickZoom();
26   - //启用键盘上下左右键移动地图
27   - mapValue.enableKeyboard();
28   - var styleOptions = {
29   - //边线颜色。
30   - strokeColor : "blue",
31   - //填充颜色。当参数为空时,圆形将没有填充效果。
32   - fillColor : "blue",
33   - //边线的宽度,以像素为单位。
34   - strokeWeight : 3,
35   - //边线透明度,取值范围0 - 1。
36   - strokeOpacity : 0.8,
37   - //填充的透明度,取值范围0 - 1。
38   - fillOpacity : 0.6,
39   - //边线的样式,solid或dashed。
40   - strokeStyle : 'solid'
41   - };
42   - // 创建鼠标绘制管理类
43   - drawingManager = new BMapLib.DrawingManager(mapValue, {
44   - //是否开启绘制模式
45   - isOpen : false,
46   - //是否显示工具栏
47   - enableDrawingTool : false,
48   - drawingToolOptions : {
49   - //位置
50   - anchor : BMAP_ANCHOR_TOP_RIGHT,
51   - //偏离值
52   - offset : new BMap.Size(5, 5),
53   - //工具栏缩放比例
54   - scale : 0.8
55   - },
56   - //线的样式
57   - polygonOptions : styleOptions
58   - });
59   - // 添加绘画完成事件
60   - drawingManager.addEventListener('polygoncomplete', function(e) {
61   - drawingManager.close();
62   - if (e.getPath().length <= 2) {
63   - // 弹出提示消息
64   - layer.msg('坐标点不能小于等于两个...');
65   - // 清除地图覆盖物
66   - Bmap.clearMarkAndOverlays();
67   - // 加载该线路下所有站点位置添加到地图上
68   - return false;
69   - }else {
70   - var pointE = e;
71   - // 多变行质心点
72   - var addSttationPoints_ = pointE.getBounds().getCenter().lng+ ' ' + pointE.getBounds().getCenter().lat;
73   - var addPolyGonLen_ = pointE.getPath().length;
74   - for(var k =0;k<addPolyGonLen_;k++) {
75   - if(k==0) {
76   - bPloygonGrid = pointE.getPath()[k].lng + ' ' + pointE.getPath()[k].lat;
77   - }else {
78   - bPloygonGrid = bPloygonGrid + ',' + pointE.getPath()[k].lng + ' ' + pointE.getPath()[k].lat;
79   - }
80   -
81   - }
82   - bPloygonGrid = bPloygonGrid + ',' + pointE.getPath()[0].lng + ' ' + pointE.getPath()[0].lat;
83   - /** 设置修改停车场集合对象图形质心点属性 @param:<addSttationPoints_:多边形质心点> */
84   - EditCarParkObj.setCarParkBcenterPoint(addSttationPoints_);
85   - /** 设置修改停车场集合对象图形类型属性 @param:<shapeType:图形类型> */
86   - EditCarParkObj.setCarParkShapesType('d');
87   - /** 设置修改停车场集合对象圆形半径属性 @param:<radius:圆形半径> */
88   - EditCarParkObj.setCarParkRadius('');
89   - /** 设置修改停车场集合对象名称 @param:<bParkPoint:多边形图形坐标集合> */
90   - EditCarParkObj.setCarParkBparkPoint(bPloygonGrid);
91   - $.get('edit.html', function(m){
92   - $(pjaxContainer).append(m);
93   - $('#editPoitsions_carpark_mobal').trigger('editCarParkMobal_show', [CarParkPWorldsBMap,PublicFunctions,EditCarParkObj,GetAjaxData]);
94   - });
95   - }
96   - });
97   - return mapValue;
98   - },
99   - openDrawingManager : function() {
100   - // 清楚地图覆盖物
101   - // mapValue.clearOverlays();
102   - // 打开鼠标绘画工具
103   - drawingManager.open();
104   - // 设置属性
105   - drawingManager.setDrawingMode(BMAP_DRAWING_POLYGON);
106   - },
107   - drawingManagerClose : function() {
108   - drawingManager.close();
109   - },
110   - localSearchFromAdreesToPoint: function(Address) {
111   - // 创建一个搜索类实例
112   - var localSearch = new BMap.LocalSearch(mapValue);
113   - // 检索完成后的回调函数。
114   - localSearch.setSearchCompleteCallback(function (searchResult) {
115   - var resultPoints = '';
116   - if(searchResult) {
117   - // 返回索引指定的结果。索引0表示第1条结果
118   - var poi = searchResult.getPoi(0);
119   - if(poi) {
120   - //获取经度和纬度
121   - var Points = poi.point.lng + ' ' + poi.point.lat;
122   - var BJwpointsArray = Points.split(' ');
123   - var stationNameChangePoint = new BMap.Point(BJwpointsArray[0], BJwpointsArray[1]);
124   - var marker_stargt2 = new BMap.Marker(stationNameChangePoint);
125   - var PanOptions ={noAnimation :true};
126   - mapValue.panTo(stationNameChangePoint,PanOptions);
127   - mapValue.panBy(0,-200);
128   - // 将标注添加到地图中
129   - mapValue.addOverlay(marker_stargt2);
130   - //跳动的动画
131   - marker_stargt2.setAnimation(BMAP_ANIMATION_BOUNCE);
132   - }
133   - }
134   - });
135   - // 根据检索词发起检索。
136   - localSearch.search(Address);
137   - },
138   - /** 画圆 @param:<r:停车场信息;point:中心点;htm:信息窗口html文本;pots:信息窗口参数属性> */
139   - pointsCircle : function(r,point,htm,opts) {
140   - //创建圆
141   - circle = new BMap.Circle(point,r[0].carParkRadius,{strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5});
142   - // 允许覆盖物在map.clearOverlays方法中被清除
143   - circle.enableMassClear();
144   - // 百度地图添加覆盖物圆
145   - mapValue.addOverlay(circle);
146   - // 创建信息窗口
147   - infoWindow = new BMap.InfoWindow(htm, opts);
148   - // 自定义标注物图片
149   - var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/cz.png',new BMap.Size(20, 20));
150   - // 创建点
151   - marker = new BMap.Marker(point,{icon : icon_target});
152   - // 把标注添物加到地图上
153   - mapValue.addOverlay(marker);
154   - setTimeout(function(){
155   - //开启信息窗口
156   - marker.openInfoWindow(infoWindow,point);
157   - },100);
158   - // 是否在平移过程中禁止动画。(自1.2新增)
159   - var PanOptions_ ={noAnimation :true};
160   - // 将地图的中心点更改为给定的点。
161   - mapValue.panTo(point,PanOptions_);
162   - // 添加标志物监听事件
163   - marker.addEventListener("click",function() {
164   - //开启信息窗口
165   - marker.openInfoWindow(infoWindow,point);
166   - });
167   - },
168   -
169   - /** 画多边形 @param:<r:停车场信息;point:中心点;htm:信息窗口html文本;pots:信息窗口参数属性> */
170   - pointsPolygon : function(r,pointPolygon,htm,opts_polygon) {
171   - // 将视图切换到指定的缩放等级,中心点坐标不变。注意:当有信息窗口在地图上打开时,地图缩放将保证信息窗口所在的坐标位置不动。(自1.2新增)
172   - mapValue.setZoom(17);
173   - // 获取多边形坐标字符串
174   - var stationBPolygonGrid = r[0].carParkBparkPoint;
175   - // 截取多边形坐标字符串
176   - var stationBPolygonGridStr = stationBPolygonGrid.substring(9,stationBPolygonGrid.length-2);
177   - // 按逗号切割
178   - var pointPolygonArray = stationBPolygonGridStr.split(',');
179   - // 多边形坐标集合
180   - var polygonP = [];
181   - for(var v = 0;v<pointPolygonArray.length;v++) {
182   - polygonP.push(new BMap.Point(pointPolygonArray[v].split(" ")[0],pointPolygonArray[v].split(" ")[1]));
183   - }
184   - // 画多边形
185   - polygon = new BMap.Polygon(polygonP, {
186   - // 线条显色
187   - strokeColor : "blue",
188   - // 边线的宽度,以像素为单位。
189   - strokeWeight : 2,
190   - // 边线透明度,取值范围0 - 1。
191   - strokeOpacity : 0.5
192   - });
193   - // 增加地图覆盖物多边形
194   - mapValue.addOverlay(polygon);
195   - // 创建信息窗口
196   - infoWindow = new BMap.InfoWindow(htm, opts_polygon);
197   - // 自定义标注物图片
198   - var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/cz.png',new BMap.Size(20, 20));
199   - // 创建点
200   - marker = new BMap.Marker(pointPolygon,{icon : icon_target});
201   - // 把标注添物加到地图上
202   - mapValue.addOverlay(marker);
203   - // 是否在平移过程中禁止动画。(自1.2新增)
204   - var PanOptions_ ={noAnimation :true};
205   - // 将地图的中心点更改为给定的点。
206   - mapValue.panTo(pointPolygon,PanOptions_);
207   - // 将地图在水平位置上移动x像素,垂直位置上移动y像素。
208   - mapValue.panBy(10,-250,PanOptions_);
209   - //开启信息窗口
210   - marker.openInfoWindow(infoWindow,pointPolygon);
211   - },
212   -
213   - // 编辑图形
214   - editShapes : function(stationShapesTypeV,mindex) {
215   - // 关闭信息窗口
216   - marker.closeInfoWindow();
217   - // 清除marker
218   - mapValue.removeOverlay(marker);
219   - // 编辑圆
220   - if(stationShapesTypeV =='r') {
221   - // 开启编辑功能
222   - circle.enableEditing();
223   - // 编辑圆监听事件
224   - circle.addEventListener('dblclick',function() {
225   - // 关闭提示弹出层
226   - layer.close(mindex);
227   - // 返回圆形的半径,单位为米。
228   - var newRadius = circle.getRadius();
229   - // 返回圆形的中心点坐标。
230   - var newCenter = circle.getCenter().lng + ' ' + circle.getCenter().lat;
231   - var centre_New = [{potion:{lng:circle.getCenter().lng,lat:circle.getCenter().lat}}];
232   - /** 设置修改停车场集合对象图形质心点属性 @param:<addSttationPoints_:多边形质心点> */
233   - EditCarParkObj.setCarParkBcenterPoint(newCenter);
234   - /** 设置修改停车场集合对象图形类型属性 @param:<shapeType:图形类型> */
235   - EditCarParkObj.setCarParkShapesType('r');
236   - /** 设置修改停车场集合对象圆形半径属性 @param:<radius:圆形半径> */
237   - EditCarParkObj.setCarParkRadius(Math.round(newRadius));
238   - /** 设置修改停车场集合对象名称 @param:<bParkPoint:多边形图形坐标集合> */
239   - EditCarParkObj.setCarParkBparkPoint('');
240   - // 加载编辑页面
241   - $.get('edit.html', function(m){
242   - $(pjaxContainer).append(m);
243   - $('#editPoitsions_carpark_mobal').trigger('editCarParkMobal_show', [CarParkPWorldsBMap,PublicFunctions,EditCarParkObj,GetAjaxData]);
244   - });
245   - });
246   - // 编辑多变行
247   - }else if(stationShapesTypeV =='d') {
248   - // 开启编辑功能(自 1.1 新增)
249   - polygon.enableEditing();
250   - // 添加多变行编辑事件
251   - polygon.addEventListener('dblclick',function(e) {
252   - // 获取编辑的多边形对象
253   - var edit_pointE = polygon;
254   - var edit_bPloygonGrid = "";
255   - var editPolyGonLen_ = edit_pointE.getPath().length;
256   - for(var k =0;k<editPolyGonLen_;k++) {
257   - if(k==0) {
258   - edit_bPloygonGrid = edit_pointE.getPath()[k].lng + ' ' + edit_pointE.getPath()[k].lat;
259   - }else {
260   - edit_bPloygonGrid = edit_bPloygonGrid + ',' + edit_pointE.getPath()[k].lng + ' ' + edit_pointE.getPath()[k].lat;
261   - }
262   - }
263   - edit_bPloygonGrid = edit_bPloygonGrid + ',' + edit_pointE.getPath()[0].lng + ' ' + edit_pointE.getPath()[0].lat;
264   - // 多边形中心点
265   - var centre_points = edit_pointE.getBounds().getCenter().lng + ' ' + edit_pointE.getBounds().getCenter().lat;
266   - /** 设置修改停车场集合对象图形质心点属性 @param:<addSttationPoints_:多边形质心点> */
267   - EditCarParkObj.setCarParkBcenterPoint(centre_points);
268   - /** 设置修改停车场集合对象图形类型属性 @param:<shapeType:图形类型> */
269   - EditCarParkObj.setCarParkShapesType('d');
270   - /** 设置修改停车场集合对象圆形半径属性 @param:<radius:圆形半径> */
271   - EditCarParkObj.setCarParkRadius('');
272   - /** 设置修改停车场集合对象名称 @param:<bParkPoint:多边形图形坐标集合> */
273   - EditCarParkObj.setCarParkBparkPoint(edit_bPloygonGrid);
274   - $.get('edit.html', function(m){
275   - $(pjaxContainer).append(m);
276   - $('#editPoitsions_carpark_mobal').trigger('editCarParkMobal_show', [CarParkPWorldsBMap,PublicFunctions,EditCarParkObj,GetAjaxData]);
277   - });
278   - });
279   - }
280   - },
281   - clearMarkAndOverlays : function() {
282   - // 清楚地图覆盖物
283   - mapValue.clearOverlays();
284   - }
285   - }
286   - return Bmap;
  1 +/**
  2 + * 百度地图
  3 + *
  4 + */
  5 +
  6 +var CarParkPWorldsBMap = function () {
  7 +
  8 + var mapValue='',drawingManager='',marker='',circle='',polygon='';
  9 +
  10 + var Bmap = {
  11 + init : function() {
  12 + // 设置中心点,
  13 + var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
  14 + // 百度API Key
  15 + var bdKey = '1TgEKvYqohJyeGXnN6yHSSTb4psOarQw';
  16 + // 初始化百度地图
  17 + mapValue = new BMap.Map("carParkbmap_basic");
  18 + //中心点和缩放级别
  19 + mapValue.centerAndZoom(new BMap.Point(CENTER_POINT.lng,CENTER_POINT.lat), 15);
  20 + //启用地图拖拽事件,默认启用(可不写)
  21 + mapValue.enableDragging();
  22 + //启用地图滚轮放大缩小
  23 + mapValue.enableScrollWheelZoom();
  24 + //禁用鼠标双击放大
  25 + mapValue.disableDoubleClickZoom();
  26 + //启用键盘上下左右键移动地图
  27 + mapValue.enableKeyboard();
  28 + var styleOptions = {
  29 + //边线颜色。
  30 + strokeColor : "blue",
  31 + //填充颜色。当参数为空时,圆形将没有填充效果。
  32 + fillColor : "blue",
  33 + //边线的宽度,以像素为单位。
  34 + strokeWeight : 3,
  35 + //边线透明度,取值范围0 - 1。
  36 + strokeOpacity : 0.8,
  37 + //填充的透明度,取值范围0 - 1。
  38 + fillOpacity : 0.6,
  39 + //边线的样式,solid或dashed。
  40 + strokeStyle : 'solid'
  41 + };
  42 + // 创建鼠标绘制管理类
  43 + drawingManager = new BMapLib.DrawingManager(mapValue, {
  44 + //是否开启绘制模式
  45 + isOpen : false,
  46 + //是否显示工具栏
  47 + enableDrawingTool : false,
  48 + drawingToolOptions : {
  49 + //位置
  50 + anchor : BMAP_ANCHOR_TOP_RIGHT,
  51 + //偏离值
  52 + offset : new BMap.Size(5, 5),
  53 + //工具栏缩放比例
  54 + scale : 0.8
  55 + },
  56 + //线的样式
  57 + polygonOptions : styleOptions
  58 + });
  59 + // 添加绘画完成事件
  60 + drawingManager.addEventListener('polygoncomplete', function(e) {
  61 + drawingManager.close();
  62 + if (e.getPath().length <= 2) {
  63 + // 弹出提示消息
  64 + layer.msg('坐标点不能小于等于两个...');
  65 + // 清除地图覆盖物
  66 + Bmap.clearMarkAndOverlays();
  67 + // 加载该线路下所有站点位置添加到地图上
  68 + return false;
  69 + }else {
  70 + var pointE = e;
  71 + // 多变行质心点
  72 + var addSttationPoints_ = pointE.getBounds().getCenter().lng+ ' ' + pointE.getBounds().getCenter().lat;
  73 + var addPolyGonLen_ = pointE.getPath().length;
  74 + for(var k =0;k<addPolyGonLen_;k++) {
  75 + if(k==0) {
  76 + bPloygonGrid = pointE.getPath()[k].lng + ' ' + pointE.getPath()[k].lat;
  77 + }else {
  78 + bPloygonGrid = bPloygonGrid + ',' + pointE.getPath()[k].lng + ' ' + pointE.getPath()[k].lat;
  79 + }
  80 +
  81 + }
  82 + bPloygonGrid = bPloygonGrid + ',' + pointE.getPath()[0].lng + ' ' + pointE.getPath()[0].lat;
  83 + /** 设置修改停车场集合对象图形质心点属性 @param:<addSttationPoints_:多边形质心点> */
  84 + EditCarParkObj.setCarParkBcenterPoint(addSttationPoints_);
  85 + /** 设置修改停车场集合对象图形类型属性 @param:<shapeType:图形类型> */
  86 + EditCarParkObj.setCarParkShapesType('d');
  87 + /** 设置修改停车场集合对象圆形半径属性 @param:<radius:圆形半径> */
  88 + EditCarParkObj.setCarParkRadius('');
  89 + /** 设置修改停车场集合对象名称 @param:<bParkPoint:多边形图形坐标集合> */
  90 + EditCarParkObj.setCarParkBparkPoint(bPloygonGrid);
  91 + $.get('edit.html', function(m){
  92 + $(pjaxContainer).append(m);
  93 + $('#editPoitsions_carpark_mobal').trigger('editCarParkMobal_show', [CarParkPWorldsBMap,PublicFunctions,EditCarParkObj,GetAjaxData]);
  94 + });
  95 + }
  96 + });
  97 + return mapValue;
  98 + },
  99 + openDrawingManager : function() {
  100 + // 清楚地图覆盖物
  101 + // mapValue.clearOverlays();
  102 + // 打开鼠标绘画工具
  103 + drawingManager.open();
  104 + // 设置属性
  105 + drawingManager.setDrawingMode(BMAP_DRAWING_POLYGON);
  106 + },
  107 + drawingManagerClose : function() {
  108 + drawingManager.close();
  109 + },
  110 + localSearchFromAdreesToPoint: function(Address) {
  111 + // 创建一个搜索类实例
  112 + var localSearch = new BMap.LocalSearch(mapValue);
  113 + // 检索完成后的回调函数。
  114 + localSearch.setSearchCompleteCallback(function (searchResult) {
  115 + var resultPoints = '';
  116 + if(searchResult) {
  117 + // 返回索引指定的结果。索引0表示第1条结果
  118 + var poi = searchResult.getPoi(0);
  119 + if(poi) {
  120 + //获取经度和纬度
  121 + var Points = poi.point.lng + ' ' + poi.point.lat;
  122 + var BJwpointsArray = Points.split(' ');
  123 + var stationNameChangePoint = new BMap.Point(BJwpointsArray[0], BJwpointsArray[1]);
  124 + var marker_stargt2 = new BMap.Marker(stationNameChangePoint);
  125 + var PanOptions ={noAnimation :true};
  126 + mapValue.panTo(stationNameChangePoint,PanOptions);
  127 + mapValue.panBy(0,-200);
  128 + // 将标注添加到地图中
  129 + mapValue.addOverlay(marker_stargt2);
  130 + //跳动的动画
  131 + marker_stargt2.setAnimation(BMAP_ANIMATION_BOUNCE);
  132 + }
  133 + }
  134 + });
  135 + // 根据检索词发起检索。
  136 + localSearch.search(Address);
  137 + },
  138 + /** 画圆 @param:<r:场站信息;point:中心点;htm:信息窗口html文本;pots:信息窗口参数属性> */
  139 + pointsCircle : function(r,point,htm,opts) {
  140 + //创建圆
  141 + circle = new BMap.Circle(point,r[0].carParkRadius,{strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5});
  142 + // 允许覆盖物在map.clearOverlays方法中被清除
  143 + circle.enableMassClear();
  144 + // 百度地图添加覆盖物圆
  145 + mapValue.addOverlay(circle);
  146 + // 创建信息窗口
  147 + infoWindow = new BMap.InfoWindow(htm, opts);
  148 + // 自定义标注物图片
  149 + var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/cz.png',new BMap.Size(20, 20));
  150 + // 创建点
  151 + marker = new BMap.Marker(point,{icon : icon_target});
  152 + // 把标注添物加到地图上
  153 + mapValue.addOverlay(marker);
  154 + setTimeout(function(){
  155 + //开启信息窗口
  156 + marker.openInfoWindow(infoWindow,point);
  157 + },100);
  158 + // 是否在平移过程中禁止动画。(自1.2新增)
  159 + var PanOptions_ ={noAnimation :true};
  160 + // 将地图的中心点更改为给定的点。
  161 + mapValue.panTo(point,PanOptions_);
  162 + // 添加标志物监听事件
  163 + marker.addEventListener("click",function() {
  164 + //开启信息窗口
  165 + marker.openInfoWindow(infoWindow,point);
  166 + });
  167 + },
  168 +
  169 + /** 画多边形 @param:<r:场站信息;point:中心点;htm:信息窗口html文本;pots:信息窗口参数属性> */
  170 + pointsPolygon : function(r,pointPolygon,htm,opts_polygon) {
  171 + // 将视图切换到指定的缩放等级,中心点坐标不变。注意:当有信息窗口在地图上打开时,地图缩放将保证信息窗口所在的坐标位置不动。(自1.2新增)
  172 + mapValue.setZoom(17);
  173 + // 获取多边形坐标字符串
  174 + var stationBPolygonGrid = r[0].carParkBparkPoint;
  175 + // 截取多边形坐标字符串
  176 + var stationBPolygonGridStr = stationBPolygonGrid.substring(9,stationBPolygonGrid.length-2);
  177 + // 按逗号切割
  178 + var pointPolygonArray = stationBPolygonGridStr.split(',');
  179 + // 多边形坐标集合
  180 + var polygonP = [];
  181 + for(var v = 0;v<pointPolygonArray.length;v++) {
  182 + polygonP.push(new BMap.Point(pointPolygonArray[v].split(" ")[0],pointPolygonArray[v].split(" ")[1]));
  183 + }
  184 + // 画多边形
  185 + polygon = new BMap.Polygon(polygonP, {
  186 + // 线条显色
  187 + strokeColor : "blue",
  188 + // 边线的宽度,以像素为单位。
  189 + strokeWeight : 2,
  190 + // 边线透明度,取值范围0 - 1。
  191 + strokeOpacity : 0.5
  192 + });
  193 + // 增加地图覆盖物多边形
  194 + mapValue.addOverlay(polygon);
  195 + // 创建信息窗口
  196 + infoWindow = new BMap.InfoWindow(htm, opts_polygon);
  197 + // 自定义标注物图片
  198 + var icon_target = new BMap.Icon('/pages/base/stationroute/css/img/cz.png',new BMap.Size(20, 20));
  199 + // 创建点
  200 + marker = new BMap.Marker(pointPolygon,{icon : icon_target});
  201 + // 把标注添物加到地图上
  202 + mapValue.addOverlay(marker);
  203 + // 是否在平移过程中禁止动画。(自1.2新增)
  204 + var PanOptions_ ={noAnimation :true};
  205 + // 将地图的中心点更改为给定的点。
  206 + mapValue.panTo(pointPolygon,PanOptions_);
  207 + // 将地图在水平位置上移动x像素,垂直位置上移动y像素。
  208 + mapValue.panBy(10,-250,PanOptions_);
  209 + //开启信息窗口
  210 + marker.openInfoWindow(infoWindow,pointPolygon);
  211 + },
  212 +
  213 + // 编辑图形
  214 + editShapes : function(stationShapesTypeV,mindex) {
  215 + // 关闭信息窗口
  216 + marker.closeInfoWindow();
  217 + // 清除marker
  218 + mapValue.removeOverlay(marker);
  219 + // 编辑圆
  220 + if(stationShapesTypeV =='r') {
  221 + // 开启编辑功能
  222 + circle.enableEditing();
  223 + // 编辑圆监听事件
  224 + circle.addEventListener('dblclick',function() {
  225 + // 关闭提示弹出层
  226 + layer.close(mindex);
  227 + // 返回圆形的半径,单位为米。
  228 + var newRadius = circle.getRadius();
  229 + // 返回圆形的中心点坐标。
  230 + var newCenter = circle.getCenter().lng + ' ' + circle.getCenter().lat;
  231 + var centre_New = [{potion:{lng:circle.getCenter().lng,lat:circle.getCenter().lat}}];
  232 + /** 设置修改停车场集合对象图形质心点属性 @param:<addSttationPoints_:多边形质心点> */
  233 + EditCarParkObj.setCarParkBcenterPoint(newCenter);
  234 + /** 设置修改停车场集合对象图形类型属性 @param:<shapeType:图形类型> */
  235 + EditCarParkObj.setCarParkShapesType('r');
  236 + /** 设置修改停车场集合对象圆形半径属性 @param:<radius:圆形半径> */
  237 + EditCarParkObj.setCarParkRadius(Math.round(newRadius));
  238 + /** 设置修改停车场集合对象名称 @param:<bParkPoint:多边形图形坐标集合> */
  239 + EditCarParkObj.setCarParkBparkPoint('');
  240 + // 加载编辑页面
  241 + $.get('edit.html', function(m){
  242 + $(pjaxContainer).append(m);
  243 + $('#editPoitsions_carpark_mobal').trigger('editCarParkMobal_show', [CarParkPWorldsBMap,PublicFunctions,EditCarParkObj,GetAjaxData]);
  244 + });
  245 + });
  246 + // 编辑多变行
  247 + }else if(stationShapesTypeV =='d') {
  248 + // 开启编辑功能(自 1.1 新增)
  249 + polygon.enableEditing();
  250 + // 添加多变行编辑事件
  251 + polygon.addEventListener('dblclick',function(e) {
  252 + // 获取编辑的多边形对象
  253 + var edit_pointE = polygon;
  254 + var edit_bPloygonGrid = "";
  255 + var editPolyGonLen_ = edit_pointE.getPath().length;
  256 + for(var k =0;k<editPolyGonLen_;k++) {
  257 + if(k==0) {
  258 + edit_bPloygonGrid = edit_pointE.getPath()[k].lng + ' ' + edit_pointE.getPath()[k].lat;
  259 + }else {
  260 + edit_bPloygonGrid = edit_bPloygonGrid + ',' + edit_pointE.getPath()[k].lng + ' ' + edit_pointE.getPath()[k].lat;
  261 + }
  262 + }
  263 + edit_bPloygonGrid = edit_bPloygonGrid + ',' + edit_pointE.getPath()[0].lng + ' ' + edit_pointE.getPath()[0].lat;
  264 + // 多边形中心点
  265 + var centre_points = edit_pointE.getBounds().getCenter().lng + ' ' + edit_pointE.getBounds().getCenter().lat;
  266 + /** 设置修改停车场集合对象图形质心点属性 @param:<addSttationPoints_:多边形质心点> */
  267 + EditCarParkObj.setCarParkBcenterPoint(centre_points);
  268 + /** 设置修改停车场集合对象图形类型属性 @param:<shapeType:图形类型> */
  269 + EditCarParkObj.setCarParkShapesType('d');
  270 + /** 设置修改停车场集合对象圆形半径属性 @param:<radius:圆形半径> */
  271 + EditCarParkObj.setCarParkRadius('');
  272 + /** 设置修改停车场集合对象名称 @param:<bParkPoint:多边形图形坐标集合> */
  273 + EditCarParkObj.setCarParkBparkPoint(edit_bPloygonGrid);
  274 + $.get('edit.html', function(m){
  275 + $(pjaxContainer).append(m);
  276 + $('#editPoitsions_carpark_mobal').trigger('editCarParkMobal_show', [CarParkPWorldsBMap,PublicFunctions,EditCarParkObj,GetAjaxData]);
  277 + });
  278 + });
  279 + }
  280 + },
  281 + clearMarkAndOverlays : function() {
  282 + // 清楚地图覆盖物
  283 + mapValue.clearOverlays();
  284 + }
  285 + }
  286 + return Bmap;
287 287 }();
288 288 \ No newline at end of file
... ...
src/main/resources/static/pages/base/carpark/js/carpark-positions-reload.js
1   -/**
2   - *
3   - * @JSName : list.js(停车场定位positions.html页面js)
4   - *
5   - * @Author : bsth@lq
6   - *
7   - * @Description : TODO(停车场定位positions.html页面js)
8   - *
9   - * @Data : 2016年4月28日 上午9:21:17
10   - *
11   - * @Version 公交调度系统BS版 0.1
12   - *
13   - */
14   -
15   -(function(){
16   - // 获取参数停车场ID
17   - var id = $.url().param('no');
18   - // 关闭左侧栏
19   - if (!$('body').hasClass('page-sidebar-closed')) {$('.menu-toggler.sidebar-toggler').click();}
20   - // 等候300毫秒执行
21   - setTimeout(function(){
22   - // 地图初始化
23   - mapB = CarParkPWorldsBMap.init();
24   - /** 停车场信息初始化 @param:<id:停车场ID> */
25   - PublicFunctions.initCarPark(id);
26   - },300);
  1 +/**
  2 + *
  3 + * @JSName : list.js(停车场定位positions.html页面js)
  4 + *
  5 + * @Author : bsth@lq
  6 + *
  7 + * @Description : TODO(停车场定位positions.html页面js)
  8 + *
  9 + * @Data : 2016年4月28日 上午9:21:17
  10 + *
  11 + * @Version 公交调度系统BS版 0.1
  12 + *
  13 + */
  14 +
  15 +(function(){
  16 + // 获取参数停车场ID
  17 + var id = $.url().param('no');
  18 + // 关闭左侧栏
  19 + if (!$('body').hasClass('page-sidebar-closed')) {$('.menu-toggler.sidebar-toggler').click();}
  20 + // 等候300毫秒执行
  21 + setTimeout(function(){
  22 + // 地图初始化
  23 + mapB = CarParkPWorldsBMap.init();
  24 + /** 场站信息初始化 @param:<id:停车场ID> */
  25 + PublicFunctions.initCarPark(id);
  26 + },300);
27 27 })();
28 28 \ No newline at end of file
... ...
src/main/resources/static/pages/base/carpark/list.html
1   -<div class="page-head">
2   - <div class="page-title">
3   - <h1>停车场信息</h1>
4   - </div>
5   -</div>
6   -
7   -<ul class="page-breadcrumb breadcrumb">
8   - <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li>
9   - <li><span class="active">基础信息</span> <i class="fa fa-circle"></i></li>
10   - <li><span class="active">停车场信息</span></li>
11   -</ul>
12   -
13   -<div class="row">
14   - <div class="col-md-12">
15   - <div class="portlet light porttlet-fit bordered">
16   - <div class="portlet-title">
17   - <div class="caption">
18   - <i class="fa fa-info-circle font-dark"></i>
19   - <span class="caption-subject font-dark sbold uppercase">停车场信息</span>
20   - </div>
21   - <div class="actions">
22   - <div class="btn-group btn-group-devided" data-toggle="buttons">
23   - <a class="btn btn-circle blue" href="add.html" data-pjax><i class="fa fa-plus"></i> 添加停车场</a>
24   - </div>
25   - </div>
26   - </div>
27   - <div class="portlet-body">
28   - <div class="table-container" style="margin-top: 10px">
29   - <table class="table table-striped table-bordered table-hover table-checkable" id="datatable_carpark">
30   - <thead>
31   - <tr role="row" class="heading">
32   - <th width="3%">序号</th>
33   - <th width="12%">停车场名称</th>
34   - <th width="8%">停车场编码</th>
35   - <th width="8%">地理位置</th>
36   - <th width="6%">面积(㎡)</th>
37   - <th width="8%">所属公司</th>
38   - <th width="8%">所属分公司</th>
39   - <th width="6%">版本号</th>
40   - <th width="6%">是否撤销</th>
41   - <th width="10%">操作</th>
42   - </tr>
43   - <tr role="row" class="filter">
44   - <td>#</td>
45   - <td>
46   - <!-- <input type="text" class="form-control form-filter input-sm" name="parkName_like" > -->
47   - <select name="parkName_like" class="form-control" style="width:100%" id="parkNameSelect"></select>
48   - </td>
49   - <td>
50   - <input type="text" class="form-control form-filter input-sm" name="parkCode_like" id="parkCodeInput">
51   -
52   - </td>
53   - <td>
54   - <input type="text" class="form-control form-filter input-sm" name="gCenterPoint_like">
55   - </td>
56   - <td>
57   - <input type="text" class="form-control form-filter input-sm" name="area_eq">
58   - </td>
59   - <td>
60   - <select name="company_eq" class="form-control" id="companySelect"></select>
61   - </td>
62   - <td>
63   - <select name="brancheCompany_eq" class="form-control" id="brancheCompanySelect"></select>
64   - <!-- <input type="text" class="form-control form-filter input-sm" name="brancheCompany_eq" id="brancheCompanySelect"> -->
65   - </td>
66   - <td>
67   - <input type="text" class="form-control form-filter input-sm" name="versions_eq">
68   - </td>
69   - <td>
70   - <select class="form-control form-filter " name="destroy_eq">
71   - <option value="">请选择...</option>
72   - <option value="0">运营</option>
73   - <option value="1">撤销</option>
74   - </select>
75   - </td>
76   - <td>
77   - <button class="btn btn-sm green btn-outline filter-submit margin-bottom" >
78   - <i class="fa fa-search"></i> 搜索
79   - </button>
80   -
81   - <button class="btn btn-sm red btn-outline filter-cancel">
82   - <i class="fa fa-times"></i> 重置
83   - </button>
84   - </td>
85   - </tr>
86   - </thead>
87   - <tbody></tbody>
88   - </table>
89   - <div style="text-align: right;">
90   - <ul id="pagination" class="pagination"></ul>
91   - </div>
92   - </div>
93   - </div>
94   - </div>
95   - </div>
96   -</div>
97   -
98   -<script type="text/html" id="carpark_list_table_temp">
99   - {{each list as obj i }}
100   - <tr>
101   - <td style="vertical-align: middle;">
102   - {{(list.page*10)+(i+1)}}
103   - </td>
104   - <td>
105   - {{obj.parkName}}
106   - </td>
107   - <td>
108   - {{obj.parkCode}}
109   - </td>
110   - <td>
111   - {{obj.bCenterPoint}}
112   - </td>
113   - <td>
114   - {{obj.area}}
115   - </td>
116   - <td>
117   - {{obj.gsmc}}
118   - </td>
119   - <td>
120   - {{obj.fgsmc}}
121   - </td>
122   - <td>
123   - {{obj.versions}}
124   - </td>
125   - <td>
126   - {{if obj.destroy == 1}}
127   - <span style="font-weight: bold; color: red; padding: 5px; background-color: #FFE4E1; margin: 5px; font-size: 9px;border-radius: 4px;">撤销</span>
128   - {{else if obj.destroy == 0}}
129   - <span style="font-weight: bold; color: #07824e; padding: 5px; background-color: #FFE4E1; margin: 5px; font-size: 9px;border-radius: 4px;">运营</span>
130   - {{/if}}
131   - </td>
132   - <td>
133   - <a href="positions.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 定位 </a>
134   - </td>
135   - </tr>
136   - {{/each}}
137   - {{if list.length == 0}}
138   - <tr>
139   - <td colspan=10><h6 class="muted">没有找到相关数据</h6></td>
140   - </tr>
141   - {{/if}}
142   -</script>
  1 +<div class="page-head">
  2 + <div class="page-title">
  3 + <h1>场站信息</h1>
  4 + </div>
  5 +</div>
  6 +
  7 +<ul class="page-breadcrumb breadcrumb">
  8 + <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li>
  9 + <li><span class="active">基础信息</span> <i class="fa fa-circle"></i></li>
  10 + <li><span class="active">场站信息</span></li>
  11 +</ul>
  12 +
  13 +<div class="row">
  14 + <div class="col-md-12">
  15 + <div class="portlet light porttlet-fit bordered">
  16 + <div class="portlet-title">
  17 + <div class="caption">
  18 + <i class="fa fa-info-circle font-dark"></i>
  19 + <span class="caption-subject font-dark sbold uppercase">场站信息</span>
  20 + </div>
  21 + <div class="actions">
  22 + <div class="btn-group btn-group-devided" data-toggle="buttons">
  23 + <a class="btn btn-circle blue" href="add.html" data-pjax><i class="fa fa-plus"></i> 添加停车场</a>
  24 + </div>
  25 + </div>
  26 + </div>
  27 + <div class="portlet-body">
  28 + <div class="table-container" style="margin-top: 10px">
  29 + <table class="table table-striped table-bordered table-hover table-checkable" id="datatable_carpark">
  30 + <thead>
  31 + <tr role="row" class="heading">
  32 + <th width="3%">序号</th>
  33 + <th width="12%">停车场名称</th>
  34 + <th width="8%">停车场编码</th>
  35 + <th width="8%">地理位置</th>
  36 + <th width="6%">面积(㎡)</th>
  37 + <th width="8%">所属公司</th>
  38 + <th width="8%">所属分公司</th>
  39 + <th width="6%">版本号</th>
  40 + <th width="6%">是否撤销</th>
  41 + <th width="10%">操作</th>
  42 + </tr>
  43 + <tr role="row" class="filter">
  44 + <td>#</td>
  45 + <td>
  46 + <!-- <input type="text" class="form-control form-filter input-sm" name="parkName_like" > -->
  47 + <select name="parkName_like" class="form-control" style="width:100%" id="parkNameSelect"></select>
  48 + </td>
  49 + <td>
  50 + <input type="text" class="form-control form-filter input-sm" name="parkCode_like" id="parkCodeInput">
  51 +
  52 + </td>
  53 + <td>
  54 + <input type="text" class="form-control form-filter input-sm" name="gCenterPoint_like">
  55 + </td>
  56 + <td>
  57 + <input type="text" class="form-control form-filter input-sm" name="area_eq">
  58 + </td>
  59 + <td>
  60 + <select name="company_eq" class="form-control" id="companySelect"></select>
  61 + </td>
  62 + <td>
  63 + <select name="brancheCompany_eq" class="form-control" id="brancheCompanySelect"></select>
  64 + <!-- <input type="text" class="form-control form-filter input-sm" name="brancheCompany_eq" id="brancheCompanySelect"> -->
  65 + </td>
  66 + <td>
  67 + <input type="text" class="form-control form-filter input-sm" name="versions_eq">
  68 + </td>
  69 + <td>
  70 + <select class="form-control form-filter " name="destroy_eq">
  71 + <option value="">请选择...</option>
  72 + <option value="0">运营</option>
  73 + <option value="1">撤销</option>
  74 + </select>
  75 + </td>
  76 + <td>
  77 + <button class="btn btn-sm green btn-outline filter-submit margin-bottom" >
  78 + <i class="fa fa-search"></i> 搜索
  79 + </button>
  80 +
  81 + <button class="btn btn-sm red btn-outline filter-cancel">
  82 + <i class="fa fa-times"></i> 重置
  83 + </button>
  84 + </td>
  85 + </tr>
  86 + </thead>
  87 + <tbody></tbody>
  88 + </table>
  89 + <div style="text-align: right;">
  90 + <ul id="pagination" class="pagination"></ul>
  91 + </div>
  92 + </div>
  93 + </div>
  94 + </div>
  95 + </div>
  96 +</div>
  97 +
  98 +<script type="text/html" id="carpark_list_table_temp">
  99 + {{each list as obj i }}
  100 + <tr>
  101 + <td style="vertical-align: middle;">
  102 + {{(list.page*10)+(i+1)}}
  103 + </td>
  104 + <td>
  105 + {{obj.parkName}}
  106 + </td>
  107 + <td>
  108 + {{obj.parkCode}}
  109 + </td>
  110 + <td>
  111 + {{obj.bCenterPoint}}
  112 + </td>
  113 + <td>
  114 + {{obj.area}}
  115 + </td>
  116 + <td>
  117 + {{obj.gsmc}}
  118 + </td>
  119 + <td>
  120 + {{obj.fgsmc}}
  121 + </td>
  122 + <td>
  123 + {{obj.versions}}
  124 + </td>
  125 + <td>
  126 + {{if obj.destroy == 1}}
  127 + <span style="font-weight: bold; color: red; padding: 5px; background-color: #FFE4E1; margin: 5px; font-size: 9px;border-radius: 4px;">撤销</span>
  128 + {{else if obj.destroy == 0}}
  129 + <span style="font-weight: bold; color: #07824e; padding: 5px; background-color: #FFE4E1; margin: 5px; font-size: 9px;border-radius: 4px;">运营</span>
  130 + {{/if}}
  131 + </td>
  132 + <td>
  133 + <a href="positions.html?no={{obj.id}}" class="btn default blue-stripe btn-sm" data-pjax> 定位 </a>
  134 + </td>
  135 + </tr>
  136 + {{/each}}
  137 + {{if list.length == 0}}
  138 + <tr>
  139 + <td colspan=10><h6 class="muted">没有找到相关数据</h6></td>
  140 + </tr>
  141 + {{/if}}
  142 +</script>
143 143 <script src="/pages/base/carpark/js/carpark-list-table.js"></script>
144 144 \ No newline at end of file
... ...
src/main/resources/static/pages/base/section/js/add-vmap-world.js
... ... @@ -3,7 +3,7 @@ var SectionVmapWorlds = function() {
3 3 var Bmap = {
4 4 init : function() {
5 5 var CENTER_POINT = {lng : 121.528733,lat : 31.237425};// 设置中心点.
6   - var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';// 百度API Key
  6 + var bdKey = '1TgEKvYqohJyeGXnN6yHSSTb4psOarQw';// 百度API Key
7 7 mapB = new BMap.Map("sectionBmap_basic");// 初始化百度地图
8 8 mapB.centerAndZoom(new BMap.Point(CENTER_POINT.lng,CENTER_POINT.lat), 15);//中心点和缩放级别
9 9 mapB.enableDragging(); //启用地图拖拽事件,默认启用(可不写)
... ...
src/main/resources/static/pages/excep/js/map.js
... ... @@ -24,7 +24,7 @@ var BasicMap = function () {
24 24 var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
25 25  
26 26 // 百度API Key
27   - var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
  27 + var bdKey = '1TgEKvYqohJyeGXnN6yHSSTb4psOarQw';
28 28  
29 29 // 初始化百度地图
30 30 mapBValue = new BMap.Map("BasicMap");
... ...
src/main/resources/static/pages/excep/js/outbound-map.js
... ... @@ -35,7 +35,7 @@ var WorldsBMap = function () {
35 35 var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
36 36  
37 37 // 百度API Key
38   - var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
  38 + var bdKey = '1TgEKvYqohJyeGXnN6yHSSTb4psOarQw';
39 39  
40 40 // 初始化百度地图
41 41 mapBValue = new BMap.Map("bmap_basic");
... ...
src/main/resources/static/pages/excep/js/speeding-map.js
... ... @@ -24,7 +24,7 @@ var SpeedingMap = function () {
24 24 var CENTER_POINT = {lng : 121.528733,lat : 31.237425};
25 25  
26 26 // 百度API Key
27   - var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
  27 + var bdKey = '1TgEKvYqohJyeGXnN6yHSSTb4psOarQw';
28 28  
29 29 // 初始化百度地图
30 30 mapBValue = new BMap.Map("speedingMap");
... ...
src/main/resources/static/pages/mapmonitor/real/js/map_platform_old.js
... ... @@ -37,7 +37,7 @@ var realMap = (function() {
37 37 var city = "上海";
38 38  
39 39 //百度API Key
40   - var bdKey = 'IGGrr4UjwIYzatoCRFKEL8sT';
  40 + var bdKey = '1TgEKvYqohJyeGXnN6yHSSTb4psOarQw';
41 41  
42 42 var bd_gps_info_win_opts = {
43 43 width : 190,
... ...
src/main/resources/static/real_control_v2/alone_page/home/home_wrap.html
... ... @@ -72,7 +72,7 @@
72 72  
73 73  
74 74 <!-- 地图相关 -->
75   -<script src="//api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script>
  75 +<script src="//api.map.baidu.com/api?v=2.0&ak=1TgEKvYqohJyeGXnN6yHSSTb4psOarQw"></script>
76 76 <script src="//api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"></script>
77 77 <script src="/assets/js/baidu//MarkerClusterer.js" merge="plugins"></script>
78 78 <script src="/assets/js/CoordinateConverter.js" merge="plugins"></script>
... ...
src/main/resources/static/real_control_v2/alone_page/map/alone_wrap.html
... ... @@ -60,7 +60,7 @@
60 60 <span style="position: absolute;left: calc(50% - 35px);top: calc(45% - 35px);">加载中...</span>
61 61 </div>
62 62 <!-- 地图相关 -->
63   -<script src="//api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT"></script>
  63 +<script src="//api.map.baidu.com/api?v=2.0&ak=1TgEKvYqohJyeGXnN6yHSSTb4psOarQw"></script>
64 64 <script src="//api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js"></script>
65 65 <script src="/assets/js/baidu//MarkerClusterer.js" merge="plugins"></script>
66 66 <script src="/assets/js/CoordinateConverter.js" merge="plugins"></script>
... ...
src/main/resources/static/real_control_v2/fragments/line_schedule/context_menu/temp_sch_v2/main.html
... ... @@ -25,7 +25,7 @@
25 25 <script>
26 26 (function () {
27 27 var modal = '#schedule-addsch-modal-v2',
28   - sch, stationRoutes, parks, information, carsArray, st_park_data, lineRegion = {};
  28 + sch, stationRoutes, parks, information, carsArray, st_park_data, lineRegions = {};
29 29  
30 30 $(modal).on('init', function (e, data) {
31 31 e.stopPropagation();
... ... @@ -63,7 +63,7 @@
63 63 opts.push('<option value="">选择预设区间</option>');
64 64 for (var idx in regions) {
65 65 var item = regions[idx], title = new Array();
66   - lineRegion[item.id + '_' + item.seq] = item;
  66 + lineRegions[item.id + '_' + item.seq] = item;
67 67 if (item.stationRoutes.length > 1) {
68 68 for (var idx1 in item.stationRoutes) {
69 69 title.push(item.stationRoutes[idx1].stationName);
... ... @@ -113,7 +113,7 @@
113 113 opts.push('<option value="">选择预设区间</option>');
114 114 for (var idx in regions) {
115 115 var item = regions[idx], title = new Array();
116   - lineRegion[item.id + '_' + item.seq] = item;
  116 + lineRegions[item.id + '_' + item.seq] = item;
117 117 if (item.stationRoutes.length > 1) {
118 118 for (var idx1 in item.stationRoutes) {
119 119 title.push(item.stationRoutes[idx1].stationName);
... ... @@ -282,7 +282,7 @@
282 282 zdzCode = $('[name=zdzCode]', f),
283 283 lineRegion = $(this).val();
284 284 if (!lineRegion) return;
285   - var stationRoutes = lineRegion[lineRegion].stationRoutes;
  285 + var stationRoutes = lineRegions[lineRegion].stationRoutes;
286 286 if (stationRoutes && stationRoutes.length > 1) {
287 287 qdzCode.val(stationRoutes[0].stationCode);
288 288 zdzCode.val(stationRoutes[stationRoutes.length - 1].stationCode);
... ...